English 中文(简体)
Cocos2D 游戏圈解析
原标题:Cocos2D Game Loop Clarifications

注意:我不是母语英语,请原谅任何语法错误。

我开发了一个简单的游戏,左边有一个枪手,右边有敌人。非常简单。

这个项目即将完成, 运作完美, 但现在我对游戏环管理有些怀疑。

I scheduled the enemies appearing from the right giving the scheduler a interval, and it s ok, but i managed the movement of enemies from right to left with a simple ccMoveTo action, and i repeat: it works perfectly. The problem is that i read something about "render the sprites in every frame" delegating this operation to a scheduled method that runs one time per frame..

更好的是:我读到不要用动作来移动图案, 而是用框架重塑图案框, 模拟以1/60频率(fps频率)的预定方法(fps频率)的移动, 我读到,

我要求的是:

  • is that the right way to proceed?
  • is that an old "design pattern" that is obsolete with Cocos2D? (and this would mean that using the ccMoveTo actions is completely perfect)
  • or are both implementations correct at the same level?

编辑:

- 动画也应该用同样的技术吗?

最佳回答

首先,如果它“工作完美”而且你的游戏接近完成,不要改变游戏。如果你改变现在的事情,你可能会给游戏游戏带来微妙的变化,那么你的游戏要花更长的时间才能结束,到最后,玩家们可能甚至不会注意到差别。你下次可以尝试不同的方法,但对于你当前的游戏,只要你现在的游戏是好的,就不要管它了。

我相信您所读到的是我也会说的: 不要使用 CCMoveTo/ CCMoveBy 来( 复杂) 游戏对象的移动 。 如果移动非常简单, 或者从 A 到 B 的一张照片, 则 CCMove 动作是正常的 。 但即使如此, 更新该位置的更新环也同样容易执行 。

CCMove 动作的问题在于您想要改变方向和/ 或速度时的行为。 在此情况下, 您需要创建一个新的移动动作。 如果您经常这样做, 您将会在游戏中添加更多 Alloc/ dealloc 循环, 而不必要。 其次, CCMove 动作在产生任何效果之前采取一个不活动框架。 这意味着, 如果您创建一个新的 CCMove 动作, 每一个框架, 该游戏对象将会被有效卡住, 而不是移动 。 如果您改变得更少, 每次对象改变速度或方向时, 您仍然会注意短暂的暂停 。 也不可取 。

选项没有你让它听起来那么复杂。 是的, 您需要在移动的游戏对象中安排更新, 比如 :

[self scheduleUpdate];

然后在更新节点位置时执行更新方法 :

-(void) update:(ccTime)delta
{
    self.position = CGPointMake(self.position.x + 1, self.position.y);
}

更灵活的移动通常使用速度矢量(CGPoint,典型实例变量),确定移动的速度和方向:

-(void) update:(ccTime)delta
{
    self.position = ccpAdd(self.position, self.velocity);
}

现在,您可以对如何将速度添加到位置上,以及如何更新速度本身有更多的花样。例如,您可以控制速度,以确保天体的移动不会比x像素每秒的速度更快。您还可以通过降低速度.y每个框架来添加模拟重力。此外,还可以增加更多的模拟重力。基本原理保持不变。

唯一真正不同的替代方案是您将三角洲时间从更新时算起。 这样可以确保节点随时间移动相同的距离, 不论框架速率如何。 这意味着, 如果框架速率从60到20英尺下降, 节点仍然会保持同样的距离, 但每框架移动几个像素, 以弥补失去的时间。 不在三角洲时间计数, 节点只会随着框架速率下降而放慢速度 。

整合三角洲时间是一个简单的乘法:

-(void) update:(ccTime)delta
{
    self.position = ccpAdd(self.position, ccpMult(self.velocity, delta));
}

然而,大多数游戏都不应该使用时间三角洲。 它可能导致相当不可预测的结果,包括如果设备在十分之一秒或更多时忙时在游戏世界模拟中跳跃,比如,如果它收到电子邮件或短信。

大多数游戏应该放慢速度,然后试图弥补“丢失”时间。 问题在于,在此期间,玩家无法更快反应(相反 ), 从而加快游戏世界模拟的速度对玩家来说是不公平的,并可能导致过早失去肢体或生命。

问题回答

暂无回答




相关问题
Help with game development. Render loop?

I m working on a simple game, this is my first game project. Most of the samples I find have a Render Loop where all the game logic is made too and I just don t like this. Let s say I have a ball ...

DirectX: Game loop order, draw first and then handle input?

I was just reading through the DirectX documentation and encountered something interesting in the page for IDirect3DDevice9::BeginScene : To enable maximal parallelism between the CPU and the ...

Game loop performance and component approach

I have an idea of organising a game loop. I have some doubts about performance. May be there are better ways of doing things. Consider you have an array of game components. They all are called to do ...

Game loop and time tracking

Maybe I m just an idiot, but I ve been trying to implement a game loop all day and it s just not clicking. I ve read literally every article I could find on Google, but the problem is that they all ...

Why is a "main" game loop necessary for developing a game?

I find that most game development requires a main game loop, but I don t know why it s necessary. Couldn t we implement an event listener and respond to every user action? Animations (etc.) could then ...

Windows Game Loop 50% CPU on Dual Core

The game loop alone is using 50% of CPU Usage, I haven t done any rendering work yet. What I m doing here? while(true) { if(PeekMessage(&msg,NULL,0,0,PM_REMOVE)) ...

Android game with constant FPS?

I m implementing a game loop with constant FPS. I m thinking about 25-30 FPS should be enough. Any ideas from your own experience? Should I even restrict FPS at all?

热门标签