Я работаю над игрой Tower Defense, используя c ++ и SDL. Я хочу, чтобы мои враги стартовали на пути, но на каждом уровне старт начинается в другом месте. Я мог бы жестко запрограммировать пиксели, но это могло бы показаться немного беспорядочным, чтобы точно определить, где появляются враги во время тестирования и развития игры. То, как я это делаю, немного излишне с моей стороны, и я немного его подправлю. Но мне любопытно, есть ли лучший способ сделать это, чем то, что я делаю.
В моем классе плиток у меня есть две статические функции, которые я вызываю, когда мне нужно преобразовать координаты плитки в пиксельные координаты.
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), ...)
Как вы можете видеть это выглядит все в стиле фанк LOL. Я собирался что-то вроде этого:
enemy(Tile::ConvertTileToPixelCoords(0, 12), ...)
Примечание: я создаю врага в конструкторе (список инициализации).
Есть ли намного более простой способ добиться того, что я делаю? Я слишком много думаю?
Обычно код использует матрицу для хранения линейного преобразования.
Есть два типа; TileLoc
и PixelLoc
, Они хранят оба x
а также y
,
определять Tile2Pixel
как тип, когда *
с TileLoc
возвращает PixelLoc
, а также Pixel2Tile
это делает наоборот. Так же, TileLoc/Tike2Pixel=PixelLoc
,
Он содержит информацию о масштабе / ширине / высоте.
enemy
взять PixelLoc
, а не х и у.
enemy(TileLoc{0,12}*m_TileToPixel)
конструирует врага.
Tile2Pixel
мог использовать матрицу. Или, может быть, не стоит.
Других решений пока нет …