PDA

View Full Version : حرکت شی ترسیم شده در فرم



Ms.lemon
پنج شنبه 22 تیر 1391, 09:28 صبح
سلام دوستان، پروژه ی من شامل یک کلاس Minesweeper است (بعنوان بخشی از بازی Minesweeper)، و در مجموع 20 تا شی از این کلاس ایجاد کردم. برای ترسیم هر Minesweeper از خطوط استفاده کردم و تعدادی نقطه را با خط بهم وصل کردم؛ به این شکل:

public static SPoint[] sweeper = {new SPoint(-1, -1), new SPoint(-1, 1),
new SPoint(-0.5, 1), new SPoint(-0.5, -1),
new SPoint(0.5, -1), new SPoint(1, -1),
new SPoint(1, 1), new SPoint(0.5, 1),
new SPoint(-0.5, -0.5), new SPoint(0.5, -0.5),
new SPoint(-0.5, 0.5), new SPoint(-0.25, 0.5),
new SPoint(-0.25, 1.75), new SPoint(0.25, 1.75),
new SPoint(0.25, 0.5), new SPoint(0.5, 0.5)
};


موقعیت این sweeper ها باید در صفحه تغییر کنه (دوران و جابجایی)، کاری که تا الان انجام می دادم این بوده که برای هر حرکت صفحه رو کاملاً پاک می کردم و مین سوییپر ها مجدداً رسم می شدند، اینجوری اثر قبلی هر مین سوییپر از بین می رفت. اما این کار باعث لرزش صفحه میشه، میخواستم ببینم راه حل بهتری سراغ ندارید که بشه همین خطوط را جابجا کرد یا مین سوییپرها را حرکت داد؟

the king
پنج شنبه 22 تیر 1391, 13:41 عصر
پیشنهاد می کنم که رسم تون رو توسط یک Bitmap انجام بدهید، یعنی هر وقت که قراره تصویر تغییر کنه اون Bitmap رو تغییر بدهید
و در کنترل مورد نظر نشون بدهید و تا زمانی که تغییری لازم نیست مجددا چیزی رسم نکنید. اینطوری Flicker رخ نمیده.


Bitmap bmp;

private void PaintInControl(Control target)
{
bool firstTime = false;
if (bmp == null)
{
firstTime = true;
bmp = new Bitmap(target.Width, target.Height);
}
using (Graphics g = Graphics.FromImage(bmp))
{
if (firstTime)
{
g.FillRectangle(Brushes.White, 0, 0, bmp.Width, bmp.Height);
}
// Your Code
}
target.GetType().GetProperty("Image").SetValue(target, bmp, null);
}


مثلا :

PaintInControl(pictureBox1);