我正在使用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), ...)
注:我在構造函數(初始化列表)中創建敵人。
有沒有更簡單的方法來實現我在做什麼?我是否過度了?
如果TILEWIDTH和SCALE永不改變,只要使它們爲靜態,以便您可以在靜態函數中訪問它們。 (可能將它們移動到一個單獨的'GameSettings'靜態類也許?) –
如果你想真正核心,定義不同的TileCoord和PixelCoord類型(封裝一對x和y值),並定義類型轉換運算符來做必要的算術。然後,可以隨意編寫函數(TileCoord(2,4))或函數(PixelCoord(128,256)),並讓編譯器瞭解如何調用函數(const PixelCoord&)。 – timday
@BlueBoy我沒有讓這些變量變成靜態的原因是因爲我正在創建一個框架,因爲我正在取得進展。基本上,當我創建一個遊戲時,我通過SCALE等。那樣如果我決定做另一場比賽;我可以重用大部分代碼(我將把它放到一個庫中)。 – Vince