pygame游戏模块详解

目录

一、下载pygame第三方模块

二、pygame模块知识点化(把模块分为n多个知识点)

1、使用pygame知识制作一个可以关闭的空白窗体,这里我就不用文字说明了,直接上代码,简洁明了。

 2、使用精灵显示背景, 背景的循环展示

3、使用精灵玩家,玩家可以移动

4、使用精灵显示道具,玩家与道具碰撞检测

5、UI的使用 (字体,鼠标点击检测)


前言

        Pygame 是一个专门用来开发游戏的 Python 模块,主要为开发、设计 2D 电子游戏而生,它是一个免费、开源的第三方软件包,支持多种操作系统,具有良好的跨平台性(比如 Windows、Linux、Mac 等)。Pygame 是 Pete Shinners 在 SDL(Simple DirectMedia Layer,一套开源的跨平台多媒体开发库)基础上开发而来,其目的是取代 PySDL。

一、下载pygame第三方模块

        在pycharm软件的终端命令栏中输入以下命令下载安装pygame  

pip install pygame

二、pygame模块知识点化(把模块分为n多个知识点)

1、使用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()  # 更新屏幕内容 没有它 你增加的内容是无法显示的

  这样我们就可以获得一个可关闭的带有背景颜色的空白窗体。

 2、使用精灵显示背景, 背景的循环展示

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()

这样我们就得到一个会动的背景

3、使用精灵玩家,玩家可以移动

        在已有的代码中添加玩家精灵类和玩家管理类就可以实现

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()

4、使用精灵显示道具,玩家与道具碰撞检测

        在已有的代码中添加道具精灵类和道具管理类,然后添加碰撞检测就可以实现

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()

5、UI的使用 (字体,鼠标点击检测)

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()

开始前:

游戏中:

游戏结束:

猜你喜欢

转载自blog.csdn.net/m0_64583979/article/details/132240584