How can I rotate my hitbox with my rotating and moving car in pygame?

ε祈祈猫儿з 提交于 2021-02-10 04:54:21

问题


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 (obstacle_surface), then you can generate a completely opaque Mask form the pygame.Rect (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

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!