2013-06-25 52 views
2

我試圖做一個像Jetpack Joyride這樣的遊戲,角色一直移動直到你死亡。我如何解決高x位置的libgdx相機錯誤?

相機符合角色,一切都很好,直到相機的x位置(和字符)達到約5000

我測試,以讓在5.000一個x位置在世界上的一切開始.000。

一切開始看起來很奇怪,精靈改變了他們的大小和位置o.O.

然後我創建了一個簡單的屏幕,只呈現2個矩形,當我使用「低」x位置時,一切看起來都很好,但是當我開始使用相機的「高」x位置時,矩形會改變它們的形式。

請試試看,並告訴我如何解決這個問題。

public ArsenalScreen(AwesomeRun game) 
    { 

     this.game = game; 

     renderer = new ShapeRenderer(); 
     batch = new SpriteBatch(); 
     camera = new OrthographicCamera(); 
     camera.setToOrtho(false, 20, 20); 
     camera.viewportWidth = 30; 
     camera.viewportHeight = 20; 
      camera.position.x = 3; 
//  camera.position.x = 300000000; 
     camera.update(true); 
    } 
    @Override 
    public void render(float delta) { 
     Gdx.gl.glClearColor(0.5f,0.5f,0.5f,1); 
     Gdx.gl.glClear(GL10.GL_COLOR_BUFFER_BIT); 
     renderer.setProjectionMatrix(camera.combined); 
     renderer.begin(ShapeType.Rectangle); 
     renderer.identity(); 
     renderer.rect(camera.position.x, camera.position.y, camera.viewportWidth/4, camera.viewportHeight/4); 
     renderer.rect(camera.position.x-camera.viewportWidth/2+0.5f, camera.position.y-camera.viewportHeight/2, camera.viewportWidth, camera.viewportHeight); 
     renderer.end(); 
    } 

回答

2

您可能會遇到浮點精度問題,大x值。 Libgdx使用Java的float這是一個32位浮點值。如果您使用的是OpenGL 2.0,則GLSL着色器也會將浮點值限制在很好的位置(甚至可能依賴於特定的硬件)。此外,在將值轉換爲屏幕座標時(通過相機矩陣)對值進行的任何轉換都可能降低您可用的精度。

有關浮動可用點精度在一個32位浮點一些背景,參見What range of numbers can be represented in a 16-, 32- and 64-bit IEEE-754 systems?答案,這表示:

如果你想的+/- 0.5(或2的精度^ -1 ),數字的最大尺寸是2^23。任何大於此值的浮點數之間的距離大於0.5。

What Every Computer Scientist Should Know About Floating-Point Arithmetic是一個很好的參考,如果你真的想了解發生了什麼事在floatdouble

回到您的具體問題。我很驚訝你會在500萬的x抵消額中看到大問題(我希望你會在大約800萬的抵消額中看到小問題),但無論如何,遲早你肯定會遇到問題。

您無法通過使用double來解決此問題,因爲您正在使用的許多API只接受float

我認爲解決這個問題的方法是每隔一段時間(例如,當一個關卡的一部分完成時)向下「重置」浮點X座標。因此,不要僅僅使用浮點數x來跟蹤位置,而應使用整數segment數字加上該段內的浮點數x(比如說介於0和10000之間)。不過,你必須在分段之間的轉換中處理一些邊界情況。

+0

謝謝你的確切答案。在我的角色達到1000或更高的x位置後,我已經通過「重置」世界中的每個對象來解決問題。我只是將每個對象的x座標減去1000,並且看不到任何口吃。 我希望這是你提到它的原因,因爲英語不是我的母語,所以我沒有什麼困難。 – CurZ