Я плохо знаком с iPhone dev, но пытающийся создать 2D игру. Я следовал книге, но игровой цикл, который она создала в основном, сказал:
function gameLoop
update()
render()
sleep(1/30th second)
gameLoop
Обоснование состояло в том, что это будет работать на уровне 30 кадров в секунду. Однако это казалось немного умственным, потому что, если бы мой кадр занял 1/30-ю секунду, то он достиг бы 15 футов в секунду (так как он проведет столько же времени, спя сколько обновляющий).
Так, я сделал некоторое рытье и нашел класс CADisplayLink, который будет синхронизировать вызовы к моей функции gameLoop к частоте обновления (или часть его). Я не могу найти много образцов его, таким образом, я отправляю здесь для обзора кода :-) Это, кажется, работает как ожидалось, и это включает передачу прошедшего (кадр) время в метод Обновления, таким образом, моя логика может быть framerate-independant (однако, я не могу на самом деле найти в документах, что сделал бы 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", но для всего остального, кажется, используют" [имя объекта]" формат. Почему не [viewController представление]?
Из многих примеров GL от Apple, я думаю, вам следует использовать таймер.
animationTimer = [NSTimer scheduledTimerWithTimeInterval:(1.0/60.0)
target:self
selector:@selector(updateAndRender)
userInfo:nil
repeats:TRUE];
В вашем вопросе в качестве тега указан Cocos2D, но на самом деле вы не используете какой-либо код Cocos2D. Думали ли вы о реализации Cocos2D для своих игр? Это избавит вас от лишних хлопот.
Что касается вашего синтаксического вопроса, то [myObject view]
используется для вызова методов в myObject
, а myObject.view
используется для установки / получения открытых переменных экземпляра как свойства. Я не помню, можно ли получить переменные экземпляра с помощью [myObject view]
, но если это сработает, то я думаю, единственная разница между ними - это синтаксис, и вы можете использовать оба метода для получения переменных экземпляра. .
Надеюсь, что часть этой бессвязной беседы будет вам полезна.