缩放地图纹理时无法将玩家位置保持居中的技术问题求助
如何让地图纹理在不同缩放比例下始终将玩家保持在窗口中央?
我来帮你梳理下这个问题——你要实现的是地图纹理跟随玩家,不管缩放比例怎么调,玩家都稳稳待在窗口中央对吧?从你贴的代码来看,问题确实出在缩放相关的计算逻辑上,尤其是mapSizeX/Y的定义和纹理绘制坐标的计算部分。
核心问题分析
首先看你当前的缩放计算:
mapSizeX = 25600 / -zoomSize; // 缩放与尺寸比例 mapSizeY = 25600 / zoomSize;
这里的25600是个和实际纹理不匹配的硬编码值,但你明确说纹理尺寸是1500x1600、玩家在纹理中的坐标是(140,590),用这个不相关的尺寸计算缩放比例,自然会导致不同zoomSize下位置偏移错乱。
另外,纹理绘制坐标的逻辑也搞反了:你当前是用窗口中点加上玩家位置的缩放偏移,这和“让玩家对应窗口中央”的需求完全相反——正确逻辑应该是让纹理偏移,使得玩家在纹理中的位置刚好落在窗口中点。
修正后的代码方案
我把你的代码调整了一下,核心是对齐实际纹理参数,修正缩放和偏移的计算逻辑:
if (!areTexturesInit) { InitiateTextures(); areTexturesInit = true; } wxBitmap bit(imageTest); wxPaintDC dc(this); // 配置关键参数:用你实际的纹理尺寸和玩家在纹理中的坐标 const int texWidth = 1500; const int texHeight = 1600; const float playerTexX = 140.0f; const float playerTexY = 590.0f; double zoomSize = 0.9; // 0.1=缩小显示更大范围,0.9=放大显示更小范围 this->SetSize(wxSize(386, 386)); wxSize windowSize = GetSize(); int winWidth = windowSize.x; int winHeight = windowSize.y; // 窗口中点坐标 float middleX = winWidth / 2.0f; float middleY = winHeight / 2.0f; // 计算缩放后的纹理尺寸,以及玩家在缩放后纹理中的位置 float scaledPlayerX = playerTexX / zoomSize; float scaledPlayerY = playerTexY / zoomSize; // 计算纹理的绘制偏移:让玩家位置刚好对应窗口中点 float drawX = middleX - scaledPlayerX; float drawY = middleY - scaledPlayerY; // 绘制纹理(最后一个参数设为true保持纹理比例) dc.DrawBitmap(bit, drawX, drawY, true); // 绘制玩家位置(红色方块,直接在窗口中点绘制即可) dc.SetPen(wxPen(wxColor(255, 0, 0), 4)); dc.DrawRectangle(wxRect(middleX - 1, middleY - 1, 2, 2));
关键改动说明
- 替换魔法值:把硬编码的
25600换成你实际的纹理尺寸,确保缩放计算和真实纹理匹配。 - 修正偏移逻辑:纹理的绘制坐标是
窗口中点 - 缩放后的玩家纹理坐标,这样不管缩放比例怎么调,玩家在纹理中的位置都会刚好落在窗口中央。 - 简化玩家位置绘制:既然玩家始终在窗口中央,直接在中点绘制红色方块即可,不需要再通过
PositionToMapPosition做多余计算(如果这个函数是用来处理旋转逻辑,可以保留,但位置直接用中点就对了)。
你可以试试调整不同的zoomSize值,比如0.1、0.67、0.9,应该都能让玩家稳稳待在窗口中央,纹理的位置也会正确跟随缩放比例变化。
内容的提问来源于stack exchange,提问作者Aerya
相关产品推荐
相关产品推荐

