none
GDI+实现动画效果 RRS feed

  • 问题

  • 我想用Windows窗口应用程序做一个俄罗斯方块的小游戏(暂时不能转移到WPF上做),在以前的版本中,其中的方块我是用的VB10的PowerPack中的Rectangle,后来发现VB的PowerPack不包含在.net 4.0中,布置起来比较麻烦,所以我也没有准备使用除.net 4.0之外的任何包和库。

    我的想法是只使用从窗口生成的Graphics作为基础来做这些,但是我不确定用Graphics画好之后如何将原来的图像“擦”掉,我的问题便是如何以最简单的方法实现动画?是应该反复擦掉还是应该以一种类似“移动”的方法…

    还有一个问题,就是用Graphics对象在窗口上操作后的资源“擦掉”之后会不会进行垃圾回收?

    谢谢各位老师!

    • 已编辑 Flysha 2011年3月15日 8:18
    2011年3月14日 4:56

答案

  • 你好

    这个链接是我以前写的一个简易的俄罗斯方块。只是实现了基本功能(刚传上去的)。可以参考下。

    http://download.csdn.net/source/3094797

    垃圾回收是CLR自动的内存管理,所以只有当某个特定的时间回去垃圾回收。也就是当内存不够再次分配对象的时候会去垃圾回收(0代满了)。

    当然你可以掉用GC.Collect()去手动垃圾回收。但是不建议你这样做。

    希望对你有帮助。


    Cookie Luo[MSFT]
    MSDN Community Support | Feedback to us
    Get or Request Code Sample from Microsoft
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.

    2011年3月15日 9:44

全部回复

  • 以前做过俄罗斯方块,我是将游戏区分成行列,然后每个节点一个方格,L就是纵向三个,横向1个。这样组合当前方块,落下后设置有方格的位置,标记下来。每次都重绘整个游戏区。一次性帖屏幕上。
    2011 c# mvp China. *George读起来像不像“饺子”,我爱吃饺子,我叫George。
    2011年3月14日 5:11
    版主
  • 我的正是像你说的这样做的:

    			// Shape 01:
    			// ****
    			// Color: Green
    			stone = new Stone();
    			stone.Color = Color.Green;
    			shape = new BasicShape(new byte[,] {
    					{1, 1, 1, 1}});
    			stone.Add(shape);
    			shape = new BasicShape(new byte[,] {
    					{1},
    					{1},
    					{1},
    					{1}});
    			stone.Add(shape);
    			I = stone;
    
    底层工作我都已经完成并通过测试了,现在的工作只是将底层的内容呈现出来!
    现在我觉得重绘整个游戏区我造成性能的可能下,而且也需要涉及到如何(或者是否需要)清理过去的资源的问题。
    另外还想请问能否封装一个Rectangle类并实现自己的Move方法?
    2011年3月14日 5:19
  • 我想用Windows窗口应用程序做一个俄罗斯方块的小游戏(暂时不能转移到WPF上做),在以前的版本中,其中的方块我是用的VB10的PowerPack中的Rectangle,后来发现VB的PowerPack不包含在.net 4.0中,布置起来比较麻烦,所以我也没有准备使用除.net 4.0之外的任何包和库。

    我的想法是只使用从窗口生成的Graphics作为基础来做这些,但是我不确定用Graphics画好之后如何将原来的图像“擦”掉,我的问题便是如何以最简单的方法实现动画?是应该反复擦掉还是应该以一种类似“移动”的方法…

    还有一个问题,就是用Graphics对象在窗口上操作后的资源“擦掉”之后会不会进行垃圾回收?

    谢谢各位老师!

    2011年3月15日 8:19
  • 你好

    这个链接是我以前写的一个简易的俄罗斯方块。只是实现了基本功能(刚传上去的)。可以参考下。

    http://download.csdn.net/source/3094797

    垃圾回收是CLR自动的内存管理,所以只有当某个特定的时间回去垃圾回收。也就是当内存不够再次分配对象的时候会去垃圾回收(0代满了)。

    当然你可以掉用GC.Collect()去手动垃圾回收。但是不建议你这样做。

    希望对你有帮助。


    Cookie Luo[MSFT]
    MSDN Community Support | Feedback to us
    Get or Request Code Sample from Microsoft
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.

    2011年3月15日 9:44