2013-04-06 3 views
0

Предположим, я несколько раз использовал DrawImage, чтобы нарисовать кучу изображений.Как удалить изображение из графика

e.Graphics.DrawImage(newImage, destRect);

Как я могу удалить конкретное изображение из графической бумаги, которые я нарисовал его? Есть ли конкретная функция, которую я могу использовать для удаления?

Я пробовал dispose и Rectangle.Empty, но они фактически не удаляют изображение, которое я уже нарисовал на бумаге.

+3

По удалению, вы имеете в виду перерисовать то, что было раньше, или просто накрыть сплошным цветом? Как только вы нарисуете что-то на графике, все, что было внизу, исчезло. –

+0

Ну, я искал способ удалить прямоугольник. Я пытаюсь реализовать игру прорыв игры, где у меня есть мяч, весло и куча кирпичей. Как только мяч попадает в кирпич, кирпич (прямоугольник) должен быть удален. У меня уже есть мяч, отскакивающий от кирпичей, и я пытаюсь найти способ окончательно удалить каждый кирпичный прямоугольник, чтобы мяч не отскочил от пустого места. – krikara

+0

Нет понятия «удалить» с объектом «Graphics». Вы должны перерисовать все, что было за кирпичом из какого-то другого источника. –

ответ

1

Прежде всего, в GDI + Graphics отсутствует понятие «удалить объект». Вы должны перерисовать всю клиентскую область в каждом фрейме. Вы должны хранить список объектов и их состояний в памяти и перерисовывать всю поверхность в каждом кадре. Остерегайтесь, однако, это может привести к мерцаниям и не очень приятному пользователю. Вот несколько советов, чтобы избежать их:

  1. Убедитесь, что ваша форма или UserControl имеет DoubleBuffered свойство установлено значение True. Это приведет к гораздо более плавной анимации, чем в противном случае.

  2. НИКОГДА НЕ звоните CreateGraphics(), чтобы получить ссылку на объект Graphics в вашем цикле рисования. Обновите список объектов и состояний в вашем цикле, а затем вызовите Invalidate() на свой элемент управления/форму и выполните процесс рисования в событии Paint.

  3. Одна перегрузка Invalidate() позволяет указать прямоугольник, который должен быть недействительным (перерисован). Вы можете передать «безопасный» прямоугольник вокруг текущего положения вашего прыгающего шара (например, на 20 пикселей шире/выше размера шара) в качестве инструмента, а затем нарисовать только ту часть вашего события Paint.

  4. Чтобы увеличить производительность, вы можете сохранить вспомогательную информацию, такую ​​как оценки, имена игроков и т. Д. Вне фактической «игровой площадки» и использовать вместо них обычные ярлыки/текстовые поля.

+0

Каково ваше предложение для шаров, поражающих кирпичи? Вы бы использовали Rectangle.Empty и снова использовать DrawImage? – krikara

+0

Не уверен, правильно ли я вас понял. Вы имеете в виду, как проверить хит-тест? Это так же просто, как взять пересечение ('Rectangle.IntersectsWith()') кирпичного прямоугольника и прямоугольника шара. – dotNET

+0

Да, в настоящее время я использую пересечения. Но я не вижу другого варианта удаления кирпичей, кроме процедуры ниже. – krikara

1

krikara, что вы должны сделать, это:

  1. Отслеживайте все кирпичи в списке
  2. Когда мяч попадает кирпич, удалите этот кирпич из списка

Каждый кадр, вы должны перерисовать все с нуля. Это включает в себя мяч, весло и список кирпичей (и все, что вам нужно, например, оценка и т. Д.)

Надеюсь, что это очистит все, что у вас было.

+0

Да, на данный момент я работаю над этим. – krikara

Смежные вопросы