Можно ли получить местоположение спрайта в МГНОВЕННО? - PullRequest
0 голосов
/ 26 мая 2018

Итак, я работаю над игрой PacMan, и я настроил свой код так, чтобы, если вы нажмете левую клавишу, он «запомнил» это и подождал, пока игрок не окажется в месте, где нет стен, что позволитэто двигаться влево.Таким образом, игроку не нужно точно определять время попадания клавиш в соответствии с тем, где находятся отверстия в стене.Моя проблема в том, что когда я нажимаю, например, влево, он воспроизводит анимацию движения влево, даже если игрок не двигается в этом направлении, пока в стене не появится отверстие.

В моем коде я пытаюсь сделать так, чтобы он воспроизводил только левую анимацию, когда игрок двигается влево.То, как я пытаюсь это сделать, это получить позицию игрока в одно мгновение, а затем проверить, находится ли игрок слева от этого, то есть он успешно сделал поворот и теперь должен сыграть левую анимацию.,Вот мое основное мышление в коде:

class Player (pygame.sprite.Sprite):

    def __init__(self, game, x, y):
        self.groups = game.all_sprites

        pygame.sprite.Sprite.__init__(self, self.groups)

        self.game = game
        self.image = sprite_sheet('pacman-spritesheet.png').get_image(0, 0, 24, 24)

        self.x = x * TILESIZE
        self.y = y * TILESIZE


        self.rect = self.image.get_rect()

        self.vx, self.vy = 0, 0

        self.spritesheet_index = 0

        self.first_time = pygame.time.get_ticks()
        self.delay = 43


        self.input_list = ['--']

        self.direction = ''

        self.POINTS = 0



    def get_keys(self):



        keys = pygame.key.get_pressed()


        if keys[pygame.K_LEFT]:

            self.input_list.append('left')

        if keys[pygame.K_RIGHT]:

            self.input_list.append('right')

        if keys[pygame.K_UP]:

            self.input_list.append('up')

        if keys[pygame.K_DOWN]:

            self.input_list.append('down')



    def last_direction(self):
        return self.input_list[len(self.input_list) - 1]



    def animate(self):
        self.spritesheet_index += 1



        if self.last_direction() == 'left':
            self.second_time = pygame.time.get_ticks()

            if self.second_time-self.first_time > self.delay and self.first_x < self.second_x:
                self.image = PAC_LEFT[self.spritesheet_index % 4]
                self.first_time = pygame.time.get_ticks()


        if self.last_direction() == 'right':
            self.second_time = pygame.time.get_ticks()

            if self.second_time - self.first_time < self.delay:
                self.image = PAC_RIGHT[self.spritesheet_index % 4]
                self.first_time = pygame.time.get_ticks()

        if self.last_direction() == 'up':
            self.second_time = pygame.time.get_ticks()

            if self.second_time - self.first_time > self.delay:
                self.image = PAC_UP[self.spritesheet_index % 4]
                self.first_time = pygame.time.get_ticks()

        if self.last_direction() == 'down':
            self.second_time = pygame.time.get_ticks()

            if self.second_time - self.first_time > self.delay:
                self.image = PAC_DOWN[self.spritesheet_index % 4]
                self.first_time = pygame.time.get_ticks()



    def set_velocity(self):
        if self.last_direction() == 'left':
            self.vx = -PLAYER_SPEED

        if self.last_direction() == 'right':
            self.vx = PLAYER_SPEED

        if self.last_direction() == 'up':
            self.vy = -PLAYER_SPEED

        if self.last_direction() == 'down':
            self.vy = PLAYER_SPEED


    def move(self):
        self.x += self.vx
        self.y += self.vy



    def update(self):
        self.first_x = self.x

        self.get_keys()

        self.set_velocity()
        self.move()

        self.second_x = self.x

        self.animate()

        self.rect.x = self.x
        self.collide_with_wall('x')

        self.rect.y = self.y
        self.collide_with_wall('y')


        self.collide_with_point()

1 Ответ

0 голосов
/ 26 мая 2018

Вы можете сделать это, просто имея атрибут self.last_rect, который вы сохраняете в конце метода обновления.Тем не менее, я думаю, что есть лучшие способы.Так как вам удалось сделать так, чтобы Pacman только начал двигаться влево, когда в стене есть отверстие, вы должны иметь возможность использовать то же место в коде для изменения спрайтов.Но это примерно то, что вам нужно сделать, если вы все еще хотите сделать это так, как вы просили.

PACMAN_SIZE = 32, 32
LEFT_SPRITES  = load_left_sprites()
RIGHT_SPRITES = load_right_sprites()

class Pacman(pygame.sprite.Sprite):

    def __init__(self)
        # ... List all your attributes in the __init__ method ...

    def get_direction(self):
        return self.input_list[len(self.input_list)-1]

    def set_velocity(self):       
        if self.get_direction() == 'left':
            self.vx = -PLAYER_SPEED
        elif self.get_direction() == 'right':
            self.vx = PLAYER_SPEED

    def move(self):
        # Your move logic
        # ... code ...
        self.rect.x += self.vx

    def animate(self):
        if self.new_x > self.previous_x:
            self.image = PAC_RIGHT[self.spritesheet_index % 4]
        elif self.new_x < self.previous_x:
            self.image = PAC_LEFT[self.spritesheet_index % 4]

    def update(self, dt):
        self.previous_x = self.rect.x
        set_velocity()
        move()
        self.new_x = self.rect.x
        animate()           
...