随机精灵目的地

时间:2010-09-28 23:02:53

标签: iphone cocos2d-iphone

我能够使目标沿着屏幕顶部随机生成并消失在屏幕的底部。唯一的问题是目标每次只移动到一个固定点。我希望他们移动到屏幕底部的随机点。有任何想法吗? 感谢。

以下是代码:

- (void)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]];
}

3 个答案:

答案 0 :(得分: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);

目前,通过将变量actualY设置为范围内的随机数来随机化y位置。 要更改它以使y位置始终位于屏幕底部,您需要更改actualY变量。

int actualY = target.contentSize.height/2;

这应该将目标放在屏幕底部的开头。请注意,由于我没有对x参数进行任何更改,因此它将始终显示在右下角。我相信你可以弄清楚如何更改x参数!

至于改变它移动的方向,可以在下一行中完成。

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

这创建了Cocos2D所谓的Action。这个特殊的是将精灵移动到指定位置。该位置设置在该函数调用中。

如果您尝试:

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

它应该开始向上移动,因为移动目标现在高于它开始的位置。请注意,通过此函数调用,它向左移动将继续,因为我没有在x方向上定义不同的目标 - 我想你可以弄清楚如何根据其余部分停止它!

祝你好运,希望这会有所帮助!

答案 1 :(得分: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)。这样,当您想要在未来调整内容时,您只需要在一个花边中更改这些数字,而不是整个代码!

希望这会有所帮助。祝你好运!

答案 2 :(得分:0)

  

无论我改变什么,都没有   真的发生了。

你尝试过改变什么?

具体来说,我没有看到任何代码检查横向与纵向模式或有条件地尝试根据某个查询属性更改坐标。