我正在使用MonoGame制作基于图块的图形roguelike游戏,并且在处理输入时玩家移动得太快。通过单独的单独按键移动播放器不会使应用程序非常有趣。
我怎样才能在游戏循环之间添加一些时间?使用{
"hotkeySets": {
"Player 1": {
"chatOff": [{
"actionsetting": {
"action": "Togglelist"
},
"keysequence": "Ctrl+B"
}, {
"actionsetting": {
"action": "Copy"
},
"keysequence": "Ctrl+C"
}, {
"actionsetting": {
"useObject": 3308,
"useType": "SelectUseTarget"
},
"keysequence": "F10"
}],
"chatOn": [{
"actionsetting": {
"action": "Select All"
},
"keysequence": "Ctrl+A"
}, {
"actionsetting": {
"chatText": "heal friend",
"sendAutomatically": true
},
"keysequence": "Ctrl+F1"
}, {
"actionsetting": {
"action": "Copy"
},
"keysequence": "Ctrl+C"
}]
},
"Player 2": {
"chatOff": [{
"actionsetting": {
"action": "ToggleBattlelist"
},
"keysequence": "Ctrl+B"
}, {
"actionsetting": {
"action": "Copy"
},
"keysequence": "Ctrl+C"
}]
}
}
}
时,整个程序会卡住,并且无法处理任何输入。
答案 0 :(得分:1)
通常的方法是以“每秒单位”来定义所有内容的速度。因此,播放器将以每秒64像素(或您选择的任何速度)的速度移动。每个帧,MonoGame将调用Update
,并传入GameTime
实例,其中包含自上一帧以来经过的时间量。您想要做的是将移动速率乘以GameTime.ElapsedGameTime.TotalSeconds
。因此,如果从最后一帧开始经过3/4秒,您将64 * .75
获得48
,这是您按住按钮时应移动角色的像素数。< / p>
如果按照“每秒单位”定义所有内容,无论帧速率有多快或多慢,都可以轻松保持速度一致。这适用于移动速度(像素/米/秒),转向速率(每秒度数),健康再生(每秒hp)等.MonoGame可以轻松完成此操作,因为所有基本单元类,如{{ 1}}和Vector2
,为了这个目的,让它们的乘法运算符重载。
答案 1 :(得分:0)
极其简单的解决方案是降低MonoGame默认的固定更新速率。这会使您的输入响应性降低,但通常是不合需要的。
更好的解决方案是计算自上次更新以来经过的时间并相应地调整您的动作。这还有一个额外的好处,就是可以让更多的功能更容易,加速,例如给你的对象增加一些重量,然后可以作为速度的积分添加,或者你的帧率可以扩展,而不必缓冲最后一帧和推断中间位置
答案 2 :(得分:0)
这是我最终决定做的事情。
我将游戏对象分成组件,其中一个叫做Movement。由于移动是基于图块的,我无法使用速度或向量或类似的东西。
代码简化了,我没有在这里包含所有内容。
public class Movement
{
// define a movement interval and store the elapsed time between moves
private double interval, elapsedTime;
public Movement(double interval)
{
this.interval = interval;
}
// called when arrow keys are pressed (player)
public void Move(Direction dir)
{
if(elapsedTime > interval)
{
// move
}
}
// called once per frame from the main class Update method
public void Update(GameTime gameTime)
{
if(elapsedTime > interval)
elapsedTime -= interval;
// add milliseconds elapsed during the frame to elapsedTime
elapsedTime += gameTime.ElapsedGameTime.TotalMilliseconds;
}
}
public enum Direction
{
LEFT,
RIGHT,
UP,
DOWN
}