基于《Python编程从入门到实践》12-14章。记录我在学习过程中遇到的问题,和大家分享。
首先需要在Pycharm中导入Pygame包,导入的方式请自行百度。我有两个Python路径,之前在导入pygame有报错,是因为Python路径选错了,对应的pip版本太低,换了路径就好了。导入成功后,在File-->Settings-->Default Settings里面可以看到pygame包,我下的是1.9.3vision。安装好后就可以开始编程了。
首先,创建Pygame窗口以及响应用户输入。需要用到sys和pygame模块。
运行一下发现报错:name 'Ture' is not defined,这是个很常见的错误,将“True”错写成“Ture,ture,true”。
import sys import pygame def run_game(): # 初始化游戏并创建一个屏幕对象 pygame.init() screen = pygame.display.set_mode((1200, 800)) pygame.display.set_caption("飞机大战") # 开始游戏的主循环 while True: # 监视键盘和鼠标事件 for event in pygame.event.get(): if event.type == pygame.QUIT: sys.exit() # 让最近绘制的屏幕可见 pygame.display.flip() run_game()
在这段程序中包含游戏对于屏幕的初始化设置,为了便于修改设置,需要创建一个设置类class Settings,将所有设置存储在一起,便于在添加新的功能的添加和管理。
class Settings(): """存储《飞机大战》的所有设置的类""" def __init__(self): """初始化游戏设置""" # 屏幕设置,宽度、高度、背景色(护眼色) self.screen_width = 1200 self.screen_heigth = 800 self.bg_color = (199, 237, 204)
将屏幕初始化放入设置类中,主程序也需要修改一下。从settings.py加载Settings类,并创建一个Settings实例存储在变量ai_settings中。
import sys import pygame from settings import Settings def run_game(): # 初始化pygame、设置和屏幕对象 pygame.init() ai_settings = Settings() screen = pygame.display.set_mode((ai_settings.screen_width,ai_settings.screen_heigth)) pygame.display.set_caption("飞机大战") # 开始游戏的主循环 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()
然后,我们要创建一艘飞船,并显示在窗口界面。创建一个class Ship类,用与在指定位置绘制一艘飞船。导入图像ship.bmp,原图是png图片,我用美图秀秀修改了背景颜色并保存为bmp文件。注意素材背景和屏幕背景请设备一致。这里确定飞船绘制位置用的是屏幕中心x坐标centerx和屏幕底部边缘bottom来确定,你也可以使用其他的方法。
import pygame class Ship(): def __init__(self, screen): """初始化飞船并设置其初始位置""" self.screen = screen # 加载飞船图像并获取其外接矩形 self.image = pygame.image.load('image/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)
在主程序中需要调用Ship类绘制飞船,导入Ship类,创建一个名为ship的Ship实例,要在主循环前创建,防止每次循环都创建一个实例。在屏幕背景填充后,再调用ship.blitme()绘制飞船。
import sys import pygame from settings import Settings from ship import Ship def run_game(): # 初始化pygame、设置和屏幕对象 pygame.init() ai_settings = Settings() screen = pygame.display.set_mode((ai_settings.screen_width,ai_settings.screen_heigth)) pygame.display.set_caption("飞机大战") # 创建一艘飞船 ship = Ship(screen) # 开始游戏的主循环 while True: # 监视键盘和鼠标事件 for event in pygame.event.get(): if event.type == pygame.QUIT: sys.exit() # 每次循环时都重绘屏幕 screen.fill(ai_settings.bg_color) ship.blitme() # 让最近绘制的屏幕可见 pygame.display.flip() run_game()
再次运行程序,可以看见屏幕上有一个飞船呈现。