为什么我的玩家不会在python中移动

时间:2015-10-05 23:58:03

标签: python pygame

我的播放器不会移动,我不明白为什么。我按照了如何使其移动的教程。我做了那个人所做的事情,但它并不适合我。

这是我的代码:

import pygame


pygame.init()


screen = pygame.display.set_mode((800,600))

pygame.display.set_caption("use arows")





class player:

    def __init__(self ,x, y):

        self.x = x
        self.y = y
        self.width = 32
        self.height = 32
        self.velocity = 0
        self.falling = False
        self.onGround = False

    def detectCollisions(self,x1,y1,w1,h1,x2,y2,w2,h2):

        if (x2+w2>=x1>=x2 and y2+h2>=y1>=y2):

            return True

        elif (x2+w2>=x1+w1>=x2 and y2+h2>=y1>=y2):

            return True

        elif (x2+w2>=x1>=x2 and y2+h2>=y1+h1>=y2):

            return True

        elif (x2+w2>=x1+w1>=x2 and y2+h2>=y1+h1>=y2):

            return True

        else:

            return False

    def update(self, gravity, blockList):
        if (self.velocity < 0):
            self.falling = True

        collision = False
        blockX,blockY =  0,0
        for block in blockList:

            collision = self.detectCollisions(self.x, self.y, self.width, self.height, block.x, block.y, block.width, block.height )
            if collision == True:
                blockx = block.x
                blocky = block.y
                break


        if(collision == True):
            if (self.falling == True):
                self.falling == False
                self.onGround== True
                self.velocity = 0
                self.y = blocky - self.height

        if (self.onGround == False):
            self.velocity += gravity
        self.y -= self.velocity

    def render(self,screen):
        pygame.draw.rect(screen,(0,0,0),(self.x, self.y, self.width, self.height))


class Block:
    def __init__ (self, x, y):
       self.x = x
       self.y = y
       self.width = 32
       self.height = 32

    def render(self,screen):
        pygame.draw.rect(screen,(0,0,0),(self.x, self.y, self.width, self.height))



gravity = -0.5

black = (0,0,0)
white = (255,255,255)
blue = (50,60,200)

clock = pygame.time.Clock()

player = player(0,0)

# 25 colums and 19 rows
level1 = [
    [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
    [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
    [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
    [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
    [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
    [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
    [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
    [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
    [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
    [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
    [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
    [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
    [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
    [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
    [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
    [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
    [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
    [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
    [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]
]

blockList = []

for y in range (0,len(level1)):
    for x in range (0,len(level1[y])):
        if (level1[y][x] == 1):
            blockList.append(Block(x*32, y*32))

movex,movey=0,0

gameloop = True
while gameloop:

    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            gameloop = False

    if(event.type == pygame.KEYDOWN):
        if (event.key == pygame.K_RIGHT):
            movex = 5

        elif (event.key == pygame.K_LEFT):
            movex = -5


    if(event.type == pygame.KEYUP):
        if (event.key == pygame.K_RIGHT):
            movex = 0

        elif (event.key == pygame.K_LEFT):
           movex = 0

    screen.fill(blue)

    for block in blockList:
        block.render(screen)

    player.update(gravity, blockList)
    player.render(screen)
    clock.tick(60)

    pygame.display.update()

pygame.quit()

1 个答案:

答案 0 :(得分:0)

你的游戏循环中有一个嵌套问题。事件操作的检查需要在for循环中,因此它会在帧期间检查每个事件。它只检查当前编码的最后一个事件。

缩小你的事件检查,如下:

gameloop = True
while gameloop:

    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            gameloop = False

        if(event.type == pygame.KEYDOWN):
            if (event.key == pygame.K_RIGHT):
                movex = 5

            elif (event.key == pygame.K_LEFT):
                movex = -5


        if(event.type == pygame.KEYUP):
            if (event.key == pygame.K_RIGHT):
                movex = 0

            elif (event.key == pygame.K_LEFT):
                movex = 0

修改

除了上述内容之外,movex变量未被使用,实际上,您的播放器更新功能无法在其中进行水平移动。

您需要对您的Player类进行一些更新:

def __init__(self ,x, y):

    self.x = x
    self.y = y
    self.width = 32
    self.height = 32
    self.yVelocity = 0
    self.xVelocity = 0 #Add xVelocity variable to track horizontal speed.
    self.falling = False
    self.onGround = False


def update(self, gravity, blockList):
    if (self.yVelocity < 0):
        self.falling = True

    collision = False
    blockX,blockY =  0,0
    for block in blockList:

        collision = self.detectCollisions(self.x, self.y, self.width, self.height, block.x, block.y, block.width, block.height )
        if collision == True:
            blockx = block.x
            blocky = block.y
            break


    if(collision == True):
        if (self.falling == True):
            self.falling == False
            self.onGround== True
            self.yVelocity = 0
            self.xVelocity = 0 #On a collision, stop all movement.
            self.y = blocky - self.height

    if (self.onGround == False):
        self.yVelocity += gravity
    self.y -= self.yVelocity
    self.x -= self.xVelocity #Modify position according to velocity.

然后,在你的游戏循环中,根据输入更新玩家的xVelocity:

player.xVelocity = movex #Update horizontal velocity.
player.update(gravity, blockList)
player.render(screen)
clock.tick(60)

这应该有所帮助。