Spritekit游戏:如何更改对象显示联系人

时间:2014-03-18 05:23:59

标签: xcode5 sprite-kit game-physics

目前在我使用Spritekit的游戏中,当角色与对象发生碰撞时,它就会结束游戏。但我想更改一点,如果角色击中物体,物体可以被破碎,折断或弯曲,以便角色可以通过它。

现在,我将角色定义为:

        //Create physics body
    _Character.physicsBody = [SKPhysicsBody   bodyWithCircleOfRadius:_Character.size.height /2];
    _Character.physicsBody.dynamic = YES;
    _Character.physicsBody.allowsRotation = NO;
    _Character.physicsBody.categoryBitMask = CharacterCategory;
    _Character.physicsBody.collisionBitMask = worldCategory | ObjectCategory;
    _Character.physicsBody.contactTestBitMask = worldCategory | ObjectCategory;

其中worldCategory和ObjectCategory定义为:

    static const uint32_t worldCategory = 1 << 1;
    static const uint32_t ObjectCategory = 1 << 2;

我的对象被定义为没有动态对象,所以通常它不会改变

  SKSpriteNode* Object1 = [SKSpriteNode spriteNodeWithTexture:_ObjectTexture1];
    [Object1 setScale:2];
    Object1.position = CGPointMake(0, y);
    Object1.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:Object1.size];
    Object1.physicsBody.dynamic = NO;

    ...
        _ObjectTexture1 = [SKTexture textureWithImageNamed:@"Object1"];
        _ObjectTexture1.filteringMode = SKTextureFilteringNearest;

    ...  
        Object1.physicsBody.categoryBitMask = ObjectCategory;
        Object1.physicsBody.contactTestBitMask = CharacterCategory;

但我希望它在某些条件下不会改变,并在某些条件下改变(破裂,破碎或弯曲)。我们如何实现联系对象的行为?我在想每个条件都可以替换对象的图像,(所以我可以模拟破裂或破碎 - 可能,但是弯曲是相当困难的)。你的解决方案如何?我对游戏的东西很新,所以真的卡在这里。

Ps:编辑我的帖子以使问题更清楚。

1 个答案:

答案 0 :(得分:0)

您可以为您的角色节点创建子类,并在其上添加hitCount属性,或者只是将计数保存在角色节点的userData属性中。然后在联系代表中,您只需检查hitCount,增加它,相应地设置图像或根据条件需要结束游戏。

我猜是characterCategory的值为3。

-(void)didBeginContact:(SKPhysicsContact *)contact
{
    SKNode *firstBody;
    SKNode *secondBody;

    if (contact.bodyA.categoryBitMask < contact.bodyB.categoryBitMask)
    {
        firstBody = contact.bodyA.node;
        secondBody = contact.bodyB.node;
    }
    else
    {
        firstBody = contact.bodyB.node;
        secondBody = contact.bodyA.node;
    }

    if (firstBody.physicsBody.categoryBitMask == objectCategory && secondBody.physicsBody.categoryBitMask == characterCategory)
    {
        (CharacterSprite*) secondBody.hitCount++;
        int hitCount = (CharacterSprite*) secondBody.hitCount;

    switch(hitCount)
    {

        case 1: 
            secondBody.texture = [SKTexture textureWithImageNamed:@"cracked"];
            break;

        case 2:
            [secondBody removeFromParent];
            //whatever action you need to implement here.
            break;

        default:
            break;

    }

    }
}

这是CharacterSprite类的一个示例(或者您要添加hitCount属性的任何类。这是一个新文件。

#import <SpriteKit/SpriteKit.h>
@interface CharacterSprite : SKSpriteNode

@property NSInteger hitCount;

@end