COCOS:(飞机大战05)双发子弹的发射逻辑,以及子弹切换的问题

飞机大战知识点总结

上一节03已经实现了单发逻辑,在上节基础上,实现双发功能,实现的效果图如下
在这里插入图片描述
1.制作双发的子弹预制体,复制粘贴Prefabs文件内的Bullet1,修改为Bullet2
在这里插入图片描述
2.定义双发子弹的世界坐标位置。参考上一节的需要注意:在文件Player内创建空节点,名称修改为bulletPost1,用来定位子弹发射的位置。
相同方式,创建空节点bulletPost2bulletPost3,并手动拖动到指定位置。
在这里插入图片描述
在这里插入图片描述
继续实现Player.ts的双发逻辑,完整代码如下:

import { _decorator, Component, EventTouch, Input, input, instantiate, Node, Prefab, Vec3 } from 'cc';
const { ccclass, property } = _decorator;

@ccclass('Player')
export class Player extends Component {
    // 子弹发射类型,1单发,2双发,0不发射
    sendType:number = 2;

    /**
     * 单发,发射逻辑,先定义以下字段
     * sendRate:number         子弹发射频率
     * sendTime:number         子弹发射时间
     * bulletParent:Node        用来存放所有生成的子弹
     * bulletPost1:Node         第一种子弹的世界坐标位置
     * bulletPrefab1:Prefab     第一种子弹的预制体
     * 
     * 逻辑分析:
     * 判断发射时间,sendTime+=dt >= sendRate 就需要发射子弹了,将sendTime重置为0
     * 通过instantiate(bulletPrefab1)拿掉子弹1的预制体,赋值给bullet1
     * 生成的所有子弹都要放在文件bulletParent内,所有通过addChild()方法,将bullet1 添加进去
     * 最后设置bullet1的世界坐标位置为:bulletPost1的worldPosition
     */
    @property
    sendRate:number = 0.5;
    sendTime:number = 0;
    @property(Node)
    bulletParent:Node = null;
    @property(Node)
    bulletPost1:Node = null;
    @property(Prefab)
    bulletPrefab1:Prefab = null;

    /**
     * 双发,发射逻辑
     * bulletPost2:Node         第二种子弹,左侧世界坐标位置
     * bulletPost3:Node         第二种子弹,右侧世界坐标位置
     * bulletPrefab2:Prefab     第二种子弹的预制体
     * 
     */
    @property(Node)
    bulletPost2:Node = null;
    @property(Node)
    bulletPost3:Node = null;
    @property(Prefab)
    bulletPrefab2:Prefab = null;


    

    protected update(dt: number): void {
        if(this.sendType == 1){
            // 单发逻辑
            this.sendTime += dt;
            if(this.sendTime>= this.sendRate){
                this.sendTime = 0;
                const bullet1 = instantiate(this.bulletPrefab1)
                this.bulletParent.addChild(bullet1)
                bullet1.setWorldPosition(this.bulletPost1.worldPosition)
            }
        }else if(this.sendType == 2){
            // 双发逻辑
            this.sendTime += dt;
            if(this.sendTime>= this.sendRate){
                this.sendTime = 0;
                // 左侧子弹
                const bullet2 = instantiate(this.bulletPrefab2)
                this.bulletParent.addChild(bullet2)
                bullet2.setWorldPosition(this.bulletPost2.worldPosition)

                // 右侧子弹
                const bullet3 = instantiate(this.bulletPrefab2)
                this.bulletParent.addChild(bullet3)
                bullet3.setWorldPosition(this.bulletPost3.worldPosition)
            }
        }
    }



	// 以下内容为飞机的触摸移动方法
    protected onLoad(): void {
        // 1. 注册触摸事件
        input.on(Input.EventType.TOUCH_MOVE,this.onTouchMove,this);
    }
    protected onDestroy(): void {
        // 2.注销触摸事件
        input.off(Input.EventType.TOUCH_MOVE,this.onTouchMove,this);
    }
    // 触摸方法
    onTouchMove(event:EventTouch){
        // this.node.position:获取自身Player的位置
        // event中 getDeltaX(),getDeltaY():用来获取移动过程中的位置偏移
        // 通过这个偏移,来控制Player的位置偏移
        // this.node.setPosition:设置x,y,z轴的位置 

        const p = this.node.position;

        // 要移动的:目标坐标
        let targetPos = new Vec3(p.x+event.getDeltaX(),p.y+event.getDeltaY(),p.z);

        if(targetPos.x < -230){
            targetPos.x = -230
        }

        if(targetPos.x > 230){
            targetPos.x = 230
        }

        if(targetPos.y < -380){
            targetPos.y = -380
        }

        if(targetPos.y > 380){
            targetPos.y = 380
        }
        
        this.node.setPosition(targetPos)
    }
}

回到COCOS中,把对应的文件拖进去,运行完成双发逻辑效果。
在这里插入图片描述

最后在这里完善以下子弹的销毁功能

在子弹发射的Bullet.ts文件内,销毁

update(deltaTime: number) {
  const pos = this.node.position;
    this.node.setPosition(pos.x,pos.y+this.speed*deltaTime,pos.z)
    // 飞行距离超出屏幕外了,就销毁掉。
    if(pos.y>500){
        this.node.destroy()
    }
}
在使用cocos2d-x框架开发飞机大战类游戏时,实现敌人发射子弹的功能主要涉及以下几个步骤: 1. 创建子弹类:首先需要创建一个子弹类,这个类应该继承自`Cocos2d-x`的`Sprite`类或者其它适合的显示对象类。在这个类中定义子弹的基本属性,如速度、位置、大小等,并且可以添加子弹的一些动作,比如移动。 2. 发射子弹逻辑:在敌人角色类中,添加发射子弹逻辑。这通常会在一个周期性的函数中实现,例如每秒检查敌人是否需要发射子弹,如果需要,则创建子弹类的实例,并设置其初始位置为敌人当前位置。 3. 子弹的移动:子弹被创建后,需要使其按照一定的方向和速度移动。这可以通过使用`Action`来实现,例如使用`MoveTo`动作让子弹沿直线移动,或者使用`MoveBy`来相对当前位置移动。 4. 碰撞检测:为了实现子弹击中目标的功能,需要在游戏逻辑中添加碰撞检测。这可以通过`Cocos2d-x`提供的`PhysicsContact`监听或者简单的矩形碰撞检测来实现。当子弹与飞机等目标接触时,触发相应的逻辑,如减少生命值或者销毁目标。 5. 子弹的移除:当子弹离开屏幕或者击中目标后,应该将其从场景中移除,避免内存泄漏和不必要的渲染计算。 示例代码片段(伪代码): ```cpp class Bullet : public cocos2d::Sprite { public: Bullet(const cocos2d::Vec2& position, const cocos2d::Size& size) { // 初始化子弹位置、大小等属性 // 添加移动动作或使用回调函数定时更新子弹位置 } // 可以添加子弹移动更新的回调函数 void update(float dt) { // 根据时间间隔更新子弹位置 } }; class Enemy : public cocos2d::Sprite { public: void update(float dt) { // ... 其他更新逻辑 if (shouldFireBullet()) { // 创建子弹实例 Bullet* bullet = new Bullet(this->getPosition(), bulletSize); // 设置子弹的目标位置 bullet->setPosition(this->getPosition() + Vec2(0, -bulletSize.height)); // 将子弹添加到父节点或场景中 this->getParent()->addChild(bullet); // 可以添加一个移动动作或定时器来控制子弹移动 } } bool shouldFireBullet() { // 根据一定的逻辑判断是否发射子弹,例如定时发射 // 返回布尔值 } }; // 在适当的位置添加Enemy和Bullet类的实现和调用代码 ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值