Я создаю игру с использованием комплекта спрайтов, но у меня, кажется, есть проблемы с bodyWithTexture
при использовании его с коллизиями. bodyWithRectangle
и circleOfRadius
Работайте хорошо, но когда я использую bodyWithTexture
, это выглядит как метод didBeginContact
, который вызывается более одного раза.Sprite Kit Цель C
вот пример кода я использую
-(SKNode *) createPlayer
{
level3Player = [SKNode node];
player3Sprite = [SKSpriteNode spriteNodeWithImageNamed:@"character.png"];
level3Player.physicsBody = [SKPhysicsBody bodyWithCircleOfRadius:player3Sprite.size.width/2];
level3Player.physicsBody.categoryBitMask = playerCategory3;
level3Player.physicsBody.contactTestBitMask = platformCategory3 | rockCategory;
[level3Player setPosition:CGPointMake(self.size.height/2, screenHeightL3 *11)];
level3Player.physicsBody.affectedByGravity = NO;
player3Sprite.physicsBody.dynamic = YES;
level3Player.zPosition = 2;
[level3Player setScale:0.6];
[level3Player addChild:player3Sprite];
return level3Player;
}
-(void) addRocksL3
{
int randomNumber = arc4random_uniform(300);
rock1 = [SKSpriteNode spriteNodeWithImageNamed:@"AsteroidFire.png"];
rock1.physicsBody = [SKPhysicsBody bodyWithCircleOfRadius:rock1.size.width/2];
rock1.position = CGPointMake(self.size.width * 3, randomNumber);
rock1.physicsBody.categoryBitMask = rockCategory;
rock1.physicsBody.contactTestBitMask = playerCategory3;
rock1.physicsBody.dynamic = NO;
rock1.physicsBody.affectedByGravity = NO;
rock1.zPosition = 2;
[rock1 setScale:0.3];
[foregroundLayerL3 addChild:rock1];
[self addChild:rock1];
}
-(void) didBeginContact:(SKPhysicsContact*) contact
{
SKPhysicsBody *firstBody, *secondBody;
if(contact.bodyA.categoryBitMask < contact.bodyB.categoryBitMask)
{
firstBody = contact.bodyA;
secondBody = contact.bodyB;
}
else
{
firstBody = contact.bodyB;
secondBody = contact.bodyA;
}
if((secondBody.categoryBitMask == platformCategory3) | redPlatformCategory)
{
level3Player.physicsBody.velocity = CGVectorMake(0, 100);
level3Player.physicsBody.affectedByGravity = YES;
player3Sprite.texture = [SKTexture textureWithImageNamed:@"goo5.png"];
SKAction *sound1 = [SKAction playSoundFileNamed:@"squish.wav" waitForCompletion:NO];
[self runAction:sound1];
gestureRec3.enabled = YES;
}
if(secondBody.categoryBitMask == rockCategory)
{
gestureRec3.enabled = YES;
playerL3.physicsBody.velocity = CGVectorMake(0, 200);
SKAction *playSound = [SKAction playSoundFileNamed:@"Hurt.wav" waitForCompletion:NO];
[self runAction:playSound];
hitCountL3++;
}
switch (hitCountL3)
{
case 1:
[health1Level3 removeFromParent];
[self healthNodelevel31];
break;
case 2:
[hit1L3 removeFromParent];
[self healthNodeLevel32];
break;
case 3:
[hit2L3 removeFromParent];
player3Sprite.texture = [SKTexture textureWithImageNamed:@"splat.png"];
[self gameOverSplatLevel3];
didDie3 = true;
SKAction *playSplat = [SKAction playSoundFileNamed:@"splat.wav" waitForCompletion:NO];
[self runAction:playSplat];
break;
}
, когда я использую этот код моего персонаж будет иногда принимать 1 хит, а иногда принимает все 3 хита, когда я сталкиваюсь с породой. Я мог бы использовать circleOfRadius, который отлично работает, но это не то, что я действительно ищу. Есть ли в любом случае я мог бы использовать bodyWithTexture, чтобы мой персонаж принимал только 1 удар каждый раз?
Это не выглядит как действительный код проверки битовой. – trojanfoe
Откуда берутся cirlceOfRadius или bodyWithRectangle? Вы даже не показываете, как вы создаете свой узел символов. –
Просто добавил мои персонажи и методы рок. Я поставил NSLogs во все мои столкновения, и, похоже, код работает. как я уже сказал, столкновение, похоже, отлично работает с bodyWithRect/circeOfRadius, но не с телом с телом? – Hunter23