【发布时间】: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