2009-09-20 165 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);