赞
踩
其中,监视键盘和鼠标事件的操作我们叫做check_event(),实时更新屏幕的操作我们叫update_screen()
如下图所示:
然后附上game_function.py文件的代码:
- import sys
- import pygame
-
-
- def check_event(ship): # 响应按键和鼠标事件
- for i in pygame.event.get():
- if i.type == pygame.QUIT:
- sys.exit()
-
- elif i.type == pygame.KEYDOWN:
- if i.key == pygame.K_RIGHT:
- # 向右移动飞船
- ship.moving_right = True
- # ship.rect.centerx += 10
- elif i.key == pygame.K_LEFT:
- # 向左移动飞船
- # ship.rect.centerx -= 10
- ship.moving_left = True
-
- elif i.type == pygame.KEYUP:
- if i.key == pygame.K_RIGHT:
- ship.moving_right = False
- elif i.key == pygame.K_LEFT:
- ship.moving_left = False
-
-
- def update_screen(ai_setting,screen,ship): # 更新屏幕上的图像,并切换到新屏幕
- # 每次循环时都重绘屏幕
- screen.fill(ai_setting.bg_color)
- ship.blitme()
- # 让最近绘制的屏幕可见
- pygame.display.flip()
self.moving_right = False
再附上geng更新后的alien_invasion.py、ship.py、settings.py代码。
特别注意:凡是带02的地方,都是与更新有关的地方!!!
- # 02 import sys
- import pygame
- from alien.settings import Setting # 01
- from alien.ship import Ship # 01
- import alien.game_function as gf # 02
-
-
- def run_game(): # 初始化游戏,并且创建一个屏幕对象
- pygame.init() # 初始化背景设置,让Pygame能够正确地工作
- # 01 screen = pygame.display.set_mode((1200, 800)) # 创建一个名为screen 的显示窗口,括号里是元组!!!
- # 01 # 这个游戏的所有图形元素都将在其中绘制
- ai_set = Setting() # 因为导入类而做了代码替换
- screen = pygame.display.set_mode(
- (ai_set.screen_width,ai_set.screen_height)
- )
- # 01 bg_color = (230,230,230) # 设置背景颜色
-
- pygame.display.set_caption('外星人入侵')
- # 创建一艘飞船对象
- ship = Ship(ai_set,screen)
-
- # 为让程序响应事件,我们编写一个事件循环,以侦听事件,并根据发生的事件执行相应的任务。
- while True: # 游戏的主循环
- # 02 for event in pygame.event.get(): # 监视键盘和鼠标
- # 02 if event.type == pygame.QUIT: #编写一系列的if 语句来检测并响应特定的事件
- # 02 sys.exit() # 我们调用sys.exit() 来退出游戏
- gf.check_event(ship) # 02
- ship.update() # 02
- # 01screen.fill(bg_color) # 每次循环都重绘屏幕
- # 02 screen.fill(ai_set.bg_color)
- # 02 ship.blitme() # 调用blitme函数,使飞船出现
- # 02 pygame.display.flip() # 让最近绘制的屏幕可见
- gf.update_screen(ai_set,screen,ship) # 02
-
- run_game()
- import pygame
-
-
- class Ship():
- def __init__(self,ai_setting,screen): # 初始化飞船,并设置初始位置
- self.screen = screen
- self.ai_setting = ai_setting # 02
- # 加载飞船图像并获取其外接矩形
- self.img = pygame.image.load('D:\\python\\PyCharm 2016.3.2\\project\\alien\\fei.bmp')
- self.rect = self.img.get_rect() # 我们使用get_rect() 获取相应surface的属性rect
- self.screen_rect = self.screen.get_rect()
-
- # 将每艘新飞船放在屏幕底部中央
- # 要将游戏元素居中,可设置相应rect 对象的属性center 、centerx 或centery 。
- self.rect.centerx = self.screen_rect.centerx
- # 要让游戏元素与屏幕边缘对齐,可使用属性top 、bottom 、left 或right ;
- # 要调整游戏元素的水平或垂直位置,可使用属性x 和y ,它们分别是相应矩形左上角的 x 和 y 坐标。
- self.rect.bottom = self.screen_rect.bottom
- # 在飞船的属性center中存储小数数值
- self.center = float(self.rect.centerx) # 小数形式的位移可以更好的控制飞船移动
-
- # 移动标志,# 02
- # 飞船不动时,标志moving_right将为False 。
- # 玩家按下右箭头键时,我们将这个标志设置为True ;而玩家松开时,我们将这个标志重新设置为False
- self.moving_right = False
- self.moving_left = False
- self.moving_up = False
- self.moving_down = False
-
- # 根据移动标志,移动飞船 # 02
- def update(self):
- if self.moving_right and self.rect.right < self.screen_rect.right: # 控制飞船移动的左右范围
- # 02 self.rect.centerx += 1
- # 02 更新飞船的center值,而不是rect
- self.center += self.ai_setting.ship_speed_factor
- if self.moving_left and self.rect.left > 0:
- # 02 self.rect.centerx -= 1
- self.center -= self.ai_setting.ship_speed_factor
-
- # 根据self.center更新rect对象
- self.rect.centerx = self.center
-
- # 我们定义了方法blitme() ,它根据self.rect 指定的位置将图像绘制到屏幕上
- # 在指定位置绘制飞船
- def blitme(self):
- self.screen.blit(self.img,self.rect) # 把img这个surface对象贴到rect的位置
- class Setting(): # 存储《外星人入侵》中所有的设置类
- def __init__(self): # 初始化游戏设置
- self.screen_width = 1200 # 屏幕设置
- self.screen_height = 800
- self.bg_color = (230,230,230)
-
- self.ship_speed_factor = 1.5 # 02 设置飞船速度
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。