【ハウツー】
今回はオブジェクト指向を少し取り入れてみました。敵車の移動方法を新たに作成しmoveメソッドとして割り当てることで他の車とは異なる動きにすることもできます。昔のレースゲームでは、なぜか道路に落とし穴があったり、岩が障害物として用意されていたりしていました。このような新たな障害物も出てくるようにしてみるのもよいでしょう。
*なお、このプログラムは自由に改造して配布しても問題ありません。適当にプログラム書き換えて楽しんでください。
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta http-equiv="content-type" content="text/html;charset=utf-8">
<meta name="viewport" content="initial-scale=1, user-scalable=no">
<title>SimpleRace</title>
<style type="text/css"><!--
body { background-color: #000000; background-image:url(images/bg.gif) }
#gameForm { position:absolute; left:50px; top:170px; z-index:10; }
#gameForm input { font-size:24pt; z-index:10; }
#score { position:absolute; left:30px; top:2px; color:#000000; }
#mycar { position:absolute; left:160px; top:260px; color:#ffffff; }
--></style>
<script type="text/javascript"><!--
// ===============================================
// 初期設定
// ===============================================
var myCarW = 24; // マイカーの横幅
var myCarX = 160; // マイカーのX座標
var enemyCarW = 24; // 敵車の横幅
var bgY = 0; // 背景画像のY座標
var enemy = []; // 敵車の情報を入れる配列
var maxCar = 4; // 移動させる敵の車の最大数
var carLimit = 20; // 敵車の出現最大数
var enemyCounter = 0; // 敵車を出現させるカウンタ
var score = 0; // スコア
// ===============================================
// マイカーの位置を設定するためのイベントを設定
// ===============================================
window.addEventListener("load", function(){ // ページ内容が読み込まれたらイベントを設定
document.addEventListener("touchmove", function(){
event.preventDefault(); // デフォルトのイベントを禁止する
myCarX =event.touches[0].pageX - myCarW / 2; // タッチされた横位置を取得しマイカーのX座標とする
if (myCarX < 16) myCarX = 16; // 一定以上左に行かないようにする
if (myCarX > 280) myCarX = 280; // 一定上右に行かないようにする
document.getElementById("mycar").style.left = myCarX; // 自機を指定したX座標に表示する
}, false);
});
// ===============================================
// 敵車を生成する
// ===============================================
function createEnemy(eID){
this.x = Math.floor(Math.random() * 280) + 20;
this.y = Math.random() * -100 - 24; // 最初の位置
this.move = moveEnemy; // 移動処理を行う関数名
this.dx = Math.random() * 3 - 1;
this.dy = Math.random() * 10 + 4;
this.id = eID; // 敵車のID
var imgObj = document.createElement("img");
imgObj.id = eID;
imgObj.src = "images/enemy.gif";
imgObj.width = enemyCarW;
imgObj.height = enemyCarW;
imgObj.style.position = "absolute";
imgObj.style.left = this.x;
imgObj.style.top = this.y;
document.body.appendChild(imgObj);
}
// ===============================================
// 敵車を移動させるための関数(メソッド)
// ===============================================
function moveEnemy(){
this.x = this.x + this.dx;
this.y = this.y + this.dy;
var img = document.getElementById(this.id);
img.style.left = this.x;
img.style.top = this.y;
if (this.y > 360) {
this.x = Math.floor(Math.random() * 280) + 20;
this.y = -24;
this.dx = Math.random() * 3 - 1;
this.dy = Math.random() * 16 + 4;
enemyCounter++;
enemyCounter = enemyCounter & 15; // 16台追い越したら1台増やす
if (enemyCounter == 0){
if (maxCar < carLimit){
enemy[maxCar] = new createEnemy("car"+maxCar);
maxCar++;
}
}
}
// マイカーとの接触判定
if ( (this.y > 260) && (this.y < 284) && ((this.x + enemyCarW) > myCarX) && (this.x < (myCarX + myCarW)) ) {
alert("どか~ん! ゲームオーバー!");
gameFlag = false;
clearInterval(timerID); // タイマー処理を終了
document.getElementById("gameForm").style.visibility = "visible";
}
}
// ===============================================
// ゲーム開始時に敵車を生成
// ===============================================
function startEnemy() {
for (var i=0; i<carLimit; i++) {
enemy[i] = null; // 全ての敵車を消す
var img = document.getElementById("car"+i);
if (img != null) {
img.style.top = -100; // 画面外に移動させておく
}
}
for (var i=0; i<maxCar; i++){
enemy[i] = new createEnemy("car"+i);
}
}
// ===============================================
// 全ての敵車を移動
// ===============================================
function moveAllEnemy() {
for (var i=0; i<maxCar; i++){
enemy[i].move();
}
}
// ===============================================
// 背景を移動
// ===============================================
function moveBG(){
bgY = bgY + 16; // 16ピクセルごと背景画像を下に移動
bgY = bgY & 0x7f; // 128との論理積
document.body.style.backgroundPositionY = bgY;
score++;
document.getElementById("score").innerHTML = score + "点";
}
// ===============================================
// ゲーム開始
// ===============================================
function gameStart(){
document.getElementById("gameForm").style.visibility = "hidden";
maxCar = 4; // 最初の敵車の数
score = 0; // 0点
gameFlag = true; // ゲーム中であることを示すフラグをセットする
document.getElementById("score").innerHTML = "0点";
startEnemy();
timerID = setInterval("moveBG();moveAllEnemy();", 20); // 20ミリ秒ごとに処理するようにタイマーを設定
}
// --></script>
</head>
<body>
<div id="score">0点</div>
<form id="gameForm">
<input type="button" value="ゲーム開始" ontouchstart="gameStart()" onclick="gameStart()">
</form>
<img id="mycar" src="images/mycar.gif" width="24" height="24">
</body>
</html>
| iPhoneゲーム自作工房8 - インベーダータイプのゲームを創る [2008/9/3] |
| iPhoneゲーム自作工房7 - ブロック崩しゲームを創る [2008/8/15] |
| iPhoneゲーム自作工房6 - ひとりで壁に向かってボールを打ち続けるゲーム [2008/8/7] |
| iPhoneゲーム自作工房5 - Googleマップ回転ゲームの作成 [2008/8/6] |
| iPhoneゲーム自作工房4 - iPhoneで反射神経を鍛えるゲームを作る [2008/8/4] |
| iPhoneゲーム自作工房3 - タッチポイントゲームを作成 [2008/8/1] |
| iPhoneゲーム自作工房2 - 隕石破壊ゲームの作成 [2008/7/30] |
| iPhoneゲーム自作工房 - iPhone用ゲームを手軽に作る [2008/7/28] |
| 【レポート】マカフィーの世界の専門家の意識調査「サイバー防衛報告書」とセキュリティソリューション [21:15 5/25] |
| アップル、Aperture 3.2.4を公開 - バグ修正、安定性向上など [20:51 5/25] |
| 【レポート】GTC 2012 - VGXでエンタープライズ環境でのGPU需要開拓を狙うNVIDIA [20:07 5/25] |
| デル、期間限定キャンペーンに特価アイテム追加、アップグレード無料も継続 [19:41 5/25] |
| 上海問屋、iPhoneとほぼ同じ薄さのバッテリ内蔵ヘッドホンアンプ [19:05 5/25] |
|
【連載】これだけは要チェック! TOEIC(R)単語帳 第104回 今回のお題は…「be superior to」 [20:00 5/26] キャリア |
|
[木下優樹菜]妊娠7カ月でガールズアワード登場 [19:50 5/26] エンタメ |
|
「電撃20年祭」大サイン会、田中久仁彦や岸田メルら集結 [19:42 5/26] ホビー |
|
[AKB48・指原莉乃]総選挙速報4位に「キープしたい」 [19:05 5/26] ホビー |
|
[モーニング娘。]新体制でガールズアワード初登場 新曲初披露に先輩・矢口も絶賛 [18:48 5/26] エンタメ |