关于你的核心问题。
创建过多的shpere会导致一些球体视觉上的消失。
首先我们得清楚shpere的结构,它属于CShpere类。
在这类中的结构体如下图
一个CShpere结构体共拥有0x18个大小的字节。
其中这个0x18的字节存取了该球体的一些信息
Struct
1.inuse代表该球体是否被使用,值1和0分别代表两种。
2._pad似乎是一种所谓的是否已经被激活的状态(也就是说玩家站在蓝圈的时候)
3.handle是球体的句柄保存。
4.ID是球体被载入在内存上的ID。最先被创建的球体最先载入内存,从0开始编号。依次123……
5.RwSphere代表一个数组结构(也就是二图的信息)
它包括3D坐标XYZ的信息,和直径信息。
通过以上说明,我们知道游戏的球体一旦被创建就会被载入内存上。然后被分配ID从0开始,最先创建的球体为编号0(编号0-15)这个分配的内存必然是有大小限制的。
而一个CShpere结构体拥有0x18字节的大小(相当于创建一个球体就占用0x18字节)
而CShpere的内存总共被分配为0x180的大小。
所以0x180/0x18=0x10(0x10是16进制 它的10进制是16)
所以游戏最大能够创建的球体数量为16个,如果创建超过这个数量,比如编号15的球体为最后一块内存,创建第17个球体时,内存空间不够,不会出现所谓的第16号ID的球体,而是覆盖0号ID的球体。所以超过数量后,会导致游戏原来的一些球体在视觉上的消失。因为被覆盖了。
而main已经创建了很多任务剧情需要的触发任务的球体,而你又用cleo脚本创建自己的瞬移脚本,使用球体视觉标记。导致了载入内存的数量上限。
所以当你不需要使用该球体时,例如您的瞬移cleo可以多加一个判断,当玩家靠近球体坐标某个范围时,在去创建球体(即使上限,也因为是最后创建的,不会导致自己创建的消失。)
当您不需要这个球体时,例如玩家走远了,就使用03bd=1,destroy_sphere %1d%
03BD删除该球体 03BD实际上是把结构体中inUser的值改成0,也就是不使用的状态。那么该内存空间之后就会被释放。就不会占用多余空间。
其次我有个建议。我并不推荐单纯的写瞬移cleo需要使用所谓视觉上的球体,或者你可以直接写瞬移。例如走到门边自动传送过去。而不需要所谓的视觉效果。
其次,如果您非要使用视觉效果,推荐使用创建灯光和粒子特效的OP代替。