2017-07-17 129 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

相关问题