**掌握pygame基础框架的N个小目标**

目录

1.下载并安装pygame库

2.导入pygame库

3.pygame的作用

4.Pygame模块的一些主要组件和功能:

4.1一个可以关闭的空白窗体

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

4.3使用精灵玩家,玩家可以移动

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

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

4.6图形绘制

4.7图像处理

4.8时间控制


1.下载并安装pygame库

pip install pygame

        在pycharm的终端中或者电脑的黑窗口中输入以上命令就可以下载。


2.导入pygame库

import pygame

3.pygame的作用

        Pygame是一个用于开发2D游戏和多媒体应用程序的Python模块。它提供了一组工具和库,使开发人员可以轻松地创建游戏场景、处理用户输入、播放音频和视频、绘制图形等。


4.Pygame模块的一些主要组件和功能:

4.1一个可以关闭的空白窗体

import pygame
import sys

# 1.一个可以关闭的空白窗体
pygame.init()
scr = pygame.display.set_mode((600, 400))
while True:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()
            sys.exit()
    pygame.display.flip()

        scr = pygame.display.set_mode((600, 400))创建一个600*400的空白窗体,用事件控制窗体是否关闭,

        pygame.quit()只能关掉窗口,但是后台的道具还在就需要sys.exit()来清理掉,        

        pygame.display.flip()刷新屏幕

4.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, topleft):
        super().__init__(name)
        self.rect.topleft = topleft

    def update(self):
        self.rect.top += 2
        if self.rect.top >= 700:
            self.rect.top = -700


class BgManage:
    def __init__(self, gm):
        self.gm = gm
        self.bg_group = pygame.sprite.Group()
        self.bg1 = BgSprite("游戏背景.png", (0, 0))
        self.bg1.add(self.bg_group)
        self.bg2 = BgSprite("游戏背景.png", (0, -700))
        self.bg2.add(self.bg_group)

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


class GameManage:
    def __init__(self):
        self.screen = pygame.display.set_mode((1400, 700))
        self.bg_manage = BgManage(self)

    def run(self):
        while True:
            for event in pygame.event.get():
                if event.type == pygame.QUIT:
                    pygame.quit()
                    sys.exit()
            self.bg_manage.update()
            pygame.display.flip()


gm = GameManage()
gm.run()

        要想实现背景循环展示,可以收想到最起码要装备两张一摸一样的图片,一张先绘制到屏幕上面,另一张要在这张图片的上方准备着,两张图片一起动就可以达到循环展示的效果,当然三张,四张都可以,但是最少是两张。 

        以上的代码使用到pygame中的精灵以及使用类达到了北京的循环展示,把要展示的图片的路径填写上去就可以直接运行,当然也可以改变窗体尺寸或者图片的尺寸。

4.3使用精灵玩家,玩家可以移动

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, topleft):
        super().__init__(name)
        self.rect.topleft = topleft

    def update(self):
        self.rect.top += 2
        if self.rect.top >= 700:
            self.rect.top = -700


class BgManage:
    def __init__(self, gm):
        self.gm = gm
        self.bg_group = pygame.sprite.Group()
        self.bg1 = BgSprite("游戏背景.png", (0, 0))
        self.bg1.add(self.bg_group)
        self.bg2 = BgSprite("游戏背景.png", (0, -700))
        self.bg2.add(self.bg_group)

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


class PlayerSprite(BaseSprite):
    def __init__(self, name, center):
        super().__init__(name)
        self.rect.center = center

    def update(self):
        key_pressed = pygame.key.get_pressed()
        if key_pressed[pygame.K_LEFT] and self.rect.left > 0:
            self.rect.left -= 2
        if key_pressed[pygame.K_RIGHT] and self.rect.right < 1400:
            self.rect.left += 2
        if key_pressed[pygame.K_UP] and self.rect.top > 0:
            self.rect.top -= 2
        if key_pressed[pygame.K_DOWN] and self.rect.bottom < 700:
            self.rect.top += 2


class PlayerManage:
    def __init__(self, gm):
        self.gm = gm
        self.player_group = pygame.sprite.Group()
        self.player = PlayerSprite("left.png", (700, 350))
        self.player.add(self.player_group)

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


class GameManage:
    def __init__(self):
        self.screen = pygame.display.set_mode((1400, 700))
        self.bg_manage = BgManage(self)
        self.player_manage = PlayerManage(self)

    def run(self):
        while True:
            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()


gm = GameManage()
gm.run()

        在上面代码基础上添加玩家精灵类以及玩家管理类,将玩家添加到精灵组中,使用事件来控制玩家的移动,当按下左键时向左移动,同理按下键,上键以及右键。不要忘了给游戏管理中添加玩家实例,以及进行玩家的更新。

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

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, topleft):
        super().__init__(name)
        self.rect.topleft = topleft

    def update(self):
        self.rect.top += 2
        if self.rect.top >= 700:
            self.rect.top = -700


class BgManage:
    def __init__(self, gm):
        self.gm = gm
        self.bg_group = pygame.sprite.Group()
        self.bg1 = BgSprite("游戏背景.png", (0, 0))
        self.bg1.add(self.bg_group)
        self.bg2 = BgSprite("游戏背景.png", (0, -700))
        self.bg2.add(self.bg_group)

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


class PlayerSprite(BaseSprite):
    def __init__(self, name, center):
        super().__init__(name)
        self.rect.center = center

    def update(self):
        key_pressed = pygame.key.get_pressed()
        if key_pressed[pygame.K_LEFT] and self.rect.left > 0:
            self.rect.left -= 1
        if key_pressed[pygame.K_RIGHT] and self.rect.right < 1400:
            self.rect.left += 1
        if key_pressed[pygame.K_UP] and self.rect.top > 0:
            self.rect.top -= 1
        if key_pressed[pygame.K_DOWN] and self.rect.bottom < 700:
            self.rect.top += 1


class PlayerManage:
    def __init__(self, gm):
        self.gm = gm
        self.player_group = pygame.sprite.Group()
        self.player = PlayerSprite("left.png", (700, 350))
        self.player.add(self.player_group)

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


class EnemySprite(BaseSprite):
    def __init__(self, name, center):
        super().__init__(name)
        self.rect.center = center

    def update(self):
        pass


class EnemyManage:
    def __init__(self, gm):
        self.gm = gm
        self.enemy_group = pygame.sprite.Group()
        self.enemy = EnemySprite("food2.png", (200, 600))
        self.enemy.add(self.enemy_group)
        self.enemy = EnemySprite("food2.png", (200, 200))
        self.enemy.add(self.enemy_group)

    # def generate(self):

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


class GameManage:
    def __init__(self):
        self.screen = pygame.display.set_mode((1400, 700))
        self.bg_manage = BgManage(self)
        self.player_manage = PlayerManage(self)
        self.enemy_manage = EnemyManage(self)

    def check_collide(self):
        pygame.sprite.spritecollide(self.player_manage.player, self.enemy_manage.enemy_group, True)

    def run(self):
        while True:
            for event in pygame.event.get():
                if event.type == pygame.QUIT:
                    pygame.quit()
                    sys.exit()
            self.check_collide()
            self.bg_manage.update()
            self.player_manage.update()
            self.enemy_manage.update()
            pygame.display.flip()


gm = GameManage()
gm.run()

        在4.3的代码的基础上添加了敌人精灵类以及敌人精灵管理类,将两个敌人精灵添加到敌人精灵组中来管理,在游戏管理中写了一个函数check_collide()是用来检测碰撞的,用到的方法是spritecollide(),写代码时点进去这个方法可以看到里面第一个参数是精灵,第二个是精灵组,第三个是布尔值。意思就是精灵与精灵组之间的碰撞,碰撞后如果销毁精灵组中被碰撞到的精灵的话就将布尔值写为True,反之为False。

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

import pygame
import sys


class Util:
    @staticmethod
    def check(sprite):
        if pygame.mouse.get_pressed()[0]:
            if sprite.rect.collidepoint(pygame.mouse.get_pos()):
                return True
        else:
            return False


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 UiSprite(BaseSprite):
    def __init__(self, name, center):
        super().__init__(name)
        self.rect.center = center

    def update(self):
        pass


class UiManage:
    def __init__(self, gm):
        self.gm = gm
        # 创建一个字体surface对象
        self.font = pygame.font.Font("simkai.ttf", 50)
        # 创建按钮精灵
        self.btn_group = pygame.sprite.Group()
        self.btn_sprite = UiSprite("begin_btn.png", (700, 350))
        self.btn_sprite.add(self.btn_group)

    def update(self):
        self.font_surface = self.font.render("贪吃蛇", True, "red")
        self.gm.screen.blit(self.font_surface, (1200, 100))
        self.btn_group.draw(self.gm.screen)
        if Util.check(self.btn_sprite):
            print("666")



class BgSprite(BaseSprite):
    def __init__(self, name, topleft):
        super().__init__(name)
        self.rect.topleft = topleft

    def update(self):
        self.rect.top += 2
        if self.rect.top >= 700:
            self.rect.top = -700


class BgManage:
    def __init__(self, gm):
        self.gm = gm
        self.bg_group = pygame.sprite.Group()
        self.bg1 = BgSprite("游戏背景.png", (0, 0))
        self.bg1.add(self.bg_group)
        self.bg2 = BgSprite("游戏背景.png", (0, -700))
        self.bg2.add(self.bg_group)

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


class PlayerSprite(BaseSprite):
    def __init__(self, name, center):
        super().__init__(name)
        self.rect.center = center

    def update(self):
        key_pressed = pygame.key.get_pressed()
        if key_pressed[pygame.K_LEFT] and self.rect.left > 0:
            self.rect.left -= 1
        if key_pressed[pygame.K_RIGHT] and self.rect.right < 1400:
            self.rect.left += 1
        if key_pressed[pygame.K_UP] and self.rect.top > 0:
            self.rect.top -= 1
        if key_pressed[pygame.K_DOWN] and self.rect.bottom < 700:
            self.rect.top += 1


class PlayerManage:
    def __init__(self, gm):
        self.gm = gm
        self.player_group = pygame.sprite.Group()
        self.player = PlayerSprite("left.png", (700, 350))
        self.player.add(self.player_group)

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


class EnemySprite(BaseSprite):
    def __init__(self, name, center):
        super().__init__(name)
        self.rect.center = center

    def update(self):
        pass


class EnemyManage:
    def __init__(self, gm):
        self.gm = gm
        self.enemy_group = pygame.sprite.Group()
        self.enemy = EnemySprite("food2.png", (200, 600))
        self.enemy.add(self.enemy_group)
        self.enemy = EnemySprite("food2.png", (200, 200))
        self.enemy.add(self.enemy_group)

    # def generate(self):

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


class GameManage:
    def __init__(self):
        pygame.init()
        self.screen = pygame.display.set_mode((1400, 700))
        self.bg_manage = BgManage(self)
        self.player_manage = PlayerManage(self)
        self.enemy_manage = EnemyManage(self)
        self.ui_manage = UiManage(self)

    def check_collide(self):
        pygame.sprite.spritecollide(self.player_manage.player, self.enemy_manage.enemy_group, True)

    def run(self):
        while True:
            for event in pygame.event.get():
                if event.type == pygame.QUIT:
                    pygame.quit()
                    sys.exit()
            self.check_collide()
            self.bg_manage.update()
            self.player_manage.update()
            self.enemy_manage.update()
            self.ui_manage.update()
            pygame.display.flip()


gm = GameManage()
gm.run()

        在4.4的代码基础上添加一个工具类并将其设为静态方法直接用类名调用,添加一个ui精灵类以及ui精灵管理类,在ui精灵管理类中使用pygame中的font方法添加一个surface对象,以及按钮精灵和按钮精灵组,并将精灵添加进去。在update函数中将字体绘制到屏幕的指定位置,将按钮精灵组绘制到屏幕上面。调用Util方法中的check函数检测是否用鼠标点击了精灵,设置点击精灵后在控制台输出666,方便检测是否点击了。

4.6图形绘制

import pygame
import sys

pygame.init()
screen = pygame.display.set_mode((1400, 700))
screen.fill("white")
# 绘制矩形
pygame.draw.rect(screen, "red", (0, 0, 100, 50))
pygame.draw.circle(screen, "yellow", (700, 350), 50)

while True:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()
            sys.exit()
    pygame.display.flip()

        Pygame允许开发人员绘制各种形状和图像,如矩形、圆形、线条和多边形。可以设置颜色、大小和位置等属性。以上代码绘制图形用到了pygame中的draw模块。绘制了矩形以及圆形。

4.7图像处理

import pygame
import sys

pygame.init()
screen = pygame.display.set_mode((1400, 700))
image = pygame.image.load("游戏背景.png")

while True:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()
            sys.exit()
    screen.blit(image, (0, 0))
    pygame.display.flip()

pygame中可以加载指定路径下的图片,以上代码就是将目录下的图片加载到内存中,使用的是pygame中的image模块。以及将图片加载到窗体上使用了blit()方法。

4.8时间控制

import pygame
import sys

pygame.init()
screen = pygame.display.set_mode((1400, 700))

clock = pygame.time.Clock()

while True:
    clock.tick(24)
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()
            sys.exit()

    pygame.display.flip()

        Pygame可以控制游戏的帧率和时间。可以指定游戏每秒更新的帧数,以及在每帧之间进行的延迟时间。还可以获取当前时间和计时器的时间,用于游戏的时间管理和动画效果。在代码中需要使用到pygame中的time模块下的clock的tick方法,意思是每秒24帧。

总之,Pygame是一个功能强大的2D游戏开发框架,提供了丰富的工具和库,使开发人员可以快速创建具有丰富多彩图形和交互性的游戏和应用程序。它简化了游戏开发的许多常见任务,使开发者可以专注于游戏逻辑和创意的实现。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

C&&Q

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值