《Java小游戏实现》:坦克大战(续四)
《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 敌方坦克也移动到屏幕外面,后面使用克隆体来显示. 我们给敌方坦克添加事件 好的,现在敌方坦克已 ...
- 使用jquery—Canvas实现html5小游戏——《坦克大战》
目录 1.项目背景 2.项目展示 3.设计思路 3.1.坦克移动 3.2.坦克开火 3.3.击中坦克 4.实现代码 5.总结 1.项目背景 2021年春节期间在家无聊,正好又学过一些前端的知识,因此就 ...
- 微信小游戏制作坦克大战(六)碰撞检测,主角坦克碰到敌方坦克、炮弹爆炸
微信小游戏制作坦克大战(六)碰撞检测,主角坦克碰到敌方坦克.炮弹爆炸 导入坦克爆炸效果的图片和声音素材 给主角坦克添加事件 给爆炸动画添加事件 当主角坦克碰到敌方坦克或者炮弹时显示爆炸效果 下一篇文章 ...
- java小游戏:五子棋人机大战
一.java小游戏:五子棋人机大战 1.绘制窗口 package wuziqi;import javax.swing.*; import java.awt.event.MouseAdapter; im ...
- 微信小游戏制作坦克大战(五)敌方坦克可以发射炮弹
微信小游戏制作坦克大战(五)敌方坦克可以发射炮弹 在资源管理器中复制炮弹,重命名为敌人坦克的炮弹. 修改敌方坦克的积木 给敌方坦克炮弹添加事件 现在,敌方坦克已经可以自动发射炮弹啦. 下一篇文章:微信 ...
- 微信小游戏制作坦克大战(九)切换场景,游戏重新开始
微信小游戏制作坦克大战(九)切换场景,游戏重新开始 新建一个游戏结束场景 主角坦克爆炸后切换到游戏结束场景 添加背景音乐 好了,至此坦克大战小游戏基本做好,小伙伴们可以继续完善哈. 体验地址:
- 微信小游戏制作坦克大战(八)统计得分
微信小游戏制作坦克大战(八)统计得分 导入数字图片素材 新建得分变量 给数字添加事件 敌方坦克发生爆炸时,数字增加1 实现效果 下一篇文章:微信小游戏制作坦克大战(九)切换场景,游戏重新开始
- 微信小游戏制作坦克大战(七)碰撞检测,敌方坦克碰到主角坦克炮弹爆炸
微信小游戏制作坦克大战(七)碰撞检测,敌方坦克碰到主角坦克炮弹爆炸 导入发生炮弹的音效素材 主角坦克发射炮弹或者敌方坦克发射炮弹时播放音效 修改敌方坦克积木 4.效果: 敌方坦克碰到主角坦克炮弹爆炸 ...
- JAVA小游戏之飞机大战(超详细)
前言:在一定的java基础上就可以进行飞机大战小游戏的编写了.整个小游戏主要涉及到的基础知识为:类与对象,鼠标事件监听,线程.重绘等. 整体思路框架 设计一个初始界面,在开始后出现自己的战机和敌机且自 ...
最新文章
- solidworks重建模型好慢_兄弟只能帮你到这了,SOLIDWORKS卡顿或许秘密就在这些选项里...
- bzoj 1191 [HNOI2006]超级英雄Hero
- Python之包管理工具
- Linux: Nginx 安装
- 【Qt教程】1.10 - Qt5模态与非模态对话框( QDialog)
- android 地图定位报错,百度地图定位迷之报错(latitude : 4.9E-324 lontitude : 4.9E-324)
- PHP数组的使用方法小结
- linux ip命令dhcp,嵌入式linux通过DHCP自动获取IP地址实现获取
- Eclipse如何重置窗口
- 如何下载股票历史数据?
- matlab 数字全息图,基于MATLAB的数字全息成像仿真研究
- ADS系列之SIPI仿真笔记:ADS多种版本的安装、卸载重装(一)
- 树莓派搭建DLNA客户端,使用gmediarender,DLAN render。
- android实战:密码箱三
- 多彩三角活动策划方案PPT模板
- 访问win7默认共享
- trove 配置文件
- 6.1 手机时钟系统简介
- 前端vue视频vue-video-player插件总结知识点案例(带源码)
- python莫比乌斯内接矩形_用莫比乌斯带巧解内接矩形问题:拓扑学的用处
热门文章
- mitmproxy抓包 (window + 手机)配置注意问题(博主亲身才坑经历)
- HTML元素的显示和隐藏
- 【Windows】Antimalware Service Executable cpu占用过高
- 随机采样和随机模拟:吉布斯采样Gibbs Sampling实现高斯分布参数推断
- 实用推荐:PDF阅读器及处理器集合//总有一款满足你
- stm32编码器电机测速(hal库)
- Unity3D 之 坦克大战(一)
- shader实现的“地表最强护盾”,没有之一
- vue-cli3.0实现播放rtmp直播流
- Python使用异或对文件加密