前言
在Python程序中编写桌面小游戏大都使用的是第三方库pygame。
导入该库的相关设置:
import sys import pygame1、创建游戏窗口
创建一个指定大小的游戏窗口
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()
渲染图片应该放在帧渲染函数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
最终效果如下:
图片来源:http://www.laoshoucun.com/ 页游