zoukankan      html  css  js  c++  java
  • Python 小游戏 Bunny

    最近在学习Python,所以上网找了一个小程序练练手。

    关于这款名为【Bunny】的小游戏,详细请看下面的链接:

    http://www.oschina.net/translate/beginning-game-programming-for-teens-with-python

    这篇文章里面对游戏的所有代码都做了非常详细的说明,可以说就算是零基础的新手,也能在完整地抄写完代码后,就会对Python有个比较大概的了解。

    更妙的是,这篇文章还附带有游戏所需的图片及声音文件,不需要再花费额外的时间去寻找素材。

    如果你有Python的一点点基础,那么就只需要花3个小时的时间(甚至更短),就能做出一个小游戏出来,这让人非常有成就感。

    不过这毕竟只是一个练手的小游戏,更多地是向新手介绍Python和Pygame的入门,因此在结构上偏向于面向过程,算是一个小小的缺憾吧。

    因此我在源代码的基础上,对代码做了面向对象化的重构。

    重构后的代码可见文章最后的链接。

    首先将整个游戏做了一次封装,将主要的逻辑部分放入一个叫Game的类中。

    因此在运行游戏时,只需执行:

    from Game import Game
    
    game = Game()
    game.run()
    

    就够了。

    接下来就是对游戏各元素进行封装,大概可参考下图:

    上图是我用EXCEL大概画的一个UML类图,不是很精通,如果错误,请见谅。

    从上图可知,整个程序包括:

      1个Game主类

      2个工具类

      3个继承自pygame.sprite.Sprite的精灵类

    组成。

    Game里主要是负责逻辑判断,以及画面的调用绘制。

    3个精灵类则非常简单,只有包含精灵图片以及位置的初期化设置,以及详细的绘制方法。

    2个工具类中,AudioManager主要负责游戏初期时的音效导入,TextUtil只负责画面上时钟的绘制。这样在Game主类中就不要长篇累牍地写各控件的方法,只要简单调用一下就行。

    其实工具类中本还应该有一个图片的初期化导入模块,由于时间的关系,没有单独抽调出来,而是直接写在Game方法里了。

    关于精灵类的使用,因为图片导入时直接生成一个Surface对象,所以最初我想直接将这3个游戏对象继承自pygame.Surface类,以便可以方便调用。

    但是在实际中我发现Surface对象不能单独作为一个子对象使用,否则就会在传递的过程中会报错,抛出:

    Pygame: <Surface: (Dead Display)>

    的异常。

    这让我百思不得其解。最后在StackOverflow上看有人说只需要继承pygame.sprite.Sprite就可以了。

    pygame.sprite.Sprite是pygame的基础类,包含所需的各种基本方法和属性。

    而且Sprite中包含两个属性:image和rect,而且Sprite.image直接就可以返回一个Surface对象,足以满足要求。

    pygame有一个pygame.sprite.OrderedUpdates 类,它相当于Sprite的Group,可以非常方便的添加和删除Sprite对象。

    并且调用OrderedUpdates中的update()方法,可以直接调用所包含的对象的update(),省去对每个sprite对象进行绘制。

    经实践证明,确实好用。

    但是其中还有另外一个让我困惑的问题。

    OrderedUpdates.draw()方法可以返回一组有变化的sprite对象。

    如下代码,从官方网站提供的例子所示:

    group = pygame.sprite.OrderedUpdates()
    group.add(player)
    
    dirty = group.draw()
    pygame.display.update(dirty)
    

    画面上只有变动的sprite才会有所变化。在背景图不变的情况下,可以提高游戏的性能。

    但是在实际操作中发现,这个方法不能清除脏画面。画面移动后,会留下残影,非常难看。

    最后没有办法,只好用最土的方法,每次刷新画面的时候,需要将整个画面重新刷一次。

    这个简单的小游戏中,由于对象非常少,所以看不出太大的延迟,但是只要将移动的精灵数量提高200以上就会发现游戏变得非常顿卡。

    多方寻找无果,只好放弃,囧。

    希望各位如果有好的方法,望请不啬笔力,能够指点一下。

    重构后的代码链接:

    https://git.oschina.net/RelaxCat/Bunny

  • 相关阅读:
    防止头文件的重复包含问题
    git常用命令
    redis
    linux常用操作
    数据库安装
    mysql修改表结构
    mysql 忘记root密码及授权访问
    mysql连表查询
    mysql 存取ip方法
    php批量修改表结构
  • 原文地址:https://www.cnblogs.com/nonkicat/p/3508105.html
Copyright © 2011-2022 走看看