Articles of 游戏循环

LUA – 跟踪数字卡交易游戏的游戏状态

我正在建立一个纸牌游戏。 我们假设它和Magic the Gathering,Hearthstone等类似 我想弄清楚的问题是如何构建“光环”和每张卡所造成的伤害。 现在我有一个卡组,我存储卡数据如下。 我已经制定了将存在的卡types的名称。 M.card = {} — Minion cards have health and damage M.card[1].name = "Minion" M.card[1].hp = 1 M.deck[1].dmg = 1 — Super Minions have more health and damage M.card[2].name = "Super Minion" M.card[2].hp = 4 M.card[2].dmg = 4 — Spell cards have no health and damage. Instead they affect […]

内插旋转的对象

我终于有了插值工作来“平滑”运动,但是对于旋转的物体(在他们自己的中心附近)似乎不起作用 – 当我尝试这样做时,所讨论的物体会“摆动”。 注意:我不是在说插入实际的旋转,而是在旋转的物体的移动 所以,假设我有一个从左到右的对象。 使用下面的代码(与插值),它移动很好,顺利。 但是,在旋转物体(假设为45度,但可以是任意角度)之后,它不再平稳移动,它仍然沿着它的path(在这种情况下从左到右)移动,但不再平滑。 主游戏循环 @Override public void onDrawFrame(GL10 gl) { //Grab time newTime = System.currentTimeMillis()*0.001; frameTime = newTime – currentTime; if ( frameTime > (dt*25)) frameTime = (dt*25); currentTime = newTime; accumulator += frameTime; //Save game-state and update logic while (accumulator >= dt){ saveGameState(); //Back up positions before updating them updateLogic(); […]

更新游戏引擎中的子节点

我正在用C ++编写我自己的小型游戏引擎(基于SDL2的薄层)。 我的基类是Node(包含一个实体的位置,比例,旋转等信息),我有两个特殊的子类,Layer和Scene。 Node |_SpriteNode |_RectNode |_… |_Layer |_Scene 一个图层可以有Node孩子。 每次循环运行时,我都会在正在渲染的场景中调用update(int timeInterval)方法,并且该方法遍历包含我的子项的vector<Node*>字段。 图层传播给他们的孩子,等等 这很好,直到我开始添加/删除更新过程中的孩子。 我第一次实现Layer有两个方法: void Layer::addChild(Node* child) { if(!child) return; _children.push_back(child); } void Layer::removeChild(Node* child) { _children.erase(child) } 这当然是愚蠢的,因为从向量中删除节点会导致更新循环( for (auto child: _chidren) )时发生空指针错误。 使用迭代器可以解决这个问题,但是当一个Node调用_parent.removeChild(this) ,它不知道该帧所使用的迭代器。 我现在使用的解决scheme是在图层中添加和删除缓冲区,在更新帧的过程中添加了新的和删除的节点。 一旦框架已经被渲染,图层就会从其子组件中执行实际的插入和删除操作。 它的作品,我已经做了一个游戏果酱游戏,但对我来说似乎更粗略。 我已经浏览了Cocos2D-X源代码,他们使用了一个简单的push_back()或者erase()调用,这让我觉得我错过了一个更大的观点,或者一些阻止迭代器问题的技巧。 有没有什么明显的(或不是)我错过了? 对不起,如果问题是愚蠢的或缺less一点。 我希望我logging一切足够:)

运动在gameloop

我想知道移动播放器的最好方法是什么。 像第一个例子那样,最好总是检查一下运动吗?像第二个例子那样只通过input函数访问运动函数更好吗? -EXAMPLE 1- while(running) { while(event) { player.input(); } logic(); render(); } logic() { player.move(); } -EXAMPLE 2- while(running) { while(event) { player.input(); } logic(); render(); } player.input() { player.move(direction); } player.move(int dir) { if(dir == left) { xvel += 1; } } 我希望我解释正确。 提前致谢。

简单的坦克游戏 – 客户端 – 服务器通信方式的怀疑

我想用C#和.NET创建一个简单的多人2D游戏,坦克(合作)。 我也想保持简单,因为这只是一个学期的项目,不幸的是我没有时间学习像Unity这样的游戏引擎。 那么,我可以做到没有统一,XNA或其他游戏引擎? 如果是的话,这是我面临的一个架构/devise问题:我应该如何通知两个玩家关于地图上其他玩家的位置,子弹的位置和敌人的位置? 我应该以50-100毫秒的时间间隔查询服务器,并获得包含位置和状态(一个坦克爆炸)的JSON消息列表? 我应该从服务器发送一个关于子弹的消息让我们来说,子弹1号从x开始,y沿着y轴开始,然后在客户端,我将绘制它,直到我将像中断一样接收,以防它碰到障碍物一辆正在经过的坦克)? 第一种select似乎更简单,但它会杀死真实生活中的服务器(10万玩家)的情况。 第二个看起来像在客户端的矫枉过正和过度工程。 还有其他建议吗? 谢谢

更正实体更新和碰撞检测的正确顺序

我试图模拟一个单一的文件行走的单位数量。 我的更新循环如下所示: for each unit: n = compute next position if n is empty then move to n 如果我从最前面的单位开始循环,它首先移动并离开其当前位置到它后面的单位。 当循环结束时,每个单元将被移动一步。 但是,如果我从其他单位开始循环,由于下一个位置被他前面的单位占用,所以它不能移动。 所以,在最坏的情况下,一个单位移动一步(n是前面的单位数)需要n-1个滴答。 我试图改变我的更新像这样: for each unit: save current position to p n = compute next position move to n detect colliding units and move them back to their p positions 在这种情况下,只要我们有一个团队,这些单位就会运转良好。 但另一个问题是当小组头相撞到另一个小组时。 在这种情况下,最前面的单位会发生碰撞,需要移回,但他们以前的位置将被(他们后面的单位)占用,并且还需要移回。 这种方法也需要太多的迭代。 RTS游戏如何解决这个问题? […]

带有multithreading的Timestep

有几个问题和文章涉及时间步 – 例如: 游戏逻辑应该更新每秒或每帧? https://gafferongames.com/post/fix_your_timestep/ 考虑蜱之间的漂移 (这是我以前的问题) 虽然最后一个在评论中开始讨论 – 但我仍然有一个关于如何构建一个multithreading系统的未解决的问题。 给定两个线程: 状态工作者:简单地对数据进行纯粹的转换。 IO渲染器:处理input,并呈现最新的可用状态对象 比方说,状态工作线程只是连续循环地更新游戏状态,而渲染器以固定的时间步长(例如60fps)更新屏幕。 现在让我们忽略input。 渲染器通过获取最新的数据来完成工作,每当数据完成时(可能在渲染之间发生了几十次),数据就从国有工作人员传入。 在我看来,这将是最stream畅的解决scheme,并且非常简单(除了读取状态更新之间的增量时间(不考虑渲染更新)之外,没有插值)。 虽然非常小 – 我说我们可以忽略input,它也给了一点点快乐,因为它轮询input并与游戏状态更新同步,在这种情况下发生得更为频繁,而基于渲染滴答至less对于简单的游戏)。 这个想法有什么缺陷? 或者是固体?

修正游戏模拟物理的时间

我是一个新手游戏开发者。 我需要开发一个简单的2D游戏,这非常简单。 我有一个人类模型,应该每n秒跳。 用户在设置中设置不同的几个选项。 第一个选项是游戏时间,第二个选项是跳数。 游戏引擎应该确定需要多less时间来模拟一次单跳,只需要将gameTime / jumpCount分开即可 。 因此,我们会发现每一次跳跃的时间。 单跳有某种物理学。 当人体模型跳跃时,应该弯曲肘部和膝部。 跳转从最低点开始到最高点。 上和下。 但是这并不重要,所有的物理学都应该通过上下移动来考虑。 我不知道如何建立我的游戏循环和物理处理来尊重用户选项。 如果设备在所需的时间不能绘制或处理物理,应该是滞后的,但整个游戏时间应该像用户设置的那样。 请建议一个策略来正确实施。 谢谢

使用预设的时间间隔移动对象

我是一个新手游戏开发者。 我有一个问题。 考虑以下情况。 我有一个简单的游戏只有一个对象 – 一个球。 一个球只能从一边上下移动到另一边。 用户可以设置游戏时间和球迭代次数。 一个迭代就是当球到达最高点并返回到最低点时。 它应该完成用户设置的所有迭代。 这是一个例子。 考虑到用户已经将游戏时间设置为60秒,并且将球迭代选项设置为30 。 我们可以find我们有多less时间60/30 = 2秒的迭代。 所以球应该完成迭代两秒钟。 假设我们有一个已知的帧速率,它是30ms (更新和绘图)。 所以单循环迭代需要2000ms 。 接下来find一个完整的球运动2000/30 = 66次迭代的迭代。 也让我们想象一下,从一边到另一边的距离是2000px 。 所以球需要每次迭代完成4000px 。 最后,我们可以找出我们的运动delta 4000px / 66 = 60 px 。 所以球每循环迭代将移动60px。 但是如果我没有帧速率怎么办,但是当帧速率不是静态的,我们每次都需要关联它时,怎么办呢? 请提出一个algorithm或方法来解决这个问题。 似乎应该有一个function,那就是从游戏开始的时间计算一个球的位置,就像罪(因为球弹跳) 谢谢。

屏幕对象有时不能渲染

我是一个温和的经验丰富的程序员谁已经创建了几个游戏引擎模板和Java小型2D游戏。 我目前正在扩展到3D游戏引擎,并且正在重写以前的引擎,使其更具适应性和面向对象。 我的问题是,而且一直定期,只是有时渲染的对象。 这使我不得不不断地重新运行程序来显示任何图像。 我还没有find任何直接的答案来解决这个问题,而且没有其他人似乎也有同样的问题(甚至当观察源代码完全相同的代码设置时)。 这个问题显然存在于render()方法中,有时在main方法调用的线程内部不能正确创建或使用Graphics&BufferStrategy对象。 以下是“Main”类的一些代码: public Main() { addScreenAndFrame(); } public static void main(String[] args) { main = new Main(); frame.add(main); thread = new Thread(main); running = true; thread.start(); } public void run() { while (running) { render(); tick(); } } public void tick() { screen.tick(); } public void render() { bs = […]