Sprite Kit продолжает звонить первым, если заявление

Я программирую игру для спрайтов, и у меня есть 8 чисел, которые появляются в верхней части экрана и падают вниз. каждый номер имеет свои настройки, например, если вызывается номер 1, он добавляет 1 к счету, если вызывается 5, он удаляет жизнь. Теперь это происходит всякий раз, когда число входит в контакт с кораблем, но вместо того, чтобы вызывать метод, для которого оно предназначено, он вызывает первый, поэтому он охлаждается на счете ++. Вот мой код, надеюсь, вы понимаете это.

- (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 ((firstBody.categoryBitMask & shipCategory) != 0 &&
(secondBody.categoryBitMask & DonutCategory) != 0)
{
//score
score ++;
scorelabel.text = [NSString stringWithFormat:@"%d",score];
//highscore
if (score > HighScore) {
[[NSUserDefaults standardUserDefaults] setObject:[NSNumber numberWithInt:score] forKey:@"HighScore"];
[[NSUserDefaults standardUserDefaults] synchronize];
HighScore  = [[NSUserDefaults standardUserDefaults] integerForKey:@"HighScore"];
highscorelabel.text = [NSString stringWithFormat:@"%.f",HighScore];
}}
else if ((firstBody.categoryBitMask & shipCategory) != 0 &&
(secondBody.categoryBitMask & PizzaCategory) != 0)
{
//score
score ++;
scorelabel.text = [NSString stringWithFormat:@"%d",score];
//highscore
if (score > HighScore) {
[[NSUserDefaults standardUserDefaults] setObject:[NSNumber numberWithInt:score] forKey:@"HighScore"];
[[NSUserDefaults standardUserDefaults] synchronize];
HighScore  = [[NSUserDefaults standardUserDefaults] integerForKey:@"HighScore"];
highscorelabel.text = [NSString stringWithFormat:@"%.f",HighScore];
}}
else if ((firstBody.categoryBitMask & shipCategory) != 0 &&
(secondBody.categoryBitMask & ChocolateCategory) != 0)
{
//score
score ++;
scorelabel.text = [NSString stringWithFormat:@"%d",score];
//highscore
if (score > HighScore) {
[[NSUserDefaults standardUserDefaults] setObject:[NSNumber numberWithInt:score] forKey:@"HighScore"];
[[NSUserDefaults standardUserDefaults] synchronize];
HighScore  = [[NSUserDefaults standardUserDefaults] integerForKey:@"HighScore"];
highscorelabel.text = [NSString stringWithFormat:@"%.f",HighScore];
}}

else if ((firstBody.categoryBitMask & shipCategory) != 0 &&
(secondBody.categoryBitMask & SoftCategory) != 0)
{
//score
score ++;
Life ++;
scorelabel.text = [NSString stringWithFormat:@"%d",score];
//highscore
if (score > HighScore) {
[[NSUserDefaults standardUserDefaults] setObject:[NSNumber numberWithInt:score] forKey:@"HighScore"];
[[NSUserDefaults standardUserDefaults] synchronize];
HighScore  = [[NSUserDefaults standardUserDefaults] integerForKey:@"HighScore"];
highscorelabel.text = [NSString stringWithFormat:@"%.f",HighScore];
}

}

else if ((firstBody.categoryBitMask & shipCategory) != 0 &&
(secondBody.categoryBitMask & AppleCategory) != 0)
{
Life--;
lifelabel.text = [NSString stringWithFormat:@"%d",Life];
if(Life <= 0) {
SKTransition *reveal = [SKTransition flipHorizontalWithDuration:0.5];
SKScene * gameOverScene = [[GameOverScene alloc] initWithSize:self.size];
[self.view presentScene:gameOverScene transition: reveal];

}

}

else if ((firstBody.categoryBitMask & shipCategory) != 0 &&
(secondBody.categoryBitMask & GrapeCategory) != 0)
{
//lifes
Life--;
lifelabel.text = [NSString stringWithFormat:@"%d",Life];
if(Life <= 0) {
SKTransition *reveal = [SKTransition flipHorizontalWithDuration:0.5];
SKScene * gameOverScene = [[GameOverScene alloc] initWithSize:self.size];
[self.view presentScene:gameOverScene transition: reveal];

}

}

else if ((firstBody.categoryBitMask & shipCategory) != 0 &&
(secondBody.categoryBitMask & OrangeCategory) != 0)
{
//lifes
Life--;
lifelabel.text = [NSString stringWithFormat:@"%d",Life];
if(Life <= 0) {
SKTransition *reveal = [SKTransition flipHorizontalWithDuration:0.5];
SKScene * gameOverScene = [[GameOverScene alloc] initWithSize:self.size];
[self.view presentScene:gameOverScene transition: reveal];

}

}

else if ((firstBody.categoryBitMask & shipCategory) != 0 &&
(secondBody.categoryBitMask & BananaCategory) != 0)
{
//lifes
Life--;
lifelabel.text = [NSString stringWithFormat:@"%d",Life];
if(Life <= 0) {
SKTransition *reveal = [SKTransition flipHorizontalWithDuration:0.5];
SKScene * gameOverScene = [[GameOverScene alloc] initWithSize:self.size];
[self.view presentScene:gameOverScene transition: reveal];

}

}

}

Вот этот корабль и физика № 1

-(void)addShip
{
//initalizing spaceship node
ship = [SKSpriteNode spriteNodeWithImageNamed:@"Spaceship"];
[ship setScale:0.5];
ship.zRotation = - M_PI / 2;

//Adding SpriteKit physicsBody for collision detection
ship.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:ship.size];
ship.physicsBody.categoryBitMask = shipCategory;
ship.physicsBody.dynamic = YES;
ship.physicsBody.contactTestBitMask = DonutCategory | PizzaCategory | ChocolateCategory | SoftCategory | AppleCategory | GrapeCategory | OrangeCategory | BananaCategory;
ship.physicsBody.collisionBitMask = 0;
ship.physicsBody.usesPreciseCollisionDetection = YES;
ship.name = @"ship";
ship.position = CGPointMake(260,30);
actionMoveRight = [SKAction moveByX:-30 y:0 duration:.2];
actionMoveLeft = [SKAction moveByX:30 y:0 duration:.2];

[self addChild:ship];
}

- (void)shoot1 //donut
{
// Sprite Kit knows that we are working with images so we don't need to pass the image’s                extension
Donut = [SKSpriteNode spriteNodeWithImageNamed:@"1"];
[Donut setScale:0.15];
// Position the Donut outside the top
int r = arc4random() % 300;
Donut.position = CGPointMake(20 + r, self.size.height + Donut.size.height/2);Donut.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:Donut.size];
Donut.physicsBody.categoryBitMask = DonutCategory;
Donut.physicsBody.dynamic = YES;
Donut.physicsBody.contactTestBitMask = shipCategory;
Donut.physicsBody.collisionBitMask = 0;
Donut.physicsBody.usesPreciseCollisionDetection = YES;

// Add the Dount to the scene
[self addChild:Donut];

// Here is the Magic
// Run a sequence
[Donut runAction:[SKAction sequence:@[
// Move the Dount and Specify the animation time
[SKAction moveByX:0 y:-(self.size.height + Donut.size.height) duration:5],
// When the Dount is outside the bottom
// The Dount will disappear
[SKAction removeFromParent]]]];
}

Категории я не знаю много об этом!

static const uint32_t shipCategory =  0x1 << 1;
static const uint32_t DonutCategory =  0x1 << 2;
static const uint32_t PizzaCategory =  0x1 << 2;
static const uint32_t ChocolateCategory =  0x1 << 2;
static const uint32_t SoftCategory =  0x1 << 2;
static const uint32_t AppleCategory =  0x1 << 2;
static const uint32_t GrapeCategory =  0x1 << 2;
static const uint32_t OrangeCategory =  0x1 << 2;
static const uint32_t BananaCategory =  0x1 << 2;

1

Решение

Ваши битовые маски для всех категорий, кроме корабля, одинаковы, поэтому ваше первое условие всегда верно.

Измените ваши битовые маски, чтобы они отличались друг от друга:

static const uint32_t shipCategory =  1;
static const uint32_t DonutCategory =  2;
static const uint32_t PizzaCategory =  4;
static const uint32_t ChocolateCategory =  8;
static const uint32_t SoftCategory =  16;
static const uint32_t AppleCategory =  32;
static const uint32_t GrapeCategory =  64;
static const uint32_t OrangeCategory =  128;
static const uint32_t BananaCategory =  256;

Убедитесь, что целые числа имеют степень 2. Это для удобства чтения, вы не знаете много о битовых масках.

Битовые маски 32-битные, поэтому вы можете использовать до 32 категорий (231) — в будущем, возможно, вы захотите начать использовать побитовый оператор, чтобы легко отображать даже большие числа в битовых масках, как это делает другой совет. Итак, при расширении вашего собственного кода будут использоваться те же значения, что и выше:

static const uint32_t shipCategory =  0x1 << 0;  // 1
static const uint32_t DonutCategory =  0x1 << 1;
static const uint32_t PizzaCategory =  0x1 << 2;
static const uint32_t ChocolateCategory =  0x1 << 3;
static const uint32_t SoftCategory =  0x1 << 4;
static const uint32_t AppleCategory =  0x1 << 5;
static const uint32_t GrapeCategory =  0x1 << 6;
static const uint32_t OrangeCategory =  0x1 << 7;
static const uint32_t BananaCategory =  0x1 << 8; // 256
2

Другие решения

Все ваши категории имеют одинаковое значение, поэтому все они дадут одинаковый результат.

Сделай это вместо

enum Category
{
shipCategory  = 0x1,                      // 00000001
donutCategory = shipCategory << 1,        // 00000010
pizzaCategory = donutCategory << 1,       // 00000100
chocolateCategory = pizzaCategory << 1,   // 00001000
// ... and so on ...
};
0

По вопросам рекламы [email protected]