作者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
1F:推 ideaup: Screen.DrawImage(offScreenBmp,0,0);OnPaint仅需要此行 02/12 06:40
2F:→ wwllccrr:那请问Screen和offScreenBmp的宣告是放在广域吗? 02/12 16:39
3F:→ ideaup:Screen和offScreenBmp的宣告 放在广域 02/13 06:40