Home > WEB | javascript > Google ストリートビューで鬼ごっこ

Google ストリートビューで鬼ごっこ

北海道までライジングサンを見に遊びにいってきました。ただいま!

今回は、現在までのストリートビューのプログラムを組み合わせて、
地図上を複数のキャラクターが動き回るサンプルを作ってみました。

クリックで新しいウィンドウにサンプル表示

一応IEでも確認しましたが、FireFox3環境を激しく推奨。
(IE謎のエラーがたまにでる・・・)

基本は、以前のサンプルの自動で動き回るキャラクターを複数にしただけです。
当たり判定とかも加えてゲームらしくしようかと思ったんですが、そこは挫折しましたw

↓以下ソース全部

JAVASCRIPT:
  1. var lastPanoId = null;         // 最後にいた場所のPanoID
  2. var nowLatLng;
  3. var map;
  4. var streetViewClient;
  5. var streetPanorama;
  6.  
  7. var enemyList = [];
  8. var enemyMarker;
  9.  
  10. var zakoIcon;
  11.  
  12. // GoogleMapsの初期化
  13. function initMap(lat, lng){
  14.     map = new GMap2(document.getElementById("map"));
  15.     map.disableDragging();
  16.     var ctrlObj = new GMapTypeControl();
  17.     var pos = new GControlPosition(G_ANCHOR_BOTTOM_RIGHT, new GSize(5, 15));
  18.     map.addControl(ctrlObj, pos);
  19.     map.setCenter(new GLatLng(lat, lng), 18);
  20.     initMarker();
  21.     initPanorama(lat, lng);
  22. }
  23.  
  24. function initMarker(){
  25.     zakoIcon = new GIcon();
  26.     zakoIcon.image = "./zako_front.gif";
  27.     zakoIcon.iconSize = new GSize(30, 57);
  28.     zakoIcon.iconAnchor = new GPoint(15, 57);
  29. }
  30.  
  31. function initPanorama(lat, lng){
  32.     streetViewClient = new GStreetviewClient;
  33.     streetPanorama = new GStreetviewPanorama(document.getElementById("pano"));
  34.     nowLatLng = new GLatLng(lat, lng);
  35.     streetViewClient.getNearestPanoramaLatLng(nowLatLng, function(latlng){
  36.         if(latlng == null){
  37.             document.getElementById("pano").style.display = "none";
  38.             return;
  39.         }
  40.         nowLatLng = latlng;
  41.         streetPanorama.setLocationAndPOV(nowLatLng, {yaw: 180, pitch: 0, zoom: -1});
  42.  
  43.         GEvent.addListener(streetPanorama,
  44.                            "yawchanged",
  45.                            function(yaw){
  46.                                changeYaw(yaw);
  47.                            });
  48.  
  49.         GEvent.addListener(streetPanorama,
  50.                            "initialized",
  51.                            function(location){
  52.                                panoramaInitialized(location);
  53.                            });
  54.     });
  55.  
  56.     // キャラクタを配置
  57.     enemyOptions = [ { lat:35.661821, lng:139.666685},
  58.              { lat:35.662404, lng:139.665810},
  59.              { lat:35.66215,  lng:139.665270}           
  60.                       ];
  61.     for(i = 0; i <enemyOptions.length; i++){
  62.         var enemy = new Object;
  63.         enemy.lat = enemyOptions[i]["lat"];
  64.         enemy.lng = enemyOptions[i]["lng"];
  65.         enemy.marker = new GMarker(new GLatLng(enemy.lat, enemy.lng),{draggable:false, icon:zakoIcon});
  66.         map.addOverlay(enemy.marker);
  67.     enemy.moveInterval = setInterval("toNextPanorama("+i+")", 2000);
  68.         enemyList[i] = enemy;
  69.     }
  70. }
  71.  
  72. // 次の位置へ移動
  73. function toNextPanorama(enemy_num){
  74.     var enemy = enemyList[enemy_num];
  75.     clearInterval(enemy.moveInterval);
  76.  
  77.     enemy.pt = map.fromLatLngToContainerPixel(new GLatLng(enemy.lat, enemy.lng));
  78. /*
  79.     if(enemy.pt.x> 210 && enemy.pt.x <230 && enemy.pt.y> 192 && enemy.pt.y <270){
  80.         //alert("hit");
  81.     }
  82. */
  83.  
  84.     // 現在の表示位置の緯度経度を取得
  85.     streetViewClient.getNearestPanorama(new GLatLng(enemy.lat, enemy.lng), function(streetData){
  86.         var neighbourCount = streetData.links.length; // 隣接するパノラマの数
  87.         var nextPanoId; // 次に向かうパノラマのID
  88.         if(neighbourCount == 1){
  89.             // 隣接するパノラマが1つだった場合はそこへ移動
  90.             enemy.nextYaw = streetData.links[0].yaw;
  91.             nextPanoId = streetData.links[0].panoId;
  92.         }else{
  93.              while(1){
  94.                  i = Math.floor( Math.random() * neighbourCount );
  95.                  if(enemy.lastPanoId != streetData.links[i].panoId){
  96.                  nextPanoId = streetData.links[i].panoId;
  97.                  enemy.nextYaw = streetData.links[i].yaw;
  98.                  break;
  99.             }
  100.         }
  101.     }
  102.     enemy.lastPanoId = streetData.location.panoId;     // 今いた場所を覚えておく
  103.     streetViewClient.getPanoramaById( nextPanoId,
  104.                                   function(nextStreetData){
  105.  
  106.                                                        enemy.nowLatLng = nextStreetData.location.latlng;
  107.                                                        var pov = streetPanorama.getPOV();
  108.                                                        nowYaw = pov.yaw;
  109.                                                        if(nowYaw> 360) nowYaw -= 360;
  110.                                                        if(Math.abs(nowYaw - enemy.nextYaw)> 180){
  111.                                                                if(nowYaw> enemy.nextYaw) enemy.nextYaw += 360;           
  112.                                                        }
  113.  
  114.                                                                map.removeOverlay(enemy.marker);
  115.                                                                zakoIcon.image = getIconFromYaw(enemy.nextYaw);
  116.                                    enemy.marker = new GMarker(new GLatLng(enemy.nowLatLng.lat(), enemy.nowLatLng.lng()),{draggable:false, icon:zakoIcon});
  117.                                                                map.addOverlay(enemy.marker);
  118.                                    enemy.lat = enemy.nowLatLng.lat();
  119.                                    enemy.lng = enemy.nowLatLng.lng();
  120.                                    enemy.pt = map.fromLatLngToContainerPixel(enemy.nowLatLng);
  121.  
  122. /*
  123.                                    if(enemy.pt.x> 210 && enemy.pt.x <230 && enemy.pt.y> 192 && enemy.pt.y <270){
  124.                                    //alert("hit");
  125.                                    }
  126. */
  127.                                                                enemy.moveInterval = setInterval("toNextPanorama("+enemy_num+")", 2000);
  128.                                                                enemyList[enemy_num] = enemy;
  129.                                       }
  130.                                  );
  131.  
  132.      });
  133. }
  134.  
  135. function getIconFromYaw(yaw){
  136.     gifFile = "./zako_f.gif";
  137.     if( yaw> 360 ) yaw -= 360;
  138.     if( yaw>= 315 || yaw <45  ) gifFile = "./zako_back.gif";
  139.     else if( yaw>= 45 && yaw < 135 ) gifFile = "./zako_right.gif";
  140.     else if( yaw>= 135 && yaw < 225 ) gifFile = "./zako_front.gif";
  141.     else if( yaw>= 225 || yaw <315 ) gifFile = "./zako_left.gif";
  142.     return gifFile;
  143. }
  144.  
  145. function changeYaw(yaw){
  146.     var gifFile;
  147.     if( yaw> 360 ) yaw -= 360;
  148.     if( yaw>= 315 || yaw <45  ) gifFile = "ue.gif";
  149.     else if( yaw>= 45 && yaw < 135 ) gifFile = "migi.gif";
  150.     else if( yaw>= 135 && yaw < 225 ) gifFile = "shita.gif";
  151.     else if( yaw>= 225 || yaw <315 ) gifFile = "hidari.gif";
  152.     document.getElementById("girl").innerHTML = '<img src="'+ gifFile +'" alt="gial"/>';
  153. }
  154.  
  155. function panoramaInitialized(location){
  156.     map.panTo(location.latlng);
  157. }

Comments:0

Comment Form
Remember personal info

Trackbacks:1

Trackback URL for this entry
http://parpue.net/web/259/trackback
Listed below are links to weblogs that reference
Google ストリートビューで鬼ごっこ from parpue.net
trackback from わらびっち Tech館 09-03-15 (日) 3:29

Google StreetView でゲーム作成

Google StreetView 逃走ゲーム

某逃走ゲームの番組が好きで、、、
鬼ごっこを Google ストリートビューを使って
ゲーム作ってみましたー

とり…

Home > WEB | javascript > Google ストリートビューで鬼ごっこ

リンク
chocolataste-planner
millon

サーチ
Feeds
Meta
blog ranking ブログランキング・にほんブログ村へ
にほんブログ村 テクノラティのお気に入りに追加する

Return to page top