2010-09-28 2 views
4

Мне удалось создать цель, случайно развернутую в верхней части экрана и исчезнувшую в нижней части экрана. Единственная проблема заключается в том, что цели только каждый раз перемещаются в одну фиксированную точку. Я хочу, чтобы они переместились в случайную точку в нижней части экрана. Есть идеи? Спасибо.Случайные направления Sprite

Вот код:

- (Недействительными) addTarget {

CCSpriteSheet *sheet = [CCSpriteSheet spriteSheetWithFile:@"meteorImgs.png" capacity:50]; 
[self addChild:sheet]; 
[[CCSpriteFrameCache sharedSpriteFrameCache] addSpriteFramesWithFile:@"metImg.plist"]; 

target = [CCSprite spriteWithFile:@"Frame2.png" rect:CGRectMake(0, 0, 60, 120)]; 


CGSize winSize = [[CCDirector sharedDirector] winSize]; 
int minY = target.contentSize.height/2; 
int maxY = winSize.width*1.5 - target.contentSize.height/2; 
int rangeY = maxY - minY; 
int actualY = (arc4random() % rangeY) + minY; 

target.position = ccp(actualY, target.contentSize.height*5); //- (-target.contentSize.height/2), actualY); 
[self addChild:target]; 

int minDuration = 2.0; 
int maxDuration = 4.0; 
int rangeDuration = maxDuration - minDuration; 
int actualDuration = (arc4random() % rangeDuration) + minDuration; 

id actionMove = [CCMoveTo actionWithDuration:actualDuration position:ccp(160,0)]; 
id actionMoveDone = [CCCallFuncN actionWithTarget:self selector:@selector(spriteMoveFinished:)]; 
[target runAction:[CCSequence actions:actionMove, actionMoveDone, nil]]; 

}

Предыдущая:

Здравствуйте,

Я Ray Wenderlich's code для этого. Мой вопрос в том, как сделать цели мишенью в верхней части экрана в портретном режиме и переместиться в нижнюю часть экрана. Независимо от того, что я меняю, ничего действительно не происходит. Прямо сейчас, как говорится в учебнике, цели перемещаются справа налево.

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

-(void)addTarget { 



CCSprite *target = [CCSprite spriteWithFile:@"dude_jump.png" 
      rect:CGRectMake(0, 0, 30, 60)]; 

CGSize winSize = [[CCDirector sharedDirector] winSize]; 
int minY = target.contentSize.width/2; 
int maxY = winSize.width - target.contentSize.width/2; 
int rangeY = maxY - minY; 
int actualY = (arc4random() % rangeY) + minY; 

target.position = ccp(winSize.width + (target.contentSize.width/2), actualY); 
[self addChild:target]; 

int minDuration = 2.0; 
int maxDuration = 4.0; 
int rangeDuration = maxDuration - minDuration; 
int actualDuration = (arc4random() % rangeDuration) + minDuration; 

id actionMove = [CCMoveTo actionWithDuration:actualDuration position:ccp(-target.contentSize.width/2, actualY)]; 

id actionMoveDone = [CCCallFuncN actionWithTarget:self selector:@selector(spriteMoveFinished:)]; 
[target runAction:[CCSequence actions:actionMove, actionMoveDone, nil]]; 
} 
+1

Hai guee, что здесь происходит? – Will

+0

Спасибо за умеренность. Гораздо лучше снять шум. :-) –

ответ

1

(честно говоря, это, вероятно, будет менее запутанным писал как еще один вопрос, но я отвечу здесь в любом случае: P)

Ваша линия:

id actionMove = [CCMoveTo actionWithDuration:actualDuration position:ccp(160,0)]; 

является то, что говорит спрайт где двигаться. Если вы хотите рандомизировать его, вам нужно убедиться, что в x-позиции есть какая-то случайная функция.

Функция arc4random() генерирует случайное число. Что вам нужно сделать, это немного математики, чтобы убедиться, что он выбирает позицию x, которая будет отображаться на вашем экране, и подавать ее на ваш ход.

int randomX = arc4random() % something; // fill in how you want to restrict your x value so that the sprite stays on the screen! 
id actionMove = [CCMoveTo actionWithDuration:actulDuration position:ccp(randomX, 0)]; 

На другой ноте, так как практика кодирования вещь, вы, вероятно, лучше от не использовать сырые цифры, как 160, 0, и т.д. в вашем коде. Поместите их в переменные (или #defines, если они используются в нескольких файлах). Таким образом, когда вы хотите изменить настройки в будущем, вам нужно только изменить эти цифры в одном кружеве, а не на всем протяжении вашего кода!

Надеюсь, это поможет. Удачи!

+0

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

+0

Большое спасибо. Это исправило мою проблему! – tallen11

+0

Не беспокойтесь. Рад, что у вас это работает :) –

0

Независимо от того, что я могу изменить, ничего на самом деле не происходит.

Что вы пытались изменить?

В частности, я не вижу ничего такого кода, который проверяет пейзаж или портретный режим или условно пытается изменить координату на основе некоторого атрибута queried.

+0

Вот что я тоже не понимаю. Хммм. – tallen11

+1

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

+0

Здесь вы идете ... http://www.raywenderlich.com/352/how-to-make-a-simple-iphone-game-with-cocos2d-tutorial – tallen11

1

Следующий код устанавливает начальное положение мишени

int minY = target.contentSize.width/2; 
int maxY = winSize.width - target.contentSize.width/2; 
int rangeY = maxY - minY; 
int actualY = (arc4random() % rangeY) + minY; 

target.position = ccp(winSize.width + (target.contentSize.width/2), actualY); 

В настоящее время, что randomises положения у, установив переменную actualY к рандомизированному числу в пределах диапазона. Чтобы изменить его так, чтобы позиция y постоянно находилась в нижней части экрана, вам нужно будет изменить действительную переменнуюYY.

int actualY = target.contentSize.height/2; 

Это должно помещать цель в нижней части экрана в начало. Обратите внимание, что поскольку я не внес никаких изменений в x paramater, он всегда будет отображаться в правом нижнем углу. Я уверен, что вы можете понять, как изменить параметр x!

Что касается изменения направления движения, то это делается в следующей строке.

id actionMove = [CCMoveTo actionWithDuration:actualDuration position:ccp(-target.contentSize.width/2, actualY)]; 

Это создает то, что Cocos2D называет действием. В частности, это перемещение спрайта в указанное положение. Эта позиция устанавливается внутри этого вызова функции.

Если попробовать:

id actionMove = [CCMoveTo actionWithDuration:actualDuration position:ccp(-target.contentSize.width/2, winSize.height)]; 

он должен начать двигаться вверх, потому что цель двигаться сейчас выше, где она начинается. Обратите внимание, что при вызове этой функции его перемещение влево будет продолжаться, потому что я не определил другую цель в направлении x - я думаю, вы можете понять, как заставить ее остановиться, опираясь на остальную часть этого!

Удачи, надеюсь, это поможет!

+0

Большое вам спасибо! Это решило часы разочарования! – tallen11

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