2013-03-02 2 views
1

Я делаю приложение только для тестирования некоторых кодов. Есть корабль, который стреляет в врагов. Эти враги приходит вниз от верхней части экрана, и они добавляются с этим кодом (причина, почему его 4-х различных врагов в том, что все они имеют разные модели поведения)Добавить врага на сцене в пределах предела

-(void) addEnemy { 

int randomX = arc4random() % screenWidth; 

Enemy* anEnemy; 

int diceRoll = arc4random() % 4; 

if (diceRoll == 0) { 
    anEnemy = [Enemy createEnemy:@"enemy1" framesToAnimate:24]; 

} else if (diceRoll == 1) { 
    anEnemy = [Enemy createEnemy:@"enemy2" framesToAnimate:17]; 

} else if (diceRoll == 2) { 
    anEnemy = [Enemy createEnemy:@"enemy3" framesToAnimate:14]; 

} else if (diceRoll == 3) { 

    anEnemy = [Enemy createEnemy:@"enemy4" framesToAnimate:24]; 
} 

[self addChild:anEnemy z:depthLevelBelowBullet]; 
anEnemy.position = ccp (randomX , screenHeight + 200); 

numberOfEnemiesOnstage ++; 
} 

Враги добавляемый со случайным x- что означает, что враги иногда оказываются наполовину вне экрана. Как это:

Как ограничить х-значение с обеих сторон экрана, так что это не произойдет?

ответ

2

Вы не рассматриваете ширину изображения при вычислении случайной позиции x. Вы должны перенести объявление randomX и инициализацию после создания объектов противника, поэтому свойство textureRect будет правильно установлено.

int offset = (int)[Enemy textureRect].size.width/2; 
int randomX = (arc4random() % (screenWidth - (2 * offset))) + offset; 
+0

Я получаю предупреждение + Classmethod textureRect не нашел – Stumpp

+0

Ну, я предположил, что 'Enemy' был подкласс' CCSprite'. Вы должны поместить половину ширины изображения в переменную 'offset'. – Alexander

+0

Любая проблема с этим? – Alexander

0

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

-(void) addEnemy { 

int randomX = arc4random() % screenWidth; 

Enemy* anEnemy; 

int diceRoll = arc4random() % 4; 
int halfWidth; 

if (diceRoll == 0) { 
    anEnemy = [Enemy createEnemy:@"enemy1" framesToAnimate:24]; 
    halfWidth = anEnemy.contentSize.width/2; 

} else if (diceRoll == 1) { 
    anEnemy = [Enemy createEnemy:@"enemy2" framesToAnimate:17]; 
    halfWidth = anEnemy.contentSize.width/2; 

} else if (diceRoll == 2) { 
    anEnemy = [Enemy createEnemy:@"enemy3" framesToAnimate:14]; 
    halfWidth = anEnemy.contentSize.width/2; 

} else if (diceRoll == 3) { 

    anEnemy = [Enemy createEnemy:@"enemy4" framesToAnimate:24]; 
    halfWidth = anEnemy.contentSize.width/2; 
} 

if(randomX < halfWidth) { 
    randomX = halfWidth; 
} else { 
    randomX = randomX-halfWidth; 
} 

[self addChild:anEnemy z:depthLevelBelowBullet]; 
anEnemy.position = ccp (randomX , screenHeight + 200); 

numberOfEnemiesOnstage ++; 
} 
+0

Хм по какой-то причине каждый враг теперь появился в правой части экрана, так что мы могли видеть половину из них – Stumpp

+0

Извините, я сделал небольшую ошибку в коде, который я разместил, но я обновил его, чтобы отразить новый код. –

+0

Спасибо, что помогли мне, но я тоже не смог заставить этот код работать. Некоторые враги все еще появляются за пределами экрана:/Когда я стреляю в врагов, они не стреляют, если не пуля попадает в центр противника. Похоже, что у них нет никакого контента, просто видно. Может быть, это делает contentSize/2 не работать? Код для вражеского спрайта - 'enemySprite = [CCSprite spriteWithFile: [NSString stringWithFormat: @"% @ _ enemy0001.png ", theBaseImage]]; [self addChild: enemySprite]; enemySprite.position = ccp (0, 0); ' – Stumpp

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