看板 C_Sharp 關於我們 聯絡資訊
剛接觸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