最近搜索

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

浏览:712
管理员 2021-11-17 09:52



金币代码FishSpawnCtrl

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
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(03);
            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(0this.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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
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(03);
            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(0this.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