2013-03-13 120 views
3

我已阅读虽然处理这个AA几篇文章的组合却试图执行一些后,总是得到同样的问题,XNA处理按键

快速注:这是家庭工作

我正在使用XNA为我的游戏设计课程重新创建超级粉碎兄弟(N64风格)。 现在我有2个密切相关的问题任何熟悉SSB的人都知道组合攻击,即按“前进A”,“上B”等,我有一个目前正在工作的Yoshi,有时甚至可以让他的组合攻击,但是我发现的主要问题是,除非键在完全相同的瞬间按下即对于一个又一举措,跳将目前熄灭

我的if语句....

if (state.IsKeyDown(Keys.Up) && state.IsKeyDown(Keys.B)) 
{ 
    actionComponent.curAction.secondaryAction = SecondaryAction.Stand; 
    actionComponent.curAction.primaryAction = PrimaryAction.Up_B; 
} 
else if (state.IsKeyDown(Keys.Up) && state.IsKeyDown(Keys.A)) 
{ 
    //Console.WriteLine("This is C#"); 
    actionComponent.curAction.primaryAction = PrimaryAction.Up_A; 
    actionComponent.curAction.secondaryAction = SecondaryAction.Smash; 
    spriteComponent.curColumn = 0; 
} 
else if (state.IsKeyDown(Keys.Up)) 
{ 
    actionComponent.curAction.secondaryAction = SecondaryAction.Jump; 
    actionComponent.curAction.primaryAction = PrimaryAction.None; 
} 

我明显有更多的每一个可能的行动,但他们都安排,以便单一按键是最后一个,所以它可能注册其他人,但除非我在同一时刻他们按下它不会注册密钥前ss - 我试过的一些想法,在if语句中处理箭头键,睡一会儿线程,然后小鸡,如果箭头键和按钮即按下)

我的第二个问题,我辩论执行,但如果我这样做,SSB玩家会知道稍微向前推动一个游戏杆,然后按A会给一个快速踢/刺拳,但更难的按键(游戏杆移动更远/可能更快w/e)将创建一个粉碎移动,并想法如何我可以实现一个系统来识别轻按键和重按键之间?

回答

3

你的问题是,XNA默认为60Hz循环,所以如果你的游戏时钟速度足够快,那么你每16毫秒检查一次按键。这给你一个小窗口,在这个小窗口中可以击中两个键 - 如果两个键的间隔时间超过大约10毫秒,那么它们最终可能会在两个独立的更新循环中结束,因此会被视为单按键而不是组合键移动。由于人类的反应时间大约在150-300ms之间,因此您在人类投入中会遇到不准确的情况。

我可能会看看使用输入缓冲区;类似于KeyValuePairList。每循环一次,您都会将当前按下的按钮与当前时间一起添加到缓冲区,删除时间早于特定时间范围的任何内容,然后检查缓冲区的内容是否与任何组合移动相匹配。这允许瞬时组合以及顺序组合(例如,A, A, Left+B可以工作)。您可能需要考虑取消同时按下单个按键引发的任何移动的某种方式 - 如果您识别了组合left, jump&punch,那么您会想要以某种方式阻止它们跳跃和冲刺,而是执行组合飞行上勾拳触发。至于轻/重按键,我不认为这是可能的你想的方式 - 电脑键盘是非常简单的设备;按钮是简单的开/关单位,没有关于压力或速度的信息。你可以看看按键距离有多远 - 如果你使用上述的缓冲方式,那么你可以使用按键存储的时间来获得按键之间的时间。如果该时间长于特定时间间隔,则使用较弱或较慢的移动。

+1

一些游戏使用长度推模拟/表示轻/重型新闻。按<100 ms是“轻”,其他则是“重”。 – 2013-03-13 12:41:19

+0

这也行得通。同样,你已经获得了缓冲区,所以你可以用它来记住按钮被第一次按下时,然后当你发现它不再被按下时,你可以得到从当前时间到你的时间间隔记录在缓冲区中。实质上,这里的总体信息是“缓冲您的关键输入”。 – anaximander 2013-03-13 12:54:39

+0

谢谢,这有助于很多! – 2013-03-16 10:34:03