问题
I am trying to collide my car sprite with another rect, right now I am using rect collisions and my car collision video, but each time I rotate the hitbox it moves somewhere else.
Is there a way I could collide my car sprite with that hitbox instead of using a car hitbox?
My car class:
class Car:
def __init__(self, x, y, height, width, color):
self.x = x - width / 2
self.y = y - height / 2
self.height = height
self.width = width
self.color = color
self.rect = pygame.Rect(x, y, height, width)
self.surface = pygame.Surface((height, width), pygame.SRCALPHA)
self.surface.blit(img, (0, 0))
self.angle = 250
self.speed = 0# 2
self.hitbox = (self.x + 90, self.y + 620, 370, 63)# CARS HITBOX
pygame.draw.rect(window, (255, 0, 0), self.hitbox, 2)
def draw(self): #3
self.rect.topleft = (int(self.x), int(self.y))
rotated = pygame.transform.rotate(self.surface, self.angle)
surface_rect = self.surface.get_rect(topleft = self.rect.topleft)
new_rect = rotated.get_rect(center = surface_rect.center)
window.blit(rotated, new_rect.topleft)
self.hitbox = (self.x, self.y, 70, 40)# CARS HITBOX BLITTING AT car x, y
pygame.draw.rect(window, (255, 0, 0), self.hitbox, 2)# draw the car hitbox
white = (255, 255, 255)
car1 = Car(100, 630, 73, 73, white)# 4
My full code is here
回答1:
How can I rotate my hitbox with my rotating and moving car in pygame?
You don't. You have to use pygame.mask.Mask and overlap().
A mask can be created from a pygame.Surface by pygame.mask.from_surface() and contains the information about the opaque pixels. overlap()
finds the 1 opaque pixel in 2 masks, which are intersecting.
For instance:
class Car:
# [...]
def draw(self):
# [...]
self.mask = pygame.mask.from_surface(rotated)
self.mask_rect = new_rect
obstacle_mask = pygame.mask.from_surface(obstacle_surface)
offset_x = obstacle_rect.x - car1.mask_rect.x
offset_y = obstacle_rect.y - car1.mask_rect.y
if car1.mask.overlap(obstacle_mask, (offset_x, offset_y)):
print("hit")
Note, the offset argument of overlap()
, is the offset from this mask to the other mask (to the 1st argument). It is the vector from the mask to the other mask in the argument. If the location of self is (x1, y1) and the location of other is (x2, y2) then the offset is (x2 - x1, y2 - y1).
If the obstacle is just a rectangle and you don't have a Surface (), then you can generate a completely opaque Mask form the pygame.Rect (obstacle_surface
obstacle_rect
) object:
obstacle_mask = pygame.mask.Mask(obstacle_rect.width, True)
来源:https://stackoverflow.com/questions/62974678/how-can-i-rotate-my-hitbox-with-my-rotating-and-moving-car-in-pygame