本帖最后由 脑的研发记录 于 2023-11-11 11:54 编辑
“数据结构课作业笔记”#007-数组-从冲击层到按钮生成阶梯-排队队列
所用编辑器版本0.25.0.5
目录总览:
零.新的开始
壹.第一个变化数组
贰.所需语法
叁.应用说明
肆.相关参考链接 (返回主站)
零.新的开始
昨天晚上写出来冲击波的帖子,然后又开始为第二天的素材思考,然后思考无果。或者说是想着想着,想起来以前的经验,“欲速则不达”。感觉已经能摸到一天的灵感精力的上限了,就不想了,睡觉。
后来,今天早上9:00开始敲代码,10:09出成果。具体来说是例子简单了,复制粘贴的技术更加靠谱了。
灵感就像意识一样,只可意会不可言传,就像不知道自己怎么睡醒的一样,但是肯定知道自己是被太阳晒醒的一样,一讲起来怎么知道自己晒醒的,不知道。看别人晒醒,自己醒的时候有光,就坚信起来了。
还有非常感谢论坛师傅们和同学们的鼓励支持!!!
10:09-11:53写完帖子
开发记录:
第零次开发:想起来按钮点击,按钮X数组存储,想象点击按钮生成方块。哦,无中生有!我又行了!
第一次开发:又想起来按钮用UI粘贴,好像又要点击新的界面,然后回想起之前写游戏,拖动粘贴按钮,导出按钮文件,引用按钮文件,就觉得篇幅太大,写不进去。觉得要寄,但是再回想着,又想起来自己后来去论坛里翻帖子,看到用代码生成按钮,不用鼠标拖动,左右点击按钮,尝试复制代码生成按钮,改参数,改名字,然后又行了的故事。就打开编辑器翻看旧工程的按钮代码,新建脚本,复制粘贴,重读代码。
第二次开发:
读着读着,想着把上一篇的脚本加在新脚本里,然后预想了一下,又要调整好几行代码位置,然后就懒了,再想想把新代码粘贴进旧脚本里,粘贴到一个位置,好像行,于是就这么办了。粘过去,在读着读着代码,删除了很多不用的代码。删完了,调整代码位置,结果又相当于重写一半。看到最终成果才知道,之前的代码位置横竖躲不过。简短的几行代码就是靠着排好的顺序执行的,这个顺序就是为了之前的目标服务的,现在加了新功能了,代码中间插入代码,原来的代码顺序肯定变化,如果单纯复制粘贴跑不了新功能,说明新代码内部也需要和旧代码传达信息,就得新代码中加进去旧代码,这样代码顺序就会变化。
第三次开发:
复制粘贴,调整顺序,测试运行,不通过,看日志没报错,不是初始化的问题,检查变量,变化,发现数字没改,原来是新旧变量不小心位置交换了,然后改回来。跑,不通过。再从头读代码,发现是起点超出范围了,应该从下标0开始,结果从-1开始了,就把另外一个变量成0,然后跑,不通过,然后再穷举,阅读函数,发现重复使用了变量,然后就声明了新的变量,然后删除之前位置的变量,加上新的变量,才替换了旧的重复的变量。
第四次开发:
运行,成功了。但是看不出来按钮点击变没变化,加了一点彩蛋,点击按钮,按钮汉字会变化。
壹.第一个变化数组
不多说,上代码,新建脚本,复制粘贴跑起来,点击预加载,产生方块,点击出院,方块消失。
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 j: number = 0;
protected k: number = 0;
/** 当脚本被实例后,会在第一帧更新前调用此函数 */
protected onStart(): void {
AssetUtil.asyncDownloadAsset("197386");
for (var j = 0; j < this.build.length; j++) {
this.build[j] = new ooh();
}
// 创建一个UI对象
let ui = UI.UserWidget.newObject();
// 创建一个画布组件
let rootCanvas = UI.Canvas.newObject()
rootCanvas.size = new Type.Vector2(1920, 1080);
rootCanvas.position = Type.Vector2.zero
// 将Ui的根画布设置为rootCanvas
ui.rootContent = rootCanvas
// 创建一个UI按钮添加到画布上
let flybtn = UI.StaleButton.newObject(rootCanvas)
flybtn.position = new Type.Vector2(1900, 600)
flybtn.size = new Type.Vector2(200, 100)
flybtn.text = "预加载方块"
flybtn.renderOpacity = 0.7
// 将UI桌面添加到屏幕上
ui.addToViewport(1)
flybtn.onClicked.add(() => {
flybtn.text = "this.i增加"
let obj = Gameplay.GameObject.spawn({
guid: "197386",
replicates: true,
transform: new Transform(new Vector(0, this.k * 100, this.k * 25),
new Rotation(0, 0, 0),
new Vector(1, 1, 1))
//写需要设置的Transform
});
this.in(obj);
this.k++;
flybtn.text = "this.i增加完毕"
setTimeout(() => {
flybtn.text = "预加载方块"
}, 500);
})
// 又创建一个UI按钮添加到画布上
let outbtn = UI.StaleButton.newObject(rootCanvas)
// 按钮位置
outbtn.position = new Type.Vector2(1900, 100)
// 按钮大小
outbtn.size = new Type.Vector2(200, 100)
// 按钮名字
outbtn.text = "出院"
outbtn.onClicked.add(() => {
outbtn.text = "鸡汤来喽!"
var have: ooh = this.out();
have.n.setCollision(Type.PropertyStatus.Off, true);
have.n.setVisibility(Type.PropertyStatus.Off, true);
setTimeout(() => {
outbtn.text = "出院"
}, 500);
})
}
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;
// }
public out(): ooh {
var have = this.build[this.j];
this.j++;
return have;
}
}
实现了先产生的方块先消失。用两个按钮控制方块产生消失。
代码拆解
老熟人,预加载,声明clss数据格式,数组初始化,然后分配内存。
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 j: number = 0;
// protected k: number = 0;
/** 当脚本被实例后,会在第一帧更新前调用此函数 */
// protected onStart(): void {
AssetUtil.asyncDownloadAsset("197386");
for (var j = 0; j < this.build.length; j++) {
this.build[j] = new ooh();
}
按钮的预加载,也相当于声明UI数据格式,UI初始化,然后分配数据。因为UI的内存是自动分配的,所以直接放进预制的数据就行。
// 创建一个UI对象
let ui = UI.UserWidget.newObject();
// 创建一个画布组件
let rootCanvas = UI.Canvas.newObject()
rootCanvas.size = new Type.Vector2(1920, 1080);
rootCanvas.position = Type.Vector2.zero
// 将Ui的根画布设置为rootCanvas
ui.rootContent = rootCanvas
// 创建一个UI按钮添加到画布上
let flybtn = UI.StaleButton.newObject(rootCanvas)
flybtn.position = new Type.Vector2(1900, 600)
flybtn.size = new Type.Vector2(200, 100)
flybtn.text = "预加载方块"
flybtn.renderOpacity = 0.7
按钮预加载完,进行显示,眼见为实。1是图层层级,就类似与PPT的置于上一层下一层这样的图层覆盖。但是第1层级的图层能覆盖第10层级的图层还是10层级的图层覆盖第1层级的图层,我还得穷举试试。
// flybtn.position = new Type.Vector2(1900, 600)
// flybtn.size = new Type.Vector2(200, 100)
// flybtn.text = "预加载方块"
// flybtn.renderOpacity = 0.7
// 将UI桌面添加到屏幕上
ui.addToViewport(1)
// flybtn.onClicked.add(() => {
// flybtn.text = "this.i增加"
按钮点击时发生的事情
flybtn.onClicked.add(() => {
flybtn.text = "this.i增加"
let obj = Gameplay.GameObject.spawn({
guid: "197386",
replicates: true,
transform: new Transform(new Vector(0, this.k * 100, this.k * 25),
new Rotation(0, 0, 0),
new Vector(1, 1, 1))
//写需要设置的Transform
});
this.in(obj);
this.k++;
flybtn.text = "this.i增加完毕"
setTimeout(() => {
flybtn.text = "预加载方块"
}, 500);
})
另一个按钮的预加载和按钮点击之后的事情
// 又创建一个UI按钮添加到画布上
let outbtn = UI.StaleButton.newObject(rootCanvas)
// 按钮位置
outbtn.position = new Type.Vector2(1900, 100)
// 按钮大小
outbtn.size = new Type.Vector2(200, 100)
// 按钮名字
outbtn.text = "出院"
outbtn.onClicked.add(() => {
outbtn.text = "鸡汤来喽!"
var have: ooh = this.out();
have.n.setCollision(Type.PropertyStatus.Off, true);
have.n.setVisibility(Type.PropertyStatus.Off, true);
setTimeout(() => {
outbtn.text = "出院"
}, 500);
})
熟悉的包装代码,注意out 函数的版本变化。
第一个out函数是在完成第一个自由数组的栈,实现倒退读取的功能。
第二个out函数是在完成第一个优化数组的冲击波,实现顺序读取的功能。
第三个out函数是在完成第一个变化数组的排队,增加与消失不使用同一个变量,这样就不会像第一个靠谱数组的栈那样先产生的先消失,实现增加读取不干扰的功能。
i--到i++再到j++的背后是需求的变化。
增减趋势改变到起终点改变再到数据次序改变。
通过穷举已有的代码,排列组合。满足需求,到头来发现不过是为了证明,满足需求其实就是修改字母,这两个本来不相关的事情可以是相关的,有手就行,用精力穷举。优化的真相。
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;
// }
public out(): ooh {
var have = this.build[this.j];
this.j++;
return have;
}
贰.所需语法
按钮
按钮要挂在根节点rootCanvas ,按钮的根节点读取器要塞进去一个目标根节点, 根节点要自己分配内存 UI.Canvas.newObject(),
// 创建一个UI对象
let ui = UI.UserWidget.newObject();
// 创建一个画布组件
let rootCanvas = UI.Canvas.newObject()
rootCanvas.size = new Type.Vector2(1920, 1080);
rootCanvas.position = Type.Vector2.zero
// 将Ui的根画布设置为rootCanvas
ui.rootContent = rootCanvas
// 创建一个UI按钮添加到画布上
let flybtn = UI.StaleButton.newObject(rootCanvas)
flybtn.position = new Type.Vector2(1900, 600)
flybtn.size = new Type.Vector2(200, 100)
flybtn.text = "预加载方块"
flybtn.renderOpacity = 0.7
// 将UI桌面添加到屏幕上
ui.addToViewport(1)
flybtn.onClicked.add(() => {
flybtn.text = "this.i增加"
// let obj = Gameplay.GameObject.spawn({
// guid: "197386",
// replicates: true,
// transform: new Transform(new Vector(0, this.k * 100, this.k * 25),
// new Rotation(0, 0, 0),
// new Vector(1, 1, 1))
// //写需要设置的Transform
// });
// this.in(obj);
// this.k++;
flybtn.text = "this.i增加完毕"
setTimeout(() => {
flybtn.text = "预加载方块"
}, 500);
})
按钮文本可以随时修改,点击按钮,按钮文本立即修改了,延迟500毫秒后,按钮恢复原来的文案。按钮修改速度很快,所以没有延时器函数,按钮即使点击,也难看清按钮的变化文案。
无,可以改改之前代码的参数然后看看有什么效果,自己产生优化需求,改改代码满足自己的需求。
能不复习就不复习,复习是为了巩固知识,巩固还是为了使用满足需求,但是没有见到需求,复习有啥用?不过,这些知识什么时候用其实我也不知道,巩固知识的时候可能会现场灵感乍现知道新用法。只能说不是为了单纯巩固而巩固,自己无中生有产生需求罢了。
叁.应用说明
游戏交互上,
按钮改成其他的触发器,游戏关卡玩通一关,阶梯向上生长,同时原来下面几层的阶梯消失,以此进行场景交互。
攻击效果上,冲击波边产生边消失,就是类似于地刺变成冲击波一样,改改数字参数,阶梯越往后,阶梯方块越大。阶梯前面产生,同时后边消失。视觉上默认看到的是一个物体,然后一个物体变大且向前平移。
开发测试上
按钮点击相当于产生数据,这个例子是点击一次产生一个方块的位置数据。可以改成产生其他的大小数据,或者改成i++,生成一些不同数字,检测数据
插件拓展上
可以去掉按钮,变成射线检测,直接鼠标点击,绘制物体,记录物体绘制顺序,然后一键导出数组成为游戏冲击波,或者地刺,实现自定义地刺,自定义冲击波,不用数学函数。
肆.相关参考链接 (返回主站)
普通大学生“数据结构”课作业笔记#000-目录-逻辑结构与存储结构 口袋方舟论坛|面向全年龄的UGC互动内容平台与交流社区 (ark.online)
|