【问题标题】:iphone cocos2d sprites disappearingiphone cocos2d 精灵消失
【发布时间】:2009-09-20 01:07:36
【问题描述】:

我一直在开发一款游戏,并用花栗鼠实现物理东西。 cocos2d 部分一切正常,直到与花栗鼠集成。一点背景:

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

问题在于出现的方块。我的 BlockLayer 类有一个方法,它是我游戏主场景的一部分。创建图层后,将读取属性列表,并创建所有块。调用以下方法来创建块:

- (void)createBlock:(Block*)block withAssets:(NSBundle*)assets { 精灵*精灵; 开关(block.blockColor) { 案例 kBlockColourGreen: sprite = [Sprite spriteWithFile:[assets pathForResource:@"green" ofType:@"png" inDirectory:@"Blocks"]]; 休息; 案例 kBlockColourOrange: sprite = [Sprite spriteWithFile:[assets pathForResource:@"orange" ofType:@"png" inDirectory:@"Blocks"]]; 休息; 案例 kBlockColorRed: sprite = [Sprite spriteWithFile:[assets pathForResource:@"red" ofType:@"png" inDirectory:@"Blocks"]]; 休息; 案例 kBlockColourBlue: sprite = [Sprite spriteWithFile:[assets pathForResource:@"blue" ofType:@"png" inDirectory:@"Blocks"]]; 休息; } sprite.position = block.bounds.origin; [自我添加孩子:精灵]; 如果(block.blockColour == kBlockColourGreen || block.blockColour == kBlockColourRed) 空间->重力 = cpvmult(cpv(0, 10), 1000); cpVect 顶点[] = { 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); 块体->v = cpvzero; cpSpaceAddBody(空间,块体); cpShape* blockShape = cpPolyShapeNew(blockBody, 4, verts, cpvzero); 方块形状->e = 0.9f; 方块形状->u = 0.9f; 方块形状->数据=精灵; cpSpaceAddShape(空间,块形状); }

使用上面的代码,精灵永远不会出现。但是,如果我注释掉“cpSpaceAddBody(space, blockBody);”行,精灵出现了。

块的位置和大小存储在 Block 类实例的“bounds”属性中,它是一个 CGRect。

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

任何帮助将不胜感激。

【问题讨论】:

  • 你为什么要重复sprite = [Sprite spriteWithFile:[assets pathForResource:@"green" ofType:@"png" inDirectory:@"Blocks"]]; 这么多次,而你可以对@"green" 部分进行变量替换?还不如做createGreenBlockcreateRedBlockcreateBlueBlock等等……

标签: iphone cocos2d-iphone chipmunk


【解决方案1】:

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

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

【讨论】:

  • verts 数组确实是错误的。并且已经将块移开(它们现在是 48x48,使它们统一用于测试)并从 cpv(50, 50) 开始相隔 80 像素,所有 3 的 y=50,而 x = previous_x + 80。仍然没有出现,但只要我拿出那条线,他们就会出现。
  • 只是一个后续,我从我的关卡中取出了除一个之外的所有块。同样的问题仍然存在。所以我相信这不是因为重叠,因为现在游戏中只有一个精灵、一个身体和一个形状。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 2012-07-08
      • 2011-03-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-27
      • 1970-01-01
      • 2015-08-26
      • 2011-03-11
      相关资源
      最近更新 更多