【问题标题】:Why won't my character jump in pygame/python为什么我的角色不会在 pygame/python 中跳转
【发布时间】:2016-06-27 20:34:11
【问题描述】:

这是我制作的第一个 Pygame 游戏。

我正计划制作一款带有基本方块/方块的 2 人格斗游戏。

我现在正在尝试实现跳转到第一个字符,在我看来,所有逻辑看起来都是正确的,目前我没有任何错误。但是,当我尝试按w 跳跃时,什么都没有发生!

感谢所有帮助。 (P.S 如果您想知道为什么我的脚本中没有课程,我似乎无法理解课程,他们让我很困惑:P)谢谢,这是我的代码:

import pygame

pygame.init()

#Sets up 8 bit colours
white = (255,255,255)
black = (0,0,0)
red = (255,0,0)
green = (0,255,0)
blue = (0,0,255)
lightblue = (180,235,255)
grassgreen =(20,200,50)

#Sets up pygame window
gameDisplay = pygame.display.set_mode((1000,600))
pygame.display.set_caption('Block Fighter')

gameExit = False

#Variables
x = 50
y = 480
x_change = 0
y_change = 0

clock = pygame.time.Clock()

#Main Game Loop
while not gameExit:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            gameExit = True
        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_a:
                x_change = -5
            if event.key == pygame.K_d:
                x_change = 5
            if event.key == pygame.K_w:
                y_change = -5
        if event.type == pygame.KEYUP:
            if event.key == pygame.K_a or event.key == pygame.K_d:
                x_change = 0

    if y <= 480:
        onGround = False
    else:
        onGround = True
    if onGround == False:
        y_change = 5
    if onGround == True:
        y_change = 0


    x += x_change
    y += y_change

    gameDisplay.fill(lightblue)
    pygame.draw.rect(gameDisplay, grassgreen, [1000,600,-1000,-100])
    pygame.draw.rect(gameDisplay, black, [x,y,20,20])
    pygame.display.update()

    clock.tick(40)

pygame.quit()
quit()

【问题讨论】:

  • 一定要花一些精力来理解类。如果您要编写 Python(或实际上是大多数语言),这至关重要。它还将提高您对面向对象编程工作原理的总体理解,从而帮助您解决所有问题。
  • 至于你的实际问题,如果你在代码中y_change = -5 后面的行后面加上一个print("changed"),当你按下 w 时它会打印“changed”吗?
  • @Jake Biggs:约翰刚刚回答了你的问题。 :D

标签: python pygame


【解决方案1】:

当你按下 w 跳跃时,游戏会按预期将y_change 的值更改为-5。当事件队列被处理后,它会进入这个块:

if y <= 480:
        onGround = False
else:
    onGround = True
if onGround == False:
    y_change = 5
if onGround == True:
    y_change = 0

此时你的物理还没有被模拟,所以你的角色还在地上。换句话说,onGround 仍然是 True。因此,if onGround == True: y_change = 0 代码被执行,y_change 再次设置回 0。

发生这种情况后,您的物理模拟发生,y_change 现在为 0。这就是您的角色不跳跃的原因。您需要重新设计代码,以便游戏在检查您的角色是否在地面上时意识到您的角色开始跳跃。祝你的游戏好运!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-26
    • 2023-01-28
    相关资源
    最近更新 更多