2012-01-10 61 views
0

我是新來的,所以我希望你能幫助我。平臺上的怪物/敵人(如Doodlejump)Cocos2d

我在製作簡單的cocos2d遊戲

Ray Wenderlich's Tutorial

我實現了它在另一場比賽一個跳一個像塗鴉跳躍下面的教程。

在上述教程中,怪物/目標自由地從屏幕右側移動到左側。當我在我的應用程序上實現它時,怪物就像從左到右飛行。如果我想讓怪物像塗鴉跳躍一樣站在平臺上呢?我會做什麼特別的事情?

PS:我嘗試了谷歌其他一些事情,但沒有工作

這裏是怪物/目標代碼:

- (void)initPlatforms { 
// NSLog(@"initPlatforms"); 

    currentPlatformTag = kPlatformsStartTag; 
    while(currentPlatformTag < kPlatformsStartTag + kNumPlatforms) { 
     [self initPlatform]; 
     currentPlatformTag++; 
    } 

    [self resetPlatforms]; 
} 

- (void)initPlatform { 

    CGRect rect; 
    switch(random()%2) { 
     case 0: rect = CGRectMake(608,64,102,36); break; 
     case 1: rect = CGRectMake(608,128,90,32); break; 
    } 

    AtlasSpriteManager *spriteManager = (AtlasSpriteManager*)[self getChildByTag:kSpriteManager]; 
    AtlasSprite *platform = [AtlasSprite spriteWithRect:rect spriteManager:spriteManager]; 
    [spriteManager addChild:platform z:3 tag:currentPlatformTag]; 
} 


-(void)addTarget { 

    Sprite *target = [Sprite spriteWithFile:@"komodo.png"]; 

    target.position = ccp(300,200); 

    [self addChild:target]; 



    CGSize winSize = [[Director sharedDirector]winSize]; 
    int minX = target.contentSize.height/2; 
    int maxX = winSize.height -target.contentSize.height/2; 
    int rangeX = maxX - minX; 
    int actualX = (arc4random() % rangeX) +minX; 

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

    id actionMove = [MoveTo actionWithDuration:actualDuration position:ccp(-target.contentSize.width,actualX)]; 
    id actionMoveDone = [CallFuncN actionWithTarget:self selector:@selector(spriteMoveFinished:)]; 
    [target runAction:[Sequence actions:actionMove, actionMoveDone,nil]]; 
    target.tag = 1; 
    [_targets addObject:target]; 


} 

感謝那些誰可以幫助...你是太讚了。

+0

爲什麼投票下來? :( – TeT 2012-01-11 02:15:45

回答

2

不幸的是,這是一個相當廣泛的問題,這使得很難回答任何明確的條款。如果您希望創建可反彈的實際平臺(以跳轉方式),則需要在怪物和平臺ccNodes之間實施碰撞檢測。網上有很多關於cocos2d碰撞檢測的教程,包括簡單的實現和更先進的基於盒子2d/chipmunk的解決方案。

如果你正在尋找克隆塗鴉跳轉相當密切,有一個開源版本的github上可用的克隆here - 雖然我沒有看到實際的代碼。

最後,如果你的意思是你只是想限制怪物的移動到屏幕的特定區域(所以他們不會跑出邊緣),你只需要將目標放在一個區域上屏幕上,並更改ccAction,以便ccMoveTo使用「平臺」的最左點作爲其可移動到的最遠點,並將最右點作爲最右側。 (我會承認我沒有玩過Doodle Jump,所以不知道敵人究竟在做什麼)。

如果敵人來回跑跨平臺,你應該考慮在你的運動順序使用ccRepeatForever,並有在CCSequence兩個目標位置:一個移動的怪物到平臺的左邊,另一個移向在右邊。

附加信息

好吧,我明白你正在嘗試做的。這應該讓你開始:

平臺創建於initPlatforms。這多次調用initPlatform。這會從平臺的AtlasSprite中抓取圖像,爲每個平臺創建一個ccSprite併爲其分配唯一標記。

然後,在- (void)step:(ccTime)dt它遍歷所有的平臺,並可以根據移動到正確的位置上走多遠鳥已移動:

for(t; t < kPlatformsStartTag + kNumPlatforms; t++) { 
     AtlasSprite *platform = (AtlasSprite*)[spriteManager getChildByTag:t]; 
//etc... 

所以,位你正在等待:

如果你想添加一個怪物到這些平臺,你將不得不遵循類似的模式。要開始嘗試這樣的事情(你會希望有比這雖然是清潔的設計,但它應該讓你在正確的軌道上)

initPlatform添加下面的函數結束

// add a monster sprite 
AtlasSprite *monster = [AtlasSprite spriteWithRect:CGRectMake(608,128,64,64) spriteManager:spriteManager]; 
[spriteManager addChild:monster z:3 tag:currentPlatformTag + 1000]; 

(我剛剛從現有的Atlas中抓取了一張圖片,你可以用你的實際'Monster'精靈對象代替上面的圖片,注意我在currentPlatformTag上加了1000,這只是爲了測試;最終你應該有一個monsterTag的實現。

所以現在每個平臺都有一個「怪物」(再次,你w生病只想瞄準隨機平臺) 所以我們需要更新怪物的位置。

- (void)step:(ccTime)dt你當前平臺後直接

AtlasSprite *platform = (AtlasSprite*)[spriteManager getChildByTag:t]; 

現在還需要獲得當前怪物(記住要使用我們的「怪物」創建更新的變量值:

AtlasSprite *monster = (AtlasSprite*)[spriteManager getChildByTag:t + 1000]; 

然後,在我們重新定位平臺的地方,我們需要重新定位怪物

platform.position = pos; 
// We update the monster and set it a 32 pixels above the platform: 
monster.position = ccp(pos.x, pos.y + 32); 

所以現在每個平臺上都有一個怪物,它的y位置隨平臺移動:-) 希望這有助於

+0

多數民衆贊成正是我在tweejump應用程序上工作的應用程序 這裏是情況:我已經把怪物..我想要的是他們是在平臺的頂部和隨機重生我不認爲我必須使用box2d和花栗鼠,因爲在tweejump的獎金是在平臺的頂部。所以我想要的是像站在一個平臺上的獎金等待被擊中多數民衆贊成在所有先生。謝謝 – TeT 2012-01-11 09:51:48

+0

請幫助我先生.....我只需要把怪物放在一個隨機的平臺上,隨機產生它們 – TeT 2012-01-11 10:40:10

+0

如果我的精靈不包含在atlassprite管理器中,我該怎麼稱呼它呢?我試過這個,但是我使用了鳥的圖像在atlassprite管理器上它的工作是鳥類在平臺的頂部,但是它們並不是隨機的重新生成,我的意思是每個平臺都有一個鳥在它之上.... im抱歉,先生,如果我打擾你太多謝謝理解 – TeT 2012-01-12 02:37:56