在使用SpaceManager时,如何使静态精灵成为cocos2D中另一个精灵的子元素

时间:2010-04-22 15:49:11

标签: iphone cocos2d-iphone chipmunk

我有两个静态(STATIC_MASS)SpaceManager精灵。一个是另一个的孩子 - 我的意思是一种构建另一个孩子,但是虽然孩子的图像显示在正确的位置,但孩子似乎不存在于花栗鼠物理引擎中,就像我一样期待。在我的情况下,我有一个背板(矩形精灵)和一个箍(圆形精灵)。因为我可能想要移动篮板,所以我想将篮筐连接到篮板上,这样篮圈就会自动与篮板一起移动。

在这里,我们看到一个带有连接圈的旋转篮板。它在屏幕上看起来很不错,但是其他物体只能从背板反弹而是直接穿过篮筐(从术语的角度来看)。我的孩子精灵似乎不存在于物理引擎中?

  // Add Backboard
  cpShape *shapeRect = [smgr addRectAt:cpvWinCenter mass:STATIC_MASS width:200 height:10 rotation:0.0f ];// We're upgrading this 
  cpCCSprite * cccrsRect = [cpCCSprite spriteWithShape:shapeRect file:@"rect_200x10.png"];
  [self addChild:cccrsRect];

  // Spin the static backboard: http://stackoverflow.com/questions/2691589/how-do-you-make-a-sprite-rotate-in-cocos2d-while-using-spacemanager
  // Make static object update moves in chipmunk
  // Since Backboard is static, and since we're going to move it, it needs to know about spacemanager so its position gets updated inside chipmunk.
  // Setting this would make the smgr recalculate all static shapes positions every step
  //    cccrsRect.integrationDt = smgr.constantDt; 
  //    cccrsRect.spaceManager = smgr;
  // Alternative method: smgr.rehashStaticEveryStep = YES;
  smgr.rehashStaticEveryStep = YES;

  // Spin the backboard
  [cccrsRect runAction:[CCRepeatForever actionWithAction:
                         [CCSequence actions:
                          [CCRotateTo actionWithDuration:2 angle:180],
                          [CCRotateTo actionWithDuration:2 angle:360],
                          nil]

                         ]];


  // Add the hoop
  cpShape *shapeHoop = [smgr addCircleAt:ccp(100,-45) mass:STATIC_MASS radius: 50 ];
  cpCCSprite * cccrsHoop = [cpCCSprite spriteWithShape:shapeHoop file:@"hoop_100x100.png"];
  [cccrsRect addChild:cccrsHoop];

以上代码有点受到打击。箍的图像出现在电路板旁边,这就是我想要的,如果我发现碰撞,碰撞只发生在屏幕的左下方。奇怪的是,即使我正在检测到碰撞,我的物体实际上似乎没有发生碰撞,它只是通过它而不是从它反弹。

注意:SpaceManager是一个使用cocos2D-iphone

的工具包

2 个答案:

答案 0 :(得分:2)

问题是父子关系在物理引擎中没有意义。您可以将多个形状附加到同一个主体,这样当您移动一个主体时,它会移动多个形状。

答案 1 :(得分:1)

对此的简单回答是,这不可能。花栗鼠喜欢世界坐标中的所有东西,当你开始在cocos2d中创建亲子关系时,你正在设置一个不匹配的坐标系......

然而......我确实试图弥合这个问题而没有太大的成功(问题是轮换我相信)看看SpaceManager.m中的函数“eachShapeAsChildren”。如果将SpaceManager的iterateFunc属性设置为指向此函数,则可以看到会发生什么......

在某些时候我可能会再给它一次;事实上,我已经感受到了更多的灵感。