目前在我使用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:编辑我的帖子以使问题更清楚。
答案 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