本帖最后由 脑的研发记录 于 2023-11-10 18:07 编辑
“数据结构课作业笔记”#006-数组-从地刺到冲击层-队列的预兆
所用编辑器版本0.25.0.4
目录总览:
零.开发背景
壹.第一个优化数组
贰.所需语法
叁.应用说明
肆.相关参考链接
伍.优化说明
零.开发背景
昨天写完地刺,还在想怎么过渡到下一篇,给地刺改了改参数,想起来新的数据类型与之前的数据比较像,应该能过渡,就着原来的基础直接改代码。在上午的概率统计课上灵感乍现,地刺方块先进后出,地刺方块可以先进先出,这样地刺生长消失,就成冲击波生长消失了。于是下午3:50下课回到宿舍开发,复制粘贴代码,调整参数,加一点新的函数,最终16:40改出来代码。
16:40-17:53写帖子
这次写的快是因为难度都给了上次开发
所以这次帖子短,实际上是因为相关内容被前一篇帖子分担了
所以实际上学习一学就学的一整套,问题一解决,连后续遇到的问题也解决了。
这就是学习新新新新的东西的意外故事。
壹.第一个优化数组
不多说,上代码,复制粘贴直接跑
最终成果
class ooh {
n: Gameplay.GameObject;
id: string;
}
@Core.Class
export default class adds extends Core.Script {
protected build: Array<ooh> = new Array(50);
// 100改小成50,控制距离
protected i: number = -1;
protected flag_grow: number = 0;
/** 当脚本被实例后,会在第一帧更新前调用此函数 */
protected onStart(): void {
for (var j = 0; j < this.build.length; j++) {
this.build[j] = new ooh();
}
// AssetUtil.assetLoaded("197386");
AssetUtil.asyncDownloadAsset("197386");
setTimeout(() => {
for (var j = 0; j < this.build.length; j++) {
let obj = Gameplay.GameObject.spawn({
guid: "197386",
replicates: true,
transform: new Transform(new Vector(0, j*50, 25 ),
// 方块y方向坐标为j*50,以此实现每个方块间隔50,方块高度25
new Rotation(0, 0, 0),
new Vector((1+j*j)/90, 1, (1+j*j)/90))
// 指数级别增长,方块变宽大
});
// this.build[++this.i].n = obj;
this.in(obj);
// this.build[j].n.setCollision(Type.PropertyStatus.On, true);
// this.build[j].n.setVisibility(Type.PropertyStatus.On, true);
// this.build[j].id = "ooh" + this.i;
}
}, 3000);
setTimeout(() => {
var timer = setInterval(() => {
console.log(this.i);
// console.log(this.flag_grow);
console.log(this.build.length);
if (this.flag_grow == 0) {
var have: ooh = this.out();
have.n.setCollision(Type.PropertyStatus.Off, true);
have.n.setVisibility(Type.PropertyStatus.Off, true);
// if (this.i == -1) {
// this.flag_grow = 1;
// }
if (this.i == this.build.length) {
this.flag_grow = 1;
this.i=-1;
}
} else if (this.flag_grow == 1) {
// if (this.i == this.build.length) {
// this.flag_grow = 0;
// }
if (this.i == this.build.length) {
this.flag_grow = 0;
this.i=-1;
}
var have: ooh = this.show();
have.n.setCollision(Type.PropertyStatus.On, true);
have.n.setVisibility(Type.PropertyStatus.On, true);
}
}, 20);
}, 5000);
}
public in(obj: Gameplay.GameObject) {
this.i++;
this.build[this.i].n = obj;
}
public show(): ooh {
this.i++;
var have = this.build[this.i];
return have;
}
// public out(): ooh {
// var have = this.build[this.i];
// this.i--;
// return have;
// }
public out(): ooh {
var have = this.build[this.i];
this.i++;
return have;
}
}
实现了一个从起点开始生长,然后从起点开始消失的方块堆。
代码成分说明:
定义结构初始化,绿色代码不用管
class ooh {
n: Gameplay.GameObject;
id: string;
}
// @Core.Class
// export default class adds extends Core.Script {
protected build: Array<ooh> = new Array(50);
// 100改小成50,控制距离
protected i: number = -1;
protected flag_grow: number = 0;
/** 当脚本被实例后,会在第一帧更新前调用此函数 */
// protected onStart(): void {
for (var j = 0; j < this.build.length; j++) {
this.build[j] = new ooh();
}
资源加载且产出,数字变化长度延
AssetUtil.asyncDownloadAsset("197386");
setTimeout(() => {
for (var j = 0; j < this.build.length; j++) {
let obj = Gameplay.GameObject.spawn({
guid: "197386",
replicates: true,
transform: new Transform(new Vector(0, j*50, 25 ),
// 方块y方向坐标为j*50,以此实现每个方块间隔50,方块高度25
new Rotation(0, 0, 0),
new Vector((1+j*j)/90, 1, (1+j*j)/90))
// 指数级别增长,方块变宽大
});
// this.build[++this.i].n = obj;
this.in(obj);
// this.build[j].n.setCollision(Type.PropertyStatus.On, true);
// this.build[j].n.setVisibility(Type.PropertyStatus.On, true);
// this.build[j].id = "ooh" + this.i;
}
}, 3000);
新瓶旧酒酌三行,负一替换终起点
setTimeout(() => {
var timer = setInterval(() => {
console.log(this.i);
// console.log(this.flag_grow);
console.log(this.build.length);
if (this.flag_grow == 0) {
var have: ooh = this.out();
have.n.setCollision(Type.PropertyStatus.Off, true);
have.n.setVisibility(Type.PropertyStatus.Off, true);
// if (this.i == -1) {
// this.flag_grow = 1;
// }
if (this.i == this.build.length) {
this.flag_grow = 1;
this.i=-1;
}
} else if (this.flag_grow == 1) {
// if (this.i == this.build.length) {
// this.flag_grow = 0;
// }
if (this.i == this.build.length) {
this.flag_grow = 0;
this.i=-1;
}
var have: ooh = this.show();
have.n.setCollision(Type.PropertyStatus.On, true);
have.n.setVisibility(Type.PropertyStatus.On, true);
}
}, 20);
}, 5000);
}
只要是序号this.i等于数组长度,this.i就改成-1,回到数组起点,
回到起点的时候,flag_grow改变,每次循环都进入另一个if,执行show函数。show函数对应冲击波方块依次产生,out函数对应冲击波方块依次消失。
递减递加顺序变,就地重写展新颜。
public in(obj: Gameplay.GameObject) {
this.i++;
this.build[this.i].n = obj;
}
public show(): ooh {
this.i++;
var have = this.build[this.i];
return have;
}
// public out(): ooh {
// var have = this.build[this.i];
// this.i--;
// return have;
// }
public out(): ooh {
var have = this.build[this.i];
this.i++;
return have;
}
原来从最后一个倒回到第一个,i--,是从this.i等于数组长度时,从最大值减少。现在由于对应从第一个到最后一个,i要从第一个开始,i就回到起点,然后一直数到最后一个,就i++。
不是因为if改变了,所以i--变成i++,而是最后产生的先消失,对应从小到大,从大到小,转变成,先产生的先消失,最后产生的最后消失,对应从小到大,然后跳回开头,继续从小到大。这样从第一个投产数组的只在一端增加减少,变成第一个优化数组的在一端增加,在一端减少。出现了两头跳转——从尾跳到头的新情况。
贰.所需语法
关于预先加载概念
预先加载物体,这样就不用在场景里拖进一个方块了,相当于提前把数据读取到游戏里,但是不使用数据。
AssetUtil.asyncDownloadAsset("197386");
关于数据类型,在第一个自由数组中,interface改成class, 这样类型变化之后,数组的初始化也从手写数据换成自动填充。
class ooh {
n: Gameplay.GameObject;
id: string;
}
// @Core.Class
// export default class adds extends Core.Script {
protected build: Array<ooh> = new Array(50);
// 100改小成50,控制距离
protected i: number = -1;
protected flag_grow: number = 0;
/** 当脚本被实例后,会在第一帧更新前调用此函数 */
// protected onStart(): void {
for (var j = 0; j < this.build.length; j++) {
this.build[j] = new ooh();
}
这个其实也是预先加载,数组的预先加载,生成一个有50项的数组。
protected build: Array<ooh> = new Array(50);
这个是数组内的每一项的预先加载,数据项内预先加载格式,如果不写的话,直接跑代码,会有黄色字的报错“ TypeError: Cannot read property 'n' of undefined”
其实就是因为n属于ooh这个class类型中定义的变量,new 分配了内存,然后把内存的代号传进去数组里,这样数组通过代号自动找到内存,然后把数据存进去。
其实 定义number类型变量a 本身就是找块地方存数字。只不过class类型的数据,系统不能按老方式自动分配内存,就需要手动写代码命令系统去按格式分配内存。
new 就是命令分配内存, 而 ooh()就是指定的内存分割成的格式。这一大块内存的划分地盘,一小块存数字number,另一大块存物体数据。
this.build[j] = new ooh();
一般这个阶段的程序跑起来看不见效果,首先检查是不是没有分配内存,因为这个检查项最好改代码。
叁.应用说明
游戏道具上
冲击波,加点特效,就能玩,加点冲量预制体再改改应该可以有击退效果。 也可以修改冲击波的形状,形成分叉冲击波,也能改成陷阱。从下往上冲击困住玩家
肆.相关参考链接
返回主站
普通大学生“数据结构”课作业笔记#000-目录-逻辑结构与存储结构 口袋方舟论坛|面向全年龄的UGC互动内容平台与交流社区 (ark.online)
伍.优化说明
代码优化上
调整代码结构,封装更完整,在其他代码文件中调用
游戏开发上
大冲击波,小冲击波,调整冲击波消失时间,平衡不同冲击波的效果,保证游戏公平性
玩法设计上
除了第一人称释放技能攻击,扣血,
也可以像我的世界放置方块,用冲击波造场景,用冲击波与场景交互,习得冲击波技能,天堑变通途。
|