Questions tagged «game-loop»

中央代码循环负责处理正在运行的游戏。在最基本的状态下,它接受输入,解析实体的动作并渲染场景。

11
什么时候应该使用固定或可变时间步长?
游戏循环应该基于固定时间段还是可变时间段?一个人永远是上等的,还是正确的选择会因游戏而异? 可变时间步长 物理更新传递了“自上次更新以来经过的时间”参数,因此与帧速率有关。这可能意味着要进行计算position += distancePerSecond * timeElapsed。 优点:流畅,更易于编码 缺点:不确定性,无论步长或步长都是不确定的 deWiTTERS示例: while( game_is_running ) { prev_frame_tick = curr_frame_tick; curr_frame_tick = GetTickCount(); update( curr_frame_tick - prev_frame_tick ); render(); } 固定时间步 更新可能甚至不接受“经过的时间”,因为它们假定每次更新都是在固定的时间段内进行的。计算可以按进行position += distancePerUpdate。该示例包括渲染期间的插值。 优点:可预测,确定性(更容易进行网络同步?),更清晰的计算代码 缺点:不同步以监控垂直同步(除非进行插值,否则会引起抖动的图形),最大帧速率受限(除非进行插值),难以在框架内工作采取可变的时间步长(例如Pyglet或Flixel) deWiTTERS示例: while( game_is_running ) { while( GetTickCount() > next_game_tick ) { update(); next_game_tick += SKIP_TICKS; } interpolation …

3
我应该如何编写主游戏循环?[关闭]
我应该如何编写主游戏循环?您应该在游戏循环中执行哪些操作,以及在游戏循环中不应执行的操作? 我已经写了很多,但我从未真正阅读过游戏循环。我敢肯定我可以大大改善它们,但不确定如何。

5
游戏循环中更新独立渲染的目的是什么?
游戏循环中有许多文章,书籍和讨论。但是,我经常碰到这样的事情: while(running) { processInput(); while(isTimeForUpdate) { update(); } render(); } 这种方法基本上困扰我的是“独立于更新”的渲染,例如,在完全没有变化的情况下渲染帧。所以我的问题是,为什么经常教这种方法?

5
游戏中的演员应该负责吸引自己吗?
我对游戏开发非常陌生,但对编程却不是。 我(再次)使用JavaScript的canvas元素在玩Pong类型的游戏。 我创建了一个Paddle具有以下属性的对象... width height x y colour 我也有一个Pong具有诸如...的属性的对象 width height backgroundColour draw()。 该draw()方法当前正在重置canvas,这就是出现问题的地方。 如果Paddle对象具有draw()负责其绘制的方法,或者draw()该Pong对象的负责负责其演员的绘制(我认为这是正确的术语,如果我不正确,请更正我)。 我发现在Paddle实例化两个对象Player和时,绘制自身会很有利Enemy。如果在没有Pong的draw(),我需要两次写类似的代码。 最佳做法是什么? 谢谢。

3
当几个类需要访问相同的数据时,应在哪里声明数据?
我有一个使用C ++编写的基本2D塔防游戏。 每个地图都是从GameState继承的单独的类。地图将逻辑和绘图代码委托给游戏中的每个对象,并设置数据(例如地图路径)。在伪代码中,逻辑部分可能看起来像这样: update(): for each creep in creeps: creep.update() for each tower in towers: tower.update() for each missile in missiles: missile.update() 对象(爬行,塔和导弹)存储在指针矢量中。这些塔必须能够进入蠕变矢量和导弹矢量,以制造新的导弹并确定目标。 问题是:我在哪里声明向量?它们是否应该是Map类的成员,并作为参数传递给tower.update()函数?还是在全球宣布?还是我完全想不到的其他解决方案? 当几个类需要访问相同的数据时,应在哪里声明数据?

3
什么是标准C#/ Windows Forms游戏循环?
当用C#编写使用原始 Windows窗体和某些图形API包装器(如SlimDX或OpenTK)的游戏时,应如何构建主游戏循环? 规范的Windows窗体应用程序的入口点看起来像 public static void Main () { Application.Run(new MainForm()); } 同时可以做到一些什么是挂钩neccessary 的各个事件Form类,这些事件没有提供明显的地方放的码位进行不断定期更新游戏逻辑对象或开始和结束渲染帧。 这种游戏应该使用什么技术来实现类似于规范的游戏 while(!done) { update(); render(); } 游戏循环以及最小的性能和GC影响?

2
在OpenGL中建立游戏循环的好方法
我目前正在学校里开始学习OpenGL,而前几天我已经开始制作一个简单的游戏(我自己,不是在学校里)。我正在使用freeglut,并使用C进行构建,因此对于我的游戏循环,我确实一直在使用传递给我的函数来glutIdleFunc一次性更新所有图形和物理特性。对于我不太在乎帧频的简单动画来说,这很好,但是由于游戏主要是基于物理的,因此我真的想(需要)确定更新速度。 因此,我的第一个尝试是让函数传递给glutIdleFunc(myIdle()),以跟踪自上次调用以来经过了多少时间,并每隔毫秒更新一次物理(以及当前的图形)。我曾经timeGetTime()这样做(通过使用<windows.h>)。这让我开始思考,使用空闲功能真的是进行游戏循环的好方法吗? 我的问题是,在OpenGL中实现游戏循环的更好方法是什么?我应该避免使用空闲功能吗?
31 opengl  c  game-loop 


4
这段代码中“增量”的含义是什么?它反映了游戏开发人员的标准吗?
我对游戏编程了解甚少,但想了解更多。我正在尝试了解此游戏的代码。我试图理解为什么代码会将“ delta”传递给Shipcontrols.js,后者会根据用户输入来更改飞船的方向。 基本上,游戏每个循环都会计算“增量” ... 这是使用delta到一个循环的堆栈的缩写版本... var delta = now - this.time; this.time = now; this.current.render.call(this.current, delta, this.renderer); 走进这里... ctx.manager.add("game", scene, camera, function(delta, renderer) { if(delta > 25 && this.objects.lowFPS < 1000) this.objects.lowFPS++; var dt = delta/16.6; this.objects.components.shipControls.update(dt); 走进这里... bkcore.hexgl.ShipControls.prototype.update = function(dt) { var pitchAng; var yaw; var roll; if (undefined …

5
游戏动作需要多个框架才能完成
我之前从未真正做过很多游戏编程,这是一个非常简单的问题。 想象一下,我正在构建一个俄罗斯方块游戏,主循环看起来像这样。 for every frame handle input if it's time to make the current block move down a row if we can move the block move the block else remove all complete rows move rows down so there are no gaps if we can spawn a new block spawn a …

4
使主游戏循环不受控制地运行是否有任何危害?
我想知道当我的游戏循环以系统允许的速度运行时是否有任何可能的危害? 我目前有一个循环,通过测量经过的时间(以纳秒为单位),可以以预定义的速度运行游戏逻辑和渲染逻辑,而不会出现问题。实际上,我在循环中执行的任何逻辑都每秒被计时到一定数量的调用。 循环本身的运行速度差不多可以达到我的计算机上每秒大约1170万个循环的速度。 循环(简单的伪代码): while(!isGameOver){ if(canPollInputs){ pollInputs() } while(canStepLogic){ stepLogic() } if(canRender){ render() } } 我的问题基本上是,如果这个简单的循环没有以受控的速度运行,是否会对系统造成危害? 编辑:这意味着我的逻辑每秒运行30次(30 tps),渲染器以60 fps的速度运行,我轮询输入每秒100次,并且还有一些逻辑可以应付逻辑或渲染花费比预期更长的时间。但是循环本身并未受到限制。 编辑:使用Thread.sleep()例如将主循环节流到每秒250个循环导致减少,但是循环以每秒570个循环而不是所需的250个循环运行(当我在台式机上时会添加代码。) 编辑:在这里,为了弄清楚事情,一个工作的Java gameloop。也可以随意使用它,但不要声称它是您的;) private void gameLoop() { // Time that must elapse before a new run double timePerPoll = 1000000000l / targetPPS; double timePerTick = 1000000000l / targetTPS; double timePerFrame = …

1
行为树::耗时超过一滴答的动作
根据我对行为树的了解,每个行为都应该是一个短期目标导向的动作,可以通过几次迭代来完成。 因此,例如,以下是行为树的图像: 现在让我们假设“ 驱逐敌人”行为在树中进行了多次迭代。因此,每次通过都会调用Drive To Enemy,因为它现在处于运行状态。 问题是如果附近有敌人,我想打电话给Evade Enemy。并考虑到驱动器要敌人总是叫我没有机会打电话给躲避敌人(或许应该叫避开敌人)。 无论当前正在执行什么操作,我都应该遍历Tree EACH通行证吗? 我要这样做正确吗? 处理此类行为的正确方法是什么? 最初在Stackoverflow上被问到。认为这里将是一个更合适的地方来问这个问题。
19 ai  game-loop  behavior 

3
回合制游戏的设计,其中动作有副作用
我正在编写游戏Dominion的计算机版本。这是一种基于回合制的纸牌游戏,其中动作卡,宝物卡和胜利点卡累积在玩家的个人卡组中。我已经很好地开发了类结构,并且我开始设计游戏逻辑。我正在使用python,稍后可能会在pygame中添加一个简单的GUI。 玩家的回合顺序由一个非常简单的状态机控制。顺时针旋转通过,玩家无法在游戏结束之前退出游戏。单圈游戏也是一种状态机。通常,玩家经历“行动阶段”,“购买阶段”和“清理阶段”(按此顺序)。根据问题的答案,如何实现回合制游戏引擎?在这种情况下,状态机是一种标准技术。 我的问题是,在玩家的动作阶段,她可以使用对自己或其他一个或多个玩家有副作用的动作卡。例如,一张动作卡允许玩家在当前回合结束后立即进行第二回合。另一张动作牌会使所有其他玩家从其手上弃掉两张牌。在当前回合中,还有另一张动作卡不起作用,但允许玩家在下一回合中抽出额外的卡。为了使事情变得更加复杂,游戏中经常会有新的扩展添加新的牌。在我看来,将每个动作卡的结果硬编码到游戏的状态机中既丑陋又不适应。回合制策略循环的答案 并未详细介绍解决该问题的设计。 我应该使用哪种编程模型来包含一个事实,即转弯时的一般模式可以通过转弯内发生的动作来修改?游戏对象是否应该跟踪每张动作卡的效果?或者,如果卡应实现自己的效果(例如,通过实现接口),则需要什么设置才能赋予它们足够的功率?我已经想出了一些解决此问题的方法,但是我想知道是否存在解决该问题的标准方法。具体来说,我想知道哪个对象/类/什么负责跟踪每个玩家由于打出一张动作卡而必须执行的动作,以及与正常顺序中的临时更改有何关系转弯状态机。

2
碰撞检测逻辑应该放在哪里?
我正在开发一个小型2D游戏引擎。角色具有绘画方法,当前可以执行以下操作: 根据角色的速度等计算角色的新位置。 更新碰撞网格单元** 在新位置绘制角色 **我创建了一个碰撞网格以减少相交检查的次数 现在我想到的用于检测碰撞的基本算法是: For Each Character Check intersection with characters in surrounding 8 cells 我可以简单地将此代码放在paint方法中。但是,这是我预期的问题。 假设两个字符A和B位于碰撞网格中的相邻单元格中。现在,按照上述算法,在字符A的迭代中,它将检测到它与B碰撞。在字符B的迭代中,它将检测到它与A碰撞。 但是我有一个想法,当A检测到它与B发生碰撞时,应该通知B它与A发生碰撞。当有两个以上的actor发生碰撞时,这样可以节省很多比较。但我不确定如何处理。我认为应该检查游戏循环内的碰撞,而不是每个角色都检查碰撞。 这种方法正确吗?您如何处理此类问题?我自己想到了碰撞网格。碰撞网格逻辑还有其他选择吗?

2
为什么移动鼠标时我的精灵播放器移动得更快?
我正在尝试开发一个使用Pygame(Python库)制作的简单游戏。 我有一个sprite物体,player然后使用箭头键将其移动。如果我不移动鼠标,则精灵会正常移动,但是当我移动鼠标时,精灵会移动得更快(例如x2或x3)。该player对象位于charsGroupvar 内部。 我已经在W7和Ubuntu中运行了该游戏。两种操作系统都发生相同的情况。 我有更多的实体会像NPC和子弹一样移动,但它们不会受到影响,只是玩家。鉴于此,我认为问题可能与玩家移动系统(箭头键)直接相关。 这是对象的update()方法player: def update(self): for event in pygame.event.get(): key = pygame.key.get_pressed() mouseX, mouseY = pygame.mouse.get_pos() if event.type == pygame.MOUSEBUTTONDOWN: self.bulletsGroup.add(Bullet(pygame.image.load("bullet.png"), self.rect.x + (self.image.get_width()/2), self.rect.y + (self.image.get_height()/2), mouseX, mouseY, 50, 50)) if key[pygame.K_RIGHT]: if not self.checkCollision(): self.rect.x += 10 else: self.rect.x -= 10 if key[pygame.K_LEFT]: if not …

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.