【问题标题】:How do Draw Rubber band rectangle in DirectX?如何在 DirectX 中绘制橡皮筋矩形?
【发布时间】:2009-07-01 20:42:27
【问题描述】:

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

【问题讨论】:

    标签: c# directx


    【解决方案1】:

    做橡皮筋的经典方法是:

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

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

    【讨论】:

      【解决方案2】:

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

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

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

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-01-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-06-15
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多