我如何使用海龟正确地概括这段代码?

问题描述 投票: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
投票

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

  • 保持速度变量(我更喜欢
    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()

我建议改进这一点,以避免随着程序的增长而出现松散的全局变量。

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