import pygame.display
from sprites import *
class Run_and_Jump_Game(object):
"""程序猿乘风破浪小游戏主程序"""
def __init__(self):
print("游戏初始化")
pygame.init()
pygame.display.set_caption("程序猿乘风破浪小游戏")
# 1.创建游戏的窗口
self.screen = pygame.display.set_mode(SCREEN_RECT.size)
# 2.创建游戏的时钟
self.clock = pygame.time.Clock()
# 3.调用私有方法,完成精灵和精灵组的创建
self.__create_sprites()
# 4.设置定时器事件——每3秒创建一次海浪
pygame.time.set_timer(CREATE_WAVE_EVENT, 3000)
# 5.设置定时器事件——倒计时每1秒触发一次
pygame.time.set_timer(CREATE_I_EVENT, 1000)
# 6.设置定时器事件——10秒后结束游戏
pygame.time.set_timer(CREATE_OVER_EVENT, 30000)
# 7.设置游戏状态,1代表开始,0代表结束,-1代表退出
self.game_state = 1
def __create_sprites(self):
"""创建背景精灵和精灵组"""
# 天空背景
bg1 = Background("./images/background_16_9.png", False)
bg2 = Background("./images/background_16_9.png", True)
self.back_group = pygame.sprite.Group(bg1, bg2)
# 内层海洋背景
sea_bg_1 = Background("./images/sea_bg_1_16_9.png", False)
sea_bg_2 = Background("./images/sea_bg_1_16_9.png", True)
#移动速度
sea_bg_1.speed = 2
sea_bg_2.speed = 2
sea_bg_1.rect.bottom = SCREEN_RECT.height
sea_bg_2.rect.bottom = SCREEN_RECT.height
self.sea_bg_ground_1 = pygame.sprite.Group(sea_bg_1, sea_bg_2)
# 外层海洋背景
sea_bg_3 = Background("./images/sea_bg_2_16_9.png", False)
sea_bg_4 = Background("./images/sea_bg_2_16_9.png", True)
# 移动速度
sea_bg_3.speed = 3
sea_bg_4.speed = 3
sea_bg_3.rect.bottom = SCREEN_RECT.height
sea_bg_4.rect.bottom = SCREEN_RECT.height
self.sea_bg_ground_2 = pygame.sprite.Group(sea_bg_3, sea_bg_4)
# 创建海浪精灵组
self.wave_group = pygame.sprite.Group()
# 创建猴子精灵和精灵组
self.man = Man()
self.man_group = pygame.sprite.Group(self.man)
# 创建得分精灵和精灵组
self.score_sprite = Score()
self.score_group = pygame.sprite.Group(self.score_sprite)
# 创建倒计时精灵和精灵组
self.countdown_sprite = Countdown(30)
self.countdown_group = pygame.sprite.Group(self.countdown_sprite)
# 创建菜单精灵和精灵组
self.menu_sprite = Menu()
self.menu_group = pygame.sprite.Group(self.menu_sprite)
# 创建鼠标精灵和精灵组
self.mouse_sprite = Mouse()
self.mouse_group = pygame.sprite.Group(self.mouse_sprite)
# 创建鱼精灵和精灵组
self.fish_sprite = Fish()
self.fish_group = pygame.sprite.Group(self.fish_sprite)
# 创建飞鸟精灵和精灵组
self.bird_sprite = GameGifSprite("./images/bird.gif")
self.bird_group = pygame.sprite.Group(self.bird_sprite)
def start_game(self):
print("游戏正式开始")
# 播放音乐
# pygame.mixer.init()
# pygame.mixer.music.load("./music/music.mp3")
# pygame.mixer.music.play()
while True:
if self.game_state == 1:
"""游戏进行中"""
# 1.设置刷新帧率
self.clock.tick(FRAME_PER_SEC)
# 2.事件监听
self.__event_handler()
# 3.碰撞检测
self.__check_collide()
# 4.更新/绘制精灵组
self.__update_sprites()
# 5.更新显示
pygame.display.update()
elif self.game_state == 0:
"""游戏某一轮结束"""
# 1.更新游戏菜单
self.__event_menu_handler()
self.__check_menu_collide()
self.__update_menu()
# 2.更新显示
pygame.display.update()
elif self.game_state == -1:
"""游戏退出"""
Run_and_Jump_Game.__game_over()
def __event_handler(self):
for event in pygame.event.get():
# 判断是否退出游戏
if event.type == pygame.QUIT:
self.game_state = -1
elif event.type == CREATE_WAVE_EVENT:
# 创建海浪精灵
wave = Wave()
# 将海浪精灵添加到海浪精灵组
self.wave_group.add(wave)
elif event.type == CREATE_I_EVENT:
# 倒计时减1秒
self.countdown_sprite.start_time = self.countdown_sprite.start_time - 1
# 每过1秒加十分
self.score_sprite.score = self.score_sprite.score + 10
elif event.type == CREATE_OVER_EVENT:
# 游戏某回合结束显示菜单
self.menu_sprite.display = True
self.game_state = 0
# 使用键盘提供的方法获取键盘按键 - 按键元组
keys_pressed = pygame.key.get_pressed()
# 判断用户按下键盘空格键
if keys_pressed[pygame.K_SPACE]:
# 跳起
self.man.speed = -10
else:
# 下降
self.man.speed = 10
def __check_collide(self):
# 1.撞到海浪
waves = pygame.sprite.spritecollide(self.man, self.wave_group, True)
# 2.判断碰撞列表长度
if len(waves) > 0:
# 该回合游戏结束,显示菜单
self.menu_sprite.display = True
self.game_state = 0
def __update_sprites(self):
"""刷新各个精灵组"""
self.back_group.update()
self.back_group.draw(self.screen)
# 先刷新内层海洋
self.sea_bg_ground_1.update()
self.sea_bg_ground_1.draw(self.screen)
# 再刷新猴子
self.man_group.update()
self.man_group.draw(self.screen)
self.wave_group.update()
self.wave_group.draw(self.screen)
self.fish_group.update()
self.fish_group.draw(self.screen)
self.bird_group.update()
self.bird_group.draw(self.screen)
# 刷新外层海洋
self.sea_bg_ground_2.update()
self.sea_bg_ground_2.draw(self.screen)
self.score_group.update()
self.score_group.draw(self.screen)
self.countdown_group.update()
self.countdown_group.draw(self.screen)
def __event_menu_handler(self):
"""菜单事件处理函数"""
for event in pygame.event.get():
# 判断是否退出游戏
if event.type == pygame.QUIT:
self.game_state = -1
elif event.type == pygame.MOUSEBUTTONDOWN:
if event.button == 1:
# 用户点击鼠标左键,设置鼠标精灵位置
pos = pygame.mouse.get_pos()
self.mouse_sprite.rect.top = pos[1]
self.mouse_sprite.rect.left = pos[0]
self.menu_sprite.update()
def __check_menu_collide(self):
click_list = pygame.sprite.spritecollide(self.menu_sprite, self.mouse_group, False)
if len(click_list) > 0:
"""鼠标击中菜单,重新开始游戏"""
# 1.设置游戏状态为进行中
self.game_state = 1
# 2.重置鼠标位置
self.mouse_sprite.rect.top = 0
self.mouse_sprite.rect.left = 0
#
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
最近在使用pygame开发游戏,练习python编程。但遇到了一个问题,就是如何载入已有的GIF动图增强游戏的效果,在csdn搜索了一下,发现相关的文章比较少,缺少实例。于是自己研究了相关内容,找到了解决方案。本篇文章用游戏编程实例介绍pygame如何载入GIF动图。 一、准备一份透明背景的GIF动画素材 二、使用pillow库对GIF动图进行解帧 三、使用pygame.image.load()读取所有解出来的帧并存入列表 四、在精灵类的update()方法中循环播放列表中的帧 五、避免精灵帧率过快对精灵进行降帧 六、实例完整源代码
资源详情
资源评论
资源推荐
收起资源包目录
monkey_surf.zip (27个子文件)
main.py 9KB
images
bird.gif 16KB
fish.png 142KB
bird
gif4.png 2KB
gif5.png 3KB
gif6.png 4KB
gif2.png 3KB
gif3.png 3KB
gif1.png 2KB
gif10.png 3KB
gif9.png 3KB
gif7.png 3KB
gif8.png 2KB
005975c560415c4c78f3177f103618c3.jpeg 45KB
background4.png 2KB
man.png 18KB
background100.png 64KB
sea_bg_1_16_9.png 86KB
background1.png 21KB
background_16_9.png 3KB
fish_1.png 2KB
background2.png 61KB
cb97ec2d39af102c0759339209e68025.jpeg 161KB
wave.png 26KB
sea_bg_2_16_9.png 36KB
test.png 109KB
sprites.py 9KB
共 27 条
- 1
神奇的代码在哪里
- 粉丝: 1901
- 资源: 23
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
评论0