c# - 直接在游戏中绘制,而不是在屏幕中
问题描述
我在玩一个游戏,我想在上面画一条线。我不能使用Graphics.DrawLine
,因为它需要窗口/屏幕坐标,而不是游戏坐标。
我想从游戏的 pos A 到游戏的 pos B 画一条线。如果我将这些坐标放入DrawLine
,它将采用窗口/屏幕的 X 和 Y 坐标,而不是来自游戏。
在下图中作为示例,我想绘制蓝线,但使用DrawLine
它会绘制灰线。
即使这些点在屏幕上不可见,我也想绘制,就像我在这个例子中展示的那样。如果我在游戏场景中移动屏幕,则线保持静止,因为点 A 和 B 的坐标保持不变。
有没有办法做到这一点?
解决方案
这里的重点是将世界坐标转换为屏幕坐标。例如,假设我想在世界地图中从点 x = 100, y = 600 到点 x = 700, y 600 画一条线,屏幕左侧位于 x = 300,底部位于 y = 300在世界坐标中,那么绘图应该从 x = -200, y = 300 到 x = 400, y = 300 在屏幕坐标中,这将在屏幕中心完成绘制的线,假设它的分辨率是 800x600。
由于屏幕相对于世界场景移动,因此世界到屏幕方法的代码可以是:
static int[] WorldToScreen(int worldX, int worldY, int worldX2, int worldY2, int screenLeft, int screenBottom)
{
int screenX = worldX - screenLeft;
int screenY = worldY - screenBottom;
int screenX2 = worldX2 - screenLeft;
int screenY2 = worldY2 - screenBottom;
return new int[] { screenX, screenY, screenX2, screenY2 };
}
现在我们只需使用这些转换后的坐标并使用 GDI、DirectX 或任何您想要的东西在屏幕上绘制。
PS:屏幕(或相机)坐标通常与屏幕中心有关。我在这里使用边缘只是为了简化。
推荐阅读
- nginx - nginx权限问题在centos 7上提供静态文件
- php - 二维数组 - 按值搜索并返回数组的索引
- java - Java如何编写一个通用的Util来打印所有函数的当前执行的函数名?
- reactjs - 如何正确访问我的新 map () 对象作为数组
- c++ - 内核调用产生错误“错误:无法配置主机函数调用”。调用有什么问题?
- google-apps-script - 如何在独立脚本运行时锁定电子表格
- python - Python C API:如何从模块中获取内容
- matrix - 如何在 BLAS 中复制跨步矩阵?
- python - 识别递归函数中的序列
- c# - ReadAllLines 没有正确读取文件路径的行