我创建了一个代码来让我的游戏角色跳跃。我想把这个跳跃功能输入到我的游戏中。
为了使代码不限于特定坐标,我将
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
坐标而不在函数过程中发生更改。
我不确定你的设计是否有效。无需跟踪原始位置。跳跃通常是这样实现的:
vy
但 dy
也适用于“y 方向”)。通常,在大多数实时应用程序中,永远不应在主更新循环之外对实体位置进行更改。这可以避免奇怪的操作系统特定的重新触发行为。
确保使用
ontimer
而不是 while True:
来运行循环,以便它从一台机器到另一台机器稳定。
这是概念的快速证明:
from turtle import Screen, Turtle
def jump_pressed():
global space_pressed
space_pressed = True
def jump_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(-max_velocity, min(max_velocity, vy))
if player.ycor() <= ground:
player.sety(ground)
vy = 0
player.sety(player.ycor() + vy)
screen.update()
screen.ontimer(tick, 1000 // 30)
vx = 0
vy = 0
ground = -100
max_velocity = 25
jump_velocity = 50
gravity = 2
screen = Screen()
screen.tracer(0)
space_pressed = False
screen.onkeypress(jump_pressed, "space")
screen.onkeyrelease(jump_released, "space")
screen.listen()
player = Turtle()
player.penup()
player.turtlesize(2, 2)
player.shape("square")
tick()
screen.exitonclick()
我建议改进这一点,以避免随着程序的增长而出现松散的全局变量。