pygame基础框架

1.一个可以关闭的空白窗体

import sys

import pygame
# 初始化模块
pygame.init()
# 使用set_mode 初始化窗体大小  并且返回Surface(表面) 面(可以绘制的范围)
# 创建一个面
screen = pygame.display.set_mode((600, 600))

while True:
    # 返回的为列表 列表中为实例(事件) 所以可以遍历
    # print(pygame.event.get())
    for event in pygame.event.get():
        # QUIT == 256  关闭事件
        if event.type == pygame.QUIT:
            # 关闭窗口
            pygame.quit()
            # 退出系统
            sys.exit()

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

# 2.	使用精灵显示背景, 背景的循环展示
import pygame
import sys


class BaseSprite(pygame.sprite.Sprite):
    def __init__(self, name):
        super().__init__()
        self.image = pygame.image.load(name)
        self.rect = self.image.get_rect()

    def update(self):
        pass

# 背景精灵
class BGSprite(BaseSprite):
    def __init__(self, name, top_left):
        # 初始化父类, 并传入实例
        super().__init__(name)
        self.rect.topleft = top_left

    def update(self):
        # 背景向下移动, 实现背景的循环
        self.rect.top += 3
        if self.rect.top >= 700:
            self.rect.top = -700

# 背景管理
class BGManage:
    def __init__(self, gm):
        # 引用下方的GameManage,从而进一步引用GameManage中的数据
        self.gm = gm
        # 背景组
        self.bg_group = pygame.sprite.Group()
        # 加入背景图, 并添加到背景组中
        BGSprite("images/background.png", (0, 0)).add(self.bg_group)
        BGSprite("images/background.png", (0, -700)).add(self.bg_group)
    # 更新, 每当下方的update运行一次, 这个update就会执行一次
    def update(self):
        self.bg_group.update()
        self.bg_group.draw(self.gm.screen)


class GameManage:
    def __init__(self):
        pygame.init()
        # 添加窗体
        self.screen = pygame.display.set_mode((480, 700))
        # 添加背景管理实例
        self.gm_manage = BGManage(self)
        # 设置帧率
        self.clock = pygame.time.Clock()

    def run(self):
        while True:
            # 一秒执行20次
            self.clock.tick(20)
            for event in pygame.event.get():
                if event.type == pygame.QUIT:
                    pygame.quit()
                    sys.exit()
            # 此处的update执行一次, 上方背景管理中的update就执行一次
            self.gm_manage.update()
            pygame.display.flip()


gm = GameManage()
gm.run()

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

# 2.	使用精灵显示背景, 背景的循环展示
import pygame
import sys


class BaseSprite(pygame.sprite.Sprite):
    def __init__(self, name):
        super().__init__()
        self.image = pygame.image.load(name)
        self.rect = self.image.get_rect()

    def update(self):
        pass


class BGSprite(BaseSprite):
    def __init__(self, name, top_left):
        # 初始化父类, 并传入实例
        super().__init__(name)
        self.rect.topleft = top_left

    def update(self):
        # 背景向下移动, 实现背景的循环
        self.rect.top += 3
        if self.rect.top >= 700:
            self.rect.top = -700


class PlayerSprite(BaseSprite):
    def __init__(self, name, center, speed, gm):
        super().__init__(name)
        self.gm = gm
        self.rect.center = center
        # 移动速度
        self.speed = speed

    def update(self):
        # 上下左右移动
        key_pressed = pygame.key.get_pressed()
        if key_pressed[pygame.K_LEFT] and self.rect.left > 0:
            self.rect.left -= self.speed
        if key_pressed[pygame.K_RIGHT] and self.rect.right < 480:
            self.rect.left += self.speed
        if key_pressed[pygame.K_UP] and self.rect.top > 0:
            self.rect.top -= self.speed
        if key_pressed[pygame.K_DOWN] and self.rect.bottom < 700:
            self.rect.top += self.speed


class PlayerManage:
    def __init__(self, gm):
        # 引用下方的GameManage,从而进一步引用GameManage中的数据
        self.gm = gm
        # 添加玩家管理
        self.player_group = pygame.sprite.Group()
        # 加入玩家精灵,并将其添加到玩家组中
        self.player_sprite = PlayerSprite("images/me1.png", (180, 600), 5, self.gm)
        self.player_sprite.add(self.player_group)

    def update(self):
        self.player_group.draw(self.gm.screen)
        self.player_group.update()


class BGManage:
    def __init__(self, gm):
        # 引用下方的GameManage,从而进一步引用GameManage中的数据
        self.gm = gm
        # 背景组
        self.bg_group = pygame.sprite.Group()
        # 加入背景图, 并添加到背景组中
        BGSprite("images/background.png", (0, 0)).add(self.bg_group)
        BGSprite("images/background.png", (0, -700)).add(self.bg_group)

    # 更新, 每当下方的update运行一次, 这个update就会执行一次
    def update(self):
        self.bg_group.update()
        self.bg_group.draw(self.gm.screen)


class GameManage:
    def __init__(self):
        pygame.init()
        # 添加窗体
        self.screen = pygame.display.set_mode((480, 700))
        # 添加背景管理实例
        self.gm_manage = BGManage(self)
        # 添加玩家管理实例
        self.player_manage = PlayerManage(self)
        # 设置帧率
        self.clock = pygame.time.Clock()

    def run(self):
        while True:
            # 一秒执行20次
            self.clock.tick(20)
            for event in pygame.event.get():
                if event.type == pygame.QUIT:
                    pygame.quit()
                    sys.exit()
            # 此处的update执行一次, 上方背景管理中的update就执行一次
            self.gm_manage.update()
            self.player_manage.update()
            pygame.display.flip()


gm = GameManage()
gm.run()

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

import pygame
import sys
import random


class BaseSprite(pygame.sprite.Sprite):
    def __init__(self, name):
        super().__init__()
        self.image = pygame.image.load(name)
        self.rect = self.image.get_rect()

    def update(self):
        pass


class PropSprite(BaseSprite):
    def __init__(self, name, speed, type):
        super().__init__(name)
        self.speed = speed
        # 道具的类型
        self.type = type
        self.rect.left = random.randint(0, 480 - self.rect.width)
        self.rect.bottom = 0

    def update(self):
        # 道具掉落速度
        self.rect.top += self.speed
        # 出框后的清除
        if self.rect.top >= 700:
            self.kill()


class PropManage:
    def __init__(self, gm):
        self.gm = gm
        # 道具管理
        self.prop_group = pygame.sprite.Group()
        self.time = 5

    # 道具的生成以及生成概率
    # 之后添加进入道具管理中
    def generate(self):
        value = random.random()
        if value > 0.7:
            PropSprite("images/life.png", 7, 1).add(self.prop_group)
        elif value > 0.4:
            PropSprite("images/bomb_supply.png", 7, 2).add(self.prop_group)
        else:
            PropSprite("images/bullet_supply.png", 7, 3).add(self.prop_group)

    # 道具掉落时间
    def update(self):
        self.time -= 0.1
        if self.time <= 0:
            self.time = 5
            self.generate()
        self.prop_group.draw(self.gm.screen)
        self.prop_group.update()


class GameManage:
    def __init__(self):
        pygame.init()
        # 添加窗体
        self.screen = pygame.display.set_mode((480, 700))
        self.prop_manage = PropManage(self)

        # 设置帧率
        self.clock = pygame.time.Clock()

    # 碰撞检测 以及提供道具相应功能
    def check_collider(self):
        prop_player_collider = pygame.sprite.groupcollide(self.player_manage.pm_group, self.prop_mamage.prop_group,
                                                          False, True)
        if prop_player_collider:
            for props in prop_player_collider.values():
                for prop in props:
                    if prop.type == 3:
                        self.player_manage.player_sprite.super_bullet = 10
                    if prop.type == 2:
                        for enemy in self.enemy_manage.em_group.sprites():
                            enemy.kill()
                            self.score += len(self.enemy_manage.em_group.sprites())
                    if prop.type == 1:
                        self.player_manage.player_sprite.hp += 1
                    if self.player_manage.player_sprite.hp >= self.player_manage.player_sprite.max_hp:
                        self.player_manage.player_sprite.hp = self.player_manage.player_sprite.max_hp

    def run(self):
        while True:
            # 一秒执行20次
            self.clock.tick(20)
            self.check_collider()
            for event in pygame.event.get():
                if event.type == pygame.QUIT:
                    pygame.quit()
                    sys.exit()

            self.prop_manage.update()
            pygame.display.flip()


gm = GameManage()
gm.run()

5.鼠标点击检测

class Util:
    """
    工具类: 提供静态方法
    """

    @staticmethod
    def click_check(sprite):
        """
        精灵的点击检测
        """
        if pygame.mouse.get_pressed()[0]:
            if sprite.rect.collidepoint(pygame.mouse.get_pos()):
                return True
        return False


 

<think>好的,我现在需要帮助用户学习Pygame基础知识。用户之前询问过快速排序,现在转向了Pygame,可能是想开始游戏开发。首先,我得确定用户的需求是什么。他们可能是一个编程新手,对Python有一定了解,现在想进入游戏开发领域。Pygame是一个常用的库,所以需要从安装开始,然后是基本的结构和功能。 用户需要的是入门指南,所以应该覆盖安装、初始化、游戏循环、事件处理、图形绘制等内容。需要结构清晰,分步骤讲解。同时,按照系统指令,要使用正确的中文和LaTeX格式,比如变量用$...$,代码块用三个反引号。 首先,安装部分。需要告诉用户如何用pip安装Pygame,命令是pip install pygame。然后,初始化部分,导入库并初始化,设置屏幕大小和标题。这部分需要代码示例,显示初始化过程。 接下来是游戏循环,这是Pygame的核心。游戏循环需要处理事件、更新游戏状态、绘制画面。要解释每个部分的作用,比如事件循环中处理退出事件,绘制时填充背景色,然后更新显示。需要提到时钟控制帧率,使用clock.tick(60)来维持60FPS。 然后,绘制图形,比如圆形和矩形。这部分需要示例代码,展示如何用pygame.draw中的函数来画图,并说明参数的意义,比如位置、颜色、尺寸等。 还要考虑用户可能的后续问题,比如如何处理键盘输入、加载图像、播放声音等。这些可以作为相关问题列出,帮助用户深入学习。 同时,需要确保LaTeX格式正确,比如变量$screen_width$和$screen_height$用行内公式格式。代码块要正确标注Python语法,并单独成段。引用部分如果之前有的话需要添加,但这里可能没有引用来源,所以可能不需要。 最后,生成相关问题,比如如何添加动画、处理碰撞、创建游戏角色等,这些都是Pygame入门后常见的问题。需要确保问题相关且有引导性,帮助用户继续学习。 检查是否有遗漏的部分,比如事件处理的细节,比如QUIT事件的处理,以及屏幕刷新的方法。确保代码示例能够运行,没有语法错误。同时,用中文自然表达,避免技术术语过于复杂,适合新手理解。 总结步骤:安装、初始化、游戏循环、事件处理、图形绘制、退出处理。每个部分配以代码和解释。最后列出相关问题,引导用户深入学习。</think># Pygame入门指南 ### 一、环境搭建 安装命令: ```bash pip install pygame ``` ### 二、基础框架 ```python import pygame # 初始化引擎 pygame.init() # 设置窗口尺寸为800x600像素 screen = pygame.display.set_mode((800, 600)) pygame.display.set_caption("我的第一个游戏") # 游戏主循环 running = True clock = pygame.time.Clock() # 创建时钟对象控制帧率 while running: # 1. 处理事件 for event in pygame.event.get(): if event.type == pygame.QUIT: running = False # 2. 更新游戏状态 # 3. 渲染画面 screen.fill((0, 0, 0)) # 用黑色填充背景 pygame.draw.circle(screen, (255, 0, 0), (400, 300), 30) # 绘制红色圆形 # 4. 更新显示 pygame.display.flip() clock.tick(60) # 限制60帧/秒 pygame.quit() ``` ### 三、核心概念解析 1. **坐标系系统**:窗口左上角为原点$(0,0)$,向右为$x$轴正方向,向下为$y$轴正方向 2. **颜色表示**:使用RGB元组格式,如$(255,0,0)$表示红色 3. **游戏循环**:每秒执行约60次的循环结构,包含: - 事件处理(输入检测) - 游戏逻辑更新 - 画面渲染 ### 四、基础图形绘制 ```python # 绘制矩形(左上角坐标,宽高) pygame.draw.rect(screen, (0,255,0), (100,100, 50, 80)) # 绘制线段(起点,终点) pygame.draw.line(screen, (255,255,0), (0,0), (800,600), 5) ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值