Questions tagged «events»

事件是通常在主程序线程“外部”发生但在其内部处理的操作。

8
游戏引擎中事件驱动的通信:是或否?
我正在阅读《游戏编码完成》,作者建议游戏对象和模块之间进行事件驱动通信。 基本上,所有在场的游戏参与者都应通过内部事件消息传递系统与关键模块(物理,AI,游戏逻辑,游戏视图等)进行通信。这意味着必须设计一个高效的事件管理器。设计不良的系统会占用CPU周期,特别是影响移动平台。 这是一种行之有效的推荐方法吗?我应该如何决定是否使用它?

3
我以及如何将输入和游戏对象的关注点分开?
在每个游戏中,开发人员都必须以某种方式处理输入,可能是简单的键盘和鼠标事件,触摸事件或加速度计输入。该输入直接间接影响游戏中的对象。有时相同的输入会影响不同的对象。现在,我一直在考虑如何对此建模。我的看法有两种不同的方法。 让游戏对象自己处理它,订阅事件并调用它自己的方法。这具有使游戏对象自己决定哪些输入导致哪个动作的优点。缺点似乎是输入代码与“核心”游戏对象代码混在一起。而且,游戏对象不知道游戏其余部分的状态,并且有时可能不应对输入事件起作用。这似乎不正确。 让一般的输入控制器负责所有输入,并决定谁来处理什么事件。这似乎可以更好地分离关注点,但是紧密地将输入控制器类与游戏对象耦合在一起。它需要以某种方式知道谁想要接收哪个事件和哪个状态。这似乎也不正确。 您正在使用什么策略来解决这个问题?

3
轮询与事件驱动的输入
我正在开发使用轮询输入法的游戏。但是,既然我正在更深入地研究游戏菜单和其他UI组件,我发现我可能想拥有事件驱动的输入。甚至可以同时使用事件驱动的UI和轮询的“世界”输入。我对最好的方式是很好奇。 我将轮询定义为:每个更新循环都检查按下了哪些键,鼠标在哪里,按下了按钮,然后遍历它们并根据收集到的信息执行操作。 我将事件驱动定义为:基于中断的事件,当事件发生并触发中断并基于该事件运行代码块时。 您是否认为最好进行所有事件驱动,全部轮询,或者两者都可以接受?如果您有两者的优缺点,请列出。谢谢。 编辑 该游戏基于Java / OpenGL,因此将发布到Windows / Mac / Linux。将其扩展到移动设备的可能性很小。游戏是RTS风格的第三人称3D。 编辑2 我对实现此方法的方式仍然不完全满意,但是我要转向的是在UI中捕获事件,如果事件未由我的任何UI组件处理,我会将事件传递给用于选择的“世界”。就像是: @Override private boolean handleEvent(Event event) { if(hud.handleEvent(event)) { return true; } return WORLD.handleEvent(event); } 这样,我不会从用户界面中泄漏点击以选择按钮后面的对象,而不是其他。 目前,我的摄像头控件仍然基于轮询,并且目前似乎可以正常使用,但稍后可能会进行更新。 我感谢所有答案,对不起,我只能选择其中一个!
19 java  input  events  polling 

12
如何确保一段代码只运行一次?
我有一些代码只想运行一次,即使触发该代码的情况可能会多次发生。 例如,当用户单击鼠标时,我要单击事物: void Update() { if(mousebuttonpressed) { ClickTheThing(); // I only want this to happen on the first click, // then never again. } } 但是,使用此代码,每当我单击鼠标时,事物都会被单击。我怎样才能使它发生一次?

3
如何避免事件计划程序的单例模式?
我想为我的游戏制作一个事件调度程序,我基本上希望能够安排一个游戏事件的触发时间。这可以是一次触发,也可以是周期性触发(触发事件“ E_BIG_EXPLOSION”每5秒钟触发一次...)。 诱人的是,这可能是使用Singleton的好地方,但是Singleton可能非常邪恶,它们容易像疾病一样传播……所以我不惜一切代价避免使用它们。 在这种情况下,您建议采用哪种设计避免单例使用?

3
管理游戏中活动的最佳方法?
我正在开发一款游戏,该游戏需要偶尔进行一些游戏内事件。一个很好的例子是教程。您开始游戏,并且在游戏中的几个点发生了一个事件: 您遇到第一个敌人,游戏暂停,并且您收到关于如何杀死它的解释。 您杀死了第一个敌人,您收到一条“好工作”消息。 您将获得一个新项目,即带有项目统计信息弹出菜单。 等等等 我正在研究的游戏是一款益智游戏,其游戏规则几乎相同,因此将所有这些事件单独编码为单独的级别似乎效率不高。 我应该以某种方式在XML等外部源中定义这些事件吗?然后编写一个解释器,以读取XML并设置级别的事件要求?我不确定如何定义一个事件,例如在杀死两个敌人时应该发生的事件。 需要明确的是,我并不是在寻找最佳的编程语言或脚本语言来执行此操作,而是在寻找最佳的处理方法。 谢谢! 编辑: 由于我的问题很难理解的第二个例子: 我遇到的问题是要以总是几乎相同的过程在游戏中添加一些额外的动作。就像RPG战斗一样,每个人都有转弯,选择技巧等-总是一样。但是,如果我想在两者之间显示过场动画,该怎么办?修改整个游戏结构,使其在包含过场动画的情况下进入经过改变的战斗等级,似乎效率很低。我想知道这通常是怎么做的。

5
键盘输入系统处理
注意:由于API限制(SFML),我必须轮询而不是回调。对于缺少“体面”的头衔,我也表示歉意。 我想我有两个问题。如何注册我收到的输入,以及如何处理。 处理输入 我在说的是您已经注册了例如已经按下“ A”键的事实,以及如何从那里开始操作。 我看过整个键盘的排列,例如: bool keyboard[256]; //And each input loop check the state of every key on the keyboard 但这似乎效率很低。例如,您不仅将键“ A”耦合到“玩家向左移动”,而且还会每秒检查30-60次每个键。 然后,我尝试了另一个仅查找所需密钥的系统。 std::map< unsigned char, Key> keyMap; //Key stores the keycode, and whether it's been pressed. Then, I declare a load of const unsigned char called 'Quit' or …

2
我会为事件处理程序疯狂吗?我的设计是否走错了路?
我想我已经决定我真的很喜欢事件处理程序。我可能会因分析瘫痪而受苦,但是我担心会使我的设计变得笨拙,或者在我的设计决策中遇到其他无法预料的后果。 我的游戏引擎目前使用平移式高架摄像机进行基本的基于Sprite的渲染。我的设计看起来像这样: 场景处理程序 包含实现SceneListener接口的类的列表(当前仅限于Sprites)。每个刻度调用一次render(),并发送onCameraUpdate(); 消息发送给SceneListeners。 InputHandler 每个刻度轮询一次输入,然后将简单的“ onKeyPressed”消息发送给InputListeners。我有一个Camera InputListener,它包含一个SceneHandler实例并触发updateCamera();。基于输入的事件。 AgentHandler 每个刻度一次在任何代理(AI)上调用默认操作,并将检查堆栈中是否有已注册的任何新事件,并根据需要将它们分配给特定的代理。 因此,我有一些基本的Sprite对象,它们可以在场景中移动并使用基本的转向行为进行移动。我已经开始进行碰撞检测了,这是我不确定我的设计方向是否正确的地方。拥有许多小型事件处理程序是一种好习惯吗?我想我必须要实现某种CollisionHandler。 我会更好地使用一个更统一的EntityHandler来处理一个类中的AI,碰撞更新和其他实体交互吗?还是只是实现许多不同的事件处理子系统就可以了,它们会根据事件类型将消息传递给彼此?我是否应该编写一个仅负责协调所有这些子事件处理程序的EntityHandler? 我意识到在某些情况下,例如我的InputHandler和SceneHandler,它们是非常特定的事件类型。我的游戏代码很大一部分都不关心输入,而很大一部分则不关心纯粹在场景渲染中发生的更新。因此,我感到孤立那些系统是合理的。但是,我要问的是专门针对游戏逻辑类型事件的问题。

4
MMO服务器的游戏日志格式
整个群集/分片的游戏事件日志(与错误/调试日志相对)对于在实时生产环境中的商业MMO非常有用,它为客户服务提供了至关重要的支持,并提供了历史分析手段。 我当前正在从事的项目使用关系数据库来存储所有游戏事件日志,尽管该方法可以正常工作,但在我看来,日志的按时间顺序排列的只读性质将允许使用更有效的存储格式。 但是,我不确定从哪里开始学习构建自定义二进制日志格式。您在创建自定义日志格式或有关该主题的任何推荐论文/文章方面有什么经验?

5
事件驱动系统中的嵌套输入
我正在使用具有事件和委托的基于事件的输入处理系统。一个例子: InputHander.AddEvent(Keys.LeftArrow, player.MoveLeft); //Very simplified code 但是,我开始怀疑如何处理“嵌套”输入。例如,在《半条命2》(或其他任何真正的Source游戏)中,您可以使用拾取物品E。拾取物品后,您不能使用射击Left Mouse,而是扔掉物体。您仍然可以跳下去Space。 (我是说嵌套输入是您按某个键的地方,可以更改的操作。不是菜单。) 这三种情况是: 能够像以前一样做同样的动作(例如跳跃) 无法执行相同的操作(例如射击) 完全执行其他操作(例如在NetHack中,按开门键表示您不移动,但选择打开门的方向) 我最初的想法是在收到输入后才进行更改: Register input 'A' to function 'Activate Secret Cloak Mode' In 'Secret Cloak Mode' function: Unregister input 'Fire' Unregister input 'Sprint' ... Register input 'Uncloak' ... 这会遭受大量的耦合,重复的代码和其他不良的设计标志。 我猜另一个选择是维护某种输入状态系统-也许是寄存器函数的另一个委托将大量的寄存器/注销重构到更干净的位置(在输入系统上具有某种堆栈)或可能是什么数组保留,不保留。 我确定这里有人一定遇到了这个问题。您如何解决的? tl; dr如何处理事件系统中另一个特定输入之后收到的特定输入?

4
游戏设计中的每帧函数调用与事件驱动消息传递
据我所知,传统的游戏设计使用多态和虚拟功能来更新游戏对象的状态。换句话说,在游戏中的每个对象上以规则的间隔(例如,每帧)调用同一组虚拟函数。 最近,我发现,还有另一个- 事件驱动的消息传递系统可用于更新游戏对象的状态。在这里,对象通常不会按帧进行更新。取而代之的是,构建了高效的事件消息传递系统,并且仅在收到有效事件消息之后才更新游戏对象。 事件驱动的游戏体系结构在Mike McShaffry编写的《Game Coding Complete》中有很好的描述。 我可以在以下问题上寻求帮助: 两种方法的优缺点是什么? 哪里比另一个更好? 事件驱动游戏设计在所有领域都通用且更好吗?因此,即使在可移植的平台中,也建议使用它吗? 哪一个更有效,哪个更难开发? 要澄清的是,我的问题不是要从游戏设计中完全消除多态性。我只是希望了解使用事件驱动消息传递与常规(每帧)调用虚拟函数以更新游戏状态的区别和好处。 示例: 这个问题在这里引起了一些争议,因此让我为您提供示例:根据MVC,游戏引擎分为三个主要部分: 应用层(硬件和操作系统通信) 游戏逻辑 游戏画面 在赛车游戏中,“游戏视图”负责以最快的速度(至少30fps)渲染屏幕。Game View也会侦听玩家的输入。现在发生这种情况: 玩家将燃油踏板踩到80% GameView构造一条消息“将Car 2油门踏板压到80%”,并将其发送给Game Logic。 Game Logic会获取消息,评估,计算新车的位置和行为,并为GameView创建以下消息:“绘制2踩下燃油2的燃油踏板”,“ 2声音加速”,“ 2坐标X,Y” .. 。 GameView接收消息并进行相应处理

2
将游戏动作同步到特定动画时间的好的技术?
因此,我在开发的游戏中遇到了一个问题,但这似乎是很多游戏中都涉及的非常基本的问题。 我的游戏要求在角色动画期间的某个特定时间点发生某些游戏功能。因此,正如标题所说,我想知道有什么好的技术和基本策略可以将与游戏相关的事件/功能/动作同步到角色动画中的特定点。 以下是我在各种类型的游戏中谈论的一些简单示例: 您的角色将他们的枪重新装在射手中。您的角色将播放他/她的“重新加载”动画,但重要的是,仅在更换弹匣并握住枪支后的确切时刻调用设置currentAmmo变量的函数。这可能是重新加载动画中间的某个时刻。 在基于回合的RPG中,您的角色站在面对一排敌人的队伍中。当被命令进攻时,您的角色之一会奔跑/跳跃到敌人中的一个,并挥舞其巨剑,然后再奔跑/跳跃回到其站立位置。您想确保在播放大幅削减动画的确切时刻损坏敌人 -在向上跑和向后跑之间的某个时间点。 在隐形游戏中,您的角色可以潜行并与世界上的计算机和按钮互动。也许有一个按钮可以关闭您正在渗透的哨所的电源。当按下动作按钮时,您的角色伸出手并按下按钮,然后返回其闲置状态。您希望在按下按钮时在“ push_button”动画中的确切位置关闭灯。 诚然,我的情况最类似于第二个示例,在该示例中,我创建了一个动画,其中基于回合的角色在攻击过程中前冲,并且我希望在动画似乎与之接触的那一刻施加损害。因为我的游戏使用回合制(想像“最终幻想”或“火焰纹章”之类的东西),所以我需要伤害/治疗/魔法/等。即使我实际上没有使用碰撞/命中框,也可以在每个角色动画的正确时间应用它。 我应该提到的是,我正在使用流行的游戏引擎来制作游戏,而现在我正在通过使用他们的动画事件来处理该事件,或者通过通知来实现接近预期结果的效果-我的角色执行了某个命令并触发了特定于命令的动画(即:“ attack_command”)和我的每个命令的动画资产必须在我的角色ExecuteCommand函数中包括一个动画事件/通知“回调”。换句话说,角色告诉攻击动画播放,然后攻击动画会在动画发生的确切时间向角色发出事件/通知回调,该事件应在造成伤害时进行。 坦白地说,这暂时有效,但是感觉有点不对劲 -就像我在这里遗漏了一部分大图!这种方法感到不对的部分原因是,它将游戏逻辑与动画资产结合在一起。如果我的动画素材资源忘记包括ExecuteCommand()事件/回调,则该命令将无法正确执行,并且需要额外的代码来检查命令动画是否在不执行命令的情况下完成。这太乱了,这意味着我的游戏对其资产有奇怪的依赖性。当然,我希望在攻击动画期间的特定时间点造成损害,但是我对在动画资源中调用游戏代码感到很奇怪。 那我在这里俯瞰什么?有什么好的通用技术可以处理这些类型的情况,您希望在动画中的特定时间发生某些重要的游戏操作? 编辑:澄清一下,这不是引擎特定的问题,我也不是在寻找引擎特定的设计/技术。我对一种通用的动画/游戏同步技术很感兴趣,而无论使用哪种技术,这些技术都可能会在您的游戏项目中使用。

5
将棋盘游戏理念转变为基于浏览器的慢节奏游戏
假设我要创建一个战略游戏,让所有玩家共享全局可变状态(请考虑游戏板)。但是与棋盘游戏不同,我不希望它是实时动作和/或回合制。相反,玩家应该能够在一天中的任何时间登录,并根据需要每天花费固定数量的动作点。与数小时相反,游戏会话将持续数周。 这是为了奖励良好的策略,而不是花在玩游戏上的时间(作为替代,铁杆玩家可以始终并行玩多个游戏),以及与实时游戏有关的所有问题,例如断开连接和同步。对于休闲玩家而言,该游戏应保持令人上瘾的状态,并且其投资时间仍然很短。 到目前为止,一切都还不错,但这仍然留下了何时解决问题以及何时可见的问题。我想避免“忍者游戏”,例如在重置每日分数前几分钟进行所有动作,以使其他玩家感到惊讶,或者人们向F5发送垃圾邮件以进行适时的动作,从而击败非真实玩家的整个动作。时间游戏。 我想到了几种方法: 解决一个每天运行一次的预定过程中的所有事件。这基本上意味着“盲”游戏,玩家可以采取行动,但不会立即看到结果。关键是,几年前我玩过类似的浏览器游戏,但直到出现了死神告诉你在那段时间内真正发生的事情之前,我才不喜欢自己感到与世隔绝和无能为力的事实。您会看到世界在一天之内以极大的增量进化,这似乎根本不像它在进化一样。 对于对游戏或其他玩家有重大影响的动作(攻击,成就很大),请将其立即显示给所有人,但将其效果延迟24小时左右。发生此类事件时,可能会通知对立的玩家,以便他们做出反应。 您还有其他想法可以解决这个问题吗?在类似的现有游戏中是否存在任何已知方法?

4
我应该使用什么技术来促进XNA GameComponents之间(或游戏中任何类型的组件之间)的通信?
我从第一个“适当的”游戏项目开始,并且不可避免地遇到障碍,试图决定XNA中的游戏组件应该如何通信。 从以前的(Java)GUI编程事件来看,处理程序和侦听器似乎是前进的道路。因此,我将拥有某种类型的事件总线,该事件总线可以接受事件注册,并可以订阅这些事件的类,并由处理程序来处理它们。例如(伪代码): class SpriteManager Update(){ if(player.collidesWith(enemy) // create new 'PlayerCollisionEvent' } class HUDManager onPlayerCollisionEvent(){ // Update the HUD (reduce lives etc) } 但是,我不确定完全完成此操作所需的代码设置(在C#中)。是什么跟踪事件(某种公共汽车?),它的结构如何? 在游戏服务上似乎也有很多提及,您可以在Game.cs主类中注册一个GameComponent,然后从引用了主要“ Game”对象的代码中的任何位置获取它。我已经使用SpriteBatch对象尝试了此操作,这看起来非常简单..但是,我看不到它像事件模型那样灵活。 以敌人死亡时为例。我们要更新游戏分数。使用服务,我可以获得对在Game1中创建并作为服务添加的StateManager对象的引用,然后将“得分”设置为新值。我认为“ onEnemyDeath”事件可以由多个类以不同的方式处理,但是由相关“敌人死亡检测”部分中的一行代码启动,比单独转换每个必需的GameComponent然后调用任何东西更好。方法是必需的。 还是这些次等策略比其他策略好? 我意识到这和游戏通信范例一样,在一定程度上是我对C#的不充分了解,但是我真的很想弄清楚这一基本知识。 更新资料 看过服务时,我不太相信它的细节-它基本上是在传递一个全局变量(据我了解)。 更新2 看过有关事件处理和测试示例代码的基础教程之后,看来事件将是我所讨论的逻辑选择。但我在所看到的示例中使用的却很少。有一些明显的原因为什么不应该这样做?

4
设计事件管理器系统时应考虑什么?
我一直在研究Java游戏引擎的基础知识,并且已经准备好添加到Event Manager系统中。 从理论上讲,我知道事件管理器应该做什么:允许对象为某些事件“注册”,并且每当事件管理器收到事件通知时,就将事件广播给“注册”的侦听器。我感到很困惑的是如何开始实施它。 我无法从网上找到任何有关从头开始实施事件系统的信息,因此我正在寻找有关这种情况下最佳实践的信息-我应该和不应该做什么做应该做的事情。 例如,我的每个游戏对象是否真的都必须有一个EventManager字段?由于我所有的游戏对象都继承自一个抽象的父类,因此我认为我应该能够使用静态引用,以便在所有游戏对象之间共享一个事件管理器实例。我已经使用Applet进行了类似的操作,以用于渲染每个对象。 我想我必须为每个可能的订阅事件维护某种类型的集合-根据需要在列表中添加和删除游戏对象。我认为应该使需要广播的事件队列成为可能,在这种情况下,我可以简单地在主游戏循环中添加“ EventManager.Update()”,并让该Update()方法广播最后发生的事件每帧。最后,每个对象都有一个HandleEvent(Event e)方法,然后可以对其进行适当地解析和响应。 这听起来像是实现此类系统的正确方向,还是我偏离了正常轨道和/或缺少了一些显而易见的东西?
9 events 

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.