为什么我的跳跃不工作在python 3 / pygame



我没有得到任何错误,只是当我尝试按向上箭头键时,它什么也不做。

在我的玩家类中我的跳跃(自我)有问题吗?或者我需要为它添加更新吗?我不确定

这是我的代码

import pygame

pygame.init()

screen = pygame.display.set_mode((800,600))
pygame.display.set_caption("use arows")

movex = 0

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 jump(self):
        if(self.onGround == False):
            return
        self.velocity = 8
        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))

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
            elif (event.key == pygame.K_UP):
                player.jump()

        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.x += movex
    player.update(gravity, blockList)
    player.render(screen)
    clock.tick(60)
    pygame.display.update()
pygame.quit()

你的update()方法有一个错别字:

if(self.falling == True):
    self.falling == False
    self.onGround == True

这些语句没有任何意义。你需要把它们改成单个的等号这样就能改变这些变量的值。应该是:

if self.falling == True:
    self.falling = False
    self.onGround = True

顺便说一下,如果语句条件的括号在Python中是不需要的,所以我从我的答案中删除了它们。我建议你也把它们去掉。

编辑-进一步说明:

var1 == var2总是返回True或False,取决于它们是否相等。它不会改变var1或var2的值。

var1 = var2设置var1等于var2。

完整示例:

var1 = 1
var2 = 2
var1 == var2 # Nothing happens
var1 = var2  # var1 now equals 2
var3 = var1 == var2 # var3 now equals True. You might want some parenthesis around this one just for clarity.
print(var1,var2,var3) # Prints "2 2 True"

最新更新