2017-07-17 73 views
-1

我正在使用C++和SDL進行塔防遊戲。我希望我的敵人從道路上開始,但每個關卡的起點都在不同的位置。我可以對像素進行硬編碼,但在測試和完成遊戲過程中確切知道敵人在哪裏產卵時,看起來有點麻煩。我這樣做的方式有點多餘,我會稍微調整一下。但我很好奇,如果有更好的方式來做到這一點,那我就不會做。我如何將2D遊戲中的瓦片座標轉換爲C++中的像素座標

在我的瓷磚類中,我有兩個靜態函數,當我需要將瓷磚座標轉換爲像素座標時,我會調用它。

static int ConvertTileToPixelX(int tileX, int tileSize, int scale) { return tileX * tileSize * scale; } 
static int ConvertTileToPixelY(int tileY, int tileSize, int scale) { return tileY * tileSize * scale; } 

正如你所看到的功能是一樣的東西,將3個參數相乘。我可以將它變成一個函數,但爲了可讀性,當我調用這些函數時會更容易。現在,由於這些是靜態函數,我無法訪問我爲瓦片(其中包含比例和切片)的變量,這就是爲什麼我將它們設置爲參數的原因。現在,每次我創造一個敵人的時候調用這些函數我必須鍵入:

enemy(Tile::ConvertTileToPixelX(0, TILEWIDTH, SCALE), Tile::ConvertTileToPixelY(12, TILEHEIGHT, SCALE), ...) 

正如你可以看到它看起來時髦都笑。我是這樣想的:

enemy(Tile::ConvertTileToPixelCoords(0, 12), ...) 

注:我在構造函數(初始化列表)中創建敵人。

有沒有更簡單的方法來實現我在做什麼?我是否過度了?

+0

如果TILEWIDTH和SCALE永不改變,只要使它們爲靜態,以便您可以在靜態函數中訪問它們。 (可能將它們移動到一個單獨的'GameSettings'靜態類也許?) –

+0

如果你想真正核心,定義不同的TileCoord和PixelCoord類型(封裝一對x和y值),並定義類型轉換運算符來做必要的算術。然後,可以隨意編寫函數(TileCoord(2,4))或函數(PixelCoord(128,256)),並讓編譯器瞭解如何調用函數(const PixelCoord&)。 – timday

+0

@BlueBoy我沒有讓這些變量變成靜態的原因是因爲我正在創建一個框架,因爲我正在取得進展。基本上,當我創建一個遊戲時,我通過SCALE等。那樣如果我決定做另一場比賽;我可以重用大部分代碼(我將把它放到一個庫中)。 – Vince

回答

0

通常,代碼使用矩陣來存儲線性變換。

有兩種類型;一個TileLoc和一個PixelLoc。他們存儲xy

Tile2Pixel定義作爲一種類型,當*TileLoc返回一個PixelLoc,和Pixel2Tile,做相反。同樣,TileLoc/Tike2Pixel=PixelLoc

它包含比例/寬度/高度信息。

enemy s取PixelLoc,不是x和y。

enemy(TileLoc{0,12}*m_TileToPixel) 

構建敵人。

Tile2Pixel可能使用矩陣。或者可能不值得。

+0

我對矩陣並不太熟悉,但我一定會考慮它的未來。 – Vince

相關問題