C# 不同坐标系C的混淆及其转换

C# 不同坐标系C的混淆及其转换,c#,forms,coordinate-systems,cursor-position,mouse-position,C#,Forms,Coordinate Systems,Cursor Position,Mouse Position,我开始做一个2D游戏引擎项目,用一些演示游戏来测试引擎的功能。我在想如何将鼠标坐标转换为世界位置。让我解释一下: 当引擎运行游戏时,它首先创建一个给定大小的无边框窗口窗体。游戏以这种形式运行。当然,游戏包含代表游戏对象的精灵图像。在窗口内.Paint事件我通过Graphics.DrawImage将精灵绘制到窗体中 DrawImage函数使用的坐标系不知道它的名称,其中基本上0,0是左上角。我想用这个坐标系作为我的绝对单词坐标,以得到独立于一切的位置,例如,从相机位置,类似于Unity。这意味着,

我开始做一个2D游戏引擎项目,用一些演示游戏来测试引擎的功能。我在想如何将鼠标坐标转换为世界位置。让我解释一下:

当引擎运行游戏时,它首先创建一个给定大小的无边框窗口窗体。游戏以这种形式运行。当然,游戏包含代表游戏对象的精灵图像。在窗口内.Paint事件我通过Graphics.DrawImage将精灵绘制到窗体中

DrawImage函数使用的坐标系不知道它的名称,其中基本上0,0是左上角。我想用这个坐标系作为我的绝对单词坐标,以得到独立于一切的位置,例如,从相机位置,类似于Unity。这意味着,如果我通过Graphics.TranslateTransform将相机移开,0,0将不再位于左上角,因此原始的0,0将固定在固定点上。。多亏了这个,我可以用它作为一个通用的绝对坐标系

我需要使用鼠标,所以我有鼠标事件,问题就来了。。我需要将鼠标位置转换为上述绝对坐标系

我已经尝试过的:

使用Point client=Window.PointToClientCursor.Position;在GetMouseUp事件中。这给出了光标的相对位置,其中0,0始终位于左上角。。。即使我将相机移开,零位也将位于窗体的左上角。 使用Point client=Window.pointtoclient.Location;这给了我一个奇怪的结果!如果我使用fullHD 1920x1080或其960x540的一半作为窗口大小,请给我一个好结果并正确转换鼠标位置。。但是当窗口/窗体大小不同时,一切都会毁了!转换后的0,0将位于DrawImage 0,0所在的其他位置。。。 也许我错过了一些东西,因为这不应该这么难做到!DrawImage位置参数应使用表单坐标系,对吗?那为什么我不能转换鼠标的位置呢

再次说明:我想将鼠标位置转换为DrawImage使用的坐标系。。所以,如果我在游戏中点击一个精灵,我需要得到精灵所在的位置。。目前,我无法在游戏中选择任何对象/精灵,因为单击的位置与精灵的位置完全不同


谢谢你的帮助和解释

很好,谢谢你的链接,但我已经检查了很多论坛,包括链接的一个!与其他解决方案一样,我发现这个解决方案仍然有效,直到我用图形移动相机。TranslateTransform。。。总是给我左上角为零的位置。。。不好的!如果要使用任何类型的变换进行自定义绘图,则需要自己管理相应的坐标变换。Winforms只会为您提供一些控制。我认为WPF有一些更好的工具来实现这一点,因为它允许将转换应用到可视化树中的容器,允许使用常规的myMouseEventArgs.getpositionmycontrol如果我在表单上绘制图像,比如说在100,0,那么这个位置使用一个特定的坐标系,它看起来不是客户端/屏幕坐标系!我只需要访问这个。。有趣的实验:我用“指向屏幕”转换了图像位置100,0,结果得到了34035。。如果使用“PointToClient”转换结果位置,则返回100,0。。即使我用TranslateTransform把相机拿开。。即使图像在窗体窗口之外。。怎么可能呢?但用上述方法转换鼠标,会显示不同的结果。。太令人困惑了..@JonasH算了吧。。我会按照你的建议自己算算,自己管理!只是C不支持一种简单的方法来实现这一点,这让人很恼火。。我只是简单地想检测我是否点击了一个图像,即使我将相机移开。很多游戏都有相同的功能:玩家可以移动相机,可以点击物体等等。。无论如何谢谢你!