Pygame: попытка заставить весь спрайт пересечь границу, а не только верхний левый пиксель - PullRequest
1 голос
/ 26 мая 2020

Я пытаюсь заставить свой спрайт двигаться в соответствии с алгоритмом поиска пути Astar. Однако после того, как я его реализовал, я понял, что движение спрайта происходит только в соответствии с верхним левым пикселем. Это означает, что если алгоритм говорит ему двигаться вверх после пересечения границы, он сделает это, как только верхний левый пиксель пересечет эту границу. Однако это означает, что весь спрайт на самом деле не пересекся, что приводит к столкновению, если прямо над ним есть препятствие. Есть ли способ сказать ему, чтобы он сдвинулся еще левее, прежде чем двигаться вверх] 1

def astar_ghost(pac,ghost):
    maze=astar.create_maze(screen_width,screen_height,obstacles) #creates a maze of 0s and 1s. The 1s represent the obstacles

    start=(ghost.gridloc[0],ghost.gridloc[1])
    end=(ghost.goal_node[0],ghost.goal_node[1])
    goal_node=astar.astar(maze,start,end)

    if goal_node==None:
        pass
    else:
        ghost.goal_node=goal_node

    game=True

    if ghost.goal_node[0]<ghost.gridloc[0]:#left
         print('move left')

         game=collision(pac,ghost) #collision is another function that checks for collision and returns True or False. If False, the game will be over
         ghost.left=True
         ghost.right=False
         ghost.up=False
         ghost.down=False

     elif ghost.goal_node[0]>ghost.gridloc[0]:#right
         print('move right')

         game=collision(pac,ghost)
         ghost.left=False
         ghost.right=True
         ghost.up=False
         ghost.down=False

    elif ghost.goal_node[1]<ghost.gridloc[1]:#up
         print('move up')

         game=collision(pac,ghost)
         ghost.left=False
         ghost.right=False
         ghost.up=True
         ghost.down=False

    elif ghost.goal_node[1]>ghost.gridloc[1]:#down
        print('move down')

        game=collision(pac,ghost)
        ghost.left=False
        ghost.right=False
        ghost.up=False
        ghost.down=True

1 Ответ

1 голос
/ 26 мая 2020

Здесь вы задаете несколько разных вопросов. Я отвечу здесь на то, что, как мне кажется, вы пытаетесь спросить: Есть ли способ проверить, пересек ли границу весь спрайт, а не только верхний левый угол? . Итак, мой ответ (обратите внимание, это будет работать только в том случае, если ваша граничная линия линейна): вам нужно проверить каждый из углов по отдельности, затем, если все они вернули True, вы двигаетесь дальше. Пример:

def collision(sprite1, boundary):
    def internal_collision(point, boundary):
        ... # The actual math happens here, returns True/False
    corners = []
    for h in [0, 1]:
        for j in [0, 1]:
            corners.append([sprite1.rect.x+(h*sprite1.rect.width),
                            sprite1.rect.y+(j*sprite1.rect.height)])
    corner_check = []
    for corner in corners:
        corner_check.append(internal_collision(corner, boundary))
    return all(corner_check)

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...