|
|
@@ -7,6 +7,7 @@
|
|
|
|
|
|
#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>
|
|
|
@@ -20,36 +21,23 @@ using namespace gameplay;
|
|
|
static const float ACCELEROMETER_X_FACTOR = 90.0f / WINDOW_WIDTH;
|
|
|
static const float ACCELEROMETER_Y_FACTOR = 90.0f / WINDOW_HEIGHT;
|
|
|
|
|
|
+@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;
|
|
|
-static int __lx;
|
|
|
-static int __ly;
|
|
|
-static bool __hasMouse = false;
|
|
|
-static bool __leftMouseDown = false;
|
|
|
-static bool __rightMouseDown = false;
|
|
|
-static bool __shiftDown = false;
|
|
|
-
|
|
|
|
|
|
-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));
|
|
|
-}
|
|
|
|
|
|
+long getMachTimeInMilliseconds();
|
|
|
+int getKey(unichar keyCode);
|
|
|
|
|
|
-@interface View : UIView
|
|
|
+@interface View : UIView <UIKeyInput>
|
|
|
{
|
|
|
EAGLContext* context;
|
|
|
CADisplayLink* displayLink;
|
|
|
@@ -69,9 +57,16 @@ long getMachTimeInMilliseconds()
|
|
|
- (void)startUpdating;
|
|
|
- (void)stopUpdating;
|
|
|
- (void)update:(id)sender;
|
|
|
+- (void)setSwapInterval:(NSInteger)interval;
|
|
|
+- (int)swapInterval;
|
|
|
+
|
|
|
+- (BOOL)showKeyboard;
|
|
|
+- (BOOL)dismissKeyboard;
|
|
|
+@end
|
|
|
+
|
|
|
+@interface View (Private)
|
|
|
- (void)createFramebuffer;
|
|
|
- (void)deleteFramebuffer;
|
|
|
-
|
|
|
@end
|
|
|
|
|
|
|
|
|
@@ -137,11 +132,10 @@ long getMachTimeInMilliseconds()
|
|
|
|
|
|
_game = Game::getInstance();
|
|
|
__timeStart = getMachTimeInMilliseconds();
|
|
|
- _game->run(WINDOW_WIDTH, WINDOW_HEIGHT); // TODO: Handle based on current orientation
|
|
|
+ _game->run(WINDOW_WIDTH, WINDOW_HEIGHT); // TODO: Handle based on current orientation
|
|
|
}
|
|
|
return self;
|
|
|
}
|
|
|
-
|
|
|
- (void) dealloc
|
|
|
{
|
|
|
_game->exit();
|
|
|
@@ -153,6 +147,18 @@ long getMachTimeInMilliseconds()
|
|
|
[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
|
|
|
@@ -263,19 +269,47 @@ long getMachTimeInMilliseconds()
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-- (void) layoutSubviews
|
|
|
+- (BOOL)showKeyboard {
|
|
|
+ return [self becomeFirstResponder];
|
|
|
+}
|
|
|
+- (BOOL)dismissKeyboard {
|
|
|
+ return [self resignFirstResponder];
|
|
|
+}
|
|
|
+
|
|
|
+/*
|
|
|
+ * Virtual Keyboard Support
|
|
|
+ */
|
|
|
+- (void)insertText:(NSString *)text
|
|
|
{
|
|
|
- [self deleteFramebuffer];
|
|
|
+ if([text length] == 0) return;
|
|
|
+ assert([text length] == 1);
|
|
|
+ unichar c = [text characterAtIndex:0];
|
|
|
+ int gpk = getKey(c);
|
|
|
+ Game::getInstance()->keyEvent(Keyboard::KEY_PRESS, gpk);
|
|
|
+ Game::getInstance()->keyEvent(Keyboard::KEY_RELEASE, gpk);
|
|
|
+}
|
|
|
+- (void)deleteBackward
|
|
|
+{
|
|
|
+ Game::getInstance()->keyEvent(Keyboard::KEY_PRESS, Keyboard::KEY_BACKSPACE);
|
|
|
+ Game::getInstance()->keyEvent(Keyboard::KEY_RELEASE, Keyboard::KEY_BACKSPACE);
|
|
|
+}
|
|
|
+- (BOOL)hasText
|
|
|
+{
|
|
|
+ return YES;
|
|
|
}
|
|
|
|
|
|
+/*
|
|
|
+ * Touch Support
|
|
|
+ */
|
|
|
- (void)touchesBegan:(NSSet*)touches withEvent:(UIEvent*)event
|
|
|
{
|
|
|
unsigned int uniqueTouch = 0;
|
|
|
for(UITouch *t in touches)
|
|
|
{
|
|
|
- CGPoint touchLoc = [t locationInView:nil];
|
|
|
- // TODO: Handle this based on orientation
|
|
|
- Game::getInstance()->touchEvent(Touch::TOUCH_PRESS, touchLoc.y, WINDOW_WIDTH - touchLoc.x, uniqueTouch);
|
|
|
+ CGPoint touchLoc = [t locationInView:self];
|
|
|
+ if(self.multipleTouchEnabled == YES)
|
|
|
+ uniqueTouch = [t hash];
|
|
|
+ Game::getInstance()->touchEvent(Touch::TOUCH_PRESS, touchLoc.x, touchLoc.y, uniqueTouch);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
@@ -284,9 +318,10 @@ long getMachTimeInMilliseconds()
|
|
|
unsigned int uniqueTouch = 0;
|
|
|
for(UITouch* t in touches)
|
|
|
{
|
|
|
- CGPoint touchLoc = [t locationInView:nil];
|
|
|
- // TODO: Handle this based on orientation
|
|
|
- Game::getInstance()->touchEvent(Touch::TOUCH_RELEASE, touchLoc.y, WINDOW_WIDTH - touchLoc.x, uniqueTouch);
|
|
|
+ CGPoint touchLoc = [t locationInView:self];
|
|
|
+ if(self.multipleTouchEnabled == YES)
|
|
|
+ uniqueTouch = [t hash];
|
|
|
+ Game::getInstance()->touchEvent(Touch::TOUCH_RELEASE, touchLoc.x, touchLoc.y, uniqueTouch);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
@@ -298,13 +333,13 @@ long getMachTimeInMilliseconds()
|
|
|
|
|
|
- (void)touchesMoved:(NSSet*)touches withEvent:(UIEvent*)event
|
|
|
{
|
|
|
- unsigned
|
|
|
- int uniqueTouch = 0;
|
|
|
+ unsigned int uniqueTouch = 0;
|
|
|
for(UITouch* t in touches)
|
|
|
{
|
|
|
- CGPoint touchLoc = [t locationInView:nil];
|
|
|
- // TODO: Handle this based on orientation
|
|
|
- Game::getInstance()->touchEvent(Touch::TOUCH_MOVE, touchLoc.y, WINDOW_WIDTH - touchLoc.x, uniqueTouch);
|
|
|
+ CGPoint touchLoc = [t locationInView:self];
|
|
|
+ if(self.multipleTouchEnabled == YES)
|
|
|
+ uniqueTouch = [t hash];
|
|
|
+ Game::getInstance()->touchEvent(Touch::TOUCH_MOVE, touchLoc.x, touchLoc.y, uniqueTouch);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
@@ -345,7 +380,7 @@ long getMachTimeInMilliseconds()
|
|
|
self.view = [[[View alloc] init] autorelease];
|
|
|
if(__view == nil)
|
|
|
{
|
|
|
- __view = self.view;
|
|
|
+ __view = (View*)self.view;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
@@ -368,10 +403,11 @@ long getMachTimeInMilliseconds()
|
|
|
@end
|
|
|
|
|
|
|
|
|
-@interface AppDelegate : UIApplication <UIApplicationDelegate, UIAccelerometerDelegate>
|
|
|
+@interface AppDelegate : UIApplication <UIApplicationDelegate>
|
|
|
{
|
|
|
UIWindow* window;
|
|
|
ViewController* viewController;
|
|
|
+ CMMotionManager *motionManager;
|
|
|
}
|
|
|
@end
|
|
|
|
|
|
@@ -380,11 +416,17 @@ long getMachTimeInMilliseconds()
|
|
|
|
|
|
- (BOOL)application:(UIApplication*)application didFinishLaunchingWithOptions:(NSDictionary*)launchOptions
|
|
|
{
|
|
|
+ __appDelegate = self;
|
|
|
[UIApplication sharedApplication].statusBarHidden = YES;
|
|
|
- UIAccelerometer* accelerometer = [UIAccelerometer sharedAccelerometer];
|
|
|
- accelerometer.updateInterval = 1 / 40.0; // 40Hz
|
|
|
- accelerometer.delegate = self;
|
|
|
+
|
|
|
|
|
|
+ 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];
|
|
|
@@ -392,15 +434,23 @@ long getMachTimeInMilliseconds()
|
|
|
return YES;
|
|
|
}
|
|
|
|
|
|
-
|
|
|
-- (void)accelerometer:(UIAccelerometer *)accelerometer didAccelerate:(UIAcceleration *)acceleration
|
|
|
+- (void)getAccelerometerPitch:(float *)pitch roll:(float *)roll
|
|
|
{
|
|
|
- UIAccelerationValue x, y, z;
|
|
|
- x = acceleration.x;
|
|
|
- y = acceleration.y;
|
|
|
- z = acceleration.z;
|
|
|
+ float p = 0.0f;
|
|
|
+ float r = 0.0f;
|
|
|
+ CMAccelerometerData *accelerometerData = motionManager.accelerometerData;
|
|
|
+ if(accelerometerData != nil)
|
|
|
+ {
|
|
|
+ float tx, ty, tz;
|
|
|
+ tx = accelerometerData.acceleration.y;
|
|
|
+ ty = -accelerometerData.acceleration.x;
|
|
|
+ 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;
|
|
|
+ }
|
|
|
|
|
|
- // Do something with the values.
|
|
|
+ if(pitch != NULL) *pitch = p;
|
|
|
+ if(roll != NULL) *roll = r;
|
|
|
}
|
|
|
|
|
|
- (void)applicationWillResignActive:(UIApplication*)application
|
|
|
@@ -433,11 +483,238 @@ long getMachTimeInMilliseconds()
|
|
|
[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
|
|
|
{
|
|
|
@@ -507,8 +784,7 @@ namespace gameplay
|
|
|
|
|
|
void Platform::getAccelerometerValues(float* pitch, float* roll)
|
|
|
{
|
|
|
- *pitch = __pitch;
|
|
|
- *roll = __roll;
|
|
|
+ [__appDelegate getAccelerometerPitch:pitch roll:roll];
|
|
|
}
|
|
|
|
|
|
void Platform::setMultiTouch(bool enabled)
|
|
|
@@ -527,6 +803,13 @@ namespace gameplay
|
|
|
[[__view getContext] presentRenderbuffer:GL_RENDERBUFFER];
|
|
|
}
|
|
|
|
|
|
+ void displayKeyboard(bool display) {
|
|
|
+ if(__view) {
|
|
|
+ if(display) [__view showKeyboard];
|
|
|
+ else [__view dismissKeyboard];
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
}
|
|
|
|
|
|
#endif
|