Получение положения x и y объекта PygAnimation для обнаружения столкновений - PullRequest
0 голосов
/ 06 августа 2020

Я собираюсь создать игру, похожую на перекресток, с анимированным объектом PygAnimation (лягушка), и мне нужно найти положение объекта по осям x и y, чтобы проверить наличие столкновения с врагами (условие потери) и сокровища ( условие победы). Сама анимация работает:

if moveUp or moveDown or moveLeft or moveRight:
            if direction == UP:
                animObjs['back_walk'].blit(windowSurface, (x, y))
            elif direction == DOWN:
                animObjs['front_walk'].blit(windowSurface, (x, y))
            elif direction == LEFT:
                animObjs['left_walk'].blit(windowSurface, (x, y))
            elif direction == RIGHT:
                animObjs['right_walk'].blit(windowSurface, (x, y))

AnimOb js загружены в словарь, но я не могу получить доступ к значениям x и y каждого символа. Я чувствую, что есть простое решение, но я новичок в программировании и пока не нашел его. Враги являются частью класса NonPlayerCharacter (GameObject), а значения x и y доступны только с помощью image_path, self.x_pos и self.y_pos. Но с анимацией я, похоже, не могу получить к ней доступ таким же образом, потому что анимация, кажется, обрабатывается по-разному. загрузите гифки для условий стояния и движения:

    front_standing = pygame.image.load('frog_front.gif')
    back_standing = pygame.image.load('frog_back.gif')
    left_standing = pygame.image.load('frog_left.gif')
    right_standing = pygame.transform.flip(left_standing, True, False)

    playerWidth, playerHeight = front_standing.get_size()

    # creating the PygAnimation objects for walking in all directions
    animTypes = 'back_walk front_walk left_walk'.split()
    animObjs = {}
    animObjs['back_walk'] = pyganim.PygAnimation('frog_back_walk.gif')
    animObjs['front_walk'] = pyganim.PygAnimation('frog_front_walk.gif')

    animObjs['left_walk'] = pyganim.PygAnimation('frog_left_walk.gif')                                  

    # create the right-facing sprites by copying and flipping the left-facing sprites
    animObjs['right_walk'] = animObjs['left_walk'].getCopy()
    animObjs['right_walk'].flip(True, False)
    animObjs['right_walk'].makeTransformsPermanent()

    moveConductor = pyganim.PygConductor(animObjs)
    direction = DOWN # player starts with facing down (front)

Класс врага следующий:

class NonPlayerCharacter (GameObject): SPEED = 10

def __init__(self,image_path, x, y, width, height):
    super().__init__(image_path, x, y, width, height)

def move(self, max_width):
    # automating of movement
    if self.x_pos <= 20:
        self.SPEED = abs(self.SPEED)
    elif self.x_pos >= max_width - 40:
        self.SPEED = -abs(self.SPEED)
    self.x_pos += self.SPEED

Враги просто перемещаются по экрану слева направо, и вот как осуществляется доступ к каждому врагу:

врага_0 = NonPlayerCharacter ("own.png", 20, 600, 50, 50)

Буду очень признателен за вашу помощь. Я думаю, это мелочь. : -)

1 Ответ

0 голосов
/ 07 августа 2020

Глядя на источник pygAnimation , вы можете использовать .getRect(), а затем поместить его в последний использованный x,y предыдущего блит-кода. Похоже, что pygAnimations не хранит позицию внутри.

Однако getRect() возвращает максимальную ширину и высоту всех кадров анимации, которые могут не быть что вы хотите от столкновений. В частности, если размер спрайта значительно меняется во время анимационной последовательности.

Итак, возможно, что-то вроде этого подойдет, используя getCurrentFrame():

def getCurrentRect( position, animation ):
    """ Get the positioned rect of the current pygAnimation frame """
    current_image = animation.getCurrentFrame()
    rect = current_image.get_rect()
    rect.topleft = position                       # do you draw at top-left?
    return rect
...