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以下に落ちたときにそこで、止まるようなプログラムを書く必要があります。
落下された位置以下まで来たら、ジャンプで設定したメンバー変数を元に戻すことで、繰り返しのジャンプが実装できました。
途中、当たり判定を実装する過程で、これらの処理を見直さなければならない場面がくると思いますが、
とりあえず、これでジャンプとダッシュの実装ができました。