我正在使用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