| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911 |
- #ifdef __APPLE__
- #include "Base.h"
- #include "Platform.h"
- #include "FileSystem.h"
- #include "Game.h"
- #include "Form.h"
- #include <unistd.h>
- #import <UIKit/UIKit.h>
- #import <QuartzCore/QuartzCore.h>
- #import <CoreMotion/CoreMotion.h>
- #import <OpenGLES/EAGL.h>
- #import <OpenGLES/EAGLDrawable.h>
- #import <OpenGLES/ES2/gl.h>
- #import <OpenGLES/ES2/glext.h>
- #import <mach/mach_time.h>
- using namespace std;
- using namespace gameplay;
- // UIScreen bounds are provided as if device was in portrait mode Gameplay defaults to landscape
- extern const int WINDOW_WIDTH = [[UIScreen mainScreen] bounds].size.height * [[UIScreen mainScreen] scale];
- extern const int WINDOW_HEIGHT = [[UIScreen mainScreen] bounds].size.width * [[UIScreen mainScreen] scale];
- extern const int WINDOW_SCALE = [[UIScreen mainScreen] scale];
- @class AppDelegate;
- @class View;
- static AppDelegate *__appDelegate = NULL;
- static View* __view = NULL;
- static long __timeStart;
- static long __timeAbsolute;
- static bool __vsync = WINDOW_VSYNC;
- static float __pitch;
- static float __roll;
- long getMachTimeInMilliseconds();
- int getKey(unichar keyCode);
- @interface View : UIView <UIKeyInput>
- {
- EAGLContext* context;
- CADisplayLink* displayLink;
- GLuint defaultFramebuffer;
- GLuint colorRenderbuffer;
- GLuint depthRenderbuffer;
- GLint framebufferWidth;
- GLint framebufferHeight;
- NSInteger swapInterval;
- BOOL updating;
- Game* _game;
- }
- @property (readonly, nonatomic, getter=isUpdating) BOOL updating;
- @property (readonly, nonatomic, getter=getContext) EAGLContext* context;
- - (void)startUpdating;
- - (void)stopUpdating;
- - (void)update:(id)sender;
- - (void)setSwapInterval:(NSInteger)interval;
- - (int)swapInterval;
- - (void)swapBuffers;
- - (BOOL)showKeyboard;
- - (BOOL)dismissKeyboard;
- @end
- @interface View (Private)
- - (void)createFramebuffer;
- - (void)deleteFramebuffer;
- @end
- @implementation View
- @synthesize updating;
- @synthesize context;
- + (Class) layerClass
- {
- return [CAEAGLLayer class];
- }
- - (id) initWithFrame:(CGRect)frame
- {
- if ((self = [super initWithFrame:frame]))
- {
- // A system version of 3.1 or greater is required to use CADisplayLink.
- NSString *reqSysVer = @"3.1";
- NSString *currSysVer = [[UIDevice currentDevice] systemVersion];
- if ([currSysVer compare:reqSysVer options:NSNumericSearch] != NSOrderedAscending)
- {
- // Log the system version
- NSLog(@"System Version: %@", currSysVer);
- }
- else
- {
- printError("Invalid OS Version: %s\n", (currSysVer == NULL?"NULL":[currSysVer cStringUsingEncoding:NSASCIIStringEncoding]));
- [self release];
- return nil;
- }
-
- // Configure the CAEAGLLayer and setup out the rendering context
- CGFloat scale = [[UIScreen mainScreen] scale];
- CAEAGLLayer* layer = (CAEAGLLayer *)self.layer;
- layer.opaque = TRUE;
- layer.drawableProperties = [NSDictionary dictionaryWithObjectsAndKeys:
- [NSNumber numberWithBool:FALSE], kEAGLDrawablePropertyRetainedBacking,
- kEAGLColorFormatRGBA8, kEAGLDrawablePropertyColorFormat, nil];
- self.contentScaleFactor = scale;
- layer.contentsScale = scale;
-
- context = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES2];
- if (!context || ![EAGLContext setCurrentContext:context])
- {
- [self release];
- return nil;
- }
- if (!defaultFramebuffer)
- {
- [self createFramebuffer];
- }
-
- glBindFramebuffer(GL_FRAMEBUFFER, defaultFramebuffer);
- glViewport(0, 0, framebufferWidth, framebufferHeight);
- // Initialize Internal Defaults
- displayLink = nil;
- defaultFramebuffer = 0;
- colorRenderbuffer = 0;
- depthRenderbuffer = 0;
- framebufferWidth = 0;
- framebufferHeight = 0;
- swapInterval = 1;
- updating = FALSE;
-
- [self createFramebuffer];
-
- // Set the resource path and initalize the game
- NSString* bundlePath = [[[NSBundle mainBundle] bundlePath] stringByAppendingString:@"/"];
- FileSystem::setResourcePath([bundlePath fileSystemRepresentation]);
-
- _game = Game::getInstance();
- __timeStart = getMachTimeInMilliseconds();
- _game->run(WINDOW_WIDTH, WINDOW_HEIGHT);
- }
- return self;
- }
- - (void) dealloc
- {
- _game->exit();
- [self deleteFramebuffer];
-
- if ([EAGLContext currentContext] == context)
- {
- [EAGLContext setCurrentContext:nil];
- }
- [context release];
- [super dealloc];
- }
- - (BOOL)canBecomeFirstResponder
- {
- // Override so we can control the keyboard
- return YES;
- }
- - (void) layoutSubviews
- {
- // Called on 'resize'
- [self deleteFramebuffer];
- }
- - (void)createFramebuffer
- {
- // iOS Requires all content go to a rendering buffer then it is swapped into the windows rendering surface
- assert(defaultFramebuffer == 0);
-
- // Create the default frame buffer, and render buffer
- glGenFramebuffers(1, &defaultFramebuffer);
- glGenRenderbuffers(1, &colorRenderbuffer);
- glBindFramebuffer(GL_FRAMEBUFFER, defaultFramebuffer);
- glBindRenderbuffer(GL_RENDERBUFFER, colorRenderbuffer);
-
- // request storage, width, and height of the view that we will render in
- [context renderbufferStorage:GL_RENDERBUFFER fromDrawable:(CAEAGLLayer *)self.layer];
- glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, colorRenderbuffer);
- glGetRenderbufferParameteriv(GL_RENDERBUFFER, GL_RENDERBUFFER_WIDTH, &framebufferWidth);
- glGetRenderbufferParameteriv(GL_RENDERBUFFER, GL_RENDERBUFFER_HEIGHT, &framebufferHeight);
-
- glGenRenderbuffers(1, &depthRenderbuffer);
- glBindRenderbuffer(GL_RENDERBUFFER, depthRenderbuffer);
- glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT24_OES, framebufferWidth, framebufferHeight);
- glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, depthRenderbuffer);
-
- // Sanity check, ensure that the framebuffer is valid
- if (glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE)
- NSLog(@"ERROR: Failed to make complete framebuffer object %x", glCheckFramebufferStatus(GL_FRAMEBUFFER));
- }
- - (void)deleteFramebuffer
- {
- if (context)
- {
- [EAGLContext setCurrentContext:context];
- if (defaultFramebuffer)
- {
- glDeleteFramebuffers(1, &defaultFramebuffer);
- defaultFramebuffer = 0;
- }
- if (colorRenderbuffer)
- {
- glDeleteRenderbuffers(1, &colorRenderbuffer);
- colorRenderbuffer = 0;
- }
- if (depthRenderbuffer)
- {
- glDeleteRenderbuffers(1, &depthRenderbuffer);
- depthRenderbuffer = 0;
- }
- }
- }
- - (void)setSwapInterval:(NSInteger)interval
- {
- if (interval >= 1)
- {
- swapInterval = interval;
- if (updating)
- {
- [self stopUpdating];
- [self startUpdating];
- }
- }
- }
- - (int)swapInterval
- {
- return swapInterval;
- }
- - (void)swapBuffers
- {
- if (context != nil)
- {
- glBindRenderbuffer(GL_RENDERBUFFER, colorRenderbuffer);
- [context presentRenderbuffer:GL_RENDERBUFFER];
- }
- }
- - (void)startUpdating
- {
- if (!updating)
- {
- displayLink = [CADisplayLink displayLinkWithTarget:self selector:@selector(update:)];
- [displayLink setFrameInterval:swapInterval];
- [displayLink addToRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
- _game->resume();
- updating = TRUE;
- }
- }
- - (void)stopUpdating
- {
- if (updating)
- {
- _game->pause();
- [displayLink invalidate];
- displayLink = nil;
- updating = FALSE;
- }
- }
- - (void)update:(id)sender
- {
- if (context != nil)
- {
- [EAGLContext setCurrentContext:context];
- if (!defaultFramebuffer)
- [self createFramebuffer];
-
- glBindFramebuffer(GL_FRAMEBUFFER, defaultFramebuffer);
- glViewport(0, 0, framebufferWidth, framebufferHeight);
- if (_game && _game->getState() == Game::RUNNING)
- _game->frame();
-
- glBindRenderbuffer(GL_RENDERBUFFER, colorRenderbuffer);
- [context presentRenderbuffer:GL_RENDERBUFFER];
- }
- }
- - (BOOL)showKeyboard
- {
- return [self becomeFirstResponder];
- }
- - (BOOL)dismissKeyboard
- {
- return [self resignFirstResponder];
- }
- - (void)insertText:(NSString*)text
- {
- if([text length] == 0) return;
- assert([text length] == 1);
- unichar c = [text characterAtIndex:0];
- int key = getKey(c);
- Platform::keyEventInternal(Keyboard::KEY_PRESS, key);
- Platform::keyEventInternal(Keyboard::KEY_RELEASE, key);
- }
- - (void)deleteBackward
- {
- Platform::keyEventInternal(Keyboard::KEY_PRESS, Keyboard::KEY_BACKSPACE);
- Platform::keyEventInternal(Keyboard::KEY_RELEASE, Keyboard::KEY_BACKSPACE);
- }
- - (BOOL)hasText
- {
- return YES;
- }
- - (void)touchesBegan:(NSSet*)touches withEvent:(UIEvent*)event
- {
- unsigned int touchID = 0;
- for(UITouch* touch in touches)
- {
- CGPoint touchPoint = [touch locationInView:self];
- if(self.multipleTouchEnabled == YES)
- {
- touchID = [touch hash];
- }
- Platform::touchEventInternal(Touch::TOUCH_PRESS, touchPoint.x * WINDOW_SCALE, touchPoint.y * WINDOW_SCALE, touchID);
- }
- }
- - (void)touchesEnded:(NSSet*)touches withEvent:(UIEvent*)event
- {
- unsigned int touchID = 0;
- for(UITouch* touch in touches)
- {
- CGPoint touchPoint = [touch locationInView:self];
- if(self.multipleTouchEnabled == YES)
- touchID = [touch hash];
- Platform::touchEventInternal(Touch::TOUCH_RELEASE, touchPoint.x * WINDOW_SCALE, touchPoint.y * WINDOW_SCALE, touchID);
- }
- }
- - (void)touchesCancelled:(NSSet*)touches withEvent:(UIEvent*)event
- {
- // No equivalent for this in GamePlay -- treat as touch end
- [self touchesEnded:touches withEvent:event];
- }
- - (void)touchesMoved:(NSSet*)touches withEvent:(UIEvent*)event
- {
- unsigned int touchID = 0;
- for(UITouch* touch in touches)
- {
- CGPoint touchPoint = [touch locationInView:self];
- if(self.multipleTouchEnabled == YES)
- touchID = [touch hash];
- Platform::touchEventInternal(Touch::TOUCH_MOVE, touchPoint.x * WINDOW_SCALE, touchPoint.y * WINDOW_SCALE, touchID);
- }
- }
- @end
- @interface ViewController : UIViewController
- - (void)startUpdating;
- - (void)stopUpdating;
- @end
- @implementation ViewController
- - (id)init
- {
- if((self = [super init]))
- {
- }
- return self;
- }
- - (void)dealloc
- {
- __view = nil;
- [super dealloc];
- }
- - (void)didReceiveMemoryWarning
- {
- [super didReceiveMemoryWarning];
- }
- #pragma mark - View lifecycle
- - (void)loadView
- {
- self.view = [[[View alloc] init] autorelease];
- if(__view == nil)
- {
- __view = (View*)self.view;
- }
- }
- - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
- {
- // Return YES for supported orientation, currently support landscape only?
- return UIInterfaceOrientationIsLandscape(interfaceOrientation);
- }
- - (void)startUpdating
- {
- [(View*)self.view startUpdating];
- }
- - (void)stopUpdating
- {
- [(View*)self.view stopUpdating];
- }
- @end
- @interface AppDelegate : UIApplication <UIApplicationDelegate>
- {
- UIWindow* window;
- ViewController* viewController;
- CMMotionManager *motionManager;
- }
- @end
- @implementation AppDelegate
- - (BOOL)application:(UIApplication*)application didFinishLaunchingWithOptions:(NSDictionary*)launchOptions
- {
- __appDelegate = self;
- [UIApplication sharedApplication].statusBarHidden = YES;
-
- motionManager = [[CMMotionManager alloc] init];
- if([motionManager isAccelerometerAvailable] == YES)
- {
- motionManager.accelerometerUpdateInterval = 1 / 40.0; // 40Hz
- [motionManager startAccelerometerUpdates];
- }
-
- window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
- viewController = [[ViewController alloc] init];
- [window setRootViewController:viewController];
- [window makeKeyAndVisible];
- return YES;
- }
- - (void)getAccelerometerPitch:(float*)pitch roll:(float*)roll
- {
- float p = 0.0f;
- float r = 0.0f;
- CMAccelerometerData* accelerometerData = motionManager.accelerometerData;
- if(accelerometerData != nil)
- {
- float tx, ty, tz;
-
- switch ([[UIApplication sharedApplication] statusBarOrientation])
- {
- case UIInterfaceOrientationLandscapeRight:
- tx = -accelerometerData.acceleration.y;
- ty = accelerometerData.acceleration.x;
- break;
- case UIInterfaceOrientationLandscapeLeft:
- tx = accelerometerData.acceleration.y;
- ty = -accelerometerData.acceleration.x;
- break;
- case UIInterfaceOrientationPortraitUpsideDown:
- tx = -accelerometerData.acceleration.y;
- ty = -accelerometerData.acceleration.x;
- break;
- case UIInterfaceOrientationPortrait:
- break;
- }
-
- tz = accelerometerData.acceleration.z;
-
- p = atan(ty / sqrt(tx * tx + tz * tz)) * 180.0f * M_1_PI;
- r = atan(tx / sqrt(ty * ty + tz * tz)) * 180.0f * M_1_PI;
- }
-
- if(pitch != NULL)
- *pitch = p;
- if(roll != NULL)
- *roll = r;
- }
- - (void)applicationWillResignActive:(UIApplication*)application
- {
- [viewController stopUpdating];
- }
- - (void)applicationDidEnterBackground:(UIApplication*)application
- {
- [viewController stopUpdating];
- }
- - (void)applicationWillEnterForeground:(UIApplication*)application
- {
- [viewController startUpdating];
- }
- - (void)applicationDidBecomeActive:(UIApplication*)application
- {
- [viewController startUpdating];
- }
- - (void)applicationWillTerminate:(UIApplication*)application
- {
- [viewController stopUpdating];
- }
- - (void)dealloc
- {
- [window setRootViewController:nil];
- [viewController release];
- [window release];
- [motionManager release];
- [super dealloc];
- }
- @end
- long getMachTimeInMilliseconds()
- {
- static const int64_t kOneMillion = 1000 * 1000;
- static mach_timebase_info_data_t s_timebase_info;
-
- if (s_timebase_info.denom == 0)
- (void) mach_timebase_info(&s_timebase_info);
-
- // mach_absolute_time() returns billionth of seconds, so divide by one million to get milliseconds
- return (long)((mach_absolute_time() * s_timebase_info.numer) / (kOneMillion * s_timebase_info.denom));
- }
- int getKey(unichar keyCode)
- {
- switch(keyCode)
- {
- case 0x30:
- return Keyboard::KEY_ZERO;
- case 0x31:
- return Keyboard::KEY_ONE;
- case 0x32:
- return Keyboard::KEY_TWO;
- case 0x33:
- return Keyboard::KEY_THREE;
- case 0x34:
- return Keyboard::KEY_FOUR;
- case 0x35:
- return Keyboard::KEY_FIVE;
- case 0x36:
- return Keyboard::KEY_SIX;
- case 0x37:
- return Keyboard::KEY_SEVEN;
- case 0x38:
- return Keyboard::KEY_EIGHT;
- case 0x39:
- return Keyboard::KEY_NINE;
-
- case 0x41:
- return Keyboard::KEY_CAPITAL_A;
- case 0x42:
- return Keyboard::KEY_CAPITAL_B;
- case 0x43:
- return Keyboard::KEY_CAPITAL_C;
- case 0x44:
- return Keyboard::KEY_CAPITAL_D;
- case 0x45:
- return Keyboard::KEY_CAPITAL_E;
- case 0x46:
- return Keyboard::KEY_CAPITAL_F;
- case 0x47:
- return Keyboard::KEY_CAPITAL_G;
- case 0x48:
- return Keyboard::KEY_CAPITAL_H;
- case 0x49:
- return Keyboard::KEY_CAPITAL_I;
- case 0x4A:
- return Keyboard::KEY_CAPITAL_J;
- case 0x4B:
- return Keyboard::KEY_CAPITAL_K;
- case 0x4C:
- return Keyboard::KEY_CAPITAL_L;
- case 0x4D:
- return Keyboard::KEY_CAPITAL_M;
- case 0x4E:
- return Keyboard::KEY_CAPITAL_N;
- case 0x4F:
- return Keyboard::KEY_CAPITAL_O;
- case 0x50:
- return Keyboard::KEY_CAPITAL_P;
- case 0x51:
- return Keyboard::KEY_CAPITAL_Q;
- case 0x52:
- return Keyboard::KEY_CAPITAL_R;
- case 0x53:
- return Keyboard::KEY_CAPITAL_S;
- case 0x54:
- return Keyboard::KEY_CAPITAL_T;
- case 0x55:
- return Keyboard::KEY_CAPITAL_U;
- case 0x56:
- return Keyboard::KEY_CAPITAL_V;
- case 0x57:
- return Keyboard::KEY_CAPITAL_W;
- case 0x58:
- return Keyboard::KEY_CAPITAL_X;
- case 0x59:
- return Keyboard::KEY_CAPITAL_Y;
- case 0x5A:
- return Keyboard::KEY_CAPITAL_Z;
-
-
- case 0x61:
- return Keyboard::KEY_A;
- case 0x62:
- return Keyboard::KEY_B;
- case 0x63:
- return Keyboard::KEY_C;
- case 0x64:
- return Keyboard::KEY_D;
- case 0x65:
- return Keyboard::KEY_E;
- case 0x66:
- return Keyboard::KEY_F;
- case 0x67:
- return Keyboard::KEY_G;
- case 0x68:
- return Keyboard::KEY_H;
- case 0x69:
- return Keyboard::KEY_I;
- case 0x6A:
- return Keyboard::KEY_J;
- case 0x6B:
- return Keyboard::KEY_K;
- case 0x6C:
- return Keyboard::KEY_L;
- case 0x6D:
- return Keyboard::KEY_M;
- case 0x6E:
- return Keyboard::KEY_N;
- case 0x6F:
- return Keyboard::KEY_O;
- case 0x70:
- return Keyboard::KEY_P;
- case 0x71:
- return Keyboard::KEY_Q;
- case 0x72:
- return Keyboard::KEY_R;
- case 0x73:
- return Keyboard::KEY_S;
- case 0x74:
- return Keyboard::KEY_T;
- case 0x75:
- return Keyboard::KEY_U;
- case 0x76:
- return Keyboard::KEY_V;
- case 0x77:
- return Keyboard::KEY_W;
- case 0x78:
- return Keyboard::KEY_X;
- case 0x79:
- return Keyboard::KEY_Y;
- case 0x7A:
- return Keyboard::KEY_Z;
- default:
- break;
-
- // Symbol Row 3
- case 0x2E:
- return Keyboard::KEY_PERIOD;
- case 0x2C:
- return Keyboard::KEY_COMMA;
- case 0x3F:
- return Keyboard::KEY_QUESTION;
- case 0x21:
- return Keyboard::KEY_EXCLAM;
- case 0x27:
- return Keyboard::KEY_APOSTROPHE;
-
- // Symbols Row 2
- case 0x2D:
- return Keyboard::KEY_MINUS;
- case 0x2F:
- return Keyboard::KEY_SLASH;
- case 0x3A:
- return Keyboard::KEY_COLON;
- case 0x3B:
- return Keyboard::KEY_SEMICOLON;
- case 0x28:
- return Keyboard::KEY_LEFT_PARENTHESIS;
- case 0x29:
- return Keyboard::KEY_RIGHT_PARENTHESIS;
- case 0x24:
- return Keyboard::KEY_DOLLAR;
- case 0x26:
- return Keyboard::KEY_AMPERSAND;
- case 0x40:
- return Keyboard::KEY_AT;
- case 0x22:
- return Keyboard::KEY_QUOTE;
-
- // Numeric Symbols Row 1
- case 0x5B:
- return Keyboard::KEY_LEFT_BRACKET;
- case 0x5D:
- return Keyboard::KEY_RIGHT_BRACKET;
- case 0x7B:
- return Keyboard::KEY_LEFT_BRACE;
- case 0x7D:
- return Keyboard::KEY_RIGHT_BRACE;
- case 0x23:
- return Keyboard::KEY_NUMBER;
- case 0x25:
- return Keyboard::KEY_PERCENT;
- case 0x5E:
- return Keyboard::KEY_CIRCUMFLEX;
- case 0x2A:
- return Keyboard::KEY_ASTERISK;
- case 0x2B:
- return Keyboard::KEY_PLUS;
- case 0x3D:
- return Keyboard::KEY_EQUAL;
-
- // Numeric Symbols Row 2
- case 0x5F:
- return Keyboard::KEY_UNDERSCORE;
- case 0x5C:
- return Keyboard::KEY_BACK_SLASH;
- case 0x7C:
- return Keyboard::KEY_BAR;
- case 0x7E:
- return Keyboard::KEY_TILDE;
- case 0x3C:
- return Keyboard::KEY_LESS_THAN;
- case 0x3E:
- return Keyboard::KEY_GREATER_THAN;
- case 0x80:
- return Keyboard::KEY_EURO;
- case 0xA3:
- return Keyboard::KEY_POUND;
- case 0xA5:
- return Keyboard::KEY_YEN;
- case 0xB7:
- return Keyboard::KEY_MIDDLE_DOT;
- }
- return Keyboard::KEY_NONE;
- }
- namespace gameplay
- {
-
- extern void printError(const char* format, ...)
- {
- va_list argptr;
- va_start(argptr, format);
- vfprintf(stderr, format, argptr);
- fprintf(stderr, "\n");
- va_end(argptr);
- }
- Platform::Platform(Game* game) : _game(game)
- {
- }
- Platform::Platform(const Platform& copy)
- {
- }
- Platform::~Platform()
- {
- }
- Platform* Platform::create(Game* game)
- {
- Platform* platform = new Platform(game);
- return platform;
- }
- int Platform::enterMessagePump()
- {
- NSAutoreleasePool* pool = [[NSAutoreleasePool alloc] init];
- [AppDelegate load];
- UIApplicationMain(0, nil, NSStringFromClass([AppDelegate class]), NSStringFromClass([AppDelegate class]));
- [pool release];
- return EXIT_SUCCESS;
- }
-
- void Platform::signalShutdown()
- {
- // Cannot 'exit' an iOS Application
- assert(false);
- [__view stopUpdating];
- exit(0);
- }
-
- unsigned int Platform::getDisplayWidth()
- {
- return WINDOW_WIDTH;
- }
- unsigned int Platform::getDisplayHeight()
- {
- return WINDOW_HEIGHT;
- }
- long Platform::getAbsoluteTime()
- {
- __timeAbsolute = getMachTimeInMilliseconds();
- return __timeAbsolute;
- }
- void Platform::setAbsoluteTime(long time)
- {
- __timeAbsolute = time;
- }
- bool Platform::isVsync()
- {
- return __vsync;
- }
- void Platform::setVsync(bool enable)
- {
- __vsync = enable;
- }
- int Platform::getOrientationAngle()
- {
- return 0;
- }
- void Platform::getAccelerometerValues(float* pitch, float* roll)
- {
- [__appDelegate getAccelerometerPitch:pitch roll:roll];
- }
- void Platform::setMultiTouch(bool enabled)
- {
- __view.multipleTouchEnabled = enabled;
- }
- bool Platform::isMultiTouch()
- {
- return __view.multipleTouchEnabled;
- }
- void Platform::swapBuffers()
- {
- if (__view)
- [__view swapBuffers];
- }
- void Platform::displayKeyboard(bool display)
- {
- if(__view)
- {
- if(display)
- {
- [__view showKeyboard];
- }
- else
- {
- [__view dismissKeyboard];
- }
- }
- }
-
- void Platform::touchEventInternal(Touch::TouchEvent evt, int x, int y, unsigned int contactIndex)
- {
- if (!Form::touchEventInternal(evt, x, y, contactIndex))
- {
- Game::getInstance()->touchEvent(evt, x, y, contactIndex);
- }
- }
- void Platform::keyEventInternal(Keyboard::KeyEvent evt, int key)
- {
- gameplay::Game::getInstance()->keyEvent(evt, key);
- Form::keyEventInternal(evt, key);
- }
-
- void Platform::sleep(long ms)
- {
- usleep(ms * 1000);
- }
-
- }
- #endif
|