как я могу разбудить свой хитбокс, когда он сталкивается с чем-то поверх него

#python #pygame #collision-detection

#python #pygame #обнаружение столкновений

Вопрос:

Я создаю игру, которая должна быть полным хаосом, и одна из вещей, которые я сделал, это поместил падающую лаву. но моя проблема связана с обнаружением столкновений.

 if Falling_Lava.y - Falling_Lava.width < man.hitbox[1]   man.hitbox[3] and Falling_Lava.y   Falling_Lava.width > man.hitbox[1]:
        if Falling_Lava.x   Falling_Lava.width > Falling_Lava.x and Falling_Lava.width < man.hitbox[0]   man.hitbox[2]:
            pygame.time.delay(10)
            points -= 5
            man.hit()


if Falling_Lava1.y - Falling_Lava1.width < man.hitbox[1]   man.hitbox[3] and Falling_Lava1.y   Falling_Lava1.width > man.hitbox[1]:
        if Falling_Lava1.x   Falling_Lava1.width > Falling_Lava1.x and Falling_Lava1.width < man.hitbox[0]   man.hitbox[2]:
            pygame.time.delay(10)
            points -= 5
            man.hit()
 

Что происходит, когда падающая лава достигает вершины вашей координаты y, она начинает уменьшать ваше здоровье, даже если ваша координата x не равна x падающей лавы

То, что я сказал, объяснило

и я не думаю, что что-то не так с моим хитбоксом плеера, потому что он отлично работает, когда вас поражает зомби

 def __init__(self, x, y, width, height):
    self.x = x
    self.y = y
    self.width = width
    self.height = height
    self.velo = 8
    self.left = False
    self.right = False
    self.walkcount = 0
    self.Idlecount = 0
    self.guncount = 0
    self.gunisfired = False
    self.isIdle = False
    self.standing = True
    self.punchislaunched = False
    self.punchcount = 0
    self.hitbox = (self.x   20, self.y, 28, 60)
    self.health = 10
 

Может кто-нибудь объяснить это, пожалуйста

Если вам нужен полный код, перейдите на мой GitHub

Ответ №1:

Похоже, ваши проверки на столкновение немного перепутались. В x-value, если проверить, вы помещаете Falling_Lava.x Falling_Lava.width > Falling_Lava.x and Falling_Lava.width < man.hitbox[0] man.hitbox[2] , где вы сравниваете Falling_Lava с самим собой. попробуйте заменить Falling_Lava.x на man.hitbox[0] . Я не совсем уверен, правильно ли это исправить, но я надеюсь, что это поможет.

Редактировать:

Вот код, который вы написали. Все выглядит нормально, за исключением первого сравнения 2-й строки.

 if Falling_Lava.y - Falling_Lava.width < man.hitbox[1]   man.hitbox[3] and Falling_Lava.y   Falling_Lava.width > man.hitbox[1]:
    if Falling_Lava.x   Falling_Lava.width > Falling_Lava.x and Falling_Lava.width < man.hitbox[0]   man.hitbox[2]:
        pygame.time.delay(10)
        points -= 5
        man.hit()
 

Исправленный пример, изменение Falling_Lava.x на man.hitbox[0] (удалите стрелки в самом коде, просто чтобы указать, где …):

 if Falling_Lava.y - Falling_Lava.width < man.hitbox[1]   man.hitbox[3] and Falling_Lava.y   Falling_Lava.width > man.hitbox[1]:
    # Try replacing this line!
    if Falling_Lava.x   Falling_Lava.width > --> man.hitbox[0] <-- and Falling_Lava.width < man.hitbox[0]   man.hitbox[2]:
        pygame.time.delay(10)
        points -= 5
        man.hit()
 

Комментарии:

1. когда вы сказали, что я должен заменить Falling_Lava.x на man.hitbox[0], мне нужно туда, где я должен

2. Я добавил еще несколько объяснений о том, куда это ведет. Надеюсь, это поможет!

3. спасибо за вашу помощь, когда вы объяснили это более подробно, это имело смысл. 🙂

4. подожди, я только что заметил. если вы пойдете влево от падающей лавы, вы все равно потеряете здоровье

5. Я думаю, что во второй половине проверки x if вы ставите Falling_Lava.width < man.hitbox[0] man.hitbox[2] . Может быть, попробуйте заменить Falling_Lava.width на Falling_Lava.x