2008年04月16日(水)
続・Ajax(Comet)対戦オセロゲーム 遊び方編 も参照してみてください。

http://port.movion.jp/
2008/05/04追記。port.movion.jpは現在4人オセロになってます。
※自宅サーバのため、常時稼働はしてません。たぶん12時~24時くらいは稼働させてます。
※バグが多々多々あります。かつ、開発環境です。
※IEの場合ieerbugがでます。firefoxの場合FireBug入れてないといきなり変になるかも。
2008/04/20追記。ちょっとだけ安定版をここのサーバにも設置しました。
http://movion.net/sample/ajax-reversi/public_html/
今さら感は否めませんが、Cometなオセロゲームを勢いで作成中です。
railthelloとかあったけど。オセロゲームなのは、Pontiyを作っててまんまオセロゲームの仕組みを使えたから。
どうせなんで、4人オセロとかに拡張しようかなぁとも思ってます。
でもって現実的にはやっぱり、FMSなりJavaアプレットなり使った方がよいなぁと。
jetty6もちょっとさわってみたけど、クライアント数が増えることを想定してないので、とりあえずApacheとPHPで実装中。
C10KいやC1Kどころか、C100にも耐えられるか謎です。
実装は、PHPだけでリアルタイムAJAXチャットシステムを構築する方法。
を参考にさせていただきました。
アクセス数さえ少なければ、負荷もたいしたことがないので、
レンタルサーバに設置しようかと思いましたが(こことか)、無限ループぽっくなったり、デットロックぽくなったり、怪しげな挙動をする可能性が高いので、現状自鯖です。
幾分、問題をなおしたものをここのサーバにも置いてみましたが、万一アクセスが多くなったら撤去します。
でもって、自鯖にしてるパソコンはどうも共振してあまりにうるさいので夜はshutdown -h nowしてます。
リンクつながらなかったらごめんなさいorz
て、このサイトで宣伝して人が来るとも思えませんが・・・。
参考:
おとこのCometアプリケーション! 非モテのためのJetty 6 Continuation入門まとめ(前編)
Lingr and Comet - 技術解説編(CNET Japan)
2008年02月17日(日)
GoogleMapsAPIで、地図上にAjaxで動的なマーカーを表示する場合、
地図を移動したらマーカーを再度よみこみ直す処理をつくってみました。
が、マーカーにクリックイベントをつけて吹き出しを表示するようにすると、
場所によっては吹き出しを表示するときに地図が移動するので、
移動し終わった時にマーカーが再読込されて、吹き出しが消えてしまう問題が。
他にもいい方法がありそうですが、とりあえずremoveListenerで一時的にリスナーを消して、
無理矢理問題解決してみました。
※追記:残念ながら、不具合があります。
removeListener部分を実装する前。
修正後。
一見同じですが、
秋田辺りにあるマーカーをクリックすると違いがわかると思います。
そのソースコードの抜粋。
実際の例は、
このページを参照してください。
12行目。addListener時に、消すリスナーを保持しておくために、
reloadMarkerEventで返値を受けておきます。
-
var reloadMarkerEvent;
-
function load() {
-
if (GBrowserIsCompatible()) {
-
map = new GMap2(document.getElementById("map"));
-
map.addControl(new GLargeMapControl());
-
map.addControl(
-
new GMapTypeControl(),
-
new GControlPosition(G_ANCHOR_TOP_RIGHT,
-
new GSize(10,10)));
-
map.setCenter(new GLatLng(36.705663020513555, 137.76159691810608), 5);
-
displayMark(map);
-
reloadMarkerEvent = GEvent.addListener(map, "moveend", reloadMark);
-
}
-
}
5~10行目。openInfoWindowHtmlの前にいったんリスナーを消してます。
openInfoWindowHtmlの後に、移動が終わったら再度Listenerを追加するようにしてます。
-
function addMarker( map, p, text ) {
-
var marker = new GMarker(p);
-
var wattingEvent;
-
GEvent.addListener( marker, "click", function() {
-
GEvent.removeListener(reloadMarkerEvent);
-
marker.openInfoWindowHtml(text);
-
var wattingEvent = GEvent.addListener(map, "moveend", function() {
-
reloadMarkerEvent = GEvent.addListener(map, "moveend", reloadMark);
-
GEvent.removeListener(wattingEvent);
-
});
-
-
});
-
map.addOverlay(marker);
-
return marker;
-
}