作者wwllccrr (松鼠)
看板C_Sharp
標題[問題] 繪圖與部分繪圖
時間Wed Feb 11 23:32:51 2009
剛接觸C#幾天,想用來實做一個簡單的遊戲,
鍵盤可控制腳色在畫面移動這樣的,
第一步就開始試著將圖片繪到表單上,
當然一開始使用PictureBox放完背景再蓋一層主角上去發現控制項無法真正透明的問題,
就改用GDI繪圖的方式,
然後又碰到畫面閃爍的問題,
查了很久資料看到有幾種寫法:用Graphics當Buffer雙緩衝、BufferedGraphics類別、
改表單DoubleBuffer參數、以前MFC會用的dll方法等等...
看起來第一個方法比較簡單,就用第一種寫了...
因為不熟悉覆寫等OO寫法,我是先建立OnPaint,在裡面直接呼叫自己寫的Paint函式,
裡面先繪到一個緩衝的Graphics,再把這個Bitmap繪到畫面上,
根據timer將圖片的座標改變並call我寫的Paint函式,而不讓他自動Invalidate(),
像這樣:
private void MyPaint(){
Bitmap offScreenBmp = new Bitmap(this.Width, this.Height);
Graphics Buffer;
Buffer = Graphics.FromImage(offScreenBmp);
Graphics Screen = this.CreateGraphics();
Bitmap pic = new Bitmap("pic1.jpg");
Buffer.Clear(this.BackColor);
Buffer.DrawImage(pic, pic_x, pic_y, pic.Width, pic.Height);
Screen.DrawImage(offScreenBmp, 0, 0);
Buffer.Dispose();
Screen.Dispose();
}
從畫面上看似乎是沒在閃爍也正常移動了,
記憶體用量卻會從15,000k一直增加到832,000k左右,再跳回去循環,
是不是寫法有問題呢?!
如果我在移動的重繪只繪上主角的圖片,背景會不見,
那如果畫面上很多物體都在移動的時候,會不會記憶體被吃光...?
還是有辦法只讓移動的部分重繪?
對於畫布到底怎麼更新的實在沒什麼概念...
希望大家指點,謝謝!
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 61.59.245.253
推 ideaup: Screen.DrawImage(offScreenBmp,0,0);OnPaint僅需要此行 02/12 06:40
→ wwllccrr:那請問Screen和offScreenBmp的宣告是放在廣域嗎? 02/12 16:39
→ ideaup:Screen和offScreenBmp的宣告 放在廣域 02/13 06:40