alien_invasion项目总结
1.疑问:
在game_functions()模块中的update_bullets(bullets)中,bullets是在alien_invasion.py中定义的编组Group()实例,在定义它之前需要import Group,然而在update_bullets(bullets)
中可直接对bullets进行操作,如remove()、copy()等,这是在未import Group的情况下进行的。
2.关于外星人群移动的问题,将代码与参考代码反复比对,并无错误,但是每次屏幕上只能显示一列,各种瞎调试也没用,然后想到将整个群往下移动时,是否会出现类似的情况,然而发现并没有。
下移的函数如下:
1 def fleet_down(ali_settings,aliens): 2 for alien in aliens.sprites(): 3 alien.rect.y += ali_settings.drop_speed 4 ali_settings.alien_dir *=-1
用于使aliens编组中的每个alien右移的方法update()定义如下:
1 def update(self): 2 """Move the alien right or left.""" 3 self.x += (self.ai_settings.alien_speed_factor * 4 self.ai_settings.fleet_direction) 5 self.rect.x = self.x
可以发现两者的不同在rect.x/y的改变方式,rect.y是直接赋值的 rect.x是通过self.x属性赋值的,这样做的初衷是为了使外星人群可向右移动小数个像素,在尝试直接给rect.x赋值后,问题解决。如果将下移的函数依照右移函数修改,外星人群下移时,就只能显示一行了。
可引起这个问题的原因是什么呢?
。。。。。知道原因了,,,,因为self.x属性只有在初始化每个alien的时候才给它赋值,令其等于self.rect.x,在之后修改每个alien位置使之排列时,并没有通过self.x来改变self.rect.x,因此在调用update()方法时,使用的self.x的值都是初始化时候的值,因此显示的只有x坐标为self.rect.x的那一列了,。 初始化函数如下:
def __init__(self,ali_settings,screen): super().__init__() self.screen=screen self.settings=ali_settings self.image=pygame.image.load('images/alien.bmp') self.rect=self.image.get_rect() self.rect.x=self.rect.width#x坐标初值 self.rect.y=0 self.x=float(self.rect.x)
写代码时一定思维缜密啊,不要为了省两行代码而犯了重大错误,有些看起来多余的代码,其实一点也不多余。。
3.使用Visual Studio作为python开发IDE:
使用缩进时,会出现问题,在使用IDLE打开时,会发现缩进很多,弄了半天才发现是制表符设置的问题,需要将制表符设置中的“使用空格代替”选中,而非“保留制表符”。
4.开发一个项目工作量还是比较大的,需要搞清楚项目需求,在项目的编写过程中不断修改类的定义、重构某些函数等。比较烦的是随着项目的开发,定义的类也越来越多,类的定义密切关系到代码维护、修改工作,需要十分仔细。
已经参照书籍完成了自己的第一个Python项目,简单地回顾一下项目过程。首先是pygame库的安装,然后根据游戏需求来一步步的完成游戏的制作。第一步实现的是游戏环境的搭建,利用pygame库打开一个一定大小的窗体,并设置它的背景色,并实现屏幕的重绘;第二步是实现游戏对象——飞船的加载,ship类的定义并实现它的上下左右移动,这个过程中运用的主要知识是按键事件的检测,值得注意的是如何实现按下键实现飞船的连续移动,以及飞船位置更新的函数是放在程序的哪一部分的;第三步就是实现飞船发射子弹的功能,子弹实际上就是一个个的小矩形,但是当子弹非常多的时候,如何实现所有子弹的位置同步更新呢?这时候就需要使用pygame中的Sprite类,“通过使用精灵,可以将游戏中相关元素编组,进而同时操作编组中的相关元素。” 游戏中子弹群bullets的定义是pygame.Sprite.Group的一个实例,对编组调用某个函数时(如位置更新函数),编组将自动对其中每个精灵调用该函数;第四步是实现外星人群的构建,每一个外星人都是类似于飞船的一个由图片加载而成的对象,并且为了方便对外星人群进行管理,alien类也需要继承精灵类Sprite,外星人群的构建需要计算屏幕中能容纳多少行、列的外星人,并根据外星人所在行列设定其位置,最后使用Group.add方法将外星人加入到外星人编组中,外星人编组与子弹编组稍有不同,例如在将这两个编组绘制到屏幕上的具体实现上:
外星人编组:
aliens.draw(screen)
子弹编组:
1 for bullet in bullets.sprites(): 2 bullet.draw_bullet()
这就是通过图片加载实现的类和通过pygame.draw.rect()方法绘制的区别在应用上的区别吧。
当实现了外星人群的构建后,需要实现外星人的移动、外星人是否撞到左右边缘;第五步实现子弹与外星人的碰撞检测及处理,通过pygame.sprite.groupcollide很容易实现这一功能,注意这一方法的返回值是一个字典。类似的有外星人与飞船的碰撞检测,通过pygame.sprite.spritecollideany(ship,aliens)实现。
以上几步已经实现了游戏的基本功能,下面就是一些细节的优化,如添加开始游戏按钮,添加记分功能、最高分功能,显示剩余飞船功能等。值得注意的是,点击“Play”按键的
功能通过使用pygame中的rect.collidepoint(point_x,point_y)实现。
其他的值得注意的是将所有要显示的信息如剩余飞船数、当前分数、最高分、当前等级全部放在board类中,通过board类中的方法显示所有信息,将游戏设置的有关量全部放
在settings类中。
浙公网安备 33010602011771号