首页 > 其他分享 >Cocos 飞机大战 (难点分析 制作)

Cocos 飞机大战 (难点分析 制作)

时间:2023-12-17 17:26:22浏览次数:35  
标签:node 难点 Cocos name 大战 instance ._ PoorManager 节点

前言

自己也写了3个cocos 项目,觉得前面确实有点难,但是熟悉上手之后应该就是 好多了,就是熟能生巧吧

下面就是我的一个 项目分析 和难点   就是我们常玩的打飞机

先看下效果图 我在手机上的截图 

就是拖到触屏 飞机进行射击 和躲避 子弹, 感觉还行吧哈哈

难点 

1. 就是物体直接的碰撞 和刚体 碰撞

// 添加碰撞体 BoxCollider 和刚体 RigidBody
       const collider = this.node.getComponent(BoxColliderComponent);
        const rigidBody = this.node.getComponent(RigidBodyComponent)

逻辑:

     玩家飞机 ,敌方飞机,和子弹 实现自己的逻辑

玩家飞机需要和敌机以及敌方子弹碰撞,无论哪种玩家飞机都要减小血量

敌方飞机无论被玩家飞机还是玩家子弹碰撞都需要被销毁

玩家子弹碰到敌方飞机就自动销毁

敌方子弹碰到玩家飞机就自动销毁

其实只要 在 碰撞矩阵上设置子弹和子弹之间 不产生碰撞就好了,所以设置4个属性

项目 设置 ---》 physics 

 然后设置他们的碰撞条件 勾选一下就好

然后到编辑内容上

 添加2个 组件   撞体 BoxCollider 和刚体 RigidBody

 

设置碰撞体的大小和 飞机一样大    就是size  ,isTrigger 一定要勾选上

然后设置rigidbody  分类是 self_player 就是我们之前设置的4个其中一个,

运动类型 因为没有重力 所以不是运动学,静态就好KINEMATIC

 然后 子弹和 敌方飞机也是这么设置就好,就不写了

 

然后在代码 敌方机上写

    private _onTriggerEnter(event: ITriggerEvent){
        const collisionGroup = event.otherCollider.getGroup();
        if(collisionGroup === Constant.CollisionType.SELF_PLANE || collisionGroup === Constant.CollisionType.SELF_BULLET){
            // console.log('trigger enemy destroy');
            this._gameManager.playAudioEffect('enemy');
            PoorManager.instance().putNode(this.node);
            // this.node.destroy();
            this._gameManager.addScore();
            this._gameManager.createEnemyEffect(this.node.position);
        }
    }

解释就是敌方飞机 : 当碰撞类型 遇到 玩家飞机和玩家子弹的是时候 就 就开始销毁 和加分

    onEnable () {
        const collider = this.getComponent(Collider);
        collider.on('onTriggerEnter', this._onTriggerEnter, this);
    }onTriggerEnter 就是碰撞监听事件 需要绑定
 
这样就比较好理解了

难点2
节点池

 就是类型垃圾回收这样 script 的    解释:  就是存放 数据的时候  有需要在拿去不需要就 放回,以免 产生大量的实例 垃圾

在script  目录下新建一个文件 :PoorManager.Ts

里面就是

// 节点池
interface IDictPool {
    [name: string]: NodePool;
}

interface IDictPrefab {
    [name: string]: Prefab;
}
 
@ccclass('PoorManager')
export class PoorManager {
    
    //  因为不是组件没有地方实例化  因此定义 静态方法实例化
    public static instance(){
        if(!this._instance){
            this._instance = new PoorManager();
        }

        return this._instance;
    }

    private _dictPool: IDictPool = {}; // 存放节点
    private _dictPrefab: IDictPrefab = {};  //存放预制
    private static _instance: PoorManager; // 判断是否实例化过


    public getNode(prefab: Prefab, parent: Node){
        let name = prefab.data.name;
        // console.log('get node   ' + name);
        let node: Node = null;
        this._dictPrefab[name] = prefab;
        const pool = this._dictPool[name];
        // 判断有米有当前分类的容器
        if (pool) {
            if (pool.size() > 0) {
                node = pool.get();
            } else {
                node = instantiate(prefab); //s实例化新的节点
            }
        } else {
            this._dictPool[name] = new NodePool();
            node = instantiate(prefab);
        }

        node.parent = parent;  //设置他的归宿 他的父节点
        node.active = true;   //属性激活
        return node;
    }

    // 放回到容器里面
    public putNode(node: Node){
        let name = node.name;
        // console.log('put node   ' + name);
        // 因为节点被回收了,就不能存在场景里面
        node.parent = null;
        if (!this._dictPool[name]) {
            this._dictPool[name] = new NodePool();
        }

        this._dictPool[name].put(node);
    }
}

就是创建 2个 一个是存放节点池,一个预制体 的

然后在2个方法   getNode 和  putNode 这样好理解了吧

 

然后在其他控制器内 把   instantiate 这个方法 替代  因为这就是创建节点的方法

   PoorManager.instance() 

写法就是 下面

        // const bullet = instantiate(this.bullet01);
        // bullet.setParent(this.bulletRoot);
        const bullet = PoorManager.instance().getNode(this.bullet02, this.bulletRoot);
        bullet.setPosition(targetPos.x, targetPos.y, targetPos.z + 6);

全局找到着方法然后在替换

难点3  血条:

 

血条 用锚点 , 但是 画图里面没有锚点 这个制作 ,   所以那就用节点做锚点

步骤:

1.创建一个新的节点
2.然后把要展示的血条的节点 那个 放在这个新建的节点下面 (子节点)
3. 右边缩放 左边没有血条 因为是右边减少 

4.设置 创建着节点 左边 ,分界 点, 需要把下面 的face 节点 往右边移东,然后确定 face 父节的face 刚好在 blood 的中点

然后就是 在平移face 这个到 最左边,这样 就好了

 

难点4

CocosCreator图片导入到工程,没办法拖动到场景中,

将资料的属性类型由texture 调整为sprite-frane  就是Type 类型修改

 

 

2D 是匹配UI 在项目的 设置 配置 项目数据
要贴着 全屏显示

选择的精灵图必须是 属性layer 是UI_2D 才能在canvas 下展示 

 

以上是遇到的一些比较难的地方,然后加入自己的一些理解 还是需要自己多家联系操作 COCOS 编辑器,

欧克 先这样了。

记录COCOS开发的,加油!!!!

 

标签:node,难点,Cocos,name,大战,instance,._,PoorManager,节点
From: https://www.cnblogs.com/yf-html/p/17909367.html

相关文章

  • 植物大战僵尸
    #include<iostream>#include<windows.h>usingnamespacestd;HWNDhand=NULL;DWORDpid=0;HANDLEhProcess=NULL;DWORDBaseValue=0;DWORDSunshineAddress;boolstartGame();boolinitSunshine();intgetSunshineValse();voidsetSunshineValue(intvalue);int......
  • 植物大战僵尸外挂2
    #include<iostream>#include<windows.h>usingnamespacestd;/*声明变量*/HWNDhand=NULL;DWORDpid=0;HANDLEhProcess=NULL;DWORDBaseValue=0;/*声明方法/函数*/boolstartGame();intmain(intargc,char**argv){ boolResult=false; Result=startG......
  • 植物大战僵尸外挂1
    #include<iostream>#include<windows.h>usingnamespacestd;/*声明变量*/HWNDhand=NULL;//游戏窗口DWORDpid=0;//游戏进程IDHANDLEhProcess=NULL;//进程对象DWORDBaseValue=0;//游戏数据存放的基础值/*声明方法/函数*/boolstartGame();//初始化游戏数据......
  • 植物大战僵尸0.1
    #include<iostream>#include<windows.h>usingnamespacestd;HWNDhand=NULL;DWORDpid=0;HANDLEhProcess=NULL;DWORDBaseValue=0;boolstartGame();intmain(intargc,char**argv){boolResult=false;Result=startGame();i......
  • 植物大战僵尸
    #include<iostream>#include<windows.h>usingnamespacestd;//声明变量HWNDhand=NULL;//游戏窗口DWORDpid=0;//游戏进程IDHANDLEhProcess=NULL;//进程对象DWORDBaseValue=0;//游戏数据存放的基础值boolstartGame();//初始化游戏数据intmain(){......
  • 植物大战僵尸(初始化游戏数据 )
    #include<iostream>#include<windows.h>usingnamespacestd;/*声明变量*/HWNDhand=NULL;//游戏窗口DWORDpid=0;//游戏进程IDHANDLEhProcess=NULL;//进程对象DWORDBaseValue=0;//游戏数据存放的基础值/*声明方法/函数*/boolstartGame();//初始化游戏数据......
  • 植物大战僵尸(阳光)
    #include<iostream>#include<windows.h>usingnamespacestd;intmain(){intvalue=0;intpid=0;cout<<"输入修改进程ID";cin>>pid;HANDLEhProcess=NULL;DWORDaddress1=0x006A9EC0;DWORDaddress2;......
  • cocos creator ScrollView不滚动问题
    拖放默认的ScrollView可以,可以滚动显示文字,结构如下:ScrollView scrollBar(滚动条结点,不显示滚动条时,可直接删除,删除后把ScrollView里面的VertticalScrollBar值清了) bar view(视图结点) content item(具体文本)content......
  • COCOS 保姆入门级
    前沿游戏最近是越来越火了,流行的2个unity和cocos,已经成为主流前端去学的话还是cocos比较友好,因为是TS,JS来写脚本的,最近自己也很沉迷cocos,算是入门了,能写几个简单的游戏demo了,现在先写一些知识点 1.组件实例+节点节点是组间实例的载体,组件实例不能离开节点而单独的......
  • Cocos RichText的on事件监听
    参考:cocos官方-RichText组件 一RichText点击事件用途1.可以用于当游戏中技能描述里有buff,点击buff会弹出buff的详情框。2.用于点击聊天消息里的高亮装备文字,会弹出装备详情。 二使用方法在richtext的string属性中输入如下,其中click表示回调函数,param表示传入参数。......