簡體   English   中英

使多個對象/精靈在屏幕內隨機移動?

[英]Making multiple objects/sprites move randomly within a 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。

您可能可以在以下位置使用我的示例代碼: https : //github.com/edfrederick/bugsquash.git它是為Cocos2d HTML5編寫的(您會發現它非常相似),但是具有所有的數學功能可以准確地完成您的工作希望這樣做,並且應該易於翻譯。

特別是,您只需使用隨機化函數來隨機選擇一個點來加載氣泡。 然后選擇另一個隨機點並使氣泡向其移動。 氣泡到達該點后,您可以決定使其消失或在屏幕上選擇另一個隨機點,並使氣泡開始向該點移動。

可能值得注意的是,我的代碼以線性方式移動對象,但是您可以使用二次方程式來切換運動,從而在氣泡上產生“擺動”效果。 這僅取決於您要查找的內容。

希望這可以幫助。

更新了特定文件參考

https://github.com/edfrederick/bugsquash/blob/master/scripts/actors/BugActor.js是我要指的特定文件。 它涵蓋了您正在談論的所有運動想法,並得到了很好的評論(無論如何對我而言!)

您是否嘗試過將氣泡創建/初始化提取到單獨的方法中? 當前您擁有初始化代碼行的位置,將其替換為:

[ 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
               ]
];

我希望這個對你有用....

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM