2009-09-20 102 views
1

我一直在做一個遊戲,並與花栗鼠一起實現物理的東西。在花栗鼠的整合之前,所有的cocos2d部分都很好。一點背景:iphone cocos2d精靈正在消失

遊戲是一個塊與遊戲。級別在屬性列表中定義,其中塊的位置,塊的大小,重力等都是爲每個要在該級別中顯示的塊定義的。

問題在於塊出現。我的BlockLayer類有一個方法,這是我遊戲主場景的一部分。創建圖層後,讀取屬性列表,並創建所有塊。調用以下方法創建塊:

 
- (void)createBlock:(Block*)block withAssets:(NSBundle*)assets 
{ 
    Sprite* sprite; 
    switch(block.blockColour) 
    { 
     case kBlockColourGreen: 
      sprite = [Sprite spriteWithFile:[assets pathForResource:@"green" ofType:@"png" inDirectory:@"Blocks"]]; 
      break; 
     case kBlockColourOrange: 
      sprite = [Sprite spriteWithFile:[assets pathForResource:@"orange" ofType:@"png" inDirectory:@"Blocks"]]; 
      break; 
     case kBlockColourRed: 
      sprite = [Sprite spriteWithFile:[assets pathForResource:@"red" ofType:@"png" inDirectory:@"Blocks"]]; 
      break; 
     case kBlockColourBlue: 
      sprite = [Sprite spriteWithFile:[assets pathForResource:@"blue" ofType:@"png" inDirectory:@"Blocks"]]; 
      break; 
    } 
    sprite.position = block.bounds.origin; 
    [self addChild:sprite]; 
    if(block.blockColour == kBlockColourGreen || block.blockColour == kBlockColourRed) 
     space->gravity = cpvmult(cpv(0, 10), 1000); 
    cpVect verts[] = { 
     cpv(-block.bounds.size.width, -block.bounds.size.height), 
     cpv(-block.bounds.size.width, block.bounds.size.height), 
     cpv(block.bounds.size.width, block.bounds.size.height), 
     cpv(block.bounds.size.width, -block.bounds.size.height) 
    }; 
    cpBody* blockBody = cpBodyNew([block.mass floatValue], INFINITY); 
    blockBody->p = cpv(block.bounds.origin.x, block.bounds.origin.y); 
    blockBody->v = cpvzero; 
    cpSpaceAddBody(space, blockBody); 
    cpShape* blockShape = cpPolyShapeNew(blockBody, 4, verts, cpvzero); 
    blockShape->e = 0.9f; 
    blockShape->u = 0.9f; 
    blockShape->data = sprite; 
    cpSpaceAddShape(space, blockShape); 
} 

使用上面的代碼,精靈永遠不會顯示出來。但是,如果我註釋掉「cpSpaceAddBody(space,blockBody);」線,精靈出現。

塊的位置和大小存儲在Block類的實例的「bounds」屬性中,該類是CGRect。

不知道它是否重要,但應用程序的方向是橫向左側,並且所有座標均基於該方向。

任何幫助將不勝感激。

+0

你爲什麼要重複'精靈= [雪碧spriteWithFile:資產pathForResource:@ 「綠色」 ofType:@ 「PNG」 inDirectory:@ 「塊」];'這麼多的時候,你可以這樣做「@」綠色「部分的變量替換?不妨做'createGreenBlock','createRedBlock','createBlueBlock'等等...... – Lukman 2011-03-30 09:14:40

回答

0

好吧,我找到了答案。這個問題是否相信,在建立花栗鼠時有引力。我把它設置不正確,將重力設置爲cpv(0,0)讓我的塊顯示在屏幕上。然後,在修改了一些其他代碼之後,我再次引入了引力。只需要在我的塊創建方法中玩。

0

確保沒有特別的物體重疊。如果兩個物體重疊,力計算算法會變得有些瘋狂,並且最終會在屏幕座標之外出現兩個物體。

話雖這麼說,在verts array似有不妥:

cpVect verts[] = { 
    cpv(-block.bounds.size.width, -block.bounds.size.height), 
    cpv(-block.bounds.size.width, block.bounds.size.height), 
    cpv(block.bounds.size.width, block.bounds.size.height), 
    cpv(block.bounds.size.width, -block.bounds.size.height) 
}; 

你應該與給定值的一半工作,因爲:|x| + |-x| = 2x。 (你只需要1x

cpVect verts[] = { 
    cpv(-(block.bounds.size.width/2), -(block.bounds.size.height/2)), 
    cpv(-(block.bounds.size.width/2), block.bounds.size.height/2), 
    cpv(block.bounds.size.width/2, block.bounds.size.height/2), 
    cpv(block.bounds.size.width/2, -(block.bounds.size.height/2)) 
}; 
+0

verts數組確實是錯誤的。並且已經移動了方塊(現在它們是48x48,使它們統一進行測試),並且在cpv(50,50)處開始放置80個像素,在全部3處y = 50處,而x = previous_x + 80.仍然沒有出現,但只要我拿出那條線,它們就出現了。 – jer 2009-09-20 02:08:12

+0

只是一個後續,我從我的等級中除掉了一個。同樣的問題仍然存在。所以我相信這不是因爲重疊,因爲現在遊戲中只有一個精靈,一個身體和一個形狀。 – jer 2009-09-20 03:21:31

0

我可以問你如何計算塊的質量?

cpBody* blockBody = cpBodyNew([block.mass floatValue], INFINITY);