如何让乌龟在游戏中跳跃?

问题描述 投票:0回答:1

我创建了一个代码来让我的游戏角色跳跃。我想把这个跳跃功能输入到我的游戏中。

为了使代码不限于特定坐标,我将

o
定义为变量,以在跳转之前保存原始
y
坐标。在我的游戏中,我将处于多个不同的
y
坐标,但如果我在外部定义它,我将只能再次在固定位置跳跃。我该如何解决这个问题?

import turtle

dx = 1
dy = 1.8
mdy = -1.6

img = r"C:\Users\user\Desktop\python\pg\dragon.gif"
turtle.register_shape(img)

scrn = turtle.Screen()
scrn.tracer(0)

player = turtle.Turtle()
player.penup()
player.shape(img)
player.speed(10)
player.goto(100,-142)
scrn.update()

o=player.ycor() #original y coordinate

def jump():
    global dy
    ycor = player.ycor()
    if ycor > o:
        player.sety(ycor + dy)

    if ycor > o+100:
        dy = mdy
    else:
        pass

def jump_handler():
    if player.ycor() <= o+0.1:
        global dy
        dy = 1.8
        player.sety(o+0.1)
        
    else:
        pass

# Set up the event handler for the jump
scrn.listen()
scrn.onkey(jump_handler, "space")

while True:
    scrn.update()
    jump()

我尝试将其放入函数中,但这不起作用,而且在 while 循环中也不起作用。我不确定如何将其保持为原始

y
坐标而不在函数过程中发生更改。

python game-development turtle-graphics python-turtle
1个回答
0
投票

我不确定你的设计是否有效。无需跟踪原始位置。跳跃通常是这样实现的:

  • 保留 y 轴的速度变量(我更喜欢
    vy
    dy
    “方向 y”也可以)。
  • 在每一帧上,从玩家的速度中减去一小部分重力。
  • 在每一帧上,如果玩家有按下空间,则添加较大的向上速度。 (可选)确保玩家在跳跃之前接触地面或平台。
  • 限制速度以避免它们下落得太快。

通常,在大多数实时应用程序中,永远不应在主更新循环之外对实体位置进行更改。这可以避免奇怪的操作系统特定的重新触发行为。

确保使用

ontimer
而不是
while True:
来运行循环,以便它从一台机器到另一台机器稳定。 (最好整合增量时间,但为了简单起见,我省略了它)。

这是概念的快速证明:

from turtle import Screen, Turtle


def on_space_pressed():
    global space_pressed
    space_pressed = True


def on_space_released():
    global space_pressed
    space_pressed = False


def tick():
    global vy

    if space_pressed and player.ycor() <= ground:
        vy += jump_velocity
        player.sety(player.ycor() + 1)

    vy -= gravity
    vy = max(min_velocity, vy)
    player.sety(player.ycor() + vy)

    if player.ycor() <= ground:
        player.sety(ground)
        vy = 0

    screen.update()
    screen.ontimer(tick, 1000 // 60)


vx = 0
vy = 0
ground = -100
min_velocity = -25
jump_velocity = 25
gravity = 1

screen = Screen()
screen.tracer(0)

space_pressed = False
screen.onkeypress(on_space_pressed, "space")
screen.onkeyrelease(on_space_released, "space")
screen.listen()

player = Turtle()
player.penup()
player.turtlesize(2, 2)
player.shape("square")

tick()
screen.exitonclick()

当程序增长时,需要进行大量改进,例如避免松散的全局变量(将它们移动到

Player
类中)。在任何重要的应用程序中避免使用
global
关键字非常重要。

© www.soinside.com 2019 - 2024. All rights reserved.