Ios 精灵套件中同时发生两次或更多碰撞

Ios 精灵套件中同时发生两次或更多碰撞,ios,iphone,objective-c,cocoa-touch,sprite-kit,Ios,Iphone,Objective C,Cocoa Touch,Sprite Kit,我有一个小问题,自己也不知道解决办法。我正在使用精灵套件处理碰撞,当我的英雄同时与两个物体碰撞(例如与地面和空中的立方体碰撞)时,我遇到了一个问题 我得到了一些布尔值,可以告诉我们英雄什么时候在跳跃,什么时候在高速奔跑,什么时候跑得慢(例如,当他撞上一堵由立方体组成的墙时) 在最后一个例子中,我的布尔人变得疯狂,有时我的英雄只是越过立方体,因为速度不会减慢。有时布尔值“正在跳跃”也会激活,所以在resume中它会变得疯狂,我认为这是因为处理碰撞方法(didBeginContact)只允许两个接触

我有一个小问题,自己也不知道解决办法。我正在使用精灵套件处理碰撞,当我的英雄同时与两个物体碰撞(例如与地面和空中的立方体碰撞)时,我遇到了一个问题

我得到了一些布尔值,可以告诉我们英雄什么时候在跳跃,什么时候在高速奔跑,什么时候跑得慢(例如,当他撞上一堵由立方体组成的墙时)

在最后一个例子中,我的布尔人变得疯狂,有时我的英雄只是越过立方体,因为速度不会减慢。有时布尔值“正在跳跃”也会激活,所以在resume中它会变得疯狂,我认为这是因为处理碰撞方法(didBeginContact)只允许两个接触体,contact.bodyA和contact.bodyB


我想知道我是否可以编辑一个文件来添加contact.bodyC,我需要编辑什么文件?如果是的话,我会处理这个问题,我认为有了三个联络机构,我就能对所有可能的情况进行编程。如果不是这样,我想我将不得不移除那些立方体墙或更改它们的类别位掩码…

也许排队等待联系人,然后处理in-update是您所需要的。例如:

声明一个名为NSMutableArray*\u contactQueue的实例变量; 将联系人添加到阵列:

-(void) didBeginContact:(SKPhysicsContact *)contact
{
    [_contactQueue addObject:contact];
}
创建一种方法来处理与游戏同步的每个联系人:

-(void)processContactsForUpdate:(NSTimeInterval)currentTime
{
    for (SKPhysicsContact * contact in [_contactQueue copy]) {
        [self handleContact:contact];
        [_contactQueue removeObject:contact];
    }
}
从更新中调用此方法:

[self processContactsForUpdate:currentTime];
然后实现处理联系人的handle方法

-(void) handleContact:(SKPhysicsContact *)contact
{
    // What you are doing in your current didBeginContact method
}

您只能处理两个实体的接触,但通过这种方式,它与每个帧同步。我是在SpriteKit教程中了解到这一点的,该教程位于

,您可能需要排队等待联系人,然后处理in-update。例如:

声明一个名为NSMutableArray*\u contactQueue的实例变量; 将联系人添加到阵列:

-(void) didBeginContact:(SKPhysicsContact *)contact
{
    [_contactQueue addObject:contact];
}
创建一种方法来处理与游戏同步的每个联系人:

-(void)processContactsForUpdate:(NSTimeInterval)currentTime
{
    for (SKPhysicsContact * contact in [_contactQueue copy]) {
        [self handleContact:contact];
        [_contactQueue removeObject:contact];
    }
}
从更新中调用此方法:

[self processContactsForUpdate:currentTime];
然后实现处理联系人的handle方法

-(void) handleContact:(SKPhysicsContact *)contact
{
    // What you are doing in your current didBeginContact method
}

您只能处理两个实体的接触,但通过这种方式,它与每个帧同步。我是在SpriteKit教程中了解到这一点的,该教程位于

,您可能需要排队等待联系人,然后处理in-update。例如:

声明一个名为NSMutableArray*\u contactQueue的实例变量; 将联系人添加到阵列:

-(void) didBeginContact:(SKPhysicsContact *)contact
{
    [_contactQueue addObject:contact];
}
创建一种方法来处理与游戏同步的每个联系人:

-(void)processContactsForUpdate:(NSTimeInterval)currentTime
{
    for (SKPhysicsContact * contact in [_contactQueue copy]) {
        [self handleContact:contact];
        [_contactQueue removeObject:contact];
    }
}
从更新中调用此方法:

[self processContactsForUpdate:currentTime];
然后实现处理联系人的handle方法

-(void) handleContact:(SKPhysicsContact *)contact
{
    // What you are doing in your current didBeginContact method
}

您只能处理两个实体的接触,但通过这种方式,它与每个帧同步。我是在SpriteKit教程中了解到这一点的,该教程位于

,您可能需要排队等待联系人,然后处理in-update。例如:

声明一个名为NSMutableArray*\u contactQueue的实例变量; 将联系人添加到阵列:

-(void) didBeginContact:(SKPhysicsContact *)contact
{
    [_contactQueue addObject:contact];
}
创建一种方法来处理与游戏同步的每个联系人:

-(void)processContactsForUpdate:(NSTimeInterval)currentTime
{
    for (SKPhysicsContact * contact in [_contactQueue copy]) {
        [self handleContact:contact];
        [_contactQueue removeObject:contact];
    }
}
从更新中调用此方法:

[self processContactsForUpdate:currentTime];
然后实现处理联系人的handle方法

-(void) handleContact:(SKPhysicsContact *)contact
{
    // What you are doing in your current didBeginContact method
}

您只能处理两个实体的接触,但通过这种方式,它与每个帧同步。我在

的SpriteKit教程中了解到这一点,也许你应该设置bool标志,一次只允许一次碰撞,这样你就可以处理一次又一次的碰撞也许你应该设置bool标志,一次只允许一次碰撞,这样你就可以处理一次又一次的碰撞可以一个接一个地处理可能你应该设置bool标志,一次只允许一次碰撞,这样你就可以处理一个接一个的碰撞