繁体   English   中英

iPhone cocos2d精灵消失了

[英]iphone cocos2d sprites disappearing

我一直在开发游戏,并用花栗鼠实现物理方面的东西。 直到与Chipmunk集成为止,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。

不确定它是否重要,但是应用程序的方向为横向,所有坐标均基于该方向。

任何帮助将不胜感激。

确保没有特定的主体重叠。 如果两个物体重叠,则力计算算法会有点疯狂,最终您将在屏幕坐标之外出现两个物体。

话虽如此, 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 |x| + |-x| = 2x |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))
};

好的,所以我找到了答案。 问题在于是否相信,设置花栗鼠时会产生重力。 我设置不正确,将引力设置为cpv(0,0)使我的块显示在屏幕上。 然后,在修改了一些其他代码之后,我又能够再次引入引力。 只需在我的块创建方法中进行操作即可。

我能问一下如何计算块的质量吗?

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM