该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
感谢@sunyubokkkkk 的建议,这里更新一下调用了创建事件和销毁事件的新代码,现在在步事件中不需要用那个key_start自己写创建和销毁的代码了
另外为ObjectPool_checkIn脚本添加了对零参输入的兼容,不输入参数会跟instance_destroy一样直接销毁实例自己
————————————ObjectPool_checkOut————————————
//instance_create_depth一样的参数输入
var tx=argument0,ty=argument1,tdepth=argument2,tobj=argument3,tid
//以Object_index为索引在字典里找对应的对象池
var ObjectPool = ds_map_find_value(global.ObjectPool_map, tobj)
//如果没找到,就新建一个对象池堆栈
if is_undefined(ObjectPool){
ObjectPool=ds_stack_create()
global.ObjectPool_map[? tobj]=ObjectPool
}
//如果该对象池里没货了,就新建一个实例
if (ds_stack_empty(ObjectPool)){
tid=instance_create_depth(tx,ty,tdepth,tobj)
}
else{//否则从对象池堆栈里弹出一个空闲实例
tid=ds_stack_pop(ObjectPool)
if !instance_exists(tid) //如果这个实例没了(比如转移场景会清除所有冻结实例),就新建一个
tid=instance_create_depth(tx,ty,tdepth,tobj)
else{//否则解冻它并手动初始化值
instance_activate_object(tid)
tid.x=tx//初始化赋值
tid.y=ty
tid.depth=tdepth
}
}
//调用实例的创建事件
with(tid)event_perform(ev_create,0)
//返回可用实例id
return tid
————————————ObjectPool_checkIn————————————
//输入参数为用完了的实例id
var tid=id
if argument_count==1 tid=argument[0]
//调用实例的销毁事件
with(tid)event_perform(ev_destroy,0)
//找到对象池
var ObjectPool=global.ObjectPool_map[? tid.object_index]
//冻结实例之后把它放到对象池里
instance_deactivate_object(tid)
ds_stack_push(ObjectPool,tid)