使多个对象/精灵在屏幕内随机移动?

时间:2014-03-03 03:14:15

标签: ios objective-c cocos2d-iphone sprite

根据这个原始发布的问题提出问题:Making a sprite move randomly across the screen

它解释了如何从屏幕中某个点位置的任意随机位置开始在屏幕上移动精灵。但我的问题是如何修改代码,以便在特定间隔后将对象/精灵(同一图像文件)随机地多次放到屏幕上,或者放置多个对象/精灵(不同的图像文件)特定间隔后的屏幕。

示例:我想在屏幕上的任何位置突然冒出气泡并开始在屏幕上移动。气泡应该每3秒钟弹出一次。气泡应该可以在任何随机位置进入屏幕并离开屏幕。

初始化:

 CCSprite* s = [CCSprite spriteWithFile:@"yourImage.png"];
 [self addChild: s];
 [self moveRandom:s];

移动精灵:

 -(void)moveRandom:(CCSprite*)s
 {
CGPoint randomPoint = ccp(arc4random()%480, arc4random()%320);
NSLog(@"%@", NSStringFromCGPoint(randomPoint));

[s runAction:
 [CCSequence actions:
  [CCMoveTo actionWithDuration:arc4random()%5+1 position: randomPoint],
  [CCCallBlock actionWithBlock:^{
     [self performSelector:@selector(moveRandom:) withObject:s afterDelay:0.5];
   }],
  nil]
 ];
 }

我:使用最新版本的xcode。

2 个答案:

答案 0 :(得分:0)

您可以在以下位置使用我的示例代码:https://github.com/edfrederick/bugsquash.git它是为Cocos2d HTML5编写的(您会发现它非常相似)但是所有的数学运算都可以完全按照您的要求进行操作很容易翻译。

特别是,您只需使用随机函数功能随机选取一个点来加载气泡。然后选择另一个随机点并使气泡向它移动。一旦气泡到达该点,您可以决定让它消失或在屏幕上选择另一个随机点并让气泡开始朝着该点移动。

值得注意的是,我的代码以线性方式移动对象,但您可以使用二次方程式切换运动,从而在气泡上产生“摆动”效果。这取决于你在寻找什么。

希望这会有所帮助。

更新了特定文件参考

https://github.com/edfrederick/bugsquash/blob/master/scripts/actors/BugActor.js是我指的具体文件。它涵盖了您所谈论的所有运动创意,并且评论得很好(无论如何都适合我!)

答案 1 :(得分:0)

您是否尝试将气泡创建/初始化提取到单独的方法中?如果您当前有初始化代码行,请将其替换为:

[ self schedule: @selector( createBubble: )
       interval: 3.0f
];

这会每三秒安排一次新的气泡创建。然后你可以有一个单独的方法来进行实际的初始化:

- ( void ) createBubble: ( ccTime ) delta

{

    CCSprite * const s = [ CCSprite spriteWithFile: @"yourImage.png" ];
    [ self addChild: s
                  z: 100
    ];
    [ s setPosition: ccp( arc4random_uniform( 480 ), arc4random_uniform( 320 ) ) ];
    [ self moveRandom: s ];

    return;

}

至于让气泡在屏幕外移动,您可以允许它们随机返回,这意味着不需要额外的代码,或者您可以检查屏幕的边界和气泡的位置,看看你是否当它离开屏幕时需要删除它。最简单的边界检查是寻找:

 " X" < " 0 - sprite_width",
 " X" > " screen_width + sprite_width",
 " Y" < " 0 - sprite_height",
 " Y" > " screen_height + sprite_height"

  这样可以确保精灵在删除之前完全离开了屏幕。

另外,如果你想让事情看起来更像一个泡泡般的",你可以通过更换" CCMoveTo"来混淆动作。部分包含以下内容:

CGPoint const ptNow = [ s position ];
CGFloat const oneThirdDiffX = ( randomPoint.x - ptNow.x ) * 0.25f;
CGFloat const oneThirdDiffY = ( randomPoint.y - ptNow.y ) * 0.25f;
CGPoint const ctrlPoint1 = ccp( ptNow.x + oneThirdDiffX, ptNow.y - oneThirdDiffY );
CGPoint const ctrlPoint2 = ccp( randomPoint.x - oneThirdDiffX, randomPoint.y + oneThirdDiffY );

//  move the sprite to the new random point, with a random speed, and then schedule
//  the next update...
[ s runAction: [ CCSequence actions: [ CCBezierTo actionWithDuration: arc4random( ) % 5 + 1
                                                              bezier: (ccBezierConfig){ randomPoint, ctrlPoint1, ctrlPoint2 }
                                     ]
                                   , [ CCCallBlock actionWithBlock:
                                         ^{
                                          [ self performSelector: @selector( moveRandom: )
                                                      withObject: s
                                                     // afterDelay: 0.5f
                                          ];
                                          }
                                     ]
                                   , nil
               ]
];

我希望这会有所帮助......