【pygame】Python小游戏开发之看代码学编程
话说我学习的时候,英文文档难以理解,中文文档杂乱无章,最终还是觉得,还不如直接看代码学习。
下面是我学习过程中写的代码,注释写的很详细,我想会帮助你理解的
pip install pygame
1.游戏窗口的创建
下面的代码,将会帮助您学习到
1.使用pygame创建游戏窗口
2.在游戏窗口中绘制文字
点击查看代码
# 开发人员:萌狼蓝天
# 博客:Https://mllt.cc
# 笔记:Https://cnblogs.com/mllt
# 哔哩哔哩/微信公众号:萌狼蓝天
# 开发时间:2022/4/30
# Coding:UTF-8
import time
import pygame
# 定义好游戏窗口宽高和帧率数值
WINDOW_width=360
WINDOW_height=480
GAME_FPS=120
# 定义颜色
COLOR_font_tips=(1, 170, 237)
COLOR_background =(238, 238, 238)
# 游戏状态
var_running = False
#----------------------------------------------------------------------------
if __name__ == '__main__':
# 基本
pygame.init() # Pygame模块初始化
# 文本模板设置开始
font_tips = pygame.font.Font("fonts/fang_zheng_kai_ti_GBK.ttf",18) # (文本内容,字体大小) 建议自己设置字体避免中文显示问题
# 文本模板设置结束
val_screen = pygame.display.set_mode((WINDOW_width,WINDOW_height)) # 创建游戏窗口
pygame.display.set_caption("飞翔的小鸟@萌狼工作室") # 设置窗口标题栏文字
val_clock = pygame.time.Clock() #Clock时钟对象,以确保游戏以所设定的FPS运行
var_running=True # 设置游戏状态为启动
var_count=0 # 运行后刷新的帧数。用于计算帧率 # 帧数/时间 = 每秒多少帧
var_time_start=time.time() # 获取系统当前时间,记录为开始运行时间
while var_running:
val_clock.tick(GAME_FPS) # 设置帧率(tick告诉pygame一秒执行多少次)
# 设置窗口关闭功能
for event in pygame.event.get(): # pygame内部保存自上一帧以来发生的所有事件
if event.type == pygame.QUIT: # 用户点击关闭按钮
var_running = False
# 【注意】上述监听必须写在循环体内,否则会导致运行的窗口处于无响应状态
# 计算帧率
var_count+=1
var_time_now=time.time()
var_fps=var_count/(var_time_now-var_time_start)
# 将帧率以文字的方式绘制在窗口上
text_img_tips_ftp=font_tips.render(" FPS:"+str(int(var_fps)),True,COLOR_font_tips)
# 绘制屏幕
val_screen.fill(COLOR_background) # 使用指定颜色填充屏幕
val_screen.blit(text_img_tips_ftp,(0,0))
pygame.display.flip() # 翻转(类似刷新,但不是刷新)屏幕
# 退出游戏程序
pygame.quit()
2.添加精灵与精灵控制
先看一下效果图
下面的代码在上面代码的基础上,增加了场景、障碍物(柱子)、小鸟
(还没有做碰撞检测)
观看下面的代码,您应该要知道如何创建精灵对象,如何控制精灵对象,如何将精灵对象放上屏幕
我会将素材贴在下面,您需要自己保存图片
点击查看代码
# 开发人员:萌狼蓝天
# 博客:Https://mllt.cc
# 笔记:Https://cnblogs.com/mllt
# 哔哩哔哩/微信公众号:萌狼蓝天
# 开发时间:2022/4/30
# Coding:UTF-8
import os.path
import time
import random
import pygame
# 定义好游戏窗口宽高和帧率数值
WINDOW_width = 800
WINDOW_height = 600
GAME_FPS = 120
# 定义颜色
COLOR_user_background = (47, 64, 86)
COLOR_font_tips = (1, 170, 237)
COLOR_background = (238, 238, 238)
# 游戏状态
var_running = False
# ----------------------------------------------------------------------------
class User(pygame.sprite.Sprite): # 父类型是pygame.sprite.Sprite
# image = pygame.image.load("img/bird.png")
# rect = image.get_rect()
# rect.center = (WINDOW_width / 2, WINDOW_height / 2) # 将精灵放在屏幕正中间
def __init__(self):
# 运行内置Sprite类初始化程序
pygame.sprite.Sprite.__init__(self)
# 下面两行备注上的是设置一个50X100的矩形并填充颜色COLOR_user_background
# self.image = pygame.Surface((50, 100))
# self.image.fill(COLOR_user_background) # 设置背景颜色
self.image = pygame.image.load("img/bird.png").convert_alpha()
self.rect = self.image.get_rect() # 获取包围图片的矩形
self.rect.center = (100, WINDOW_height / 2) # 将精灵放在屏幕中间居左
self.speedy = 2 # 控制精灵移动速度
def update(self):
key_pressed = pygame.key.get_pressed() # 监听键盘,按下键返回ture,否flase
if self.rect.top>=self.rect.height:
if key_pressed[pygame.K_UP]: # 键盘方向键上键
self.rect.y -= self.speedy
if self.rect.bottom<=(WINDOW_height-self.rect.height):
if key_pressed[pygame.K_DOWN]: # 键盘方向键下键
self.rect.y += self.speedy
class Obstacle(pygame.sprite.Sprite):
def __init__(self,seed):
pygame.sprite.Sprite.__init__(self)
self.image = pygame.image.load("img/pillar.png").convert_alpha()
self.rect = self.image.get_rect()
self.rect.center = (WINDOW_width,seed)
def update(self):
self.rect.x -= random.randint(1, 10)
if self.rect.right < 0:
self.kill() # 清除
def game_draw():
user = User() # 获取用户精灵对象
all_sprites.add(user) # 将用户精灵添加到精灵组
def game_addObstacle():
seed = random.randint(int(WINDOW_height / 2 - 100), int(WINDOW_height / 2 + 100))
obstacle = Obstacle(seed) # 获取障碍物对象
all_sprites.add(obstacle) # 将障碍物精灵添加到精灵组
def game_update():
all_sprites.update() # 更新内容
all_sprites.draw(val_screen) # 绘画在屏幕上
if __name__ == '__main__':
# 基本
pygame.init() # Pygame模块初始化
all_sprites = pygame.sprite.Group() # 创建精灵组
# 文本模板设置开始
font_tips = pygame.font.Font("fonts/fang_zheng_kai_ti_GBK.ttf", 18) # (文本内容,字体大小) 建议自己设置字体避免中文显示问题
# 文本模板设置结束
val_screen = pygame.display.set_mode((WINDOW_width, WINDOW_height)) # 创建游戏窗口
pygame.display.set_caption("飞翔的小鸟@萌狼工作室") # 设置窗口标题栏文字
val_clock = pygame.time.Clock() # Clock时钟对象,以确保游戏以所设定的FPS运行
var_running = True # 设置游戏状态为启动
var_count = 0 # 运行后刷新的帧数。用于计算帧率 # 帧数/时间 = 每秒多少帧
var_time_start = time.time() # 获取系统当前时间,记录为开始运行时间
var_nandu =0
var_time_last=var_time_start
game_draw()
while var_running:
val_clock.tick(GAME_FPS) # 设置帧率(tick告诉pygame一秒执行多少次)
# 设置窗口关闭功能
for event in pygame.event.get(): # pygame内部保存自上一帧以来发生的所有事件
if event.type == pygame.QUIT: # 用户点击关闭按钮
var_running = False
# 【注意】上述监听必须写在循环体内,否则会导致运行的窗口处于无响应状态
# 计算帧率
var_count += 1
var_time_now = time.time()
var_fps = var_count / (var_time_now - var_time_start)
# 将帧率以文字的方式绘制在窗口上
text_img_tips_ftp = font_tips.render(" FPS:" + str(int(var_fps)), True, COLOR_font_tips)
# 绘制屏幕
val_screen.blit(pygame.image.load("img/background.jpg"), (0, 0))
# val_screen.fill(COLOR_background) # 使用指定颜色填充屏幕
val_screen.blit(text_img_tips_ftp, (0, 0))
if var_time_now-var_time_last>var_nandu:
game_addObstacle()
var_time_last=var_time_now
var_nandu = 0.5
game_update()
pygame.display.flip() # 翻转(类似刷新,但不是刷新)屏幕
# 退出游戏程序
pygame.quit()
3.碰撞检测
两根柱子一张图,要想要鸟穿过柱子中间,而不报碰撞,就不能使用矩形碰撞检测的方式
点击查看代码
# 开发人员:萌狼蓝天
# 博客:Https://mllt.cc
# 笔记:Https://cnblogs.com/mllt
# 哔哩哔哩/微信公众号:萌狼蓝天
# 开发时间:2022/4/30
# Coding:UTF-8
import os.path
import time
import random
import pygame
# 定义好游戏窗口宽高和帧率数值
WINDOW_width = 800
WINDOW_height = 600
GAME_FPS = 120
# 定义颜色
COLOR_user_background = (47, 64, 86)
COLOR_font_tips = (1, 170, 237)
COLOR_background = (238, 238, 238)
# 游戏状态
var_running = False
var_end = False
# ----------------------------------------------------------------------------
class User(pygame.sprite.Sprite): # 父类型是pygame.sprite.Sprite
# image = pygame.image.load("img/bird.png")
# rect = image.get_rect()
# rect.center = (WINDOW_width / 2, WINDOW_height / 2) # 将精灵放在屏幕正中间
def __init__(self):
# 运行内置Sprite类初始化程序
pygame.sprite.Sprite.__init__(self)
# 下面两行备注上的是设置一个50X100的矩形并填充颜色COLOR_user_background
# self.image = pygame.Surface((50, 100))
# self.image.fill(COLOR_user_background) # 设置背景颜色
self.image = pygame.image.load("img/bird.png").convert_alpha()
self.rect = self.image.get_rect() # 获取包围图片的矩形
self.rect.center = (100, WINDOW_height / 2) # 将精灵放在屏幕中间居左
self.speedy = 2 # 控制精灵移动速度
self.mask=pygame.mask.from_surface(self.image)
def update(self):
key_pressed = pygame.key.get_pressed() # 监听键盘,按下键返回ture,否flase
if self.rect.top >= self.rect.height:
if key_pressed[pygame.K_UP]: # 键盘方向键上键
self.rect.y -= self.speedy
if self.rect.bottom <= (WINDOW_height - self.rect.height):
if key_pressed[pygame.K_DOWN]: # 键盘方向键下键
self.rect.y += self.speedy
class Obstacle(pygame.sprite.Sprite):
def __init__(self, seed):
pygame.sprite.Sprite.__init__(self)
self.image = pygame.image.load("img/pillar.png").convert_alpha()
self.rect = self.image.get_rect()
self.rect.center = (WINDOW_width, seed)
self.mask = pygame.mask.from_surface(self.image)
def update(self):
self.rect.x -= random.randint(1, 10)
if self.rect.right < 0:
self.kill() # 清除
def game_draw():
user = User() # 获取用户精灵对象
all_sprite_user.add(user)
return user
def game_addObstacle():
seed = random.randint(int(WINDOW_height / 2 - 100), int(WINDOW_height / 2 + 100))
obstacle = Obstacle(seed) # 获取障碍物对象
all_sprites.add(obstacle) # 将障碍物精灵添加到精灵组
return obstacle
def game_update():
all_sprites.update() # 更新内容
all_sprite_user.update()
all_sprite_user.draw(val_screen)
all_sprites.draw(val_screen) # 绘画在屏幕上
if __name__ == '__main__':
# 基本
pygame.init() # Pygame模块初始化
all_sprite_user = pygame.sprite.Group() # 创建精灵组
all_sprites = pygame.sprite.Group() # 创建精灵组
# 文本模板设置开始
font_tips = pygame.font.Font("fonts/fang_zheng_kai_ti_GBK.ttf", 18) # (文本内容,字体大小) 建议自己设置字体避免中文显示问题
# 文本模板设置结束
val_screen = pygame.display.set_mode((WINDOW_width, WINDOW_height)) # 创建游戏窗口
pygame.display.set_caption("飞翔的小鸟@萌狼工作室") # 设置窗口标题栏文字
val_clock = pygame.time.Clock() # Clock时钟对象,以确保游戏以所设定的FPS运行
var_running = True # 设置游戏状态为启动
var_count = 0 # 运行后刷新的帧数。用于计算帧率 # 帧数/时间 = 每秒多少帧
var_time_start = time.time() # 获取系统当前时间,记录为开始运行时间
var_nandu = 0
var_time_last = var_time_start
user = game_draw()
while not var_end:
val_clock.tick(GAME_FPS) # 设置帧率(tick告诉pygame一秒执行多少次)
# 设置窗口关闭功能
for event in pygame.event.get(): # pygame内部保存自上一帧以来发生的所有事件
if event.type == pygame.QUIT: # 用户点击关闭按钮
var_end = True
# 【注意】上述监听必须写在循环体内,否则会导致运行的窗口处于无响应状态
while var_running:
for event in pygame.event.get(): # pygame内部保存自上一帧以来发生的所有事件
if event.type == pygame.QUIT: # 用户点击关闭按钮
var_running=False
var_end = True
# 计算帧率
var_count += 1
var_time_now = time.time()
var_fps = var_count / (var_time_now - var_time_start)
# 将帧率以文字的方式绘制在窗口上
text_img_tips_ftp = font_tips.render(" FPS:" + str(int(var_fps)), True, COLOR_font_tips)
# 绘制屏幕
val_screen.blit(pygame.image.load("img/background.jpg"), (0, 0))
# val_screen.fill(COLOR_background) # 使用指定颜色填充屏幕
val_screen.blit(text_img_tips_ftp, (0, 0))
if var_time_now - var_time_last > var_nandu:
obstacle = game_addObstacle()
var_time_last = var_time_now
var_nandu = 0.5
game_update()
pygame.display.flip() # 翻转(类似刷新,但不是刷新)屏幕
# result = (pygame.sprite.groupcollide(all_sprites, all_sprite_user, False, False))
# print(len(result))
# if len(result) > 0:
# font_tips_end = pygame.font.Font("fonts/fang_zheng_kai_ti_GBK.ttf", 32) # (文本内容,字体大小) 建议自己设置字体避免中文显示问题
# text_img_tips_end = font_tips_end.render("游戏失败", True, COLOR_font_tips)
# val_screen.blit(text_img_tips_end,
# (WINDOW_width / 2 - text_img_tips_end.get_rect().width, WINDOW_height / 2))
# var_running = False
# 上面的碰撞方式不适用于这个游戏,因为障碍物上下柱子是一个整体,用上述方式判断的话,没法穿过柱子图片透明部分(经过透明部分也会检测为碰撞)
for i in all_sprites:
if not pygame.sprite.collide_mask(user, i) is None:
font_tips_end = pygame.font.Font("fonts/fang_zheng_kai_ti_GBK.ttf",
32) # (文本内容,字体大小) 建议自己设置字体避免中文显示问题
text_img_tips_end = font_tips_end.render("游戏失败", True, COLOR_background)
val_screen.blit(text_img_tips_end,
(WINDOW_width / 2 - text_img_tips_end.get_rect().width/2 , WINDOW_height / 2-text_img_tips_end.get_rect().height))
var_running = False
pygame.display.flip() # 翻转(类似刷新,但不是刷新)屏幕
# 不在运行中,也就是暂停状态
# 退出游戏程序
pygame.quit()
代码重构与完善V1
上面的代码很乱在一堆,功能还不多,代码就很乱了。
所以我打算将不同的界面以不同的函数来写
通过互相调用的方式组合起来
下面的代码实现了如下功能:
1.游戏主页(可以点击 开始游戏)
2.游戏页
3.游戏失败页(可以选择重玩游戏,或者回到主页)
点击查看代码 | game_sprites.py
# 开发人员:萌狼蓝天
# 博客:Https://mllt.cc
# 笔记:Https://cnblogs.com/mllt
# 哔哩哔哩/微信公众号:萌狼蓝天
# 开发时间:2022/5/1
# Coding:UTF-8
import pygame
import random
pygame.init()
class User(pygame.sprite.Sprite): # 父类型是pygame.sprite.Sprite
def __init__(self, Object_image,WINDOW_height, WINDOW_width, center_x, center_y, speedx, speedy):
"""
:param Object_image:精灵对象图片
:param WINDOW_height: 游戏窗口高度
:param WINDOW_width:游戏窗口宽度
:param center_x: 精灵对象中心点X坐标
:param center_y: 精灵对象中心点Y坐标
:param speedx:x轴移动量
:param speedy:y轴移动量
"""
# 运行内置Sprite类初始化程序
pygame.sprite.Sprite.__init__(self)
self.WINDOW_height = WINDOW_height
self.WINDOW_width = WINDOW_width
self.image = pygame.image.load(Object_image).convert_alpha()
self.rect = self.image.get_rect() # 获取包围图片的矩形
self.rect.center = (center_x, center_y) # 将精灵放在屏幕中间居左
self.speedx = speedx # 控制精灵移动速度
self.speedy = speedy # 控制精灵移动速度
self.mask = pygame.mask.from_surface(self.image)
def update(self):
key_pressed = pygame.key.get_pressed() # 监听键盘,按下键返回ture,否flase
if self.rect.top >= self.rect.height:
if key_pressed[pygame.K_UP]: # 键盘方向键上键
self.rect.y -= self.speedy
if self.rect.bottom <= (self.WINDOW_height - self.rect.height):
if key_pressed[pygame.K_DOWN]: # 键盘方向键下键
self.rect.y += self.speedy
class Obstacle(pygame.sprite.Sprite):
def __init__(self, Object_image, center_x, center_y, random_start, random_end):
"""
:param WINDOW_height: 游戏窗口高度
:param WINDOW_width:游戏窗口宽度
:param Object_image:精灵对象图片
:param center_x: 精灵对象中心点X坐标
:param center_y: 精灵对象中心点Y坐标
:param random_start:x轴移动量最小值
:param random_end:x轴移动量最大值
"""
# 运行内置Sprite类初始化程序
pygame.sprite.Sprite.__init__(self)
self.image = pygame.image.load(Object_image).convert_alpha()
self.rect = self.image.get_rect() # 获取包围图片的矩形
self.rect.center = (center_x, center_y+random.randint(random_start,random_end)) # 将精灵放在屏幕中间居左
self.mask = pygame.mask.from_surface(self.image)
self.random_start = random_start
self.random_end = random_end
def update(self):
self.rect.x -= 10
if self.rect.right < 0:
self.kill() # 清除
点击查看代码 | game_run.py
# 开发人员:萌狼蓝天
# 博客:Https://mllt.cc
# 笔记:Https://cnblogs.com/mllt
# 哔哩哔哩/微信公众号:萌狼蓝天
# 开发时间:2022/5/1
# Coding:UTF-8
import time
import game_sprites as gsp
import pygame
# 游戏固定参数
class GameSet:
window_title = "飞翔的小鸟" + "@萌狼工作室"
window_width = 800
window_height = 600
game_fps = 60
game_clock = pygame.time.Clock() # Clock时钟对象,以确保游戏以所设定的FPS运行
game_background = pygame.image.load("img/background.jpg")
# 游戏颜色
class GameColor:
color_user_background = (47, 64, 86)
color_font_tips = (1, 170, 237)
color_background = (238, 238, 238)
# 创建窗口
def game_window(WINDOW_width, WINDOW_height, WINDOW_title):
"""
创建窗口
:param WINDOW_width:窗口宽度
:param WINDOW_height:窗口高度
:param WINDOW_title:窗口标题
:return:screen | <class 'pygame.Surface'>
"""
pygame.init() # Pygame模块初始化
screen = pygame.display.set_mode((WINDOW_width, WINDOW_height)) # 创建游戏窗口
pygame.display.set_caption(WINDOW_title) # 设置窗口标题栏文字
return screen
# 添加精灵到精灵组
def game_addElfToElfs(elfs, elf):
"""
通过此函数获得障碍物精灵组
:param elfs:要加入的精灵组
:param elf:需要添加的精灵对象
:return:新的精灵组
"""
elfs.add(elf)
return elfs
# 更新精灵组
def game_elfsUpdate(elfs, screen):
"""
通过此函数更新精灵组并绘制到窗口上
:param elfs:精灵组
:param screen:窗口
:return:无返回值
"""
elfs.update()
elfs.draw(screen)
# 文字图片
def game_font(text, size=14, color=(0, 0, 0), font="fonts/fang_zheng_kai_ti_GBK.ttf"):
text_font = pygame.font.Font(font, size) # (文本内容,字体大小) 建议自己设置字体避免中文显示问题
text_img = text_font.render(text, True, color)
return text_img
def game_playing(gameset, val_screen):
# 基本
pygame.init() # Pygame模块初始化
var_running = True # 设置游戏状态为启动
var_end = False # 设置程序状态为未结束
while not var_end:
var_time_start = time.time() # 获取系统当前时间,记录为开始运行时间
var_count = 0 # 运行后刷新的帧数。用于计算帧率 # 帧数/时间 = 每秒多少帧
var_time_last = var_time_start
var_nandu = 0
elfs_user = pygame.sprite.Group() # 创建精灵组(Elf Group)
elfs_obs = pygame.sprite.Group() # 创建精灵组(Elf Group)
# 玩家对象
user = gsp.User("img/bird.png", gameset.window_width, gameset.window_height, 100,
gameset.window_height / 2, 0,
5)
game_addElfToElfs(elfs_user, user)
# 游戏进行体
result = 0 # 分数重置
while var_running:
gameset.game_clock.tick(gameset.game_fps) # 设置帧率(tick告诉pygame一秒执行多少次)
for event in pygame.event.get(): # pygame内部保存自上一帧以来发生的所有事件
if event.type == pygame.QUIT: # 用户点击关闭按钮
var_running=False
var_end=True
# 计算帧率
var_count += 1
var_time_now = time.time()
timec = (var_time_now - var_time_start)
var_fps = int(var_count / timec)
c = var_time_now - var_time_last
if c >= var_nandu:
result += 1
ob = gsp.Obstacle("img/pillar.png", gameset.window_width, gameset.window_height / 2, -100, 100)
elfs_obs = game_addElfToElfs(elfs_obs, ob)
var_time_last = time.time()
var_nandu = 0.75
# 画面更新
val_screen.blit(gameset.game_background, (0, 0)) # 背景加载
val_screen.blit(game_font("FPS:" + str(int(var_fps))), (0, 0)) # FPS显示
game_elfsUpdate(elfs_user, val_screen) # 玩家更新
game_elfsUpdate(elfs_obs, val_screen) # 障碍物更新
pygame.display.flip() # 翻转(类似刷新,但不是刷新)屏幕
# 碰撞检测
for i in elfs_obs:
if not pygame.sprite.collide_mask(user, i) is None:
var_running = False
pygame.display.flip() # 翻转(类似刷新,但不是刷新)屏幕
# 来到这一步的时候,说明撞到柱子了,开始显示分数,询问是否继续
# 重新开始游戏
for i in elfs_obs:
i.kill()
for i in elfs_user:
i.kill()
game_elfsUpdate(elfs_user, val_screen)
game_elfsUpdate(elfs_obs, val_screen)
game_fail(gameset, val_screen, result)
# pygame.quit()
# 窗口失败界面
def game_fail(gameset, val_screen, result):
# 基本
pygame.init() # Pygame模块初始化
# 预设参数
var_end = False
while not var_end:
gameset.game_clock.tick(gameset.game_fps) # 设置帧率(tick告诉pygame一秒执行多少次)
val_screen.blit(gameset.game_background, (0, 0)) # 背景加载
text_result = game_font("游戏结束,您获得的分数为{}".format(result), 45, (255, 255, 255))
text_restart = game_font("重来".format(result), 35, (255, 255, 255))
text_main = game_font("回到主页".format(result), 35, (255, 255, 255))
val_screen.blit(text_result, (gameset.window_width / 2 - text_result.get_rect().width / 2, 100))
val_screen.blit(text_restart, (gameset.window_width / 2 - text_restart.get_rect().width / 2, 200))
val_screen.blit(text_main, (gameset.window_width / 2 - text_main.get_rect().width / 2, 300))
pygame.display.flip()
for event in pygame.event.get(): # pygame内部保存自上一帧以来发生的所有事件
if event.type == pygame.QUIT: # 用户点击关闭按钮
var_end=True
if event.type == pygame.MOUSEBUTTONDOWN:
x = pygame.mouse.get_pos()[0]
y = pygame.mouse.get_pos()[1]
print(x, y)
xc = int(gameset.window_width / 2)
if y >= 200:
if y < 300:
if x > xc - int(text_restart.get_width() / 2):
if x < int(xc + text_restart.get_width() / 2):
game_playing(gameset, val_screen)
if y < text_main.get_height() + 300:
if x > xc - int(text_main.get_width() / 2):
if x < int(xc + text_main.get_width() / 2):
game_main()
pygame.quit()
# 窗口主界面,通向运行
def game_main():
# 基本
pygame.init() # Pygame模块初始化
# 预设参数
var_end = False
gameset = GameSet()
# 窗口创建
val_screen = game_window(gameset.window_width, gameset.window_height, gameset.window_title)
while not var_end:
gameset.game_clock.tick(gameset.game_fps) # 设置帧率(tick告诉pygame一秒执行多少次)
val_screen.blit(pygame.image.load("img/background.jpg"), (0, 0)) # 背景加载
text_game_title = game_font(" 飞翔的小鸟", 45, (255, 255, 255))
text_game_start = game_font(" -- 开始游戏 --", 35, (255, 255, 255))
# text_game_exit = game_font(" -- 退出游戏 --", 35, (255, 255, 255))
val_screen.blit(text_game_title, (gameset.window_width / 2 - text_game_title.get_rect().width / 2, 100))
val_screen.blit(text_game_start, (gameset.window_width / 2 - text_game_start.get_rect().width / 2, 250))
# val_screen.blit(text_game_exit, (gameset.window_width / 2 - text_game_exit.get_rect().width / 2, 350))
pygame.display.flip() # 翻转(类似刷新,但不是刷新)屏幕
# 设置窗口关闭功能
for event in pygame.event.get(): # pygame内部保存自上一帧以来发生的所有事件
if event.type == pygame.QUIT: # 用户点击关闭按钮
var_end = True
if event.type == pygame.MOUSEBUTTONDOWN:
x = pygame.mouse.get_pos()[0]
y = pygame.mouse.get_pos()[1]
print(x, y)
xc = int(gameset.window_width / 2)
yc = int(gameset.window_height / 2)
if y >= 250:
if y < text_game_start.get_height() + 250:
if x > xc - int(text_game_start.get_width() / 2):
if x < int(xc + text_game_start.get_width() / 2):
game_playing(gameset, val_screen)
pygame.quit()
if __name__ == '__main__':
game_main()
版 权 声 明