Movement/zh: Difference between revisions
No edit summary |
Created page with "速度上限:基础为 6000 方块每游戏刻,再加上当前加速度的值,例如重力、喷气背包、爆炸推力的加速度值(实际上是速度达到上限时,加速度提供了一游戏刻超出上限的速度,在下一个游戏刻速度才会被限制回到上限值)" |
||
(18 intermediate revisions by the same user not shown) | |||
Line 35: | Line 35: | ||
** 地面转向公式:每游戏刻减少 2 个单位,直到变成10个单位的反向速度。 | ** 地面转向公式:每游戏刻减少 2 个单位,直到变成10个单位的反向速度。 | ||
** 空中转向公式:每游戏刻减少 1.5 个单位,直到变成5个单位的反向速度。 | ** 空中转向公式:每游戏刻减少 1.5 个单位,直到变成5个单位的反向速度。 | ||
* 按住左或者右(默认为{ | * 按住左或者右(默认为{{key press|A}}{{key press|D}})的情况下: | ||
** 地面加速公式:每游戏刻增加 2 个单位,速度上限为 10。 | ** 地面加速公式:每游戏刻增加 2 个单位,速度上限为 10。 | ||
** 空中加速公式:每游戏刻增加 1.5 个单位,速度上限为 5。 | ** 空中加速公式:每游戏刻增加 1.5 个单位,速度上限为 5。 | ||
Line 50: | Line 50: | ||
=== 速度上限 === | === 速度上限 === | ||
速度上限:基础为 6000 方块每游戏刻,再加上当前加速度的值,例如重力、喷气背包、爆炸推力的加速度值(实际上是速度达到上限时,加速度提供了一游戏刻超出上限的速度,在下一个游戏刻速度才会被限制回到上限值) | |||
<code>src/game/gamecore.cpp</code> (在利用速度计算玩家下一个位置前有如下代码):<syntaxhighlight lang="c++"> | <code>src/game/gamecore.cpp</code> (在利用速度计算玩家下一个位置前有如下代码):<syntaxhighlight lang="c++"> | ||
Line 59: | Line 57: | ||
</syntaxhighlight>其中内嵌了一个归一化函数重新计算了速度带来的影响,是竖直速度的瓶颈由来。而水平方向上则有一个ramp曲线因子,导致玩家在速度过快时减速或者停下。在加速时很容易看见这些现象。 | </syntaxhighlight>其中内嵌了一个归一化函数重新计算了速度带来的影响,是竖直速度的瓶颈由来。而水平方向上则有一个ramp曲线因子,导致玩家在速度过快时减速或者停下。在加速时很容易看见这些现象。 | ||
速度的精度有每游戏刻 <math>\frac{1}{256}</math> 个单位的向下舍入误差。 | |||
理论上速度超过一定值后,ramp修正因子应该让速度稳定到一个固定值。例如说想要保持最大速度为 1,在速度小于 1 时不作修正,而速度大于 1 的时候,比如说 50,则因子应该变为 1/50 ,这样一来速度就不会超过 1。 但是这样一来速度达到 257 的时候,修正因子理论上应该为 1/257,但是这个数值比单位刻度1/256要小,因此被舍入为 0,这导致实际上玩家水平速度过大时游戏表现为停下不动。 | |||
{{Todo|* convert sub-tiles/tick into tiles/sec * find max vel und real max vel (from where would a constant function fit) * find speed, where the tee stops moving * write about ramp speed, and add diagram}} | {{Todo|* convert sub-tiles/tick into tiles/sec * find max vel und real max vel (from where would a constant function fit) * find speed, where the tee stops moving * write about ramp speed, and add diagram}} | ||
< | <span id="Corner_Skimming"></span> | ||
=== | === 斜角掠过 === | ||
判定玩家处于地面或滞空的根据是玩家位置到地面的距离,而不是向下的速度。因此玩家上升过程中也可能判定为贴地,比如斜向飞行时擦到方块的角。 | |||
关于斜角掠过: | |||
* 玩家的二段跳将会刷新(在地图 [https://ddnet.org/maps/Impetuous Impetuous] 偷鸡时很好用)。 | |||
* | * 判定玩家在地面时有一小段时间可以利用地面更高的水平加速和限速(注意滞空的加速和限速比在地面小)。 | ||
* | |||
斜角掠过通常不算一种玩家会主动使用的技巧(除了地图 [https://ddnet.org/maps/Short-32-And-32-Precise-32-7/ Short and Precise 7] 等),但是在速通时可以考虑一下。 | |||
{{Todo|add gif}} | {{Todo|add gif}} | ||
< | <span id="Elevated_Jump"></span> | ||
=== | === 抬升跳 === | ||
玩家离地少许依旧能够使用地面跳,因此可以获取比平地直接跳稍微高一点的高度。 | |||
[[Category:Game-Mechanic{{#translation:}}]] | [[Category:Game-Mechanic{{#translation:}}]] |
Latest revision as of 05:44, 13 August 2023
基本移動是 Teeworlds 和 DDrace 的核心操作方式之一。
基礎信息
重力
處於默認重力下的玩家會在豎直方向 Y 軸每遊戲刻增加 0.5 的向下速度。
跳躍
地面跳躍將玩家的豎直速度設置為-13.2 單位。
空中跳躍(二段跳)將玩家的豎直速度設置為-12.0 單位。
跳躍是直接將玩家豎直速度設置為某個值,無視原有的速度。這個特性在用於取消原有的巨大速度時很有效。
水平速度變化
- 在鬆開所有按鍵的情況下:
- 地面減速公式:每遊戲刻減半
velocity.x = velocity.x * 0.5
- 空中減速公式:每遊戲刻減少 5%
velocity.x = velocity.x * 0.95
- 地面減速公式:每遊戲刻減半
- 按下速度相反的方向鍵:
- 地面轉向公式:每遊戲刻減少 2 個單位,直到變成10個單位的反向速度。
- 空中轉向公式:每遊戲刻減少 1.5 個單位,直到變成5個單位的反向速度。
- 按住左或者右(默認為AD)的情況下:
- 地面加速公式:每遊戲刻增加 2 個單位,速度上限為 10。
- 空中加速公式:每遊戲刻增加 1.5 個單位,速度上限為 5。
按住左右移動時會無視摩檫力,因此高速前進的時候摩擦減速可能比按住反方向移動鍵更多,因為按住按鍵減速是固定值,但是摩檫減速會因速度增加而增大,從而大於這個固定值。
進階特性
速度上限
速度上限:基礎為 6000 方塊每遊戲刻,再加上當前加速度的值,例如重力、噴氣背包、爆炸推力的加速度值(實際上是速度達到上限時,加速度提供了一遊戲刻超出上限的速度,在下一個遊戲刻速度才會被限制回到上限值)
src/game/gamecore.cpp
(在利用速度計算玩家下一個位置前有如下代碼):
if(length(m_Vel) > 6000)
m_Vel = normalize(m_Vel) * 6000;
其中內嵌了一個歸一化函數重新計算了速度帶來的影響,是豎直速度的瓶頸由來。而水平方向上則有一個ramp曲線因子,導致玩家在速度過快時減速或者停下。在加速時很容易看見這些現象。
速度的精度有每遊戲刻 個單位的向下捨入誤差。
理論上速度超過一定值後,ramp修正因子應該讓速度穩定到一個固定值。例如說想要保持最大速度為 1,在速度小於 1 時不作修正,而速度大於 1 的時候,比如說 50,則因子應該變為 1/50 ,這樣一來速度就不會超過 1。 但是這樣一來速度達到 257 的時候,修正因子理論上應該為 1/257,但是這個數值比單位刻度1/256要小,因此被捨入為 0,這導致實際上玩家水平速度過大時遊戲表現為停下不動。
斜角掠過
判定玩家處於地面或滯空的根據是玩家位置到地面的距離,而不是向下的速度。因此玩家上升過程中也可能判定為貼地,比如斜向飛行時擦到方塊的角。
關於斜角掠過:
- 玩家的二段跳將會刷新(在地圖 Impetuous 偷雞時很好用)。
- 判定玩家在地面時有一小段時間可以利用地面更高的水平加速和限速(注意滯空的加速和限速比在地面小)。
斜角掠過通常不算一種玩家會主動使用的技巧(除了地圖 Short and Precise 7 等),但是在速通時可以考慮一下。
抬升跳
玩家離地少許依舊能夠使用地面跳,因此可以獲取比平地直接跳稍微高一點的高度。