0

我试图在我的 Cocos2d/Box2d 应用程序中点击一个坠落的物体。

这是我的 touchesBegan 代码:

- (void)ccTouchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
    UITouch *myTouch = [touches anyObject];
    CGPoint location = [myTouch locationInView:[myTouch view]];
    location = [[CCDirector sharedDirector] convertToGL:location];
    b2Vec2 locationWorld = b2Vec2(location.x/PTM_RATIO, location.y/PTM_RATIO);

    for(b2Body *b = world->GetBodyList(); b; b=b->GetNext()) {
        b2Vec2 bPos = b->GetPosition();
        for (b2Fixture *f = b->GetFixtureList(); f; f=f->GetNext()) {

            if (f->TestPoint(locationWorld)) {
                NSLog(@"hit it!");
            }

        }
    }

我的世界中有两个物体,地面和坠落物体。我的重力真的很慢,所以触摸它应该不是问题。奇怪的是,我的位置似乎偏离了很多!

在上次运行 locationWorld (我点击的地方)是:

Printing description of locationWorld:
(b2Vec2) locationWorld = {
  x = 7.90625
  y = 9.875
}

我经历了两次外循环,每个身体一次,得到:

Printing description of bPos:
(b2Vec2) bPos = {
  x = 3.03125
  y = 19.6643
}
Printing description of bPos:
(b2Vec2) bPos = {
  x = 8.59375
  y = 17.4969
}

奇怪的是,在 (8.59, 17.49) 报告的第二个物体应该是坠落的物体,但 Y 坐标偏离了。

这是我的第一个 cocos2d/box2d 应用程序,所以我确定我遗漏了一些明显的东西。我已经在谷歌上搜索了一段时间,这似乎应该可以工作。

谢谢你的帮助。

请参阅下面的答案,我的代码是正确的,我设置的设备不正确。

4

1 回答 1

0

好的,这现在有点工作,但我相信我会有另一个问题。

当我在上面运行它时,我创建了一个相当小的动态框,因此这些物品会堆积在地面上,彼此重叠。

动态框.SetAsBox(.25f, .25f)

这就是原因。当我打开这个更大的东西时,说:

dynamicBox.SetAsBox((spriteSize.width/PTM_RATIO)/4, (spriteSize.height/PTM_RATIO)/4);

然后可以使用上面的代码触摸身体。(所以我的问题需要重新表述,因为我确实希望对象堆积起来,相互重叠。

我也不知道为什么我需要将大小除以 4 以使项目彼此靠近,这让我很困扰。

于 2013-01-15T21:50:08.880 回答