Действительно ли это - хороший способ сделать игровой цикл для игры iPhone?

Я плохо знаком с 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 представление]?

6
задан Danny Tuppeny 11 March 2010 в 20:40
поделиться

2 ответа

Из многих примеров GL от Apple, я думаю, вам следует использовать таймер.

animationTimer = [NSTimer scheduledTimerWithTimeInterval:(1.0/60.0)
                                                  target:self
                                                selector:@selector(updateAndRender)
                                                userInfo:nil
                                                 repeats:TRUE];
-2
ответ дан 18 December 2019 в 04:52
поделиться

В вашем вопросе в качестве тега указан Cocos2D, но на самом деле вы не используете какой-либо код Cocos2D. Думали ли вы о реализации Cocos2D для своих игр? Это избавит вас от лишних хлопот.

Что касается вашего синтаксического вопроса, то [myObject view] используется для вызова методов в myObject , а myObject.view используется для установки / получения открытых переменных экземпляра как свойства. Я не помню, можно ли получить переменные экземпляра с помощью [myObject view] , но если это сработает, то я думаю, единственная разница между ними - это синтаксис, и вы можете использовать оба метода для получения переменных экземпляра. .

Надеюсь, что часть этой бессвязной беседы будет вам полезна.

2
ответ дан 18 December 2019 в 04:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: