【问题标题】:Box2D object speedBox2D 物体速度
【发布时间】:2012-02-17 14:47:31
【问题描述】:

我的游戏有点问题。在我的主要游戏场景中,我从一个类中创建了一个 Player 对象,如下所示:

player = [Player spriteWithFile:@"Icon-Small@2x.png"];        
player.position = ccp(100.0f, 180.0f);
[player createBox2dObject:world];

下面是我的小 Player 类的主要部分,它创建了 body 和 fixture,因此我可以在 box2d 世界中使用它。

b2BodyDef playerBodyDef;
playerBodyDef.type = b2_dynamicBody;
playerBodyDef.position.Set(self.position.x/PTM_RATIO, self.position.y/PTM_RATIO);
playerBodyDef.userData = self;
playerBodyDef.fixedRotation = true;
playerBodyDef.linearDamping = 4.0;

body = world->CreateBody(&playerBodyDef);

b2CircleShape circleShape;
circleShape.m_radius = 0.7;
b2FixtureDef fixtureDef;
fixtureDef.shape = &circleShape;
fixtureDef.density = 1.0f;
fixtureDef.friction = 1.0f;
fixtureDef.restitution =  1.0f;

body->CreateFixture(&fixtureDef);

这段代码的结果是一个带有 Icon-Small@2x.png 的 Box2d 对象。当我移动操纵杆时,会应用 Box2D 脉冲并且玩家移动。很简单,对吧? 在非视网膜显示器中,这很好用。但是,当我在模拟器中切换到 Retina 时,Icon-Small@2x.png 会创建得更高一点,向右更远一点,而不是在 Box2D 圆圈上方。然后,施加重力,它们都落到平台上。 Icon-Small@2x.png 以两倍的速度下降。当我移动操纵杆时,Box2D 圆圈会移动,但 Icon-Small@2x.png 移动的速度是原来的两倍,并且相机会跟随它,很快圆圈就会离开屏幕。我怀疑这个问题与我这里的代码有什么关系,我觉得它是隐藏在我游戏中某个地方的缩放问题。有人有建议吗?

编辑: 我移动精灵:

[player moveRight];

这是播放器类中的 moveRight:

-(void) moveRight {
    b2Vec2 impulse = b2Vec2(2.0f, 0.0f);
    body->ApplyLinearImpulse(impulse, body->GetWorldCenter());
}

这里应该没什么问题吧?

编辑(再次):

这是我的更新:方法-

- (void) update:(ccTime)dt {
    int32 velocityIterations = 8;
    int32 positionIterations = 1;

    world->Step(dt, velocityIterations, positionIterations);

    for (b2Body* b = world->GetBodyList(); b; b = b->GetNext()) {
        if (b->GetUserData() != NULL) {
            CCSprite *myActor = (CCSprite*)b->GetUserData();
            myActor.position = CGPointMake( b->GetPosition().x *PTM_RATIO, 
                                       b->GetPosition().y * PTM_RATIO);
            myActor.rotation = -1 * CC_RADIANS_TO_DEGREES(b->GetAngle());
        }   
    }
    b2Vec2 pos = [player body]->GetPosition();
    CGPoint newPos = ccp(-1 * pos.x * PTM_RATIO + 50, self.position.y * PTM_RATIO); 
    [self setPosition:newPos];
}

我感觉问题出在此处。我试过改变 PTM_RATIO ,但它不会影响速度。有什么想法吗?

编辑:看下面的评论,差不多就明白了

【问题讨论】:

  • 一点也不...我正在寻找您的框架方法,您可以根据 box2d 主体的位置更新精灵位置。
  • 不确定这是否会改变您要完成的工作,但也可以尝试 body->SetLinearVelocity(impulse);
  • 我尝试用它替换我的 ApplyLinearImpulse 行,但没有任何变化(除了速度慢得多)。通过身体更新我的精灵位置是什么意思?你是说每一帧我都必须将精灵的位置设置为身体?顺便说一句,感谢您迄今为止的帮助。
  • 没问题。基本上,您应该在框架、刻度或更新方法中有一些代码来更新精灵的位置以跟随 box2d 主体...我正在用我正在寻找的代码示例在下面编辑我的问题
  • 其实我想我可能已经弄清楚了。基本上,在视网膜模式下,我需要将 PTM_RATIO 更改为 16,但在旧屏幕上它需要保持在 32。我可能会执行检查以查看它应该使用哪个数字,但每帧都会发生这种情况并且会很混乱.你知道一种方法来制作一个我可以在我的 applicationDidStart 中设置的超全局变量:我可以完全像 PTM_RATIO(即#define'd)一样使用它吗?

标签: cocos2d-iphone box2d scale


【解决方案1】:

您的问题可能源于您使用的是@2x 图像...阅读,http://www.cocos2d-iphone.org/wiki/doku.php/prog_guide:how_to_develop_retinadisplay_games_in_cocos2d

上面写着:

警告:不建议使用“@2x”后缀。 Apple 以特殊方式处理这些图像,这可能会导致您的 cocos2d 应用程序出现错误。

因此,要解决您的问题,请阅读有关使用带有 -hd 后缀的 png 文件的信息。

对于评论:

你有一些看起来像...的代码

  world->Step(dt, 10, 10);
  for(b2Body *b = world->GetBodyList(); b; b=b->GetNext()) {    
    if (b->GetUserData() != NULL) {
      CCSprite *sprite = (CCSprite *)b->GetUserData();
      sprite.position = ccp(b->GetPosition().x * PTM_RATIO,b->GetPosition().y * PTM_RATIO);
    }
  }

看看代码如何循环遍历单词中的所有 box2d 主体并设置与 box2d 主体相关联的精灵的位置?

【讨论】:

  • 我在收到您的建议后尝试删除@2x,但不幸的是它与以前相同。还有其他想法吗?
  • 你能把你的代码贴在你更新精灵位置的地方吗?
  • 另一个想法是仔细检查您是否已取消注释 AppDelegate 中的行以启用 Retina 显示器的使用... [director enableRetinaDisplay:YES] - 另外,您应该确保您有Icon-Small.png 和 Icon-Small-hd.png(复制 @2x 并重命名为 -hd)
  • 是的,这两张图我都有。我将使用用于移动精灵的代码更新我的帖子。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多