diff --git a/game/main_code.cpp b/game/main_code.cpp index 7133518..9fc5c4f 100644 --- a/game/main_code.cpp +++ b/game/main_code.cpp @@ -249,11 +249,11 @@ void TAndroidApplication::LoadResources() TextureNamesToLoad.push_back(std::pair(CONST_TAP_TO_CONTINUE_BTN_TEXTURE + ".png", CONST_TAP_TO_CONTINUE_BTN_TEXTURE)); TextureNamesToLoad.push_back(std::pair(CONST_CREDITS_TEXTURE + ".png", CONST_CREDITS_TEXTURE)); -#ifdef TARGET_IOS +/*#ifdef TARGET_IOS ResourceManager->SoundManager.LoadMusicLooped("level1ogg.ogg"); #else ResourceManager->SoundManager.LoadMusic("level1ogg.ogg"); -#endif +#endif*/ ResourceManager->FontManager.AddFont("droid_sans14", "droid_sans14_font_bitmap.png", "droid_sans14_font_charmap.txt"); ResourceManager->FontManager.PushFont("droid_sans14"); @@ -403,7 +403,7 @@ void TAndroidApplication::InnerUpdate(cardinal dt) void TAndroidApplication::GoFromMenuToGame(int level) { //#ifndef TARGET_IOS - ResourceManager->SoundManager.PlayMusicLooped("level1ogg.ogg"); + //ResourceManager->SoundManager.PlayMusicLooped("level1ogg.ogg"); //#endif GameLevel.FillWithFile(ST::PathToResources + "level"+tostr(level+1)+".txt"); @@ -418,7 +418,7 @@ void TAndroidApplication::GoFromMenuToGame(int level) void TAndroidApplication::GoFromGameToMenu() { //#ifndef TARGET_IOS - ResourceManager->SoundManager.StopMusic("level1ogg.ogg"); + //ResourceManager->SoundManager.StopMusic("level1ogg.ogg"); //#endif TrySaveGame(); DisapplySignalsToGame(); diff --git a/ios/Splash-landscape-568h@2x.png b/ios/Splash-landscape-568h@2x.png new file mode 100644 index 0000000..0891b7a Binary files /dev/null and b/ios/Splash-landscape-568h@2x.png differ diff --git a/ios/doublehitballs.xcodeproj/project.pbxproj b/ios/doublehitballs.xcodeproj/project.pbxproj index fed9cda..5f235f9 100755 --- a/ios/doublehitballs.xcodeproj/project.pbxproj +++ b/ios/doublehitballs.xcodeproj/project.pbxproj @@ -14,8 +14,6 @@ 4C49B2C615B0991B003512CD /* OpenGLES.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4C49B2C515B0991B003512CD /* OpenGLES.framework */; }; 4C49B2CC15B0991B003512CD /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 4C49B2CA15B0991B003512CD /* InfoPlist.strings */; }; 4C49B2CE15B0991B003512CD /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C49B2CD15B0991B003512CD /* main.m */; }; - 4C49B2D215B0991B003512CD /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C49B2D115B0991B003512CD /* AppDelegate.m */; }; - 4C49B2D915B0991B003512CD /* ViewController.mm in Sources */ = {isa = PBXBuildFile; fileRef = 4C49B2D815B0991B003512CD /* ViewController.mm */; }; 4C49B2DC15B0991B003512CD /* ViewController_iPhone.xib in Resources */ = {isa = PBXBuildFile; fileRef = 4C49B2DA15B0991B003512CD /* ViewController_iPhone.xib */; }; 4C49B2DF15B0991B003512CD /* ViewController_iPad.xib in Resources */ = {isa = PBXBuildFile; fileRef = 4C49B2DD15B0991B003512CD /* ViewController_iPad.xib */; }; 4C4C807515BA8F460037C6CE /* libsquirrel.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4C4C807415BA8F460037C6CE /* libsquirrel.a */; }; @@ -28,16 +26,30 @@ 4C77831315BABD68003D5142 /* libvorbis-tremor-ios.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4C77831215BABD68003D5142 /* libvorbis-tremor-ios.a */; }; 4C77831815BABE26003D5142 /* AudioToolbox.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4C77831415BABD8B003D5142 /* AudioToolbox.framework */; }; 4C77831915BABE26003D5142 /* OpenAL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4C77831515BABD8B003D5142 /* OpenAL.framework */; }; - 4C7AD44C15B1D77700A599F6 /* ios_api.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4C7AD44B15B1D77700A599F6 /* ios_api.cpp */; }; 4C7FBF53165C1CDF008C1538 /* libboost.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4C7FBF52165C1CDF008C1538 /* libboost.a */; }; 4CCC0ECC15B30D6B005432FB /* CustomGLKView.mm in Sources */ = {isa = PBXBuildFile; fileRef = 4CCC0ECB15B30D6B005432FB /* CustomGLKView.mm */; }; 4CE6A9D215B2F979006A3965 /* assets in Resources */ = {isa = PBXBuildFile; fileRef = 4CE6A9D115B2F979006A3965 /* assets */; }; - 4CE6A9DE15B2F99F006A3965 /* creditscode.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4CE6A9D315B2F99F006A3965 /* creditscode.cpp */; }; - 4CE6A9DF15B2F99F006A3965 /* gamecode.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4CE6A9D615B2F99F006A3965 /* gamecode.cpp */; }; - 4CE6A9E015B2F99F006A3965 /* loadingcode.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4CE6A9D815B2F99F006A3965 /* loadingcode.cpp */; }; - 4CE6A9E115B2F99F006A3965 /* main_code.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4CE6A9DA15B2F99F006A3965 /* main_code.cpp */; }; - 4CE6A9E215B2F99F006A3965 /* menucode.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4CE6A9DC15B2F99F006A3965 /* menucode.cpp */; }; 4CF8746E16B64E00009B1214 /* libSalmon Engine.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4CF8746D16B64DF4009B1214 /* libSalmon Engine.a */; }; + 746ADA611E2E13FF0027C9B8 /* Splash-landscape-568h@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 746ADA601E2E13FF0027C9B8 /* Splash-landscape-568h@2x.png */; }; + 74F3D7E61E2E261300BAA9A5 /* creditscode.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 74F3D7E51E2E261300BAA9A5 /* creditscode.cpp */; }; + 74F3D7EA1E2E262A00BAA9A5 /* gamecode.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 74F3D7E91E2E262A00BAA9A5 /* gamecode.cpp */; }; + 74F3D7ED1E2E263600BAA9A5 /* loadingcode.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 74F3D7EC1E2E263600BAA9A5 /* loadingcode.cpp */; }; + 74F3D7F01E2E264000BAA9A5 /* main_code.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 74F3D7EF1E2E264000BAA9A5 /* main_code.cpp */; }; + 74F3D7F31E2E264700BAA9A5 /* menucode.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 74F3D7F21E2E264700BAA9A5 /* menucode.cpp */; }; + 74F3D7F91E2E26A400BAA9A5 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74F3D7F81E2E26A400BAA9A5 /* AppDelegate.swift */; }; + 74F3D7FB1E2E26AE00BAA9A5 /* CustomGLKView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74F3D7FA1E2E26AE00BAA9A5 /* CustomGLKView.swift */; }; + 74F3D7FD1E2E26B500BAA9A5 /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74F3D7FC1E2E26B500BAA9A5 /* ViewController.swift */; }; + 74F3D8001E2E26C900BAA9A5 /* SENamespaceWrapper.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 74F3D7FF1E2E26C900BAA9A5 /* SENamespaceWrapper.cpp */; }; + 74F3D8011E2E271500BAA9A5 /* creditscode.h in Sources */ = {isa = PBXBuildFile; fileRef = 74F3D7E71E2E261D00BAA9A5 /* creditscode.h */; }; + 74F3D8021E2E271500BAA9A5 /* game_area_interface.h in Sources */ = {isa = PBXBuildFile; fileRef = 74F3D7E81E2E262400BAA9A5 /* game_area_interface.h */; }; + 74F3D8031E2E271500BAA9A5 /* gamecode.h in Sources */ = {isa = PBXBuildFile; fileRef = 74F3D7EB1E2E263100BAA9A5 /* gamecode.h */; }; + 74F3D8041E2E271500BAA9A5 /* loadingcode.h in Sources */ = {isa = PBXBuildFile; fileRef = 74F3D7EE1E2E263A00BAA9A5 /* loadingcode.h */; }; + 74F3D8051E2E271500BAA9A5 /* main_code.h in Sources */ = {isa = PBXBuildFile; fileRef = 74F3D7F11E2E264300BAA9A5 /* main_code.h */; }; + 74F3D8061E2E271500BAA9A5 /* menucode.h in Sources */ = {isa = PBXBuildFile; fileRef = 74F3D7F41E2E264C00BAA9A5 /* menucode.h */; }; + 74F3D8071E2E271500BAA9A5 /* ios_api.h in Sources */ = {isa = PBXBuildFile; fileRef = 4CCC0ECD15B310FB005432FB /* ios_api.h */; }; + 74F3D8081E2E271500BAA9A5 /* SENamespaceWrapper.h in Sources */ = {isa = PBXBuildFile; fileRef = 74F3D7FE1E2E26C000BAA9A5 /* SENamespaceWrapper.h */; }; + 74F3D8091E2E271500BAA9A5 /* CustomGLKView.h in Sources */ = {isa = PBXBuildFile; fileRef = 4CCC0ECA15B30D6A005432FB /* CustomGLKView.h */; }; + 74F3D80A1E2E271500BAA9A5 /* doublehitballs-Bridging-Header.h in Sources */ = {isa = PBXBuildFile; fileRef = 74F3D7F51E2E269200BAA9A5 /* doublehitballs-Bridging-Header.h */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -68,10 +80,6 @@ 4C49B2CB15B0991B003512CD /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = ""; }; 4C49B2CD15B0991B003512CD /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; 4C49B2CF15B0991B003512CD /* doublehitballs-Prefix.pch */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "doublehitballs-Prefix.pch"; sourceTree = ""; }; - 4C49B2D015B0991B003512CD /* AppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = ""; }; - 4C49B2D115B0991B003512CD /* AppDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AppDelegate.m; sourceTree = ""; }; - 4C49B2D715B0991B003512CD /* ViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ViewController.h; sourceTree = ""; }; - 4C49B2D815B0991B003512CD /* ViewController.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; path = ViewController.mm; sourceTree = ""; }; 4C49B2DB15B0991B003512CD /* en */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = en; path = en.lproj/ViewController_iPhone.xib; sourceTree = ""; }; 4C49B2DE15B0991B003512CD /* en */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = en; path = en.lproj/ViewController_iPad.xib; sourceTree = ""; }; 4C4C807415BA8F460037C6CE /* libsquirrel.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libsquirrel.a; path = "../../libs/SQUIRREL2_1_1_sqplus/build-ios/ios-device/libsquirrel.a"; sourceTree = ""; }; @@ -84,25 +92,31 @@ 4C77831215BABD68003D5142 /* libvorbis-tremor-ios.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = "libvorbis-tremor-ios.a"; path = "../../libs/vorbis-tremor-ios/build-ios/ios-device/libvorbis-tremor-ios.a"; sourceTree = ""; }; 4C77831415BABD8B003D5142 /* AudioToolbox.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AudioToolbox.framework; path = System/Library/Frameworks/AudioToolbox.framework; sourceTree = SDKROOT; }; 4C77831515BABD8B003D5142 /* OpenAL.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = OpenAL.framework; path = System/Library/Frameworks/OpenAL.framework; sourceTree = SDKROOT; }; - 4C7AD44B15B1D77700A599F6 /* ios_api.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ios_api.cpp; sourceTree = ""; }; 4C7C584A15C31E6500CAE4F4 /* libboost.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libboost.a; path = "../../libs/boost_1_47_0/build-ios/ios-simulator/libboost.a"; sourceTree = ""; }; 4C7FBF52165C1CDF008C1538 /* libboost.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libboost.a; path = "../../../libs/boost_1_52_0/build-ios/ios-device/libboost.a"; sourceTree = ""; }; 4CCC0ECA15B30D6A005432FB /* CustomGLKView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CustomGLKView.h; sourceTree = ""; }; 4CCC0ECB15B30D6B005432FB /* CustomGLKView.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = CustomGLKView.mm; sourceTree = ""; }; 4CCC0ECD15B310FB005432FB /* ios_api.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ios_api.h; sourceTree = ""; }; 4CE6A9D115B2F979006A3965 /* assets */ = {isa = PBXFileReference; lastKnownFileType = folder; name = assets; path = ../assets; sourceTree = ""; }; - 4CE6A9D315B2F99F006A3965 /* creditscode.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = creditscode.cpp; path = ../../jni/creditscode.cpp; sourceTree = ""; }; - 4CE6A9D415B2F99F006A3965 /* creditscode.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = creditscode.h; path = ../../jni/creditscode.h; sourceTree = ""; }; - 4CE6A9D515B2F99F006A3965 /* game_area_interface.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = game_area_interface.h; path = ../../jni/game_area_interface.h; sourceTree = ""; }; - 4CE6A9D615B2F99F006A3965 /* gamecode.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = gamecode.cpp; path = ../../jni/gamecode.cpp; sourceTree = ""; }; - 4CE6A9D715B2F99F006A3965 /* gamecode.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = gamecode.h; path = ../../jni/gamecode.h; sourceTree = ""; }; - 4CE6A9D815B2F99F006A3965 /* loadingcode.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = loadingcode.cpp; path = ../../jni/loadingcode.cpp; sourceTree = ""; }; - 4CE6A9D915B2F99F006A3965 /* loadingcode.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = loadingcode.h; path = ../../jni/loadingcode.h; sourceTree = ""; }; - 4CE6A9DA15B2F99F006A3965 /* main_code.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = main_code.cpp; path = ../../jni/main_code.cpp; sourceTree = ""; }; - 4CE6A9DB15B2F99F006A3965 /* main_code.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = main_code.h; path = ../../jni/main_code.h; sourceTree = ""; }; - 4CE6A9DC15B2F99F006A3965 /* menucode.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = menucode.cpp; path = ../../jni/menucode.cpp; sourceTree = ""; }; - 4CE6A9DD15B2F99F006A3965 /* menucode.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = menucode.h; path = ../../jni/menucode.h; sourceTree = ""; }; 4CF8746516B64DF3009B1214 /* Salmon Engine.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = "Salmon Engine.xcodeproj"; path = "../../Engine/iOS/Salmon Engine/Salmon Engine.xcodeproj"; sourceTree = ""; }; + 746ADA601E2E13FF0027C9B8 /* Splash-landscape-568h@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "Splash-landscape-568h@2x.png"; sourceTree = ""; }; + 74F3D7E51E2E261300BAA9A5 /* creditscode.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = creditscode.cpp; sourceTree = ""; }; + 74F3D7E71E2E261D00BAA9A5 /* creditscode.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = creditscode.h; sourceTree = ""; }; + 74F3D7E81E2E262400BAA9A5 /* game_area_interface.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = game_area_interface.h; sourceTree = ""; }; + 74F3D7E91E2E262A00BAA9A5 /* gamecode.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = gamecode.cpp; sourceTree = ""; }; + 74F3D7EB1E2E263100BAA9A5 /* gamecode.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = gamecode.h; sourceTree = ""; }; + 74F3D7EC1E2E263600BAA9A5 /* loadingcode.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = loadingcode.cpp; sourceTree = ""; }; + 74F3D7EE1E2E263A00BAA9A5 /* loadingcode.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = loadingcode.h; sourceTree = ""; }; + 74F3D7EF1E2E264000BAA9A5 /* main_code.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = main_code.cpp; sourceTree = ""; }; + 74F3D7F11E2E264300BAA9A5 /* main_code.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = main_code.h; sourceTree = ""; }; + 74F3D7F21E2E264700BAA9A5 /* menucode.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = menucode.cpp; sourceTree = ""; }; + 74F3D7F41E2E264C00BAA9A5 /* menucode.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = menucode.h; sourceTree = ""; }; + 74F3D7F51E2E269200BAA9A5 /* doublehitballs-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "doublehitballs-Bridging-Header.h"; sourceTree = ""; }; + 74F3D7F81E2E26A400BAA9A5 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; + 74F3D7FA1E2E26AE00BAA9A5 /* CustomGLKView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CustomGLKView.swift; sourceTree = ""; }; + 74F3D7FC1E2E26B500BAA9A5 /* ViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ViewController.swift; sourceTree = ""; }; + 74F3D7FE1E2E26C000BAA9A5 /* SENamespaceWrapper.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SENamespaceWrapper.h; sourceTree = ""; }; + 74F3D7FF1E2E26C900BAA9A5 /* SENamespaceWrapper.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = SENamespaceWrapper.cpp; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -171,16 +185,15 @@ children = ( 4CE6A9E315B2F9A4006A3965 /* DoubleHitBalls */, 4CCC0ECD15B310FB005432FB /* ios_api.h */, - 4C7AD44B15B1D77700A599F6 /* ios_api.cpp */, - 4C49B2D015B0991B003512CD /* AppDelegate.h */, - 4C49B2D115B0991B003512CD /* AppDelegate.m */, - 4C49B2D715B0991B003512CD /* ViewController.h */, - 4C49B2D815B0991B003512CD /* ViewController.mm */, + 74F3D7F81E2E26A400BAA9A5 /* AppDelegate.swift */, + 74F3D7FA1E2E26AE00BAA9A5 /* CustomGLKView.swift */, + 74F3D7FC1E2E26B500BAA9A5 /* ViewController.swift */, 4C49B2DA15B0991B003512CD /* ViewController_iPhone.xib */, 4C49B2DD15B0991B003512CD /* ViewController_iPad.xib */, 4C49B2C815B0991B003512CD /* Supporting Files */, 4CCC0ECA15B30D6A005432FB /* CustomGLKView.h */, 4CCC0ECB15B30D6B005432FB /* CustomGLKView.mm */, + 74F3D7F51E2E269200BAA9A5 /* doublehitballs-Bridging-Header.h */, ); path = doublehitballs; sourceTree = ""; @@ -188,6 +201,8 @@ 4C49B2C815B0991B003512CD /* Supporting Files */ = { isa = PBXGroup; children = ( + 74F3D7FE1E2E26C000BAA9A5 /* SENamespaceWrapper.h */, + 74F3D7FF1E2E26C900BAA9A5 /* SENamespaceWrapper.cpp */, 4C49B2C915B0991B003512CD /* doublehitballs-Info.plist */, 4C49B2CA15B0991B003512CD /* InfoPlist.strings */, 4C49B2CD15B0991B003512CD /* main.m */, @@ -212,6 +227,7 @@ isa = PBXGroup; children = ( 4C51D30515BB261E0077EF6A /* iTunesArtwork */, + 746ADA601E2E13FF0027C9B8 /* Splash-landscape-568h@2x.png */, 4C4C807C15BAA3550037C6CE /* Icon.png */, 4C4C807A15BAA33F0037C6CE /* Splash-landscape.png */, 4CE6A9D115B2F979006A3965 /* assets */, @@ -222,17 +238,17 @@ 4CE6A9E315B2F9A4006A3965 /* DoubleHitBalls */ = { isa = PBXGroup; children = ( - 4CE6A9D315B2F99F006A3965 /* creditscode.cpp */, - 4CE6A9D415B2F99F006A3965 /* creditscode.h */, - 4CE6A9D515B2F99F006A3965 /* game_area_interface.h */, - 4CE6A9D615B2F99F006A3965 /* gamecode.cpp */, - 4CE6A9D715B2F99F006A3965 /* gamecode.h */, - 4CE6A9D815B2F99F006A3965 /* loadingcode.cpp */, - 4CE6A9D915B2F99F006A3965 /* loadingcode.h */, - 4CE6A9DA15B2F99F006A3965 /* main_code.cpp */, - 4CE6A9DB15B2F99F006A3965 /* main_code.h */, - 4CE6A9DC15B2F99F006A3965 /* menucode.cpp */, - 4CE6A9DD15B2F99F006A3965 /* menucode.h */, + 74F3D7E51E2E261300BAA9A5 /* creditscode.cpp */, + 74F3D7E71E2E261D00BAA9A5 /* creditscode.h */, + 74F3D7E81E2E262400BAA9A5 /* game_area_interface.h */, + 74F3D7E91E2E262A00BAA9A5 /* gamecode.cpp */, + 74F3D7EB1E2E263100BAA9A5 /* gamecode.h */, + 74F3D7EC1E2E263600BAA9A5 /* loadingcode.cpp */, + 74F3D7EE1E2E263A00BAA9A5 /* loadingcode.h */, + 74F3D7EF1E2E264000BAA9A5 /* main_code.cpp */, + 74F3D7F11E2E264300BAA9A5 /* main_code.h */, + 74F3D7F21E2E264700BAA9A5 /* menucode.cpp */, + 74F3D7F41E2E264C00BAA9A5 /* menucode.h */, ); name = DoubleHitBalls; sourceTree = ""; @@ -272,7 +288,13 @@ 4C49B2B015B0991B003512CD /* Project object */ = { isa = PBXProject; attributes = { - LastUpgradeCheck = 0430; + LastUpgradeCheck = 0820; + TargetAttributes = { + 4C49B2B815B0991B003512CD = { + DevelopmentTeam = R89DR83966; + LastSwiftMigration = 0820; + }; + }; }; buildConfigurationList = 4C49B2B315B0991B003512CD /* Build configuration list for PBXProject "doublehitballs" */; compatibilityVersion = "Xcode 3.2"; @@ -316,6 +338,7 @@ 4C49B2DC15B0991B003512CD /* ViewController_iPhone.xib in Resources */, 4C49B2DF15B0991B003512CD /* ViewController_iPad.xib in Resources */, 4CE6A9D215B2F979006A3965 /* assets in Resources */, + 746ADA611E2E13FF0027C9B8 /* Splash-landscape-568h@2x.png in Resources */, 4C4C807B15BAA33F0037C6CE /* Splash-landscape.png in Resources */, 4C4C807D15BAA3550037C6CE /* Icon.png in Resources */, 4C51D30615BB261E0077EF6A /* iTunesArtwork in Resources */, @@ -329,16 +352,27 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( + 74F3D8011E2E271500BAA9A5 /* creditscode.h in Sources */, + 74F3D8021E2E271500BAA9A5 /* game_area_interface.h in Sources */, + 74F3D8031E2E271500BAA9A5 /* gamecode.h in Sources */, + 74F3D8041E2E271500BAA9A5 /* loadingcode.h in Sources */, + 74F3D8051E2E271500BAA9A5 /* main_code.h in Sources */, + 74F3D8061E2E271500BAA9A5 /* menucode.h in Sources */, + 74F3D8071E2E271500BAA9A5 /* ios_api.h in Sources */, + 74F3D8081E2E271500BAA9A5 /* SENamespaceWrapper.h in Sources */, + 74F3D8091E2E271500BAA9A5 /* CustomGLKView.h in Sources */, + 74F3D80A1E2E271500BAA9A5 /* doublehitballs-Bridging-Header.h in Sources */, + 74F3D7FD1E2E26B500BAA9A5 /* ViewController.swift in Sources */, 4C49B2CE15B0991B003512CD /* main.m in Sources */, - 4C49B2D215B0991B003512CD /* AppDelegate.m in Sources */, - 4C49B2D915B0991B003512CD /* ViewController.mm in Sources */, - 4C7AD44C15B1D77700A599F6 /* ios_api.cpp in Sources */, - 4CE6A9DE15B2F99F006A3965 /* creditscode.cpp in Sources */, - 4CE6A9DF15B2F99F006A3965 /* gamecode.cpp in Sources */, - 4CE6A9E015B2F99F006A3965 /* loadingcode.cpp in Sources */, - 4CE6A9E115B2F99F006A3965 /* main_code.cpp in Sources */, - 4CE6A9E215B2F99F006A3965 /* menucode.cpp in Sources */, + 74F3D8001E2E26C900BAA9A5 /* SENamespaceWrapper.cpp in Sources */, + 74F3D7F31E2E264700BAA9A5 /* menucode.cpp in Sources */, + 74F3D7F91E2E26A400BAA9A5 /* AppDelegate.swift in Sources */, + 74F3D7EA1E2E262A00BAA9A5 /* gamecode.cpp in Sources */, + 74F3D7E61E2E261300BAA9A5 /* creditscode.cpp in Sources */, + 74F3D7F01E2E264000BAA9A5 /* main_code.cpp in Sources */, + 74F3D7FB1E2E26AE00BAA9A5 /* CustomGLKView.swift in Sources */, 4CCC0ECC15B30D6B005432FB /* CustomGLKView.mm in Sources */, + 74F3D7ED1E2E263600BAA9A5 /* loadingcode.cpp in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -384,12 +418,23 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; - ARCHS = "$(ARCHS_STANDARD_32_BIT)"; CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; COPY_PHASE_STRIP = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; GCC_C_LANGUAGE_STANDARD = gnu99; GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; GCC_OPTIMIZATION_LEVEL = 0; GCC_PREPROCESSOR_DEFINITIONS = ( "DEBUG=1", @@ -397,10 +442,14 @@ ); GCC_SYMBOLS_PRIVATE_EXTERN = NO; GCC_VERSION = com.apple.compilers.llvm.clang.1_0; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; GCC_WARN_ABOUT_RETURN_TYPE = YES; + GCC_WARN_UNDECLARED_SELECTOR = YES; GCC_WARN_UNINITIALIZED_AUTOS = YES; + GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 5.1; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + ONLY_ACTIVE_ARCH = YES; SDKROOT = iphoneos; TARGETED_DEVICE_FAMILY = "1,2"; }; @@ -410,16 +459,29 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; - ARCHS = "$(ARCHS_STANDARD_32_BIT)"; CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; COPY_PHASE_STRIP = YES; + ENABLE_STRICT_OBJC_MSGSEND = YES; GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_NO_COMMON_BLOCKS = YES; GCC_VERSION = com.apple.compilers.llvm.clang.1_0; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; GCC_WARN_ABOUT_RETURN_TYPE = YES; + GCC_WARN_UNDECLARED_SELECTOR = YES; GCC_WARN_UNINITIALIZED_AUTOS = YES; + GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 5.1; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; OTHER_CFLAGS = "-DNS_BLOCK_ASSERTIONS=1"; SDKROOT = iphoneos; TARGETED_DEVICE_FAMILY = "1,2"; @@ -432,6 +494,8 @@ buildSettings = { CLANG_CXX_LANGUAGE_STANDARD = "c++0x"; CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + DEVELOPMENT_TEAM = R89DR83966; GCC_INLINES_ARE_PRIVATE_EXTERN = NO; GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREFIX_HEADER = "doublehitballs/doublehitballs-Prefix.pch"; @@ -452,7 +516,8 @@ "$(LibsPath)/vorbis-tremor-ios/vorbis", ); INFOPLIST_FILE = "doublehitballs/doublehitballs-Info.plist"; - IPHONEOS_DEPLOYMENT_TARGET = 5.0; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; LIBRARY_SEARCH_PATHS = ( "$(inherited)", "\"$(SRCROOT)/../../../libs/boost_1_52_0/build-ios/ios-simulator\"", @@ -475,7 +540,11 @@ "$(LibsPath)/vorbis-tremor-ios/build-ios/ios-simulator", "$(LibsPath)/jpeg-9/build-ios/ios-simulator", ); + PRODUCT_BUNDLE_IDENTIFIER = fishrungames.doublehitballs; PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_OBJC_BRIDGING_HEADER = "doublehitballs/doublehitballs-Bridging-Header.h"; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 3.0; SYMROOT = build; TARGETED_DEVICE_FAMILY = 1; USER_HEADER_SEARCH_PATHS = ""; @@ -488,6 +557,8 @@ buildSettings = { CLANG_CXX_LANGUAGE_STANDARD = "c++0x"; CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + DEVELOPMENT_TEAM = R89DR83966; GCC_INLINES_ARE_PRIVATE_EXTERN = NO; GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREFIX_HEADER = "doublehitballs/doublehitballs-Prefix.pch"; @@ -507,7 +578,8 @@ "$(LibsPath)/vorbis-tremor-ios/vorbis", ); INFOPLIST_FILE = "doublehitballs/doublehitballs-Info.plist"; - IPHONEOS_DEPLOYMENT_TARGET = 5.0; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; LIBRARY_SEARCH_PATHS = ( "$(inherited)", "\"$(SRCROOT)/../../../libs/boost_1_52_0/build-ios/ios-simulator\"", @@ -530,7 +602,10 @@ "$(LibsPath)/vorbis-tremor-ios/build-ios/ios-simulator", "$(LibsPath)/jpeg-9/build-ios/ios-simulator", ); + PRODUCT_BUNDLE_IDENTIFIER = fishrungames.doublehitballs; PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_OBJC_BRIDGING_HEADER = "doublehitballs/doublehitballs-Bridging-Header.h"; + SWIFT_VERSION = 3.0; TARGETED_DEVICE_FAMILY = 1; USER_HEADER_SEARCH_PATHS = ""; WRAPPER_EXTENSION = app; diff --git a/ios/doublehitballs/AppDelegate.h b/ios/doublehitballs/AppDelegate.h deleted file mode 100755 index 4237984..0000000 --- a/ios/doublehitballs/AppDelegate.h +++ /dev/null @@ -1,19 +0,0 @@ -// -// AppDelegate.h -// doublehitballs -// -// Created by vvv ооо on 13.07.12. -// Copyright (c) 2012 __MyCompanyName__. All rights reserved. -// - -#import - -@class ViewController; - -@interface AppDelegate : UIResponder - -@property (strong, nonatomic) UIWindow *window; - -@property (strong, nonatomic) ViewController *viewController; - -@end diff --git a/ios/doublehitballs/AppDelegate.m b/ios/doublehitballs/AppDelegate.m deleted file mode 100755 index 1283115..0000000 --- a/ios/doublehitballs/AppDelegate.m +++ /dev/null @@ -1,59 +0,0 @@ -// -// AppDelegate.m -// doublehitballs -// -// Created by vvv ооо on 13.07.12. -// Copyright (c) 2012 __MyCompanyName__. All rights reserved. -// - -#import "AppDelegate.h" - -#import "ViewController.h" - -@implementation AppDelegate - -@synthesize window = _window; -@synthesize viewController = _viewController; - -- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions -{ - self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; - // Override point for customization after application launch. - if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPhone) { - self.viewController = [[ViewController alloc] initWithNibName:@"ViewController_iPhone" bundle:nil]; - } else { - self.viewController = [[ViewController alloc] initWithNibName:@"ViewController_iPad" bundle:nil]; - } - self.window.rootViewController = self.viewController; - [self.window makeKeyAndVisible]; - return YES; -} - -- (void)applicationWillResignActive:(UIApplication *)application -{ - // Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state. - // Use this method to pause ongoing tasks, disable timers, and throttle down OpenGL ES frame rates. Games should use this method to pause the game. -} - -- (void)applicationDidEnterBackground:(UIApplication *)application -{ - // Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later. - // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits. -} - -- (void)applicationWillEnterForeground:(UIApplication *)application -{ - // Called as part of the transition from the background to the inactive state; here you can undo many of the changes made on entering the background. -} - -- (void)applicationDidBecomeActive:(UIApplication *)application -{ - // Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface. -} - -- (void)applicationWillTerminate:(UIApplication *)application -{ - // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:. -} - -@end diff --git a/ios/doublehitballs/AppDelegate.swift b/ios/doublehitballs/AppDelegate.swift new file mode 100644 index 0000000..22abb53 --- /dev/null +++ b/ios/doublehitballs/AppDelegate.swift @@ -0,0 +1,31 @@ +// +// AppDelegate.swift +// salmontemplate +// +// Created by Роберт Хайреев on 16/01/2017. +// +// + +import Foundation +import UIKit + +@UIApplicationMain +class AppDelegate: UIResponder, UIApplicationDelegate { + + var window: UIWindow? + var viewController: UIViewController? + + func applicationDidFinishLaunching(_ application: UIApplication) { + window = UIWindow(frame: UIScreen.main.bounds) + + if UIDevice.current.userInterfaceIdiom == .phone { + viewController = ViewController(nibName: "ViewController_iPhone", bundle: nil) + } else { + viewController = ViewController(nibName: "ViewController_iPad", bundle: nil) + } + + window?.rootViewController = viewController + window?.makeKeyAndVisible() + } + +} diff --git a/ios/doublehitballs/CustomGLKView.swift b/ios/doublehitballs/CustomGLKView.swift new file mode 100644 index 0000000..c071e34 --- /dev/null +++ b/ios/doublehitballs/CustomGLKView.swift @@ -0,0 +1,95 @@ +// +// CustomGLKView.swift +// salmontemplate +// +// Created by Роберт Хайреев on 16/01/2017. +// +// + +import Foundation +import GLKit + +struct TTouchHashData { + var first: CGPoint! + var second: Bool! + var number: Int! +} + + + +class GLKViewTemplate: GLKView { + + var touchDict: [UITouch: TTouchHashData] = [:] + + override init(frame: CGRect) { + super.init(frame: frame) + isMultipleTouchEnabled = true + } + + required init?(coder aDecoder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + func addTouchToHash(touch: UITouch) { + let data = TTouchHashData() + touchDict[touch] = data + touchDict[touch]?.first = touch.location(in: self) + touchDict[touch]?.second = false + + for n in 0...255 { + var nExists = false + + for i in touchDict.values { + if i.number == n { + nExists = true + } + } + + if !nExists { + touchDict[touch]?.number = n + } + + } + + } + + func removeTouchFromHash(touch: UITouch) { + + } + + override func touchesBegan(_ touches: Set, with event: UIEvent?) { + for touch in touches { + let location = touch.location(in: self) + let prevLocation = touch.previousLocation(in: self) + + if abs(touchDict[touch]!.first!.x - location.x) > 10 || abs(touchDict[touch]!.first!.y - location.y) > 10 { + touchDict[touch]?.second = true + } + + let number = Int32(touchDict[touch]!.number) + + SE_AppOnScroll(Int32(Float(prevLocation.x) - Float(location.x)), -Int32(Float(prevLocation.y) - Float(location.y)), number) + } + } + + override func touchesEnded(_ touches: Set, with event: UIEvent?) { + for touch in touches { + let location = touch.location(in: self) + let number = Int32(touchDict[touch]!.number) + + if touchDict[touch]!.second == true { + SE_AppOnTapUpAfterMove(Int32(location.x), Int32(bounds.size.height - location.y), number) + } else { + SE_AppOnTapUp(Int32(location.x), Int32(bounds.size.height - location.y), number) + } + touchDict.removeValue(forKey: touch) + } + } + + override func touchesCancelled(_ touches: Set, with event: UIEvent?) { + for touch in touches { + touchDict.removeValue(forKey: touch) + } + } + +} diff --git a/ios/doublehitballs/SENamespaceWrapper.cpp b/ios/doublehitballs/SENamespaceWrapper.cpp new file mode 100644 index 0000000..d16ac9d --- /dev/null +++ b/ios/doublehitballs/SENamespaceWrapper.cpp @@ -0,0 +1,60 @@ +// +// SENamespaceWrapper.hpp +// salmontemplate +// +// Created by Роберт Хайреев on 16/01/2017. +// +// + +#include "include/Utils/Utils.h" + +//#import "include/Utils/IosApi/ObjC/ViewControllerTemplate.h" +#include "include/Utils/IosApi/IosWrapper.h" +#include "SENamespaceWrapper.h" + + +namespace SE { + void SetKeyboardText(const char* newText); + void OnKeyboardHide(); +} + + //TApplication *app = NULL; +void SE_AppDeinit() { + SE::AppDeinit(); +} + +void SE_AppUpdate(int dt) { + SE::AppUpdate(dt); +} + +void SE_AppDraw() { + SE::AppDraw(); +} + +void SE_AppOnTapDown(int posx, int posy, int touchNumber) { + SE::AppOnTapDown(posx, posy, touchNumber); +} + +void SE_AppOnTapUp(int posx, int posy, int touchNumber) { + SE::AppOnTapUp(posx, posy, touchNumber); +} + +void SE_AppOnTapUpAfterMove(int posx, int posy, int touchNumber) { + SE::AppOnTapUpAfterMove(posx, posy, touchNumber); +} + +void SE_AppOnScroll(int shiftx, int shifty, int touchNumber) { + SE::AppOnScroll(shiftx, shifty, touchNumber); +} + +void SE_AppOnScale(float scale) { + SE::AppOnScale(scale); +} + +void SE_SetKeyboardText(const char* newText) { + SE::SetKeyboardText(newText); +} + +void SE_OnKeyboardHide() { + SE::OnKeyboardHide(); +} diff --git a/ios/doublehitballs/SENamespaceWrapper.h b/ios/doublehitballs/SENamespaceWrapper.h new file mode 100644 index 0000000..8490729 --- /dev/null +++ b/ios/doublehitballs/SENamespaceWrapper.h @@ -0,0 +1,33 @@ +// +// SENamespaceWrapper.hpp +// salmontemplate +// +// Created by Роберт Хайреев on 16/01/2017. +// +// + +#ifndef SENamespace_h +#define SENamespace_h + +#ifdef __cplusplus +extern "C" { +#endif + //void SE_CreateEngine(); + //void SE_DestroyEngine(); + //TApplication *app = NULL; + void SE_AppDeinit(); + void SE_AppUpdate(int dt); + void SE_AppDraw(); + void SE_AppOnTapDown(int posx, int posy, int touchNumber); + void SE_AppOnTapUp(int posx, int posy, int touchNumber); + void SE_AppOnTapUpAfterMove(int posx, int posy, int touchNumber); + void SE_AppOnScroll(int shiftx, int shifty, int touchNumber); + void SE_AppOnScale(float scale); + void SE_SetKeyboardText(const char* newText); + void SE_OnKeyboardHide(); +#ifdef __cplusplus +} //end extern "C" +#endif + +#endif /* SENamespace_h */ + diff --git a/ios/doublehitballs/ViewController.h b/ios/doublehitballs/ViewController.h deleted file mode 100755 index 38eb6ac..0000000 --- a/ios/doublehitballs/ViewController.h +++ /dev/null @@ -1,15 +0,0 @@ -// -// ViewController.h -// doublehitballs -// -// Created by vvv ооо on 13.07.12. -// Copyright (c) 2012 __MyCompanyName__. All rights reserved. -// - - -#import "include/Utils/IosApi/ObjC/ViewControllerTemplate.h" - -@interface ViewController : ViewControllerTemplate - -@end - diff --git a/ios/doublehitballs/ViewController.mm b/ios/doublehitballs/ViewController.mm deleted file mode 100755 index c2b6f76..0000000 --- a/ios/doublehitballs/ViewController.mm +++ /dev/null @@ -1,20 +0,0 @@ -#import "ViewController.h" -#import "ios_api.h" - - -@implementation ViewController - - -- (void) appInitCaller -{ - CustomAppInit(); -} - -- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation -{ - return UIInterfaceOrientationIsLandscape(interfaceOrientation); -} - - - -@end \ No newline at end of file diff --git a/ios/doublehitballs/ViewController.swift b/ios/doublehitballs/ViewController.swift new file mode 100644 index 0000000..3d39c86 --- /dev/null +++ b/ios/doublehitballs/ViewController.swift @@ -0,0 +1,113 @@ +// +// ViewController.swift +// salmontemplate +// +// Created by Роберт Хайреев on 16/01/2017. +// +// + +import UIKit +import GLKit + +class ViewControllerTemplate: GLKViewController, UITextFieldDelegate { + + public var hiddenTextField: UITextField? + private var context: EAGLContext? + private var effect: GLKBaseEffect? + + override func viewDidLoad() { + super.viewDidLoad() + + guard let context = EAGLContext(api: .openGLES2) else { + print("Failed to create ES context") + return + } + + self.context = context + let view: GLKView = self.view as! GLKView + view.context = self.context! + view.drawableDepthFormat = .format24 + + //defaultView = view + + setupGL() + + let recognizer = UIPinchGestureRecognizer(target: self, action: #selector(respondToPinch(gestureRecognizer:))) + recognizer.delaysTouchesEnded = false + + view.addGestureRecognizer(recognizer) + view.isMultipleTouchEnabled = true + + hiddenTextField = UITextField(frame: CGRect(x: -200, y: -200, width: 0, height: 0)) + hiddenTextField?.autocorrectionType = .no + view.addSubview(hiddenTextField!) + hiddenTextField?.delegate = self + NotificationCenter.default.addObserver(self, selector: #selector(onReceiveKeyboardNotification(notification:)), name: .UITextFieldTextDidChange, object: nil) + } + + deinit { + tearDownGL() + } + + func setupGL() { + EAGLContext.setCurrent(context) + appInitCaller() + } + + func tearDownGL() { + EAGLContext.setCurrent(context) + SE_AppDeinit() + } + + func appInitCaller() { + // CustomAppInit() + } + + func respondToPinch(gestureRecognizer: UIPinchGestureRecognizer) { + SE_AppOnScale(Float(gestureRecognizer.scale)) + } + + func onReceiveKeyboardNotification(notification: NSNotification) { + if notification.name == .UITextFieldTextDidChange { + let textField = notification.object as! UITextField + let text = textField.text + SE_SetKeyboardText(text) + } + } + + func textFieldDidBeginEditing(_ textField: UITextField) { + print("Begin") + } + + func textFieldDidEndEditing(_ textField: UITextField) { + print("End") + } + + func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool { + if string == "\n" { + textField.resignFirstResponder() + SE_OnKeyboardHide() + } + return true + } + + func update() { + SE_AppUpdate(Int32(self.timeSinceLastUpdate * 1000)) + } + + override func glkView(_ view: GLKView, drawIn rect: CGRect) { + SE_AppDraw() + } + +} + + +class ViewController: ViewControllerTemplate { + override func appInitCaller() { + CustomAppInit() + } + + override var supportedInterfaceOrientations: UIInterfaceOrientationMask { + return [.landscapeLeft, .landscapeRight] + } +} diff --git a/ios/doublehitballs/creditscode.cpp b/ios/doublehitballs/creditscode.cpp new file mode 100644 index 0000000..3e0e010 --- /dev/null +++ b/ios/doublehitballs/creditscode.cpp @@ -0,0 +1,79 @@ +#include "creditscode.h" +#include "include/Engine.h" + +#include "main_code.h" + +const int TGameCredits::CONST_STATE_APPEARING = 0; +const int TGameCredits::CONST_STATE_APPEARED = 1; +const int TGameCredits::CONST_STATE_DISAPPEARING = 2; +const int TGameCredits::CONST_STATE_DISAPPEARED = 3; + +const float TGameCredits::CONST_APPEAR_TIME = 150.f; + +TGameCredits::TGameCredits() + : TGameAreaAncestor() + , StateTimer(0) + , State(CONST_STATE_DISAPPEARED) +{ +} + +void TGameCredits::Draw() +{ + + float transparency = StateTimer/CONST_APPEAR_TIME; + + + RenderUniform1f("Transparency", transparency); + + glBindTexture(GL_TEXTURE_2D,ResourceManager->TexList["main_menu_bkg_left"]); + Renderer->DrawRect(vec2(0, 0.f), vec2(480.f, 320.f)); + + const vec2 creditsPos(140.f, 130.f); + + const vec2 creditsHalfSize(128.f, 128.f); + + glBindTexture(GL_TEXTURE_2D,ResourceManager->TexList[CONST_CREDITS_TEXTURE]); + Renderer->DrawRect(creditsPos-creditsHalfSize, creditsPos+creditsHalfSize); + + glBindTexture(GL_TEXTURE_2D,ResourceManager->TexList[CONST_LOGO_SMALL_TEXTURE]); + Renderer->DrawRect(vec2(240.f-128.f+15.f, 320.f-64.f), vec2(240.f+128.f+15.f, 320.f)); + + CheckGlError("Draw TGameCredits"); +} + +void TGameCredits::Update(cardinal dt) +{ + if (State == CONST_STATE_APPEARING) + { + StateTimer += dt; + if (StateTimer >= CONST_APPEAR_TIME) + { + StateTimer = CONST_APPEAR_TIME; + State = CONST_STATE_APPEARED; + } + } + else if (State == CONST_STATE_DISAPPEARING) + { + StateTimer -= dt; + if (StateTimer <= 0.f) + { + StateTimer = 0.f; + State = CONST_STATE_DISAPPEARED; + } + } +} + +void TGameCredits::OnTapDown(vec2 p) +{ + Application->GoFromCreditsToMenu(); +} + +void TGameCredits::StartAppear() +{ + State = CONST_STATE_APPEARING; +} + +void TGameCredits::StartDisappear() +{ + State = CONST_STATE_DISAPPEARING; +} diff --git a/ios/doublehitballs/creditscode.h b/ios/doublehitballs/creditscode.h new file mode 100644 index 0000000..e77114b --- /dev/null +++ b/ios/doublehitballs/creditscode.h @@ -0,0 +1,34 @@ +#ifndef CREDITSCODE_H_INCLUDED +#define CREDITSCODE_H_INCLUDED + +#include "game_area_interface.h" + +using namespace SE; + + +class TGameCredits : public TGameAreaAncestor +{ + static const int CONST_STATE_APPEARING; + static const int CONST_STATE_APPEARED; + static const int CONST_STATE_DISAPPEARING; + static const int CONST_STATE_DISAPPEARED; + static const float CONST_APPEAR_TIME; + + + int State; + float StateTimer; + +public: + + TGameCredits(); + + virtual void Draw(); + virtual void Update(cardinal dt); + virtual void OnTapDown(vec2 p); + + void StartAppear(); + void StartDisappear(); +}; + + +#endif diff --git a/ios/doublehitballs/doublehitballs-Bridging-Header.h b/ios/doublehitballs/doublehitballs-Bridging-Header.h new file mode 100644 index 0000000..1e78104 --- /dev/null +++ b/ios/doublehitballs/doublehitballs-Bridging-Header.h @@ -0,0 +1,6 @@ +// +// Use this file to import your target's public headers that you would like to expose to Swift. +// + +#include "SENamespaceWrapper.h" +#include "ios_api.h" diff --git a/ios/doublehitballs/doublehitballs-Info.plist b/ios/doublehitballs/doublehitballs-Info.plist index 2e15839..6ba4026 100755 --- a/ios/doublehitballs/doublehitballs-Info.plist +++ b/ios/doublehitballs/doublehitballs-Info.plist @@ -1,50 +1,50 @@ - - - - - CFBundleDevelopmentRegion - en - CFBundleDisplayName - 2x Hit Balls - CFBundleExecutable - ${EXECUTABLE_NAME} - CFBundleIconFile - Icon.png - CFBundleIdentifier - fishrungames.doublehitballs - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - ${PRODUCT_NAME} - CFBundlePackageType - APPL - CFBundleShortVersionString - 1.0 - CFBundleSignature - ???? - CFBundleVersion - 1.0 - LSRequiresIPhoneOS - - UILaunchImageFile - Splash-landscape.png - UIPrerenderedIcon - - UIRequiredDeviceCapabilities - - armv7 - - UIStatusBarHidden - - UISupportedInterfaceOrientations - - UIInterfaceOrientationLandscapeLeft - UIInterfaceOrientationLandscapeRight - - UISupportedInterfaceOrientations~ipad - - UIInterfaceOrientationLandscapeLeft - UIInterfaceOrientationLandscapeRight - - - + + + + + CFBundleDevelopmentRegion + en + CFBundleDisplayName + 2x Hit Balls + CFBundleExecutable + ${EXECUTABLE_NAME} + CFBundleIconFile + Icon.png + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + ${PRODUCT_NAME} + CFBundlePackageType + APPL + CFBundleShortVersionString + 1.0 + CFBundleSignature + ???? + CFBundleVersion + 1.0 + LSRequiresIPhoneOS + + UILaunchImageFile + Splash-landscape.png + UIPrerenderedIcon + + UIRequiredDeviceCapabilities + + armv7 + + UIStatusBarHidden + + UISupportedInterfaceOrientations + + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + UISupportedInterfaceOrientations~ipad + + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + + diff --git a/ios/doublehitballs/game_area_interface.h b/ios/doublehitballs/game_area_interface.h new file mode 100644 index 0000000..2a549af --- /dev/null +++ b/ios/doublehitballs/game_area_interface.h @@ -0,0 +1,23 @@ +#ifndef GAME_AREA_INTERFACE_H_INCLUDED +#define GAME_AREA_INTERFACE_H_INCLUDED + +#include "include/Engine.h" + +using namespace SE; + + +class TGameAreaAncestor +{ +public: + virtual void Draw() { } + virtual void Update(cardinal) { } + virtual void OnTapUp(vec2) { } + virtual void OnTapDown(vec2) { } + virtual void OnFling(vec2) { } + virtual void OnScroll(vec2) { } + + virtual ~TGameAreaAncestor() { } //By default destructor is not virtual +}; + + +#endif diff --git a/ios/doublehitballs/gamecode.cpp b/ios/doublehitballs/gamecode.cpp new file mode 100644 index 0000000..8bee1b9 --- /dev/null +++ b/ios/doublehitballs/gamecode.cpp @@ -0,0 +1,1560 @@ +#include "gamecode.h" +#include "main_code.h" + +const int CONST_LEVELSTATE_STANDBY = 0; +const int CONST_LEVELSTATE_PLAYING = 1; +const int CONST_LEVELSTATE_GO_TO_PAUSE = 2; +const int CONST_LEVELSTATE_PAUSE = 3; +const int CONST_LEVELSTATE_LOADING = 4; +const int CONST_LEVELSTATE_NODRAW = 5; +const int CONST_LEVELSTATE_FINISH_FREEZE = 6; +const int CONST_LEVELSTATE_FINISHED = 7; + +const float CONST_TIMER_LOADING = 150.f; + +const float CONST_PAUSE_APPEAR_TIME = 150.f; + +const float CONST_FINISH_FREEZE_TIME = 1000.f; +const float CONST_FINISHING_TIME = 250.f; + +const float CONST_BALL_VELOCITY = 200.f; + +const vec2 CONST_SLIDE_UP_POS(240.f, 64.f); + +const vec2 CONST_TAP_TO_CONTINUE_POS(240.f, 200.f); + +bool operator<(const PairColorTexture& p1, const PairColorTexture& p2) +{ + if (p1.second == p2.second) + { + if (p1.first.v[0] == p2.first.v[0]) + { + if (p1.first.v[1] == p2.first.v[1]) + { + if (p1.first.v[2] == p2.first.v[2]) + { + return p1.first.v[3] < p2.first.v[3]; + } + else + { + return p1.first.v[2] < p2.first.v[2]; + } + } + else + { + return p1.first.v[1] < p2.first.v[1]; + } + } + else + { + return p1.first.v[0] < p2.first.v[0]; + } + } + + return (p1.second < p2.second); +} + + +TBrick::TBrick() + : State(CONST_BRICKSTATE_VISIBLE) + , StateTimer(0.f) + , Color(vec4(0.f, 0.f, 0.f, 1.f)) + , Locked(0) + , InitialLocked(0) +{ +} + +void TBrick::SetVisible(vec4 color, int locked) +{ + State = CONST_BRICKSTATE_VISIBLE; + Color = color; + InitialLocked = locked; + Locked = InitialLocked; +} + +void TBrick::SetInvisible() +{ + State = CONST_BRICKSTATE_INVISIBLE; +} + +void TBrick::TryDrawAppear(int ipos, int jpos) +{ + vec2 centerPos = GetPosFrom(ipos, jpos); + + vec2 blockHalfSize = vec2(0.5f*CONST_BRICK_WIDTH, 0.5f*CONST_BRICK_HEIGHT); + + std::string texName; + if (Locked == 2) + { + texName = CONST_BLOCK_TEXTURE3; + } + else if (Locked == 1) + { + texName = CONST_BLOCK_TEXTURE2; + } + else + { + texName = CONST_BLOCK_TEXTURE1; + } + + if (State == CONST_BRICKSTATE_DISAPPEAR) + { + + RenderUniform1f("Transparency", StateTimer/CONST_BRICK_DISAPPEAR_TIME); + RenderUniform4fv("BrickColor", Color.v); + glBindTexture(GL_TEXTURE_2D,ResourceManager->TexList[texName]); + Renderer->DrawRect(centerPos - blockHalfSize, centerPos + blockHalfSize); + } + else if (State == CONST_BRICKSTATE_APPEAR) + { + + RenderUniform1f("Transparency", 1.f - StateTimer/CONST_BRICK_APPEAR_TIME); + RenderUniform4fv("BrickColor", Color.v); + glBindTexture(GL_TEXTURE_2D,ResourceManager->TexList[texName]); + Renderer->DrawRect(centerPos - blockHalfSize, centerPos + blockHalfSize); + } +} + +void TBrick::Update(cardinal dt) +{ + if (State == CONST_BRICKSTATE_DISAPPEAR) + { + StateTimer -= dt; + if (StateTimer < 0.f) + { + StateTimer = 0.f; + State = CONST_BRICKSTATE_INVISIBLE; + } + } + + if (State == CONST_BRICKSTATE_APPEAR) + { + StateTimer -= dt; + if (StateTimer < 0.f) + { + StateTimer = 0.f; + State = CONST_BRICKSTATE_VISIBLE; + } + } +} + +vec4 TBrick::GetColor() +{ + return Color; +} + +vec2 TBrick::GetPosFrom(int ipos, int jpos) +{ + const vec2 BorderShift(CONST_BRICK_SHIFT_X, CONST_BRICK_SHIFT_Y); + + return BorderShift+vec2(CONST_BRICK_WIDTH*ipos + 0.5f*CONST_BRICK_WIDTH, 320.f - CONST_BRICK_HEIGHT*(jpos)-0.5f*CONST_BRICK_HEIGHT); + +} + +void TBrick::Disappear() +{ + StateTimer = CONST_BRICK_DISAPPEAR_TIME; + State = CONST_BRICKSTATE_DISAPPEAR; +} + +void TBrick::Hit() +{ + if (Locked == 0) + { + Disappear(); + } + else + { + Locked--; + } +} + +void TBrick::Appear(vec4 color, int locked) +{ + StateTimer = CONST_BRICK_APPEAR_TIME; + State = CONST_BRICKSTATE_APPEAR; + Color = color; + InitialLocked = locked; + Locked = InitialLocked; +} + +void TBrick::Appear() +{ + Appear(Color, InitialLocked); +} + +int TBrick::GetLocked() +{ + return Locked; +} + +bool TBrick::CanReact() +{ + return (State == CONST_BRICKSTATE_VISIBLE) || (State == CONST_BRICKSTATE_APPEAR); +} + +//=========================================== +//=========================================== +//=========================================== + +TBonusFalling::TBonusFalling(vec2 pos) + : BonusType(rand() % 3) + , Pos(pos) + , Lifetime(0.f) +{ + + if (BonusType == 0) + { + TexName = CONST_BONUS_MULTIPLIER_TEXTURE; + } + + if (BonusType == 1) + { + TexName = CONST_BONUS_GOTHROUGH_TEXTURE; + } + + if (BonusType == 2) + { + TexName = CONST_BONUS_FLOOR_TEXTURE; + } + +} + +vec2 TBonusFalling::GetPos() +{ + return Pos; +} + +int TBonusFalling::GetType() +{ + return BonusType; +} + + +void TBonusFalling::Draw() +{ + vec2 BonusHalfSize = vec2(16.f, 16.f); + + float transparency = min(Lifetime/CONST_BONUS_APPEAR_TIME , 1.f); + + RenderUniform4fv("BrickColor", vec4(1.0f, 1.0f, 1.0f, 1.0f).v); + RenderUniform1f("Transparency", transparency); + + glBindTexture(GL_TEXTURE_2D,ResourceManager->TexList[TexName]); + Renderer->DrawRect(Pos - BonusHalfSize, Pos + BonusHalfSize); + +} + + +void TBonusFalling::Update(cardinal dt) +{ + Lifetime += dt; + Pos.v[1] -= dt * CONST_BONUS_FALL_SPEED / 1000.f; +} + +//=========================================== +//=========================================== +//=========================================== + + +TBall::TBall(vec2 pos, vec2 velocity, vec4 color) + : Pos(pos) + , Velocity(velocity) + , Color(color) +{ + //must be 5 + TalePos.push_back(Pos); + TalePos.push_back(Pos); + TalePos.push_back(Pos); + TalePos.push_back(Pos); + TalePos.push_back(Pos); +} + +vec2 TBall::GetPos() +{ + return Pos; +} + +vec2 TBall::GetVelocityVector() +{ + return Velocity; +} + +void TBall::Go() +{ + Velocity = Normalize(vec2(2.f, 1.f)); +} + +void TBall::ReflectToLeft() +{ + if (Velocity.v[0] > 0.f) + { + Velocity.v[0] = - Velocity.v[0]; + } +} + +void TBall::ReflectToRight() +{ + if (Velocity.v[0] < 0.f) + { + Velocity.v[0] = - Velocity.v[0]; + } +} + +void TBall::ReflectToUp() +{ + if (Velocity.v[1] < 0.f) + { + Velocity.v[1] = - Velocity.v[1]; + } +} + +void TBall::ReflectToDown() +{ + if (Velocity.v[1] > 0.f) + { + Velocity.v[1] = - Velocity.v[1]; + } +} + +//function for reflector surface. +float ReflectorPlaneFunction(float shift) +{ + /* _______ + / \ + | | + Something like this + + */ + + if (shift>=-70.f && shift < -40.f) + { + float t = (shift+70.f)/30.f; //0 to 1 + return 9.f + 21.f * t; + } + + if (shift>=-40.f && shift < 40.f) + { + return 30.f; + } + + + if (shift >= 40.f && shift <= 70.f) + { + float t = (70.f - shift)/30.f; //1 to 0 + return 9.f + 21.f * t; + } + + return 0.f; +} + +void TBall::TryReflectOnReflector(vec2 refPos) +{ + const float reflectionShiftY = 13.f; + const float reflectionMaxHeight = 30.f; + + + + if ((Pos.v[1] < reflectionMaxHeight + reflectionShiftY) && Pos.v[1] > 0.0f && Velocity.v[1] < 0) + { + float dy = ReflectorPlaneFunction(Pos.v[0] - refPos.v[0]); + + if (dy > 0 && (dy + reflectionShiftY > Pos.v[1])) + { + float shift = (Pos.v[0] - refPos.v[0]) / 128.f; + shift = min(shift, 0.5f); + shift = max(shift, -0.5f); + vec2 n = Normalize(vec2(shift, 1.0f)); + + Velocity = Velocity - n * 2.f * (Velocity.v[0]*n.v[0] + Velocity.v[1]*n.v[1]); + if ((Velocity.v[1] <= 0) || (fabs(Velocity.v[0]/Velocity.v[1]) > 4.f)) + { + Velocity.v[0] = 4.f*sign(Velocity.v[0]); + Velocity.v[1] = 1.f; + Velocity = Normalize(Velocity); + } + } + } +} + + +void TBall::Update(cardinal dt) +{ + Pos += Velocity * (CONST_BALL_VELOCITY * dt / 1000.f); + + TalePos.push_back(Pos); + + if (TalePos.size() > 4) + { + TalePos.erase(TalePos.begin()); + } +} + +//=========================================== +//=========================================== +//=========================================== + + +TGameLevel::TGameLevel() +{ + + BkgTexture = "bkg"; + + RenderBufferReady = false; + PrevLevelStateIsStandby = false; + + OutScale = 1.f; + OutScaleVelocity = 0.f; + + StateTimer = 0.f; + + LevelState = CONST_LEVELSTATE_NODRAW; + + BallColor = vec4(0.2f, 0.8f, 1.0f, 1.0f); + + BonusFloorPosY = 0.f; + +} + +TGameLevel::~TGameLevel() +{ +} + + + +void TGameLevel::ReloadBlockInstansingList() +{ + std::map ConstTextureBlockMap = boost::assign::map_list_of (0,CONST_BLOCK_TEXTURE1) (1,CONST_BLOCK_TEXTURE2) (2,CONST_BLOCK_TEXTURE3); + + std::pair tempPair; + BlockInstansingList.ColorBlockList.clear(); + + for (int i=0; i>::iterator itr = BlockInstansingList.ColorBlockList.end(); + + for (auto b = BlockInstansingList.ColorBlockList.begin(); b != BlockInstansingList.ColorBlockList.end(); ++b) + { + if (b->first == tempPair) + { + itr = b; + } + } + + if (itr == BlockInstansingList.ColorBlockList.end()) + { + BlockInstansingList.ColorBlockList.push_back(std::pair(tempPair, TTriangleList())); + itr = BlockInstansingList.ColorBlockList.end(); + + itr--; + } + + vec2 posFrom = BlockMatrix[i][j].GetPosFrom(i,j) + vec2(-0.5f*CONST_BRICK_WIDTH, -0.5f*CONST_BRICK_HEIGHT); + vec2 posTo = BlockMatrix[i][j].GetPosFrom(i,j) + vec2(+0.5f*CONST_BRICK_WIDTH, +0.5f*CONST_BRICK_HEIGHT); + + itr->second.Data += MakeDataTriangleList(posFrom, posTo); + + } + } + } + + for (auto it = BlockInstansingList.ColorBlockList.begin(); it != BlockInstansingList.ColorBlockList.end(); ++it) + { + it->second.RefreshBuffer(); + } + +} + +vec2 TGameLevel::GetBlock(const vec2& pos) +{ + + int x = static_cast((pos.v[0] - CONST_BRICK_SHIFT_X) / CONST_BRICK_WIDTH); + int y = static_cast((320.0f + CONST_BRICK_SHIFT_Y - pos.v[1]) / CONST_BRICK_HEIGHT); + + if (x < 0) + x = 0; + + if (x > CONST_BRICKMATRIX_WIDTH-1) + x = CONST_BRICKMATRIX_WIDTH-1; + + if (y < 0) + y = 0; + + if (y > CONST_BRICKMATRIX_HEIGHT-1) + y = CONST_BRICKMATRIX_HEIGHT-1; + + return vec2(x, y); +} + +bool TGameLevel::TapInBackBtnArea(const vec2& pos) +{ + return (pos.v[1] > 320.f - 64.f) && (pos.v[0]>=240.f-75.f) && (pos.v[0]<=240.f+75.f); +} + +void TGameLevel::SetFinishFreeze() +{ + StateTimer = CONST_FINISH_FREEZE_TIME; + + LevelState = CONST_LEVELSTATE_FINISH_FREEZE; + +} + +void TGameLevel::SetFinished() +{ + StateTimer = CONST_FINISHING_TIME; + + LevelState = CONST_LEVELSTATE_FINISHED; + + OutScale = 1.f; +} + +vec4 TGameLevel::ParseColor(const std::string& s) +{ + vec4 r; + std::string ss(s); + + int i = ss.find(", "); + int c = toint(ss.substr(0, i)); + ss.erase(0, i+2); + r.v[0] = c / 255.f; + + i = ss.find(", "); + c = toint(ss.substr(0, i)); + ss.erase(0, i+2); + r.v[1] = c / 255.f; + + i = ss.find(", "); + c = toint(ss.substr(0, i)); + ss.erase(0, i+2); + r.v[2] = c / 255.f; + + c = toint(ss); + r.v[3] = c / 255.f; + + return r; +} + +void TGameLevel::ReloadLevel() +{ + cardinal byteCount; + boost::shared_array file = CreateMemFromFile(LevelFileName, byteCount); + std::string fileString(&file[0]); + char c; + //int n = 0; + + + std::vector rows; + int rowLen; + while (fileString.size() > 0) + { + rowLen = fileString.find(fendl); + rows.push_back(fileString.substr(0, rowLen)); + fileString.erase(0, rowLen+2); + } + + std::vector::iterator rowIterator = rows.begin(); + BallColor = ParseColor(*rowIterator); + ++rowIterator; + + std::vector colors; + + vec4 tc; + + while (*rowIterator != "Colormap") + { + tc = ParseColor(*rowIterator); + colors.push_back(tc); + ++rowIterator; + } + + std::vector::iterator rowColorIterator; + std::vector::iterator rowLockIterator; + + rowColorIterator = rowIterator + 1; + + rowLockIterator = rowColorIterator + 14; + + + + for (int j=0; jBallInBlock = GetBlock(ballPos); + BallList.begin()->PrevBallInBlock = BallList.begin()->BallInBlock; + + BonusGothroughTimer = 0.f; + BonusFloorTimer = 0.f; + + BonusFallingList.clear(); + + RenderBufferReady = false; + + ReloadBallInstancingList(); + + BonusFloorPosY = 0.f; + +} + +bool TGameLevel::IsLoaded() +{ + return (LevelState == CONST_LEVELSTATE_STANDBY); +} + +void TGameLevel::Draw() +{ + + if (LevelState == CONST_LEVELSTATE_NODRAW) + { + CheckGlError(); + return; + } + + if (LevelState == CONST_LEVELSTATE_LOADING) + { + Renderer->PushMatrix(); + float scale = 1.f - 0.5f*StateTimer/CONST_TIMER_LOADING; + if (scale < 0.5f) + scale = 0.5f; + + if (scale > 1.f) + scale = 1.f; + + Renderer->TranslateMatrix(vec3(Renderer->GetMatrixWidth() * 0.5f, Renderer->GetMatrixHeight() * 0.5f, 0)); + Renderer->ScaleMatrix(scale); + Renderer->TranslateMatrix(-vec3(Renderer->GetMatrixWidth() * 0.5f, Renderer->GetMatrixHeight() * 0.5f, 0)); + glBindTexture(GL_TEXTURE_2D,ResourceManager->TexList[LevelScreenTexture]); + Renderer->DrawRect(vec2(0, 0), vec2(480.f, 320.f)); + Renderer->PopMatrix(); + CheckGlError(); + return; + } + + + bool mustShowButtons = ((LevelState == CONST_LEVELSTATE_PAUSE) || (LevelState == CONST_LEVELSTATE_GO_TO_PAUSE)); + + bool pause = (mustShowButtons || (LevelState == CONST_LEVELSTATE_FINISHED)); + + + bool renderBufferReady = RenderBufferReady; + + if (pause && renderBufferReady) + { + + //See also below (same method) + Renderer->PushMatrix(); + Renderer->TranslateMatrix(vec3(Renderer->GetMatrixWidth() * 0.5f, Renderer->GetMatrixHeight() * 0.5f, 0)); + Renderer->ScaleMatrix(OutScale); + Renderer->TranslateMatrix(-vec3(Renderer->GetMatrixWidth() * 0.5f, Renderer->GetMatrixHeight() * 0.5f, 0)); + DrawBuffer(); + + if (mustShowButtons) + { + DrawPauseButtons(); + } + Renderer->PopMatrix(); + CheckGlError(); + return; + } + + if (pause && !renderBufferReady) + { + + Renderer->SwitchToFrameBuffer("LevelBuffer"); + Renderer->SetProjectionMatrix(480.f, 320.f); + glClearColor(0.0f, 0.0f, 0.0f, 1.0f); + glClear( GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT); + CheckGlError(); + } + + glBindTexture(GL_TEXTURE_2D,ResourceManager->TexList[BkgTexture]); + Renderer->DrawRect(vec2(0, 0), vec2(480.f, 320.f)); + + std::list::iterator iBall; + + Renderer->PushShader("BrickShader"); + + + for (int i=0; i>::iterator colorBlockIterator; + for (colorBlockIterator = BlockInstansingList.ColorBlockList.begin(); colorBlockIterator != BlockInstansingList.ColorBlockList.end(); ++colorBlockIterator) + { + RenderUniform4fv("BrickColor", colorBlockIterator->first.first.v); + glBindTexture(GL_TEXTURE_2D,ResourceManager->TexList[colorBlockIterator->first.second]); + + Renderer->DrawTriangleList(colorBlockIterator->second); + } + + std::list::iterator iBonus; + + for (iBonus = BonusFallingList.begin(); iBonus != BonusFallingList.end(); ++iBonus) + { + iBonus->Draw(); + } + + DrawBallInstancingList(); + + Renderer->PopShader(); + + + glBindTexture(GL_TEXTURE_2D,ResourceManager->TexList[CONST_REFLECTOR_TEXTURE]); + Renderer->DrawRect(vec2(-128.f, -16.f)+ReflectorPos, vec2(128.f, 16.f)+ReflectorPos); + + + const vec2 wallUpPos1(240.f-256.f, 320.f-64.f); + const vec2 wallUpPos2(240.f+256.f, 320.f); + glBindTexture(GL_TEXTURE_2D,ResourceManager->TexList[CONST_WALL_UP_TEXTURE]); + Renderer->DrawRect(wallUpPos1, wallUpPos2); + + const vec2 wallLeftPos1(0.f, 320.f - 512.f); + const vec2 wallLeftPos2(32.f, 320.f); + glBindTexture(GL_TEXTURE_2D,ResourceManager->TexList[CONST_WALL_LEFT_TEXTURE]); + Renderer->DrawRect(wallLeftPos1, wallLeftPos2); + + const vec2 wallRightPos1(480.f-32.f, 320.f - 512.f); + const vec2 wallRightPos2(480.f, 320.f); + glBindTexture(GL_TEXTURE_2D,ResourceManager->TexList[CONST_WALL_RIGHT_TEXTURE]); + Renderer->DrawRect(wallRightPos1, wallRightPos2); + + + if (BonusFloorTimer>0.f) + { + + const vec2 wallDownPos(240.f, BonusFloorPosY); + + glBindTexture(GL_TEXTURE_2D,ResourceManager->TexList[CONST_WALL_BONUS_TEXTURE]); + + Renderer->DrawRect(vec2(-256.f, -16.f)+wallDownPos, vec2(256.f, 16.f)+wallDownPos); + } + + + if (!pause) + { + RenderUniform1f("Transparency", 1.f); + glBindTexture(GL_TEXTURE_2D,ResourceManager->TexList[CONST_BACK_BTN_TEXTURE]); + const vec2 BackBtnPos(240.f, 320.f - 32.f - 20.f); + Renderer->DrawRect(vec2(-128.f, -32.f)+BackBtnPos, vec2(128.f, 32.f)+BackBtnPos); + } + + if (pause && !renderBufferReady) + { + + //ololo + //See also above (same method) + Renderer->SwitchToScreen(); + Renderer->SetFullScreenViewport(); + + Renderer->PushMatrix(); + //Renderer->LoadIdentity(); + Renderer->TranslateMatrix(vec3(Renderer->GetMatrixWidth() * 0.5f, Renderer->GetMatrixHeight() * 0.5f, 0)); + Renderer->ScaleMatrix(OutScale); + Renderer->TranslateMatrix(-vec3(Renderer->GetMatrixWidth() * 0.5f, Renderer->GetMatrixHeight() * 0.5f, 0)); + DrawBuffer(); + if (mustShowButtons) + { + DrawPauseButtons(); + } + Renderer->PopMatrix(); + RenderBufferReady = true; + CheckGlError(); + } + CheckGlError(); +} + +void TGameLevel::DrawPauseButtons() +{ + glBindTexture(GL_TEXTURE_2D,ResourceManager->TexList[CONST_SLIDE_UP_BTN_TEXTURE]); + Renderer->DrawRect(vec2(-128.f, -64.f)+CONST_SLIDE_UP_POS, vec2(128.f, 64.f)+CONST_SLIDE_UP_POS); + + glBindTexture(GL_TEXTURE_2D,ResourceManager->TexList[CONST_TAP_TO_CONTINUE_BTN_TEXTURE]); + Renderer->DrawRect(vec2(-128.f, -128.f)+CONST_TAP_TO_CONTINUE_POS, vec2(128.f, 128.f)+CONST_TAP_TO_CONTINUE_POS); + +} + +void TGameLevel::DrawBallInstancingList() +{ + RenderUniform1f("Transparency", 1.f); + RenderUniform4fv("BrickColor", BallColor.v); + + if (BonusGothroughTimer > 0.f) + { + glBindTexture(GL_TEXTURE_2D,ResourceManager->TexList[CONST_BALLGLOW_TEXTURE]); + + Renderer->DrawTriangleList(BallInstancingList.BallAndGlowList[1]); + } + + glBindTexture(GL_TEXTURE_2D,ResourceManager->TexList[CONST_BALL_TEXTURE]); + + Renderer->DrawTriangleList(BallInstancingList.BallAndGlowList[0]); + +} + +void TGameLevel::DrawBuffer() +{ + + Renderer->PushShader("FrameShader"); + float brightness; + if (CONST_LEVELSTATE_GO_TO_PAUSE) + { + brightness = 0.3f + 0.7f * StateTimer / CONST_PAUSE_APPEAR_TIME; + } + else + { + brightness = 0.3f; + } + + RenderUniform1f("Brightness", brightness); + glBindTexture(GL_TEXTURE_2D,ResourceManager->FrameManager.GetFrameTexture("LevelBuffer")); + + //Matrix switched to identity + //vec2 RectPos = vec2(-1, -1); + //vec2 RectSize = vec2(2, 2); + vec2 RectPos = vec2(240.f, 160.f); + vec2 RectSize = vec2(240.f, 160.f); + + Renderer->DrawRect(RectPos-RectSize, RectPos+RectSize); + + Renderer->PopShader(); + + CheckGlError(); +} + +void TGameLevel::SetPause() +{ + OutScaleVelocity = 0.f; + OutScale = 1.f; + RenderBufferReady = false; + LevelState = CONST_LEVELSTATE_GO_TO_PAUSE; + StateTimer = CONST_PAUSE_APPEAR_TIME; + Application->MarkSetGameLevelPause(); +} + +void TGameLevel::ReleasePause() +{ + RenderBufferReady = false; + + if (PrevLevelStateIsStandby) + { + LevelState = CONST_LEVELSTATE_STANDBY; + PrevLevelStateIsStandby = false; + } + else + { + LevelState = CONST_LEVELSTATE_PLAYING; + } + Application->MarkReleaseGameLevelPause(); +} + +bool TGameLevel::IsPaused() +{ + return ((LevelState == CONST_LEVELSTATE_PAUSE) || (LevelState == CONST_LEVELSTATE_GO_TO_PAUSE) || (LevelState == CONST_LEVELSTATE_FINISHED)); +} + +void TGameLevel::Update(cardinal dt) +{ + + if (LevelState == CONST_LEVELSTATE_NODRAW) + { + return; + } + + if (LevelState == CONST_LEVELSTATE_GO_TO_PAUSE) + { + StateTimer -= dt; + if (StateTimer <= 0.f) + { + StateTimer = 0.f; + LevelState = CONST_LEVELSTATE_PAUSE; + } + + return; + } + + if (LevelState == CONST_LEVELSTATE_PAUSE) + { + OutScale += OutScaleVelocity * dt; + TryGoToMenu(); + CheckGlError(); + return; + } + + if (LevelState == CONST_LEVELSTATE_FINISHED) + { + StateTimer -= dt; + + OutScale = StateTimer/CONST_FINISHING_TIME; + + if (StateTimer <= 0.f) + { + TryGoToMenu(); + } + CheckGlError(); + return; + } + + + if (LevelState == CONST_LEVELSTATE_LOADING) + { + StateTimer -= dt; + if (StateTimer <= 0.f) + { + StateTimer = 0.f; + RenderBufferReady = false; + LevelState = CONST_LEVELSTATE_STANDBY; + } + } + + if (LevelState == CONST_LEVELSTATE_FINISH_FREEZE) + { + StateTimer -= dt; + + if (StateTimer <= 0.f) + { + SetFinished(); + CheckGlError(); + return; + } + + //To make the whole scene like freeze + dt = static_cast(dt / max((CONST_FINISH_FREEZE_TIME-StateTimer)/100.f, 1.f)); + + } + + if (BonusGothroughTimer > 0.f) + { + BonusGothroughTimer -= dt; + BonusGothroughTimer = max(BonusGothroughTimer, 0.f); + } + + if (BonusFloorTimer > 0.f) + { + BonusFloorTimer -= dt; + BonusFloorTimer = max(BonusFloorTimer, 0.f); + } + + UpdateBallList(dt); + + + for (int i=0; i::iterator iBonus = BonusFallingList.begin(); + + while (iBonus != BonusFallingList.end()) + { + iBonus->Update(dt); + + if ((fabs(ReflectorPos.v[0] - iBonus->GetPos().v[0])GetPos().v[1])GetType(); + iBonus = BonusFallingList.erase(iBonus); + + + if (bonusType == CONST_BONUS_TYPE_GOTHROUGH) + { + BonusGothroughTimer = CONST_BONUS_GOTHROUGH_TIME; + } + else if (bonusType == CONST_BONUS_TYPE_MULTIPLIER) + { + vec2 pos = BallList.begin()->GetPos(); + vec2 velocity = BallList.begin()->GetVelocityVector(); + MultiplyBalls(pos, velocity); + } + else if (bonusType == CONST_BONUS_TYPE_FLOOR) + { + BonusFloorTimer = CONST_BONUS_FLOOR_TIME; + } + + } + else if (iBonus->GetPos().v[1] < -15.f) + { + iBonus = BonusFallingList.erase(iBonus); + } + + if (iBonus != BonusFallingList.end()) + { + ++iBonus; + } + } + + //Bonus floor pos + if (BonusFloorTimer/CONST_BONUS_GOTHROUGH_TIME < 0.2f) + { + //Bonus must go down until 0.f + if (BonusFloorPosY > 0.f) + { + BonusFloorPosY -= CONST_BONUS_FLOOR_APPEAR_SPEED * dt / 1000.f; + BonusFloorPosY = max(BonusFloorPosY, 0.f); + } + + } + else + { + //Bonus must go up until 16.f + if (BonusFloorPosY < 16.f) + { + BonusFloorPosY += CONST_BONUS_FLOOR_APPEAR_SPEED * dt / 1000.f; + BonusFloorPosY = min(BonusFloorPosY, 16.f); + } + } + + + bool noMoreBlocks = true; + + for (int i=0; iOpenNextLevel(); + Application->MarkSetGameLevelPause(); + SetFinishFreeze(); + CheckGlError(); + + } + + if (BallList.size() == 0 && LevelState != CONST_LEVELSTATE_FINISH_FREEZE) + { + SetStandBy(); + } + +} + + + +void TGameLevel::ReloadBallInstancingList() +{ + //Changing this function? Don't forget to change next one! + + BallInstancingList.BallAndGlowList.clear(); + + std::list::iterator i; + /* + vec3 p1; + vec3 p2; + vec3 p3; + vec3 p4; + + vec2 t1 = vec2(0.0f, 0.0f); + vec2 t2 = vec2(0.0f, 1.0f); + vec2 t3 = vec2(1.0f, 1.0f); + vec2 t4 = vec2(1.0f, 0.0f); + */ + + + for (i = BallList.begin(); i != BallList.end(); ++i) + { + /* + p1 = vec3(i->Pos, 0.f) + vec3(-8.f, -8.f, 0.f); + p2 = vec3(i->Pos, 0.f) + vec3(-8.f, +8.f, 0.f); + p3 = vec3(i->Pos, 0.f) + vec3(+8.f, +8.f, 0.f); + p4 = vec3(i->Pos, 0.f) + vec3(+8.f, -8.f, 0.f); + + BallInstancingList.BallAndGlowList[0].Vec3CoordArr[CONST_STRING_POSITION_ATTRIB].push_back(p1); + BallInstancingList.BallAndGlowList[0].Vec3CoordArr[CONST_STRING_POSITION_ATTRIB].push_back(p2); + BallInstancingList.BallAndGlowList[0].Vec3CoordArr[CONST_STRING_POSITION_ATTRIB].push_back(p3); + + BallInstancingList.BallAndGlowList[0].Vec3CoordArr[CONST_STRING_POSITION_ATTRIB].push_back(p3); + BallInstancingList.BallAndGlowList[0].Vec3CoordArr[CONST_STRING_POSITION_ATTRIB].push_back(p4); + BallInstancingList.BallAndGlowList[0].Vec3CoordArr[CONST_STRING_POSITION_ATTRIB].push_back(p1); + + BallInstancingList.BallAndGlowList[0].Vec2CoordArr[CONST_STRING_TEXCOORD_ATTRIB].push_back(t1); + BallInstancingList.BallAndGlowList[0].Vec2CoordArr[CONST_STRING_TEXCOORD_ATTRIB].push_back(t2); + BallInstancingList.BallAndGlowList[0].Vec2CoordArr[CONST_STRING_TEXCOORD_ATTRIB].push_back(t3); + + BallInstancingList.BallAndGlowList[0].Vec2CoordArr[CONST_STRING_TEXCOORD_ATTRIB].push_back(t3); + BallInstancingList.BallAndGlowList[0].Vec2CoordArr[CONST_STRING_TEXCOORD_ATTRIB].push_back(t4); + BallInstancingList.BallAndGlowList[0].Vec2CoordArr[CONST_STRING_TEXCOORD_ATTRIB].push_back(t1); + */ + + BallInstancingList.BallAndGlowList[0].Data += MakeDataTriangleList(i->Pos + vec2(-8.f, -8.f), i->Pos + vec2(8.f, 8.f)); + + //Replace6PointsInTriangleList(BallInstancingList.BallAndGlowList[0].Data, n, i->Pos + vec2(-8.f, -8.f), i->Pos + vec2(8.f, 8.f)); + + //n += 6; + } + + std::list::iterator j; + + for (i = BallList.begin(); i != BallList.end(); ++i) + { + for (j = i->TalePos.begin(); j != i->TalePos.end(); ++j) + { + /* + p1 = vec3(*j, 0.f) + vec3(-16.f, -16.f, 0.f); + p2 = vec3(*j, 0.f) + vec3(-16.f, +16.f, 0.f); + p3 = vec3(*j, 0.f) + vec3(+16.f, +16.f, 0.f); + p4 = vec3(*j, 0.f) + vec3(+16.f, -16.f, 0.f); + + BallInstancingList.BallAndGlowList[1].Vec3CoordArr[CONST_STRING_POSITION_ATTRIB].push_back(p1); + BallInstancingList.BallAndGlowList[1].Vec3CoordArr[CONST_STRING_POSITION_ATTRIB].push_back(p2); + BallInstancingList.BallAndGlowList[1].Vec3CoordArr[CONST_STRING_POSITION_ATTRIB].push_back(p3); + + BallInstancingList.BallAndGlowList[1].Vec3CoordArr[CONST_STRING_POSITION_ATTRIB].push_back(p3); + BallInstancingList.BallAndGlowList[1].Vec3CoordArr[CONST_STRING_POSITION_ATTRIB].push_back(p4); + BallInstancingList.BallAndGlowList[1].Vec3CoordArr[CONST_STRING_POSITION_ATTRIB].push_back(p1); + + BallInstancingList.BallAndGlowList[1].Vec2CoordArr[CONST_STRING_TEXCOORD_ATTRIB].push_back(t1); + BallInstancingList.BallAndGlowList[1].Vec2CoordArr[CONST_STRING_TEXCOORD_ATTRIB].push_back(t2); + BallInstancingList.BallAndGlowList[1].Vec2CoordArr[CONST_STRING_TEXCOORD_ATTRIB].push_back(t3); + + BallInstancingList.BallAndGlowList[1].Vec2CoordArr[CONST_STRING_TEXCOORD_ATTRIB].push_back(t3); + BallInstancingList.BallAndGlowList[1].Vec2CoordArr[CONST_STRING_TEXCOORD_ATTRIB].push_back(t4); + BallInstancingList.BallAndGlowList[1].Vec2CoordArr[CONST_STRING_TEXCOORD_ATTRIB].push_back(t1); + */ + BallInstancingList.BallAndGlowList[1].Data += MakeDataTriangleList(*j + vec2(-16.f, -16.f), *j + vec2(16.f, 16.f)); + //Replace6PointsInTriangleList(BallInstancingList.BallAndGlowList[1].Data, n, *j + vec2(-16.f, -16.f), *j + vec2(16.f, 16.f)); + + //n += 6; + } + } + + //std::map::iterator it; + + auto it = BallInstancingList.BallAndGlowList.begin(); + + for (; it != BallInstancingList.BallAndGlowList.end(); ++it) + //for (auto it = BallInstancingList.BallAndGlowList.begin(); it != BallInstancingList.BallAndGlowList.end(); ++it) + + { + it->second.RefreshBuffer(); + } + +} + +void TGameLevel::RefreshBallInstancingList() +{ + //Changing this function? Don't forget to change previous one! + /* + vec3 p1; + vec3 p2; + vec3 p3; + vec3 p4; + + vec2 t1 = vec2(0.0f, 0.0f); + vec2 t2 = vec2(0.0f, 1.0f); + vec2 t3 = vec2(1.0f, 1.0f); + vec2 t4 = vec2(1.0f, 0.0f); + */ + int n = 0; + int m = 0; + + std::list::iterator i; + + for (i = BallList.begin(); i != BallList.end(); ++i) + { + /* + p1 = vec3(i->Pos, 0.f) + vec3(-8.f, -8.f, 0.f); + p2 = vec3(i->Pos, 0.f) + vec3(-8.f, +8.f, 0.f); + p3 = vec3(i->Pos, 0.f) + vec3(+8.f, +8.f, 0.f); + p4 = vec3(i->Pos, 0.f) + vec3(+8.f, -8.f, 0.f); + + BallInstancingList.BallAndGlowList[0].Vec3CoordArr[CONST_STRING_POSITION_ATTRIB][n++] = p1; + BallInstancingList.BallAndGlowList[0].Vec3CoordArr[CONST_STRING_POSITION_ATTRIB][n++] = p2; + BallInstancingList.BallAndGlowList[0].Vec3CoordArr[CONST_STRING_POSITION_ATTRIB][n++] = p3; + + BallInstancingList.BallAndGlowList[0].Vec3CoordArr[CONST_STRING_POSITION_ATTRIB][n++] = p3; + BallInstancingList.BallAndGlowList[0].Vec3CoordArr[CONST_STRING_POSITION_ATTRIB][n++] = p4; + BallInstancingList.BallAndGlowList[0].Vec3CoordArr[CONST_STRING_POSITION_ATTRIB][n++] = p1; + + BallInstancingList.BallAndGlowList[0].Vec2CoordArr[CONST_STRING_TEXCOORD_ATTRIB][m++] = t1; + BallInstancingList.BallAndGlowList[0].Vec2CoordArr[CONST_STRING_TEXCOORD_ATTRIB][m++] = t2; + BallInstancingList.BallAndGlowList[0].Vec2CoordArr[CONST_STRING_TEXCOORD_ATTRIB][m++] = t3; + + BallInstancingList.BallAndGlowList[0].Vec2CoordArr[CONST_STRING_TEXCOORD_ATTRIB][m++] = t3; + BallInstancingList.BallAndGlowList[0].Vec2CoordArr[CONST_STRING_TEXCOORD_ATTRIB][m++] = t4; + BallInstancingList.BallAndGlowList[0].Vec2CoordArr[CONST_STRING_TEXCOORD_ATTRIB][m++] = t1; + */ + + Replace6PointsInTriangleList(BallInstancingList.BallAndGlowList[0].Data, n, i->Pos + vec2(-8.f, -8.f), i->Pos + vec2(8.f, 8.f)); + + n += 6; + } + + std::list::iterator j; + + n = 0; + m = 0; + + for (i = BallList.begin(); i != BallList.end(); ++i) + { + for (j = i->TalePos.begin(); j != i->TalePos.end(); ++j) + { + /* + p1 = vec3(*j, 0.f) + vec3(-16.f, -16.f, 0.f); + p2 = vec3(*j, 0.f) + vec3(-16.f, +16.f, 0.f); + p3 = vec3(*j, 0.f) + vec3(+16.f, +16.f, 0.f); + p4 = vec3(*j, 0.f) + vec3(+16.f, -16.f, 0.f); + + BallInstancingList.BallAndGlowList[1].Vec3CoordArr[CONST_STRING_POSITION_ATTRIB][n++] = p1; + BallInstancingList.BallAndGlowList[1].Vec3CoordArr[CONST_STRING_POSITION_ATTRIB][n++] = p2; + BallInstancingList.BallAndGlowList[1].Vec3CoordArr[CONST_STRING_POSITION_ATTRIB][n++] = p3; + + BallInstancingList.BallAndGlowList[1].Vec3CoordArr[CONST_STRING_POSITION_ATTRIB][n++] = p3; + BallInstancingList.BallAndGlowList[1].Vec3CoordArr[CONST_STRING_POSITION_ATTRIB][n++] = p4; + BallInstancingList.BallAndGlowList[1].Vec3CoordArr[CONST_STRING_POSITION_ATTRIB][n++] = p1; + + BallInstancingList.BallAndGlowList[1].Vec2CoordArr[CONST_STRING_TEXCOORD_ATTRIB][m++] = t1; + BallInstancingList.BallAndGlowList[1].Vec2CoordArr[CONST_STRING_TEXCOORD_ATTRIB][m++] = t2; + BallInstancingList.BallAndGlowList[1].Vec2CoordArr[CONST_STRING_TEXCOORD_ATTRIB][m++] = t3; + + BallInstancingList.BallAndGlowList[1].Vec2CoordArr[CONST_STRING_TEXCOORD_ATTRIB][m++] = t3; + BallInstancingList.BallAndGlowList[1].Vec2CoordArr[CONST_STRING_TEXCOORD_ATTRIB][m++] = t4; + BallInstancingList.BallAndGlowList[1].Vec2CoordArr[CONST_STRING_TEXCOORD_ATTRIB][m++] = t1;*/ + //BallInstancingList.BallAndGlowList[1].Data += MakeDataTriangleList(); + + Replace6PointsInTriangleList(BallInstancingList.BallAndGlowList[1].Data, n, *j + vec2(-16.f, -16.f), *j + vec2(16.f, 16.f)); + + n += 6; + + } + } + + std::map::iterator it; + + for (it = BallInstancingList.BallAndGlowList.begin(); it != BallInstancingList.BallAndGlowList.end(); ++it) + { + it->second.RefreshBuffer(); + } + +} + + +void TGameLevel::UpdateBallList(cardinal dt) +{ + std::list::iterator iBall; + + bool mustReloadBalls = false; + + //If not loaded - force load + if (BallInstancingList.BallAndGlowList.size() == 0) + { + mustReloadBalls = true; + } + + if (BonusFloorTimer == 0.f) + { + vec2 ballPos; + + iBall = BallList.begin(); + + while (iBall != BallList.end()) + { + ballPos = iBall->GetPos(); + + if (ballPos.v[1]<0.f) + { + iBall = BallList.erase(iBall); + mustReloadBalls = true; + } + + if (iBall != BallList.end()) + { + ++iBall; + } + } + + } + + bool blockListChanged = false; + + for (iBall = BallList.begin(); iBall != BallList.end(); ++iBall) + { + + + iBall->Update(dt); + + vec2 ballPos = iBall->GetPos(); + + + if (ballPos.v[0] > 480.f-15.f) + { + iBall->ReflectToLeft(); + } + + if (ballPos.v[0] < 15.f) + { + iBall->ReflectToRight(); + } + + if (ballPos.v[1] > 320.0f-16.f) + { + iBall->ReflectToDown(); + } + + if (BonusFloorTimer > 0.f) + { + if (ballPos.v[1] < 13.0f) + { + iBall->ReflectToUp(); + } + } + + iBall->TryReflectOnReflector(ReflectorPos); + + vec2 ipos = GetBlock(ballPos); + if (!(ipos == iBall->BallInBlock)) + { + iBall->PrevBallInBlock = iBall->BallInBlock; + iBall->BallInBlock = ipos; + + int i = static_cast(iBall->BallInBlock.v[0]); + int j = static_cast(iBall->BallInBlock.v[1]); + + int iprev = static_cast(iBall->PrevBallInBlock.v[0]); + int jprev = static_cast(iBall->PrevBallInBlock.v[1]); + + + if (BlockMatrix[i][j].CanReact()) + { + bool canThrowBonus; + + blockListChanged = true; + + if (BonusGothroughTimer > 0.f) + { + BlockMatrix[i][j].Disappear(); + canThrowBonus = true; + + } + else + { + canThrowBonus = (BlockMatrix[i][j].GetLocked() == 0); + + BlockMatrix[i][j].Hit(); + + } + + vec2 blockPos = BlockMatrix[i][j].GetPosFrom(i, j); + + + if (canThrowBonus && rand() % 20 == 0) + { + BonusFallingList.push_back(TBonusFalling(blockPos)); + } + + + if (BonusGothroughTimer == 0.f) + { + if (j < jprev) + { + iBall->ReflectToDown(); + } + else + if (j > jprev) + { + iBall->ReflectToUp(); + } + else + if (i < iprev) + { + iBall->ReflectToRight(); + } + else + if (i > iprev) + { + iBall->ReflectToLeft(); + } + } + + + } + + } + + } + + if (blockListChanged) + { + ReloadBlockInstansingList(); + } + + if (mustReloadBalls) + { + ReloadBallInstancingList(); + } + else + { + RefreshBallInstancingList(); + } +} + +void TGameLevel::MultiplyBalls(vec2 pos, vec2 velocity) +{ + mat2 r; + vec2 v; + + for (int i = -2; i<=2; i++) + { + r = mat2(i*pi/4.f); + v = r*velocity; + + v.v[1] = max(static_cast(fabs(v.v[1])), 0.2f) * sign(v.v[1]); //Prevent velocityY from being ~= 0 + + BallList.push_back(TBall(pos, v, BallColor)); + } + + ReloadBallInstancingList(); +} + + +void TGameLevel::OnTapDown(vec2 pos) +{ + if (LevelState == CONST_LEVELSTATE_STANDBY) + { + if (TapInBackBtnArea(pos)) + { + SetPause(); + PrevLevelStateIsStandby = true; + } + else + { + + LevelState = CONST_LEVELSTATE_PLAYING; + BallList.begin()->Go(); + } + } + else if (LevelState == CONST_LEVELSTATE_PLAYING) + { + + + if (TapInBackBtnArea(pos)) + { + SetPause(); + } + else if (fabs(ReflectorPos.v[0] - pos.v[0])>64.f) + { + ReflectorPos.v[0] = pos.v[0]; + } + + } + else if (LevelState == CONST_LEVELSTATE_PAUSE) + { + if (pos.v[1] > 128.f) + { + ReleasePause(); + } + } +} + +void TGameLevel::OnTapUp(vec2 pos) +{ +} + +void TGameLevel::OnFling(vec2 slideSpeed) +{ + if (LevelState == CONST_LEVELSTATE_PAUSE) + { + OutScaleVelocity = slideSpeed.v[1]/320.f; + } +} + +void TGameLevel::OnScroll(vec2 shift) +{ + const float CONST_SCROLL_SCALE = 1.1f; + if (LevelState == CONST_LEVELSTATE_PLAYING || LevelState == CONST_LEVELSTATE_STANDBY) + { + ReflectorPos.v[0] -= CONST_SCROLL_SCALE*shift.v[0]; + } + else if (LevelState == CONST_LEVELSTATE_PAUSE) + { + + + OutScale += shift.v[1]/320.f; + + TryGoToMenu(); + } +} + +void TGameLevel::TryGoToMenu() +{ + if (OutScale < 0.5f) + { + OutScale = 0.5f; + LevelState = CONST_LEVELSTATE_NODRAW; + Application->GoFromGameToMenu(); + } + if (OutScale > 1.f) + { + OutScale = 1.f; + } +} diff --git a/ios/doublehitballs/gamecode.h b/ios/doublehitballs/gamecode.h new file mode 100644 index 0000000..dc624e9 --- /dev/null +++ b/ios/doublehitballs/gamecode.h @@ -0,0 +1,205 @@ +#ifndef GAMECODE_H_INCLUDED +#define GAMECODE_H_INCLUDED + +#include "include/Engine.h" +#include "game_area_interface.h" + +#include + +using namespace SE; + + +const int CONST_BRICKSTATE_VISIBLE = 3; +const int CONST_BRICKSTATE_DISAPPEAR = 2; +const int CONST_BRICKSTATE_INVISIBLE = 1; +const int CONST_BRICKSTATE_APPEAR = 0; + +const float CONST_BRICK_DISAPPEAR_TIME = 200.f; +const float CONST_BRICK_APPEAR_TIME = 200.f; + +const int CONST_BRICKMATRIX_WIDTH = 12; +const int CONST_BRICKMATRIX_HEIGHT = 13; +const float CONST_BRICK_WIDTH = 37.5f; +const float CONST_BRICK_HEIGHT = 0.5f*CONST_BRICK_WIDTH; +const float CONST_BRICK_SHIFT_X = 15.f; +const float CONST_BRICK_SHIFT_Y = -16.f; + +const float CONST_BONUS_APPEAR_TIME = 400.f; +const float CONST_BONUS_FALL_SPEED = 100.f; +const float CONST_BONUS_GOTHROUGH_TIME = 8000.f; +const float CONST_BONUS_CATCH_DISTANCE_X = 65.f; +const float CONST_BONUS_CATCH_DISTANCE_Y = 20.f; + +const float CONST_BONUS_FLOOR_TIME = 8000.f; +const float CONST_BONUS_FLOOR_APPEAR_SPEED = 50.f; + +const int CONST_BONUS_TYPE_MULTIPLIER = 0; +const int CONST_BONUS_TYPE_GOTHROUGH = 1; +const int CONST_BONUS_TYPE_FLOOR = 2; + + +class TBrick +{ +protected: + int InitialLocked; + int Locked; //0, 1 or 2 + int State; + float StateTimer; + vec4 Color; +public: + TBrick(); + void SetVisible(vec4 color, int locked); + void SetInvisible(); + void TryDrawAppear(int ipos, int jpos); + void Update(cardinal dt); + vec2 GetPosFrom(int ipos, int jpos); + vec4 GetColor(); + void Appear(vec4 color, int locked); + void Appear(); + void Hit(); + void Disappear(); + int GetLocked(); + bool CanReact(); +}; + +class TBonusFalling +{ +protected: + float Lifetime; + vec2 Pos; + std::string TexName; + int BonusType; //0 - multiplier, 1 - Go-through, 2 - floor +public: + TBonusFalling(vec2 pos); + vec2 GetPos(); + int GetType(); + void Draw(); + void Update(cardinal dt); +}; + +struct TBall +{ + vec2 Pos; + vec2 Velocity; + vec4 Color; + std::list TalePos; + + vec2 BallInBlock; + vec2 PrevBallInBlock; + + TBall(vec2 pos, vec2 velocity, vec4 color); + vec2 GetPos(); + vec2 GetVelocityVector(); + + void Go(); + + void ReflectToLeft(); + void ReflectToRight(); + void ReflectToUp(); + void ReflectToDown(); + + void TryReflectOnReflector(vec2 refPos); + + void Update(cardinal dt); +}; + +typedef std::pair PairColorTexture; + +struct TBlockInstansingList +{ + //color-texture ---> and list of triangles for this color + std::list> ColorBlockList; +}; + + +struct TBallInstancingList +{ + std::map BallAndGlowList; +}; + +class TGameLevel : public TGameAreaAncestor +{ +protected: + std::string BkgTexture; + std::string LevelScreenTexture; + std::string LevelFileName; + + vec2 ReflectorPos; + + int LevelState; + bool PrevLevelStateIsStandby; + float StateTimer; + + TBrick BlockMatrix[CONST_BRICKMATRIX_WIDTH][CONST_BRICKMATRIX_HEIGHT]; + TBlockInstansingList BlockInstansingList; + + bool TapInBackBtnArea(const vec2& pos); + + void ReloadBlockInstansingList(); + void SetFinished(); + void SetFinishFreeze(); + + void DrawBuffer(); + void DrawPauseButtons(); + + void DrawBallInstancingList(); + + bool RenderBufferReady; + + float OutScale; + + float OutScaleVelocity; + + void TryGoToMenu(); + + std::list BonusFallingList; + + std::list BallList; + + TBallInstancingList BallInstancingList; + + vec4 BallColor; + + void ReloadBallInstancingList(); + void RefreshBallInstancingList(); + + + void UpdateBallList(cardinal dt); + void MultiplyBalls(vec2 pos, vec2 velocity); + + vec2 GetBlock(const vec2& pos); + void InitLevel(); + + float BonusGothroughTimer; + float BonusFloorTimer; + float BonusFloorPosY; + + vec4 ParseColor(const std::string& s); + void ReloadLevel(); + +public: + TGameLevel(); + ~TGameLevel(); + + void FillWithFile(const std::string& filename); + + void SetStandBy(); + void SetLoading(const std::string& bkg, const std::string& levelscreen); + bool IsLoaded(); + + virtual void Draw(); + + void SetPause(); + bool IsPaused(); + void ReleasePause(); + + virtual void Update(cardinal dt); + virtual void OnTapDown(vec2 pos); + virtual void OnTapUp(vec2 pos); + virtual void OnFling(vec2 slideSpeed); + virtual void OnScroll(vec2 shift); +}; + + + +#endif diff --git a/ios/doublehitballs/ios_api.cpp b/ios/doublehitballs/ios_api.cpp deleted file mode 100755 index 4a1606b..0000000 --- a/ios/doublehitballs/ios_api.cpp +++ /dev/null @@ -1,8 +0,0 @@ -#include "include/Engine.h" -#include "main_code.h" - - -void CustomAppInit() -{ - AppInit(480, 320); -} diff --git a/ios/doublehitballs/loadingcode.cpp b/ios/doublehitballs/loadingcode.cpp new file mode 100644 index 0000000..94f3308 --- /dev/null +++ b/ios/doublehitballs/loadingcode.cpp @@ -0,0 +1,16 @@ +#include "loadingcode.h" +#include "include/Engine.h" +#include "main_code.h" + +void TGameLoading::Draw() +{ + + glBindTexture(GL_TEXTURE_2D,ResourceManager->TexList[CONST_LOADING_TEXTURE]); + Renderer->DrawRect(vec2(240.f - 128.f, 10.f), vec2(240.f + 128.f, 10.f + 64.f)); + + glBindTexture(GL_TEXTURE_2D,ResourceManager->TexList[CONST_LOGO_SMALL_TEXTURE]); + Renderer->DrawRect(vec2(480.f - 256.f+50.f, 320.f - 64.f), vec2(480.f+50.f, 320.f)); + + CheckGlError(); + +} diff --git a/ios/doublehitballs/loadingcode.h b/ios/doublehitballs/loadingcode.h new file mode 100644 index 0000000..6ea2411 --- /dev/null +++ b/ios/doublehitballs/loadingcode.h @@ -0,0 +1,15 @@ +#ifndef LOADINGCODE_H_INCLUDED +#define LOADINGCODE_H_INCLUDED + +#include "game_area_interface.h" + +using namespace SE; + +class TGameLoading : public TGameAreaAncestor +{ +public: + virtual void Draw(); +}; + + +#endif diff --git a/ios/doublehitballs/main_code.cpp b/ios/doublehitballs/main_code.cpp new file mode 100644 index 0000000..7133518 --- /dev/null +++ b/ios/doublehitballs/main_code.cpp @@ -0,0 +1,475 @@ +#include "main_code.h" + +#include +#include +#include +#include + +#include "include/Engine.h" + +#include "menucode.h" + +#include "main_code.h" + +boost::signal OnTapUpSignal; +boost::signal OnTapDownSignal; +boost::signal OnFlingSignal; +boost::signal OnScrollSignal; + +boost::signal OnDrawSignal; + + +const std::string CONST_BLOCK_TEXTURE1 = "block1"; +const std::string CONST_BLOCK_TEXTURE2 = "block2"; +const std::string CONST_BLOCK_TEXTURE3 = "block3"; + +const std::string CONST_BONUS_GOTHROUGH_TEXTURE = "bonus_gothrough"; +const std::string CONST_BONUS_MULTIPLIER_TEXTURE = "bonus_multiplier"; +const std::string CONST_BONUS_FLOOR_TEXTURE = "bonus_floor"; + +const std::string CONST_BALL_TEXTURE = "ball"; +const std::string CONST_BALLGLOW_TEXTURE = "ball_glow"; + +const std::string CONST_REFLECTOR_TEXTURE = "reflector"; + +const std::string CONST_WALL_LEFT_TEXTURE = "wall_left"; +const std::string CONST_WALL_RIGHT_TEXTURE = "wall_right"; +const std::string CONST_WALL_UP_TEXTURE = "wall_up"; +const std::string CONST_WALL_BONUS_TEXTURE = "wall_bonus"; + +const std::string CONST_BACK_BTN_TEXTURE = "back_btn"; +const std::string CONST_SLIDE_UP_BTN_TEXTURE = "slide_up_btn"; +const std::string CONST_TAP_TO_CONTINUE_BTN_TEXTURE = "tap_to_continue_btn"; +const std::string CONST_LOADING_TEXTURE = "loading"; +const std::string CONST_LOGO_SMALL_TEXTURE = "logo_small"; +const std::string CONST_CREDITS_TEXTURE = "credits"; + +const float CONST_CREDITS_SHOW_TIME = 150.f; + +TAndroidApplication* Application; + +void TAndroidApplication::InnerInit() +{ + + Application = this; + +#ifdef TARGET_WIN32 +#ifdef NDEBUG + ST::PathToResources = "resources/"; +#else + ST::PathToResources = "../../../assets/"; +#endif +#endif + +#ifdef TARGET_IOS + ST::PathToResources = "assets/"; +#endif + + if (Console != NULL) + { + *Console<<"APP INIT\n"; + } + srand (static_cast(time(NULL))); + GameState = CONST_GAMESTATE_PRELOADING; + StateTimer = 0.f; + + + ResourceManager->ShaderManager.AddShader("DefaultShader", "shader1vertex.txt", "shader1fragment.txt"); + ResourceManager->ShaderManager.AddShader("FrameShader", "frameshader_vertex.txt", "frameshader_fragment.txt"); + ResourceManager->ShaderManager.AddShader("BrickShader", "brickshader_vertex.txt", "brickshader_fragment.txt"); + Renderer->PushShader("DefaultShader"); + + ResourceManager->TexList.AddTexture(CONST_LOADING_TEXTURE + ".png", CONST_LOADING_TEXTURE); + ResourceManager->TexList.AddTexture(CONST_LOGO_SMALL_TEXTURE + ".png", CONST_LOGO_SMALL_TEXTURE); + + ResourceManager->TexList.AddTexture("console_bkg.bmp"); + + ResourceManager->FrameManager.AddFrameRenderBuffer("LevelBuffer", 512, 512); + + OnDrawSignal.connect(boost::bind(&TGameLoading::Draw, boost::ref(GameLoading))); + Inited = true; + + Renderer->SetOrthoProjection(); + + Renderer->SetFullScreenViewport(); + + + +} + +void TAndroidApplication::InnerDeinit() +{ + Inited = false; + Loaded = false; + if (Console != NULL) + { + *Console<<"APP DEINIT\n"; + } + + OnTapUpSignal.disconnect(boost::bind(&TGameLevel::OnTapUp, boost::ref(GameLevel), _1)); + OnTapUpSignal.disconnect(boost::bind(&TGameMenu::OnTapUp, boost::ref(Menu), _1)); + + OnFlingSignal.disconnect(boost::bind(&TGameLevel::OnFling, boost::ref(GameLevel), _1)); + OnFlingSignal.disconnect(boost::bind(&TGameMenu::OnFling, boost::ref(Menu), _1)); + + OnScrollSignal.disconnect(boost::bind(&TGameLevel::OnScroll, boost::ref(GameLevel), _1)); + OnScrollSignal.disconnect(boost::bind(&TGameMenu::OnScroll, boost::ref(Menu), _1)); + + OnTapDownSignal.disconnect(boost::bind(&TGameLevel::OnTapDown, boost::ref(GameLevel), _1)); + OnTapDownSignal.disconnect(boost::bind(&TGameMenu::OnTapDown, boost::ref(Menu), _1)); + OnTapDownSignal.disconnect(boost::bind(&TGameCredits::OnTapDown, boost::ref(GameCredits), _1)); + + + OnDrawSignal.disconnect(boost::bind(&TGameLoading::Draw, boost::ref(GameLoading))); + OnDrawSignal.disconnect(boost::bind(&TGameMenu::Draw, boost::ref(Menu))); + OnDrawSignal.disconnect(boost::bind(&TGameLevel::Draw, boost::ref(GameLevel))); + OnDrawSignal.disconnect(boost::bind(&TGameCredits::Draw, boost::ref(GameCredits))); + +} + +void TAndroidApplication::InnerOnTapDown(vec2 p) +{ + OnTapDownSignal(vec2(p.v[0], p.v[1])); +} + +void TAndroidApplication::InnerOnTapUp(vec2 p) +{ + OnTapUpSignal(vec2(p.v[0], p.v[1])); +} + +void TAndroidApplication::InnerOnMove(vec2 shift) +{ + OnScrollSignal(shift); +} + +void TAndroidApplication::OnFling(vec2 v) +{ +} + + +void TAndroidApplication::ApplySignalsToMenu() +{ + + OnTapUpSignal.connect(boost::bind(&TGameMenu::OnTapUp, boost::ref(Menu), _1)); + OnFlingSignal.connect(boost::bind(&TGameMenu::OnFling, boost::ref(Menu), _1)); + OnScrollSignal.connect(boost::bind(&TGameMenu::OnScroll, boost::ref(Menu), _1)); + OnTapDownSignal.connect(boost::bind(&TGameMenu::OnTapDown, boost::ref(Menu), _1)); + +} + + +void TAndroidApplication::DisapplySignalsToMenu() +{ + OnTapUpSignal.disconnect(boost::bind(&TGameMenu::OnTapUp, boost::ref(Menu), _1)); + OnFlingSignal.disconnect(boost::bind(&TGameMenu::OnFling, boost::ref(Menu), _1)); + OnScrollSignal.disconnect(boost::bind(&TGameMenu::OnScroll, boost::ref(Menu), _1)); + OnTapDownSignal.disconnect(boost::bind(&TGameMenu::OnTapDown, boost::ref(Menu), _1)); +} + +void TAndroidApplication::ApplySignalsToGame() +{ + + OnTapUpSignal.connect(boost::bind(&TGameLevel::OnTapUp, boost::ref(GameLevel), _1)); + OnFlingSignal.connect(boost::bind(&TGameLevel::OnFling, boost::ref(GameLevel), _1)); + OnScrollSignal.connect(boost::bind(&TGameLevel::OnScroll, boost::ref(GameLevel), _1)); + OnTapDownSignal.connect(boost::bind(&TGameLevel::OnTapDown, boost::ref(GameLevel), _1)); + +} + +void TAndroidApplication::DisapplySignalsToGame() +{ + OnTapUpSignal.disconnect(boost::bind(&TGameLevel::OnTapUp, boost::ref(GameLevel), _1)); + OnFlingSignal.disconnect(boost::bind(&TGameLevel::OnFling, boost::ref(GameLevel), _1)); + OnScrollSignal.disconnect(boost::bind(&TGameLevel::OnScroll, boost::ref(GameLevel), _1)); + OnTapDownSignal.disconnect(boost::bind(&TGameLevel::OnTapDown, boost::ref(GameLevel), _1)); + +} + +void TAndroidApplication::ApplySignalsToCredits() +{ + OnTapDownSignal.connect(boost::bind(&TGameCredits::OnTapDown, boost::ref(GameCredits), _1)); +} + + +void TAndroidApplication::DisapplySignalsToCredits() +{ + OnTapDownSignal.disconnect(boost::bind(&TGameCredits::OnTapDown, boost::ref(GameCredits), _1)); +} + +void TAndroidApplication::LoadResources() +{ + + TextureNamesToLoad.clear(); + + TextureNamesToLoad.push_back(std::pair("main_menu_bkg_left.png", "main_menu_bkg_left")); + TextureNamesToLoad.push_back(std::pair("main_menu_bkg_right.png", "main_menu_bkg_right")); + TextureNamesToLoad.push_back(std::pair("select_level.png", "select_level")); + TextureNamesToLoad.push_back(std::pair("shutterstock1.png", "shutterstock1")); + TextureNamesToLoad.push_back(std::pair("shutterstock2.png", "shutterstock2")); + TextureNamesToLoad.push_back(std::pair("shutterstock3.png", "shutterstock3")); + TextureNamesToLoad.push_back(std::pair("shutterstock4.png", "shutterstock4")); + TextureNamesToLoad.push_back(std::pair("shutterstock5.png", "shutterstock5")); + TextureNamesToLoad.push_back(std::pair("shutterstock6.png", "shutterstock6")); + TextureNamesToLoad.push_back(std::pair("shutterstock7.png", "shutterstock7")); + TextureNamesToLoad.push_back(std::pair("shutterstock8.png", "shutterstock8")); + TextureNamesToLoad.push_back(std::pair("shutterstock9.png", "shutterstock9")); + + TextureNamesToLoad.push_back(std::pair("shutterstock10.png", "shutterstock10")); + TextureNamesToLoad.push_back(std::pair("shutterstock11.png", "shutterstock11")); + TextureNamesToLoad.push_back(std::pair("shutterstock12.png", "shutterstock12")); + TextureNamesToLoad.push_back(std::pair("levelshot1.png", "levelshot1")); + TextureNamesToLoad.push_back(std::pair("levelshot2.png", "levelshot2")); + TextureNamesToLoad.push_back(std::pair("levelshot3.png", "levelshot3")); + TextureNamesToLoad.push_back(std::pair("levelshot4.png", "levelshot4")); + TextureNamesToLoad.push_back(std::pair("levelshot5.png", "levelshot5")); + TextureNamesToLoad.push_back(std::pair("levelshot6.png", "levelshot6")); + TextureNamesToLoad.push_back(std::pair("levelshot7.png", "levelshot7")); + TextureNamesToLoad.push_back(std::pair("levelshot8.png", "levelshot8")); + TextureNamesToLoad.push_back(std::pair("levelshot9.png", "levelshot9")); + TextureNamesToLoad.push_back(std::pair("levelshot10.png", "levelshot10")); + TextureNamesToLoad.push_back(std::pair("levelshot11.png", "levelshot11")); + TextureNamesToLoad.push_back(std::pair("levelshot12.png", "levelshot12")); + TextureNamesToLoad.push_back(std::pair("game_end.png", "game_end")); + + TextureNamesToLoad.push_back(std::pair(CONST_BLOCK_TEXTURE1 + ".png", CONST_BLOCK_TEXTURE1)); + TextureNamesToLoad.push_back(std::pair(CONST_BLOCK_TEXTURE2 + ".png", CONST_BLOCK_TEXTURE2)); + TextureNamesToLoad.push_back(std::pair(CONST_BLOCK_TEXTURE3 + ".png", CONST_BLOCK_TEXTURE3)); + TextureNamesToLoad.push_back(std::pair(CONST_BONUS_GOTHROUGH_TEXTURE + ".png", CONST_BONUS_GOTHROUGH_TEXTURE)); + TextureNamesToLoad.push_back(std::pair(CONST_BONUS_MULTIPLIER_TEXTURE + ".png", CONST_BONUS_MULTIPLIER_TEXTURE)); + TextureNamesToLoad.push_back(std::pair(CONST_BONUS_FLOOR_TEXTURE + ".png", CONST_BONUS_FLOOR_TEXTURE)); + TextureNamesToLoad.push_back(std::pair(CONST_BALL_TEXTURE + ".png", CONST_BALL_TEXTURE)); + TextureNamesToLoad.push_back(std::pair(CONST_BALLGLOW_TEXTURE + ".png", CONST_BALLGLOW_TEXTURE)); + TextureNamesToLoad.push_back(std::pair(CONST_WALL_LEFT_TEXTURE + ".png", CONST_WALL_LEFT_TEXTURE)); + TextureNamesToLoad.push_back(std::pair(CONST_WALL_RIGHT_TEXTURE + ".png", CONST_WALL_RIGHT_TEXTURE)); + TextureNamesToLoad.push_back(std::pair(CONST_WALL_UP_TEXTURE + ".png", CONST_WALL_UP_TEXTURE)); + TextureNamesToLoad.push_back(std::pair(CONST_WALL_BONUS_TEXTURE + ".png", CONST_WALL_BONUS_TEXTURE)); + TextureNamesToLoad.push_back(std::pair(CONST_REFLECTOR_TEXTURE + ".png", CONST_REFLECTOR_TEXTURE)); + TextureNamesToLoad.push_back(std::pair(CONST_BACK_BTN_TEXTURE + ".png", CONST_BACK_BTN_TEXTURE)); + TextureNamesToLoad.push_back(std::pair(CONST_SLIDE_UP_BTN_TEXTURE + ".png", CONST_SLIDE_UP_BTN_TEXTURE)); + TextureNamesToLoad.push_back(std::pair(CONST_TAP_TO_CONTINUE_BTN_TEXTURE + ".png", CONST_TAP_TO_CONTINUE_BTN_TEXTURE)); + TextureNamesToLoad.push_back(std::pair(CONST_CREDITS_TEXTURE + ".png", CONST_CREDITS_TEXTURE)); + +#ifdef TARGET_IOS + ResourceManager->SoundManager.LoadMusicLooped("level1ogg.ogg"); +#else + ResourceManager->SoundManager.LoadMusic("level1ogg.ogg"); +#endif + + ResourceManager->FontManager.AddFont("droid_sans14", "droid_sans14_font_bitmap.png", "droid_sans14_font_charmap.txt"); + ResourceManager->FontManager.PushFont("droid_sans14"); + + TryLoadSavedGame(); + +} + +void TAndroidApplication::TryLoadSavedGame() +{ + + std::string fileName = GetFilePathUserData("progress.txt"); + + FILE* file = fopen(fileName.c_str(), "r"); + if (file != NULL) + { + char line[100]; + char* r; + r = fgets(line, 100, file); + if (r != NULL) + { + Menu.SetMenuItemCount(toint(r)); + } + fclose(file); + } +} + +void TAndroidApplication::TrySaveGame() +{ + + std::string fileName = GetFilePathUserData("progress.txt"); + + std::string s = tostr(Menu.GetMenuItemCount()); + FILE* file = fopen(fileName.c_str(), "w"); + if (file != NULL) + { + fputs(s.c_str(), file); + fflush(file); + fclose(file); + } + +} + + + +void TAndroidApplication::InnerDraw() +{ + + glDisable(GL_DEPTH_TEST); + + + OnDrawSignal(); + + +} + + +void TAndroidApplication::InnerUpdate(cardinal dt) +{ + + if (GameState == CONST_GAMESTATE_PRELOADING) + { + StateTimer += dt/1000.f; + if (StateTimer >= 1.f) + { + LoadResources(); + GameState = CONST_GAMESTATE_LOADING; + StateTimer = 0.f; + } + } + else if (GameState == CONST_GAMESTATE_LOADING) + { + StateTimer += dt/1000.f; + if (StateTimer >= 1.f) + { + StateTimer -= 1.f; + } + + if (TextureNamesToLoad.size() != 0) + { + ResourceManager->TexList.AddTexture(TextureNamesToLoad.begin()->first, TextureNamesToLoad.begin()->second); + TextureNamesToLoad.erase(TextureNamesToLoad.begin()); + } + else + { + GameState = CONST_GAMESTATE_MENU; + ApplySignalsToMenu(); + OnDrawSignal.disconnect(boost::bind(&TGameLoading::Draw, boost::ref(GameLoading))); + OnDrawSignal.connect(0, boost::bind(&TGameMenu::Draw, boost::ref(Menu))); + StateTimer = 0.f; + Loaded = true; + } + } + else if (GameState == CONST_GAMESTATE_LEVEL) + { + GameLevel.Update(dt); + } + else if (GameState == CONST_GAMESTATE_MENU) + { + Menu.Update(dt); + } + else if (GameState == CONST_GAMESTATE_FROM_MENU_TO_LEVEL) + { + GameLevel.Update(dt); + if (GameLevel.IsLoaded()) + { + GameState = CONST_GAMESTATE_LEVEL; + OnDrawSignal.disconnect(boost::bind(&TGameMenu::Draw, boost::ref(Menu))); + //CONNECT SLOT + DisapplySignalsToMenu(); + ApplySignalsToGame(); + } + } + else if (GameState == CONST_GAMESTATE_FROM_MENU_TO_CREDITS) + { + Menu.Update(dt); + GameCredits.Update(dt); + StateTimer -= dt; + if (StateTimer <= 0.f) + { + GameState = CONST_GAMESTATE_CREDITS; + OnDrawSignal.disconnect(boost::bind(&TGameMenu::Draw, boost::ref(Menu))); + ApplySignalsToCredits(); + StateTimer = 0.f; + } + } + else if (GameState == CONST_GAMESTATE_CREDITS) + { + GameCredits.Update(dt); + } + else if (GameState == CONST_GAMESTATE_FROM_CREDITS_TO_MENU) + { + Menu.Update(dt); + GameCredits.Update(dt); + StateTimer -= dt; + if (StateTimer <= 0.f) + { + GameState = CONST_GAMESTATE_MENU; + StateTimer = 0.f; + ApplySignalsToMenu(); + OnDrawSignal.disconnect(boost::bind(&TGameCredits::Draw, boost::ref(GameCredits))); + } + } +} + + +void TAndroidApplication::GoFromMenuToGame(int level) +{ + //#ifndef TARGET_IOS + ResourceManager->SoundManager.PlayMusicLooped("level1ogg.ogg"); + +//#endif + GameLevel.FillWithFile(ST::PathToResources + "level"+tostr(level+1)+".txt"); + GameLevel.SetLoading("shutterstock" + tostr(level+1), "levelshot"+tostr(level+1)); + GameState = CONST_GAMESTATE_FROM_MENU_TO_LEVEL; + OnDrawSignal.connect(1, boost::bind(&TGameLevel::Draw, boost::ref(GameLevel))); + + DisapplySignalsToMenu(); + +} + +void TAndroidApplication::GoFromGameToMenu() +{ + //#ifndef TARGET_IOS + ResourceManager->SoundManager.StopMusic("level1ogg.ogg"); +//#endif + TrySaveGame(); + DisapplySignalsToGame(); + ApplySignalsToMenu(); + GameState = CONST_GAMESTATE_MENU; + OnDrawSignal.disconnect(boost::bind(&TGameLevel::Draw, boost::ref(GameLevel))); +} + +void TAndroidApplication::GoFromMenuToCredits() +{ + GameState = CONST_GAMESTATE_FROM_MENU_TO_CREDITS; + StateTimer = CONST_CREDITS_SHOW_TIME; + GameCredits.StartAppear(); + OnDrawSignal.connect(1, boost::bind(&TGameCredits::Draw, boost::ref(GameCredits))); + DisapplySignalsToMenu(); + +} + +void TAndroidApplication::GoFromCreditsToMenu() +{ + + GameState = CONST_GAMESTATE_FROM_CREDITS_TO_MENU; + StateTimer = CONST_CREDITS_SHOW_TIME; + GameCredits.StartDisappear(); + OnDrawSignal.connect(0, boost::bind(&TGameMenu::Draw, boost::ref(Menu))); + + DisapplySignalsToCredits(); +} + +void TAndroidApplication::MarkSetGameLevelPause() +{ + OnDrawSignal.connect(0, boost::bind(&TGameMenu::Draw, boost::ref(Menu))); +} + +void TAndroidApplication::MarkReleaseGameLevelPause() +{ + OnDrawSignal.disconnect(boost::bind(&TGameMenu::Draw, boost::ref(Menu))); +} + + +void TAndroidApplication::OpenNextLevel() +{ + Menu.OpenNextLevel(); +} + +bool TAndroidApplication::IsLoaded() +{ + return Loaded; +} + +bool TAndroidApplication::IsInited() +{ + return Inited; +} diff --git a/ios/doublehitballs/main_code.h b/ios/doublehitballs/main_code.h new file mode 100644 index 0000000..1df873e --- /dev/null +++ b/ios/doublehitballs/main_code.h @@ -0,0 +1,153 @@ +#ifndef MAIN_CODE_H_INCLUDED +#define MAIN_CODE_H_INCLUDED + +#ifdef TARGET_ANDROID +#include "android_api.h" +#endif + +#ifdef TARGET_WIN32 +#define NOMINMAX 1 +#include +#undef NOMINMAX +#endif + +#include +#include +#include + +#include "boost/shared_ptr.hpp" +#include "boost/thread/thread.hpp" +#include "boost/assign.hpp" +#include "boost/bind.hpp" + +#include "include/Engine.h" + +#include "boost/signal.hpp"//Signal must be included after asio + +#include "gamecode.h" +#include "menucode.h" +#include "creditscode.h" +#include "loadingcode.h" + +using namespace SE; + + +extern boost::signal OnTapUpSignal; +extern boost::signal OnTapDownSignal; +extern boost::signal OnFlingSignal; +extern boost::signal OnScrollSignal; + +extern boost::signal OnDrawSignal; + +extern const std::string CONST_BLOCK_TEXTURE1; +extern const std::string CONST_BLOCK_TEXTURE2; +extern const std::string CONST_BLOCK_TEXTURE3; + +extern const std::string CONST_BONUS_GOTHROUGH_TEXTURE; +extern const std::string CONST_BONUS_MULTIPLIER_TEXTURE; +extern const std::string CONST_BONUS_FLOOR_TEXTURE; + +extern const std::string CONST_BALL_TEXTURE; +extern const std::string CONST_BALLGLOW_TEXTURE; + +extern const std::string CONST_WALL_LEFT_TEXTURE; +extern const std::string CONST_WALL_RIGHT_TEXTURE; +extern const std::string CONST_WALL_UP_TEXTURE; +extern const std::string CONST_WALL_BONUS_TEXTURE; + + +extern const std::string CONST_REFLECTOR_TEXTURE; + +extern const std::string CONST_BACK_BTN_TEXTURE; + +extern const std::string CONST_SLIDE_UP_BTN_TEXTURE; +extern const std::string CONST_TAP_TO_CONTINUE_BTN_TEXTURE; + +extern const std::string CONST_BACK_BTN_TEXTURE; +extern const std::string CONST_SLIDE_UP_BTN_TEXTURE; +extern const std::string CONST_TAP_TO_CONTINUE_BTN_TEXTURE; +extern const std::string CONST_LOADING_TEXTURE; +extern const std::string CONST_LOGO_SMALL_TEXTURE; +extern const std::string CONST_CREDITS_TEXTURE; + + + +const int CONST_GAMESTATE_LEVEL = 1; +const int CONST_GAMESTATE_MENU = 0; +const int CONST_GAMESTATE_FROM_MENU_TO_LEVEL = 2; +const int CONST_GAMESTATE_FROM_MENU_TO_CREDITS = 3; +const int CONST_GAMESTATE_CREDITS = 4; +const int CONST_GAMESTATE_FROM_CREDITS_TO_MENU = 5; +const int CONST_GAMESTATE_LOADING = 6; +const int CONST_GAMESTATE_PRELOADING = 7; + + +class TAndroidApplication : public TApplication +{ +protected: + TGameMenu Menu; + TGameLevel GameLevel; + TGameCredits GameCredits; + TGameLoading GameLoading; + + int GameState; + float StateTimer; + + void TryLoadSavedGame(); + void TrySaveGame(); + + bool Inited; + + std::vector > TextureNamesToLoad; + + void ApplySignalsToMenu(); + void DisapplySignalsToMenu(); + void ApplySignalsToGame(); + void DisapplySignalsToGame(); + void ApplySignalsToCredits(); + void DisapplySignalsToCredits(); + +public: + bool Loaded; + + TAndroidApplication() : TApplication(), Loaded(false), Inited(false) { } + + virtual void InnerInit(); + + virtual void InnerDeinit(); + + virtual void InnerDraw(); + + virtual void InnerUpdate(cardinal dt); + + void GoFromMenuToGame(int level); + void GoFromGameToMenu(); + void GoFromMenuToCredits(); + void GoFromCreditsToMenu(); + void MarkSetGameLevelPause(); + void MarkReleaseGameLevelPause(); + + void OpenNextLevel(); + + bool IsLoaded(); + + bool IsInited(); + + void LoadResources(); + + virtual void InnerOnTapDown(vec2 p); + + virtual void InnerOnTapUp(vec2 p); + + virtual void InnerOnMove(vec2 shift); + + virtual void OnFling(vec2 v); + +}; + + +extern TAndroidApplication* Application; + + + +#endif diff --git a/ios/doublehitballs/menucode.cpp b/ios/doublehitballs/menucode.cpp new file mode 100644 index 0000000..7225427 --- /dev/null +++ b/ios/doublehitballs/menucode.cpp @@ -0,0 +1,207 @@ +#include "menucode.h" +#include "main_code.h" + +const float CONST_SPEED_NEG_ACCELERATION_K = 0.03f; + +const float CONST_MENU_POS_K = 0.25f; + +const float CONST_MENU_WINDOW_DISTANCE = 240.f + 40.f; + +const float CONST_SHIFT_ON_SIDE = 0.f; + +TGameMenu::TGameMenu() + : MenuSpeed(0) + , MenuPos(0) + , HoldToTap(false) + , MenuItemCount(1) + , SelectedGame(-1) +{ +} + + +void TGameMenu::Draw() +{ + CheckGlError("Draw TGameMenu"); + RenderUniform1i("sel", 0); + RenderUniform1f("Transparency", 1.f); + float bkgShift = MenuPos*0.1f - 100.f; + glBindTexture(GL_TEXTURE_2D, ResourceManager->TexList["main_menu_bkg_left"]); + Renderer->DrawRect(vec2(bkgShift,0.f), vec2(480.f+bkgShift,320.f)); + glBindTexture(GL_TEXTURE_2D, ResourceManager->TexList["main_menu_bkg_right"]); + Renderer->DrawRect(vec2(480.f+bkgShift,0.f), vec2(960.f+bkgShift,320.f)); + + + if (SelectedGame == 0) + { + RenderUniform1i("sel", 1); + } + else + { + RenderUniform1i("sel", 0); + } + + for (int i=0; iTexList["levelshot"+tostr(i+1)]); + Renderer->DrawRect(vec2(160.f+MenuPos+CONST_MENU_WINDOW_DISTANCE*i,80.f), vec2(160.f+240.f+MenuPos+CONST_MENU_WINDOW_DISTANCE*i, 240.f)); + } + + if (MenuItemCount == 12) + { + glBindTexture(GL_TEXTURE_2D, ResourceManager->TexList["game_end"]); + Renderer->DrawRect(vec2(160.f+MenuPos+CONST_MENU_WINDOW_DISTANCE*12,160.f - 64.f), vec2(160.f+256.f+MenuPos+CONST_MENU_WINDOW_DISTANCE*12, 160.f + 64.f)); + + } + + + + glBindTexture(GL_TEXTURE_2D, ResourceManager->TexList["select_level"]); + Renderer->DrawRect(vec2(240.f-128.f, 241.f), vec2(240.f+128.f, 305.f)); + + glBindTexture(GL_TEXTURE_2D, ResourceManager->TexList["logo_small"]); + Renderer->DrawRect(vec2(240.f-128.f+15.f, 0.f), vec2(240.f+128.f+15.f, 64.f)); + + CheckGlError("Draw TGameMenu 2"); + + +} + +void TGameMenu::Update(cardinal dt) +{ + if (HoldToTap) + return; + + float k; + + MenuPos = MenuPos + MenuSpeed*dt/1000.f; + + int menuItemToShowCount; + + if (MenuItemCount == 12) + { + menuItemToShowCount = 13; + } + else + { + menuItemToShowCount = MenuItemCount; + } + + float acc; + + if (MenuItemCount == 1) + { + k = 3; + } + else + { + k = fabs( - MenuPos - ((menuItemToShowCount-1)*CONST_MENU_WINDOW_DISTANCE*0.5f)) / ((MenuItemCount-1)*CONST_MENU_WINDOW_DISTANCE*0.5f); + } + + acc = -MenuSpeed * CONST_SPEED_NEG_ACCELERATION_K * k; + + + float xleft = (- MenuPos + CONST_SHIFT_ON_SIDE - (menuItemToShowCount-1)*CONST_MENU_WINDOW_DISTANCE); + + if (xleft < 0) + { + xleft = 0; + } + + acc += xleft*CONST_MENU_POS_K; + + float xright = (MenuPos - CONST_SHIFT_ON_SIDE); + + if (xright < 0) + { + xright = 0; + } + + acc -= xright*CONST_MENU_POS_K; + + if ((MenuSpeed + acc*dt) * MenuSpeed < 0) //Check if MenuSpeed changes direction + { + MenuSpeed = 0; + } + else + { + MenuSpeed += acc*dt; + } + + +} + +void TGameMenu::OnTapDown(vec2 pos) +{ + + if (pos.v[1]<64.f && pos.v[0]>=265.f-128.f && pos.v[0]<=265.f+128.f) + { + Application->GoFromMenuToCredits(); + return; + } + + vec2 realPos = pos - vec2(MenuPos, 0); + + if (realPos.v[1] >= 80.f && realPos.v[1] <= 240.f) + { + float x = realPos.v[0] - 160.f; + + int p = 0; + while (x >280.f) + { + x -= 280.f; + p++; + } + + if (x <= 240.f && x >= 0.f && (pGoFromMenuToGame(SelectedGame); + SelectedGame = -1; + } +} + + +void TGameMenu::OnFling(vec2 slideSpeed) +{ + HoldToTap = false; + MenuSpeed = slideSpeed.v[0]; +} + +void TGameMenu::OnScroll(vec2 shift) +{ + MenuPos = MenuPos - shift.v[0]; +} + +void TGameMenu::OpenNextLevel() +{ + if (MenuItemCount < 12) + { + MenuItemCount++; + } +} + +int TGameMenu::GetMenuItemCount() +{ + return MenuItemCount; +} + +void TGameMenu::SetMenuItemCount(int menuItemCount) +{ + MenuItemCount = menuItemCount; +} diff --git a/ios/doublehitballs/menucode.h b/ios/doublehitballs/menucode.h new file mode 100644 index 0000000..0d3d355 --- /dev/null +++ b/ios/doublehitballs/menucode.h @@ -0,0 +1,40 @@ +#ifndef MENUCODE_H_INCLUDED +#define MENUCODE_H_INCLUDED + +#include "include/Engine.h" +#include "game_area_interface.h" + +using namespace SE; + + +class TGameMenu : public TGameAreaAncestor +{ +protected: + float MenuSpeed; + float MenuPos; + + bool HoldToTap; + + int MenuItemCount; + + int SelectedGame; + + +public: + TGameMenu(); + virtual void Draw(); + virtual void Update(cardinal dt); + virtual void OnTapDown(vec2 pos); + virtual void OnTapUp(vec2 pos); + virtual void OnFling(vec2 slideSpeed); + virtual void OnScroll(vec2 shift); + + void OpenNextLevel(); + int GetMenuItemCount(); + void SetMenuItemCount(int menuItemCount); + +}; + + + +#endif