游戏移动的实现原理:
画出坦克后,在protected void onKeyEvent(int key) 方法中定义一个swich语句接收键盘按键
根据按键的方向来调用Tank的移动方法,当然要先编写Tank的移动方法。根据传入的方向加减Tank
图片的坐标实现移动。
实现步骤:
1、新建一个父类,命名为Element
1 public class Element { //所有对象的父类 2 int x; 3 int y; 4 int width; //图片的宽 5 int height; //图片的高 6 String imagePath; //存储图片路径 7 8 public void draw(){ //Draw方法 画出对象 9 try { 10 DrawUtils.draw(imagePath, x, y); 11 } catch (IOException e) { 12 // TODO 自动生成的 catch 块 13 e.printStackTrace(); 14 } 15 } 16 }
Element
2、新建一个枚举类,命名为Direction
1 public enum Direction { //定义一个枚举类 2 UP,DOWN,LEFT,RIGHT 3 }
Direction
3、让Tank类继承Element类并添加移动方法
1 public class Tank extends Element { 2 private int speed = 64; //移动的速度 3 public Tank(int x, int y) { //定义一个Tank的构造方法 4 this.x = x; //坐标的设置 5 this.y = y; 6 this.imagePath = "res/img/tank_u.gif"; //Tank的图片路径 7 } 8 9 public void move(Direction dir) { //Tank移动的方法 10 switch (dir) { //根据接收到的方向来移动 11 case UP: 12 y -= speed; 13 break; 14 15 case DOWN: 16 y += speed; 17 break; 18 case LEFT: 19 x -= speed; 20 break; 21 case RIGHT: 22 x += speed; 23 break; 24 } 25 } 26 }
Tank
4、在设置类中的onKeyEvent方法中设置移动方法的调用
1 public class TankWorld extends Window { 2 Tank tank; //定义一个Tank对象 3 List<Element> list; //定义一个集合存储对象 4 5 public TankWorld(String title, int width, int height, int fps) { 6 super(title, width, height, fps); 7 // TODO 自动生成的构造函数存根 8 } 9 10 @Override 11 protected void onCreate() { 12 try { 13 SoundUtils.play("res/snd/start.wav"); //游戏开始音乐 14 } catch (IOException e) { 15 // TODO 自动生成的 catch 块 16 e.printStackTrace(); 17 } 18 list = new CopyOnWriteArrayList<>(); //可遍历增删集合 19 tank = new Tank(0, 0); //生成的Tank对象坐标 20 list.add(tank); //将Tank对象存储到集合 21 } 22 23 @Override 24 protected void onMouseEvent(int key, int x, int y) { 25 // TODO 自动生成的方法存根 26 27 } 28 29 @Override 30 protected void onKeyEvent(int key) { //键盘监听方法 31 switch (key) { //根据接收的按键执行 32 case Keyboard.KEY_UP: //上方向键 33 tank.move(Direction.UP); //Tank移动的方法 34 break; 35 36 case Keyboard.KEY_DOWN: //下方向键 37 tank.move(Direction.DOWN); 38 break; 39 40 case Keyboard.KEY_LEFT: //左方向键 41 tank.move(Direction.LEFT); 42 break; 43 44 case Keyboard.KEY_RIGHT: //右方向键 45 tank.move(Direction.RIGHT); 46 break; 47 48 } 49 50 } 51 52 @Override 53 protected void onDisplayUpdate() { 54 for (Element e : list) { //循环遍历集合中的对象 55 e.draw(); //在界面画出对象 56 } 57 } 58 59 }
设置类
随笔说:
目前移动实现的效果还不完善,只能横着移动。素材可以自己在网上找一些比较酷炫的代替。
需要对继承、接口足够了解,才能事半功倍。不用重复的定义一个对象的属性方法。
时间: 2024-10-22 07:11:16