赞
踩
目录
1、使用pygame知识制作一个可以关闭的空白窗体,这里我就不用文字说明了,直接上代码,简洁明了。
Pygame 是一个专门用来开发游戏的 Python 模块,主要为开发、设计 2D 电子游戏而生,它是一个免费、开源的第三方软件包,支持多种操作系统,具有良好的跨平台性(比如 Windows、Linux、Mac 等)。Pygame 是 Pete Shinners 在 SDL(Simple DirectMedia Layer,一套开源的跨平台多媒体开发库)基础上开发而来,其目的是取代 PySDL。
在pycharm软件的终端命令栏中输入以下命令下载安装pygame
pip install pygame
- # 导入sys模块包 用于终止退出程序
- import sys
- # 导入pygame模块包
- import pygame
-
- pygame.init() # 初始化pygame 虽然在这个简单的开关空白窗体看不出作用 但是默认把他写上是必要的 防止报错
-
- screen = pygame.display.set_mode((400, 600)) # 设置一个400x400的空白窗体
- screen.fill((0, 255, 255)) # 这里我们给空白窗体添加一个背景颜色
-
- while True:
- # 循环获取事件,监听事件
- for event in pygame.event.get():
- # 判断用户是否点了关闭按钮
- if event.type == pygame.QUIT:
- # 卸载退出所有模块
- pygame.quit()
- # 终止程序
- sys.exit()
-
- pygame.display.flip() # 更新屏幕内容 没有它 你增加的内容是无法显示的
这样我们就可以获得一个可关闭的带有背景颜色的空白窗体。
- import pygame, sys
-
-
- # 构造一个背景精灵类 继承pygame的精灵类
- class BgSprite(pygame.sprite.Sprite):
- # 初始化函数 加入参数name(需要加载的背景名) top_left(背景从哪里开始加载)
- def __init__(self, name, location):
- # 有精灵父类 必须调用
- super().__init__()
- self.image = pygame.image.load(name) # 加载图片
- self.rect = self.image.get_rect() # 获取rect的区域
- self.rect.topleft = location # 设置位置
-
- # 定义一个更新函数
- def update(self):
- self.rect.top += 10 # 每次向上移动10个像素
- if self.rect.top >= 600:
- self.rect.top = -600
-
-
- # 构造一个背景精灵的管理类
- class BgManage:
- # 定义初始化函数 传入Manage类的实例 方便把背景添加到screen上
- def __init__(self, mg):
- self.mg = mg
- self.bg_group = pygame.sprite.Group() # 添加一个背景精灵组
- self.bg_sprite1 = BgSprite("img/begin2.png", (0, 0)) # 实例化两个背景精灵加入背景精灵组
- self.bg_sprite1.add(self.bg_group)
- self.bg_sprite2 = BgSprite("img/begin2.png", (0, -600))
- self.bg_sprite2.add(self.bg_group)
-
- def update(self):
- self.bg_group.update()
- self.bg_group.draw(self.mg.screen)
-
-
- # 构造管理类管理精灵管理类
- class Manage:
- def __init__(self):
- pygame.init()
- self.clock = pygame.time.Clock()
- self.screen = pygame.display.set_mode((400, 600))
- pygame.display.set_caption("会动的背景")
- # 实例化背景精灵管理类
- self.bg_manage = BgManage(self)
-
- def run(self):
- while True:
- self.clock.tick(25)
- for event in pygame.event.get():
- if event.type == pygame.QUIT:
- pygame.quit()
- sys.exit()
- # 更新背景管理类中的内容
- self.bg_manage.update()
- pygame.display.flip()
-
-
- mg = Manage()
- mg.run()
这样我们就得到一个会动的背景
在已有的代码中添加玩家精灵类和玩家管理类就可以实现
- import pygame, sys
-
-
- # 构造一个精灵父类
- class BaseSprite(pygame.sprite.Sprite):
- def __init__(self, name):
- super().__init__()
- self.image = pygame.image.load(name) # 加载图片
- self.rect = self.image.get_rect() # 获取rect的位置
-
-
- # 构造一个背景精灵类 继承的精灵父类
- class BgSprite(BaseSprite):
- # 初始化函数 加入参数name(需要加载的背景名) top_left(背景从哪里开始加载)
- def __init__(self, name, location):
- # 有精灵父类 必须调用
- super().__init__(name)
- self.rect.topleft = location # 设置位置
-
- # 定义一个更新函数
- def update(self):
- self.rect.top += 10 # 每次向上移动10个像素
- if self.rect.top >= 600:
- self.rect.top = -600
-
-
- # 构造一个背景精灵的管理类
- class BgManage:
- # 定义初始化函数 传入Manage类的实例 方便把背景添加到screen上
- def __init__(self, mg):
- self.mg = mg
- self.bg_group = pygame.sprite.Group() # 添加一个背景精灵组
- self.bg_sprite1 = BgSprite("img/begin2.png", (0, 0)) # 实例化两个背景精灵加入背景精灵组
- self.bg_sprite1.add(self.bg_group)
- self.bg_sprite2 = BgSprite("img/begin2.png", (0, -600))
- self.bg_sprite2.add(self.bg_group)
-
- def update(self):
- self.bg_group.update()
- self.bg_group.draw(self.mg.screen)
-
-
- class PlayerSprite(BaseSprite):
- # 初始化函数 加入参数name(需要加载的背景名) location(背景从哪里开始加载)
- def __init__(self, name, location):
- # 有精灵父类 必须调用
- super().__init__(name)
- self.rect.topleft = location # 设置位置
-
- def update(self):
- # 获取键盘事件 玩家移动
- key_pressed = pygame.key.get_pressed()
- # 按下键盘←键 向左移动
- if key_pressed[pygame.K_LEFT] and self.rect.left > 0:
- self.rect.left -= 8
- # 按下键盘→键 向右移动
- elif key_pressed[pygame.K_RIGHT] and self.rect.right < 400:
- self.rect.left += 8
- # 按下键盘↑键 向上移动
- elif key_pressed[pygame.K_UP] and self.rect.top > 0:
- self.rect.top -= 8
- # 按下键盘↓键 向下移动
- elif key_pressed[pygame.K_DOWN] and self.rect.bottom < 600:
- self.rect.top += 8
-
-
- class PlayerManage: # 构造玩家管理类
- def __init__(self, mg):
- self.mg = mg
- # 添加玩家精灵组
- self.player_group = pygame.sprite.Group()
- # 实例玩家精灵并加入到玩家精灵组
- self.player_sprite = PlayerSprite("img2/me1.png", (150, 400))
- self.player_sprite.add(self.player_group)
-
- def update(self):
- self.player_group.update()
- self.player_group.draw(self.mg.screen)
-
-
- # 构造管理类管理精灵管理类
- class Manage:
- def __init__(self):
- pygame.init()
- self.clock = pygame.time.Clock()
- self.screen = pygame.display.set_mode((400, 600))
- pygame.display.set_caption("会动的背景")
- # 实例化背景精灵管理类
- self.bg_manage = BgManage(self)
- # 实例化玩家管理
- self.player_manage = PlayerManage(self)
-
- def run(self):
- while True:
- self.clock.tick(25)
- for event in pygame.event.get():
- if event.type == pygame.QUIT:
- pygame.quit()
- sys.exit()
- # 更新背景管理类中的内容
- self.bg_manage.update()
- self.player_manage.update()
- pygame.display.flip()
-
-
- mg = Manage()
- mg.run()
在已有的代码中添加道具精灵类和道具管理类,然后添加碰撞检测就可以实现
- import random
-
- import pygame, sys
-
-
- # 构造一个精灵父类
- class BaseSprite(pygame.sprite.Sprite):
- def __init__(self, name):
- super().__init__()
- self.image = pygame.image.load(name) # 加载图片
- self.rect = self.image.get_rect() # 获取rect的位置
-
-
- # 构造一个背景精灵类 继承的精灵父类
- class BgSprite(BaseSprite):
- # 初始化函数 加入参数name(需要加载的背景名) top_left(背景从哪里开始加载)
- def __init__(self, name, location):
- # 有精灵父类 必须调用
- super().__init__(name)
- self.rect.topleft = location # 设置位置
-
- # 定义一个更新函数
- def update(self):
- self.rect.top += 10 # 每次向上移动10个像素
- if self.rect.top >= 600:
- self.rect.top = -600
-
-
- # 构造一个背景精灵的管理类
- class BgManage:
- # 定义初始化函数 传入Manage类的实例 方便把背景添加到screen上
- def __init__(self, mg):
- self.mg = mg
- self.bg_group = pygame.sprite.Group() # 添加一个背景精灵组
- self.bg_sprite1 = BgSprite("img/begin2.png", (0, 0)) # 实例化两个背景精灵加入背景精灵组
- self.bg_sprite1.add(self.bg_group)
- self.bg_sprite2 = BgSprite("img/begin2.png", (0, -600))
- self.bg_sprite2.add(self.bg_group)
-
- def update(self):
- self.bg_group.update()
- self.bg_group.draw(self.mg.screen)
-
-
- class PlayerSprite(BaseSprite):
- # 初始化函数 加入参数name(需要加载的图片) location(玩家从哪里开始加载)
- def __init__(self, name, location):
- # 有精灵父类 必须调用
- super().__init__(name)
- self.rect.topleft = location # 设置位置
-
- def update(self):
- # 获取键盘事件 玩家移动
- key_pressed = pygame.key.get_pressed()
- # 按下键盘←键 向左移动
- if key_pressed[pygame.K_LEFT] and self.rect.left > 0:
- self.rect.left -= 8
- # 按下键盘→键 向右移动
- elif key_pressed[pygame.K_RIGHT] and self.rect.right < 400:
- self.rect.left += 8
- # 按下键盘↑键 向上移动
- elif key_pressed[pygame.K_UP] and self.rect.top > 0:
- self.rect.top -= 8
- # 按下键盘↓键 向下移动
- elif key_pressed[pygame.K_DOWN] and self.rect.bottom < 600:
- self.rect.top += 8
-
-
- class PlayerManage: # 构造玩家管理类
- def __init__(self, mg):
- self.mg = mg
- # 添加玩家精灵组
- self.player_group = pygame.sprite.Group()
- # 实例玩家精灵并加入到玩家精灵组
- self.player_sprite = PlayerSprite("img2/me1.png", (150, 400))
- self.player_sprite.add(self.player_group)
-
- def update(self):
- self.player_group.update()
- self.player_group.draw(self.mg.screen)
-
-
- # 构造道具精灵类
- class PropSprite(BaseSprite):
- # 初始化函数 加入参数name(需要加载的道具图片) center(道具加载的位置)
- def __init__(self, name, center):
- super().__init__(name)
- self.rect.center = center
-
- def update(self):
- self.rect.top += 10
- if self.rect.top >= 600:
- self.kill()
-
-
- class PropManage:
- def __init__(self, mg):
- self.mg = mg
- self.prop_group = pygame.sprite.Group()
- self.time_count = 3 # 计时器
-
- def update(self):
- # 每过一段时间就会产生道具
- self.time_count -= 0.1
- if self.time_count <= 0:
- self.time_count = 3
- self.prop_sprite = PropSprite("img2/bomb_supply.png", (random.randint(0, 370), 0))
- self.prop_sprite.add(self.prop_group)
- self.prop_group.update()
- self.prop_group.draw(self.mg.screen)
-
-
- # 构造管理类管理精灵管理类
- class Manage:
- def __init__(self):
- pygame.init()
- self.clock = pygame.time.Clock()
- self.screen = pygame.display.set_mode((400, 600))
- pygame.display.set_caption("会动的背景")
- # 实例化背景精灵管理类
- self.bg_manage = BgManage(self)
- # 实例化玩家管理
- self.player_manage = PlayerManage(self)
- # 实例化道具管理
- self.prop_manage = PropManage(self)
-
- def run(self):
- while True:
- self.clock.tick(25)
- for event in pygame.event.get():
- if event.type == pygame.QUIT:
- pygame.quit()
- sys.exit()
- # 更新背景管理类中的内容
- self.bg_manage.update()
- self.player_manage.update()
- self.prop_manage.update()
- # 组与组之间的碰撞检测
- result = pygame.sprite.groupcollide(self.player_manage.player_group, self.prop_manage.prop_group, False, True)
- if result:
- print("吃到了道具")
-
- pygame.display.flip()
-
-
- mg = Manage()
- mg.run()
- import sys
-
- import pygame
-
-
- # 游戏状态 ready 未开始 gaming 游戏中 end 游戏结束
-
- # 创建点击检测类
- class Util:
- """
- 工具类: 提供静态方法
- """
-
- @staticmethod
- def check_click(sprite):
- # 如果是鼠标的左键
- """
- 精灵的点击检测
- """
- if pygame.mouse.get_pressed()[0]:
- if sprite.rect.collidepoint(pygame.mouse.get_pos()):
- return True
- return False
-
-
- # 创建ui精灵类 继承pygame精灵
- class UISprite(pygame.sprite.Sprite):
- def __init__(self, name, center):
- super().__init__()
- self.image = pygame.image.load(name)
- self.rect = self.image.get_rect()
- self.rect.center = center
-
-
- # 构造Ui精灵管理类
- class UIManage:
- def __init__(self, gm):
- self.gm = gm
- self.foot = pygame.font.Font("font/font.ttf", 30)
-
- # 创建一个游戏前的精灵组
- self.ready_group = pygame.sprite.Group()
- self.begin_btn = UISprite("img/begin_btn.png", (200, 300))
- self.begin_btn.add(self.ready_group)
-
- # 游戏中在屏幕显示字体
- self.score_surface = self.foot.render(f"Score:{0}", True, (255, 0, 0))
-
- # 游戏结束
- self.end_group = pygame.sprite.Group()
- self.gm_over_btn = UISprite("img/begin_btn.png", (200, 300))
- self.gm_over_btn.add(self.end_group)
-
- def update(self):
- # 游戏前有一个开始按钮
- if self.gm.state == "ready":
- self.ready_group.draw(self.gm.screen)
- # 把开始精灵传入工具类
- if Util.check_click(self.begin_btn):
- # 状态切换到游戏中
- self.gm.state = "gaming"
- elif self.gm.state == "gaming":
- # 游戏中会显示一个游戏分数的字体
- self.gm.screen.blit(self.score_surface, (0, 0))
- elif self.gm.state == "end":
- # 游戏结束会出现重新开始按钮 点击重新开始会再次切换到游戏中
- self.end_group.draw(self.gm.screen)
- if Util.check_click(self.gm_over_btn):
- self.gm.state = "gaming"
-
-
- class GameManage:
- def __init__(self):
- pygame.init()
- self.screen = pygame.display.set_mode((400, 600))
-
- self.state = "ready"
- # 实例化UI精灵管理类
- self.ui_manage = UIManage(self)
-
- def run(self):
- while True:
- for event in pygame.event.get():
- if event.type == pygame.QUIT:
- pygame.quit()
- sys.exit()
- # 测试一键自杀 游戏结束
- if event.type == pygame.KEYUP:
- if event.key == pygame.K_SPACE:
- self.state = "end"
- self.screen.fill((0, 255, 255))
- self.ui_manage.update()
- pygame.display.flip()
-
-
-
- gm = GameManage()
- gm.run()
开始前:
游戏中:
游戏结束:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。