首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >推还是拉?将按键转换为游戏中车辆的速度

推还是拉?将按键转换为游戏中车辆的速度
EN

Stack Overflow用户
提问于 2008-09-28 16:58:26
回答 5查看 550关注 0票数 4

当它们被按下时,我应该将按键推到车辆上,还是车辆应该从发动机中拉出按下的键?

我有一个vehicle对象,它有位置、速度和加速成员(以及其他成员)和一个update方法,在这个方法中,它根据速度更新它的位置,并根据它的加速更新它的vevlocity。

我有一个包含游戏循环的游戏对象,它调用车辆上的update方法。

如果玩家使用箭头键控制车辆,是否应该通过按键设置加速(推)和释放键来清除速度,或者车辆是否应该询问游戏引擎是否按下了加速键(拉)?我认为push意味着键盘控制模块需要了解车辆,而pull则意味着车辆需要了解特定的键盘控制。

我认为一个相关的问题应该是:是否所有对象都应该知道所有其他对象,或者应该有一个严格的层次结构,以便对象可以向树上的其他对象询问/告诉事情,但不能向下(或反之亦然)?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2008-09-28 17:04:14

您应该尝试遵循Subscribing/Observer模式。您将所有的键捕获代码放入一个singleton InputManager中,然后每个需要响应的对象都会向管理器注册。

管理器保存已订阅对象的列表,并在按下/按下键时向它们发送事件。当对象被删除或“失去焦点”时,不要忘记取消订阅。

这避免了轮询问题。极少有需要轮询解决方案的例外情况。

票数 8
EN

Stack Overflow用户

发布于 2008-09-29 13:21:37

IMO,你的车不应该知道任何关于键盘、鼠标或游戏手柄的东西。你的输入处理代码也不应该知道任何关于你的车辆的信息。输入处理代码应该读取每个玩家的输入,并将其转换为特定于其上下文的某种指令。例如,如果玩家1正在驾驶一辆汽车,他的指令可能包括方向盘旋转、加速度和刹车值。而驾驶飞机的玩家可能需要俯仰、偏航等。

通过将gamepad输入(或其他)转换为适当的指令类型,您可以将输入机制与游戏逻辑解耦。使用这种级别的解耦可能做的一件事是从网络输入创建一个"CarInstruction“。

票数 2
EN

Stack Overflow用户

发布于 2008-09-28 17:06:40

如果对游戏引擎的工作原理没有更深入的了解,回答这个问题是很困难的。话虽如此,我还是要试一试。在我看来,“按下键盘”的方法读起来像是一种“事件”或“回调”策略。您可以在某个地方定义一个类似于def handle_key_event(name_of_key):的函数,每当发生键事件时都会调用该函数。这样做的好处是,从可读性的角度来看,您可以确切地知道关键事件正在被处理的位置。缺点是,每次按键都需要被视为原子操作。如果您需要在其他键的状态上保留大量状态变量,以确定在每次按下时要执行哪些操作,这可能会变得有点混乱。

另一方面,如果您按下按键,则会在捕获按键时引入固有的延迟。你不会比你的tickrate/framerate更快地捕捉到关键事件。如果你的游戏运行得又快又好,这是很好的,但是你不想让UI在你的帧速率变慢的时候变得跳跃/滞后。

我想,这只是一个发人深省的问题。最重要的是,选择一个策略并坚持下去。例如,如果键盘事件是一个回调,那么不要对鼠标事件使用“拉”方法。在这里,一致性比正确性更重要。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/146250

复制
相关文章

相似问题

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