我有一个生成2d游戏 map 图块的系统。区块为16x16区块,区块为25x25。
这些块被赋予了自己的坐标,例如0,0,0,1等。这些图块根据它们所在的块来确定其在世界中的坐标。我已经验证了这些块/图块都显示了正确的坐标x / y坐标。
我的问题是将它们转换为屏幕坐标。在上一个问题中,有人建议使用:(worldX * tileWidth) % viewport_width
每个图块的x / y将通过此计算运行,并返回屏幕x / y坐标。
这适用于适合视口的图块,但会为屏幕外的任何内容重置屏幕x / y位置计算。
在我的 map 中,我在玩家周围的半径范围内加载了大块图块,因此一些内部图块将不在屏幕上(直到它们四处移动,屏幕上的图块位置才会移动)。
我尝试了在屏幕外的图块进行测试:
Tile's x coord: 41
41 * 25 = 1025
Game window: 1024
1025 % 1024 = 1
这意味着图块x(如果屏幕0,0位于 map 0,0,则应位于x:1025,就在屏幕右侧),实际上位于x:1,显示在顶部-剩下。
我想不出如何正确处理它-在我看来,我需要使用
tileX * tileWidth
来确定它的“初始屏幕位置”,然后以某种方式使用偏移量来确定如何使其出现在屏幕上。但是,什么抵消呢?更新:当玩家移动时,我已经存储了x / y偏移值,因此我知道如何移动 map 。我可以将这些值用作当前偏移量,如果有人保存了游戏,我可以简单地存储这些值并重新使用它们。无需方程式,我只需要存储累积偏移量即可。
最佳答案
导致重置的模数(worldX * tileWidth % screenWidth)。模(%)为您提供整数除法运算的余数;因此,如果worldX * tileWidth大于screenWidth,它将为您提供(worldX * tileWidth)/ screenWidth的余数;如果worldX * tileWidth为screenWidth + 1,则余数为1:从行的开头开始。
如果消除了模数,它将继续在屏幕边缘上方绘制图块。如果绘图缓冲区的大小与屏幕大小相同,则需要在屏幕边缘添加一个平铺检查,以确保仅绘制可见的平铺部分。
如果要使播放器保持在屏幕中央,则需要使每个图块偏移播放器与图块0,0的偏移量(以像素为单位),减去屏幕宽度的一半:
offsetX = (playerWorldX * tileWidth) - (screenWidth / 2);
screenX = (worldX * tileWidth) - offsetX;
关于java - 将2D游戏世界坐标转换为屏幕位置,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/16884992/