2014-03-03 82 views
0

基於這個原始發佈的問題我的問題: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] 
]; 
} 

我:M採用了最新版本的Xcode。

回答

0

您或許可以使用我的示例代碼:https://github.com/edfrederick/bugsquash.git它是爲Cocos2d HTML5編寫的(您會發現它非常相似),但它具有所有數學功能,可以完成您正在尋找的功能,並且應該易於翻譯。

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

可能值得注意的是,我的代碼以線性方式移動對象,但是您可以用二次方程切換運動以在氣泡上創建「擺動」效果。這取決於你在找什麼。

希望這會有所幫助。

更新的具體文件引用

https://github.com/edfrederick/bugsquash/blob/master/scripts/actors/BugActor.js是我這裏指的是特定的文件。它涵蓋了你正在談論的所有移動想法,並且評論很好(對我來說無論如何!)

+0

你的github帳戶中的哪個文件有示例代碼? – user3290191

+0

https://github.com/edfrederick/bugsquash/blob/master/scripts/actors/BugActor.js是你正在尋找的文件 – EdFred

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; 

} 

對於具有氣泡移動屏幕外,既可以讓它們隨機返回,這意味着沒有額外的代碼是必需的,或者你可以檢查屏幕的邊界和氣泡的位置,以查看是否需要在脫離屏幕時移除該對象。最簡單的邊界校驗是尋找:

「×」 < 「0 - sprite_width」
「×」> 「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 
       ] 
]; 

我希望這幫助....

+0

ps:如果你真的想「隨機化」氣泡運動,切換順序「ctrlPoint1」和「ctrlPoint2」當你創建貝塞爾路徑。 – miwalsh

相關問題