在本次教程中,我们将完成小球这个类的编写

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

Android游戏开发教程:手把手教你写跳跃类游戏(二)

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

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

  下面给出Ball.java的代码

Java代码
  1. package jumpball.game;    
  2.     
  3. import Android.graphics.Canvas;    
  4. import android.graphics.Color;    
  5. import android.graphics.Paint;    
  6.     
  7. public class Ball {    
  8.     float r, x, y;    
  9.     private Paint mPaint;    
  10.     // 最大垂直速度 方向向上 -16.     
  11.     float MAXVERTICALSPEED = -16, MAXVERTICALA = 1;    
  12.     // 默认最大高度     
  13.     float defaultJumpHight;    
  14.     // 小球在垂直方向上需要移动的距离!     
  15.     float verticalMove;    
  16.     float ha = 0, va = 1f, v0v, vtv, v0h, vth;    
  17.     GameView gameView;    
  18.     
  19.     public Ball(GameView gameView) {    
  20.         this.gameView = gameView;    
  21.         mPaint = new Paint();    
  22.         mPaint.setColor(Color.BLACK);    
  23.         defaultJumpHight = gameView.height / 3;    
  24.         r = gameView.width / 36;    
  25.         y = gameView.height - r * 2;    
  26.         x = gameView.width / 2 - r;    
  27.         //根据加速度公式计算得出Vt^2-V0^2=2AX     
  28.         MAXVERTICALSPEED = -(int) ((float) Math.sqrt(2 * gameView.height / 3) - 1);    
  29.         verticalMove = defaultJumpHight;    
  30.         v0v = MAXVERTICALSPEED;    
  31.     }    
  32.     
  33.     public void draw(Canvas canvas) {    
  34.         move();    
  35.         canvas.drawCircle(x, y, r, mPaint);    
  36.     }    
  37.     
  38.     public void move() {    
  39.         // Vt=V0+aT 当前速度=初始速度+加速度*时间     
  40.         vtv = v0v + va;    
  41.         // 当下降速度达到一定程度时,设置加速度为0.4f。     
  42.         if (vtv > -5 * MAXVERTICALSPEED / 8) {    
  43.             va = 0.4f;    
  44.         } else {    
  45.             va = MAXVERTICALA;    
  46.         }    
  47.         // 当当前还需上升的高度 大于默认高度时,速度继续保持最大速度,vtv<0表示方向向上     
  48.         if (verticalMove > defaultJumpHight && vtv < 0) {    
  49.             vtv = MAXVERTICALSPEED;    
  50.         }    
  51.         float vMove = (v0v + vtv) / 2// 这一次垂直高度移动距离。     
  52.         verticalMove = verticalMove + vMove;// 减小时,表示网上移动了     
  53.         y = y + vMove;    
  54.         v0v = vtv;    
  55.         if (y > gameView.height) {// 触地了     
  56.             y = gameView.height - this.r;    
  57.             v0v = MAXVERTICALSPEED;    
  58.             verticalMove = defaultJumpHight;    
  59.         }    
  60.     }    
  61. }    

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

Java代码
  1. Ball ball;    

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

Java代码
  1. ball=new Ball(this);    

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

Java代码
  1. ball.draw(mCanvas);    

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

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

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

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

  同时重写两个方法

Java代码
  1. public boolean onKeyDown(int keyCode, KeyEvent event) {    
  2.     if (keyCode == KeyEvent.KEYCODE_BACK) {    
  3.         gameActivity.finish();    
  4.         return true;    
  5.     } else if (keyCode == KeyEvent.KEYCODE_DPAD_LEFT) {    
  6.         leftKeyDown = true;    
  7.     } else if (keyCode == KeyEvent.KEYCODE_DPAD_RIGHT) {    
  8.          rightKeyDown = true;    
  9.     }    
  10.     return true;    
  11. }    
  12. public boolean onKeyUp(int keyCode, KeyEvent event) {    
  13.     if (keyCode == KeyEvent.KEYCODE_DPAD_LEFT) {    
  14.          leftKeyDown = false;    
  15.     } else if (keyCode == KeyEvent.KEYCODE_DPAD_RIGHT) {    
  16.          rightKeyDown = false;    
  17.     }    
  18.     return true;    
  19. }    

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

Java代码
  1. //水平移动设置    
  2. if(gameView.leftKeyDown==true){    
  3.     xx=x-10;    
  4. }    
  5. if(gameView.rightKeyDown==true){    
  6.     xx=x+10;                 
  7. }    
  8. if (x < r) {    
  9.     x = r;    
  10. }    
  11. if (x > gameView.width - r) {    
  12.     x = gameView.width - r;    
  13. }    

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

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

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

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

Java代码
  1. setFocusable(true);    

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

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

  下面贴出程序的运行效果图:

Android游戏开发教程:手把手教你写跳跃类游戏(二)

       以及项目的一个结构:

Android游戏开发教程:手把手教你写跳跃类游戏(二)

 

本文发布:Android开发网
本文地址:http://www.jizhuomi.com/android/game/589.html
2016年6月24日
发布:鸡啄米 分类:Android游戏开发 浏览: 评论:0