子弹的发射

实现思路

  1、获取tank的宽高

  2、根据tank的方向更换子弹的图片

  3、获取每个方向子弹图片的宽高

  4、计算出子弹的坐标

  5、为子弹加速

代码实现:

   1、定义Element类,属性有坐标、宽高和图片路径,方法有draw()方法和getSize()方法

 1 package Itheima.bean;
 2
 3 import java.io.IOException;
 4
 5 import org.itheima.game.utils.DrawUtils;
 6
 7 public class Element {
 8     int x; //x坐标
 9     int y;    //y坐标
10     int width;    //宽度
11     int height;    //高度
12     String imagePath;    //图片路径
13     public void draw() {
14         try {
15             DrawUtils.draw(imagePath, x, y);
16         } catch (IOException e) {
17             // TODO 自动生成的 catch 块
18             e.printStackTrace();
19         }
20     }
21     public void getSize(){    //获取图片宽高
22         try {
23             int[] size = DrawUtils.getSize(imagePath);
24             this.width=size[0];
25             this.height=size[1];
26         } catch (IOException e) {
27             // TODO 自动生成的 catch 块
28             e.printStackTrace();
29         }
30     }
31 }

Element

   2、让Tank类和Bullet类继承Element类

  

 1 package Itheima;
 2
 3 import java.util.List;
 4 import java.util.concurrent.CopyOnWriteArrayList;
 5
 6 import org.itheima.game.Window;
 7 import org.lwjgl.input.Keyboard;
 8
 9 import Itheima.bean.Bullet;
10 import Itheima.bean.Direction;
11 import Itheima.bean.Element;
12 import Itheima.bean.Tank;
13
14 public class TankWorld extends Window {
15     Tank tank;
16     List<Element> list;
17
18     public TankWorld(String title, int width, int height, int fps) {
19         super(title, width, height, fps);
20         // TODO 自动生成的构造函数存根
21     }
22
23     @Override
24     protected void onCreate() {
25         list = new CopyOnWriteArrayList<>();
26         tank = new Tank(0, 0);
27         list.add(tank);
28     }
29
30     @Override
31     protected void onMouseEvent(int key, int x, int y) {
32         // TODO 自动生成的方法存根
33
34     }
35
36     @Override
37     protected void onKeyEvent(int key) {
38         switch (key) {
39         case Keyboard.KEY_UP:
40             tank.move(Direction.UP);
41             break;
42
43         case Keyboard.KEY_DOWN:
44             tank.move(Direction.DOWN);
45             break;
46         case Keyboard.KEY_LEFT:
47             tank.move(Direction.LEFT);
48             break;
49         case Keyboard.KEY_RIGHT:
50             tank.move(Direction.RIGHT);
51             break;
52         case Keyboard.KEY_SPACE:
53             Bullet bullet = tank.fire();
54             list.add(bullet);
55             break;
56         }
57     }
58
59     @Override
60     protected void onDisplayUpdate() {
61         for (Element e : list) {
62             e.draw();
63         }
64     }
65
66 }

设置类

 1 package Itheima.bean;
 2
 3 import Itheima.Constants;
 4
 5 public class Tank extends Element {
 6     private int speed = 32;    //移动速度
 7     Direction dir = Direction.UP;    //方向默认向上
 8     public Tank(int x, int y) {    //构造方法
 9         this.x = x;
10         this.y = y;
11         this.imagePath = "res/img/tank_u.gif";
12         getSize();    //获取tank宽高
13     }
14
15     public void move(Direction dir) {
16         if(dir!=this.dir){    //传入的方向不等于当前方向
17             this.dir=dir;    //当前方向等于传入的方向
18             switch (dir) { //只更换方向不做移动
19             case UP:
20                 this.imagePath = "res/img/tank_u.gif";
21                 break;
22
23             case DOWN:
24                 this.imagePath = "res/img/tank_d.gif";
25                 break;
26             case LEFT:
27                 this.imagePath = "res/img/tank_l.gif";
28                 break;
29             case RIGHT:
30                 this.imagePath = "res/img/tank_r.gif";
31                 break;
32             }
33         }
34         switch (dir) {    //如果当前方向等于传入的方向
35         case UP:
36             y -= speed;
37             break;
38
39         case DOWN:
40             y += speed;
41             break;
42         case LEFT:
43             x -= speed;
44             break;
45         case RIGHT:
46             x += speed;
47             break;
48         }
49         //越界处理
50         if(x<0){
51             x=0;
52         }
53         if(x>Constants.WIDTH-this.width){
54             x=Constants.WIDTH-this.width;
55         }
56         if(y<0){
57             y=0;
58         }
59         if(y>Constants.HEIGHT-this.height){
60             y=Constants.HEIGHT-this.height;
61         }
62     }
63
64     public Bullet fire() {
65         Bullet b = new Bullet(this);    //根据tank坐标生成子弹
66         return b;
67     }
68 }

Tank

 1 package Itheima.bean;
 2
 3 import java.io.IOException;
 4
 5 import org.itheima.game.utils.DrawUtils;
 6
 7 public class Bullet extends Element {
 8     Direction dir;
 9     private int speed = 32;    //子弹速度
10     public Bullet(Tank tank) {
11         int x1 = tank.x;
12         int y1 = tank.y;
13         int w1 = tank.width;
14         int h1 = tank.height;
15         this.dir = tank.dir;
16         switch (dir) {    //根据tank的方向计算子弹坐标
17         case UP:
18             this.imagePath = "res/img/bullet_u.gif";
19             getSize();
20             this.x = x1 + (w1 - this.width) / 2;
21             this.y = y1 - this.height;
22             break;
23
24         case DOWN:
25             this.imagePath = "res/img/bullet_d.gif";
26             getSize();
27             this.x = x1 + (w1 - this.width) / 2;
28             this.y = y1 + w1;
29             break;
30         case LEFT:
31             this.imagePath = "res/img/bullet_l.gif";
32             getSize();
33             this.x = x1 - this.width;
34             this.y = y1 + (h1 - this.height) / 2;
35             break;
36         case RIGHT:
37             this.imagePath = "res/img/bullet_r.gif";
38             getSize();
39             this.x = x1 + w1;
40             this.y = y1 + (h1 - this.height) / 2;
41             break;
42         }
43     }
44
45     public void draw() {    //重写draw方法
46         try {
47             DrawUtils.draw(imagePath, x, y);
48         } catch (IOException e) {
49             // TODO 自动生成的 catch 块
50             e.printStackTrace();
51         }
52         switch (dir) {
53         case UP:
54             y -= speed;
55             break;
56
57         case DOWN:
58             y += speed;
59             break;
60         case LEFT:
61             x -= speed;
62             break;
63         case RIGHT:
64             x += speed;
65             break;
66         }
67     }
68 }

Bullet

随笔说:

        本节实现了子弹对象的创建、坐标的计算、移动效果。体会到继承的好处,

      以及游戏实现原理。

时间: 2024-08-05 11:13:02

子弹的发射的相关文章

Cocos2d-x《雷电大战》(3)-子弹无限发射

林炳文Evankaka原创作品.转载请注明出处http://blog.csdn.net/evankaka 本文要实现雷电游戏中,游戏一開始,英雄飞机就无限发射子弹的功能. 这里的思想是单独给子弹弄一个层.在这个层不设置一个定时器,每隔一个时间,依据当前英雄飞机传入的位置,生成子弹,并设置子弹的移动事件,和移动后的事件(就是把子弹删除掉,节省内存). 终于效果: Cocos2d-x版本号:3.4 project环境:VS30213 一.英雄子弹层 1.HeroBulletLayer.h /** *

Fire Balls 05——坦克和子弹的制作以及炮台发射子弹

版权申明: 本文原创首发于以下网站: 博客园『优梦创客』的空间:https://www.cnblogs.com/raymondking123 优梦创客的官方博客:https://91make.top 优梦创客的游戏讲堂:https://91make.ke.qq.com 『优梦创客』的微信公众号:umaketop 您可以自由转载,但必须加入完整的版权声明 目标: 坦克和子弹预制体的制作 脚本编写子弹的发射 坦克和子弹预制体的制作 首先我们先新建一个空的GameObject重命名为Tank然后在其子

用Quick3.3开发微信打飞机 (二) -------------------- 子弹和敌人的配置和创建

用Quick3.3简单开发微信打飞机02 [plain] view plaincopyprint? 这次将实现子弹的配置文件,敌人的配置文件,子弹的精灵和敌人的精灵.以及子弹的发射和敌人的产生. 子弹的分析: 游戏中不可能只有一种子弹,这样子弹就需要一个配置文件,配置文件中有子弹的类型,子弹的贴图,子弹的生命以及子弹的移动速度. 敌人的分析: 同样,游戏中会出现多种敌人,所以,也需要一个敌人的配置文件,其中包括敌人的类型,贴图,速度,生命等属性. 在这里新建了一个目录(data)来存放配置文件.

Cocos2d-x《雷电大战》(4)-策略模式实现不同子弹切换!!

林炳文Evankaka原创作品.转载请注明出处http://blog.csdn.net/evankaka 本文从设计模式中的策略模式入手,主讲了飞机大战中英雄飞机切换不同的子弹.这里分为三种子弹.第一种:每次发一个子弹,垂直发射;第二种:每次发两个子弹,两个都是垂直发射:第三种;每次发三个子弹,两边的子弹有一定的角度,而中间的子弹垂直发射;设计模式是游戏开发经常用到的思想,建议有兴趣的同学可以好好研究下!好了,下面开始吧. 效果如下: Cocos2d-x版本:3.4 工程环境:VS30213 一

unity3d太空射击游戏----------《图形程序设计》课程设计说明书

广西科技大学 <图形程序设计>课程设计说明书             学生姓名:           江玉珍                  .    学    号:           201400404005           .         专    业:         数字媒体技术专业          . 班    级:            数媒141班             .    指导老师:              黄钟源               .    

Unity3D中对象池的实现

在Unity中常常会遇到需要重复创建,销毁某些物体的情况,比如fps类游戏中的子弹,rpg类游戏中的小怪等等,如果直接使用Instantiate和Destroy的话,会浪费系统的资源,而使用对象池则能够节省下这些浪费. 这里使用一个重复利用子弹的进行发射的简单场景来演示对象池. 首先需要一个在场景中创建一个Cube,充当子弹. 然后在Assets目录下创建Resources文件夹,在Cube上添加上刚体,取消重力后,将Cube拖入Resources文件夹内作为一个预设,在场景中删除这个Cube.

基于FPGA的飞机的小游戏

基于FPGA的飞机的小游戏 实验原理 ????该实验主要分为4个模块,采用至上而下的设计方法进行设计.由50M的晶振电路提供时钟源,VGA显示控制模块.图形显示控制模块.移动模块的时钟为25M,由时钟分频电路产生获得.时钟分频模块采用PLL进行设计,由50M时钟进行2分频获得25M时钟. ????移动模块,控制我方飞机和敌方飞机.子弹的移动,移动的速度可以通过时钟的频率进行控制,操作我方飞机的移动和子弹的发射由外部按键进行控制,控制的方式有发射子弹.左移.右移. ????图像显示控制模块,用于控

OC基础--对象做参数在方法间传递

剧情描述: 美国大兵抗把汉阳造 拿着5个弹夹(每个弹夹5发子弹) 带着弟兄们干架 子弹打完了就求救 类: 士兵: 属性: 姓名(_name) 身高(_height) 体重(_weight) 行为: 开枪(fire) 求救(callForHelp) 枪: 属性: 弹夹(_clip) 弹夹数量(_clipNum) 品牌(_model) 行为: 换弹夹(changeClip) 发射子弹(shot) 弹夹: 属性: 子弹数量(_bulletCount) 行为: 装子弹(addBullet) 方法说明:

阿里安全称发现安卓WiFi漏洞:黑客可远程攻击

近日,阿里安全研究实验室发现了安卓系统的一个重大漏洞,主要影响安卓WiFi功能组件wpa_supplicant.通过该漏洞,黑客可对开启了WiFi的安卓手机发动远程攻击,甚至可窃取手机内的照片.通讯录等重要信息,因此该漏洞被称为 “WiFi杀手”.据悉,谷歌在接到阿里安全提交的漏洞细节后,及时告知了安卓系统wpa_supplicant组件的开发厂商.今日凌晨,该组件开发者公告称漏洞已修复.阿里安全研究实验室建议受影响的安卓用户尽快安装更新补丁. 阿里安全发现安卓WiFi漏洞 黑客可远程攻击 安卓