2014-12-30 2 views
0

Я делаю игру, в которой есть игрок и несколько противников (по крайней мере, это важно сейчас). У меня есть и NSTimer, который вызывает метод, который вызывает класс Enemy, который порождает врага каждые x раз. Метод вызывает метод spawn на стороне класса Enemy, который возвращает SKSpriteNode, который генерируется в GameScene.Как отслеживать отдельные экземпляры одного и того же SKSpriteNode

Теперь, когда Враг падает с неба (это то, что он делает: он появляется сверху, а затем падает), Его имя @ "fallEnemy", и всякий раз, когда он попадает на землю, это имя обновляется до @ «staticEnemy» (я делаю это с помощью контактных бит-масок). Я хочу, чтобы это произошло: всякий раз, когда противник еще не ударил по земле и ударил игрока до того, как он ударился о землю, я хочу, чтобы он убил игрока и когда враг уже ударил по земле, и игрок коснулся его, я хочу, чтобы игрок умер.

Я делаю это, проверяя (с утверждением If), если имя врага @ «fallEnemy», когда игрок связывается с противником. Проблема здесь: в моей GameScene у меня есть вызов свойства aNewEnemy (SKSpriteNode), и он устанавливается равным SKSpriteNode, который класс Enemy возвращает каждый раз, когда он вызывается NSTimer. Затем, когда враг попадает в землю, имя меняется на @ «staticEnemy» на некоторое время, пока не появится новый враг, потому что тогда имя возвращается к @ «fallEnemy». Я полностью понимаю, почему это происходит, потому что это очень очевидно, но у меня просто нет другого способа сделать это. У кого-нибудь есть предложения? Вероятно, есть намного более простой способ сделать это, с которым я не знаком.

Спасибо!

EDIT:

Я отправил код здесь:

-(void)createSceneContents { 
    self.spawningSpeed = 2.5; 
self.enemySpawnTimer = [NSTimer scheduledTimerWithTimeInterval:self.spawningSpeed 
                 target:self 
                 selector:@selector(spawnObject) 
                 userInfo:nil 
                 repeats:YES]; 
} 

Есть больше вещей в методе createSceneContents но это не важно.

-(void)spawnObject { 
if (self.isPaused == NO){ 


     self.enemyData = [[Enemy alloc]init]; 

    self.aNewEnemy = [self.enemyData createEnemyWithSize:self.playerSize andWidth:self.frame.size.width andHeight:self.frame.size.height + self.player.position.y]; 
     self.aNewEnemy.physicsBody.allowsRotation = NO; 
     self.aNewEnemy.physicsBody.categoryBitMask = self.enemyCategory; 
     self.aNewEnemy.physicsBody.contactTestBitMask = self.enemyCategory | self.playerCategory | self.edgeCategory | self.bottomCategory; 
     [self.world addChild:self.aNewEnemy]; 

    self.playerScore += 10; 
    NSString *score = [NSString stringWithFormat:@"%i", self.playerScore]; 
    self.actualScore.text = score; 

} 
} 

В Enemy.m:

-(SKSpriteNode *)createEnemyWithSize:(float)size andWidth:(float)width andHeight:(float)height { 
    self.enemy = [SKSpriteNode spriteNodeWithImageNamed:@"block.png"]; 
    self.enemy.size = CGSizeMake(size - 5, size - 5); 

    self.enemy.name = @"fallingEnemy"; 
    self.enemy.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:CGSizeMake(size - 1, size - 1)]; 
    self.enemy.physicsBody.restitution = 0; 
    int randomSection = arc4random_uniform(7); 
    switch (randomSection) { 
    case 0: 

     self.enemy.position = CGPointMake(2.5 + self.enemy.size.width/2, height-5); 

     break; 
    case 1: 


     self.enemy.position = CGPointMake(width/7 + self.enemy.size.width/2, height-5); 

     break; 
    case 2: 

     self.enemy.position = CGPointMake((width/7*2) + self.enemy.size.width/2, height-5); 

     break; 
    case 3: 

     self.enemy.position = CGPointMake((width/7*3) + self.enemy.size.width/2, height-5); 

     break; 
    case 4: 

     self.enemy.position = CGPointMake((width/7*4) + self.enemy.size.width/2, height-5); 

     break; 
    case 5: 

     self.enemy.position = CGPointMake((width/7*5) + self.enemy.size.width/2, height-5); 

     break; 
    case 6: 

     self.enemy.position = CGPointMake((width/7*6) + self.enemy.size.width/2, height-5); 


     break; 
    default: 

     break; 
} 
return self.enemy; 
} 

Это вызывается в didBeginContact когда враг касается земли или другого врага:

-(void)changeState { 

    self.enemy.physicsBody.dynamic = NO; 
    self.isFalling = NO; 
    self.enemy.name = @"staticEnemy"; 

} 

Теперь, как сделать так, чтобы отслеживать индивидуальные врагов в GameScene?

+0

Это звучит как основная объектно-ориентированная проблема. Вы понимаете разницу между экземплярами класса и фабриками классов (типы классов)? –

+0

Да, я тоже понимаю, что я сделал не так, я просто не знаю, как это сделать правильно – SemAllush

+0

опубликуйте свой код и не используйте nstimer: http: // stackoverflow.com/a/23978854/201863 – LearnCocos2D

ответ

1

SpriteKit предоставляет несколько способов доступа к узлам в сцене (например, nodeAtPoint, childNodeWithName, objectForKeyedSubscript и enumerateChildNodesWithName), поэтому нет необходимости использовать свойство/Ивар для отслеживания узлов для большинства обстоятельств.

В частности, вы можете определить, если противник был вовлечен в контактном случае (в didBeginContact), проверив categoryBitMask свойство bodyA и bodyB. Затем вы можете использовать свойство node тела для доступа к узлу спрайта и использовать узел спрайта для изменения имени врага на @ «staticEnemy» и сбросить бит «земля» в тела, чтобы он больше не запускал контактное событие с помощью земля.

+0

Но как я могу воздействовать на 1 врага, не затрагивая других врагов в сцене – SemAllush

+0

Как вы хотите повлиять на враг? Вы можете сделать свое игровое событие управляемым, где оно реагирует на различные события. Например, когда таймер запускается, вы добавляете противника на сцену (просто добавьте его в сцену и не нужно отслеживать его с помощью self.enemy). Когда контакт сделан, вы определяете, какой противник был вовлечен, и измените его на статичность. – 0x141E

+0

Да, это полезно, я собираюсь попробовать это спасибо – SemAllush

Смежные вопросы