iphone cocos2d精灵消失了

时间:2009-09-20 01:07:37

标签: iphone cocos2d-iphone chipmunk

我一直致力于游戏并用花栗鼠实现物理学的东西。 cocos2d部分一切正常,直到与chipmunk集成。一点背景:

游戏是一个有块的游戏。级别在属性列表中定义,其中位置,块的大小,重力等都是为要在级别中显示的每个块定义的。

问题在于块出现了。我的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。

不确定它是否重要,但应用程序的方向是横向左侧,并且所有坐标都基于该方向。

非常感谢任何帮助。

3 个答案:

答案 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))
};

答案 1 :(得分:0)

好的,我找到了答案。设置花栗鼠时,问题是信不信由你的重力。我设置错误,将重力设置为cpv(0,0)让我的块显示在屏幕上。然后经过一些修补其他代码,我能够再次引入引力。只是不得不在我的块创建方法中玩。

答案 2 :(得分:0)

我可以问你如何计算块的质量吗?

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