繁体   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