前言
在Python程序中编写桌面小游戏大都使用的是第三方库pygame。
导入该库的相关设置:
import sys
import pygame
1、创建游戏窗口
创建一个指定大小的游戏窗口
FPS = 30 # 刷新频率
SCREENWIDTH = 288 # 屏幕宽度
SCREENHEIGHT = 512 # 屏幕高度
class Flappy_Bird_Env(object):
def __init__(self):
pygame.init() # 初始化游戏,即初始化pygame的各个子模块
self.clock = pygame.time.Clock() # 创建时钟对象,可以控制游戏循环频率
self.screen = pygame.display.set_mode((SCREENWIDTH, SCREENHEIGHT)) # 创建游戏窗口(SCREENWIDTH*SCREENHEIGHT)
pygame.display.set_caption('Flappy Bird by MRL') # 设置窗口标题,默认为‘pygame window’
此时我们运行该程序:
if __name__ == '__main__':
game = Flappy_Bird_Env()
2、添加循环频率和退出事件
此时的游戏窗口仅仅是个没有玩家交互的窗口程序,为了添加一些交互设置,我们需要编写一个游戏主循环来获取玩家输入:
def run_game(self):
while True:
# 遍历系统的事件列表
for event in pygame.event.get():
if event.type == QUIT or (event.type == KEYDOWN and event.key == K_ESCAPE): # 退出事件,Esc
pygame.quit()
sys.exit()
self.frame_step() # 执行帧渲染
此时我们的页游戏小程序就是可以接收玩家的退出事件,另外为了便于后续继续添加程序,我们抽象出了一个self.frame_step()来执行我们自定义的帧渲染程序,现在我们暂且只指定循环频率:
def frame_step(self,input_actions):
# 执行pygame默认的事件操作
pygame.event.pump()
# 更新游戏窗口
pygame.display.update()
# 指定循环频率
self.clock.tick(FPS)
return
然后继续执行程序:
if __name__ == '__main__':
game = Flappy_Bird_Env()
game.run_game()
2、创建渲染图片 渲染图片应该放在帧渲染函数self.frame_step()中:
def frame_step(self,input_actions):
# 执行pygame默认的事件操作
pygame.event.pump()
# 渲染图片
bg = pygame.image.load('assets/sprites/background-black.png').convert()
self.screen.blit(bg, (0, 0)) # 背景,元组参数表示绘制位置,也可以通过Rect矩形类来表示位置
base = pygame.image.load('assets/sprites/base.png').convert()
self.screen.blit(base, (0, SCREENHEIGHT * 0.79)) # 地面,元组参数表示绘制位置,也可以通过Rect矩形类来表示位置
# 更新游戏窗口
pygame.display.update()
# 指定循环频率
self.clock.tick(FPS)
return
此时我们就可以得到如下图片(背景图片是纯黑色):
3、让地面图片实现移动效果
渲染图片应该放在帧渲染函数self.frame_step()中:
def frame_step(self,input_actions):
# 执行pygame默认的事件操作
pygame.event.pump()
# 计算地面图片x坐标,实现移动效果
self.baseShift = self.IMAGES['base'].get_width() - self.BACKGROUND_WIDTH
self.BASEX = -((-self.BASEX + 100) % self.baseShift) # 地面图片的x坐标
self.BASEY = SCREENHEIGHT * 0.79 # 地面图片的y坐标
# 渲染图片
bg = pygame.image.load('assets/sprites/background-black.png').convert()
self.screen.blit(bg, (0, 0)) # 背景,元组参数表示绘制位置,也可以通过Rect矩形类来表示位置
base = pygame.image.load('assets/sprites/base.png').convert()
self.screen.blit(base, (self.BASEX, self.BASEY)) # 地面,元组参数表示绘制位置,也可以通过Rect矩形类来表示位置
# 更新游戏窗口
pygame.display.update()
# 指定循环频率
self.clock.tick(FPS)
return
最后实现的效果如下: