规划项目
项目需要实现以下功能:
1.飞船出现在屏幕底部,并可以左右移动
2.玩家可以按空格键控制飞船射击子弹
3.外星人出现在屏幕中,并自主向下移动
4.飞船子弹消灭外星人后,将出现新外星人并加快移动速度
5.外星人碰撞到飞船或到达屏幕底部时,玩家将损失一艘飞船
6.玩家损失达三艘飞船时,游戏结束
安装pygame
可参考我的另一篇博客"#Python# 在windows中安装pygame"https://blog.csdn.net/weixin_45797443/article/details/106321292.
创建主界面
新建一个主程序,以后我们的游戏运行都使用这个程序
alien_invasion.py
import sys
import pygame
def run_game():
# 初始化游戏并创建一个屏幕对象
pygame.init() # 初始化pygame
screen = pygame.display.set_mode((1200, 800)) # 构造一个宽1200像素,高800像素的Surface对象
pygame.display.set_caption("Alien Invasion") # 将窗口命名为Alien Invasion
bg_color = (230,230,230) # 创建背景色
# 开始游戏的主循环
while True:
# 监视键盘和鼠标事件
for event in pygame.event.get():
if event.type == pygame.QUIT: # 检测游戏窗口关闭按钮是否被点击
sys.exit(0) # 退出游戏,且不抛出异常
# 每次循环时重绘屏幕
screen.fill(bg_color)
# 让最近绘制的屏幕可见
pygame.display.flip()
run_game()
创建设置类
创建一个模块,存放所有游戏相关设置,便于以后修改游戏
settings.py
class Settings:
'''存储所有设置'''
def __init__(self):
'''初始化游戏设置'''
# 屏幕设置
self.screen_width = 1200 # 窗口宽度为1200像素
self.screen_height = 800 # 窗口高度为800像素
self.bg_color = (230,230,230) # 创建名为bu_color的背景色 以RGB值为参数指定
在主程序中创建Settings实例,并使用它来访问设置
alien_invasion.py
import sys
import pygame
from settings import Settings
def run_game():
# 初始化游戏并创建一个屏幕对象
pygame.init() # 初始化pygame
ai_settings = Settings()
screen = pygame.display.set_mode(ai_settings.screen_width,ai_settings.screen_height)) # 构造一个宽1200像素,高800像素的Surface对象
pygame.display.set_caption("Alien Invasion") # 将窗口命名为Alien Invasion
# 开始游戏的主循环
while True:
# 监视键盘和鼠标事件
for event in pygame.event.get():
if event.type == pygame.QUIT: # 检测游戏窗口关闭按钮是否被点击
sys.exit(0) # 退出游戏,且不抛出异常
# 每次循环时重绘屏幕
screen.fill(ai_settings.bg_color)
# 让最近绘制的屏幕可见
pygame.display.flip()
run_game()
创建飞船类
ship.py
import pygame
class Ship():
def __init__(self,ai_settings,screen):
'''初始化飞船并设置初始位置'''
self.screen = screen
self.ai_settings = ai_settings
# 加载飞船图像并获取其外接矩形
self.image = pygame.image.load(r'D:\Python学习\Alien Invasion\images\ship.bmp') # 设置飞船的图像 # 使用相对文件地址出错?
self.rect = self.image.get_rect() # 获取飞船图像的外接矩形
self.screen_rect = screen.get_rect() # 获取界面的外接矩形
# 将每艘飞船放在屏幕底部中央
self.rect.centerx = self.screen_rect.centerx # 将screen_rect的中心点的x坐标赋值给rect的中心点的x坐标
self.rect.bottom = self.screen_rect.bottom # 将screen_rect的底部的y坐标赋给rect的底部的y坐标
def blitme(self):
'''在制定位置绘制飞船'''
self.screen.blit(self.image, self.rect) #
更新主程序,创建一艘飞船
alien_invasion,py
import sys
import pygame
from settings import Settings
from ship import Ship
def run_game():
# 初始化游戏并创建一个屏幕对象
pygame.init() # 初始化pygame
ai_settings = Settings()
screen = pygame.display.set_mode(ai_settings.screen_width,ai_settings.screen_height)) # 构造一个宽1200像素,高800像素的Surface对象
pygame.display.set_caption("Alien Invasion") # 将窗口命名为Alien Invasion
# 创建一艘飞船
ship = Ship(screen)
# 开始游戏的主循环
while True:
# 监视键盘和鼠标事件
for event in pygame.event.get():
if event.type == pygame.QUIT: # 检测游戏窗口关闭按钮是否被点击
sys.exit(0) # 退出游戏,且不抛出异常
# 每次循环时重绘屏幕
screen.fill(ai_settings.bg_color)
ship.blitme() # 将飞船重绘在屏幕上
# 让最近绘制的屏幕可见
pygame.display.flip()
run_game()
总结
pygame.display.set_mode((1200,800))
set_mode(size=(0, 0), flags=0, depth=0, display=0) -> Surface
函数创建一个Surface对象,参数size为元组,元组中的两个元素分别指定窗口的宽度与高度(像素为单位)
pygame.event.get()
get(eventtype=None) -> Eventlist
get(eventtype=None, pump=True) -> Eventlist
函数获取用户进行操作所产生的事件列表,且事件含有type属性及不同参数
常见的事件集如下:
事件 | 产生途径 | 参数 |
---|---|---|
QUIT | 用户按下关闭按钮 | none |
ATIVEEVENT | Pygame被激活或者隐藏 | gain, state |
KEYDOWN | 键盘被按下 | unicode, key, mod |
KEYUP | 键盘被放开 | key, mod |
MOUSEMOTION | 鼠标移动 | pos, rel, buttons |
MOUSEBUTTONDOWN | 鼠标按下 | pos, button |
MOUSEBUTTONUP | 鼠标放开 | pos, button |
JOYAXISMOTION | 游戏手柄(Joystick or pad) 移动 | joy, axis, value |
JOYBALLMOTION | 游戏球(Joy ball) 移动 | joy, axis, value |
JOYHATMOTION | 游戏手柄(Joystick) 移动 | joy, axis, value |
JOYBUTTONDOWN | 游戏手柄按下 | joy, button |
JOYBUTTONUP | 游戏手柄放开 | joy, button |
VIDEORESIZE | Pygame窗口缩放 | size, w, h |
VIDEOEXPOSE | Pygame窗口部分公开(expose) | none |
USEREVENT | 触发了一个用户事件 | code |
bg_color = (230,230,230)
screen.fill(bg_color)
fill(color, rect=None, special_flags=0) -> Rect
bg_color为一个元组,作为实参传递给函数,元组中的元素为RGB参数其中(255,0,0)表示红色,(0,255,0)表示绿色,(0,0,255)表示蓝色,(230,230,230)表示一种浅灰色
self.image.get_rect()
get_rect(text, style=STYLE_DEFAULT, rotation=0, size=0) -> rect
函数获取对象的外接矩形,并返回矩形
pygame的矩形类含有以下常用属性:
left,top,width,height,centerx,centery
其中centerx,centery表示矩形中心的坐标
self.scrren.blit(self.image,self.rect)
blit(source, dest, area=None, special_flags=0) -> Rect
函数将一个Surface对象绘制在另一个Surface对象上,绘制的Surface对象通过参数sourse来指定,并通过参数dest来指定在被绘制的Surface对象上的坐标。其中参数dest一般为Rect的左上角坐标,也可为一个Rect,此时函数会自动提取其左上角坐标进行定位