3.6 跳跃

跳跃是角色移动的一个大问题。失败的跳跃结果会导致很严重的影响。

3.6.1 跳跃点(Jump Points)

跳跃点是一种最容易支持的跳跃设计,它由关卡设计者在关卡中标记,包含坐标和跳跃需要的最小速度信息。效果如下图所示:

这里写图片描述

这种情况不考虑角色需要努力使用一个刚好的方向。跳跃的角色应该能够被允许以任何速度(超过最低速度)并且在大致正确方向上跳跃(the character should be allowed to have any velocity with a sufficiently large component in the correct direction)。如下图示:

这里写图片描述

然而在下边的情况下,以相同的策略会导致灾难:

这里写图片描述

为了实现跳跃,角色可以使用一个速度匹配的转向行为来执行,在他跳跃前的一段时间,移动的目标是跳跃点,匹配的速度是跳跃点提供的速度。当角色到达跳跃点时,跳跃行为被执行,角色变成飞行。

就像之前提到的一些灾难情况,跳跃点无法提供当前跳跃的足够信息,当着陆地点很狭窄时,就会出现问题,这就需要关卡设计者来避免出现这种情况。

3.6.2 着陆点(Landing Pads)

着陆点是跳跃点的目标区域,在角色起跳之前,增加一个额外的步骤,通过类似轨道预测的算法,计算出角色从起跳点到着陆点需要的速度。

轨道计算

起跳的轨道计算和之前提到过的火炮方案有些轻微差别。在当前的情况下,我们知道起始点S,结束点E,重力g和起跳时的y速度Vy。我们不知道的事整个过程的时间t或者起跳的x和z速度。我们可以得到三个公式:

Ex=Sx+vxt

Ey=Sx+vyt+12gyt2

Ez=Sz+vzt

可以计算出对应的结果:

t=vy±2g(EySy)+vy2g

vx=ExSxt

vz=EzSzt

对于跳跃时间t,有两个可能的结果,我们希望以更快的时间完成,使用更小的值,如果我们跳跃速度无法达到时,就使用更大的那个时间t。

为了实现跳跃,需要实现一个从起跳点到着陆点的转向行为。这个行为必须独立于其他的转向行为并且完全控制角色,如果结合其他行为,通常会变成一个失败的跳跃。

实现代码如下:

class Jump(VelocityMatch):
    jumpPoint
    canAchieve = False
    maxSpeed
    maxYVelocity

    def getSteering():
        if not target:
            target = calculateTarget()

        if not canAchieve:
            return new SteeringOutput()

        # character继承于VelocityMatch基类
        if character.position.near(target.position) and
            character.velocity.near(target.velocity):
            # 进行跳跃
            scheduleJumpAction()
            return new SteeringOutput()

        return VelocityMatch.getSteering()

    def calculateTarget():
        target = new Kinematic()
        target.position = jumpPoint.jumpLocation

        # 计算第一个跳跃时间
        sqrtTerm = sqrt(2*gravity.y*jumpPoint.deltaPosition.y + maxYVelocity*maxYVelocity)
        time = (maxYVelocity - sqrtTerm) / gravity.y

        if not checkJumpTime(time):
            time = (maxYVelocity + sqrtTerm) / gravity.y
            checkJumpTime(time)

    def checkJumpTime(time):
        vx = jumpPoint.deltePosition.x / time
        vz = jumpPoint.deltaPosition.z / time
        speedSq = vx*vx + vy*vy

        canAchieve = false
        if speedSq < maxSpeed *maxSpeed:
            target.velocity.x = vx
            target.velocity.z = vz
            canAchieve = true

        return canAchieve

数据结构和接口:

struct JumpPoint:
    jumpLocation
    landingLocation
    deltaPosition

scheduleJumpAction函数强制对象在空中 ,他可以排定一个行为到一个顺序行为队列(第五章详细介绍),或者他只是把需要的速度指定到角色上。

相对于将起跳点作为一个对象,很多开发者将它包含在他们的寻路框架中。第四章中讨论寻路。作为一个寻路系统,我们创建一个游戏的位置网络,这些连接存储了各个位置的连接信息(通常是连接点的距离)。我们可以将跳跃信息加入这些连接中。

3.6.3 孔填充(Hole Fillers)

一些开发者允许角色自己选择他们的起跳点。关卡设计者用一个不可见的对象填充孔洞,作为一个可跳跃的缺口。

角色正常的移动,但是有一个特殊的碰撞避免的变量(我们称之为跳跃探测器)。这个行为对待可跳跃缺口的碰撞,不会躲避,而是全速朝向缺口在抵达碰撞点时执行跳跃行为。

这种方式有很强的灵活性,角色不再限制在一组的跳跃点。然而由于并没有着陆区和目标速度的概念,仍然可能导致一些跳跃失败的情况。在使用这种方式的时候,需要尽量保证关卡设计不会导致这样的情况发生,空洞有足够的跳跃缺口和着陆空间。

<think>好的,用户想了解如何使用Python编写涂鸦跳跃的代码。首先,我需要确定涂鸦跳跃是什么。涂鸦跳跃应该是一款类似于“Doodle Jump”的游戏,玩家控制一个角色在不断上升的平台间跳跃,避免掉落。 接下来,我需要考虑用户的需求。他们可能是一个刚学Python的人,想通过项目练习编程。所以,我应该提供一个简单的实现,使用常见的库如Pygame,并解释关键部分,如游戏循环、角色移动、平台生成和碰撞检测。 用户可能需要代码示例和分步说明。我要确保代码结构清晰,注释详细,方便他们理解。同时,考虑到他们可能遇到的常见问题,比如如何检测跳跃、生成随机平台,以及处理游戏结束的条件。 可能还需要提到如何安装Pygame库,因为新手可能不熟悉如何配置环境。此外,应该指出代码可能需要调整参数来优化游戏体验,比如重力、跳跃力等,这有助于用户自行实验和改进。 需要检查是否有遗漏的部分,比如角色动画、音效或得分系统,但作为基础示例,这些可能不是必需的。重点放在核心机制上,保持代码简洁,避免复杂的功能让用户感到困惑。 最后,确保语言简洁明了,用中文解释每个部分的功能,帮助他们理解代码逻辑,并鼓励他们修改和扩展代码,以增强学习效果。</think>以下是一个使用 Python 和 Pygame 实现的简单版涂鸦跳跃(Doodle Jump)代码示例,包含基础跳跃和平台生成机制: ```python import pygame import random # 初始化 Pygame pygame.init() # 窗口设置 WIDTH = 400 HEIGHT = 600 screen = pygame.display.set_mode((WIDTH, HEIGHT)) pygame.display.set_caption("涂鸦跳跃") # 颜色定义 WHITE = (255, 255, 255) BLUE = (0, 0, 255) RED = (255, 0, 0) # 玩家属性 player_size = 30 player_x = WIDTH // 2 - player_size // 2 player_y = HEIGHT - 100 player_speed = 5 jump_power = -15 gravity = 0.8 vertical_speed = 0 # 平台属性 platforms = [[WIDTH//2, HEIGHT-50, 70, 15]] scroll_threshold = 200 # 滚动阈值 def create_platform(): return [ random.randint(0, WIDTH-70), platforms[-1][1] - random.randint(50, 100), 70, 15 ] # 游戏循环 running = True clock = pygame.time.Clock() while running: screen.fill(WHITE) # 事件处理 for event in pygame.event.get(): if event.type == pygame.QUIT: running = False # 玩家移动 keys = pygame.key.get_pressed() if keys[pygame.K_a]: player_x -= player_speed if keys[pygame.K_d]: player_x += player_speed # 应用重力 vertical_speed += gravity player_y += vertical_speed # 边界检测 if player_x < 0: player_x = WIDTH elif player_x > WIDTH: player_x = 0 # 平台碰撞检测 player_rect = pygame.Rect(player_x, player_y, player_size, player_size) for platform in platforms: plat_rect = pygame.Rect(platform[0], platform[1], platform[2], platform[3]) if player_rect.colliderect(plat_rect) and vertical_speed > 0: vertical_speed = jump_power # 生成新平台 while platforms[-1][1] > 0: platforms.append(create_platform()) # 屏幕滚动 if player_y < scroll_threshold: player_y = scroll_threshold for plat in platforms: plat[1] -= vertical_speed # 删除多余平台 platforms = [plat for plat in platforms if plat[1] < HEIGHT] # 绘制元素 for platform in platforms: pygame.draw.rect(screen, BLUE, platform) pygame.draw.rect(screen, RED, (player_x, player_y, player_size, player_size)) # 游戏结束检测 if player_y > HEIGHT: running = False pygame.display.update() clock.tick(60) pygame.quit() ``` **代码说明:** 1. **基础框架:** - 使用 Pygame 创建游戏窗口 - 设置游戏主循环和时钟控制 2. **玩家控制:** - WASD 控制左右移动(A左移,D右移) - 实现屏幕左右边缘的循环穿越 3. **物理系统:** - 重力模拟 (`gravity` 变量) - 跳跃机制 (`jump_power`) - 速度计算 (`vertical_speed`) 4. **平台系统:** - 随机生成平台(`create_platform()` 函数) - 自动滚动屏幕机制 - 碰撞检测(使用 Pygame 的矩形碰撞检测) 5. **游戏流程:** - 当玩家掉落到底部时游戏结束 - 平台持续生成和回收机制 **运行要求:** 1. 需要安装 Pygame 库: ```bash pip install pygame ``` 2. 建议使用 Python 3.6+ 版本 **扩展建议:** - 添加分数系统(根据高度计分) - 增加不同类型的平台(移动平台、易碎平台) - 加入怪物和道具系统 - 添加角色动画和音效 - 实现高分保存功能 这个基础版本实现了涂鸦跳跃的核心机制,你可以通过调整参数(如重力值、跳跃力度、平台间距等)来改变游戏体验。可以通过添加更多功能模块来逐步完善游戏内容。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值