2013-06-02 162 views
3

我有一個生成2D遊戲地圖圖塊塊的系統。塊是16x16的瓷磚,瓷磚是25x25。將2D遊戲世界座標到屏幕上的位置

塊被給出自己的座標,如0,0,0,1等。瓷磚根據它們在哪個塊中確定其世界座標。我已驗證塊/瓷塊是全部顯示適當的x/y座標。

我的問題是這些翻譯爲屏幕座標。前一個問題有人推薦使用:

(worldX * tileWidth) % viewport_width

每瓦的X/Y通過這種計算運行和屏幕的x/y座標返回。

這適用於符合視口內的瓷磚,但它對於任何關閉屏幕重置屏幕的x/y位置計算。

在我的地圖,我加載瓷磚塊半徑內周圍的球員,所以一些內部的瓷磚將關閉屏幕(直到他們走動時,屏幕上的瓷磚位置移動)。

我試圖與瓦片的測試,這將是關閉屏幕:

Tile's x coord: 41 
41 * 25 = 1025 
Game window: 1024 
1025 % 1024 = 1 

這意味着瓦片X(其中,如果屏幕是0,0在圖0,0,應爲X: 1025,就在屏幕的右手側)實際上爲x:1,出現在左上角。

我想不出如何正確處理這個問題 - 在我看來,我需要採取tileX * tileWidth來確定它是「初始屏幕位置」,然後以某種方式使用偏移量來確定如何使其出現在屏幕上。但是抵消了什麼?

更新:我已經存儲了一個X/Y偏移值的球員動作的時候,所以我知道如何移動地圖。我可以使用這些值作爲當前偏移量,如果有人保存了遊戲,我可以簡單地存儲這些值並重新使用它們。沒有必要的方程式,我只需要存儲累積偏移量。

回答

-1
x = ((worldX*tileWidth) > screenWidth) ? worldX*tileWidth : (worldX*tileWidth)%screenWidth; 

這應該有效。雖然我建議實現類似界面的東西,並讓每個圖塊決定他們想要渲染的位置。這樣

interface Renderable { 


void Render(Graphics2D g) 
    .. 
} 

class Tile implements Renderable{ 
    int x,y 
    //other stuff 


    Render(Graphics2D g){ 
    if (!inScreen()){ 
    return; 
    } 
    //... 
    //render 
    } 


    boolean inScreen(){ 
    //if the map moves with the player you need to define the boundaries of your current screenblock in terms of the global map coordinates 
    //What you can do is store this globally in a singleton somewhere or pass it to the constructor of each tile. 
    //currentBlock.x is then player.x - screenWidth/2 
    //currentBlock.width is then player.x + screenWidth/2; 
    //similar for y 


    if(this.x < currentBlock.x || this.x > currentBlock.Width) 
     return false; 
    if (this.y < currentBlock.y || this.y > currentBlock.height) 
     return false; 
    return true; 


    //If the map are in blocks (think zelda on snes where you go from one screenblock to another) you still need to define the boundaries 
    //currentBlock.x = (player.x/screenWidth) (integer division) *screenWidth; 
    //currentBlock.width = (player.x /screenWidth) (...) * screenWidth + screenWidth; 
    //same for y 
    //Then perform above tests 

} 
+0

您的解決方案對我來說沒有什麼意義:如果它在屏幕外,讓它在屏幕上畫出來,如果它在屏幕上,那麼你已經證明不會做任何模操作?如果worldX * tileWidth不是> screenWidth,則worldX * tileWidth%screenWidth == worldX * tileWidth。這三元是毫無意義的,因爲無論哪條路徑,你都會得到worldX * tileWidth。 – Adrian

+0

這是真的,但如果你向下滾動兩行,你會看到替代解決方案,但他的問題並沒有真正回答他的觀點是以玩家爲中心還是以地圖爲中心,所以我提供了兩種選擇。 – arynaq

1

模數(worldX * tileWidth 屏幕寬度)的東西是什麼導致它復位。模(%)給你一個整數除法操作的其餘部分;所以,如果worldX * tileWidth比屏幕寬度更大,它會給你(worldX * tileWidth)/屏幕寬度的剩餘部分;如果worldX * tileWidth爲screenWidth + 1,則餘數爲1:它從行首開始。

如果消除模數,它將繼續繪製經過屏幕邊緣的圖塊。如果您的繪圖緩衝區與屏幕尺寸相同,則需要在屏幕邊緣添加對地磚的檢查,以確保您只繪製可見的地磚部分。

如果你想保持在屏幕中央的球員,你需要以抵消由玩家每個瓷片從像素瓷磚0,0偏移量,減去一半屏幕寬度:

offsetX = (playerWorldX * tileWidth) - (screenWidth/2); 
screenX = (worldX * tileWidth) - offsetX; 
相關問題