2014-02-16 479 views
1

我有一個基於設備的pitchroll旋轉的精靈。 ,我使用旋轉精靈的代碼是:使用加速度計在精靈旋轉時彈出精靈

double myRadians = Math.atan2(-Gdx.input.getRoll(), Gdx.input.getPitch()); 
float myDegress = Math.round(((myRadians*180)/Math.PI)); 

我還設置了精靈的像這樣的位置:

float yChange = Math.round(Gdx.input.getRoll()); 
float xChange = Math.round(-Gdx.input.getPitch()); 
float yMove = Math.round(yChange/1.5); 
float xMove = Math.round(xChange/1.5); 

現在,當過此精靈對象與「牆」碰撞我希望它反彈回來。但首先鏡像。 我已經做到了,像這樣:

// mirror sprite 
// pitchAndRoll is a Vector2 and set to the pitch and roll 
// at the time of collision 
float flippedRotation = sprite.getRotation() * -1; 

float yChange = Math.round(pitchAndRoll.y); 
float xChange = Math.round(-pitchAndRoll.x); 

if (whichWall.equals(Walls.WALL_LEFT)){ 
    // left wall   

    flippedRotation = sprite.getRotation() * -1; 

    xChange = Math.round(pitchAndRoll.x); 
}else if (whichWall.equals(Walls.WALL_RIGHT)){ 
    // right wall 

    flippedRotation = sprite.getRotation() * -1; 

    xChange = Math.round(pitchAndRoll.x); 
}else if (whichWall.equals(Walls.WALL_BOTTOM)){ 
    // bottom wall 

    flippedRotation += 180;     

    yChange = Math.round(-pitchAndRoll.y); 
}else if (whichWall.equals(Walls.WALL_TOP_LEFT)){ 
    // top left wall   

    flippedRotation += 180;  

    yChange = Math.round(-pitchAndRoll.y); 
}else if (whichWall.equals(Walls.WALL_TOP_RIGHT)){ 
    // top right wall 

    flippedRotation += 180;  

    yChange = Math.round(-pitchAndRoll.y); 
} 

牆壁分別都是完美的水平和垂直。

第一次碰撞很好,發生的任何其他碰撞,精靈正好穿過牆壁。

但是我的主要問題是,由於使用設備的加速度計控制精靈,如果用戶使設備向下指向,精靈將向下移動,撞上牆壁,彈回,然後向下移動,循環繼續。我想防止這種情況發生,但不能想到如何。

這很難解釋,所以我這裏有一些圖片是希望更有意義=]

Image 1 Image 2 Image 3 Image 4 Image 5

我希望這些圖片給你一個更好地瞭解我正在努力做,如果你能在任何方面,幫助我,或指向正確的方向,或任何替代品將是驚人的! 在此先感謝。

+0

嘗試增加重力。每一幀,都向天空方向增加一些推力速度。就像火箭一直在試圖逃脫電話一樣。 – Axoren

+0

但這個想法是,如果設備是水平的,精靈不會移動。該設備實際上應該是平坦的。我是LibGdx的新手,所以我將不得不研究框架。謝謝! – user959631

回答

0

我有 「固定」 的方式,它是通過檢查設備的傾斜度從碰撞點開始發生變化,如果不是,精靈將繼續沿着從牆壁反彈的方向移動,直到設備的傾斜度發生變化。

感謝您的幫助..

1

因此,你遇到的主要問題是,當你想讓它反彈並遠離牆壁以​​新的方向行進時,精靈會繼續面向相同的方向嗎?

我認爲這是因爲你直接從加速度計給出的俯仰和滾動角度設置角度和精靈的位置,所以只要你的設備被傾斜,精靈將在相同的角度同樣的速度。在發生碰撞時,您的精靈只會一次更新離開牆壁,所以在碰撞結束後它會朝加速度計給出的方向轉回。

你解決這個問題的方式取決於你打算如何工作。就我個人而言,我認爲它的工作方式很好,因爲您始終控制着對象,並且如果您希望它向另一個方向移動,則可以傾斜設備。

一種可以實現向相反方向移動的方法是通過僅更新對象的移動並且不改變其加速度計給定對象一段時間來控制對象的臨時時間。要做到這一點,你需要使用你的精靈的旋轉的運動,喜歡的東西

xChange = Math.cos(spriteRotationInRadians)*speed; 
yChange = Math.sin(spriteRotationInRadians)*speed; 

你也可以設置持續面臨,例如,通過使用與左側相撞後,「左」的條件直到物體與另一面牆相碰撞,但我不確定用於更新物體的旋轉/移動的方法是否可以讓此解決方案起作用。

另一種可能性是在碰撞時將物體的速度設置爲很大數值,然後通過玩家控制隨時更新速度,以便玩家有能力從碰撞中恢復。


最靈活的解決方案是在您的遊戲中實現Box2D物理。起初看起來很難,但是有很多關於如何在LibGDX中使用它的教程。

在Box2D中,可以在此基礎上設置重力爲0,設置對象的線性衰減大於0至更大,放置一些線,在屏幕的邊緣碰撞,和在更新對象速度:

x_Vel = Math.cos(objectRotationInRadians)*speed; 
y_Vel = Math.sin(objectRotationInRadians)*speed; 

其中旋轉取自加速度計。然後你可以繪製一個與Box2D對象一起旋轉的精靈。 Box2D本身並不會照顧彈跳問題,因爲你的物體將繼續沿着與加速度計相同的方向行進,但是一定要解決穿牆問題,並且如果你想將碰撞擴展到包括其他對象。例如,使用Box2D,您可以使牆壁對物體的影響,使其以極快的速度(通過恢復原狀)進行反射,從而允許物體從牆壁反彈,但仍由玩家控制。

這裏是Box2D的一些有用的鏈接,你應該走這條路:

Simple bouncing ball code

Information about setting up Box2D

C++ Box2D series of tutorials

+0

我已經「固定」它的方式是通過檢查設備的傾斜是否從碰撞點發生改變,如果不是,精靈繼續沿着從牆壁反彈的方向移動,直到設備的傾斜改變。謝謝=] – user959631