我的游戏有点问题。在我的主要游戏场景中,我从类中创建一个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);
此代码的结果是一个Box2d对象,上面有Icon-Small@2x.png。当我移动操纵杆时,应用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());
}
这里不应该有任何问题,对吧?
再次编辑:
这是我的更新:method-
- (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,但它不会影响速度。有什么想法吗?
编辑:看下面的评论,几乎已经弄明白了
答案 0 :(得分: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主体关联的精灵的位置?