这次主要是设定飞船的运动速率,之前每按一次左右箭头飞船运动值为1,现在改变其值,如2.5,这样便能实现飞船以不同速率左右移动,可以在游戏中分等级或者难度大小来选择不同的模式;还有就是限定飞船的移动范围,保证其在屏幕以内运动,这里用到了self.rect.right<self.screen_rect.right和self.rect.left>0,因为屏幕的原点在左上角,所以rect的左边缘的x坐标大于零,就说明飞船未触及屏幕左边缘,向右同理,
self.rect.right将返回飞船外接矩形的右边缘的x坐标。
首先在settings.py中增加对飞船移动的步长值:
self.ship_speed=2.5 #设定飞船的步长
在主程序中对Ship()的参数进行修改:
ship=Ship(screen,ai_settings) #实例化Ship
在ship.py中的变动比较大,首先要接受参数ai_settings,在初始化函数中添加对应项:
self.ai_settings=ai_settings
然后声明新属性center,用于存储小数值:
self.center=float(self.rect.centerx)
因为rect.centerx只存储整数值,所以要用float转换一下。
接着是对飞船运动的更新:
def update(self): #按左右箭头实现centerx的变化 if self.moving_right and self.rect.right<self.screen_rect.right:#控制飞船的活动范围 self.center += self.ai_settings.ship_speed if self.moving_left and self.rect.left>0: self.center -= self.ai_settings.ship_speed #用center来更新centerx self.rect.centerx=self.center
大家注意到在最后赋值时centerx只能存储center的整数部分,不过这也无所谓,比如一开始的初值是1,那第一次移动的值为(1+2.5=3.5)的整数部分,即3,再一次为(3.5+2.5=6.0)的整数部分,即为6,这样对飞船的移动影响是比较小的。
最后对game_functions.py代码进行重构,使之更加明了,分别处理左右箭头的“按”与“松”,其中“按下”部分代码为:
def check_keydown(event,ship): if event.key==pygame.K_RIGHT: ship.moving_right=True #若按下右箭头则使ship.rect.centerx加步长值 elif event.key==pygame.K_LEFT: ship.moving_left=True #注意这里若同时按下左右箭头将检测到两个不同事件
注意到参数,要加上event,在check_events(ship)中调用时直接调用函数:
elif event.type==pygame.KEYDOWN: check_keydown(event,ship) elif event.type==pygame.KEYUP: check_keyup(event,ship)
大概就是这个样子。。效果图也不是很好展示,反正速度的确快了。。
最后再说下重构吧,我觉得前期先编写简单易懂的代码,到一定体量后将其中部分功能提取出来独立成函数,这里面涉及到很多问题吧,以后多多练习,希望能够把握其命脉……