From 3f8caf25741192400648216d2dd954540ac703f9 Mon Sep 17 00:00:00 2001 From: "shakurov.airat" Date: Tue, 10 Jan 2017 17:43:06 +0500 Subject: [PATCH] move to AS --- assets/back_btn.png | Bin assets/ball.png | Bin assets/ball_glow.png | Bin assets/block1.png | Bin assets/block2.png | Bin assets/block3.png | Bin assets/bonus_floor.png | Bin assets/bonus_gothrough.png | Bin assets/bonus_multiplier.png | Bin assets/brickshader_fragment.txt | 0 assets/brickshader_vertex.txt | 0 assets/console_bkg.bmp | Bin assets/credits.png | Bin assets/droid_sans14_font_bitmap.png | Bin assets/droid_sans14_font_charmap.txt | 0 assets/frameshader_fragment.txt | 0 assets/frameshader_vertex.txt | 0 assets/game_end.png | Bin assets/level1.txt | 0 assets/level10.txt | 0 assets/level11.txt | 0 assets/level12.txt | 0 assets/level1ogg.ogg | Bin assets/level2.txt | 0 assets/level3.txt | 0 assets/level4.txt | 0 assets/level5.txt | 0 assets/level6.txt | 0 assets/level7.txt | 0 assets/level8.txt | 0 assets/level9.txt | 0 assets/levelshot1.png | Bin assets/levelshot10.png | Bin assets/levelshot11.png | Bin assets/levelshot12.png | Bin assets/levelshot2.png | Bin assets/levelshot3.png | Bin assets/levelshot4.png | Bin assets/levelshot5.png | Bin assets/levelshot6.png | Bin assets/levelshot7.png | Bin assets/levelshot8.png | Bin assets/levelshot9.png | Bin assets/loading.png | Bin assets/logo_small.png | Bin assets/main_menu_bkg_left.png | Bin assets/main_menu_bkg_right.png | Bin assets/reflector.png | Bin assets/select_level.png | Bin assets/shader1fragment.txt | 0 assets/shader1vertex.txt | 0 assets/shutterstock1.png | Bin assets/shutterstock10.png | Bin assets/shutterstock11.png | Bin assets/shutterstock12.png | Bin assets/shutterstock2.png | Bin assets/shutterstock3.png | Bin assets/shutterstock4.png | Bin assets/shutterstock5.png | Bin assets/shutterstock6.png | Bin assets/shutterstock7.png | Bin assets/shutterstock8.png | Bin assets/shutterstock9.png | Bin assets/slide_up_btn.png | Bin assets/tap_to_continue_btn.png | Bin assets/wall_bonus.png | Bin assets/wall_left.png | Bin assets/wall_right.png | Bin assets/wall_up.png | Bin game/Android.mk | 77 + game/Application.mk | 3 + game/DoubleHitBalls.dev | 179 ++ game/android_api.cpp | 10 + game/android_api.h | 25 + game/creditscode.cpp | 79 + game/creditscode.h | 34 + game/game_area_interface.h | 23 + game/gamecode.cpp | 1560 +++++++++++++++++ game/gamecode.h | 205 +++ game/loadingcode.cpp | 16 + game/loadingcode.h | 15 + game/main_code.cpp | 475 +++++ game/main_code.h | 153 ++ game/menucode.cpp | 207 +++ game/menucode.h | 40 + ios/Icon.png | Bin ios/Splash-landscape.png | Bin ios/doublehitballs.xcodeproj/project.pbxproj | 0 ios/doublehitballs/AppDelegate.h | 0 ios/doublehitballs/AppDelegate.m | 0 ios/doublehitballs/CustomGLKView.h | 0 ios/doublehitballs/CustomGLKView.mm | 0 ios/doublehitballs/ViewController.h | 0 ios/doublehitballs/ViewController.mm | 0 ios/doublehitballs/doublehitballs-Info.plist | 0 ios/doublehitballs/doublehitballs-Prefix.pch | 0 ios/doublehitballs/en.lproj/InfoPlist.strings | 0 .../en.lproj/ViewController_iPad.xib | 0 .../en.lproj/ViewController_iPhone.xib | 0 ios/doublehitballs/ios_api.cpp | 0 ios/doublehitballs/ios_api.h | 0 ios/doublehitballs/main.m | 0 ios/iTunesArtwork | Bin proj.android-studio/.gitignore | 10 + proj.android-studio/app/.gitignore | 1 + proj.android-studio/app/CMakeLists.txt | 100 ++ proj.android-studio/app/build.gradle | 46 + proj.android-studio/app/proguard-rules.pro | 17 + .../ExampleInstrumentedTest.java | 26 + .../app/src/main/AndroidManifest.xml | 39 + .../doublehitballs/GL2JNIActivity.java | 91 + .../fishrungames/doublehitballs/GLView.java | 69 + .../doublehitballs/JniWrapper.java | 12 + .../res/drawable-hdpi/ic_menu_template.png | Bin 0 -> 3527 bytes .../res/drawable-ldpi/ic_menu_template.png | Bin 0 -> 1460 bytes .../res/drawable-mdpi/ic_menu_template.png | Bin 0 -> 2111 bytes .../app/src/main/res/values/strings.xml | 29 + .../ExampleUnitTest.java | 17 + proj.android-studio/build.gradle | 23 + proj.android-studio/gradle.properties | 17 + .../gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 53636 bytes .../gradle/wrapper/gradle-wrapper.properties | 6 + proj.android-studio/gradlew | 160 ++ proj.android-studio/gradlew.bat | 90 + proj.android-studio/settings.gradle | 7 + .../Debug/DoubleHitBalls-win.exe | Bin .../Debug/DoubleHitBalls-win.exp | Bin .../Debug/DoubleHitBalls-win.lib | Bin windows/DoubleHitBalls-win/Debug/log.txt | 0 .../DoubleHitBalls-win/DoubleHitBalls-win.sln | 0 .../DoubleHitBalls-win.vcxproj | 0 .../DoubleHitBalls-win.vcxproj.filters | 0 .../DoubleHitBalls-win/log.txt | 0 .../DoubleHitBalls-win/main.cpp | 0 .../DoubleHitBalls-win/main.h | 0 .../DoubleHitBalls-win/progress.txt | 0 136 files changed, 3861 insertions(+) mode change 100644 => 100755 assets/back_btn.png mode change 100644 => 100755 assets/ball.png mode change 100644 => 100755 assets/ball_glow.png mode change 100644 => 100755 assets/block1.png mode change 100644 => 100755 assets/block2.png mode change 100644 => 100755 assets/block3.png mode change 100644 => 100755 assets/bonus_floor.png mode change 100644 => 100755 assets/bonus_gothrough.png mode change 100644 => 100755 assets/bonus_multiplier.png mode change 100644 => 100755 assets/brickshader_fragment.txt mode change 100644 => 100755 assets/brickshader_vertex.txt mode change 100644 => 100755 assets/console_bkg.bmp mode change 100644 => 100755 assets/credits.png mode change 100644 => 100755 assets/droid_sans14_font_bitmap.png mode change 100644 => 100755 assets/droid_sans14_font_charmap.txt mode change 100644 => 100755 assets/frameshader_fragment.txt mode change 100644 => 100755 assets/frameshader_vertex.txt mode change 100644 => 100755 assets/game_end.png mode change 100644 => 100755 assets/level1.txt mode change 100644 => 100755 assets/level10.txt mode change 100644 => 100755 assets/level11.txt mode change 100644 => 100755 assets/level12.txt mode change 100644 => 100755 assets/level1ogg.ogg mode change 100644 => 100755 assets/level2.txt mode change 100644 => 100755 assets/level3.txt mode change 100644 => 100755 assets/level4.txt mode change 100644 => 100755 assets/level5.txt mode change 100644 => 100755 assets/level6.txt mode change 100644 => 100755 assets/level7.txt mode change 100644 => 100755 assets/level8.txt mode change 100644 => 100755 assets/level9.txt mode change 100644 => 100755 assets/levelshot1.png mode change 100644 => 100755 assets/levelshot10.png mode change 100644 => 100755 assets/levelshot11.png mode change 100644 => 100755 assets/levelshot12.png mode change 100644 => 100755 assets/levelshot2.png mode change 100644 => 100755 assets/levelshot3.png mode change 100644 => 100755 assets/levelshot4.png mode change 100644 => 100755 assets/levelshot5.png mode change 100644 => 100755 assets/levelshot6.png mode change 100644 => 100755 assets/levelshot7.png mode change 100644 => 100755 assets/levelshot8.png mode change 100644 => 100755 assets/levelshot9.png mode change 100644 => 100755 assets/loading.png mode change 100644 => 100755 assets/logo_small.png mode change 100644 => 100755 assets/main_menu_bkg_left.png mode change 100644 => 100755 assets/main_menu_bkg_right.png mode change 100644 => 100755 assets/reflector.png mode change 100644 => 100755 assets/select_level.png mode change 100644 => 100755 assets/shader1fragment.txt mode change 100644 => 100755 assets/shader1vertex.txt mode change 100644 => 100755 assets/shutterstock1.png mode change 100644 => 100755 assets/shutterstock10.png mode change 100644 => 100755 assets/shutterstock11.png mode change 100644 => 100755 assets/shutterstock12.png mode change 100644 => 100755 assets/shutterstock2.png mode change 100644 => 100755 assets/shutterstock3.png mode change 100644 => 100755 assets/shutterstock4.png mode change 100644 => 100755 assets/shutterstock5.png mode change 100644 => 100755 assets/shutterstock6.png mode change 100644 => 100755 assets/shutterstock7.png mode change 100644 => 100755 assets/shutterstock8.png mode change 100644 => 100755 assets/shutterstock9.png mode change 100644 => 100755 assets/slide_up_btn.png mode change 100644 => 100755 assets/tap_to_continue_btn.png mode change 100644 => 100755 assets/wall_bonus.png mode change 100644 => 100755 assets/wall_left.png mode change 100644 => 100755 assets/wall_right.png mode change 100644 => 100755 assets/wall_up.png create mode 100644 game/Android.mk create mode 100644 game/Application.mk create mode 100644 game/DoubleHitBalls.dev create mode 100644 game/android_api.cpp create mode 100644 game/android_api.h create mode 100644 game/creditscode.cpp create mode 100644 game/creditscode.h create mode 100644 game/game_area_interface.h create mode 100644 game/gamecode.cpp create mode 100644 game/gamecode.h create mode 100644 game/loadingcode.cpp create mode 100644 game/loadingcode.h create mode 100644 game/main_code.cpp create mode 100644 game/main_code.h create mode 100644 game/menucode.cpp create mode 100644 game/menucode.h mode change 100644 => 100755 ios/Icon.png mode change 100644 => 100755 ios/Splash-landscape.png mode change 100644 => 100755 ios/doublehitballs.xcodeproj/project.pbxproj mode change 100644 => 100755 ios/doublehitballs/AppDelegate.h mode change 100644 => 100755 ios/doublehitballs/AppDelegate.m mode change 100644 => 100755 ios/doublehitballs/CustomGLKView.h mode change 100644 => 100755 ios/doublehitballs/CustomGLKView.mm mode change 100644 => 100755 ios/doublehitballs/ViewController.h mode change 100644 => 100755 ios/doublehitballs/ViewController.mm mode change 100644 => 100755 ios/doublehitballs/doublehitballs-Info.plist mode change 100644 => 100755 ios/doublehitballs/doublehitballs-Prefix.pch mode change 100644 => 100755 ios/doublehitballs/en.lproj/InfoPlist.strings mode change 100644 => 100755 ios/doublehitballs/en.lproj/ViewController_iPad.xib mode change 100644 => 100755 ios/doublehitballs/en.lproj/ViewController_iPhone.xib mode change 100644 => 100755 ios/doublehitballs/ios_api.cpp mode change 100644 => 100755 ios/doublehitballs/ios_api.h mode change 100644 => 100755 ios/doublehitballs/main.m mode change 100644 => 100755 ios/iTunesArtwork create mode 100755 proj.android-studio/.gitignore create mode 100755 proj.android-studio/app/.gitignore create mode 100755 proj.android-studio/app/CMakeLists.txt create mode 100755 proj.android-studio/app/build.gradle create mode 100755 proj.android-studio/app/proguard-rules.pro create mode 100755 proj.android-studio/app/src/androidTest/java/fishrungames/salmonandroidtemplate/ExampleInstrumentedTest.java create mode 100644 proj.android-studio/app/src/main/AndroidManifest.xml create mode 100755 proj.android-studio/app/src/main/java/fishrungames/doublehitballs/GL2JNIActivity.java create mode 100755 proj.android-studio/app/src/main/java/fishrungames/doublehitballs/GLView.java create mode 100755 proj.android-studio/app/src/main/java/fishrungames/doublehitballs/JniWrapper.java create mode 100644 proj.android-studio/app/src/main/res/drawable-hdpi/ic_menu_template.png create mode 100644 proj.android-studio/app/src/main/res/drawable-ldpi/ic_menu_template.png create mode 100644 proj.android-studio/app/src/main/res/drawable-mdpi/ic_menu_template.png create mode 100644 proj.android-studio/app/src/main/res/values/strings.xml create mode 100755 proj.android-studio/app/src/test/java/fishrungames/salmonandroidtemplate/ExampleUnitTest.java create mode 100755 proj.android-studio/build.gradle create mode 100755 proj.android-studio/gradle.properties create mode 100755 proj.android-studio/gradle/wrapper/gradle-wrapper.jar create mode 100755 proj.android-studio/gradle/wrapper/gradle-wrapper.properties create mode 100755 proj.android-studio/gradlew create mode 100755 proj.android-studio/gradlew.bat create mode 100755 proj.android-studio/settings.gradle mode change 100644 => 100755 windows/DoubleHitBalls-win/Debug/DoubleHitBalls-win.exe mode change 100644 => 100755 windows/DoubleHitBalls-win/Debug/DoubleHitBalls-win.exp mode change 100644 => 100755 windows/DoubleHitBalls-win/Debug/DoubleHitBalls-win.lib mode change 100644 => 100755 windows/DoubleHitBalls-win/Debug/log.txt mode change 100644 => 100755 windows/DoubleHitBalls-win/DoubleHitBalls-win.sln mode change 100644 => 100755 windows/DoubleHitBalls-win/DoubleHitBalls-win/DoubleHitBalls-win.vcxproj mode change 100644 => 100755 windows/DoubleHitBalls-win/DoubleHitBalls-win/DoubleHitBalls-win.vcxproj.filters mode change 100644 => 100755 windows/DoubleHitBalls-win/DoubleHitBalls-win/log.txt mode change 100644 => 100755 windows/DoubleHitBalls-win/DoubleHitBalls-win/main.cpp mode change 100644 => 100755 windows/DoubleHitBalls-win/DoubleHitBalls-win/main.h mode change 100644 => 100755 windows/DoubleHitBalls-win/DoubleHitBalls-win/progress.txt diff --git a/assets/back_btn.png b/assets/back_btn.png old mode 100644 new mode 100755 diff --git a/assets/ball.png b/assets/ball.png old mode 100644 new mode 100755 diff --git a/assets/ball_glow.png b/assets/ball_glow.png old mode 100644 new mode 100755 diff --git a/assets/block1.png b/assets/block1.png old mode 100644 new mode 100755 diff --git a/assets/block2.png b/assets/block2.png old mode 100644 new mode 100755 diff --git a/assets/block3.png b/assets/block3.png old mode 100644 new mode 100755 diff --git a/assets/bonus_floor.png b/assets/bonus_floor.png old mode 100644 new mode 100755 diff --git a/assets/bonus_gothrough.png b/assets/bonus_gothrough.png old mode 100644 new mode 100755 diff --git a/assets/bonus_multiplier.png b/assets/bonus_multiplier.png old mode 100644 new mode 100755 diff --git a/assets/brickshader_fragment.txt b/assets/brickshader_fragment.txt old mode 100644 new mode 100755 diff --git a/assets/brickshader_vertex.txt b/assets/brickshader_vertex.txt old mode 100644 new mode 100755 diff --git a/assets/console_bkg.bmp b/assets/console_bkg.bmp old mode 100644 new mode 100755 diff --git a/assets/credits.png b/assets/credits.png old mode 100644 new mode 100755 diff --git a/assets/droid_sans14_font_bitmap.png b/assets/droid_sans14_font_bitmap.png old mode 100644 new mode 100755 diff --git a/assets/droid_sans14_font_charmap.txt b/assets/droid_sans14_font_charmap.txt old mode 100644 new mode 100755 diff --git a/assets/frameshader_fragment.txt b/assets/frameshader_fragment.txt old mode 100644 new mode 100755 diff --git a/assets/frameshader_vertex.txt b/assets/frameshader_vertex.txt old mode 100644 new mode 100755 diff --git a/assets/game_end.png b/assets/game_end.png old mode 100644 new mode 100755 diff --git a/assets/level1.txt b/assets/level1.txt old mode 100644 new mode 100755 diff --git a/assets/level10.txt b/assets/level10.txt old mode 100644 new mode 100755 diff --git a/assets/level11.txt b/assets/level11.txt old mode 100644 new mode 100755 diff --git a/assets/level12.txt b/assets/level12.txt old mode 100644 new mode 100755 diff --git a/assets/level1ogg.ogg b/assets/level1ogg.ogg old mode 100644 new mode 100755 diff --git a/assets/level2.txt b/assets/level2.txt old mode 100644 new mode 100755 diff --git a/assets/level3.txt b/assets/level3.txt old mode 100644 new mode 100755 diff --git a/assets/level4.txt b/assets/level4.txt old mode 100644 new mode 100755 diff --git a/assets/level5.txt b/assets/level5.txt old mode 100644 new mode 100755 diff --git a/assets/level6.txt b/assets/level6.txt old mode 100644 new mode 100755 diff --git a/assets/level7.txt b/assets/level7.txt old mode 100644 new mode 100755 diff --git a/assets/level8.txt b/assets/level8.txt old mode 100644 new mode 100755 diff --git a/assets/level9.txt b/assets/level9.txt old mode 100644 new mode 100755 diff --git a/assets/levelshot1.png b/assets/levelshot1.png old mode 100644 new mode 100755 diff --git a/assets/levelshot10.png b/assets/levelshot10.png old mode 100644 new mode 100755 diff --git a/assets/levelshot11.png b/assets/levelshot11.png old mode 100644 new mode 100755 diff --git a/assets/levelshot12.png b/assets/levelshot12.png old mode 100644 new mode 100755 diff --git a/assets/levelshot2.png b/assets/levelshot2.png old mode 100644 new mode 100755 diff --git a/assets/levelshot3.png b/assets/levelshot3.png old mode 100644 new mode 100755 diff --git a/assets/levelshot4.png b/assets/levelshot4.png old mode 100644 new mode 100755 diff --git a/assets/levelshot5.png b/assets/levelshot5.png old mode 100644 new mode 100755 diff --git a/assets/levelshot6.png b/assets/levelshot6.png old mode 100644 new mode 100755 diff --git a/assets/levelshot7.png b/assets/levelshot7.png old mode 100644 new mode 100755 diff --git a/assets/levelshot8.png b/assets/levelshot8.png old mode 100644 new mode 100755 diff --git a/assets/levelshot9.png b/assets/levelshot9.png old mode 100644 new mode 100755 diff --git a/assets/loading.png b/assets/loading.png old mode 100644 new mode 100755 diff --git a/assets/logo_small.png b/assets/logo_small.png old mode 100644 new mode 100755 diff --git a/assets/main_menu_bkg_left.png b/assets/main_menu_bkg_left.png old mode 100644 new mode 100755 diff --git a/assets/main_menu_bkg_right.png b/assets/main_menu_bkg_right.png old mode 100644 new mode 100755 diff --git a/assets/reflector.png b/assets/reflector.png old mode 100644 new mode 100755 diff --git a/assets/select_level.png b/assets/select_level.png old mode 100644 new mode 100755 diff --git a/assets/shader1fragment.txt b/assets/shader1fragment.txt old mode 100644 new mode 100755 diff --git a/assets/shader1vertex.txt b/assets/shader1vertex.txt old mode 100644 new mode 100755 diff --git a/assets/shutterstock1.png b/assets/shutterstock1.png old mode 100644 new mode 100755 diff --git a/assets/shutterstock10.png b/assets/shutterstock10.png old mode 100644 new mode 100755 diff --git a/assets/shutterstock11.png b/assets/shutterstock11.png old mode 100644 new mode 100755 diff --git a/assets/shutterstock12.png b/assets/shutterstock12.png old mode 100644 new mode 100755 diff --git a/assets/shutterstock2.png b/assets/shutterstock2.png old mode 100644 new mode 100755 diff --git a/assets/shutterstock3.png b/assets/shutterstock3.png old mode 100644 new mode 100755 diff --git a/assets/shutterstock4.png b/assets/shutterstock4.png old mode 100644 new mode 100755 diff --git a/assets/shutterstock5.png b/assets/shutterstock5.png old mode 100644 new mode 100755 diff --git a/assets/shutterstock6.png b/assets/shutterstock6.png old mode 100644 new mode 100755 diff --git a/assets/shutterstock7.png b/assets/shutterstock7.png old mode 100644 new mode 100755 diff --git a/assets/shutterstock8.png b/assets/shutterstock8.png old mode 100644 new mode 100755 diff --git a/assets/shutterstock9.png b/assets/shutterstock9.png old mode 100644 new mode 100755 diff --git a/assets/slide_up_btn.png b/assets/slide_up_btn.png old mode 100644 new mode 100755 diff --git a/assets/tap_to_continue_btn.png b/assets/tap_to_continue_btn.png old mode 100644 new mode 100755 diff --git a/assets/wall_bonus.png b/assets/wall_bonus.png old mode 100644 new mode 100755 diff --git a/assets/wall_left.png b/assets/wall_left.png old mode 100644 new mode 100755 diff --git a/assets/wall_right.png b/assets/wall_right.png old mode 100644 new mode 100755 diff --git a/assets/wall_up.png b/assets/wall_up.png old mode 100644 new mode 100755 diff --git a/game/Android.mk b/game/Android.mk new file mode 100644 index 0000000..53c2935 --- /dev/null +++ b/game/Android.mk @@ -0,0 +1,77 @@ +# Copyright (C) 2009 The Android Open Source Project +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + + +LPATH := $(call my-dir) + +ENGINE_PATH = $(SalmonEnginePathCygwin) + +#BOOST_PATH = $(LibsPathCygwin)/boost_1_47_0 +BOOST_PATH = $(LibsPathCygwin)/boost_1_52_0 + +OGG_PATH = $(LibsPathCygwin)/libogg-1.3.0 + +VORBIS_PATH = $(LibsPathCygwin)/libvorbis-1.3.2 + +SQUIRREL_PATH = $(LibsPathCygwin)/sqplus + +LIBPNG_PATH = $(LibsPathCygwin)/libpng_1.4.1_android + +ZIP_PATH = $(LibsPathCygwin)/julienr-libzip-android/jni + +#====== ENGINE AND LIBS ===================== + +include $(ENGINE_PATH)/Android_Salmon_Engine.mk + +#================= THE GAME ======================= + + +LOCAL_PATH:= $(LPATH) + +include $(CLEAR_VARS) + +LOCAL_CFLAGS := -DTARGET_ANDROID -std=gnu++11 --std=c++11 +LOCAL_STATIC_LIBRARIES := boost +LOCAL_STATIC_LIBRARIES += squirrel +LOCAL_STATIC_LIBRARIES += png_lib +LOCAL_STATIC_LIBRARIES += zip +LOCAL_SHARED_LIBRARIES := SalmonEngine +LOCAL_SHARED_LIBRARIES += gnustl_shared +LOCAL_C_INCLUDES := $(ENGINE_PATH) +LOCAL_C_INCLUDES += $(BOOST_PATH) +LOCAL_C_INCLUDES += $(VORBIS_PATH)/include +LOCAL_C_INCLUDES += $(VORBIS_PATH)/include/vorbis +LOCAL_C_INCLUDES += $(VORBIS_PATH)/lib +LOCAL_C_INCLUDES += $(VORBIS_PATH)/lib/books +LOCAL_C_INCLUDES += $(VORBIS_PATH)/lib/modes +LOCAL_C_INCLUDES += $(OGG_PATH)/include +LOCAL_C_INCLUDES += $(OGG_PATH)/include/ogg +LOCAL_C_INCLUDES += $(SQUIRREL_PATH)/include +LOCAL_C_INCLUDES += $(SQUIRREL_PATH)/sqplus +LOCAL_C_INCLUDES += $(SQUIRREL_PATH)/squirrel +LOCAL_C_INCLUDES += $(SQUIRREL_PATH)/sqstdlib +LOCAL_C_INCLUDES += $(LIBPNG_PATH) +LOCAL_C_INCLUDES += $(ZIP_PATH) +LOCAL_MODULE := gl2jni +LOCAL_SRC_FILES := main_code.cpp +LOCAL_SRC_FILES += android_api.cpp +LOCAL_SRC_FILES += menucode.cpp +LOCAL_SRC_FILES += gamecode.cpp +LOCAL_SRC_FILES += loadingcode.cpp +LOCAL_SRC_FILES += creditscode.cpp +LOCAL_LDLIBS := -lGLESv2 +LOCAL_LDLIBS += -llog -Wl,-s + +include $(BUILD_SHARED_LIBRARY) diff --git a/game/Application.mk b/game/Application.mk new file mode 100644 index 0000000..824acab --- /dev/null +++ b/game/Application.mk @@ -0,0 +1,3 @@ +APP_STL := gnustl_static +APP_CPPFLAGS += -fexceptions +APP_CPPFLAGS += -frtti \ No newline at end of file diff --git a/game/DoubleHitBalls.dev b/game/DoubleHitBalls.dev new file mode 100644 index 0000000..4298a40 --- /dev/null +++ b/game/DoubleHitBalls.dev @@ -0,0 +1,179 @@ +[Project] +FileName=DoubleHitBalls.dev +Name=DoubleHitBalls +UnitCount=13 +Type=1 +Ver=1 +ObjFiles= +Includes=C:\Workplace\Projects\Engine;C:\Workplace\android-ndk-r6b\platforms\android-8\arch-arm\usr\include;C:\Workplace\libs\boost_1_47_0;C:\Workplace\libs\openal;C:\Workplace\libs\libvorbis-1.3.2\include;C:\Workplace\libs\libogg-1.3.0\include +Libs= +PrivateResource= +ResourceIncludes= +MakeIncludes= +Compiler=-DTARGET_ANDROID_@@_ +CppCompiler=-DTARGET_ANDROID_@@_ +Linker= +IsCpp=1 +Icon= +ExeOutput= +ObjectOutput= +OverrideOutput=0 +OverrideOutputName=DoubleHitBalls.exe +HostApplication= +Folders= +CommandLine= +UseCustomMakefile=0 +CustomMakefile= +IncludeVersionInfo=0 +SupportXPThemes=0 +CompilerSet=0 +CompilerSettings=0000000000000000000000 + +[Unit1] +FileName=main_code.cpp +CompileCpp=1 +Folder=DoubleHitBalls +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit2] +FileName=main_code.h +CompileCpp=1 +Folder=DoubleHitBalls +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit3] +FileName=menucode.cpp +CompileCpp=1 +Folder=DoubleHitBalls +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit4] +FileName=menucode.h +CompileCpp=1 +Folder=DoubleHitBalls +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[VersionInfo] +Major=0 +Minor=1 +Release=1 +Build=1 +LanguageID=1033 +CharsetID=1252 +CompanyName= +FileVersion= +FileDescription=Developed using the Dev-C++ IDE +InternalName= +LegalCopyright= +LegalTrademarks= +OriginalFilename= +ProductName= +ProductVersion= +AutoIncBuildNr=0 + +[Unit5] +FileName=gamecode.h +CompileCpp=1 +Folder=DoubleHitBalls +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit6] +FileName=gamecode.cpp +CompileCpp=1 +Folder=DoubleHitBalls +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit7] +FileName=game_area_interface.h +CompileCpp=1 +Folder=DoubleHitBalls +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit8] +FileName=creditscode.cpp +CompileCpp=1 +Folder=DoubleHitBalls +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit9] +FileName=creditscode.h +CompileCpp=1 +Folder=DoubleHitBalls +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit10] +FileName=loadingcode.cpp +CompileCpp=1 +Folder=DoubleHitBalls +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit11] +FileName=loadingcode.h +CompileCpp=1 +Folder=DoubleHitBalls +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit12] +FileName=android_api.cpp +CompileCpp=1 +Folder=DoubleHitBalls +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit13] +FileName=android_api.h +CompileCpp=1 +Folder=DoubleHitBalls +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + diff --git a/game/android_api.cpp b/game/android_api.cpp new file mode 100644 index 0000000..4c7f210 --- /dev/null +++ b/game/android_api.cpp @@ -0,0 +1,10 @@ +#include "android_api.h" + +#include "main_code.h" + +JNIEXPORT void JNICALL Java_fishrungames_doublehitballs_JniWrapper_Init(JNIEnv * env, jobject obj, jint width, jint height) +{ + JniInitApp(width, height, 480.f, 320.f); +} + + diff --git a/game/android_api.h b/game/android_api.h new file mode 100644 index 0000000..5e6f4c3 --- /dev/null +++ b/game/android_api.h @@ -0,0 +1,25 @@ +#ifndef ANDROID_API_H_INCLUDED +#define ANDROID_API_H_INCLUDED + +#include +#include + +#include +#include +#include + +#include "boost/shared_ptr.hpp" + +#include "main_code.h" + +#include "include/Engine.h" + +using namespace SE; + +extern "C" +{ + JNIEXPORT void JNICALL Java_fishrungames_doublehitballs_JniWrapper_Init(JNIEnv * env, jobject obj, jint width, jint height); +}; + + +#endif diff --git a/game/creditscode.cpp b/game/creditscode.cpp new file mode 100644 index 0000000..3e0e010 --- /dev/null +++ b/game/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/game/creditscode.h b/game/creditscode.h new file mode 100644 index 0000000..e77114b --- /dev/null +++ b/game/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/game/game_area_interface.h b/game/game_area_interface.h new file mode 100644 index 0000000..2a549af --- /dev/null +++ b/game/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/game/gamecode.cpp b/game/gamecode.cpp new file mode 100644 index 0000000..8bee1b9 --- /dev/null +++ b/game/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/game/gamecode.h b/game/gamecode.h new file mode 100644 index 0000000..dc624e9 --- /dev/null +++ b/game/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/game/loadingcode.cpp b/game/loadingcode.cpp new file mode 100644 index 0000000..94f3308 --- /dev/null +++ b/game/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/game/loadingcode.h b/game/loadingcode.h new file mode 100644 index 0000000..6ea2411 --- /dev/null +++ b/game/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/game/main_code.cpp b/game/main_code.cpp new file mode 100644 index 0000000..7133518 --- /dev/null +++ b/game/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/game/main_code.h b/game/main_code.h new file mode 100644 index 0000000..1df873e --- /dev/null +++ b/game/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/game/menucode.cpp b/game/menucode.cpp new file mode 100644 index 0000000..7225427 --- /dev/null +++ b/game/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/game/menucode.h b/game/menucode.h new file mode 100644 index 0000000..0d3d355 --- /dev/null +++ b/game/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 diff --git a/ios/Icon.png b/ios/Icon.png old mode 100644 new mode 100755 diff --git a/ios/Splash-landscape.png b/ios/Splash-landscape.png old mode 100644 new mode 100755 diff --git a/ios/doublehitballs.xcodeproj/project.pbxproj b/ios/doublehitballs.xcodeproj/project.pbxproj old mode 100644 new mode 100755 diff --git a/ios/doublehitballs/AppDelegate.h b/ios/doublehitballs/AppDelegate.h old mode 100644 new mode 100755 diff --git a/ios/doublehitballs/AppDelegate.m b/ios/doublehitballs/AppDelegate.m old mode 100644 new mode 100755 diff --git a/ios/doublehitballs/CustomGLKView.h b/ios/doublehitballs/CustomGLKView.h old mode 100644 new mode 100755 diff --git a/ios/doublehitballs/CustomGLKView.mm b/ios/doublehitballs/CustomGLKView.mm old mode 100644 new mode 100755 diff --git a/ios/doublehitballs/ViewController.h b/ios/doublehitballs/ViewController.h old mode 100644 new mode 100755 diff --git a/ios/doublehitballs/ViewController.mm b/ios/doublehitballs/ViewController.mm old mode 100644 new mode 100755 diff --git a/ios/doublehitballs/doublehitballs-Info.plist b/ios/doublehitballs/doublehitballs-Info.plist old mode 100644 new mode 100755 diff --git a/ios/doublehitballs/doublehitballs-Prefix.pch b/ios/doublehitballs/doublehitballs-Prefix.pch old mode 100644 new mode 100755 diff --git a/ios/doublehitballs/en.lproj/InfoPlist.strings b/ios/doublehitballs/en.lproj/InfoPlist.strings old mode 100644 new mode 100755 diff --git a/ios/doublehitballs/en.lproj/ViewController_iPad.xib b/ios/doublehitballs/en.lproj/ViewController_iPad.xib old mode 100644 new mode 100755 diff --git a/ios/doublehitballs/en.lproj/ViewController_iPhone.xib b/ios/doublehitballs/en.lproj/ViewController_iPhone.xib old mode 100644 new mode 100755 diff --git a/ios/doublehitballs/ios_api.cpp b/ios/doublehitballs/ios_api.cpp old mode 100644 new mode 100755 diff --git a/ios/doublehitballs/ios_api.h b/ios/doublehitballs/ios_api.h old mode 100644 new mode 100755 diff --git a/ios/doublehitballs/main.m b/ios/doublehitballs/main.m old mode 100644 new mode 100755 diff --git a/ios/iTunesArtwork b/ios/iTunesArtwork old mode 100644 new mode 100755 diff --git a/proj.android-studio/.gitignore b/proj.android-studio/.gitignore new file mode 100755 index 0000000..cea3ef5 --- /dev/null +++ b/proj.android-studio/.gitignore @@ -0,0 +1,10 @@ +*.iml +.gradle +/local.properties +/.idea +/.idea/workspace.xml +/.idea/libraries +.DS_Store +/build +/captures +.externalNativeBuild diff --git a/proj.android-studio/app/.gitignore b/proj.android-studio/app/.gitignore new file mode 100755 index 0000000..796b96d --- /dev/null +++ b/proj.android-studio/app/.gitignore @@ -0,0 +1 @@ +/build diff --git a/proj.android-studio/app/CMakeLists.txt b/proj.android-studio/app/CMakeLists.txt new file mode 100755 index 0000000..8f608bb --- /dev/null +++ b/proj.android-studio/app/CMakeLists.txt @@ -0,0 +1,100 @@ +# Sets the minimum version of CMake required to build the native +# library. You should either keep the default value or only pass a +# value of 3.4.0 or lower. + +cmake_minimum_required(VERSION 3.4.1) + +# Creates and names a library, sets it as either STATIC +# or SHARED, and provides the relative paths to its source code. +# You can define multiple libraries, and CMake builds it for you. +# Gradle automatically packages shared libraries with your APK. + + +add_definitions(-DTARGET_ANDROID) + +set(BOOST_PATH ${CMAKE_CURRENT_SOURCE_DIR}/../../../boost_1_63_0) + +set(BOOST_GIL_PATH ${CMAKE_CURRENT_SOURCE_DIR}/../../../libs/boost-gil-extension) + +set(ZIP_PATH ${CMAKE_CURRENT_SOURCE_DIR}/../../../libs/julienr-libzip-android/jni) + +set(LIBPNG_PATH ${CMAKE_CURRENT_SOURCE_DIR}/../../../libs/libpng_1.4.1_android) + +set(LIBJPEG_PATH "${CMAKE_CURRENT_SOURCE_DIR}/../../../libs/jpeg-9") + + +include_directories(${CMAKE_CURRENT_SOURCE_DIR}/../../../engine) + +include_directories(${BOOST_PATH}) +include_directories(${LIBPNG_PATH}) +include_directories(${LIBJPEG_PATH}) +include_directories(${ZIP_PATH}) + +include_directories(${BOOST_GIL_PATH}) + +add_library( engine + SHARED + IMPORTED ) + +set_target_properties( # Specifies the target library. + engine + + # Specifies the parameter you want to define. + PROPERTIES IMPORTED_LOCATION + + # Provides the path to the library you want to import. + ${CMAKE_CURRENT_SOURCE_DIR}/build/intermediates/exploded-aar/proj.android-studio/SalmonEngineAndroid/unspecified/jni/${ANDROID_ABI}/libengine.so ) + + + + +add_library( # Sets the name of the library. + DoubleHitBalls + + # Sets the library as a shared library. + SHARED + + # Provides a relative path to your source file(s). + # Associated headers in the same location as their source + # file are automatically included. + ${CMAKE_CURRENT_SOURCE_DIR}/../../game/android_api.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/../../game/main_code.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/../../game/creditscode.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/../../game/gamecode.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/../../game/loadingcode.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/../../game/menucode.cpp + ) + + + +# Searches for a specified prebuilt library and stores the path as a +# variable. Because system libraries are included in the search path by +# default, you only need to specify the name of the public NDK library +# you want to add. CMake verifies that the library exists before +# completing its build. + +find_library( # Sets the name of the path variable. + log-lib + + # Specifies the name of the NDK library that + # you want CMake to locate. + log ) + +find_library( # Sets the name of the path variable. + GLESv2-lib + + # Specifies the name of the NDK library that + # you want CMake to locate. + GLESv2 ) + + +# Specifies libraries CMake should link to your target library. You +# can link multiple libraries, such as libraries you define in the +# build script, prebuilt third-party libraries, or system libraries. + +target_link_libraries( # Specifies the target library. + DoubleHitBalls + + # Links the target library to the log library + # included in the NDK. + ${log-lib} ${GLESv2-lib} engine ) diff --git a/proj.android-studio/app/build.gradle b/proj.android-studio/app/build.gradle new file mode 100755 index 0000000..1cc5d3f --- /dev/null +++ b/proj.android-studio/app/build.gradle @@ -0,0 +1,46 @@ +apply plugin: 'com.android.application' + +android { + compileSdkVersion 24 + buildToolsVersion "24.0.1" + defaultConfig { + applicationId "fishrungames.DoubleHitBalls" + minSdkVersion 15 + targetSdkVersion 24 + versionCode 1 + versionName "1.0" + testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" + externalNativeBuild { + cmake { + cppFlags "-std=c++11 -frtti -fexceptions -fsigned-char -Wno-c++11-narrowing" + } + } + } + buildTypes { + release { + minifyEnabled false + proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' + } + } + externalNativeBuild { + cmake { + path "CMakeLists.txt" + } + } + sourceSets { + main { + assets.srcDirs = ['../../assets/'] + } + } +} + +dependencies { + compile fileTree(dir: 'libs', include: ['*.jar']) + androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', { + exclude group: 'com.android.support', module: 'support-annotations' + }) + compile 'com.android.support:appcompat-v7:24.2.1' + testCompile 'junit:junit:4.12' + + compile project(':SalmonEngineAndroid') +} diff --git a/proj.android-studio/app/proguard-rules.pro b/proj.android-studio/app/proguard-rules.pro new file mode 100755 index 0000000..8a2f402 --- /dev/null +++ b/proj.android-studio/app/proguard-rules.pro @@ -0,0 +1,17 @@ +# Add project specific ProGuard rules here. +# By default, the flags in this file are appended to flags specified +# in C:\Android\sdk/tools/proguard/proguard-android.txt +# You can edit the include path and order by changing the proguardFiles +# directive in build.gradle. +# +# For more details, see +# http://developer.android.com/guide/developing/tools/proguard.html + +# Add any project specific keep options here: + +# If your project uses WebView with JS, uncomment the following +# and specify the fully qualified class name to the JavaScript interface +# class: +#-keepclassmembers class fqcn.of.javascript.interface.for.webview { +# public *; +#} diff --git a/proj.android-studio/app/src/androidTest/java/fishrungames/salmonandroidtemplate/ExampleInstrumentedTest.java b/proj.android-studio/app/src/androidTest/java/fishrungames/salmonandroidtemplate/ExampleInstrumentedTest.java new file mode 100755 index 0000000..c282df4 --- /dev/null +++ b/proj.android-studio/app/src/androidTest/java/fishrungames/salmonandroidtemplate/ExampleInstrumentedTest.java @@ -0,0 +1,26 @@ +package fishrungames.salmonandroidtemplate; + +import android.content.Context; +import android.support.test.InstrumentationRegistry; +import android.support.test.runner.AndroidJUnit4; + +import org.junit.Test; +import org.junit.runner.RunWith; + +import static org.junit.Assert.*; + +/** + * Instrumentation test, which will execute on an Android device. + * + * @see Testing documentation + */ +@RunWith(AndroidJUnit4.class) +public class ExampleInstrumentedTest { + @Test + public void useAppContext() throws Exception { + // Context of the app under test. + Context appContext = InstrumentationRegistry.getTargetContext(); + + assertEquals("fishrungames.salmonandroidtemplate", appContext.getPackageName()); + } +} diff --git a/proj.android-studio/app/src/main/AndroidManifest.xml b/proj.android-studio/app/src/main/AndroidManifest.xml new file mode 100644 index 0000000..f755666 --- /dev/null +++ b/proj.android-studio/app/src/main/AndroidManifest.xml @@ -0,0 +1,39 @@ + + + + + + + + + + + + + + + diff --git a/proj.android-studio/app/src/main/java/fishrungames/doublehitballs/GL2JNIActivity.java b/proj.android-studio/app/src/main/java/fishrungames/doublehitballs/GL2JNIActivity.java new file mode 100755 index 0000000..a1558e3 --- /dev/null +++ b/proj.android-studio/app/src/main/java/fishrungames/doublehitballs/GL2JNIActivity.java @@ -0,0 +1,91 @@ +package fishrungames.doublehitballs; + +import fishrungames.salmonengineandroid.EngineWrapper; +//Deprecated +//import fishrungames.doublehitballs.R; + +import android.app.Activity; +import android.content.pm.ApplicationInfo; +import android.content.pm.PackageManager; +import android.content.pm.PackageManager.NameNotFoundException; +import android.os.Bundle; +import android.view.GestureDetector; +import android.view.KeyEvent; +import android.view.GestureDetector.SimpleOnGestureListener; +import android.view.MotionEvent; + +//Deprecated +//import java.lang.reflect.Field; + + +public class GL2JNIActivity extends Activity +{ + + GLView mView; + + @Override + protected void onCreate(Bundle icicle) + { + + super.onCreate(icicle); + + EngineWrapper.LoadSalmonEngineLibrary(); + EngineWrapper.SetActivityInstance(this); + EngineWrapper.SetupEnviroment(); + + String apkFilePath = null; + ApplicationInfo appInfo = null; + PackageManager packMgmr = this.getPackageManager(); + try { + appInfo = packMgmr.getApplicationInfo("fishrungames.DoubleHitBalls", 0); + } catch (NameNotFoundException e) { + + e.printStackTrace(); + + throw new RuntimeException("Unable to locate assets, aborting..."); + } + apkFilePath = appInfo.sourceDir; + + EngineWrapper.SetupApkFilePath(apkFilePath); + + mView = new GLView(getApplication()); + + setContentView(mView); + + EngineWrapper.SetView(mView); + + } + + @Override + protected void onPause() + { + EngineWrapper.CallDestroy(); + super.onPause(); + mView.onPause(); + } + + @Override + protected void onResume() + { + super.onResume(); + mView.onResume(); + } + + @Override + protected void onStop() + { + super.onStop(); + } + + public boolean onTouchEvent (MotionEvent event) + { + EngineWrapper.ProcessTouchEvent(event); + return true; + } + + public boolean onKeyDown(int keyCode, KeyEvent event) + { + EngineWrapper.ProcessKeyDown(keyCode, event); + return super.onKeyDown(keyCode, event); + } +} \ No newline at end of file diff --git a/proj.android-studio/app/src/main/java/fishrungames/doublehitballs/GLView.java b/proj.android-studio/app/src/main/java/fishrungames/doublehitballs/GLView.java new file mode 100755 index 0000000..ab012e3 --- /dev/null +++ b/proj.android-studio/app/src/main/java/fishrungames/doublehitballs/GLView.java @@ -0,0 +1,69 @@ +package fishrungames.doublehitballs; + + +import java.util.Calendar; + +import android.content.Context; +import android.opengl.GLSurfaceView; + +import javax.microedition.khronos.egl.EGLConfig; +import javax.microedition.khronos.opengles.GL10; + +import fishrungames.salmonengineandroid.GLViewAncestor; +import fishrungames.salmonengineandroid.EngineWrapper; + +class GLView extends GLViewAncestor +{ + static long lastTimeStamp; + static boolean gameIsInited = false; + + public GLView(Context context) + { + //Change this method? Don't forget to change method below! + super(context); + init(false, 0, 0); + } + + public GLView(Context context, boolean translucent, int depth, int stencil) + { + //Change this method? Don't forget to change method above! + super(context); + init(translucent, depth, stencil); + } + + public void init(boolean translucent, int depth, int stencil) + { + super.init(translucent, depth, stencil); + setRenderer(new Renderer()); + Calendar c = Calendar.getInstance(); + lastTimeStamp = c.getTimeInMillis(); + gameIsInited = true; + } + + private static class Renderer implements GLSurfaceView.Renderer + { + public void onDrawFrame(GL10 gl) + { + if (gameIsInited) + { + Calendar c = Calendar.getInstance(); + + long currentTimeStamp = c.getTimeInMillis(); + + EngineWrapper.Update(currentTimeStamp - lastTimeStamp); + + lastTimeStamp = currentTimeStamp; + } + } + + public void onSurfaceChanged(GL10 gl, int width, int height) + { + JniWrapper.Init(width,height); + } + + public void onSurfaceCreated(GL10 gl, EGLConfig config) + { + //Do nothing. + } + } +} \ No newline at end of file diff --git a/proj.android-studio/app/src/main/java/fishrungames/doublehitballs/JniWrapper.java b/proj.android-studio/app/src/main/java/fishrungames/doublehitballs/JniWrapper.java new file mode 100755 index 0000000..8e73337 --- /dev/null +++ b/proj.android-studio/app/src/main/java/fishrungames/doublehitballs/JniWrapper.java @@ -0,0 +1,12 @@ +package fishrungames.doublehitballs; + +public class JniWrapper +{ + static { + System.loadLibrary("DoubleHitBalls"); + } + + + public static native void Init(int width, int height); + +} \ No newline at end of file diff --git a/proj.android-studio/app/src/main/res/drawable-hdpi/ic_menu_template.png b/proj.android-studio/app/src/main/res/drawable-hdpi/ic_menu_template.png new file mode 100644 index 0000000000000000000000000000000000000000..1e28f93d8bf36cfbf1dff6efe4b4e1d0983dd616 GIT binary patch literal 3527 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 BkiY-{ literal 0 HcmV?d00001 diff --git a/proj.android-studio/app/src/main/res/drawable-ldpi/ic_menu_template.png b/proj.android-studio/app/src/main/res/drawable-ldpi/ic_menu_template.png new file mode 100644 index 0000000000000000000000000000000000000000..6a93cf262ac93c29c5e5e9a6351cb91254a24143 GIT binary patch literal 1460 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 literal 0 HcmV?d00001 diff --git a/proj.android-studio/app/src/main/res/values/strings.xml b/proj.android-studio/app/src/main/res/values/strings.xml new file mode 100644 index 0000000..e3f7331 --- /dev/null +++ b/proj.android-studio/app/src/main/res/values/strings.xml @@ -0,0 +1,29 @@ + + + + + + + + GL2JNI + + + diff --git a/proj.android-studio/app/src/test/java/fishrungames/salmonandroidtemplate/ExampleUnitTest.java b/proj.android-studio/app/src/test/java/fishrungames/salmonandroidtemplate/ExampleUnitTest.java new file mode 100755 index 0000000..49c0291 --- /dev/null +++ b/proj.android-studio/app/src/test/java/fishrungames/salmonandroidtemplate/ExampleUnitTest.java @@ -0,0 +1,17 @@ +package fishrungames.salmonandroidtemplate; + +import org.junit.Test; + +import static org.junit.Assert.*; + +/** + * Example local unit test, which will execute on the development machine (host). + * + * @see Testing documentation + */ +public class ExampleUnitTest { + @Test + public void addition_isCorrect() throws Exception { + assertEquals(4, 2 + 2); + } +} \ No newline at end of file diff --git a/proj.android-studio/build.gradle b/proj.android-studio/build.gradle new file mode 100755 index 0000000..74b2ab0 --- /dev/null +++ b/proj.android-studio/build.gradle @@ -0,0 +1,23 @@ +// Top-level build file where you can add configuration options common to all sub-projects/modules. + +buildscript { + repositories { + jcenter() + } + dependencies { + classpath 'com.android.tools.build:gradle:2.2.3' + + // NOTE: Do not place your application dependencies here; they belong + // in the individual module build.gradle files + } +} + +allprojects { + repositories { + jcenter() + } +} + +task clean(type: Delete) { + delete rootProject.buildDir +} diff --git a/proj.android-studio/gradle.properties b/proj.android-studio/gradle.properties new file mode 100755 index 0000000..aac7c9b --- /dev/null +++ b/proj.android-studio/gradle.properties @@ -0,0 +1,17 @@ +# Project-wide Gradle settings. + +# IDE (e.g. Android Studio) users: +# Gradle settings configured through the IDE *will override* +# any settings specified in this file. + +# For more details on how to configure your build environment visit +# http://www.gradle.org/docs/current/userguide/build_environment.html + +# Specifies the JVM arguments used for the daemon process. +# The setting is particularly useful for tweaking memory settings. +org.gradle.jvmargs=-Xmx1536m + +# When configured, Gradle will run in incubating parallel mode. +# This option should only be used with decoupled projects. More details, visit +# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects +# org.gradle.parallel=true diff --git a/proj.android-studio/gradle/wrapper/gradle-wrapper.jar b/proj.android-studio/gradle/wrapper/gradle-wrapper.jar new file mode 100755 index 0000000000000000000000000000000000000000..13372aef5e24af05341d49695ee84e5f9b594659 GIT binary patch literal 53636 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ⅅ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 H-+%o-(+5aQ literal 0 HcmV?d00001 diff --git a/proj.android-studio/gradle/wrapper/gradle-wrapper.properties b/proj.android-studio/gradle/wrapper/gradle-wrapper.properties new file mode 100755 index 0000000..04e285f --- /dev/null +++ b/proj.android-studio/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,6 @@ +#Mon Dec 28 10:00:20 PST 2015 +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-2.14.1-all.zip diff --git a/proj.android-studio/gradlew b/proj.android-studio/gradlew new file mode 100755 index 0000000..9d82f78 --- /dev/null +++ b/proj.android-studio/gradlew @@ -0,0 +1,160 @@ +#!/usr/bin/env bash + +############################################################################## +## +## Gradle start up script for UN*X +## +############################################################################## + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS="" + +APP_NAME="Gradle" +APP_BASE_NAME=`basename "$0"` + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD="maximum" + +warn ( ) { + echo "$*" +} + +die ( ) { + echo + echo "$*" + echo + exit 1 +} + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +case "`uname`" in + CYGWIN* ) + cygwin=true + ;; + Darwin* ) + darwin=true + ;; + MINGW* ) + msys=true + ;; +esac + +# Attempt to set APP_HOME +# Resolve links: $0 may be a link +PRG="$0" +# Need this for relative symlinks. +while [ -h "$PRG" ] ; do + ls=`ls -ld "$PRG"` + link=`expr "$ls" : '.*-> \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + PRG="$link" + else + PRG=`dirname "$PRG"`"/$link" + fi +done +SAVED="`pwd`" +cd "`dirname \"$PRG\"`/" >/dev/null +APP_HOME="`pwd -P`" +cd "$SAVED" >/dev/null + +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD="$JAVA_HOME/jre/sh/java" + else + JAVACMD="$JAVA_HOME/bin/java" + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD="java" + which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." +fi + +# Increase the maximum file descriptors if we can. +if [ "$cygwin" = "false" -a "$darwin" = "false" ] ; then + MAX_FD_LIMIT=`ulimit -H -n` + if [ $? -eq 0 ] ; then + if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then + MAX_FD="$MAX_FD_LIMIT" + fi + ulimit -n $MAX_FD + if [ $? -ne 0 ] ; then + warn "Could not set maximum file descriptor limit: $MAX_FD" + fi + else + warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" + fi +fi + +# For Darwin, add options to specify how the application appears in the dock +if $darwin; then + GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" +fi + +# For Cygwin, switch paths to Windows format before running java +if $cygwin ; then + APP_HOME=`cygpath --path --mixed "$APP_HOME"` + CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` + JAVACMD=`cygpath --unix "$JAVACMD"` + + # We build the pattern for arguments to be converted via cygpath + ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` + SEP="" + for dir in $ROOTDIRSRAW ; do + ROOTDIRS="$ROOTDIRS$SEP$dir" + SEP="|" + done + OURCYGPATTERN="(^($ROOTDIRS))" + # Add a user-defined pattern to the cygpath arguments + if [ "$GRADLE_CYGPATTERN" != "" ] ; then + OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" + fi + # Now convert the arguments - kludge to limit ourselves to /bin/sh + i=0 + for arg in "$@" ; do + CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` + CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option + + if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition + eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` + else + eval `echo args$i`="\"$arg\"" + fi + i=$((i+1)) + done + case $i in + (0) set -- ;; + (1) set -- "$args0" ;; + (2) set -- "$args0" "$args1" ;; + (3) set -- "$args0" "$args1" "$args2" ;; + (4) set -- "$args0" "$args1" "$args2" "$args3" ;; + (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; + (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; + (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; + (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; + (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; + esac +fi + +# Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules +function splitJvmOpts() { + JVM_OPTS=("$@") +} +eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS +JVM_OPTS[${#JVM_OPTS[*]}]="-Dorg.gradle.appname=$APP_BASE_NAME" + +exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@" diff --git a/proj.android-studio/gradlew.bat b/proj.android-studio/gradlew.bat new file mode 100755 index 0000000..8a0b282 --- /dev/null +++ b/proj.android-studio/gradlew.bat @@ -0,0 +1,90 @@ +@if "%DEBUG%" == "" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS= + +set DIRNAME=%~dp0 +if "%DIRNAME%" == "" set DIRNAME=. +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if "%ERRORLEVEL%" == "0" goto init + +echo. +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto init + +echo. +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:init +@rem Get command-line arguments, handling Windowz variants + +if not "%OS%" == "Windows_NT" goto win9xME_args +if "%@eval[2+2]" == "4" goto 4NT_args + +:win9xME_args +@rem Slurp the command line arguments. +set CMD_LINE_ARGS= +set _SKIP=2 + +:win9xME_args_slurp +if "x%~1" == "x" goto execute + +set CMD_LINE_ARGS=%* +goto execute + +:4NT_args +@rem Get arguments from the 4NT Shell from JP Software +set CMD_LINE_ARGS=%$ + +:execute +@rem Setup the command line + +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% + +:end +@rem End local scope for the variables with windows NT shell +if "%ERRORLEVEL%"=="0" goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 +exit /b 1 + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/proj.android-studio/settings.gradle b/proj.android-studio/settings.gradle new file mode 100755 index 0000000..f82ab8b --- /dev/null +++ b/proj.android-studio/settings.gradle @@ -0,0 +1,7 @@ +include ':SalmonEngineAndroid' +project(':SalmonEngineAndroid').projectDir =new File(settingsDir, '../../engine/SalmonEngineAndroid/app') + + +include ':app' + + diff --git a/windows/DoubleHitBalls-win/Debug/DoubleHitBalls-win.exe b/windows/DoubleHitBalls-win/Debug/DoubleHitBalls-win.exe old mode 100644 new mode 100755 diff --git a/windows/DoubleHitBalls-win/Debug/DoubleHitBalls-win.exp b/windows/DoubleHitBalls-win/Debug/DoubleHitBalls-win.exp old mode 100644 new mode 100755 diff --git a/windows/DoubleHitBalls-win/Debug/DoubleHitBalls-win.lib b/windows/DoubleHitBalls-win/Debug/DoubleHitBalls-win.lib old mode 100644 new mode 100755 diff --git a/windows/DoubleHitBalls-win/Debug/log.txt b/windows/DoubleHitBalls-win/Debug/log.txt old mode 100644 new mode 100755 diff --git a/windows/DoubleHitBalls-win/DoubleHitBalls-win.sln b/windows/DoubleHitBalls-win/DoubleHitBalls-win.sln old mode 100644 new mode 100755 diff --git a/windows/DoubleHitBalls-win/DoubleHitBalls-win/DoubleHitBalls-win.vcxproj b/windows/DoubleHitBalls-win/DoubleHitBalls-win/DoubleHitBalls-win.vcxproj old mode 100644 new mode 100755 diff --git a/windows/DoubleHitBalls-win/DoubleHitBalls-win/DoubleHitBalls-win.vcxproj.filters b/windows/DoubleHitBalls-win/DoubleHitBalls-win/DoubleHitBalls-win.vcxproj.filters old mode 100644 new mode 100755 diff --git a/windows/DoubleHitBalls-win/DoubleHitBalls-win/log.txt b/windows/DoubleHitBalls-win/DoubleHitBalls-win/log.txt old mode 100644 new mode 100755 diff --git a/windows/DoubleHitBalls-win/DoubleHitBalls-win/main.cpp b/windows/DoubleHitBalls-win/DoubleHitBalls-win/main.cpp old mode 100644 new mode 100755 diff --git a/windows/DoubleHitBalls-win/DoubleHitBalls-win/main.h b/windows/DoubleHitBalls-win/DoubleHitBalls-win/main.h old mode 100644 new mode 100755 diff --git a/windows/DoubleHitBalls-win/DoubleHitBalls-win/progress.txt b/windows/DoubleHitBalls-win/DoubleHitBalls-win/progress.txt old mode 100644 new mode 100755