如何在游戏中编写时间停止或项目符号时间?


11

我正在XNA 4.0中开发单人RPG平台游戏。我想添加一种使时间“停止”或放慢速度的功能,并且仅使玩家角色以原始速度移动(类似于《博德之门》系列中的“时间停止”法术)。我不是在寻找确切的实现,而是一些一般的想法和设计模式。

编辑: 谢谢大家的巨大投入。我想出了以下解决方案

    public void Update(GameTime gameTime)
        {

            GameTime newGameTime = new GameTime(gameTime.TotalGameTime,
 new TimeSpan(gameTime.ElapsedGameTime.Ticks / DESIRED_TIME_MODIFIER));
            gameTime = newGameTime;

或类似的东西。这样,我可以为播放器组件设置不同的时间,而为其余组件设置不同的时间。当然,对于像这样的翘曲时间将是关键因素的游戏来说,它还不够通用。但是我希望它能在这种情况下起作用。我有点不喜欢它会乱扔主Update循环这一事实,但是它无疑是实现它的最简单方法。我想这与tesselode建议的基本相同,所以我要给他绿色的勾号:)

Answers:


8

这可能是一个不好的解决方案,但不一定。如果您使用的是增量时间,则可以更改该时间以更改某些事物的速度。

例如:

player.update(dt)
dt = dt * .5 --half speed
enemy.update(dt)

当然,只有当您知道何时更新敌人而不是其他东西时,这才起作用。您还可以给所有速度值,然后执行以下操作:

x = x + xspeed * dt * speed

第一部分很
合理

2
只需给每个移动速度变量的对象更改即可,然后进行转换(例如x转换)时,将幅度乘以速度变量。
tesselode 2012年

现在有意义。:)
AturSams 2012年

第二个想法听起来...关闭。仅通过“速度”因子缩放运动可能适用于物理驱动的对象,但是AI能够以正常速度做出反应,而仅减慢/削弱了它们的运动。

您是什么意思,AI能够以正常速度做出反应?AI将具有哪些无法应用速度变量的代码?
tesselode 2012年

3

使用增量时间(自上一帧以来经过的毫秒数)可能不足以使敌人减速。诸如攻击率之类的事情可能会根据上次攻击时间来实现。虽然它是基于时间的,但是会减慢动作速度,但是会忽略降低攻击速度,施法和其他效果(生命恢复,法术效果持续时间)等。

如果要减慢单个玩家游戏中的大量游戏元素,则可以为每个生物创建第二个内部时钟,该时钟在该生物出现时的当前时间开始。当施放慢速咒语时,每帧,时钟将实际经过的时间增加x%。然后,所有怪物的行为都取决于它的内部时钟。如果各种怪物都对慢速有抵抗力,他们可以使用自己的时钟,基本上它是整数,不需要大量空间或计算。

当慢速效果停止时,时钟仍在使用,并按实际经过的时间增加100%。

这也可以用于急速法术。

@Sidar:我看到两种选择,

  1. 每个生物的内部时钟。为了确定该生物是否准备好再次攻击:保存上次使用每次攻击的时间+充电时间,并检查内部时钟是否已通过该时间。

  2. 每次攻击一个计时器:您知道攻击需要多长时间才能充电,您只需设置一个计时器并减去每回合经过*(1-slowdown%)的时间即可。

我个人比较喜欢避免减去多个单独的计时器和一个用户的内部时钟,以节省处理时间和复杂性。

这实际上取决于首选项(不会对性能产生太大影响)。


不需要内部时钟。它只是归结为一个乘数,您可以(以某种方式)链接到您的对象,该对象可以增加或减少dt(增量时间)的乘积。您可以按组或以任何方式管理对象。我认为您的方式可能有点过分。但是,嘿,如果它起作用了……那么它起作用了。
Sidar 2012年

@Sidar如果避免这种情况,则每次攻击可能需要一个时钟来确定攻击补给时间,法术持续时间等。至少通过这种方式,您只需要更新一个时钟,并只需保留“上一次激活”时间即可重置属性。
AturSams 2012年

但是,他的问题是关于除玩家之外的环境的减慢。对我来说,这听起来像是将dt与小于1的数字相乘的最简单形式,同时保持播放器的原样。
2012年

好吧,放慢环境包括放慢其攻击速度以及其他能力(因为它是RPG),因此可能会有各种依赖补给时间的暴民能力。治疗,增强,减益,咒语等。更不用说激活时间了。
AturSams 2012年

2

您可以从一个简单的解决方案开始,如tesselode或Beast先生公开的解决方案。但是,如果你开始混合复杂的事情,即子弹时间,而放缓的法术施放,你会被卡住。

我建议您实现一个时钟层次结构

.
├── Main clock
│   └── UI clock
│   └── 3D clock
│       ├── GFX clock
│       └── Gameplay clock
│           └── Slowdown spell clock 01
│           └── Slowdown spell clock 02

游戏中的所有内容都应使用一个时钟的增量时间:图形效果在GFX时钟上运行,AI和动画在游戏时钟上运行,受减速法术影响的生物在临时的减速法术时钟上运行,等等。会影响层次结构的不同部分:减速咒语会创建并影响自定义时钟,而子弹时间会影响整个3D时钟层次结构。


谢谢,这是一个重要的见解。但是,我认为我会保持简单,因为在我的特定情况下,多个减速效果会同时发生是没有意义的。
大卫·米勒

1

您只需要两个不同的时钟而不是一个,一个用于游戏的时间,另一个用于“真实”时间。

currentGameTime = 0;
gameSpeed = 1.0f;
[...]
currentApplicationTime = GetTime():
timeDelta = (currentApplicationTime - lastApplicationTime)*gameSpeed;
currentGameTime += timeDelta;
lastApplicationTime = currentApplicationTime;

然后,您可以简单地更改gameSpeed来加快(> 1)或放慢时间(<1)。要让玩家以不同的速度移动,只需检查一下时间是否变慢即可。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.