Я делаю игру, в которой есть игрок и несколько противников (по крайней мере, это важно сейчас). У меня есть и 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?
Это звучит как основная объектно-ориентированная проблема. Вы понимаете разницу между экземплярами класса и фабриками классов (типы классов)? –
Да, я тоже понимаю, что я сделал не так, я просто не знаю, как это сделать правильно – SemAllush
опубликуйте свой код и не используйте nstimer: http: // stackoverflow.com/a/23978854/201863 – LearnCocos2D