Преглед на файлове

Updated iOS Port with Virtual Keyboard Support
- NOTE: Did not implement the platform override as it does not appear to exist yet, instead implemented objective-c methods that the C++ Platform object can call
- Added extra keys as supported on the iOS Virtual Keyboard (Euro, Yen, Pound)

Brandon Slack преди 14 години
родител
ревизия
61b2a08de1
променени са 3 файла, в които са добавени 290 реда и са изтрити 29 реда
  1. 6 8
      gameplay/gameplay.xcodeproj/project.pbxproj
  2. 5 1
      gameplay/src/Keyboard.h
  3. 279 20
      gameplay/src/PlatformiOS.mm

+ 6 - 8
gameplay/gameplay.xcodeproj/project.pbxproj

@@ -484,6 +484,9 @@
 		5B04C5F714BFE50B00EB0071 /* QuartzCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QuartzCore.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS5.0.sdk/System/Library/Frameworks/QuartzCore.framework; sourceTree = DEVELOPER_DIR; };
 		5B04C5F914BFE51000EB0071 /* OpenGLES.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = OpenGLES.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS5.0.sdk/System/Library/Frameworks/OpenGLES.framework; sourceTree = DEVELOPER_DIR; };
 		5B04C5FB14BFE51600EB0071 /* OpenAL.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = OpenAL.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS5.0.sdk/System/Library/Frameworks/OpenAL.framework; sourceTree = DEVELOPER_DIR; };
+		5B3383A214C5181E000DC4F8 /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = Library/Frameworks/UIKit.framework; sourceTree = DEVELOPER_DIR; };
+		5B3383A414C5181E000DC4F8 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = Library/Frameworks/Foundation.framework; sourceTree = DEVELOPER_DIR; };
+		5B3383A614C5181E000DC4F8 /* CoreGraphics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreGraphics.framework; path = Library/Frameworks/CoreGraphics.framework; sourceTree = DEVELOPER_DIR; };
 		5B43D17914C3497B008A5D9D /* CoreGraphics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreGraphics.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS5.0.sdk/System/Library/Frameworks/CoreGraphics.framework; sourceTree = DEVELOPER_DIR; };
 		5B5ADCE214C22DF900AC6109 /* libz.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libz.dylib; path = SDKs/MacOSX10.7.sdk/usr/lib/libz.dylib; sourceTree = DEVELOPER_DIR; };
 		5B5ADCE414C22E1F00AC6109 /* libz.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libz.dylib; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS5.0.sdk/usr/lib/libz.dylib; sourceTree = DEVELOPER_DIR; };
@@ -540,7 +543,6 @@
 		4234D98A14686BB6003031B3 = {
 			isa = PBXGroup;
 			children = (
-				5BE64DE414C4FABD00DD7397 /* iOSTest */,
 				4234D9A314686C52003031B3 /* src */,
 				427D4F42147DC8DE0076760E /* Libraries */,
 				42CCD4AF146D811D00353661 /* Frameworks */,
@@ -587,6 +589,9 @@
 			children = (
 				5B04C5FE14BFE52F00EB0071 /* Mac OS X */,
 				5B04C5FD14BFE52300EB0071 /* iOS */,
+				5B3383A214C5181E000DC4F8 /* UIKit.framework */,
+				5B3383A414C5181E000DC4F8 /* Foundation.framework */,
+				5B3383A614C5181E000DC4F8 /* CoreGraphics.framework */,
 			);
 			name = Frameworks;
 			sourceTree = "<group>";
@@ -812,13 +817,6 @@
 			name = "Mac OS X";
 			sourceTree = "<group>";
 		};
-		5BE64DE414C4FABD00DD7397 /* iOSTest */ = {
-			isa = PBXGroup;
-			children = (
-			);
-			name = iOSTest;
-			sourceTree = "<group>";
-		};
 /* End PBXGroup section */
 
 /* Begin PBXHeadersBuildPhase section */

+ 5 - 1
gameplay/src/Keyboard.h

@@ -182,7 +182,11 @@ public:
         KEY_LEFT_BRACE,
         KEY_BAR,
         KEY_RIGHT_BRACE,
-        KEY_TILDE
+        KEY_TILDE,
+        KEY_EURO, 
+        KEY_POUND,
+        KEY_YEN,
+        KEY_MIDDLE_DOT
     };
 
 private:

+ 279 - 20
gameplay/src/PlatformiOS.mm

@@ -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
 {