当前位置: 首页 > 知识库问答 >
问题:

在Pygame中单击精灵时遇到问题

齐宗清
2023-03-14

如果这个问题是重复的,我很抱歉,但我已经在这个网站上跟踪了很多页面,试图找到一个答案,但我还没有找到一个可行的答案。我使用过的一些页面包括:

PyGame鼠标点击检测

自己找不到rect?

如何碰撞。pygame中的rect工作

这可能是我缺乏编码理解,如果是这样,我道歉。然而,我发现最“有帮助”的页面是第一个链接。用树懒的第一个回答,这似乎很简单,也是我能做的事情。一旦他的方法不起作用,我试着在YouTube和其他网站上搜索更多。我也找不到答案。

我只想在点击角色时简单地打印“点击”。这是我的代码。

import pygame
size = (700,500)
screen = pygame.display.set_mode(size)
done = False
clock = pygame.time.Clock()
itunes = pygame.image.load('itunes.png')
screen.blit(itunes,(200,200))
sprites = [itunes]
while not done:
    for event in pygame.event.get():
        if event.type == pygame.MOUSEBUTTONDOWN:
            pos = pygame.mouse.get_pos()
            clicked_sprites = [s for s in sprites if s.rect.collidepoint(pos)]
            for i in clicked_sprites:
                print('clicked sprite')
    pygame.display.flip()
    clock.tick(60)

我对Python语言了解很少,但我发现自己对编写同样的基于文本的程序感到厌烦,我想继续学习。

编辑:对不起,我应该说明我犯了什么错误。我得到:AttributeError:“pygame。“曲面”对象没有属性“rect”

编辑:在屏幕上绘制图像有困难

import pygame
size = (700,500)
screen = pygame.display.set_mode(size)
done = False
clock = pygame.time.Clock()
white = (0,0,0)
image = 'itunes.png'
class Thing(pygame.sprite.Sprite):
    def __init__(self, image, x, y):
        self.image = pygame.image.load('itunes.png')
        self.x = x
        self.y = y

    @property
    def rect(self):
        return self.image.get_rect(topleft=(self.x, self.y))

itunes = Thing(image,200,200)

SpriteGroup = pygame.sprite.Group()    
SpriteGroup.add(itunes)                

while not done:
    for event in pygame.event.get():
        if event.type == pygame.MOUSEBUTTONDOWN:
            pos = pygame.mouse.get_pos()
            clicked_sprites = [s for s in SpriteGroup if s.rect.collidepoint(pos)]
            for i in clicked_sprites:
                print('clicked sprite')
    screen.fill((0, 0, 0))             
    SpriteGroup.draw(screen)           
    pygame.display.flip()
    clock.tick(60)

共有2个答案

丁念
2023-03-14

让我们看看你的代码做什么。

  • 将新图像加载到itunes变量中
  • 您可以在200200将此图像快速显示在屏幕上
  • 将图像添加到精灵列表中
  • 单击鼠标时,将循环精灵列表以检查鼠标点是否位于精灵列表中对象的矩形中

现在我们如何知道精灵列表中对象的位置?答案是我们没有。没有关于物体在表面本身的位置的信息。

要解决这个问题,您可以创建自己的Sprite类,其中包括一个rect和一个surface,或者最好使用pygame。(传说中的)精灵Sprite已包含rect。

丌官嘉福
2023-03-14

图像是pygame。曲面对象,并且它们没有作为属性的rect。但是,可以通过调用SurfaceObject为该曲面对象获取一个。get_rect()。这将创建一个pygame。Rect表示曲面尺寸(如果不是其位置)的对象。

根据对象创建新rect或根据其在窗口中的位置修改它的频率,您可以子类pygame.sprite.Sprite并使用属性在其正确位置检索Rect。例如:

class Thing(pygame.sprite.Sprite):
    def __init__(self, image, x, y):
        super(Thing, self).__init__()    #don't forget to do this!! (like I did :D, haha)
        self.image = pygame.image.load(image)
        self.x = x
        self.y = y

    @property
    def rect(self):
        return self.image.get_rect(topleft=(self.x, self.y))

曲面。get_rect()调用采用关键字参数,允许您在创建对象时设置对象的属性。通过这种方式,它基本上是一个用于:

new_rect = self.image.get_rect()
new_rect.x = self.x
new_rect.y = self.y
return new_rect

整个过程将返回一个在窗口中正确位置的rect,这样就可以使用它进行碰撞检测,或者只是查看是否是如示例中所示单击的对象。

这种方法的另一个结果(使用rect的属性)是它使对象与pygame很好地工作。(传说中的)精灵组draw()方法,该方法通过点选对象的对象来绘制该组中的所有Sprite对象。图像obj。rect属性。

因此,您可以通过将精灵列表转换为精灵来利用这一点。组对象,并对代码进行以下更改:

SpriteGroup = pygame.sprite.Group()    #use these for working with Sprite objects
SpriteGroup.add(itunes)                #add itunes to sprites Group
while not done:
    for event in pygame.event.get():
        if event.type == pygame.MOUSEBUTTONDOWN:
            pos = pygame.mouse.get_pos()
            clicked_sprites = [s for s in sprites if s.rect.collidepoint(pos)]
            for i in clicked_sprites:
                print('clicked sprite')
    screen.fill((0, 0, 0))             #wipes the screen
    SpriteGroup.draw(screen)           #draws every Sprite object in this Group
    pygame.display.flip()
    clock.tick(60)

 类似资料:
  • 我在PyGame中创建了两个简单的精灵,其中一个是雨伞,另一个是雨滴。雨滴被添加到一个名为< code>all_sprites的sprite组中。伞精灵有自己的组,名为< code>Umbrella_sprite 雨滴从屏幕顶部“落下”,如果其中一个碰到雨伞/与雨伞碰撞..雨滴应该被删除了。但是除了特定雨滴之外,所有其他雨滴都受此影响。

  • 我一直在学习一些pygame教程,并且基于这些教程开发了自己的代码。具体如下: 所以我想出了如何让我的家伙跳跃,但是我已经在天空中放置了一个块并试图这样做: 试图让角色停止跳跃。有没有一个内置的函数来测试这一点,或者有没有一个适合我的方法。顺便说一下,这是行不通的,我似乎也不知道该怎么做。非常感谢任何帮助:)

  • 我正在用Python pygame制作一个游戏,并制作了一个移动的背景,一个作为玩家的跳跃精灵和生成障碍物。现在我正在研究玩家和障碍物之间的碰撞,并编写了一些代码,但最终出现了错误: 我不知道,为什么那个类不是精灵,也不知道如何把它变成精灵。我希望修复这个错误后,碰撞工程。 播放器图像1 图像 2 背景图片3

  • 我正在与Pygame一起练习,试图学习类,对象等的一些基本用法。 现在,在http://programarcadegames.com/的帮助下,我正在制作一个基本的平台 我有一个精灵播放器和精灵平台。这些平台也可以是移动平台,它应该在碰撞时移动玩家,但是当玩家移动到其他平台时,会发生一些奇怪的传送,我现在没有看到问题。 基本上,当被推时,玩家在逻辑上没有被移动(至少对我来说是这样)。 非常感谢任何

  • 对于我的pyplay塔防御计划,我试图弄清楚如何实现与地图上已经放置的其他塔的碰撞。 放置过程将创建一个48x48预览精灵,当它在游戏屏幕上时,该精灵将在玩家鼠标上的网格中移动。塔精灵保存在名为的组中。我有这段代码来检查精灵是否与某些地形瓷砖和塔精灵发生碰撞(这在精灵更新功能中): 循环前进部分是为了检查预览精灵是否与任何塔精灵矩形碰撞。如果是,它将变量设置为true或其他,False。 然后程序

  • 问题内容: 在pygame中,有没有一种方法来寻找某一方之间的碰撞 一个精灵和另一个精灵的特殊一面?例如,如果 精灵A的顶部与精灵B的底部碰撞,返回True。 我肯定有办法做到这一点,但我找不到任何特别的方法 在文档中。 谢谢! 问题答案: 在PyGame中没有函数来获取侧面碰撞。 但你可以试着用 pygame.Rect.CollipePoint公司 测试是否,,, ,,,, 在里面 (pygam