簡體   English   中英

Pygame中圖像與矩形之間的碰撞

[英]Collision between an image and rect in 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_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 ()

錯誤的回溯為:

追溯(最近一次通話):文件“ C:\\ Python33 \\ eskappa1.py”,第105行,如果是pygame.sprite.collide_rect(a_block,sprite)或pygame.sprite.collide_rect(a_block,wall1)

  File "C:\\Python33\\lib\\site-packages\\pygame\\sprite.py", line 1300, in collide_rect return left.rect.colliderect(right.rect) AttributeError: 'pygame.Surface' object has no attribute 'rect' 
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 ()

錯誤消息是明確的。

您調用left.rect.colliderect(right.rect) ,但是rightpygame.Surface ,沒有屬性rect

請注意如何在Block類中使用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屬性的對象傳遞到函數中,或者利用多態性並在Block類中添加get_rect()函數,然后get_rect()碰撞檢測的函數中使用該函數,以便它對BlockSurface對象都適用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM