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

问题描述:

我的玩家不会移动,我不明白为什么。我跟着一篇关于如何让它移动的教程。我做了这个人做的事情,但对我而言并不动。为什么我的玩家不会在python中移动

这里是我的代码:

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

你在你的gameloop有一个嵌套的问题。对事件动作的检查需要位于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变量没有被使用,并且,的确,您的播放器更新功能没有水平运动的手段。

你需要做一些更新您的播放器类:

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) 

应帮帮我。

+0

似乎没有解决它。只是向你展示我做过/看看我是否做得对http://prntscr.com/8o71ub – GeeZillion

+0

如果这没有奏效,还必须有另一个问题。让我再看一遍代码。 –

+0

'movex'实际上并没有用于任何事情,所以修改它不会导致任何操作。您需要将播放器的水平速度设置为“movex”,但更新功能只使用“速度”,这是垂直运动。您需要向更新功能添加水平移动。 –