简体   繁体   English

球员运动

[英]Player movement

I wrote this simple code that draws and then lets you move a rectangle, but even after I change the coordinates of the rectangle by calling the move_player_x_ function, it doesn't move at all. 我写了这个简单的代码,绘制然后让你移动一个矩形,但即使我通过调用move_player_x_函数改变矩形的坐标,它根本不会移动。 I don't understand why. 我不明白为什么。 I came here looking for clarification and a detailed solution to my problem. 我来到这里寻找澄清和详细解决我的问题。

Here's the code: 这是代码:

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

The code in the event loop is not indented correctly. 事件循环中的代码未正确缩进。 Here's a corrected version: 这是一个更正版本:

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

Also, in the ...stop methods, you have to set lead_x_change and lead_y_change to 0 not lead_x and lead_y . 此外,在...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

I edited your code, i added a function in the player object move_player with local booleans bUp,bDown,bLeft,bRight . 我编辑了你的代码,我在播放器对象move_player添加了一个函数,其中包含本地布尔值bUp,bDown,bLeft,bRight If python had enumerations, it would be so much better. 如果python有枚举,它会好得多。 Any how, on event KEY DOWN and KEY UP, they toggle these booleans in the player. 任何如何,在事件KEY DOWN和KEY UP,他们切换播放器中的这些布尔值。 after the input is calculated and these booleans are toggled/set, it called move_player() in player object that checks its booleans and sets a while loop while one is true and adds velocity in the respected location and redraws player. 在计算输入并且这些布尔值被切换/设置之后,它在玩家对象中调用move_player()来检查其布尔值,并设置一个while循环,同时一个为真,并在受尊重的位置添加速度并重新绘制玩家。 Here the source i got for you... 在这里我得到的来源......

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