自学内容网 自学内容网

【Cocos TypeScript 零基础 8.1】

双发子弹

增加一个mode属性控制

update(deltaTime: number) {
        if (this.mode == 1) {this.bul1(deltaTime)}
        else if (this.mode = 2) {this.bul2(deltaTime)}
    }
    bul1(deltaTime: number){
        this.time1 += deltaTime
        if (this.time1 >= this.rate) {
            this.time1 = 0  //  重置发射计时
            const zidan1 = instantiate(this.bullet1)    //  实例化
            this.zidan_weizhi.addChild(zidan1)  //  位置上创建实体
            let pw = this.node.getWorldPosition()
            zidan1.setWorldPosition(pw.x,pw.y + 40,pw.z)
        }
    }
    bul2(deltaTime: number){
        this.time1 += deltaTime
        if (this.time1 >= this.rate) {
            this.time1 = 0  //  重置发射计时

            const zidan1 = instantiate(this.bullet2)    //  实例化
            this.zidan_weizhi.addChild(zidan1)  //  位置上创建实体
            let pw = this.node.getWorldPosition()
            zidan1.setWorldPosition(pw.x + 20,pw.y + 40,pw.z)

            const zidan2 = instantiate(this.bullet2)    //  实例化
            this.zidan_weizhi.addChild(zidan2)  //  位置上创建实体
            pw = this.node.getWorldPosition()
            zidan2.setWorldPosition(pw.x - 20,pw.y + 40,pw.z)
        }
    }

子弹碰撞回调销毁

start() {
        let collider = this.getComponent(Collider2D);
        if (collider) {collider.on(Contact2DType.BEGIN_CONTACT, this.onBeginContact, this)}
    }
    onBeginContact (selfCollider: Collider2D, otherCollider: Collider2D) {
        this.node.destroy()
    }

子弹穿过敌机问题

老师也愚见了和我一样的问题
所有碰撞体Allow Sleep 取消选中 (休眠)
可以解决远距离不发生碰撞问题
在这里插入图片描述

敌机动画播放问题

播放指定动画需要名字

@property name1 : string = ''   //  动画名前缀
this.anim.play(`${this.name1}_down`)    //  播放死亡动画

延时

一直不知道怎么延时

this.scheduleOnce( 函数,时间 )

这个函数的意思是延时 时间(秒) 做函数动作
简易示例

            this.scheduleOnce(  //  延迟1次计时器
                function(){this.node.destroy()},    //  方法销毁
                2   //  时间(秒)
            )

小技巧

@ccclass('ts_bullet_att')

代码里 名字对应的的是属性器里名字

碰撞规则

当前敌机之间是可以互相碰撞,并减少掉血的
所以需要去设置一个碰撞规则
在这里插入图片描述
这个图需要横着和竖着兼顾
勾选可以理解成 是否碰撞
再到属性栏去设置物理性质
在这里插入图片描述

玩家属性增加

增加受伤无敌时间
(老师的无敌方法是跳过扣血,播放动画等动作
我的地方法是关闭该组件)
增加血量
受伤播放受伤动画
死亡播放死亡动画
玩家完整代码

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

@ccclass('ts_player')
export class ts_player extends Component {
    @property(Prefab) bullet1 : Prefab = null   //  子弹外观
    @property(Prefab) bullet2 : Prefab = null   //  子弹外观
    @property mode : number = 1     //  子弹开火模式
    @property rate : number = 0.4   //  子弹发射频率
    time1 : number = 0  //  过去的时间
    @property(Node) linshi : Node = null    //  子弹临时生成位置
    @property hp : number = 3   //  玩家初始血量
    collider : Collider2D = null    //  准备打开碰撞监听
    @property(Animation) play : Animation = null // 准备播放动画
    
    protected onLoad(): void {  //  打开监听
        input.on(
            Input.EventType.TOUCH_MOVE, //  设置获取的类型
            this.onmove,    //  赋值给onmove函数
            this
        )
    }
    protected onDestroy(): void {   //  关闭监听
        input.off(
            Input.EventType.TOUCH_MOVE,
            this.onmove,
            this
        )
    }
    onmove(event:EventTouch){   //  飞机移动函数
        const p = this.node.position;   //  获取坐标
        let pos1 = new Vec3( //  创建一个新的变量.来存储将要变更坐标,以便于判断
            p.x + event.getDeltaX(),    //  当前X坐标 + 移动的X坐标
            p.y + event.getDeltaY(),
        )
        if (pos1.x < -240) pos1.x = -240    //  限制左边
        if (pos1.x > 240) pos1.x = 240    //  限制右边
        if (pos1.y < -426) pos1.y = -426    //  限制下边
        if (pos1.y > 426) pos1.y = 426  //  限制上边
        
        this.node.setPosition(pos1.x , pos1.y)  //  设置新的位置
    }

    start() {   //  应该类似于初始化函数
        this.collider = this.getComponent(Collider2D);
        if (this.collider) {this.collider.on(Contact2DType.BEGIN_CONTACT, this.onBeginContact, this)}   //  打开触发回调 开始触发
    }
    onBeginContact (selfCollider: Collider2D, otherCollider: Collider2D) {  //  碰撞开始触发函数
        this.hp -= 1
        if (this.hp <= 0) {
            this.play.play(`player_down`)
            this.scheduleOnce(function(){this.node.destroy()},2)    //  2秒后销毁玩家 在des外面必须套一层fun
        }else {
            this.play.play(`player_hit`)
            this.enabled = false    //  关闭触发器?表示该组件自身是否启用
            this.scheduleOnce(function(){this.enabled = true},1)    //  打开触发器,形成1秒无敌时间
        }
    }
    update(deltaTime: number) { //  开火模式控制
        if (this.mode == 1) {this.bul1(deltaTime)}
        else if (this.mode = 2) {this.bul2(deltaTime)}
    }
    bul1(deltaTime: number){
        this.time1 += deltaTime
        if (this.time1 >= this.rate) {
            this.time1 = 0  //  重置发射计时
            const zidan1 = instantiate(this.bullet1)    //  实例化
            this.linshi.addChild(zidan1)  //  位置上创建实体
            let pw = this.node.getWorldPosition()
            zidan1.setWorldPosition(pw.x,pw.y + 40,pw.z)
        }
    }
    bul2(deltaTime: number){
        this.time1 += deltaTime
        if (this.time1 >= this.rate) {
            this.time1 = 0  //  重置发射计时

            const zidan1 = instantiate(this.bullet2)    //  实例化
            this.linshi.addChild(zidan1)  //  位置上创建实体
            let pw = this.node.getWorldPosition()
            zidan1.setWorldPosition(pw.x + 20,pw.y + 40,pw.z)

            const zidan2 = instantiate(this.bullet2)    //  实例化
            this.linshi.addChild(zidan2)  //  位置上创建实体
            pw = this.node.getWorldPosition()
            zidan2.setWorldPosition(pw.x - 20,pw.y + 40,pw.z)
        }
    }
}

死亡后不发射子弹?
我都把玩家都销毁了,发射子弹不存在的
现在觉得玩家飞机都可以做成精灵
游戏开始时生成


原文地址:https://blog.csdn.net/adminwxs/article/details/145121574

免责声明:本站文章内容转载自网络资源,如侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!