Почему spritecillide некорректно работает в pygame - PullRequest
3 голосов
/ 06 мая 2020

Итак, я не понимаю, почему всегда печать "столкнулась", а не столкнулась. У меня два класса: Car и Beam. Я хочу обнаружить различие между автомобилем и группой лучей. Я сделал для этого функцию is_collision, но она работает неправильно и всегда сталкивается с возвратом. Пожалуйста, помогите мне. Спасибо.

import pygame as pg
import cv2
import random
pg.init()


display_width = 1000
display_height = 1000

BLUE = 47, 158, 189
RED = 255, 0, 0

display = pg.display.set_mode((display_width, display_height))
pg.display.set_caption("Cars Evolution")

icon = pg.image.load("icon.png")
pg.display.set_icon(icon)

clock = pg.time.Clock()

car_url = "car_img.png"
car_direction = 0  # car_direction from -1 to 1


beam_url = "beam_img.png"
beam_x = 200
beam_y = 200
beam_width = 20
beam_height = 160

total_level_width = 5000
total_level_height = 5000


class Beam(pg.sprite.Sprite):
    def __init__(self, input_beam_url, input_beam_x, input_beam_y):
        pg.sprite.Sprite.__init__(self)
        self.x = input_beam_x
        self.y = input_beam_y
        self.image = pg.image.load(input_beam_url)
        self.width = 20
        self.height = 160
        self.rect = self.image.get_rect()

    def draw_beam(self):
        self.x -= car.delta_x
        self.y -= car.delta_y
        display.blit(self.image, (self.x, self.y))
        pg.draw.rect(display, RED, pg.Rect(self.x, self.y, self.width, self.height), 2)


class Car(pg.sprite.Sprite):
    def __init__(self, input_car_url):
        pg.sprite.Sprite.__init__(self)
        self.image = pg.image.load(input_car_url)
        self.x = display_width / 2
        self.y = display_height / 3
        self.width = 46
        self.height = 89
        self.rect = self.image.get_rect()
        self.delta_x = 0
        self.delta_y = 0

    def draw_car(self):
        display.blit(self.image, (self.x, self.y))
        pg.draw.rect(display, RED, pg.Rect(self.x, self.y, self.width, self.height), 2)

    def move_car(self, vertical_ind, horizontal_ind, speed):
        self.delta_x = horizontal_ind * speed
        self.delta_y = vertical_ind * speed

    def is_collision(self, input_beams_list):
        collide_beam_list = pg.sprite.spritecollide(self, input_beams_list, False)
        if collide_beam_list:
            print("collided")
            return True


def close_game():
    game = False
    pg.quit()
    quit()


beams_amount = 5
beams_list = pg.sprite.Group()

random.seed(57)

for beam in range(beams_amount):
    beam_to_add = Beam(beam_url, random.randint(beam_width, display_width - beam_width), random.randint(beam_height, display_height - beam_height))
    beams_list.add(beam_to_add)


car = Car(car_url)

def run_game():
    game = True

    while game:
        for event in pg.event.get():
            if event.type == pg.QUIT:
                close_game()

        display.fill(BLUE)

        # Drawing

        beams_list.update()

        car.draw_car()
        car.move_car(0.5, 0, 5)

        for sprite_object in beams_list.sprites():
            sprite_object.draw_beam()

        car.is_collision(beams_list)
            #close_game()

        pg.display.update()

        clock.tick(60)


run_game() 

1 Ответ

0 голосов
/ 06 мая 2020

Вы должны обновить атрибуты .rect. pygame.sprite.spritecollide используйте атрибуты .rect объектов pygame.Sprite для обнаружения столкновения:

class Beam(pg.sprite.Sprite):
    # [...]

    def draw_beam(self):
        self.x -= car.delta_x
        self.y -= car.delta_y

        self.rect.topleft = (self.x, self.y) # <---- ADD

        display.blit(self.image, (self.x, self.y))
        pg.draw.rect(display, RED, pg.Rect(self.x, self.y, self.width, self.height), 2)
class Car(pg.sprite.Sprite):
    # [...]

    def draw_car(self):

        self.rect.topleft = (self.x, self.y) # <---- ADD

        display.blit(self.image, (self.x, self.y))
        pg.draw.rect(display, RED, pg.Rect(self.x, self.y, self.width, self.height), 2)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...