《Java小游戏实现》:坦克大战(续四)

相关博文:

《Java小游戏实现》:坦克大战http://blog.csdn.net/u010412719/article/details/51712663

《Java小游戏实现》:坦克大战(续一):http://blog.csdn.net/u010412719/article/details/51723570

《Java小游戏实现》:坦克大战(续二):http://blog.csdn.net/u010412719/article/details/51729655

《Java小游戏实现》:坦克大战(续三):http://blog.csdn.net/u010412719/article/details/51735013

博文《Java小游戏实现》:坦克大战(续三)中已经实现到了坦克大战的基本对战功能。这篇博文在此基础上继续实现更多的功能,例如:为游戏添加围墙。

完成功能:为游戏添加围墙

本项目为围墙单独建立一个类:Wall。

我们利用面向对象的思想,可以考虑Wall类应该有什么属性和方法。

根据我们将这个游戏开发到目前这个阶段的经验,可以很容易的想到,Wall这个类,应该有如下:

1、位置属性:x,y,width,height

2、有一个大管家TankClient的引用

3、构造方法

4、draw方法

5、由于会涉及到和墙的碰撞检测,因此也需要一个getRect()方法

具体内容如下:

    public class Wall {//位置属性private int x;private int y;  private int width;private int height;private TankClient tc;public Wall(int x, int y, int width, int height, TankClient tc) {this.x = x;this.y = y;this.width = width;this.height = height;this.tc = tc;}public void draw(Graphics g){Color c = g.getColor();g.setColor(Color.BLACK);    g.fillRect(x, y, width, height);g.setColor(c);}public Rectangle getRect(){return new Rectangle(x,y,width,height);}}

测试这个类是否在我们的游戏界面中显示出来。

在TankClient类new两个Wall对象并在draw显示出来即可。

具体如下:

    private Wall w1 = new  Wall(200, 200, 200, 10, this);private Wall w2 = new  Wall(100, 100, 10, 300, this);@Overridepublic void paint(Graphics g) {//画墙w1.draw(g);w2.draw(g);//....其它的一些代码省略}

测试结果如下:

以上就添加了一个简单的墙,但是目前还存在一些问题

1、子弹可以穿透墙

2、坦克也可以穿透墙

本项目中处理上面两个问题的方法如下:

1、而本来子弹是不可以穿透墙的,当子弹击中墙时,子弹应该消失。

2、坦克也应该不可以穿透墙的,当坦克碰到墙时,应该换其它的方向运动。

下面我们一个一个的来解决上面提到的两个问题。

完成的功能:处理子弹和墙的碰撞

本项目处理这种情况的方法为:当子弹和墙碰撞时,子弹消失。

子弹和墙碰撞的处理方式与之前子弹和坦克碰撞的处理方式一样。

而之前子弹和坦克碰撞的处理方式为:在Missile类添加了如下的两种方法:

    public boolean hitTank(Tank t){...}public boolean hitTanks(List<Tank> tanks){...}

基于此,我们处理子弹和墙的碰撞,同样也是在Missile添加两个函数,具体如下:

    /** 函数的功能:判断子弹是否击中了墙* */public boolean hitWall(Wall w){if(!this.live){return false;}if(this.live&&this.getRect().intersects(w.getRect())){this.live = false;return true;}else{return false;}       }/** 函数的功能:判断子弹是否击中了一系列的墙* */public boolean hitWalls(List<Wall> walls){for(int i=0;i<walls.size();i++){if(this.hitWall(walls.get(i))){return true;}}return false;}

然后在TankClient类中的draw方法调用子弹的这两个方法,即ms.hitWall(w1);

如下:

    @Overridepublic void paint(Graphics g) {//画墙w1.draw(g);w2.draw(g);//画子弹for(int i=0;i<missiles.size();i++){Missile ms = missiles.get(i);           //判断子弹是否还存活在,如果不是存活的,则移除if(!ms.isLive()){missiles.remove(ms);}else{ms.hitTanks(enemyTanks);ms.draw(g);//将自己的坦克也加入到子弹可以攻击的范围ms.hitTank(tk);//子弹打墙ms.hitWall(w1);ms.hitWall(w2);}}}

接下来,处理坦克撞墙的情况

本项目处理坦克撞墙的方法为:当坦克撞墙后,回到上一次的位置。

        //坦克前一个时刻的位置private int oldX;private int oldY;//坦克撞一个墙    public boolean tankHitWall(Wall w){if(!this.live){return false;}if(this.getRect().intersects(w.getRect())){this.x = oldX;this.y = oldY;return true;}else{return false;}}//坦克撞一系列的墙public boolean tankHitWalls(List<Wall> walls){for(int i=0;i<walls.size();i++){if(tankHitWall(walls.get(i))){return true;}}return false;}

这样在TankClient 中每个坦克都调用tankHitWall和tankHitWalls方法即可进行测试,发现是可以完成其功能的。

到这里位置基本上功能就差不多完成了。由于时间的关系,和教研室项目的原因,不能花太多时间鼓捣自己的东西。这个小游戏就到此结束了!

整个游戏的代码可以在这里提取:https://github.com/wojiushimogui/Tank_2.3

待完成的功能

以后继续完善的地方有:

1、为我方坦克加入生命值

2、加入血块

3、加入超级技能,例如:连发,大炮弹等。

《Java小游戏实现》:坦克大战(续四)相关推荐

  1. 微信小游戏制作坦克大战(四)添加敌方坦克,敌方坦克可以随机移动

    微信小游戏制作坦克大战(四)添加敌方坦克,敌方坦克可以随机移动 首先导入敌方坦克素材 重命名为敌方坦克1 敌方坦克也移动到屏幕外面,后面使用克隆体来显示. 我们给敌方坦克添加事件 好的,现在敌方坦克已 ...

  2. 使用jquery—Canvas实现html5小游戏——《坦克大战》

    目录 1.项目背景 2.项目展示 3.设计思路 3.1.坦克移动 3.2.坦克开火 3.3.击中坦克 4.实现代码 5.总结 1.项目背景 2021年春节期间在家无聊,正好又学过一些前端的知识,因此就 ...

  3. 微信小游戏制作坦克大战(六)碰撞检测,主角坦克碰到敌方坦克、炮弹爆炸

    微信小游戏制作坦克大战(六)碰撞检测,主角坦克碰到敌方坦克.炮弹爆炸 导入坦克爆炸效果的图片和声音素材 给主角坦克添加事件 给爆炸动画添加事件 当主角坦克碰到敌方坦克或者炮弹时显示爆炸效果 下一篇文章 ...

  4. java小游戏:五子棋人机大战

    一.java小游戏:五子棋人机大战 1.绘制窗口 package wuziqi;import javax.swing.*; import java.awt.event.MouseAdapter; im ...

  5. 微信小游戏制作坦克大战(五)敌方坦克可以发射炮弹

    微信小游戏制作坦克大战(五)敌方坦克可以发射炮弹 在资源管理器中复制炮弹,重命名为敌人坦克的炮弹. 修改敌方坦克的积木 给敌方坦克炮弹添加事件 现在,敌方坦克已经可以自动发射炮弹啦. 下一篇文章:微信 ...

  6. 微信小游戏制作坦克大战(九)切换场景,游戏重新开始

    微信小游戏制作坦克大战(九)切换场景,游戏重新开始 新建一个游戏结束场景 主角坦克爆炸后切换到游戏结束场景 添加背景音乐 好了,至此坦克大战小游戏基本做好,小伙伴们可以继续完善哈. 体验地址:

  7. 微信小游戏制作坦克大战(八)统计得分

    微信小游戏制作坦克大战(八)统计得分 导入数字图片素材 新建得分变量 给数字添加事件 敌方坦克发生爆炸时,数字增加1 实现效果 下一篇文章:微信小游戏制作坦克大战(九)切换场景,游戏重新开始

  8. 微信小游戏制作坦克大战(七)碰撞检测,敌方坦克碰到主角坦克炮弹爆炸

    微信小游戏制作坦克大战(七)碰撞检测,敌方坦克碰到主角坦克炮弹爆炸 导入发生炮弹的音效素材 主角坦克发射炮弹或者敌方坦克发射炮弹时播放音效 修改敌方坦克积木 4.效果: 敌方坦克碰到主角坦克炮弹爆炸 ...

  9. JAVA小游戏之飞机大战(超详细)

    前言:在一定的java基础上就可以进行飞机大战小游戏的编写了.整个小游戏主要涉及到的基础知识为:类与对象,鼠标事件监听,线程.重绘等. 整体思路框架 设计一个初始界面,在开始后出现自己的战机和敌机且自 ...

最新文章

  1. solidworks重建模型好慢_兄弟只能帮你到这了,SOLIDWORKS卡顿或许秘密就在这些选项里...
  2. bzoj 1191 [HNOI2006]超级英雄Hero
  3. Python之包管理工具
  4. Linux: Nginx 安装
  5. 【Qt教程】1.10 - Qt5模态与非模态对话框( QDialog)
  6. android 地图定位报错,百度地图定位迷之报错(latitude : 4.9E-324 lontitude : 4.9E-324)
  7. PHP数组的使用方法小结
  8. linux ip命令dhcp,嵌入式linux通过DHCP自动获取IP地址实现获取
  9. Eclipse如何重置窗口
  10. 如何下载股票历史数据?
  11. matlab 数字全息图,基于MATLAB的数字全息成像仿真研究
  12. ADS系列之SIPI仿真笔记:ADS多种版本的安装、卸载重装(一)
  13. 树莓派搭建DLNA客户端,使用gmediarender,DLAN render。
  14. android实战:密码箱三
  15. 多彩三角活动策划方案PPT模板
  16. 访问win7默认共享
  17. trove 配置文件
  18. 6.1 手机时钟系统简介
  19. 前端vue视频vue-video-player插件总结知识点案例(带源码)
  20. python莫比乌斯内接矩形_用莫比乌斯带巧解内接矩形问题:拓扑学的用处

热门文章

  1. mitmproxy抓包 (window + 手机)配置注意问题(博主亲身才坑经历)
  2. HTML元素的显示和隐藏
  3. 【Windows】Antimalware Service Executable cpu占用过高
  4. 随机采样和随机模拟:吉布斯采样Gibbs Sampling实现高斯分布参数推断
  5. 实用推荐:PDF阅读器及处理器集合//总有一款满足你
  6. stm32编码器电机测速(hal库)
  7. Unity3D 之 坦克大战(一)
  8. shader实现的“地表最强护盾”,没有之一
  9. vue-cli3.0实现播放rtmp直播流
  10. Python使用异或对文件加密