Python Pygame中图像和矩形之间的冲突

Python Pygame中图像和矩形之间的冲突,python,pygame,Python,Pygame,我在处理PNG和用户控制的矩形对象之间的冲突时遇到了一些问题。如果矩形与墙(另一个矩形)发生碰撞,则没有问题,但是当我尝试为PNG提供与墙相同的功能时,我得到了一个错误 sprite_image_filename = 'tails.PNG' import pygame from pygame.locals import * speed = [7, 4] e = 1.001 position=(50,50) sprite = pygame.image.load(sprite_image_fil

我在处理PNG和用户控制的矩形对象之间的冲突时遇到了一些问题。如果矩形与墙(另一个矩形)发生碰撞,则没有问题,但是当我尝试为PNG提供与墙相同的功能时,我得到了一个错误

sprite_image_filename = 'tails.PNG'
import pygame
from pygame.locals import *


speed = [7, 4]
e = 1.001
position=(50,50)
sprite = pygame.image.load(sprite_image_filename).convert_alpha()

rect = (sprite.get_rect())

wall1 = Block(sort,20, 400 )
wall1.set_position(0,200)


block_group.add(a_block, wall1)    

running=True
while running:
    for event in pygame.event.get():
        if event.type == QUIT:
            pygame.quit()
            sys.exit()
    if event.type == pygame.MOUSEMOTION :
        mouse_position = pygame.mouse.get_pos()
        a_block.set_position(mouse_position[0],mouse_position[1])
    clock.tick(frames_per_second)
    window.fill(a)
    #here
    rect = rect.move(speed)

    if rect.left < 0 or rect.right > 380:
        speed[0] = -speed[0] * e
        pygame.display.update()
    if rect.top < 0 or rect.bottom > 370:
        speed[1] = -speed[1] * e
        pygame.display.update()
    window.blit(sprite, rect)
    pygame.display.update()
    #here



    if pygame.sprite.collide_rect(a_block, sprite) or pygame.sprite.collide_rect(a_block,wall1):
        time_string = "Du overlevede {} sekunder".format(pygame.time.get_ticks()/1000)
        text = font.render(time_string, True, sort)

        pygame.display.update()
        pygame.time.wait(5000)
        running = False


    block_group.draw(window)
    pygame.display.update()#opdater skærmen



pygame.quit ()
sprite\u image\u文件名='tails.PNG'
sprite2_图像_文件名='block 2.PNG'
sprite3_图像_文件名='block 3.PNG'
sprite4_图像_文件名='block 4.PNG'
导入pygame
从pygame.locals导入*
r=(255,0,0)
b=(0,0255)
排序=(0,0,0)
类块(pygame.sprite.sprite):
def uuu init uuuuu(自,颜色=b,宽度=40,高度=40):
超级(块,自).\uuu初始化
self.image=pygame.Surface((宽度、高度))
self.image.fill(颜色)
self.rect=self.image.get_rect()
self.origin\u x=self.rect.centerx
self.origin\u y=self.rect.centery
def设置位置(自身、x、y):
self.rect.x=x-self.origin\u x
self.rect.y=y-self.origin\u y
pygame.init()
pygame.display.set_标题(“EsKappa!”)
窗口大小=窗口宽度,窗口高度=400400
window=pygame.display.set_模式(窗口大小)
a=(0201,0)
clock=pygame.time.clock()
每秒帧数=30
block_group=pygame.sprite.group()
a_块=块(b)
a_块。设置_位置(窗宽/2-30,窗高/2)
速度=[7,4]
e=1.01
位置=(50,50)
sprite=pygame.image.load(sprite\u image\u文件名).convert\u alpha()
sprite2=pygame.image.load(sprite2\u image\u文件名).convert\u alpha()
sprite3=pygame.image.load(sprite2\u image\u文件名).convert\u alpha()
sprite4=pygame.image.load(sprite2\u image\u文件名).convert\u alpha()
rect=(sprite.get_rect())
rect2=sprite2.get_rect()
rect3=sprite2.get_rect()
rect4=sprite2.get_rect()
墙1=块(排序,20400)
墙1.设置位置(0200)
墙2=块(排序,400,20)
墙2.设置_位置(200,0)
墙3=块(排序,20400)
墙3.设置_位置(400200)
墙4=块(排序,400,20)
墙4.设置位置(200400)
块组。添加(块、墙1、墙2、墙3、墙4)
b2=(270,70)
b3=(80,20)
b4=(70250)
h=pygame.time.get_ticks()/1000
font=pygame.font.SysFont(“新罗马时代”,20)
font2=pygame.font.SysFont(“新罗马时代”,50)
text=font.render(“时间”、False、排序)
#卢卡芬克蒂翁酒店
运行=真
运行时:
对于pygame.event.get()中的事件:
如果event.type==退出:
pygame.quit()
sys.exit()
如果event.type==pygame.MOUSEMOTION:
mouse\u position=pygame.mouse.get\u pos()
a_块。设置_位置(鼠标位置[0],鼠标位置[1])
时钟滴答声(每秒帧数)
窗口填充(a)
#这里
rect=直线移动(速度)
如果rect.left<0或rect.right>380:
速度[0]=-速度[0]*e
pygame.display.update()
如果rect.top<0或rect.bottom>370:
速度[1]=-速度[1]*e
pygame.display.update()
窗口.blit(精灵,矩形)
#窗口。blit(sprite2,rect)
#窗口。blit(sprite3,rect)
#窗口。blit(sprite4,rect)
pygame.display.update()
#这里
如果pygame.sprite.collide(a_块,墙1)或pygame.sprite.collide(a_块,墙2)或pygame.sprite.collide(a_块,墙3)或pygame.sprite.collide(a_块,墙4):
time_string=“Du overlavede{}sekunder.”格式(round(pygame.time.get_ticks()/1000-0.225))
text=font.render(时间字符串、True、排序)
窗口。blit(文本,(窗口宽度/2-100,窗口高度/2-100))
如果pygame.time.get_ticks()/1000>10:
time\u string1=“Flot!”
text=font2.render(time_string1,True,sort)
窗口(文本,(20,20))
其他:
time_string2=“ike sågodt:c”
text=font2.render(time_string2,True,sort)
blit(text,window.blit(text,(20,20)))
pygame.display.update()
pygame.time.wait(5000)
运行=错误
块组绘制(窗口)
pygame.display.update()#opdater skærmen
pygame.quit()

错误信息很清楚

您可以调用
left.rect.colliderect(right.rect)
,但是
right
是一个
pygame.Surface
并且没有属性
rect

请注意如何在
类中使用
rect
属性:

class Block(pygame.sprite.Sprite):
    def __init__(self, color=b, width= 40, height= 40):
        super(Block, self).__init__()
        ...
        self.rect = self.image.get_rect()
        ...
但是
pygame.Surface
本身没有
rect
属性


只向函数传递包含
rect
属性的对象,或者利用多态性添加
get_rect()
function您的
Block
类,并在执行碰撞检测的函数中使用该函数,以便它同时适用于
Block
Surface
对象。

您的代码不包括错误代码。发布正确的文件。我将完整的代码放在回溯下,但是如果没有我制作的图像,您将无法运行它。您只需复制粘贴相同的代码块确定我删除了部分代码,不确定我是否正确理解。但是问题出现在:if pygame.sprite.collide_rect(a_block,sprite)这仍然不是完整的代码<代码>块未在任何位置定义
sprite_image_filename = 'tails.PNG'
sprite2_image_filename = 'block 2.PNG'
sprite3_image_filename = 'block 3.PNG'
sprite4_image_filename = 'block 4.PNG'

import pygame
from pygame.locals import *
r=(255,0,0)
b=(0,0,255)
sort =(0,0,0)
class Block(pygame.sprite.Sprite):
    def __init__(self, color=b, width= 40, height= 40):
        super(Block, self).__init__()
        self.image = pygame.Surface((width, height))
        self.image.fill(color)
        self.rect = self.image.get_rect()
        self.origin_x=self.rect.centerx
        self.origin_y=self.rect.centery

    def set_position(self, x, y):
        self.rect.x=x-self.origin_x
        self.rect.y=y-self.origin_y
pygame.init()

pygame.display.set_caption("EsKappa!")

window_size =window_width, window_height = 400, 400
window = pygame.display.set_mode(window_size)

a=(0,201,0)


clock = pygame.time.Clock()
frames_per_second = 30

block_group = pygame.sprite.Group()

a_block= Block(b)
a_block.set_position(window_width/2 -30, window_height/2)

speed = [7, 4]
e = 1.01
position=(50,50)
sprite = pygame.image.load(sprite_image_filename).convert_alpha()
sprite2= pygame.image.load(sprite2_image_filename).convert_alpha()
sprite3= pygame.image.load(sprite2_image_filename).convert_alpha()
sprite4= pygame.image.load(sprite2_image_filename).convert_alpha()
rect = (sprite.get_rect())
rect2 = sprite2.get_rect()
rect3 = sprite2.get_rect()
rect4 = sprite2.get_rect()



wall1 = Block(sort,20, 400 )
wall1.set_position(0,200)
wall2= Block(sort,400, 20 )
wall2.set_position(200,0)
wall3=Block(sort,20, 400 )
wall3.set_position(400,200)
wall4=Block(sort,400, 20 )
wall4.set_position(200,400)


block_group.add(a_block, wall1,wall2,wall3,wall4)


b2=(270, 70)
b3=(80,20)
b4=(70, 250)

h=pygame.time.get_ticks()/1000
font = pygame.font.SysFont("Times New Roman", 20)
font2 = pygame.font.SysFont("Times New Roman", 50)
text = font.render("Time", False, sort)
#lukke funktion
running=True
while running:
    for event in pygame.event.get():
        if event.type == QUIT:
            pygame.quit()
            sys.exit()
    if event.type == pygame.MOUSEMOTION :
        mouse_position = pygame.mouse.get_pos()
        a_block.set_position(mouse_position[0],mouse_position[1])
    clock.tick(frames_per_second)
    window.fill(a)
    #here
    rect = rect.move(speed)

    if rect.left < 0 or rect.right > 380:
        speed[0] = -speed[0] * e
        pygame.display.update()
    if rect.top < 0 or rect.bottom > 370:
        speed[1] = -speed[1] * e
        pygame.display.update()
    window.blit(sprite, rect)
    #window.blit(sprite2, rect)
    #window.blit(sprite3, rect)
    #window.blit(sprite4, rect)
    pygame.display.update()
    #here



    if  pygame.sprite.collide_rect(a_block, wall1) or pygame.sprite.collide_rect(a_block, wall2) or pygame.sprite.collide_rect(a_block, wall3) or pygame.sprite.collide_rect(a_block, wall4):
        time_string = "Du overlevede {} sekunder".format(round(pygame.time.get_ticks()/1000 -0.225))
        text = font.render(time_string, True, sort)
        window.blit(text, (window_width/2-100, window_height/2-100))
        if pygame.time.get_ticks()/1000>10:
            time_string1 = "Flot!"
            text = font2.render(time_string1, True, sort)
            window.blit(text, (20, 20))
        else:
            time_string2 = "Ikke så godt :c"
            text = font2.render(time_string2, True, sort)
            window.blit(text, window.blit(text, (20, 20)))
        pygame.display.update()
        pygame.time.wait(5000)
        running = False


    block_group.draw(window)
    pygame.display.update()#opdater skærmen



pygame.quit ()
class Block(pygame.sprite.Sprite):
    def __init__(self, color=b, width= 40, height= 40):
        super(Block, self).__init__()
        ...
        self.rect = self.image.get_rect()
        ...