继续python写游戏1
首先创建一艘飞船:
pygame.display.set_caption("Alien Invasion")
#创建一艘飞船
ship=Ship(screen)
在wile循环中显示飞船
#每次循环时都会重绘屏幕
screen.fill(ai_settings.bg_color)
#绘制飞船
ship.blitme()
#让最近绘制的屏幕可见
pygame.display.flip()
接下来是重构 增加代码可读性
将check_events() 放在一个名为game_functions 的模块中
import sys
import pygame
def check_events():
#响应按键和鼠标事件
for event in pygame.event.get():
if event.type==pygame.QUIT:
sys.exit()
然后把事件放入alien_invasion.py模块中
while True:
gf.check_events()
#每次循环时都会重绘屏幕
screen.fill(ai_settings.bg_color)
把屏幕显示放入game_functions 的模块中命名为函数update_screen,并在alien_invasion.py模块中添加
while True:
gf.check_events()
gf.update_screen(ai_settings,screen,ship)
run_game()
现在飞船的显示完成 接下来是操纵飞船了
添加进这段代码就能控制飞船,不过只能一下一下按,不过这还只是一个开始,下面的改进可以持续移动
def check_events(ship):
#响应按键和鼠标事件
for event in pygame.event.get():
if event.type==pygame.QUIT:
sys.exit()
elif event.type==pygame.KEYDOWN:
if event.key==pygame.K_RIGHT:
#向右移动飞船
ship.rect.centerx+=1
上述方法只能实现按一次移动一次,我们可以这样想,改一下操作的东西,当按下一个键的时候把移动标志位改为True松开的时候又恢复为False 标志位为True的时候程序会实现一直移动(也就是说客户的操作从按键移动飞船变成了按键让飞船开始移动,具体的移动过程交给程序来做)
在ship.py文件里的修改
#将每艘新飞船放到屏幕底部中央
self.rect.centerx=self.screen_rect.centerx
self.rect.bottom=self.screen_rect.bottom
#移动标志
self.moving_rigth=False
def update(self):
#根据移动标志调整飞船位置
if self.moving_right:
self.rect.centerx+=1
接下来设置check_events
for event in pygame.event.get():
if event.type==pygame.QUIT:
sys.exit()
elif event.type==pygame.KEYDOWN:
if event.key==pygame.K_RIGHT:
#向右移动飞船
ship.moving_right=True
elif event.type==pygame.KEYUP:
if event.key==pygame.K_RIGHT:
ship.moving_right=False
增加飞船的移动速度:
def __init__(self,ai_settings,screen):
#初始化飞船并设置其初始位置
self.screen=screen
self.ai_setting=ai_settings
# 在飞船的属性center中存储小数值
self.center = float(self.rect.centerx)
def update(self):
#根据移动标志调整飞船位置
if self.moving_right:
self.center+=self.ai_settings.ship_speed_factor
if self.moving_left:
self.center-=self.rect.center-self.ai_settings.ship_speed_factor
#根据self.center更新rect对象
self.rect.centerx=self.center
在主项目中添加
gf.update_screen(ai_settings,screen,ship)
值得想一下想显示一艘飞船需要什么:1.飞船的属性,2.整个游戏背景的属性
控制飞船飞行范围
ship.py
def update(self):
#更新飞船的center值
#根据移动标志调整飞船位置
if self.moving_right and self.rect.right<self.screen_rect.right:
self.center+=self.ai_settings.ship_speed_factor
if self.moving_left and self.rect.left>self.screen_rect.left:
self.center-=self.ai_settings.ship_speed_factor
#根据self.center更新rect对象
self.rect.centerx=self.center
很简单,设计了一个self.center的变化范围
经过这一系列操作game_function.py文件就变得混乱了,需要重构一下
def check_keydown_events(event,ship):
#处理按下去
if event.key==pygame.K_RIGHT:
#向右移动飞船
ship.moving_right=True
elif event.key==pygame.K_LEFT:
#向左移动
ship.moving_left=True
def check_keyup_events(event,ship):
#处理按键弹上去
if event.key==pygame.K_RIGHT:
ship.moving_right=False
elif event.key==pygame.K_LEFT:
ship.moving_left=False
def check_events(ship):
#响应按键和鼠标事件
for event in pygame.event.get():
if event.type==pygame.QUIT:
sys.exit()
elif event.type==pygame.KEYDOWN:
check_keydown_events(event,ship)
elif event.type==pygame.KEYUP:
check_keyup_events(event,ship)
到现在为止创建了
alien_invasion.py ,创建了游戏窗口和飞船包含游戏的主循环,消息的捕获
settings.py 包含游戏的设置,窗口大小,窗口背景色和飞船的移动速度
* gam_functions.py* 包含函数响应事件和更新屏幕
ship.py 包含ship的方法和属性
到现在为止飞船就能显示并移动了(可以优化一下,让飞船可以上下移动)下面将开始发射子弹了