我正在尝试将我的汽车 Sprite 与另一个矩形碰撞,现在我正在使用矩形碰撞和我的汽车碰撞 video , 但每次我旋转 hitbox 时它都会移动到其他地方。
有没有办法让我的汽车 Sprite 与那个碰撞箱发生碰撞,而不是使用汽车碰撞箱?
我的车类:
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
我的完整代码是 here
最佳答案
How can I rotate my hitbox with my rotating and moving car in pygame?
你不知道。你必须使用 pygame.mask.Mask
和 overlap()
.
可以从 pygame.Surface
创建掩码通过 pygame.mask.from_surface()
并包含有关不透明像素的信息。 overlap()
在相交的 2 个蒙版中找到 1 个不透明像素。
例如:
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")
请注意,overlap()
的偏移量参数是从该掩码到另一个掩码(到第一个参数)的偏移量。它是参数中从掩码到另一个掩码的向量。如果self的位置是(x1, y1),other的位置是(x2 , y2) 那么偏移量就是 (x2 - x1, y2 - y1).
如果障碍物只是一个矩形并且您没有 Surface (),那么您可以从 obstacle_surface
pygame.Rect
生成一个完全不透明的 Mask。 (obstacle_rect
) 对象:
obstacle_mask = pygame.mask.Mask(obstacle_rect.width, True)
关于python - 如何在 pygame 中用我旋转和移动的汽车旋转我的碰撞箱?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62974678/