windows系统,python3.7 64bit安装pygame1.9.3
在如下链接中:
https://www.lfd.uci.edu/~gohlke/pythonlibs/
找到pygame 的版本pygame-1.9.3-cp37-cp37m-win_amd64.whl并下载
cmd进入控制台后,进入该文件所在地,pip install即可下载(前提是已经安装了wheel)
一、窗口构建
首先新建alien_invasion.py文件,目的是创建一个空的Pygame窗口,供后续绘制游戏元素,如飞船和外星人:
import sys
import pygame
def run_game():
# 初始化并创建一个屏幕对象
pygame.init()
screen = pygame.display.set_mode((1200,800))
pygame.display.set_caption("Alien Invasion")
# 游戏的主循环
while True:
# 监视键盘和鼠标事件
for event in pygame.event.get():
if event.type == pygame.QUIT:
sys.exit()
# 让最近绘制的屏幕可见
pygame.display.flip()
run_game()
运行上述代码后即可看到一个空的黑色Pygame窗口。方法pygame.event.get()可以访问pygame检测到的事件,例如在单击游戏窗口的关闭按钮时,将检测到pygame.QUIT,从而调用 sys.exit()退出游戏。
pygame.display.flip()使得最近绘制的屏幕可见,每次执行while循环时都会绘制一个空屏幕,并擦去旧屏幕,即不断更新屏幕,以显示元素的新位置,营造平滑移动的效果。
二、游戏设置
编写settings模块,以存储游戏的所有设置,方便后续调用和修改:
class Settings():
# 存储游戏所有设置的类
def __init__(self):
# 初始化游戏的设置
# 屏幕设置
self.screen_width = 1200
self.screen_height = 600
# 背景色由RGB指定,(230,230,230)为浅灰色
self.bg_color = (230,230,230)
同时需要修改alien_invasion.py的代码以访问设置:
import sys
import pygame
from settings import Settings
def run_game():
# 初始化并创建一个屏幕对象
pygame.init()
ai_settings = Settings()
screen = pygame.display.set_mode((ai_settings.screen_width,ai_settings.screen_height))
pygame.display.set_caption("Alien Invasion")
# 游戏的主循环
while True:
# 监视键盘和鼠标事件
for event in pygame.event.get():
if event.type == pygame.QUIT:
sys.exit()
# 每次循环时都重绘屏幕
screen.fill(ai_settings.bg_color)
# 让最近绘制的屏幕可见
pygame.display.flip()
run_game()
三、添加飞船图像
游戏选择素材可以使用:https://pixabay.com/ 网站提供的图形,安全且免费。推荐使用位图(.bmp)文件,因为Pygame默认加载位图。或是在图书《Python编程:从入门到实践》的官方网站,可以下载配套资源:http://www.ituring.com.cn/book/1861
在文件夹images中可以找到ship.bmp,将images复制到自己项目的文件夹下,方便后续调用
创建ship模块,负责管理飞船的大部分行为:
import pygame
class Ship():
def __init__(self,screen):
# 初始化飞船并设置其初始位置
self.screen = screen
# 加载飞船图像并获取其外接矩形
self.image = pygame.image.load('images/ship.bmp')
self.rect = self.image.get_rect()
self.screen_rect = screen.get_rect()
# 将每搜新飞船放在屏幕底部中央
self.rect.centerx = self.screen_rect.centerx
self.rect.bottom = self.screen_rect.bottom
def blitme(self):
# 在指定位置绘制飞船
self.screen.blit(self.image,self.rect)
Pygame之所以效率高,原因之一是它能让你像处理矩形(rect对象)一样处理游戏元素,即使它们并非矩形,因为矩形是简单的几何形状,且玩家几乎注意不到区别。
rect对象属性:
需要居中时,可以使用center、centerx或centery
需要与屏幕边缘对齐,有属性top、bottom、left或right
需要调整水平或垂直位置,可设置属性x和y,在Pygame中,原点(0,0)位于屏幕的左上角,向右下方移动时,坐标值将增大。
四、绘制飞船
更新alien_invasion.py,使其在屏幕上创建飞船(未改动代码省略):
--snip--
from ship import Ship
def run_game():
--snip--
pygame.display.set_caption("Alien Invasion")
# 创建一搜飞船
ship = Ship(screen)
# 游戏的主循环
while True:
--snip--
# 每次循环时都重绘屏幕
screen.fill(ai_settings.bg_color)
ship.blitme()
# 让最近绘制的屏幕可见
pygame.display.flip()
run_game()
如上,导入ship类,在创建屏幕后,在主while循环前创建一个名为ship的Ship实例。填充背景后,调用ship.blitme()将船绘制到屏幕上,确保它出现在背景前面。
五、重构
在大型项目中,经常需要在添加新代码前重构既有代码,旨在简化既有代码的结构,是其更易扩展。我们将创建一个名为game_functions的新模块,以存储大量让游戏运行的函数。
为简化run_game(),将其中管理事件和更新屏幕的代码放在新模块中:
import sys
import pygame
def check_events():
# 响应按键和鼠标事件
for event in pygame.event.get():
if event.type == pygame.QUIT:
sys.exit()
def update_screen(ai_settings,screen,ship):
# 更新屏幕上的图像,并切换到新屏幕
# 每次循环时都重绘屏幕
screen.fill(ai_settings.bg_color)
ship.blitme()
# 让最近绘制的屏幕可见
pygame.display.flip()
此时,alien_incasion.py更新为:
import sys
import pygame
from settings import Settings
import game_functions as gf
from ship import Ship
def run_game():
# 初始化并创建一个屏幕对象
pygame.init()
ai_settings = Settings()
screen = pygame.display.set_mode((ai_settings.screen_width,ai_settings.screen_height))
pygame.display.set_caption("Alien Invasion")
# 创建一搜飞船
ship = Ship(screen)
# 游戏的主循环
while True:
gf.check_events()
gf.update_screen(ai_settings,screen,ship)
run_game()