我是iPhone开发人员的新手,但他正在尝试构建2D游戏。我正在关注一本书,但它创建的游戏循环基本上说:
function gameLoop
update()
render()
sleep(1/30th second)
gameLoop
原因是这将以30fps运行。然而,这似乎有点精神,因为如果我的帧花了1/30秒,那么它将以15fps运行(因为它将花费尽可能多的时间来更新)。
所以,我做了一些挖掘,发现了CADisplayLink类,它将我的gameLoop函数的调用与刷新率(或其中的一小部分)同步。我找不到它的很多样本,所以我在这里发布代码审查:-)它似乎按预期工作,它包括将经过的(帧)时间传递到Update方法,所以我的逻辑可以是帧率 - 独立(但我实际上无法在文档中找到CADisplayLink如果我的框架花费超过其允许的运行时间将会做什么 - 我希望它只是尽力赶上,并且不会崩溃!)。
//
// GameAppDelegate.m
//
// Created by Danny Tuppeny on 10/03/2010.
// Copyright Danny Tuppeny 2010. All rights reserved.
//
#import "GameAppDelegate.h"
#import "GameViewController.h"
#import "GameStates/gsSplash.h"
@implementation GameAppDelegate
@synthesize window;
@synthesize viewController;
- (void) applicationDidFinishLaunching:(UIApplication *)application
{
// Create an instance of the first GameState (Splash Screen)
[self doStateChange:[gsSplash class]];
// Set up the game loop
displayLink = [CADisplayLink displayLinkWithTarget:self selector:@selector(gameLoop)];
[displayLink setFrameInterval:2];
[displayLink addToRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
}
- (void) gameLoop
{
// Calculate how long has passed since the previous frame
CFTimeInterval currentFrameTime = [displayLink timestamp];
CFTimeInterval elapsed = 0;
// For the first frame, we want to pass 0 (since we haven't elapsed any time), so only
// calculate this in the case where we're not the first frame
if (lastFrameTime != 0)
{
elapsed = currentFrameTime - lastFrameTime;
}
// Keep track of this frames time (so we can calculate this next time)
lastFrameTime = currentFrameTime;
NSLog([NSString stringWithFormat:@"%f", elapsed]);
// Call update, passing the elapsed time in
[((GameState*)viewController.view) Update:elapsed];
}
- (void) doStateChange:(Class)state
{
// Remove the previous GameState
if (viewController.view != nil)
{
[viewController.view removeFromSuperview];
[viewController.view release];
}
// Create the new GameState
viewController.view = [[state alloc] initWithFrame:CGRectMake(0, 0, IPHONE_WIDTH, IPHONE_HEIGHT) andManager:self];
// Now set as visible
[window addSubview:viewController.view];
[window makeKeyAndVisible];
}
- (void) dealloc
{
[viewController release];
[window release];
[super dealloc];
}
@end
我们将不胜感激任何反馈: - )
PS。如果你可以告诉我为什么所有的书都使用“viewController.view”,但其他一切似乎都使用“[object name]”格式。为什么不[viewController视图]?
答案 0 :(得分:2)
您在问题中将Cocos2D列为标记但您实际上并未使用任何Cocos2D代码。您是否考虑过为您的游戏进行Cocos2D实施?它将为您节省一些不必要的麻烦。
至于您的语法问题[myObject view]
用于调用myObject
上的方法,而myObject.view
用于设置/获取作为属性公开的实例变量。我不记得你是否也可以使用[myObject view]
检索实例变量,但如果可行,那么我猜两者之间的唯一区别是语法,你可以使用这两种方法来检索实例变量。
希望一些漫无边际对你有用。
答案 1 :(得分:-2)
Apple的许多GL示例中,我认为您应该使用计时器。
animationTimer = [NSTimer scheduledTimerWithTimeInterval:(1.0/60.0)
target:self
selector:@selector(updateAndRender)
userInfo:nil
repeats:TRUE];