2012-02-17 88 views
0

我的遊戲有點小問題。在我的主要遊戲場景,我從一個類創建Player對象,就像這樣:Box2D對象速度

player = [Player spriteWithFile:@"[email protected]"];   
player.position = ccp(100.0f, 180.0f); 
[player createBox2dObject:world]; 

下面是我的小球員類的主要塊創建身體和夾具,所以我可以在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); 

此代碼的結果是具有[email protected]一個box2d的對象在其上。當我移動遊戲杆時,會施加Box2D衝動並且玩家移動。很簡單,對嗎? 在非視網膜顯示器,這工作正常。但是,當我在模擬器中切換到Retina時,[email protected]創建得稍高一點,而不是在Box2D圓上。然後,施加重力,它們都落到平臺上。 [email protected]下降速度快一倍。當我移動操縱桿時,Box2D圓移動,但[email protected]移動速度加快一倍,相機隨之移動,很快將圓圈離開屏幕。我懷疑這個問題與我在這裏的代碼有什麼關係,我覺得它是一個隱藏在我的遊戲中的擴展問題。有沒有人有建議?

編輯: 我移動精靈用:

[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,但它不影響速度。有任何想法嗎?

編輯:見下面的評論,幾乎有這個想通了

+0

完全不是......我正在尋找你的框架方法,根據box2d body的位置更新精靈位置。 – 2012-02-19 00:32:31

+0

不知道這是否會改變你正在嘗試完成的任務,但也可能嘗試body-> SetLinearVelocity(impulse); – 2012-02-19 00:34:59

+0

我嘗試用它替換我的ApplyLinearImpulse行,但沒有任何變化(除速度慢得多)。通過更新身體的精靈位置,你的意思是什麼?你是說每一幀我都必須將精靈的位置設置到身體上?順便提一下,感謝您的幫助。 – nick 2012-02-19 22:55:12

回答

1

您問題可能來自你使用的是@ 2倍的圖像的事實梗...閱讀,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正文關聯的精靈?

+0

我收到您的建議後,嘗試刪除@ 2x,但不幸的是它與以前一樣。任何其他想法? – nick 2012-02-18 05:49:26

+0

你可以發佈你的代碼在哪裏更新精靈的位置? – 2012-02-18 14:52:51

+0

另一個想法是仔細檢查一下,您是否取消了AppDelegate中用於啓用Retina顯示屏的註釋...... [director enableRetinaDisplay:YES] - 同樣,您應該確保您有Icon-Small.png和Icon -Small-hd.png(copy @ 2x並重命名爲-hd) – 2012-02-18 21:43:45