如何返回碰撞到的多个实例
yunzl 发表于 2018-05-03 05:30:31 647

我知道,有些人对于碰撞函数只返回一个实例感觉整个人都废了

其实,the simple,从gm很古老的版本,就有了解决方案


我们需要的只是一个函数

instance_deactivate_object(obj)//解散某实例

聪明的朋友们可能已经知道该怎么做了


接下来的内容提供给不怎么聪明的朋友
首先我们需要了解到,被解散的实例是无法被碰撞到的
然后我们要做的就是,
检测一次碰撞函数,如果返回了id,则解散该id,并把id储存起来
重复这个过程直到不返回id为止,并激活储存的所有id


GML:

/// @description collision_multiple(x, y, object)
/// @function collision_multiple
/// @param x
/// @param y
/// @param object
///返回与对象在指定坐标碰撞的所有对象的dslist列表

var x1 = argument0
var y1 = argument1;
var obj = argument2;
var list = ds_list_create();

do
{
    var  hit = instance_place(x1, y1, obj);
    if (hit != noone)
    {
        ///把碰撞到的实例储存进列表里
        ///并解散他
        ///直到碰撞不到为止
        ds_list_add(list, hit);
        instance_deactivate_object(hit);
    }
} until (hit == noone);

///激活被解散的实例
if (ds_list_size(list) > 0)
for (var i = 0; i < ds_list_size(list); i++)
{
    instance_activate_object(list[|i]);
}
///返回列表
return list;

如果你把

instance_place

换成别的,也可以应用于其他碰撞函数


是不是很简单(↓明示)

最新回复 (3)
  • 晒死js 发表于 2018-05-04 08:11:21
    0 2
    这样会不会因为解散而出现些奇妙bug。。
  • yunzl 发表于 2018-05-05 05:13:41
    0 3
    晒死js 这样会不会因为解散而出现些奇妙bug。。
    只有一个要求,不能在draw里使用,否则会闪烁
  • MikuScarlet 发表于 2018-09-10 02:56:56
    0 4

    var list;

    with obj {

    if id=other.id continue;

    if instance_place(x,y,other) ds_list_add(list,id)

    }

    我是这么做的。