- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我的项目暂时使用等距透视图,我在它们上方以网格格式显示坐标以进行调试。但是,当涉及到播放器的碰撞/网格锁定时,我遇到了一个问题。
由于 sprite 绘图的性质,我的数学计算在纹理的“三角形”角空白区域产生了一些问题。我认为问题如下所示(蓝色是我认为我的瓷砖被检测到的方式,而红色是理想情况下应该如何检测它们以在瓷砖上进行准确的漫游运动:
如您所见,检查我所站立的方 block 的 bool 值(它取玩家脚中心的像素,玩家稍后将是一辆汽车并根据移动方向取一个像素)返回 false并在几种情况下拒绝移动,以及让玩家在某些不应被允许的地方移动。
我认为这是因为每个纹理的截止区域(我认为)被认为是网格区域的一部分,所以当玩家在这些角落区域之一时,它并没有真正检查正确的图 block ,因此返回错误的结果。
我用来创建网格的代码是这样的:
int VisualComponent::TileConversion(Tile* tileToConvert, bool xOrY)
{
int X = (tileToConvert->x - tileToConvert->y) * 64; //change 64 to TILE_WIDTH_HALF
int Y = (tileToConvert->x + tileToConvert->y) * 25;
/*int X = (tileToConvert->x * 128 / 2) + (tileToConvert->y * 128 / 2) + 100;
int Y = (tileToConvert->y * 50 / 2) - (tileToConvert->x * 50 / 2) + 100;*/
if (xOrY)
{
return X;
}
else
{
return Y;
}
}
检查玩家移动的代码是:
bool Clsentity::CheckMovementTile(int xpos, int ypos, ClsMapData* mapData) //check if the movement will end on a legitimate road tile UNOPTIMISED AS RUNS EVERY FRAME FOR EVERY TILE
{
int x = xpos + 7; //get the center bottom pixel as this is more suitable than the first on an iso grid (more realistic 'foot' placement)
int y = ypos + 45;
int mapX = (x / 64 + y / 25) / 2; //64 is TILE-WIDTH HALF and 25 is TILE HEIGHT
int mapY = (y / 25 - (x / 64)) / 2;
for (int i = 0; i < mapData->tilesList.size(); i++) //for each tile of the map
{
if (mapData->tilesList[i]->x == mapX && mapData->tilesList[i]->y == mapY) //if there is an existing tile that will be entered
{
if (mapData->tilesList[i]->movementTile)
{
HAPI->DebugText(std::to_string(mapX) + " is the x and the y is " + std::to_string(mapY));
return true;
}
}
}
return false;
}
在游戏循环方面解决这个问题之前,我有点卡在进度上。如果有人认为他们知道这个问题或者可能能够提供帮助,那就太好了,我将不胜感激。也供引用,我的图 block 纹理是 128x64 像素,将它们绘制到屏幕背后的数学将它们视为 128x50(以干净地链接在一起)。
最佳答案
与其为渲染和点击映射编写特定的例程,不如认真考虑将它们视为数据的两个 View ,它们可以根据坐标空间的矩阵变换进行变换。您可以有两个坐标空间 - 一个是用于定位和逻辑的漂亮矩形网格。另一个是用于显示和输入的等距 View 。
如果您不熟悉线性代数,您可能需要一点时间来了解它,但一旦您了解了,一切都会变得微不足道。
那么,它是如何工作的呢?您的等距 View 只是沼泽标准 GridView 的旋转,对吗?好吧,关闭。如果您从正方形网格开始,等距 View 也会更改尺寸。总之:我们可以做一个简单的坐标变换吗?
纹理点 => 旋转 45 度 => 按 sqrt(2) 缩放,因为 45 度旋转会按 sqrt(1 * 1 + 1 * 1) 改变 block 的尺寸
点击点 => 按 sqrt(2) 去缩放到 unsquish => 取消旋转 45 度
如果您可以进行坐标转换,那么您编写的所有其他内容都将处理一个漂亮的沼泽标准矩形网格,这将使您的任何其他逻辑变得更加简单。您在那里的计算不会涉及计算角度或斜率。例如。现在你的“我可以'向下'移动吗”逻辑要简单得多。
为简单起见,假设您有 64 x 64 的图 block 。现在将屏幕空间点击转换为逻辑图 block 很简单:
(int, int) whichTile(clickX, clickY) {
logicalX, logicalY = transform(clickX, clickY)
return (logicalX / 64, logicalY / 64)
}
您可以通过一些简单的操作来检查 x0,y0 和 x1,y1 是否在逻辑空间中的同一个图 block 上:
bool isSameTile(x0, y0, x1, y1) {
return floor(x0/64) == floor(x1/64) && floor(y0/64) == floor(y1/64)
}
一旦您定义了转换并在逻辑空间中工作,一切都会变得更加简单。
http://en.wikipedia.org/wiki/Rotation_matrix
http://en.wikipedia.org/wiki/Scaling_%28geometry%29#Matrix_representation
http://www.alcove-games.com/advanced-tutorials/isometric-tile-picking/
如果您不想处理某些矩阵库,您可以非常直接地进行等效数学计算,但是如果您通过这些转换将逻辑管理的关注点与显示/输入分开,我想您会更容易时间到了。
关于c++ - 等距碰撞 - 'Diamond' 形状检测,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27982541/
我有一个标准的 CSS 菜单,用 UL 和 LI 标签制作。我需要它们水平地覆盖整个页面(不是我的真实情况,但我会以此来简化情况)。但是,这些元素是动态创建的,因此我无法对 LI 元素或边距进行任何硬
我很难描述我在寻找什么(在 Google 上搜索) 我有动态 Logo 内容,可以是 3 个 Logo ,也可以是 7 个。我的模板需要容纳所有这些,它们都需要以等间距显示在一行中。.. 例如,如果我
我以编程方式使用 SKTileMapNode。代码是 C# (Xamarin.iOS),但每个 Swift/ObjC 开发人员都应该可以阅读。 问题是等角投影中的图 block 排序似乎不正确,我不明
我需要内联 DIV 彼此之间的间距相等,另外还需要在行中的边框和第一个(或最后一个)DIV 之间。我使用在 Fluid width with equally spaced DIVs 上找到的解决方案.
我有一个流式布局页面,它设置了正文的最大宽度和最小宽度(分别为 1260 像素和 960 像素)。我有一个左侧边栏,它占据了屏幕左侧的 25%,内容占据了屏幕右侧的 75%。在内容中,我放置了两个带有
我正在为游戏制作等距 map ,我可以绘制它,但我不知道如何在没有 Threejs 或其他 3d 库的情况下实现某种 3d 碰撞检测。 有可能吗?也许将 block 变成对象可以有所帮助?我已经搜索过
我正在尝试创建一个标题,中间有一个 Logo ,两侧有两个按钮。我希望按钮和 Logo 在水平方向上均匀分布,然后在垂直空间的中心。下图是我目前所拥有的,粉红色只是为了让我可以看到标题在做什么。 这是
我有一个流体宽度的容器 DIV。 在这里面我有 4 个 DIV,都是 300px x 250px... 我想要将框 1 向左浮动,框 4 向右浮动,框 2
我有两个水平偏移的相机,并在针孔等效模型(失真系数k1, k2, k3, k4)下使用Kalibr获取了它们的校准参数(相机矩阵和失真系数,以及它们之间的转换)。 我想使用openCVs cv.fis
很难说出这里问的是什么。这个问题是含糊的、模糊的、不完整的、过于宽泛的或修辞性的,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开它,visit the help center 。 已关
对于 iOS 图表库,有人知道如何使 y 轴值彼此等距吗?那么在下图中,“1”线会在图形的中间吗? 最佳答案 将 axisMinimum 设置为零将产生您想要的输出。 //chartView is t
我已经实现了一个基本的等距图 block 引擎,可以通过用鼠标拖动 map 来探索它。请看下面的 fiddle 并拖走: http://jsfiddle.net/kHydg/14/ 分解的代码是(Co
我有一个 1387 像素宽的联系栏 (.png) 和覆盖它的四个包含联系信息(电子邮件、twr、fb)的相同 div。它应该是这样的: 问题:无论窗口大小如何,我如何将联系人 div 平均间隔并将它们
我只需要在屏幕上绘制图 block 以提高性能。执行此操作的可行方法是什么? 我试过这个使我接近但最终遇到了一个我似乎无法解决的错误。 //world position to start drawin
我已经编写了 A* 搜索算法的实现。问题是我目前使用的启发式方法只能在正方形网格上准确工作。由于我的 map 是等轴测图,启发式方法没有考虑 map 的实际布局,因此也没有考虑单元格之间的距离。 更新
我正在使用 transform: rotateX(60deg) rotateY(0deg) rotateZ(-45deg); 使元素看起来像是处于等轴测视角。我想知道我如何才能恢复对某些 child
如何让 UIStackView 在 View 之间具有与填充和间隙相同的空间? 如何实现这种布局: 当这个不适合我时: 这也不是: 我只需要周围的 View 空间与 View 之间的空间相同。为什么这
我确实对等角 View 中的鼠标点击有疑问。简而言之,我有一张平面 map ,就像我说的,有一个等距 View 的相机。现在,当我单击窗口时,我想获取我在 map 上单击的位置的坐标。有什么帮助吗?
我有一个正在构建的 Isometric 引擎: http://jsfiddle.net/neuroflux/09h43kz7/1/ (方向键移动)。 我正在更新 Engine.player.x 和 E
我有一个占据整个屏幕的包装器,我想使另一个 div 在它内部居中,并且它的所有边都与包装器等距。 CSS: #wrapper { width:100%; height:100%;
我是一名优秀的程序员,十分优秀!