2

如何在 DirectX 中绘制 2D 橡皮筋矩形?最好使用 C#。

4

2 回答 2

3

做橡皮筋的经典方法是:

  • 绘制常规场景,即“背景”
  • 切换到“XOR 模式”,您的笔将对帧缓冲区中已有的像素进行 XOR。这里的模式是 XOR 很重要,因为 XOR 是无损“可恢复的”,这与加法运算不同。
  • 在“橡皮筋”时:
    • 在其当前坐标中绘制橡皮筋矩形
    • 在下一帧,再次绘制矩形,仍然使用 XOR,使用它之前的坐标。这将删除矩形,使帧缓冲区完好无损。
    • 更新矩形的坐标

有关如何“使用 DirectX”执行此操作的详细信息有点困难……我相信 DirectDraw,在 DirectX 中进行 2D 的“老派”方式已经过时,所以我猜你一定是在使用 Direct3D。不幸的是,我不确定那里的细节。可能是您没有找到预定义的功能来进行 XOR 绘图,并且需要自己动手。希望有人可以提供更好的细节。抱歉,如果您已经了解橡皮筋理论本身的速度。

于 2008-10-28T09:44:30.597 回答
0

您需要两个点变量(每个变量都保存 x 和 y 坐标)。我们称它们为 FirstPoint 和 SecondPoint。

在 mousedown 时,将当前鼠标位置存储到 FirstPoint 和 SecondPoint。只要鼠标按下,只要它移动,就用新的鼠标位置更新 SecondPoint。

然后每一帧如果鼠标按下,根据两个角FirstPoint和SecondPoint绘制一个矩形。你需要一点点数学来检测它们是左上/右下还是右上/左下以及哪个是哪个,但是你只需在它们之间画一个矩形,或者两个三角形。您当然必须在绘图之前切换到正交 (2D) 模式。

我不确定 unwind 的答案,我什至不知道如何进行 XOR 操作,而且它似乎过于复杂,除非您特别希望矩形成为背景的负数(这就是 XOR 操作会做的事情,我相信)。此外,如果您在每一帧都重新绘制场景,则没有理由来回执行一些愚蠢的异或操作来擦除前一个矩形;它已经通过绘制新框架被覆盖了。

我个人更喜欢画一个带有实心轮廓和半透明填充的矩形;为此,将当前颜色设置为 alpha 值可能为 128(或 0.5f)并在两点之间绘制矩形,然后将多边形绘制模式更改为线条并将颜色设置为纯色,然后绘制另一个矩形。

最后,我确定您会想对橡皮筋做出反应;释放鼠标后,根据 FirstPoint 和 SecondPoint 变量执行您需要的任何操作。此外,您的绘制代码应该只在鼠标按下时绘制矩形,因此它将停止绘制。

于 2009-07-01T12:42:27.317 回答