最近搜索

第06讲 生成障碍和金币(一直向前生成)后面超镜头就回收掉

浏览:504
管理员 2021-11-17 01:52



金币代码FishSpawnCtrl

import { _decorator, Component, Node, Vec3, math, CCInteger, Pool, instantiate, Collider } from 'cc';
import { BuildSpawnCtrl } from './BuildSpawnCtrl';
import { SpawnItemData, SpawnItem } from './SpawnConfig';
import { GameCtl } from '../GameCtl';
import { Constants } from '../data/Constants';
const { ccclass, property } = _decorator;


@ccclass('FishSpawnCtrl')
export class FishSpawnCtrl extends Component {


    @property({
        type: CCInteger,
        displayOrder: 2
    })
    public roadStartZ = 0;//道路 开始的位置

    @property({
        type: CCInteger,
        displayOrder: 5
    })
    public roadLength = 0;//道路长度

    @property({
        type: CCInteger,
        displayOrder: 8
    })
    public recoverOffset = 0;//超过相机多少米回收

    @property({
        type: [SpawnItemData],
        displayOrder: 12 //SpawnItemData就是 prefab预制体 和  int 预制的长度
    })
    public spawnItemDataArray: SpawnItemData[] = [];

    startCreateZ: number = 0;
    runtimeSpawnItemList: SpawnItem[] = [];
    poolMap: Map<string, Pool<SpawnItem>> = new Map<string, Pool<SpawnItem>>();


    @property
    gap = 10;//每个金币之间的  间隔。
    x_pos = 0;


    start() {
        for (let item of this.spawnItemDataArray) {
            let temp = new Pool<SpawnItem>(() => { return this.CreateSpawnItem(item) }, 1)
            this.poolMap.set(item.prefab._uuid, temp);
        }
        this.startCreateZ = this.roadStartZ;
    }

    update(dt: number) {
        this.CreateInEnd_z();//创建物体到末尾
        this.recoverLessZ();//超过范围的物体回收
    }


    protected endZ(): number {
        //这个应该是随着 奔跑而变化的 一个数    我们的终点一直在变。 我们小车当前的位置加上道路的长度
        return GameCtl._instance.getCurrentZ() + this.roadLength;
    }
    CreateInEnd_z() {
        var p_endZ = this.endZ();
        while (this.startCreateZ < p_endZ) {
            var x = math.randomRangeInt(0, 3);
            if (x == 0) {
                x = -GameCtl._instance._interval;
            } else if (x == 1) {
                x = 0
            } else {
                x = GameCtl._instance._interval;
            }
            this.x_pos = x;
            //创建3个 为一组   
            for (let index = 0; index < 3; index++) {
                let spawnItem = this.DoSpawnItem(this.startCreateZ);
                if (spawnItem) {
                    this.startCreateZ += spawnItem.spawnItemData.node_length;
                }
            }
            this.startCreateZ += this.gap;
        }
    }

    //创建物体  z是设置的位置 
    protected DoSpawnItem(z: number): SpawnItem | undefined {
        //随机创建预制体
        let rndIdk = math.randomRangeInt(0, this.spawnItemDataArray.length);
        var spawnItemData = this.spawnItemDataArray[rndIdk];
        let item = this.poolMap.get(spawnItemData.prefab._uuid)?.alloc();
        if (item != null) {
            this.node.scene.addChild(item.node);//取出
            this.onSpawn(item.node, spawnItemData, z);
        }
        return item;
    }
    protected CreateSpawnItem(spawnItemDate: SpawnItemData) {
        var newGo = instantiate(spawnItemDate.prefab) as Node;
        this.node.scene.addChild(newGo);

        /*
        let collider = newGo.getComponent(Collider) as Collider;
        console.log(collider);
        collider.setGroup(Constants.GROUP.OTHER);
        collider.setMask(-1);
        */

        let spawnItem = new SpawnItem();
        spawnItem.node = newGo;
        spawnItem.spawnItemData = spawnItemDate;
        //给回收用的
        this.runtimeSpawnItemList.push(spawnItem);
        return spawnItem;
    }
    //跑道有三条,障碍物在另外一侧
    protected onSpawn(newGo: Node, spawnItemData: SpawnItemData, z: number) {
        newGo.setPosition(new Vec3(this.x_pos, 0, z));//y轴是离地间隔。
        newGo.active = true;
    }


    recoverLessZ() {
        //回收超出镜头的物体
        for (const spawnItem of this.runtimeSpawnItemList) {
            // spawnItemData(prefab预制体 和  node_length 预制的长度)  +  Node
            if (spawnItem.node.active) {
                let length = spawnItem.spawnItemData.node_length;//
                if (spawnItem.node.position.z + length + this.recoverOffset < GameCtl._instance.getCurrentZ()) {
                    this.poolMap.get(spawnItem.spawnItemData.prefab._uuid)?.free(spawnItem);
                    spawnItem.node.active = false;
                }
            }

        }
    }


}





生成树的代码ObstacleSpawnCtrl

import { _decorator, Component, Node, CCInteger,Animation, Pool, math, instantiate, Vec3, BoxCollider, Collider } from 'cc';
import { GameCtl } from '../GameCtl';
import { SpawnItemData, SpawnItem } from './SpawnConfig';
import { Constants } from '../data/Constants';
const { ccclass, property } = _decorator;



@ccclass('ObstacleSpawnCtrl')
export class ObstacleSpawnCtrl extends Component {


    @property({
        type: CCInteger,
        displayOrder: 2
    })
    public roadStartZ = 0;//道路 开始的位置

    @property({
        type: CCInteger,
        displayOrder: 5
    })
    public roadLength = 0;//道路长度

    @property({
        type: CCInteger,
        displayOrder: 8
    })
    public recoverOffset = 0;//超过相机多少米回收

    @property({
        type: [SpawnItemData],
        displayOrder: 12 //SpawnItemData就是 prefab预制体 和  int 预制的长度
    })
    public spawnItemDataArray: SpawnItemData[] = [];

    startCreateZ: number = 0;
    runtimeSpawnItemList: SpawnItem[] = [];
    poolMap: Map<string, Pool<SpawnItem>> = new Map<string, Pool<SpawnItem>>();


    @property
    gap = 10;//每个障碍之间的  间隔。
    x_pos = 0;


    start() {
        for (let spawnItemData of this.spawnItemDataArray) {
            let temp = new Pool<SpawnItem>(() => { return this.CreateSpawnItem(spawnItemData) }, 1)
            this.poolMap.set(spawnItemData.prefab._uuid, temp);
        }
        console.log(this.poolMap.size);//这里是1个。
        this.startCreateZ = this.roadStartZ;
    }

    update(dt: number) {
        this.CreateInEnd_z();//创建物体到末尾
        this.recoverLessZ();//超过范围的物体回收
    }

    protected endZ(): number {
        //这个应该是随着 奔跑而变化的 一个数    我们的终点一直在变。 我们小车当前的位置加上道路的长度
        return GameCtl._instance.getCurrentZ() + this.roadLength;
    }

    CreateInEnd_z() {
        var p_endZ = this.endZ();//路的终点
        while (this.startCreateZ < p_endZ) {
            var x = math.randomRangeInt(0, 3);
            if (x == 0) {
                x = -GameCtl._instance._interval;
            } else if (x == 1) {
                x = 0
            } else {
                x = GameCtl._instance._interval;
            }
            this.x_pos = x;

            let spawnItem = this.DoSpawnItem(this.startCreateZ);
            if (spawnItem) {
                this.startCreateZ += spawnItem.spawnItemData.node_length;
            }

            this.startCreateZ += this.gap;
        }
    }


    //创建物体  z是设置的位置 
    protected DoSpawnItem(z: number): SpawnItem | undefined {
        //随机创建预制体
        let rndIdk = math.randomRangeInt(0, this.spawnItemDataArray.length);
        var spawnItemData = this.spawnItemDataArray[rndIdk];
        let item = this.poolMap.get(spawnItemData.prefab._uuid)?.alloc();//alloc 是线程池取出来
        if (item != null) {
            this.node.scene.addChild(item.node);//取出

         
            this.onSpawn(item.node, spawnItemData, z);
        }
        return item;
    }


    protected CreateSpawnItem(spawnItemDate: SpawnItemData) {
        var newGo = instantiate(spawnItemDate.prefab) as Node;
        this.node.scene.addChild(newGo);
        let spawnItem = new SpawnItem();
        spawnItem.node = newGo;
        spawnItem.spawnItemData = spawnItemDate;
        //给回收用的
        this.runtimeSpawnItemList.push(spawnItem);
        return spawnItem;
    }

    //跑道有三条,障碍物在另外一侧
    protected onSpawn(newGo: Node, spawnItemData: SpawnItemData, z: number) {
        newGo.setPosition(new Vec3(this.x_pos, 0, z));//y轴是离地间隔。
        newGo.active = true;
        
        newGo.getComponent(Animation).play("tree_up");
    }


    recoverLessZ() {
        //回收超出镜头的物体
        for (const spawnItem of this.runtimeSpawnItemList) {
            // spawnItemData(prefab预制体 和  node_length 预制的长度)  +  Node
            if (spawnItem.node.active) {
                let length = spawnItem.spawnItemData.node_length;//
                if (spawnItem.node.position.z + length + this.recoverOffset < GameCtl._instance.getCurrentZ()) {
                    this.poolMap.get(spawnItem.spawnItemData.prefab._uuid)?.free(spawnItem);
                    spawnItem.node.active = false;
                }
            }
        }
    }



}




联系站长

站长微信:xiaomao0055

站长QQ:14496453