第3课pygame图片精灵

本篇博客主要讲解了如何在pygame中使用图片精灵。首先介绍了图片精灵的概念,然后阐述了获取图片资源的途径。接着,重点讲述了如何通过相对路径加载图片,包括创建img文件夹存放图片、获取代码文件路径并构建相对路径,最后利用pygame的load()方法将图片转化为图像对象。文章提供了完整的代码示例,并展示了运行效果。

1.图片精灵

因为在这个游戏当中看到的都是很漂亮的图形或图片。
这个首先都是由美工给开发出来各种图像的资源。
导入资源图片,加载到精灵。
定义一个pygame.sprite.Sprite.init(self)属性,
只是用这个Surface()创建了一个形状,普通图形。
这个self.image = pygame.Surface((50, 50)),要让它从磁盘上来加载一个真正的图片文件,这样可以看到的这个屏幕窗口上就是图片效果。

2.获取图片资源

首先获取图片有哪些渠道,通过科学上网,美工专门切图。

3.相对路径加载图片

如何把小人的图片加载到游戏当中呢?
我们要让 self.image = pygame.Surface((50, 50))这行代码发生变化,它要从文件当中,也就是当前项目的根目录下来加载.png的图片。
1.首先第一件事,需要得到资源图片的一个文件路径。
2.新建目录一个img的文件夹,然后把png图片资源都移动到img这个文件夹里头去。
3.获取图片的路径,不要使用绝对路径,采用相对路径。
4.首先得到当前代码文件它所在的路径,如何去获取?import OS,通过OS模块游戏的文件夹game_folder = os.path.dirname(file),这段得到的是当前这个player.py的文件。
game_folder 它所在的路径,得到这个路径之后是不是这个img跟这个png图片的路径是不是有一种相对关系。
找到这种相对关系,那我们图片的路径,就是这个我们得到的是Player.py所在的文件夹的路径。
plant_vs_zoomie_game所在文件夹,这个文件夹路径img_path = os.path.join()就是一个字符串拼接,用我们当前这个目录game_folder再加上一个‘img’目录,得到图片相对路径。

# 相对路径
game_folder = os.path.dirname(__file__)
# 字符串拼接
img_path = os.path.join(game_folder, 'img')

就是为了得到img文件夹下的png图片,在pygame里怎么把这个图片加载变成一个图像对象。
pygame里有个属性,然后里面有个load()方法,指定你要加载图片的路径。
convert_alpha()转变成一个透明图像。

player_img = pygame.image.load(os.path.join(img_path, 'R-C.png')).convert_alpha()

player_img图像对象属性,等于这个图片对象 self.image。

   self.image = player_img

fill()也不再填充这个绿色

  # self.image.fill(GREEN)

4.完整代码

import os
import pygame

WIDTH = 360
HEIGHT = 480

pygame.init()
screen = pygame.display.set_mode((WIDTH, HEIGHT))
# 5.创建窗口标题
pygame.display.set_caption('plant_vs_zombies')

# 相对路径
game_folder = os.path.dirname(__file__)
# 字符串拼接
img_path = os.path.join(game_folder, 'img')
player_img = pygame.image.load(os.path.join(img_path, '1.png')).convert_alpha()


class Player(pygame.sprite.Sprite):
    def __init__(self):
        pygame.sprite.Sprite.__init__(self)
        # self.image = pygame.Surface((50, 50))
        self.image = player_img
        self.rect = self.image.get_rect()
        self.rect.center = (WIDTH / 2, HEIGHT / 2)

    def update(self):
        self.rect.x += 5
        if self.rect.left > WIDTH:
            self.rect.right = 0


BLACK = (0, 0, 0)
WHITE = (255, 255, 255)
RED = (255, 0, 0)
GREEN = (0, 255, 0)
BLUE = (0, 0, 255)

# 1.循环外定义精灵组,相当于定义了一个列表
all_sprites = pygame.sprite.Group()
# 2.创建精灵组player.py,调用player构造函数
Player = Player()
# 3.精灵添加到精灵组,传player
all_sprites.add(Player)

FPS = 60
clock = pygame.time.Clock()
running = True

while running:
    clock.tick(FPS)
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False
    all_sprites.update()

    screen.fill(BLACK)
    all_sprites.draw(screen)
    pygame.display.flip()

5.运行效果

图片精灵

### Pygame精灵组间碰撞检测 在 Pygame 中,`pygame.sprite.groupcollide()` 函数用于执行两个精灵组间的矩形碰撞检测[^1]。此函数不仅能够识别两组中的哪些成员发生了碰撞,还可以指定是否删除这些发生碰撞的成员。 #### 使用 `groupcollide` 该方法接受四个参数: - 第一个参数是要检查的第一个精灵组。 - 第二个参数是要检查的第二个精灵组。 - 第三个布尔型参数指示第一个组中涉及碰撞的对象是否会自动被移除。 - 第四个布尔型参数指示第二个组中涉及碰撞的对象是否会自动被移除。 下面是一个具体的例子来展示如何使用 `groupcollide` 来处理子弹击中敌人的情况: ```python import pygame from pygame.locals import * import sys # 初始化Pygame库并设置屏幕大小 pygame.init() screen = pygame.display.set_mode((800, 600)) class Bullet(pygame.sprite.Sprite): def __init__(self, position): super().__init__() self.image = pygame.Surface([4, 10]) self.image.fill(Color('white')) self.rect = self.image.get_rect(topleft=position) class Enemy(pygame.sprite.Sprite): def __init__(self, position): super().__init__() self.image = pygame.Surface([20, 20]) self.image.fill(Color('red')) self.rect = self.image.get_rect(center=position) bullets = pygame.sprite.Group() # 创建子弹精灵组 enemies = pygame.sprite.Group() # 创建敌人精灵组 # 添加一些敌人到敌人组里作为测试数据 for i in range(5): enemies.add(Enemy(position=(i * 100 + 100, 30))) while True: screen.fill(Color('black')) for event in pygame.event.get(): if event.type == QUIT or (event.type == KEYDOWN and event.key == K_ESCAPE): pygame.quit() sys.exit() elif event.type == MOUSEBUTTONDOWN: bullets.add(Bullet(event.pos)) # 鼠标点击位置发射一颗新子弹 hit_dict = pygame.sprite.groupcollide(bullets, enemies, True, True) # 子弹和敌人的碰撞检测 bullets.draw(screen) enemies.draw(screen) pygame.display.flip() ``` 在这个示例程序中,每当玩家单击鼠标左键时就会创建一个新的子弹对象,并将其添加至 `bullets` 组内。接着调用了 `pygame.sprite.groupcollide()` 方法来进行子弹与敌人之间的碰撞检测。如果发现任何一对子弹和敌人之间存在交叉,则会将这对元素记录下来形成字典形式的结果,并依据传入的最后两个参数决定是否要从各自的组里面移除它们。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

赵谨言

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

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

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

打赏作者

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

抵扣说明:

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

余额充值