C # Только обновить PictureBox / Panel, когда сказать им, чтобы обновить? - PullRequest
3 голосов
/ 20 января 2011

Я делаю игру Bomberman в C # Windows. Он имеет более 300 коробок (стен), которые размещены на панели. На этой панели также находится изображение самого Бомбермена.

При изменении местоположения Picturebox Bombermans все элементы управления на панели автоматически обновляются. Поскольку на этой панели расположено так много элементов управления, а расположение ящика с изображениями меняется несколько раз в секунду, программа начинает зависать при попытке переместиться.

Я хочу контролировать событие обновления панели (и его элементов управления), потому что я думаю, что моя проблема решается, когда обновляются только те графические блоки, которые необходимо обновить.

Я надеюсь, что кто-то может помочь мне с этим!

Рууд.

Ответы [ 2 ]

0 голосов
/ 20 января 2011

Вы пытаетесь нарисовать всю форму, что, безусловно, займет время.Если вы хотите изменить только часть формы, которая в вашем случае - Перемещение бомбардировщика на новую позицию, аннулируйте только область, которую вы хотите перекрасить, и затем передайте ее методу Invalidate.похоже на это.

//Invalidate previous position of bomberman
Rectangle invalid = new Rectangle(picturebox1.Location.x,picturebox1.Location.y,picturebox1.Width,picturebox1.Height);
Invalidate(invalid);
//Add code to move your picture box and then call above two lines again
invalid = new Rectangle(picturebox1.Location.x,picturebox1.Location.y,picturebox1.Width,picturebox1.Height);
Invalidate(invalid);

Обратите внимание, что кое-что похожее отшлифованный код будет работать ...

Вот ссылка на пример для справки.http://msdn.microsoft.com/en-us/library/ms229628.aspx

0 голосов
/ 20 января 2011

Если вы перемещаете ребенка, родитель должен быть обновлен, потому что может потребоваться нарисовать область, где ранее находился ребенок.Это также означало бы, что все дети (родителя) будут обновлены.

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

...