簡介
Egret實(shí)戰(zhàn)開發(fā),記錄每天的學(xué)習(xí)進(jìn)度环础,歡迎和我一起學(xué)習(xí)交流~
實(shí)現(xiàn)目標(biāo)
今天是開發(fā)飛行射擊游戲第二天,工廠實(shí)現(xiàn)子彈體系饮亏。歡迎大家和我一起學(xué)習(xí)哦~ 下面是詳細(xì)過程代碼忆首,還有遇到的錯(cuò)誤以及改正方法。
飛行射擊 工廠實(shí)現(xiàn)子彈體系
1.實(shí)現(xiàn)子彈類
子彈放在Maingame掉冶,就需要在子彈類中存放Maingame對象
public game:MainGame;
public constructor(game:MainGame) {
super();
this.game = game;
}
}
移動(dòng)速度原理:
n:角度
向上是正方向,向右順時(shí)針旋轉(zhuǎn)n角度 (子彈向上)
知道角度n 就可以用對邊和斜邊求V
VX = V * sin n
Vy = -V * cos n
為什么是-y: 因?yàn)橄蛏献邽?-
//sin用的是弧度制 n是角度制真竖,所以 n* Math.PI / 180 轉(zhuǎn)換為弧度制。
this.vx = v * Math.sin(n * Math.PI / 180);
this.vy= -v * Math.cos(n * Math.PI / 180);
若 需要用到任意角度移動(dòng)厌小,給出指定速度和角度恢共,他的橫向距離,橫向速度璧亚,縱向速度讨韭。就是上面代碼
前提 :圖片豎直向上,正方向是順時(shí)針方向癣蟋、
出現(xiàn)這種情況 肯定是代碼出錯(cuò)透硝,但不是編譯錯(cuò)誤,是代碼的邏輯錯(cuò)誤疯搅,
①空指針:使用了沒有構(gòu)造的對象
②反復(fù)移除了同一界面
一般情況下蹬铺,什么都看不到,肯定是構(gòu)造出現(xiàn)問題秉撇,而構(gòu)造初的問題甜攀,往往會(huì)空指針
這里的構(gòu)造zd使用this.player.x,然而player沒有構(gòu)造琐馆,不存在规阀,就使用它的坐標(biāo),所以報(bào)錯(cuò)
圖片疊加順序跟構(gòu)造沒關(guān)系瘦麸,addChild()才跟圖片疊加有關(guān)系
所以先全部構(gòu)造谁撼,再全部添加
this.bg = new BG(this);
this.player = new Player(this);
// x,y, 速度,角度
this.zd = new ZD(this.player.x,this.player.y, 20 ,30,this);
this.addChild(this.bg);
this.addChild(this.zd);
this.addChild(this.player);
子彈體系:
首先子彈數(shù)量很多,子彈數(shù)量可變厉碟,發(fā)射就有喊巍,不發(fā)射就沒有。這時(shí)候就得用工廠設(shè)計(jì)模式
二.工廠設(shè)計(jì)模式
用來解決個(gè)數(shù)可變的大量對象的生成和管理箍鼓。在游戲中會(huì)大量使用工廠崭参。
核心:create 方法
只要執(zhí)行工廠的create,就會(huì)生成對象款咖,對象會(huì)被放在工廠的倉庫里管理何暮。
不斷的執(zhí)行工廠create,工廠會(huì)有一個(gè)倉庫铐殃,生產(chǎn)一個(gè)會(huì)放到倉庫里海洼,循環(huán),但是在倉庫里的產(chǎn)品富腊,當(dāng)滿足一定條件時(shí)坏逢,會(huì)對倉庫內(nèi)的對象進(jìn)行移除。
若用工廠管理對象赘被,這個(gè)對象就必須有一個(gè)屬性:
visible( vis)屬性: boolean類型代表是否還能在工廠存放是整。
只要vis == false。這個(gè)對象就要移除帘腹,來保證倉庫不會(huì)滿。
vis == true 可以存放许饿。
所有被工廠管理的對象都必須有離開工廠的條件阳欲,就是對象在什么情況下不需要再存在了。
比如子彈超出屏幕就不存在了陋率。
ZD類申請public vis:boolean; //是否生存
構(gòu)造:this.vis = true;
更新:
//子彈超出屏幕球化,子彈消失
//被工廠管理的對象一定要有銷毀條件。
子彈類update()方法
if(this.x < -100 || this.x > 580 || this.y < -100 || this.y > 900)
this.vis = false;
三.子彈管理類ZDManager
實(shí)現(xiàn)工廠就需要有一個(gè)管理子彈的對象瓦糟。子彈管理者類筒愚。以后管理某個(gè)對象都需要一個(gè)管理者類
子彈管理者也要構(gòu)建在game里,需要上一級(jí)的指針菩浙。
倉庫是有關(guān)子彈的數(shù)組
申請:public zm:Array<ZD>; //Array動(dòng)態(tài)數(shù)組(容器)巢掺,通過添加,添加對象劲蜻,移除對象陆淀。
public game:MainGame;
構(gòu)造:this.game = game;
this.zm = new Array();
增加生產(chǎn)對象的方法
//每create一次就new一個(gè),倉庫對象也越多,子彈也就越多
public create(x:number,y:number,v:number,n:number,game:MainGame){
//生成子彈
let one = new ZD(x,y,v,n,game);
//添加到世界
this.addChild(one);
//放到倉庫數(shù)組最后
this.zm.push(one);
//
}
更新方法
//更新所有子彈先嬉,找到每一顆子彈轧苫,每顆更新
public update(){
//整個(gè)倉庫長度 ,利用循環(huán)可以循環(huán)出所有子彈
for(let i = 0 ; i < this.zm.length ; i++){
//找到每顆子彈
let one = this.zm[i];
one.update();
//若子彈太多疫蔓,倉庫會(huì)滿含懊,所以子彈需要移除
//子彈出屏身冬,vis == false。移除
if(one.vis == false){
//先從場景移除
this.removeChild(one);
//倉庫移除
this.zm.splice(i ,1);
//移除一個(gè)對象岔乔,長度-1
i--;
}
}
}
比如現(xiàn)在0酥筝,1,2重罪,3 樱哼,4,5更新到3剿配,發(fā)現(xiàn)3已經(jīng)移除搅幅,執(zhí)行移除方法,3消失呼胚,4跑到3的位置茄唐。5跑到4的位置再更新的時(shí)候,需要重新更新3蝇更,所以移除完 需要 i --;
此時(shí)在Maingame中把zd改為 public zm:ZDManager; //多個(gè)子彈
Maingame中的更新方法public update()
public update()
{
this.bg.update();
this.player.update();
this.zm.update();
//時(shí)間間隔
this.t++;
if(this.t >= 4){
//調(diào)用create才會(huì)生成一顆子彈
//這里加了2條彈道沪编,一共5條彈道,更有視覺效果
this.zm.create(this.player.x,this.player.y,20,0, this );
this.zm.create(this.player.x,this.player.y,20,-15, this );
this.zm.create(this.player.x,this.player.y,20,-30, this );
this.zm.create(this.player.x ,this.player.y,20,15, this );
this.zm.create(this.player.x,this.player.y,20,30, this );
this.t = 0;
}
}
至此年扩,第二天的開發(fā)筆記已經(jīng)完成蚁廓,學(xué)習(xí)需要堅(jiān)持,堅(jiān)持到最后一定會(huì)有結(jié)果厨幻,每天寫下筆記來記錄自己的學(xué)習(xí)內(nèi)容相嵌, 以后有需要也可以查看,大家可以一起學(xué)習(xí)况脆。
想要我一起學(xué)習(xí)的可以關(guān)注我的公眾號(hào) 知言不盡 找到我饭宾,交流學(xué)習(xí),獲取圖片素材和源代碼格了。