这是第二篇博客,在本次教程中,我们将完成小球这个类的编写
首先给大家看下小球这个类的类图:
主要确定小球的坐标: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函数,我会在视频中详细的讲解~~~
下面贴出程序的运行效果图: 以及项目的一个结构:
源码下载地址请看最终版!