Android_手把手教你写跳跃类游戏(2)

 

-----------------------------------------------------------------------------
博客已搬家:地址  博客已搬家:地址 博客已搬家:地址
-----------------------------------------------------------------------------


 这是第二篇博客,在本次教程中,我们将完成小球这个类的编写

首先给大家看下小球这个类的类图:

Android_手把手教你写跳跃类游戏(2)_第1张图片

主要确定小球的坐标:x,y。小球的半径:r。以及小球的运动函数和如何讲小球画在屏幕上的draw()函数。

难点是:move()函数。我们将简单的模拟一个物理环境,使小球看上去显得很有弹性。具体关于这部分,我会在接下去的文章中进行解答。

下面给出Ball.java的代码

package jumpball.game;

import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;

public class Ball {
	float r, x, y;
	private Paint mPaint;
	// 最大垂直速度 方向向上 -16.
	float MAXVERTICALSPEED = -16, MAXVERTICALA = 1;
	// 默认最大高度
	float defaultJumpHight;
	// 小球在垂直方向上需要移动的距离!
	float verticalMove;
	float ha = 0, va = 1f, v0v, vtv, v0h, vth;
	GameView gameView;

	public Ball(GameView gameView) {
		this.gameView = gameView;
		mPaint = new Paint();
		mPaint.setColor(Color.BLACK);
		defaultJumpHight = gameView.height / 3;
		r = gameView.width / 36;
		y = gameView.height - r * 2;
		x = gameView.width / 2 - r;
		//根据加速度公式计算得出Vt^2-V0^2=2AX
		MAXVERTICALSPEED = -(int) ((float) Math.sqrt(2 * animView.height / 3* MAXVERTICALA));
		verticalMove = defaultJumpHight;
		v0v = MAXVERTICALSPEED;
	}

	public void draw(Canvas canvas) {
		move();
		canvas.drawCircle(x, y, r, mPaint);
	}

	public void move() {
		// Vt=V0+aT 当前速度=初始速度+加速度*时间
		vtv = v0v + va;
		// 当下降速度达到一定程度时,设置加速度为0.4f。
		if (vtv > -5 * MAXVERTICALSPEED / 8) {
			va = 0.4f;
		} else {
			va = MAXVERTICALA;
		}
		// 当当前还需上升的高度 大于默认高度时,速度继续保持最大速度,vtv<0表示方向向上
		if (verticalMove > defaultJumpHight && vtv < 0) {
			vtv = MAXVERTICALSPEED;
		}
		float vMove = (v0v + vtv) / 2; // 这一次垂直高度移动距离。
		verticalMove = verticalMove + vMove;// 减小时,表示网上移动了
		y = y + vMove;
		v0v = vtv;
		if (y > gameView.height) {// 触地了
			y = gameView.height - this.r;
			v0v = MAXVERTICALSPEED;
			verticalMove = defaultJumpHight;
		}
	}
}

在GameVIew类里面定义一个小球对象。

Ball ball;

在GameView的构造方法里面进行实例化

ball=new Ball(this);

同时在GameView的mDraw函数里面添加

ball.draw(mCanvas);

这样我们就完成了ball对象...娃哈哈~(游戏 已经有点样子了!)

运行程序。我们就能看到一个有弹性的小球了,在那边跳啊跳~~~~

 

最后我们完成小球的左右移动。这部分比较简单~~~

在GameView定义两个boolean变量表示左右键是否按下

同时重写两个方法

	public boolean onKeyDown(int keyCode, KeyEvent event) {
		if (keyCode == KeyEvent.KEYCODE_BACK) {
			gameActivity.finish();
			return true;
		} else if (keyCode == KeyEvent.KEYCODE_DPAD_LEFT) {
			leftKeyDown = true;
		} else if (keyCode == KeyEvent.KEYCODE_DPAD_RIGHT) {
			 rightKeyDown = true;
		}
		return true;
	}
	public boolean onKeyUp(int keyCode, KeyEvent event) {
		if (keyCode == KeyEvent.KEYCODE_DPAD_LEFT) {
			 leftKeyDown = false;
		} else if (keyCode == KeyEvent.KEYCODE_DPAD_RIGHT) {
			 rightKeyDown = false;
		}
		return true;
	}

然后在小球的move方法里面添加:

//水平移动设置
		if(gameView.leftKeyDown==true){
			x=x-10;
		}
		if(gameView.rightKeyDown==true){
			x=x+10;				
		}
		if (x < r) {
			x = r;
		}
		if (x > gameView.width - r) {
			x = gameView.width - r;
		}

本来写到这里就已经完成了小球的左右移动,但是实际运行却发现根本移动不了~~~

我查了下资料发现问题在这:

我们自己定义的View,必须获得焦点之后才会调用onKeyDown方法~而Activty的onKeyDown方法是当所有空控件均没处理的时候才会被调用。

所以我们在GameView的构成方法里面添加一句:

setFocusable(true);

好了。。。大功告成~~~~这样我们就可以控制小球的移动了!!!

关于小球move函数,我会在视频中详细的讲解~~~

下面贴出程序的运行效果图:                             以及项目的一个结构:

            

源码下载地址请看最终版! 

你可能感兴趣的:(游戏,android,Class,float)