Движение игрока - PullRequest
       1

Движение игрока

0 голосов
/ 31 августа 2018

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

Вот код:

import pygame

white = (255, 255, 255)
black = (0, 0, 0)

class Game():
    width = 800
    height = 600
    screen = pygame.display.set_mode((width, height))

    def __init__(self):
        pass
    def fill_screen(self, color):
        self.color = color
        self.screen.fill(self.color)

    def update_method(self):
        pygame.display.update()

game = Game()


class Player(pygame.sprite.Sprite):
    lead_x = game.width/2
    lead_y = game.height/2
    lead_x_change = 0
    lead_y_change = 0
    velocity = 0.2
    block_size = 10
    def __init__(self):
        pygame.sprite.Sprite.__init__(self)

    def move_player_x_left(self):
        self.lead_x_change += -self.velocity

    def move_player_x_right(self):
        self.lead_x_change += self.velocity

    def move_player_y_up(self):
        self.lead_y_change += -self.velocity

    def move_player_y_down(self):
        self.lead_y_change += self.velocity

    def draw_player(self):
        pygame.draw.rect(game.screen, black, [self.lead_x, self.lead_y, self.block_size, self.block_size])

    def key_up_x_stop(self):
        self.lead_x = 0

    def key_up_y_stop(self):
        self.lead_y = 0

    def constant_x_movement(self):
        self.lead_x += self.lead_x_change

    def constant_y_movement(self):
        self.lead_y += self.lead_y_change


player = Player()

exitGame = False
while not exitGame:
    game.fill_screen(white)
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            exitGame = True
            if event.type == pygame.KEYDOWN:
                if event.key == pygame.K_w:
                    player.move_player_y_up()
                if event.key == pygame.K_s:
                    player.move_player_y_down()
                if event.key == pygame.K_a:
                    player.move_player_x_left()
                if event.key == pygame.K_d:
                    player.move_player_x_right()

            if event.type == pygame.KEYUP:
                if event.key == pygame.K_w or event.key == pygame.K_s:
                    player.key_up_y_stop()
                if event.key == pygame.K_a or event.key == pygame.K_d:
                    player.key_up_x_stop()
    player.constant_x_movement()
    player.constant_y_movement()        

    player.draw_player()
    game.update_method()
pygame.quit()
quit()

Ответы [ 2 ]

0 голосов
/ 31 августа 2018

Код в цикле событий не имеет правильного отступа. Вот исправленная версия:

while not exitGame:
    game.fill_screen(white)
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            exitGame = True
        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_w:
                player.move_player_y_up()
            if event.key == pygame.K_s:
                player.move_player_y_down()
            if event.key == pygame.K_a:
                player.move_player_x_left()
            if event.key == pygame.K_d:
                player.move_player_x_right()
        if event.type == pygame.KEYUP:
            if event.key == pygame.K_w or event.key == pygame.K_s:
                player.key_up_y_stop()
            if event.key == pygame.K_a or event.key == pygame.K_d:
                player.key_up_x_stop()

Кроме того, в методах ...stop необходимо установить lead_x_change и lead_y_change на 0, а не lead_x и lead_y.

def key_up_x_stop(self):
    self.lead_x_change = 0

def key_up_y_stop(self):
    self.lead_y_change = 0
0 голосов
/ 31 августа 2018

Я отредактировал ваш код, я добавил функцию в объект проигрывателя move_player с локальными логическими значениями bUp,bDown,bLeft,bRight. Если бы у python были перечисления, было бы намного лучше. В любом случае, при событиях KEY DOWN и KEY UP они переключают эти логические значения в плеере. после того, как входные данные вычислены, и эти логические значения переключены / установлены, он вызывает move_player() в объекте игрока, который проверяет свои логические значения и устанавливает цикл while, пока один равен true, и добавляет скорость в соответствующем месте и перерисовывает игрока. Вот источник, который я получил для тебя ...

import pygame

white = (255, 255, 255)
black = (0, 0, 0)

class Game():
    width = 800
    height = 600
    screen = pygame.display.set_mode((width, height))
    def __init__(self):
        pass
    def fill_screen(self, color):
        self.color = color
        self.screen.fill(self.color)

    def update_method(self):
        pygame.display.update()

class Player(pygame.sprite.Sprite):
    lead_x = 800/2
    lead_y = 600/2
    velocity = 0.002
    block_size = 10

    bUp = false 
    bDown = false 
    bLeft = false 
    bRight = false

    def __init__(self):
        pygame.sprite.Sprite.__init__(self)

    def draw_player(self):
        pygame.draw.rect(game.screen, black, [self.lead_x, self.lead_y, self.block_size, self.block_size])

    def move_player(self):
        while bLeft:
            self.lead_x += -self.velocity
            self.draw_player()
        while bRight:
            self.lead_x += self.velocity
            self.draw_player()
        while bUp:
            self.lead_y += -self.velocity
            self.draw_player()
        while bDown:
            self.lead_y += self.velocity
            self.draw_player()

game = Game()
player = Player()

exitGame = False
while not exitGame:
    game.fill_screen(white)
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            exitGame = True
        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_w:
                player.bUp = true
            if event.key == pygame.K_s:
                player.bDown = true 
            if event.key == pygame.K_d:
                player.bRight = true
            if event.key == pygame.K_a:
                player.bLeft = true
        elif event.type == pygame.KEYUP:
            if event.key == pygame.K_w:
                player.bUp = false
            if event.key == pygame.K_s:
                player.bDown = false 
            if event.key == pygame.K_d:
                player.bRight = false
            if event.key == pygame.K_a:
                player.bLeft = false
    player.move_player()
    game.update_method()
pygame.quit()
quit()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...