从0开始用CocosCreator开发飞机大战小游戏(四)

91 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 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常驻节点,关联子弹预制体和子弹图片资源。 image.png

 

3. 

(1)在script文件夹下新建一个脚本,并且命名为global,用来定义全局变量。 image.png

(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)子弹已经可以场景中显示了,但还不能移动

image.png

今天就到这里了,主要说了子弹的显示。下一次再完善。可能写的过程中还有很多不好的地方,希望大家能指出来,在此,谢谢大家