Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/search/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
这是为iPhone游戏进行游戏循环的好方法吗?_Iphone_Iphone Sdk 3.0_Quartz 2d - Fatal编程技术网

这是为iPhone游戏进行游戏循环的好方法吗?

这是为iPhone游戏进行游戏循环的好方法吗?,iphone,iphone-sdk-3.0,quartz-2d,Iphone,Iphone Sdk 3.0,Quartz 2d,我对iphonedev还不熟悉,但正在尝试构建一个2D游戏。我在看一本书,但它创建的游戏循环基本上说: function gameLoop update() render() sleep(1/30th second) gameLoop 理由是这将以每分钟30帧的速度运行。然而,这似乎有点精神,因为如果我的帧需要1/30秒,那么它将以15fps的速度运行(因为它将花费与更新一样多的睡眠时间) 因此,我做了一些挖掘,找到了CADisplayLink类,它可以将对ga

我对iphonedev还不熟悉,但正在尝试构建一个2D游戏。我在看一本书,但它创建的游戏循环基本上说:

function gameLoop
    update()
    render()
    sleep(1/30th second)
    gameLoop
理由是这将以每分钟30帧的速度运行。然而,这似乎有点精神,因为如果我的帧需要1/30秒,那么它将以15fps的速度运行(因为它将花费与更新一样多的睡眠时间)

因此,我做了一些挖掘,找到了CADisplayLink类,它可以将对gameLoop函数的调用同步到刷新率(或刷新率的一小部分)。我找不到太多的示例,所以我在这里发布代码审查:-)它似乎按预期工作,它包括将经过的(帧)时间传递到更新方法中,以便我的逻辑可以独立于帧速率(然而,我在文档中找不到如果我的框架运行时间超过允许的时间,CADisplayLink会做什么-我希望它能尽最大努力赶上,并且不会崩溃!)

如有任何反馈,将不胜感激:-)


另外,如果你能告诉我为什么所有的书都使用“viewController.view”,而其他的书似乎都使用“[对象名称]”格式,那就有额外的积分了。为什么不使用[viewController view]?

您的问题中将Cocos2D列为标记,但实际上您没有使用任何Cocos2D代码。您是否考虑过为您的游戏执行Cocos2D实现?这将为你省去一些不必要的麻烦

至于语法问题,
[myObject view]
用于调用
myObject
上的方法,而
myObject.view
用于设置/获取作为属性公开的实例变量。我不记得是否也可以使用
[myObject view]
检索实例变量,但如果这样做有效,那么我猜两者之间的唯一区别在于语法,您可以使用这两种方法来检索实例变量


希望这些漫无边际的话对你有用。

从苹果的许多GL例子中,我认为你应该使用定时器

animationTimer = [NSTimer scheduledTimerWithTimeInterval:(1.0/60.0)
                                                  target:self
                                                selector:@selector(updateAndRender)
                                                userInfo:nil
                                                 repeats:TRUE];

哎呀!告诉你我不知道我在做什么!现在移除标签。读了一些语法方面的东西,现在更好地理解它。似乎[myclass属性]和myclass.property可以做不同的事情。第一个是属性(它可以执行代码,尽管在大多数情况下我怀疑它只是返回变量),而dot直接访问变量(并且没有自定义代码)。似乎是在C#中公开私有字段和属性之间的区别,只是在这里它们看起来可以具有相同的名称!实际上,现在我很困惑,因为我遇到了错误:访问未知的'rect'getter方法,这让我认为使用dot与使用get/set方法完全相同!如果使用点,则需要将要检索的实例变量定义为属性,然后对其进行合成。“@property”和“@synthesis”调用的查找语法。Getter/setter方法是隐式为您创建的,但只有在使用@synthesis之后才能创建。这就是为什么您要获得一个未知的“rect”getter方法。我现在已经这样做了,尽管我的理解是它只是创建了get/set方法,所以现在:object.myval=something与执行:[object setMyval:something]?据我所知,yes object.myval=something和[object setMyval:something]应该是等价的。据我所知,属性的Get/set方法在您合成它们之前不会自动创建。虽然此代码可以工作,但似乎有点结巴。帧率并不低,只是看起来不太平滑。我想这可能是因为我正在同步到帧速率,然后在游戏循环中更新。渲染在drawRect中完成。我认为我的代码应该直接在调用的方法中绘制(也许应该在绘制之后进行更新),但我找不到任何CADisplayLink的好例子。我将精灵的移动速度更改为每秒30像素,看起来完全平滑(偶尔会掉帧),所以我认为它只是下降到了我设定的速度——例如,每帧移动略多于一个像素,这意味着最终它会在一帧中跳跃两个像素,使它看起来不均匀。我想这是不可避免的。我认为添加CADisplayLink是一种更好的方式,但因为它是最近才添加的,所以似乎没有什么文档/示例:(
animationTimer = [NSTimer scheduledTimerWithTimeInterval:(1.0/60.0)
                                                  target:self
                                                selector:@selector(updateAndRender)
                                                userInfo:nil
                                                 repeats:TRUE];