开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第12天,点击查看活动详情
上次说了制作子弹的预制体,今天继续完善。
1. 打开persistNode脚本。添加装饰器,
import { _decorator, Component, Node, game, Prefab, SpriteFrame } from 'cc';
const { ccclass, property } = _decorator;
@ccclass('persistNode')
export class Persis extends Component {
@property(Prefab)
playerBulletPrefab:Prefab=null;
@property(SpriteFrame)
normalBullet:SpriteFrame=null;
@property(SpriteFrame)
lightBullet:SpriteFrame=null;
@property(SpriteFrame)
missileBullet:SpriteFrame=null;
start() {
}
onLoad(){
game.addPersistRootNode(this.node)
}
update(deltaTime: number) {
}
}
2.回到PersistNode常驻节点,关联子弹预制体和子弹图片资源。
3.
(1)在script文件夹下新建一个脚本,并且命名为global,用来定义全局变量。
(2)定义子弹类型全局变量。
import { _decorator, Component, Node } from 'cc';
const { ccclass, property } = _decorator;
@ccclass('global')
export class global extends Component {
public static NORMAL_BULLET:string='normal_bullet'
public static LIGHT_BULLET:string='light_bullet'
public static MISSILE_BULLET:string='missile_bullet'
}
4. 打开脚本playerBullet.ts增加初始化配置
import { _decorator, Component, Node, SpriteFrame, Sprite } from 'cc';
const { ccclass, property } = _decorator;
@ccclass('playerBullet')
export class playerBullet extends Component {
playerBulletType:string=null //子弹类型
init(playerBulletType:string,SpriteFrame:SpriteFrame){
this.playerBulletType=playerBulletType;
this.node.getComponent(Sprite).spriteFrame=SpriteFrame;
}
start() { }
update(deltaTime: number) {
}
}
5.打开playerBulletFactory.ts脚本
(1)playerBulletFactory脚本记得引用以下的脚本文件
import { persistNode } from './persistNode'
import { gameFactory } from './gameFactory'
import { global } from './global';
import { playerBullet } from './playerBullet';
(2)继续完善playerBulletFactory.ts的createProduct方法。
public createProduct(productType:string):Node{
let playBulltTemp:Node=null;
if(this.productPool.size() >0){
playBulltTemp=this.productPool.get();//如果池子里有子弹,就直接拿来用
}else{
playBulltTemp=instantiate(this.persistNode.getComponent(persistNode).playerBulletPrefab) //从常驻节点拿到预制体原料
}
switch(productType){
case global.NORMAL_BULLET:
playBulltTemp.getComponent(playerBullet).init(productType,this.persistNode.getComponent(persistNode).normalBullet);//通过调用playerBullet的init方法来创建子弹
break;
case global.LIGHT_BULLET: playBulltTemp.getComponent(playerBullet).init(productType,this.persistNode.getComponent(persistNode).lightBullet);
break; case global.MISSILE_BULLET: playBulltTemp.getComponent(playerBullet).init(productType,this.persistNode.getComponent(persistNode).missileBullet);
break;
}
return playBulltTemp;
}
6.打开常驻点脚本persistNodel。
(1)引用playerBulletFactory
import { playerBulletFactory } from './playerBulletFactory';
(3)实例化playerBulletFactory
onLoad(){
game.addPersistRootNode(this.node)
this.playerBulletFactory= new playerBulletFactory()
}
7. 打开play.ts脚本
(1) 定义变量
normalBulletTimer:number=0; //普通子弹定时器
persistNode:Node=null //得到常用节点
playerBulletFactory:gameFactory=null;
(2) 在onLoad函数里获取playerBulletFactory
this.persistNode=find("PersistNode")
this.playerBulletFactory=this.persistNode.getComponent(persistNode).playerBulletFactory
(3)增加发射子弹函数
//发射普通子弹
shootNormalBullet(){
let postBegin:Vec3=new Vec3() //定义子弹开始的位置
let normalBullet:Node=null;
normalBullet= this.playerBulletFactory.createProduct(global.NORMAL_BULLET)//制作子弹
this.node.parent.addChild(normalBullet) //添加节点到画布
this.curPos=this.node.getPosition() //得到飞机当前位置
postBegin.x=this.curPos.x
postBegin.y=this.curPos.y+50 //设置到机头位置
normalBullet.setPosition(postBegin)
}
(4)在update函数中调用发射子弹函数
update(deltaTime: number) {
this.normalBulletTimer += deltaTime
if(this.normalBulletTimer>0.3){
this.shootNormalBullet();
this.normalBulletTimer=0;
}
}
(5)子弹已经可以场景中显示了,但还不能移动
今天就到这里了,主要说了子弹的显示。下一次再完善。可能写的过程中还有很多不好的地方,希望大家能指出来,在此,谢谢大家