|
|
@@ -28,28 +28,16 @@ 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,11 +269,38 @@ 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;
|
|
|
@@ -438,6 +471,232 @@ long getMachTimeInMilliseconds()
|
|
|
|
|
|
@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
|
|
|
{
|