簡體   English   中英

球員運動

[英]Player movement

我寫了這個簡單的代碼,繪制然后讓你移動一個矩形,但即使我通過調用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()

事件循環中的代碼未正確縮進。 這是一個更正版本:

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_changelead_y_change設置為0而不是lead_xlead_y

def key_up_x_stop(self):
    self.lead_x_change = 0

def key_up_y_stop(self):
    self.lead_y_change = 0

我編輯了你的代碼,我在播放器對象move_player添加了一個函數,其中包含本地布爾值bUp,bDown,bLeft,bRight 如果python有枚舉,它會好得多。 任何如何,在事件KEY DOWN和KEY UP,他們切換播放器中的這些布爾值。 在計算輸入並且這些布爾值被切換/設置之后,它在玩家對象中調用move_player()來檢查其布爾值,並設置一個while循環,同時一個為真,並在受尊重的位置添加速度並重新繪制玩家。 在這里我得到的來源......

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()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM