首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >基于XNA平铺的移动

基于XNA平铺的移动
EN

Stack Overflow用户
提问于 2011-03-06 03:10:10
回答 2查看 3.3K关注 0票数 1

我正在尝试用XNA制作一个基于2D瓦片的自上而下的游戏。它是16x16瓦片,每个瓦片是25像素。

我有一个从(0,0)第一个磁贴开始的字符子画面,我正试着用键盘将它从磁贴移动到磁贴。因此,在Update方法中,当按下箭头键时,我尝试向x或y添加或减去25的位置向量。它在移动时似乎是在瓷砖上对齐的,但它移动的是4-5个瓷砖,而不是一次只移动一个瓷砖。我尝试过将其与gameTime.TotalGameTime.TotalSeconds相乘,但似乎无济于事。

我对使用XNA还是个新手。有没有人有任何教程或可以帮助如何计算运动?提前谢谢。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-03-06 22:16:29

如果你只是检查每一帧的IsKeyDown,它会说它在每一帧都被按下了。在每秒60帧的速度下,按下一个关键点将导致它在几个帧中处于按下状态。因此,在每一帧中你都在移动你的角色!等你松开钥匙的时候,他已经移动了好几个方块了。

如果你想检测每个按键(进入“按下”状态的按键),你需要这样的东西:

代码语言:javascript
复制
KeyboardState keyboardState, lastKeyboardState;

bool KeyPressed(Keys key)
{
    return keyboardState.IsKeyDown(key) && lastKeyboardState.IsKeyUp(key);
}

override void Update(GameTime gameTime)
{
    lastKeyboardState = keyboardState;
    keyboardState = Keyboard.GetState();

    if(KeyPressed(Keys.Right)) { /* do stuff... */ }
}

然而,如果你想在按住按键的时候添加“重复”效果(就像打字时发生的那样),你需要计算时间-类似于:

代码语言:javascript
复制
float keyRepeatTime;
const float keyRepeatDelay = 0.5f; // repeat rate

override void Update(GameTime gameTime)
{
    lastKeyboardState = keyboardState;
    keyboardState = Keyboard.GetState();

    float seconds = (float)gameTime.ElapsedGameTime.TotalSeconds;

    if(keyboardState.IsKeyDown(Keys.Right))
    {
        if(lastKeyboardState.IsKeyUp(Keys.Right) || keyRepeatTime < 0)
        {
            keyRepeatTime = keyRepeatDelay;

            // do stuff...
        }
        else
            keyRepeatTime -= seconds;
    }
}
票数 8
EN

Stack Overflow用户

发布于 2011-11-18 16:17:12

当您使用IsKeyDown时,您不必使用计时器。

代码语言:javascript
复制
public void HandleInput(KeyboardState keyState)
{
   if (keyState.IsKeyDown(Keys.Left))
   {
      //go left...
   }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5206132

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档