简介

Egret实战开发,记录每天的学习进度,欢迎和我一起学习交流~

目录

  • 简介
  • 实现目标
  • 一、实现子弹类
  • 二.工厂设计模式
  • 三.子弹管理类ZDManager

实现目标

今天是开发飞行射击游戏第二天,工厂实现子弹体系。欢迎大家和我一起学习哦~ 下面是详细过程代码,还有遇到的错误以及改正方法。

飞行射击 工厂实现子弹体系

一、实现子弹类

子弹放在Maingame,就需要在子弹类中存放Maingame对象

1public game:MainGame;
2public constructor(game:MainGame) {3super();
4
5this.game = game;
6}
7}

移动速度原理:

n:角度
向上是正方向,向右顺时针旋转n角度 (子弹向上)
知道角度n 就可以用对边和斜边求V
VX = V * sin n
Vy = -V * cos n
为什么是-y: 因为向上走为 -

//sin用的是弧度制 n是角度制,所以 n* Math.PI / 180 转换为弧度制。

1this.vx = v * Math.sin(n * Math.PI / 180);
2this.vy= -v * Math.cos(n * Math.PI / 180);
若 需要用到任意角度移动,给出指定速度和角度,他的横向距离,横向速度,纵向速度。就是上面代码
前提 :图片竖直向上,正方向是顺时针方向、

出现这种情况 肯定是代码出错,但不是编译错误,是代码的逻辑错误,
①空指针:使用了没有构造的对象
②反复移除了同一界面
一般情况下,什么都看不到,肯定是构造出现问题,而构造初的问题,往往会空指针

这里的构造zd使用this.player.x,然而player没有构造,不存在,就使用它的坐标,所以报错
图片叠加顺序跟构造没关系,addChild()才跟图片叠加有关系
所以先全部构造,再全部添加

1this.bg = new BG(this);
2this.player = new Player(this);
3//              x,y, 速度,角度
4this.zd = new ZD(this.player.x,this.player.y, 20 ,30,this);
5
6this.addChild(this.bg);
7this.addChild(this.zd);
8this.addChild(this.player);

子弹体系:
首先子弹数量很多,子弹数量可变,发射就有,不发射就没有。这时候就得用工厂设计模式

二.工厂设计模式

用来解决个数可变的大量对象的生成和管理。在游戏中会大量使用工厂。

核心:create 方法

只要执行工厂的create,就会生成对象,对象会被放在工厂的仓库里管理。
不断的执行工厂create,工厂会有一个仓库,生产一个会放到仓库里,循环,但是在仓库里的产品,当满足一定条件时,会对仓库内的对象进行移除。

若用工厂管理对象,这个对象就必须有一个属性:
visible( vis)属性: boolean类型代表是否还能在工厂存放。
只要vis == false。这个对象就要移除,来保证仓库不会满。
vis == true 可以存放。

所有被工厂管理的对象都必须有离开工厂的条件,就是对象在什么情况下不需要再存在了。
比如子弹超出屏幕就不存在了。

ZD类申请public vis:boolean; //是否生存
构造:this.vis = true;
更新:
//子弹超出屏幕,子弹消失
//被工厂管理的对象一定要有销毁条件。
子弹类update()方法

if(this.x < -100 || this.x > 580 || this.y < -100 || this.y > 900)
this.vis = false;

三.子弹管理类ZDManager

实现工厂就需要有一个管理子弹的对象。子弹管理者类。以后管理某个对象都需要一个管理者类
子弹管理者也要构建在game里,需要上一级的指针。
仓库是有关子弹的数组
申请:public zm:Array; //Array动态数组(容器),通过添加,添加对象,移除对象。
public game:MainGame;
构造:this.game = game;
this.zm = new Array();

增加生产对象的方法
//每create一次就new一个,仓库对象也越多,子弹也就越多

1public create(x:number,y:number,v:number,n:number,game:MainGame){2        //生成子弹
3        let one = new ZD(x,y,v,n,game);
4        //添加到世界
5        this.addChild(one);
6        //放到仓库数组最后
7        this.zm.push(one);
8        //
9    }

更新方法
//更新所有子弹,找到每一颗子弹,每颗更新

 1public update(){2    //整个仓库长度 ,利用循环可以循环出所有子弹3    for(let i = 0 ; i < this.zm.length ; i++){4        //找到每颗子弹5        let one = this.zm[i];6        one.update();7        //若子弹太多,仓库会满,所以子弹需要移除8        //子弹出屏,vis == false。移除9        if(one.vis == false){10            //先从场景移除
11            this.removeChild(one);
12            //仓库移除
13            this.zm.splice(i ,1);
14            //移除一个对象,长度-1
15            i--;
16        }
17    }
18}

比如现在0,1,2,3 ,4,5更新到3,发现3已经移除,执行移除方法,3消失,4跑到3的位置。5跑到4的位置再更新的时候,需要重新更新3,所以移除完 需要 i --;

此时在Maingame中把zd改为 public zm:ZDManager; //多个子弹

Maingame中的更新方法public update()

 1     public update()2    {3       this.bg.update();4       this.player.update();5       this.zm.update();6       //时间间隔7       this.t++;8       if(this.t >= 4){9           //调用create才会生成一颗子弹
10           //这里加了2条弹道,一共5条弹道,更有视觉效果
11            this.zm.create(this.player.x,this.player.y,20,0, this );
12            this.zm.create(this.player.x,this.player.y,20,-15, this );
13            this.zm.create(this.player.x,this.player.y,20,-30, this );
14            this.zm.create(this.player.x ,this.player.y,20,15, this );
15            this.zm.create(this.player.x,this.player.y,20,30, this );
16            this.t = 0;
17       }
18    }

至此,第二天的开发笔记已经完成,学习需要坚持,坚持到最后一定会有结果,每天写下笔记来记录自己的学习内容, 以后有需要也可以查看,大家可以一起学习。

想要我一起学习的可以关注我的公众号 知言不尽 找到我,交流学习,获取图片素材和源代码。

Egret实战开发笔记,飞行射击游戏(二)相关推荐

  1. Egret实战开发笔记,飞行射击游戏(六)

    今天是开发飞行射击游戏第五天,玩家多类型子弹及状态和关卡模式. 简介 实现玩家特殊子弹,激光,追踪导弹. 玩家多状态 下方飞出 正常游戏 胜利等待 胜利飞出 以及 玩家保护 和 关卡切换 实现效果 本 ...

  2. html5 画飞机,飞行射击游戏像素画开发教程:怎么画飞机?

    作者:Slynyrd 编译 | 三二 (转载请注明出处) 关注网易号:教你画像素画 想开发一个飞行射击游戏,怎么画飞机呢?飞行射击游戏大多有历史背景,我们选择德国在第一次世界大战中投入的飞机Fokke ...

  3. Android游戏开发之飞行射击类游戏原理实现(二十)

    Android游戏开发之飞行射击类游戏原理实现 雨松MOMO原创文章如转载,请注明:转载至我的独立域名博客雨松MOMO程序研究院,原文地址:http://www.xuanyusong.com/arch ...

  4. [air for ios] 三小时开发一个iOS飞行射击游戏

    [air for ios] 三小时开发一个iOS飞行射击游戏 http://www.badyoo.com/index.php/2012/07/04/158/index.html 2012-07-04 ...

  5. 手把手教你开发一款IOS飞行射击游戏(完)

    下面我们开始最后一篇文章,完成我们的飞行射击游戏. 有了前面的基础,相信现在你对Cocos2d的基本元素和编写技巧有了一定的了解,这回我们要接触的是场景切换,我们这回只列出部分代码,说明原理,给读者一 ...

  6. 用javascript实现的纵版飞行射击游戏—《天机》

    花了一个半月的时间用javascript完成了这款web版飞行射击游戏,游戏效果接近一般的客户端游戏,不过对机器的要求稍微高点点,主要是CPU,最好在1.5GHZ以上,不然可能会比较卡,支持IE.FF ...

  7. 飞行射击游戏的C++实现:一次课程作业

    目录 目录 程序简介 程序亮点 程序结构 逻辑层fsObjecth 自定义数据类型 fsPoint Class 一些枚举类型 异常类型 fsInvalidInitializePointValExcep ...

  8. 太空射击unity工程素材文件 飞机大战 飞行射击游戏源码(C#,Unity2019.2.4f1)素材+源码 最新写的,demo简单版本

    飞机大战素材 太空大战unity工程文件 飞行射击游戏源码(C#,Unity2019.2.4f1)素材+源码 最新写的,demo简单版本 希望能对初学者提供帮助,代码根据教材以及out了的代码更新了, ...

  9. Android事件分发机制在实战开发中的应用之二

    学习的最终目标就是要学以致用,本文所分享的案例都是自己在公司实战开发过程中的真实案例,现在把它分享出来,希望对初学者有所帮助 版权声明:本文来自门心叼龙的博客,属于原创内容,转载请注明出处:https ...

最新文章

  1. jira mysql 启动 失败_重启机器导致mysql启动失败
  2. 数据中心机房环境温度与微模块机柜有什么关系?
  3. Visual Studio 2010旗舰版在安装Windows Phone 7 SDK后项目模版里没有Windows Phone 项目解决办法...
  4. 新手上路必学的Python函数基础知识,全在这里了(多段代码举例)
  5. 使用dig或nslookup指定dns服务器查询域名解析
  6. java接口_Java接口
  7. Java课程设计【学生信息管理系统】
  8. 进入Python的多彩世界
  9. java保留小数点后两位_JAVA中小数点后保留两位的方法有哪些
  10. 天涯怎么引流到qq?天涯社区如何靠发帖子引流?
  11. html 图片滑动验证码,html+jQuery实现拖动滑块图片拼图验证码插件【移动端适用】...
  12. 获取邮箱验证码倒计时+PHP发送QQ邮件(未全)
  13. 5款免费的项目管理软件(推荐收藏)
  14. 武汉理工计算机网络教学平台,武汉理工大学 操作系统
  15. P3P求解相机姿态原理介绍
  16. JVM —— Java 对象占用空间大小计算
  17. 无数据蒸馏方向文献_1
  18. r语言C指数的置信区间,R语言求95%置信区间
  19. RationalRose安装说明文档
  20. 学习笔记(13):英特尔®OpenVINO™工具套件中级课程-推理引擎详解内部API

热门文章

  1. Redis分布式锁Redisson
  2. 同为科技(TOWE)新国标16A三孔+10A五孔桌面PDU插排插座
  3. 特殊符号用英语怎么说
  4. HCL安装方法,优化调节版。
  5. 12. 机器人的运动范围
  6. DOM操作Select下拉框
  7. 一句话木马是如何被执行的?
  8. 你想QQ挂机挂到老死吗?
  9. 计算机网络:网段划分
  10. Vue 3最新力作 Vue.js 3企业级应用开发实战