8.マリオにダッシュとジャンプをさせる
今回はマリオにダッシュとジャンプをさせます。
マリオクラスのmove関数に書き足していきます。
同時にメンバー変数も必要になるので、書き足します。
/* marioクラス */ function cMario(){ // 変数(座標) this.PosX; // x座標 this.PosY; // y座標 this.GroundPosY; // 地面座標 this.AddNumY; // yの加算量 this.AddNumX; // x座標移動加算量 this.Dir; // 向いている方向 this.AnimX; // アニメーションX this.AnimCnt; // アニメーションカウント this.DashCnt; // ダッシュさせるまでの時間 this.DashState; // 移動状態 this.bJump; // ジャンプフラグ this.JumpCnt; // ジャンプカウンター } /* 初期化関数 */ cMario.prototype.Init = function(x,y){ this.PosX = x; this.PosY = y; this.AddNumY = 0; // y加算量 this.GroundPosY = 416; // 地面座標 this.Dir = RIGHT_DIR; this.AddNumX = 2; this.AnimX = 0; this.AnimCnt = 0; // アニメーションカウント this.DashCnt = 0; // ダッシュさせるまでの時間 this.DashState = WALK; // 移動状態 this.bJump = false; // ジャンプフラグ this.JumpCnt = 0; // ジャンプカウンター } /* 動き */ cMario.prototype.Move = function(bRight,bLeft,bSpace,bJump){ // 右キーが押された if(bRight) { // ダッシュボタンが押されている if(bSpace) { this.DashState = DASH; this.AddNumX = 4; this.AnimX = 64; // ダッシュ用のアニメ // 何回でアニメーションを変えるか if(this.AnimCnt++ >= ANIM_CHANGE - 1) { if(this.AnimX == 64) { this.AnimX = 96; // 次のコマへ } else { this.AnimX = 64; } this.AnimCnt = 0; } } else { this.AddNumX = 2; // 何回でアニメーションを変えるか if(this.AnimCnt++ >= ANIM_CHANGE) { if(this.AnimX == 0) { this.AnimX = 32; // 次のコマへ } else { this.AnimX = 0; } this.AnimCnt = 0; } } this.Dir = RIGHT_DIR; this.PosX += this.AddNumX; } // 左キーが押された else if(bLeft) { // ダッシュボタンが押されている if(bSpace) { this.DashState = DASH; this.AddNumX = 4; this.AnimX = 64; // ダッシュ用のアニメ // 何回でアニメーションを変えるか if(this.AnimCnt++ >= ANIM_CHANGE - 1) { if(this.AnimX == 64) { this.AnimX = 96; // 次のコマへ } else { this.AnimX = 64; } this.AnimCnt = 0; } } else { this.AddNumX = 2; // 何回でアニメーションを変えるか if(this.AnimCnt++ >= ANIM_CHANGE) { if(this.AnimX == 0) { this.AnimX = 32; // 次のコマへ } else { this.AnimX = 0; } this.AnimCnt = 0; } } this.Dir = LEFT_DIR; this.PosX -= this.AddNumX; } // ジャンプ if(bJump) { // ジャンプフラグ if(!this.bJump) { this.bJump = true; // ダッシュ中はジャンプ力を上げる if(bSpace) this.AddNumY = 18; // ジャンプさせる else this.AddNumY = 16; // ジャンプさせる } } // ジャンプアクション if(this.bJump) { // ジャンプ時のアニメーション if(bSpace)this.AnimX = 160; else this.AnimX = 128; this.PosY -= this.AddNumY; // 上昇 // タイマーをかける if(this.JumpCnt++ % 2 == 0) { this.AddNumY -= 2; // 最大落下速度 if(this.AddNumY < -MAX_GRAVITY) { this.AddNumY = -MAX_GRAVITY; } } // 地面とされる位置についた if(this.PosY >= this.GroundPosY) { this.AddNumY = 0; this.PosY = this.GroundPosY; this.bJump = false; this.AnimX = 0; // アニメーション通常 } } }
マリオをダッシュさせる
// ダッシュボタンが押されている if(bSpace) { this.DashState = DASH; this.AddNumX = 4; this.AnimX = 64; // ダッシュ用のアニメ // 何回でアニメーションを変えるか if(this.AnimCnt++ >= ANIM_CHANGE - 1) { if(this.AnimX == 64) { this.AnimX = 96; // 次のコマへ } else { this.AnimX = 64; } this.AnimCnt = 0; } }
まずは、マリオをダッシュさせます。
処理とすれば、何かダッシュのトリガーとなるキー(ここでは、スペースキーとしています)を押したときに、
ダッシュ用のアニメーションにして、移動量を増やせば終わりです。
次はジャンプをさせてみます。
マリオをジャンプさせる
// ジャンプ if(bJump) { // ジャンプフラグ if(!this.bJump) { this.bJump = true; // ダッシュ中はジャンプ力を上げる if(bSpace) this.AddNumY = 18; // ジャンプさせる else this.AddNumY = 16; // ジャンプさせる } }
そして、bJumpフラグが立っていない場合のみ、ジャンプを有効にします。
this.AddNumYはY方向の加算量です。この値が大きいほど、ジャンプ力が大きくなります。
ダッシュ中の場合はジャンプ力を大きくします。
次は、ジャンプフラグが立った後の処理です。
// ジャンプアクション if(this.bJump) { // ジャンプ時のアニメーション if(bSpace)this.AnimX = 160; else this.AnimX = 128; this.PosY -= this.AddNumY; // 上昇 // タイマーをかける if(this.JumpCnt++ % 2 == 0) { this.AddNumY -= 2; // 最大落下速度 if(this.AddNumY < -MAX_GRAVITY) { this.AddNumY = -MAX_GRAVITY; } } // 地面とされる位置についた if(this.PosY >= this.GroundPosY) { this.AddNumY = 0; this.PosY = this.GroundPosY; this.bJump = false; this.AnimX = 0; // アニメーション通常 } }
まずは、上昇して一定時間がたった後に落下するというジャンプ処理です。
最初にジャンプボタンを押したときに、AddNumYに値を代入しているので、その値をどんどん減らしていくことによって、
上昇した後に下降するという処理を実装することができます。
MAX_GRAVITYは最大落下速度を定めた定数で、AddNumYを下げすぎると、どんどん落下速度があがるので、途中で落下速度が止まるようにしています。
次は、地面とされる位置で落下をとめる処理です。
普通は地面に着地すれば自動的に止まりますが、プログラム空間なので、当然止まりません。
なので、自分で地面とされる位置を決めなければなりません。それがGroundPosYです。
Init関数で、GroundPosYを416に設定しています。ですから、416以下に落ちたときにそこで、止まるようなプログラムを書く必要があります。
落下された位置以下まで来たら、ジャンプで設定したメンバー変数を元に戻すことで、繰り返しのジャンプが実装できました。
途中、当たり判定を実装する過程で、これらの処理を見直さなければならない場面がくると思いますが、
とりあえず、これでジャンプとダッシュの実装ができました。