前言

在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()
可以得到:

【FlappyBird小游戏】编写游戏逻辑(一)——基本游戏主循环【源码】_游戏开发

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


此时我们就可以得到如下图片(背景图片是纯黑色):

【FlappyBird小游戏】编写游戏逻辑(一)——基本游戏主循环【源码】_游戏开发_02

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


最终效果如下:【FlappyBird小游戏】编写游戏逻辑(一)——基本游戏主循环【源码】_游戏开发_03

图片来源:http://www.laoshoucun.com/ 页游