ОБНОВЛЕНИЕ - Я изменил код для отображения маски автомобиля, и оказалось, что маска находится не в том месте (верхний левый угол) и не двигается ... все еще застрял.
Просто пытаюсь определить, сходит ли машина с рельса, пока я пытался реализовать обнаружение столкновения с маской, однако, похоже, что оно работает не так, как задумано. Я попытался скопировать методы из https://github.com/illume/pixel_perfect_collision/blob/master/balloon.py, но даже это не работает.
Вот упрощенный код (полный код ниже):
#make masks
car_mask = pygame.mask.from_surface(car_image, 50)
back_mask = pygame.mask.from_surface(background_image, 50)
#make background rect
back_rect = background_image.get_rect()
#-=-=-=--==-=#
##MAIN LOGIC##
#-=-=-=-=-=-=#
#Get the car rect
rotated = pygame.transform.rotate(car_image, car.angle)
car_rect = rotated.get_rect()
#Calculate offset
offset_x = car_rect[0] - back_rect[0]
offset_y = car_rect[1] - back_rect[1]
#Check for overlap
overlap = back_mask.overlap(car_mask, (offset_x, offset_y))
#Draw everything
self.screen.fill((255, 255, 255))
self.screen.blit(background_image, (0,0))
self.screen.blit(rotated, car.position * 32 - (car_rect.width / 2, car_rect.height / 2))
#Confirm overlap
if overlap:
print("collision")
Вот полный код:
import os
import pygame
from math import tan, radians, degrees, copysign
from pygame.math import Vector2
class Car:
def __init__(self, x, y, angle=0.0):
#initialize
self.position = Vector2(x, y)
self.velocity = Vector2(0.0, 0.0)
self.angle = angle
self.acceleration = 0.0
self.steering = 0.0
def update(self, dt):
#update car variables
self.velocity = Vector2(self.acceleration, 0)
angular_velocity = self.steering * dt * self.velocity.x
self.position += self.velocity.rotate(-self.angle) * dt
self.angle += degrees(angular_velocity) * dt
class Game:
def __init__(self):
#initialize
pygame.init()
pygame.display.set_caption("Car tutorial")
self.screen = pygame.display.set_mode((1280, 720))
self.clock = pygame.time.Clock()
self.ticks = 60
self.exit = False
def run(self):
#get images
current_dir = os.path.dirname(os.path.abspath(__file__))
image_path = os.path.join(current_dir, "car.png")
car_image = pygame.image.load(image_path).convert_alpha()
image_path2 = os.path.join(current_dir, "racetrackv1.png")
background_image = pygame.image.load(image_path2).convert_alpha()
#make car
car = Car(17, 5)
#make masks
car_mask = pygame.mask.from_surface(car_image, 50)
back_mask = pygame.mask.from_surface(background_image, 50)
#make background rect
back_rect = background_image.get_rect()
while not self.exit:
dt = self.clock.get_time() / 1000
#Check for exit
for event in pygame.event.get():
if event.type == pygame.QUIT:
self.exit = True
#Get user input
pressed = pygame.key.get_pressed()
#Acceleration logic
if pressed[pygame.K_UP]:
car.acceleration += 1 * dt
elif pressed[pygame.K_DOWN]:
car.acceleration -= 1 * dt
else:
car.acceleration *= 0.99
#Steering logic
if pressed[pygame.K_RIGHT]:
car.steering -= 30 * dt
elif pressed[pygame.K_LEFT]:
car.steering += 30 * dt
else:
car.steering = 0
#Update the car
car.update(dt)
#Get the car rect
rotated = pygame.transform.rotate(car_image, car.angle)
car_rect = rotated.get_rect()
#Calculate offset
offset_x = car_rect[0] - back_rect[0]
offset_y = car_rect[1] - back_rect[1]
#Check for overlap
overlap = back_mask.overlap(car_mask, (offset_x, offset_y))
#Draw everything
self.screen.fill((255, 255, 255))
self.screen.blit(background_image, (0,0))
self.screen.blit(rotated, car.position * 32 - (car_rect.width / 2, car_rect.height / 2))
#Confirm overlap
if overlap:
print("collision")
pygame.display.flip()
self.clock.tick(self.ticks)
pygame.quit()
if __name__ == '__main__':
game = Game()
game.run()