GameCorder.net

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以下に落ちたときにそこで、止まるようなプログラムを書く必要があります。
落下された位置以下まで来たら、ジャンプで設定したメンバー変数を元に戻すことで、繰り返しのジャンプが実装できました。

途中、当たり判定を実装する過程で、これらの処理を見直さなければならない場面がくると思いますが、
とりあえず、これでジャンプとダッシュの実装ができました。