заставить спрайт присесть в текущей позиции python

#python-3.x #pygame

#python-3.x #pygame

Вопрос:

Привет, я создаю файтинг, чтобы немного попрактиковаться в pygame, но я столкнулся с проблемой приседания / пригибания. Когда я нажимаю кнопку вниз, он возвращается в исходное положение, а затем пригибается. Если вам нужна дополнительная информация, чтобы помочь, я предоставлю.

 import pygame
import random

display_height = 600
display_width = 1000
dis_screen = pygame.display.set_mode((display_width, display_height))
FPS = 30
clock = pygame.time.Clock()
img = pygame.image.load('foo.png')
crouchimg = pygame.image.load('crouchimg.png')


# Simple player object
class Player(object):
    def __init__(self, x, y, image):
        self.x = x
        self.y = y
        self.image = image

    # Method to draw object
    def draw(self):
        dis_screen.blit(self.image, (self.x, self.y))

    # Method to move object
    def move(self, speedx, speedy):
        self.x  = speedx
        self.y  = speedy


class MainRun(object):
    def __init__(self, displayw, displayh):
        self.dw = displayw
        self.dh = displayh
        self.Main()

    def Main(self):
        # Put all variables up here
        stopped = False
        x_move = 0
        y_move = 0
        p1_y_loc = 200
        p1_x_loc = 200
        x = pygame.Rect().x
        greg = Player(p1_x_loc, p1_y_loc, img)
        # Main Loop
        while not stopped:
            print(x)
            dis_screen.fill((255, 255, 255))  # Tuple for filling display... Current is white
            # Event Tasking
            for event in pygame.event.get():
                if event.type == pygame.QUIT:
                    pygame.quit()
                    quit()
                if event.type == pygame.KEYDOWN:
                    if event.key == pygame.K_RIGHT:
                        y_move = 0
                        x_move = 5
                    elif event.key == pygame.K_LEFT:
                        y_move = 0
                        x_move = -5
                    elif event.key == pygame.K_UP:
                        y_move = -5
                        x_move = 0
                    elif event.key == pygame.K_DOWN:
                        p1_y_loc = 300
                        p1_x_loc = 0
                        greg = Player(p1_x_loc, p1_y_loc, crouchimg)

                if event.type == pygame.KEYUP:
                    if event.key == pygame.K_DOWN:
                        p1_y_loc = 200
                        greg = Player(p1_x_loc, p1_y_loc, img)
                    if event.key == pygame.K_UP:
                        y_move = 0
                    if event.key == pygame.K_RIGHT or event.key == pygame.K_LEFT:
                        x_move = 0




            greg.move(x_move, y_move)
            greg.draw()
            pygame.display.update()
            clock.tick(FPS)
        pygame.quit()
        quit()

run = MainRun(display_width, display_height)
run.Main()
  

Ответ №1:

Это потому, что когда вы нажимаете клавишу down, вы создаете нового игрока в позиции x p1_x_loc (для которой вы установили значение 0) и y-позиции p1_y_loc (для которой вы установили значение 300). Таким образом, когда игрок приседает, это также перемещает его на (0, 300), независимо от позиции, в которой игрок находится в данный момент.

Способ решить эту проблему — просто изменить изображение игрока, а не создавать совершенно нового игрока. Вы можете сделать это таким образом, player.image = crouchimg вместо greg = Player(p1_x_loc, p1_y_loc, crouchimg) . И когда игрок встает, вы просто снова меняете изображение: player.image = img

И если вам нужно изменить y-позицию игроков при приседании, вы могли бы сделать это таким же образом: player.y = 200 и player.y = 300 .