你好! 我不知道是否有任何问题需要在这个子频道发布一个新的帖子来宣布重大更新,但是我有一个更新。 我终于解决了一个主要的问题:玩家和其他元素消失的问题。 然而,我遇到了几个问题,希望能得到一些建议。

我有三个问题:

  1. 是不是更好地利用深度或层来管理屏幕上精灵的组织方式(当前的撤销系统会在定义了深度和层时崩溃,我有对象同时具有不同的深度和层)?

  2. 如果我需要收集实例变量并将它们存储起来,是不是应该创建一个巨大的switch case语句来添加所有实例变量呢,还是有更好的方法?

  3. (空白)

实际代码:

我想再次感谢u/germxxx为我提供的代码,因为我意识到他们提供的基线几乎完全符合我的需求。 评论已添加到说明可能存在问题的位置

function save_all(_save_array){

if !is_array(_save_array) exit

var _index = array_length(_save_array)

_save_array[_index] = []

with (all) {

    `if self.persistent continue // 已包含以防止音乐加载器出现错误,但摄像头对象可能需要被包含?`

var _struct = {id, depth, // 与玩家和UI对象一起出现错误,因为我有设置了没有层的深度值,并且潜在的错误如果没有包含层,因为另一个对象使用层系统来确定哪个实例是活动的。

x, y, sprite_index, image_xscale, image_yscale} // 自身和全局变量未被编辑。想将struct分开,每个和array push从标准struct中分离出来,以便在with all之后添加一个switch / case语句,但这听起来...效率不高。

struct_foreach((self), method({_struct} ,function(_name, _value) {

_struct[$ _name] = _value

}))

array_push(_save_array[_index], _struct)

}

}

function load_all(_save_array) {

/* 在这里有很多问题;第一次撤销不会正确撤销最后一次移动,如果在移动之间多次撤销,则我认为撤销会停止在最近撤销的那一刻;例如:初始状态(状态0)->移动(状态1)->移动(状态2)->撤销(似乎状态2?似乎不工作)->撤销(状态1,工作)->移动(新状态2)->撤销重复(发送到状态1,并且永远不会到达状态0)

*/

`if(array_length(_save_array) = 0) exit`

var _data = array_pop(_save_array)

for (var i = 0; i < array_length(_data); i++) {

var _variables = struct_get_names(_data[i])

for (var j = 0; j < array_length(_variables); j++) {

var _name = _variables[j]

if _name = "id" continue

variable_instance_set(_data[i].id, _name, _data[i][$ _name])

}

}