首页 > 解决方案 > 'pygame.Surface' 对象没有属性 'rect'

问题描述

错误:

File "C:\Users\dikni\AppData\Local\Programs\Algoritmika\algovenv\lib\site-packages\pygame\sprite.py", line 1523, in spritecollide
    spritecollide = sprite.rect.colliderect
AttributeError: 'pygame.Surface' object has no attribute 'rect'

我不明白它有什么问题

from pygame import *
from random import *
font.init()
font2 = font.SysFont('Arial', 36)
mixer.init()
game = True
clock = time.Clock()
FPS = 120
win = display.set_mode((1000, 700))
display.set_caption("game")
place = transform.scale(image.load('place.png'),(1000,700))
cooldown = 0
cooldownr = 0
cheat = 0
death = 0
class GameSprite(sprite.Sprite):
    def __init__(self, gamer_image,gamer_x, gamer_y, gamer_speed, size_x, size_y):
        super().__init__()
        self.image = transform.scale(image.load(gamer_image),(size_x,size_y))
        self.speed = gamer_speed
        self.rect = self.image.get_rect()
        self.rect.x = gamer_x
        self.rect.y = gamer_y
    def reset(self):
        win.blit(self.image,(self.rect.x, self.rect.y))

class Player(GameSprite):
    def update(self):
        key_pressed = key.get_pressed()
        if key_pressed[K_UP] and self.rect.y >= 108:
            self.rect.y -= self.speed
        if key_pressed[K_DOWN] and self.rect.y <= 592:
            self.rect.y += self.speed

        global shoots
        global cooldown
        global cheat
        if key_pressed[K_c]:
            cheat = 1
        if not cooldown:
            if cheat ==1:
                shoots = 9999999999999999
                if key_pressed[K_SPACE] and shoots !=0:
                    shoot()
                    cooldown = 0
            else:
                if key_pressed[K_SPACE] and shoots !=0:
                    shoot()
                    cooldown = 10

                if len(bullets) >= 3:
                    cooldown = 100
                else:
                    cooldown = 10

        else:
            cooldown -= 1
        global cooldownr
        if shoots == 0:

            if not cooldownr:
                shoots = 25

                cooldownr = 350

            else:
                text = font2.render("Перезарядка " + str(cooldownr // 100) , 1, (254, 195, 2))
                win.blit(text, (600, 20))
                cooldownr -= 1

        if self.rect.y <= 108:
            shoots = 25
            cheat = 0

class Bullet(GameSprite):
    def update(self):
        self.rect.x = self.rect.x - 10
        if self.rect.x <= 0:
            self.kill()

shoots = 0

def shoot():
    bullet = Bullet('bullet.png', turrel.rect.x-10, turrel.rect.y+15,10, 30, 15)
    bullets.add(bullet)
    global shoots
    shoots = shoots - 1



class Zombie(GameSprite):
    def update(self):
        self.rect.x = self.rect.x + 1
        sprite_list1 = sprite.groupcollide(zombies, bullets, True, True)

        if self.rect.x >= 1000:
            self.kill()
zombies = sprite.Group()
bullets = sprite.Group()
turrel = Player('turrel.png', 600, 400,3, 138, 108)

house_full = transform.scale(image.load("house_full.png"), (200, 650))
win.blit(house_full,(800,10))
house_half = transform.scale(image.load("house_half.png"), (200, 650))
house_dead = transform.scale(image.load("house_dead.png"), (200, 650))
def death():
    if sprite.spritecollide(house_full, zombies, True):
        turrel.kill()



while game:
    clock.tick(FPS)
    win.blit(place,(0,0))
    for e in event.get():
        if e.type == QUIT:
            game = False
    text = font2.render("Заряды " + str(shoots) , 1, (254, 195, 2))
    win.blit(text, (300, 20))
    if len(zombies) <= 10:
        zombie = Zombie('zombie.png', randint(-120, -10), randint(200, 600), randint(1, 10), 60, 80)
        zombies.add(zombie)
    text2  = font2.render("+ПАТРОНЫ", 1,(0,0,0))
    win.blit(text2,(600,160))
    win.blit(house_full,(800,10))
    death()
    turrel.reset()
    turrel.update()
    bullets.update()
    bullets.draw(win)
    zombies.update()
    zombies.draw(win)
    display.update()

标签: pythonpygame

解决方案


sprite.spritecollide用于pygame.Sprite对象。house_full然而,is a 是一个pygame.Surface对象。你必须使用pygame.Rect.collidelist

def death():
    house_rect = house_full.get_rect(topleft = (800,10))
    list_of_zombie_rects = [zombie.rect for zombie in zombies]
    if house_rect.collidelist(list_of_zombie_rects) >= 0:
        turrel.kill()

另请参阅如何在 pygame 中检测碰撞?并与矩形列表发生碰撞


推荐阅读