Как нарисовать прямоугольник с резинкой в ​​DirectX? - PullRequest
2 голосов
/ 28 октября 2008

Как нарисовать прямоугольник с резинкой 2D в DirectX? Предпочтительнее использовать C #.

Ответы [ 2 ]

3 голосов
/ 28 октября 2008

Классический способ делать резиновые ленты:

  • Нарисуйте обычную сцену, то есть "фон"
  • Переключитесь в «режим XOR», где ваше перо будет XOR пикселей уже в кадровом буфере. Важно, что здесь используется режим XOR, поскольку XOR без потерь «обратим», в отличие, например, от операции добавления.
  • Пока "резиновая лента":
    • Нарисуйте прямоугольник с резинкой в ​​его текущих координатах
    • В следующем кадре снова нарисуйте прямоугольник, все еще используя XOR, используя его предыдущие координаты. Это удалит прямоугольник, оставив кадровый буфер без изменений.
    • Обновить координаты прямоугольника

Подробно о том, как сделать это «с DirectX», немного сложнее… Я считаю, что DirectDraw, «старый школьный» способ создания 2D в DirectX, устарел, поэтому я предполагаю, что вы должны использовать Direct3D. К сожалению, я не уверен в деталях, там. Возможно, вам не повезло с поиском предопределенной функциональности для рисования XOR, и вам нужно свернуть свою собственную. Надеюсь, кто-то может предоставить более подробную информацию об этом. Извините, если вы уже были в курсе самой теории резиновой ленты.

0 голосов
/ 01 июля 2009

Вам нужны две точечные переменные (каждая из которых содержит координаты x и y). Давайте назовем их FirstPoint и SecondPoint.

При mousedown сохраните текущую позицию мыши в FirstPoint и SecondPoint. Пока мышь не работает, всякий раз, когда она движется, обновляйте SecondPoint с новой позицией мыши.

Затем в каждом кадре, если мышь нажата, нарисуйте прямоугольник на основе двух углов, FirstPoint и SecondPoint. Вам понадобится немного математики, чтобы определить, являются ли они верхним левым / нижним правым или верхним правым / нижним левым, и какой именно, но затем вы просто рисуете прямоугольник между ними или два треугольника. Вам, конечно, придется переключиться в орфографический (2D) режим перед рисованием.

Я не уверен насчет ответа открутки, я даже не знаю, как выполнить операцию XOR, и она кажется чрезмерно сложной, если только вы не хотите, чтобы прямоугольник был отрицательным по отношению к фону (что и является операцией XOR сделал бы, я верю). Кроме того, если вы перерисовываете сцену в каждом кадре, нет причин делать глупые XOR взад и вперед, чтобы стереть предыдущий прямоугольник; это уже было бы переписано рисованием нового кадра.

Я бы лично предпочел нарисовать прямоугольник со сплошным контуром и полупрозрачной заливкой; для этого установите для текущего цвета значение альфа, равное, возможно, 128 (или 0,5f), и нарисуйте прямоугольник между двумя точками, а затем измените режим рисования многоугольника на линию, установите цвет сплошным и нарисуйте еще один прямоугольник.

Наконец, я уверен, что вы захотите отреагировать на резинку; когда мышь отпущена, делайте все, что вам нужно, на основе переменных FirstPoint и SecondPoint. Кроме того, ваш код рисования должен рисовать прямоугольник только когда мышь нажата, поэтому он перестанет рисоваться.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...