python - 如何在 pygame 中用我旋转和移动的汽车旋转我的碰撞箱?

标签 python python-3.x pygame

我正在尝试将我的汽车 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.Maskoverlap() . 可以从 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/

相关文章:

python - 是否可以找到具有相同dom结构的节点

python - 如何从一年中的一周计算出一个月中的一周?

python-3.x - 你如何获得从字典中随机选择的值

python - 为什么pygame不继续循环?

python - 尝试在 pygame 中制作一个切换类型按钮。有问题

python - Django:正确 request.POST 中的值但无法保存表单

python - 在 Python 中安全地循环遍历同一生成器中的生成器吗?

python - 从 csv 文件中获取随机元素

python - 从 Python2 到 Python3 的这种解包行为的变化是什么?

python - 如何在 PyGame 中一次播放多首歌曲?