From 8ce1c8b82e72ba10bf01dad9e96b33d767292b8f Mon Sep 17 00:00:00 2001 From: melaranc Date: Sat, 27 Jan 2024 20:46:45 -0800 Subject: [PATCH] initial commit for archival. --- .gitignore | 39 + AndroidManifest.xml | 24 + LICENSE.txt | 7 + README.md | 11 + ant.properties | 17 + assets/gfx/Hoppy_girl_gamelogo.png | Bin 0 -> 3916 bytes assets/gfx/black_bg.png | Bin 0 -> 2791 bytes assets/gfx/clouds_bg.png | Bin 0 -> 3881 bytes assets/gfx/crown_highscore.png | Bin 0 -> 2865 bytes assets/gfx/crystal_1.png | Bin 0 -> 2992 bytes assets/gfx/crystal_2.png | Bin 0 -> 2963 bytes assets/gfx/crystal_3.png | Bin 0 -> 3106 bytes assets/gfx/floor_tile.png | Bin 0 -> 2942 bytes assets/gfx/get_ready.png | Bin 0 -> 4487 bytes assets/gfx/leaderboard_button.png | Bin 0 -> 3106 bytes assets/gfx/numbers_tiled.png | Bin 0 -> 3155 bytes assets/gfx/player_tiled.png | Bin 0 -> 7333 bytes assets/gfx/replay_button.png | Bin 0 -> 3028 bytes assets/gfx/score_label_game.png | Bin 0 -> 2972 bytes assets/gfx/score_labels.png | Bin 0 -> 3843 bytes assets/gfx/splash_logo.png | Bin 0 -> 3135 bytes assets/gfx/tap_to_start.png | Bin 0 -> 3438 bytes assets/sfx/hitsound.wav | Bin 0 -> 82572 bytes assets/sfx/jumpsound.wav | Bin 0 -> 23036 bytes assets/sfx/pickup.wav | Bin 0 -> 39860 bytes assets/sfx/selectsound.wav | Bin 0 -> 10188 bytes build.xml | 92 +++ proguard-project.txt | 20 + project.properties | 17 + res/drawable-hdpi/ic_launcher.png | Bin 0 -> 3804 bytes res/drawable-ldpi/ic_launcher.png | Bin 0 -> 4765 bytes res/drawable-mdpi/ic_launcher.png | Bin 0 -> 3477 bytes res/drawable-xhdpi/ic_launcher.png | Bin 0 -> 3855 bytes res/drawable-xxhdpi/ic_launcher.png | Bin 0 -> 4452 bytes res/drawable-xxxhdpi/ic_launcher.png | Bin 0 -> 4627 bytes res/layout/main.xml | 13 + res/values/strings.xml | 5 + src/com/hkri/HoppyGirl/CloudsBG.java | 48 ++ src/com/hkri/HoppyGirl/CrystalObstacles.java | 110 +++ src/com/hkri/HoppyGirl/Floor.java | 61 ++ src/com/hkri/HoppyGirl/GameScreen.java | 733 +++++++++++++++++++ src/com/hkri/HoppyGirl/Hoppy_Girl.java | 198 +++++ src/com/hkri/HoppyGirl/Player.java | 228 ++++++ src/com/hkri/HoppyGirl/SplashScreen.java | 115 +++ src/com/hkri/HoppyGirl/StartScreen.java | 279 +++++++ 45 files changed, 2017 insertions(+) create mode 100644 .gitignore create mode 100644 AndroidManifest.xml create mode 100644 LICENSE.txt create mode 100644 README.md create mode 100644 ant.properties create mode 100644 assets/gfx/Hoppy_girl_gamelogo.png create mode 100644 assets/gfx/black_bg.png create mode 100644 assets/gfx/clouds_bg.png create mode 100644 assets/gfx/crown_highscore.png create mode 100644 assets/gfx/crystal_1.png create mode 100644 assets/gfx/crystal_2.png create mode 100644 assets/gfx/crystal_3.png create mode 100644 assets/gfx/floor_tile.png create mode 100644 assets/gfx/get_ready.png create mode 100644 assets/gfx/leaderboard_button.png create mode 100644 assets/gfx/numbers_tiled.png create mode 100644 assets/gfx/player_tiled.png create mode 100644 assets/gfx/replay_button.png create mode 100644 assets/gfx/score_label_game.png create mode 100644 assets/gfx/score_labels.png create mode 100644 assets/gfx/splash_logo.png create mode 100644 assets/gfx/tap_to_start.png create mode 100644 assets/sfx/hitsound.wav create mode 100644 assets/sfx/jumpsound.wav create mode 100644 assets/sfx/pickup.wav create mode 100644 assets/sfx/selectsound.wav create mode 100644 build.xml create mode 100644 proguard-project.txt create mode 100644 project.properties create mode 100644 res/drawable-hdpi/ic_launcher.png create mode 100644 res/drawable-ldpi/ic_launcher.png create mode 100644 res/drawable-mdpi/ic_launcher.png create mode 100644 res/drawable-xhdpi/ic_launcher.png create mode 100644 res/drawable-xxhdpi/ic_launcher.png create mode 100644 res/drawable-xxxhdpi/ic_launcher.png create mode 100644 res/layout/main.xml create mode 100644 res/values/strings.xml create mode 100644 src/com/hkri/HoppyGirl/CloudsBG.java create mode 100644 src/com/hkri/HoppyGirl/CrystalObstacles.java create mode 100644 src/com/hkri/HoppyGirl/Floor.java create mode 100644 src/com/hkri/HoppyGirl/GameScreen.java create mode 100644 src/com/hkri/HoppyGirl/Hoppy_Girl.java create mode 100644 src/com/hkri/HoppyGirl/Player.java create mode 100644 src/com/hkri/HoppyGirl/SplashScreen.java create mode 100644 src/com/hkri/HoppyGirl/StartScreen.java diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..7bb5ac3 --- /dev/null +++ b/.gitignore @@ -0,0 +1,39 @@ +# Gradle files +.gradle/ +build/ + +# Local configuration file (sdk path, etc) +local.properties + +# Log/OS Files +*.log + +# Android Studio generated files and folders +captures/ +.externalNativeBuild/ +.cxx/ +*.apk +output.json + +# IntelliJ +*.iml +.idea/ +misc.xml +deploymentTargetDropDown.xml +render.experimental.xml + +# Keystore files +*.jks +*.keystore + +# Google Services (e.g. APIs or Firebase) +google-services.json + +# Android Profiling +*.hprof + +# Output +gen/ +libs/ +bin/ +out/ diff --git a/AndroidManifest.xml b/AndroidManifest.xml new file mode 100644 index 0000000..4667e14 --- /dev/null +++ b/AndroidManifest.xml @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + diff --git a/LICENSE.txt b/LICENSE.txt new file mode 100644 index 0000000..2e082cf --- /dev/null +++ b/LICENSE.txt @@ -0,0 +1,7 @@ +Copyright 2014 John Espiritu + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/README.md b/README.md new file mode 100644 index 0000000..e6f5b19 --- /dev/null +++ b/README.md @@ -0,0 +1,11 @@ +# Hoppy Girl + +Hoppy Girl is a infinite running game for Android. + +## Status + +The project was developed for the old platforms. For this reason, it is archived for historical purposes and is no longer being maintained or updated. + +## Author + +* John Espiritu \ No newline at end of file diff --git a/ant.properties b/ant.properties new file mode 100644 index 0000000..b0971e8 --- /dev/null +++ b/ant.properties @@ -0,0 +1,17 @@ +# This file is used to override default values used by the Ant build system. +# +# This file must be checked into Version Control Systems, as it is +# integral to the build system of your project. + +# This file is only used by the Ant script. + +# You can use this to override default values such as +# 'source.dir' for the location of your java source folder and +# 'out.dir' for the location of your output folder. + +# You can also use it define how the release builds are signed by declaring +# the following properties: +# 'key.store' for the location of your keystore and +# 'key.alias' for the name of the key to use. +# The password will be asked during the build when you use the 'release' target. + diff --git a/assets/gfx/Hoppy_girl_gamelogo.png b/assets/gfx/Hoppy_girl_gamelogo.png new file mode 100644 index 0000000000000000000000000000000000000000..0ee98a653aa8992901d3aa0a54b4e1455a34aef1 GIT binary patch literal 3916 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 t0000INkl_*8N*`kr`TlOuI62?*}nvf++2qF7c zm?STLS>jFjJ>%{Bj_?2PkLS6b`#!GoKF{mCuID+P1Pe2LCi?UA001UK105>>$R?m? zJS{bJXHD@zLV?cD!1fjZ4ChD}87O$j1pvMIbp*n~!qYd<_m-!xAHN|2!S5H~>v8?2 zI{+awMb=oP^%{rT{=%-daXc=|*w>1kmfuP{3CET$0vDiTHHsH_Jk4&|aYk2{lIML% zJVk0ME}7j@oH3Dpie^QiG&TB3d}9CMm+&WE6D|8+2ajJ(s;^e>6g3Rfw9_)?7|2;F z;20~lFP!-t-P_gkWkpgmieAVMu+lcT3EVmoBm)PLs;Xia+iBhcvXC(bTF`D<*e=Z* zcf#^rJKuo}cb}|1F#WPIEshOnhNWsh1DbkdxS~7}YfwT7oCaK7mVt!?aJqE&>lnZl z9ps0T0sAZgcCwOmz<`$(;){B|Ag&xn-l|Sw8Q40H7qD9jbQcC}fDac4$a3wUOCT;(HtQ$we2JV-K&f~67s=xR5KEGWOijut=rB8YAx%0!WNg3~O2Hky^xvy#Z zznd6Ne)El8>@svAVBl=amS_D_bqbPqWXmolXlICa3y+?-EiH;4Qm8K~fEPE^$->hm zDz3Ux{4~DAiV19A+6Q2}*|*~pjFtlD8U1BA_+(4tNWVlF;5-a7`~kS8BP5CJZ_wza z1wf}H3jRWiXSah(yq%i2gKDmW;kT3GeQlwxPHk3gdN&+zfRkwTJ#AR*;0r#ulhh|o zKKXV_&)7^qX30*}Yi2b+mS4`a#T~GgC^|~5_q6An1!m&OToN&YskEH=F$V%229#%$ zg!ud7*(@&_rz;r9SS2F)Q3ib5Y60ZRaSnQK(yzP+viE++w&=@bMb%rXePVotAXF%w zzpq!y@X;+$rXY=@r0`?F%kyf@CLm-l5gw2m);&dzo*mU2 z^|2CM6R#|kH#jet**D|nRZpXwCC)GQK4zt8<=u+h3eSqbwmp53i>Ck61M4N2RsRhm zZXzpDo=EMUC#!{eQeZV-@fdkVA-Uz?Lp59NNZImsN%>$Q0R^p%G7w`2z7X2F`inP0>Iiw{{i}RW zpAkddz$ipL%Q(cP+O6R4tI8+UJNv^DarK=hqRctlIrq!`bi#=0lX1NiJ(lF_Jr2u4 z%icZSJx@faMFd2QO~0FN7Fd}Qo{2uYVsgc#cksht>EJ}ZLZO<>r0i%y&EH(u`Zn0rtaEzo0+Yd5pN<=j?`$F;-;Ca`0V&1Z@mm)Q?XH5 zC>VOUsS(k=o3kc`#SF6!PsuGeo*NMDx?W^mIHr%~#1d{r@5Co17~dO^%vF~xzi?Nk3Psh5-qlsyY=zid&Fl;;)n*rqikuf z#p+0Ngn1P9)vBPBt5iC=X7WW-SulRzd5cs1r+UDnW%XrMr3KjqTgMMd?M?5S2F&02 z7CXi)BJK*FxSfQZjDT{SFd3F2AxbOCp8W72?2bTNs)ov}`_KC64Xxx7f)=}0+P#{4 z#Eu#P&-Z^ns1ev-%^OM|y3QP95&3Q6BaQP{=cIR$jF)2KV$iV~sebX8^CL333c(|D zh+B&~zjShR77DR4=E~0{j1=JNc*z^8GfHpd-)Qtmdf0v##}r`xn9*j zbe4XZok}d$hPqnybz&pjd)&Ng1D#tN*(wrd>J@dZqyJvVD>AQj1{6IpCSrYVa^tEw zM#^^amGiIIA|7@2gv465SN>P|gT;624Qt?+QQecI)hjJmh8(tE2X5ET z63?MuqYIv^IC_5%{H}VOIcDD5{II#8mf+w;*bHlZ74EUW##5{`G{4&#`h(+SV!T*c zZN7CU%y++ge{YdvJ~H6a(a=EibnvCknilgG$6d`0t!c!3+_;AQ@!Ztb+}#`P!6iE* zbNc(#G10@v>3eA`2&%OFw1HTr*!AMe>dMMX8UaUZzsnKBZo?wQoX4fd1GStSQjrJa z>ytwxc_WW=w{tVwyzi79eQ#gqem>jN*>mA-Ux=K{wOyOTjgH{CV7{#yewfLfnR!AdxoIr66fFNlAzB>V+ zk_P~%Z-!&H9sra`Lme$-$jsmKmOe9@TrnfY-F7WxKieo3r3?KZiCfZlz!ZNkE3bN& zs@kTDI7*qB@2Ju=%9@S|8`^oHSNB$hCKpxrCkp;jhb^V)12C%`PN^z7++<`JIsrp# z){)~}+&%jP7Of(JsM*8-%*F!W&u&o-N-&mqqo9aNIQn!UU^Lo853>Ol)mh@>Fhd@( z5)7GUomE-}vKHq;1-cWhf{s!DCi^**hZd_*WqGX<-`q*$f#7~HMVqV}H>;scT*l36 z*yI$3teYMPPeUAab>xZcz^J~i)WOx23Q~~e=BiuSb4mv5>q!hqNg>Ix$Vg!?JO77v zluCFSOCaIc#G)-Sj7SOp30iO^KE7U%6Od9bZd<#5()l@#13Hd3EhQUG#0&j4q3JSQ|hic?F*Metj8A3I$s&;)Xy?$eb>pI*wx|H3l&D_RyCgiR|IEGY*v zh18J$?`BYvLX+@Qaqns%&C4UE>2FkDn4&-;^l+tu`Apl{ds*fP50G|lySP$)D|g6t zgGi;>pxh&?){~6-KLZ*U+IBfRsybQWXdwQbLP>6pAqfylh#{fb6;Z(vMMVS~$e@S=j*ftg6;Uhf59&ghTmgWD0l;*T zI709Y^p6lP1rIRMx#05C~cW=H_Aw*bJ-5DT&Z2n+x)QHX^p z00esgV8|mQcmRZ%02D^@S3L16t`O%c004NIvOKvYIYoh62rY33S640`D9%Y2D-rV&neh&#Q1i z007~1e$oCcFS8neI|hJl{-P!B1ZZ9hpmq0)X0i`JwE&>$+E?>%_LC6RbVIkUx0b+_+BaR3cnT7Zv!AJxW zizFb)h!jyGOOZ85F;a?DAXP{m@;!0_IfqH8(HlgRxt7s3}k3K`kFu>>-2Q$QMFfPW!La{h336o>X zu_CMttHv6zR;&ZNiS=X8v3CR#fknUxHUxJ0uoBa_M6WNWeqIg~6QE69c9o#eyhGvpiOA@W-aonk<7r1(?fC{oI5N*U!4 zfg=2N-7=cNnjjOr{yriy6mMFgG#l znCF=fnQv8CDz++o6_Lscl}eQ+l^ZHARH>?_s@|##Rr6KLRFA1%Q+=*RRWnoLsR`7U zt5vFIcfW3@?wFpwUVxrVZ>QdQz32KIeJ}k~{cZZE^+ya? z2D1z#2HOnI7(B%_ac?{wFUQ;QQA1tBKtrWrm0_3Rgps+?Jfqb{jYbcQX~taRB;#$y zZN{S}1|}gUOHJxc?wV3fxuz+mJ4`!F$IZ;mqRrNsHJd##*D~ju=bP7?-?v~|cv>vB zsJ6IeNwVZxrdjT`yl#bBIa#GxRa#xMMy;K#CDyyGyQdMSxlWT#tDe?p!?5wT$+oGt z8L;Kp2HUQ-ZMJ=3XJQv;x5ci*?vuTfeY$;({XGW_huIFR9a(?@3)XSs8O^N5RyOM=TTmp(3=8^+zpz2r)C z^>JO{deZfso3oq3?Wo(Y?l$ge?uXo;%ru`Vo>?<<(8I_>;8Eq#KMS9gFl*neeosSB zfoHYnBQIkwkyowPu(zdms`p{<7e4kra-ZWq<2*OsGTvEV%s0Td$hXT+!*8Bnh2KMe zBmZRodjHV?r+_5^X9J0WL4jKW`}lf%A-|44I@@LTvf1rHjG(ze6+w@Jt%Bvjts!X0 z?2xS?_ve_-kiKB_KiJlZ$9G`c^=E@oNG)mWWaNo-3TIW8)$Hg0Ub-~8?KhvJ>$ z3*&nim@mj(aCxE5!t{lw7O5^0EIO7zOo&c6l<+|iDySBWCGrz@C5{St!X3hAA}`T4 z(TLbXTq+(;@<=L8dXnssyft|w#WSTW<++3>sgS%(4NTpeI-VAqb|7ssJvzNHgOZVu zaYCvgO_R1~>SyL=cFU|~g|hy|Zi}}s9+d~lYqOB71z9Z$wnC=pR9Yz4DhIM>Wmjgu z&56o6maCpC&F##y%G;1PobR9i?GnNg;gYtchD%p19a!eQtZF&3JaKv33gZ<8D~47E ztUS1iwkmDaPpj=$m#%)jCVEY4fnLGNg2A-`YwHVD3gv};>)hAvT~AmqS>Lr``i7kw zJ{5_It`yrBmlc25DBO7E8;5VoznR>Ww5hAaxn$2~(q`%A-YuS64wkBy=9dm`4cXeX z4c}I@?e+FW+b@^RDBHV(wnMq2zdX3SWv9u`%{xC-q*U}&`cyXV(%rRT*Z6MH?i+i& z_B8C(+grT%{XWUQ+f@NoP1R=AW&26{v-dx)iK^-Nmiuj8txj!m?Z*Ss1N{dh4z}01 z)YTo*JycSU)+_5r4#yw9{+;i4Ee$peRgIj+;v;ZGdF1K$3E%e~4LaI(jC-u%2h$&R z9cLXcYC@Xwnns&bn)_Q~Te?roKGD|d-g^8;+aC{{G(1^(O7m37Y1-+6)01cN&y1aw zoqc{T`P^XJqPBbIW6s}d4{z_f5Om?vMgNQEJG?v2T=KYd^0M3I6IZxbny)%vZR&LD zJpPl@Psh8QyPB@KTx+@RdcC!KX7}kEo;S|j^u2lU7XQ}Oo;f|;z4Ll+_r>@1-xl3| zawq-H%e&ckC+@AhPrP6BKT#_XdT7&;F71j}Joy zkC~6lh7E@6o;W@^IpRNZ{ptLtL(gQ-CY~4mqW;US7Zxvm_|@yz&e53Bp_lTPlfP|z zrTyx_>lv@x#=^!PzR7qqF<$gm`|ZJZ+;<)Cqu&ot2z=0000WV@Og>004R=004l4008;_004mL004C`008P>0026e000+nl3&F} z00017NklKLZ*U+IBfRsybQWXdwQbLP>6pAqfylh#{fb6;Z(vMMVS~$e@S=j*ftg6;Uhf59&ghTmgWD0l;*T zI709Y^p6lP1rIRMx#05C~cW=H_Aw*bJ-5DT&Z2n+x)QHX^p z00esgV8|mQcmRZ%02D^@S3L16t`O%c004NIvOKvYIYoh62rY33S640`D9%Y2D-rV&neh&#Q1i z007~1e$oCcFS8neI|hJl{-P!B1ZZ9hpmq0)X0i`JwE&>$+E?>%_LC6RbVIkUx0b+_+BaR3cnT7Zv!AJxW zizFb)h!jyGOOZ85F;a?DAXP{m@;!0_IfqH8(HlgRxt7s3}k3K`kFu>>-2Q$QMFfPW!La{h336o>X zu_CMttHv6zR;&ZNiS=X8v3CR#fknUxHUxJ0uoBa_M6WNWeqIg~6QE69c9o#eyhGvpiOA@W-aonk<7r1(?fC{oI5N*U!4 zfg=2N-7=cNnjjOr{yriy6mMFgG#l znCF=fnQv8CDz++o6_Lscl}eQ+l^ZHARH>?_s@|##Rr6KLRFA1%Q+=*RRWnoLsR`7U zt5vFIcfW3@?wFpwUVxrVZ>QdQz32KIeJ}k~{cZZE^+ya? z2D1z#2HOnI7(B%_ac?{wFUQ;QQA1tBKtrWrm0_3Rgps+?Jfqb{jYbcQX~taRB;#$y zZN{S}1|}gUOHJxc?wV3fxuz+mJ4`!F$IZ;mqRrNsHJd##*D~ju=bP7?-?v~|cv>vB zsJ6IeNwVZxrdjT`yl#bBIa#GxRa#xMMy;K#CDyyGyQdMSxlWT#tDe?p!?5wT$+oGt z8L;Kp2HUQ-ZMJ=3XJQv;x5ci*?vuTfeY$;({XGW_huIFR9a(?@3)XSs8O^N5RyOM=TTmp(3=8^+zpz2r)C z^>JO{deZfso3oq3?Wo(Y?l$ge?uXo;%ru`Vo>?<<(8I_>;8Eq#KMS9gFl*neeosSB zfoHYnBQIkwkyowPu(zdms`p{<7e4kra-ZWq<2*OsGTvEV%s0Td$hXT+!*8Bnh2KMe zBmZRodjHV?r+_5^X9J0WL4jKW`}lf%A-|44I@@LTvf1rHjG(ze6+w@Jt%Bvjts!X0 z?2xS?_ve_-kiKB_KiJlZ$9G`c^=E@oNG)mWWaNo-3TIW8)$Hg0Ub-~8?KhvJ>$ z3*&nim@mj(aCxE5!t{lw7O5^0EIO7zOo&c6l<+|iDySBWCGrz@C5{St!X3hAA}`T4 z(TLbXTq+(;@<=L8dXnssyft|w#WSTW<++3>sgS%(4NTpeI-VAqb|7ssJvzNHgOZVu zaYCvgO_R1~>SyL=cFU|~g|hy|Zi}}s9+d~lYqOB71z9Z$wnC=pR9Yz4DhIM>Wmjgu z&56o6maCpC&F##y%G;1PobR9i?GnNg;gYtchD%p19a!eQtZF&3JaKv33gZ<8D~47E ztUS1iwkmDaPpj=$m#%)jCVEY4fnLGNg2A-`YwHVD3gv};>)hAvT~AmqS>Lr``i7kw zJ{5_It`yrBmlc25DBO7E8;5VoznR>Ww5hAaxn$2~(q`%A-YuS64wkBy=9dm`4cXeX z4c}I@?e+FW+b@^RDBHV(wnMq2zdX3SWv9u`%{xC-q*U}&`cyXV(%rRT*Z6MH?i+i& z_B8C(+grT%{XWUQ+f@NoP1R=AW&26{v-dx)iK^-Nmiuj8txj!m?Z*Ss1N{dh4z}01 z)YTo*JycSU)+_5r4#yw9{+;i4Ee$peRgIj+;v;ZGdF1K$3E%e~4LaI(jC-u%2h$&R z9cLXcYC@Xwnns&bn)_Q~Te?roKGD|d-g^8;+aC{{G(1^(O7m37Y1-+6)01cN&y1aw zoqc{T`P^XJqPBbIW6s}d4{z_f5Om?vMgNQEJG?v2T=KYd^0M3I6IZxbny)%vZR&LD zJpPl@Psh8QyPB@KTx+@RdcC!KX7}kEo;S|j^u2lU7XQ}Oo;f|;z4Ll+_r>@1-xl3| zawq-H%e&ckC+@AhPrP6BKT#_XdT7&;F71j}Joy zkC~6lh7E@6o;W@^IpRNZ{ptLtL(gQ-CY~4mqW;US7Zxvm_|@yz&e53Bp_lTPlfP|z zrTyx_>lv@x#=^!PzR7qqF<$gm`|ZJZ+;<)Cqu&ot2z=0000WV@Og>004R=004l4008;_004mL004C`008P>0026e000+nl3&F} z0002nNklhSnRplt()Wq+_oH_T}iuIPnQ=dC$5wS9i?IP3Z z_5F;;L>}wB#AEmR)!T8t9%GMnYGMnn^%&DJc|PMn4`8of-;$VHYc|_?WafQ6Zna{$ z^BLQ1{rHP<;N;of?sj3V1${5dxa6PEpD~8V@E9J0F+7IH@EDBYF+2uicnptAG7cw> mCM{(JJ)7~iUhzD}p8){#jL3Jfo=DmN0000P)KLZ*U+IBfRsybQWXdwQbLP>6pAqfylh#{fb6;Z(vMMVS~$e@S=j*ftg6;Uhf59&ghTmgWD0l;*T zI709Y^p6lP1rIRMx#05C~cW=H_Aw*bJ-5DT&Z2n+x)QHX^p z00esgV8|mQcmRZ%02D^@S3L16t`O%c004NIvOKvYIYoh62rY33S640`D9%Y2D-rV&neh&#Q1i z007~1e$oCcFS8neI|hJl{-P!B1ZZ9hpmq0)X0i`JwE&>$+E?>%_LC6RbVIkUx0b+_+BaR3cnT7Zv!AJxW zizFb)h!jyGOOZ85F;a?DAXP{m@;!0_IfqH8(HlgRxt7s3}k3K`kFu>>-2Q$QMFfPW!La{h336o>X zu_CMttHv6zR;&ZNiS=X8v3CR#fknUxHUxJ0uoBa_M6WNWeqIg~6QE69c9o#eyhGvpiOA@W-aonk<7r1(?fC{oI5N*U!4 zfg=2N-7=cNnjjOr{yriy6mMFgG#l znCF=fnQv8CDz++o6_Lscl}eQ+l^ZHARH>?_s@|##Rr6KLRFA1%Q+=*RRWnoLsR`7U zt5vFIcfW3@?wFpwUVxrVZ>QdQz32KIeJ}k~{cZZE^+ya? z2D1z#2HOnI7(B%_ac?{wFUQ;QQA1tBKtrWrm0_3Rgps+?Jfqb{jYbcQX~taRB;#$y zZN{S}1|}gUOHJxc?wV3fxuz+mJ4`!F$IZ;mqRrNsHJd##*D~ju=bP7?-?v~|cv>vB zsJ6IeNwVZxrdjT`yl#bBIa#GxRa#xMMy;K#CDyyGyQdMSxlWT#tDe?p!?5wT$+oGt z8L;Kp2HUQ-ZMJ=3XJQv;x5ci*?vuTfeY$;({XGW_huIFR9a(?@3)XSs8O^N5RyOM=TTmp(3=8^+zpz2r)C z^>JO{deZfso3oq3?Wo(Y?l$ge?uXo;%ru`Vo>?<<(8I_>;8Eq#KMS9gFl*neeosSB zfoHYnBQIkwkyowPu(zdms`p{<7e4kra-ZWq<2*OsGTvEV%s0Td$hXT+!*8Bnh2KMe zBmZRodjHV?r+_5^X9J0WL4jKW`}lf%A-|44I@@LTvf1rHjG(ze6+w@Jt%Bvjts!X0 z?2xS?_ve_-kiKB_KiJlZ$9G`c^=E@oNG)mWWaNo-3TIW8)$Hg0Ub-~8?KhvJ>$ z3*&nim@mj(aCxE5!t{lw7O5^0EIO7zOo&c6l<+|iDySBWCGrz@C5{St!X3hAA}`T4 z(TLbXTq+(;@<=L8dXnssyft|w#WSTW<++3>sgS%(4NTpeI-VAqb|7ssJvzNHgOZVu zaYCvgO_R1~>SyL=cFU|~g|hy|Zi}}s9+d~lYqOB71z9Z$wnC=pR9Yz4DhIM>Wmjgu z&56o6maCpC&F##y%G;1PobR9i?GnNg;gYtchD%p19a!eQtZF&3JaKv33gZ<8D~47E ztUS1iwkmDaPpj=$m#%)jCVEY4fnLGNg2A-`YwHVD3gv};>)hAvT~AmqS>Lr``i7kw zJ{5_It`yrBmlc25DBO7E8;5VoznR>Ww5hAaxn$2~(q`%A-YuS64wkBy=9dm`4cXeX z4c}I@?e+FW+b@^RDBHV(wnMq2zdX3SWv9u`%{xC-q*U}&`cyXV(%rRT*Z6MH?i+i& z_B8C(+grT%{XWUQ+f@NoP1R=AW&26{v-dx)iK^-Nmiuj8txj!m?Z*Ss1N{dh4z}01 z)YTo*JycSU)+_5r4#yw9{+;i4Ee$peRgIj+;v;ZGdF1K$3E%e~4LaI(jC-u%2h$&R z9cLXcYC@Xwnns&bn)_Q~Te?roKGD|d-g^8;+aC{{G(1^(O7m37Y1-+6)01cN&y1aw zoqc{T`P^XJqPBbIW6s}d4{z_f5Om?vMgNQEJG?v2T=KYd^0M3I6IZxbny)%vZR&LD zJpPl@Psh8QyPB@KTx+@RdcC!KX7}kEo;S|j^u2lU7XQ}Oo;f|;z4Ll+_r>@1-xl3| zawq-H%e&ckC+@AhPrP6BKT#_XdT7&;F71j}Joy zkC~6lh7E@6o;W@^IpRNZ{ptLtL(gQ-CY~4mqW;US7Zxvm_|@yz&e53Bp_lTPlfP|z zrTyx_>lv@x#=^!PzR7qqF<$gm`|ZJZ+;<)Cqu&ot2z=0000WV@Og>004R=004l4008;_004mL004C`008P>0026e000+nl3&F} z0002KNklP1P#o%lp%>*|$;a@21s@q01{=U&WQFCiZ0xqB87Y~vU=oerf@?j;bSBSt9Owb;_3KB7xwVGT&eoat^>{QD)19x} zF6+l1jsqtTYrETxwFu^YQ^#BW3H_Mk%5mkma$Jrp$A6yVV*r(1e>OL=B;No4002ov JPDHLkV1hr3g~b2> literal 0 HcmV?d00001 diff --git a/assets/gfx/crystal_3.png b/assets/gfx/crystal_3.png new file mode 100644 index 0000000000000000000000000000000000000000..269dda1c9bb0049a5acdd894c25b034c33620917 GIT binary patch literal 3106 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 literal 0 HcmV?d00001 diff --git a/assets/gfx/floor_tile.png b/assets/gfx/floor_tile.png new file mode 100644 index 0000000000000000000000000000000000000000..c12ac57b4cb1ed3776bd60498dc1b6c5e54672b5 GIT binary patch literal 2942 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

-t5x{xZt9Lky-s?vbdPxi;SamI@q=Jy!3&1n)vO)TN=vB zOPT@an`dRPVb@`yLbi+77X!6ytWuFD8rX8y12|BCM&U2S=JNdm@1 VAgaHO6&_zvV5n=RQww#B{x?zwRE_`u literal 0 HcmV?d00001 diff --git a/assets/gfx/get_ready.png b/assets/gfx/get_ready.png new file mode 100644 index 0000000000000000000000000000000000000000..900205f0ce9b05da5ed1811c16b5351a4bad9c23 GIT binary patch literal 4487 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 Q`#n||=)i6kXgNIjKbT!*SpWb4 literal 0 HcmV?d00001 diff --git a/assets/gfx/replay_button.png b/assets/gfx/replay_button.png new file mode 100644 index 0000000000000000000000000000000000000000..fb71432c4e70826d30bcbb19e27b159033fc260f GIT binary patch literal 3028 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 SvxM{j0000Y&>GSJty000mjWgkvQ zL&1rYlnhFM`03jP006_KzY7FpzrF$h^k!a2)ssz z2%f@OqOB~~E~_2R?jelgF)xjLE!gQ`7KlU)8&(L;3xOKO^S+&AH*deFqXXvZ&5Nf_ zPR1m$n~O6(qo1H%;>}NvdKdrfD``ITo%dMN;Y$Bm-MIQ{#V)RPkhYDE@s+-;xjcrk z6mjk1�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 Q-T(jq07*qoM6N<$f}Zecl>h($ literal 0 HcmV?d00001 diff --git a/assets/sfx/hitsound.wav b/assets/sfx/hitsound.wav new file mode 100644 index 0000000000000000000000000000000000000000..cf78d69398ced7e773d6286b4bc827d7ba67f6b1 GIT binary patch literal 82572 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 literal 0 HcmV?d00001 diff --git a/assets/sfx/jumpsound.wav b/assets/sfx/jumpsound.wav new file mode 100644 index 0000000000000000000000000000000000000000..0c15846833b95f3b12a50cf523b40172ecd3a722 GIT binary patch literal 23036 zcmb@uWpEqYx~=V4(A{E|EHg8OIV;S}%;+#PGc$9t!pzJ}W@eJbEHz2?H`VdZS$m&z z?{};2t@U@6Dw4bB9Pb# z?e=qR+Q!VGIj+3Lg`bOUrLOX-%A3{0YBcI`+BZ7H(8f5%G}AoYGQ`^0Mz?>quX02= zzc|OBT67ks#zx^^@OWYeQAIQ(H<7JqjwWs z^6P{zv0l+rBAlVOf_DUN_rK<=@#&;^D(faSim!=Q2*(Nr^GER(aF24nvpMWxtUHJp zSpz$ug%HWy#tdY>V2ouzj7Rk8^k8}k?F?-)EuKbrfAyZH`t^gC=96j5KAjg(xTyG2 z>4WmKm9wh-YwoGzw0m@gdXcfIsf)RbrHNH)tFhg%PjU#H_nh6)Ty!Lsi}k{v;(^3! zB9DkAmy_>F*wx*&$@R)*bA`DFx>vg|yMMYZZc*((M)xK)$uAN<#=4^>M%Y8I2X77B z>VL(z#;1egiL8s%AigSEE*v8m#2?9<&piUZ1si;e+lYwz77HMP`WDX_W5Bm~_~%

kK!IpH08aA1ybmn{55; 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 QDe!|2j53{3DbE1^2Afn}umAu6 literal 0 HcmV?d00001 diff --git a/assets/sfx/pickup.wav b/assets/sfx/pickup.wav new file mode 100644 index 0000000000000000000000000000000000000000..25a2fa7472e3a2a2e65b28b1d160ae954e0943ba GIT binary patch literal 39860 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 Ze=G3c3jDVM|E<7(EAZb6{Qs~5{||xlnSKBO literal 0 HcmV?d00001 diff --git a/assets/sfx/selectsound.wav b/assets/sfx/selectsound.wav new file mode 100644 index 0000000000000000000000000000000000000000..6b42dffd75461b3b22133899ea15e1c894c3890f GIT binary patch literal 10188 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 + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/proguard-project.txt b/proguard-project.txt new file mode 100644 index 0000000..f2fe155 --- /dev/null +++ b/proguard-project.txt @@ -0,0 +1,20 @@ +# To enable ProGuard in your project, edit project.properties +# to define the proguard.config property as described in that file. +# +# Add project specific ProGuard rules here. +# By default, the flags in this file are appended to flags specified +# in ${sdk.dir}/tools/proguard/proguard-android.txt +# You can edit the include path and order by changing the ProGuard +# include property in project.properties. +# +# 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/project.properties b/project.properties new file mode 100644 index 0000000..5742344 --- /dev/null +++ b/project.properties @@ -0,0 +1,17 @@ +# This file is automatically generated by Android Tools. +# Do not modify this file -- YOUR CHANGES WILL BE ERASED! +# +# This file must be checked in Version Control Systems. +# +# To customize properties used by the Ant build system edit +# "ant.properties", and override values to adapt the script to your +# project structure. +# +# To enable ProGuard to shrink and obfuscate your code, uncomment this (available properties: sdk.dir, user.home): +#proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt + +# Project target. +target=android-15 +android.library=false +android.library.reference.1=../../Documents/Programming/~Libraries/AndEngine-GLES2 +android.library.reference.2=../../../../adt-bundle-windows-x86_64-20131030/sdk/extras/google/google_play_services/libproject/google-play-services_lib diff --git a/res/drawable-hdpi/ic_launcher.png b/res/drawable-hdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..3ad8df216525edf0ed0c7817a4f406c4e19f3842 GIT binary patch literal 3804 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 literal 0 HcmV?d00001 diff --git a/res/drawable-mdpi/ic_launcher.png b/res/drawable-mdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..bd2c78fe87396f99f2abc092459e905f04797cc4 GIT binary patch literal 3477 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 literal 0 HcmV?d00001 diff --git a/res/drawable-xhdpi/ic_launcher.png b/res/drawable-xhdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..d6c2386c340d733318e7c6693dd2bfe2a007a61b GIT binary patch literal 3855 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 literal 0 HcmV?d00001 diff --git a/res/layout/main.xml b/res/layout/main.xml new file mode 100644 index 0000000..3aad54e --- /dev/null +++ b/res/layout/main.xml @@ -0,0 +1,13 @@ + + + + + diff --git a/res/values/strings.xml b/res/values/strings.xml new file mode 100644 index 0000000..ef427a2 --- /dev/null +++ b/res/values/strings.xml @@ -0,0 +1,5 @@ + + + Hoppy Girl + ca-app-pub-4163275117282430/4666967907 + diff --git a/src/com/hkri/HoppyGirl/CloudsBG.java b/src/com/hkri/HoppyGirl/CloudsBG.java new file mode 100644 index 0000000..dd0a407 --- /dev/null +++ b/src/com/hkri/HoppyGirl/CloudsBG.java @@ -0,0 +1,48 @@ +package com.hkri.HoppyGirl; + +import org.andengine.engine.Engine; +import org.andengine.entity.scene.Scene; +import org.andengine.entity.sprite.Sprite; +import org.andengine.opengl.texture.region.ITextureRegion; + +/** + * (c) 2014 John Espiritu + * (c) 2014 hkri studios + * + * @author John Espiritu + * @since December 27, 2014 + * + */ + +public class CloudsBG { + + ITextureRegion mRegion; + Engine mEngine; + + Sprite mCloudSprite; + + public CloudsBG(ITextureRegion rgn, Engine ngn) { + mRegion = rgn; + mEngine = ngn; + } + + public void attachSprite(Scene scn, float pX, float pY){ + mCloudSprite = new Sprite(pX, pY, mRegion, mEngine.getVertexBufferObjectManager()); + scn.attachChild(mCloudSprite); + } + + public Sprite getSprite(){ return mCloudSprite; } + + public float getW(){ return mCloudSprite.getWidth(); } + + public float getH(){ return mCloudSprite.getHeight(); } + + public float getX(){ return mCloudSprite.getX(); } + + public float getY(){ return mCloudSprite.getY(); } + + public void setX(float pX) { mCloudSprite.setX(pX); } + + public void setY(float pY) { mCloudSprite.setX(pY); } + +} diff --git a/src/com/hkri/HoppyGirl/CrystalObstacles.java b/src/com/hkri/HoppyGirl/CrystalObstacles.java new file mode 100644 index 0000000..8c2b41b --- /dev/null +++ b/src/com/hkri/HoppyGirl/CrystalObstacles.java @@ -0,0 +1,110 @@ +package com.hkri.HoppyGirl; + +import org.andengine.engine.Engine; +import org.andengine.entity.primitive.Rectangle; +import org.andengine.entity.scene.Scene; +import org.andengine.entity.sprite.Sprite; +import org.andengine.opengl.texture.region.ITextureRegion; + +/** + * (c) 2014 John Espiritu + * (c) 2014 hkri studios + * + * @author John Espiritu + * @since December 30, 2014 + * + */ + +public class CrystalObstacles { + + //Crystal Regions + ITextureRegion crystalRegion1, crystalRegion2, crystalRegion3; + Sprite crystalSprite; + int currentCrystalType = -1; + + //Passed flag + public boolean obstacleChecked = false; + + //Game settings + Engine mEngine; + + //Hit area + Rectangle[] hitArea = new Rectangle[4]; + + public CrystalObstacles(ITextureRegion c1, ITextureRegion c2, ITextureRegion c3, Engine ngn){ + crystalRegion1 = c1; crystalRegion2 = c2; crystalRegion3 = c3; + mEngine = ngn; + } + + public void disposeObject(Scene scn){ + scn.detachChild(crystalSprite); + for(Rectangle rt : hitArea) + if(rt.isDisposed() == false )rt.dispose(); + if(crystalSprite.isDisposed() == false )crystalSprite.dispose(); + } + + public void attachCrystal(Scene scn, float pX, float pYBottom, int crystalType){ + hitArea = new Rectangle[4]; + currentCrystalType = crystalType; + if(crystalType == 0) { + crystalSprite = new Sprite(pX, pYBottom, crystalRegion1, mEngine.getVertexBufferObjectManager()); + hitArea[0] = new Rectangle(getX(), getY() + 19, 22, 64, mEngine.getVertexBufferObjectManager()); + hitArea[1] = new Rectangle(getX() + 9, getY(), 6, 18, mEngine.getVertexBufferObjectManager()); + hitArea[2] = new Rectangle(getX() + 5, getY() + 10, 14, 9, mEngine.getVertexBufferObjectManager()); + hitArea[3] = new Rectangle(getX() + 2, getY() + 14, 18, 4, mEngine.getVertexBufferObjectManager()); + } + else if(crystalType == 1) { + crystalSprite = new Sprite(pX, pYBottom, crystalRegion2, mEngine.getVertexBufferObjectManager()); + hitArea[0] = new Rectangle(getX(), getY() + 18, 22, 34, mEngine.getVertexBufferObjectManager()); + hitArea[1] = new Rectangle(getX() + 9, getY() + 1, 6, 18, mEngine.getVertexBufferObjectManager()); + hitArea[2] = new Rectangle(getX() + 4, getY() + 10, 14, 8, mEngine.getVertexBufferObjectManager()); + hitArea[3] = new Rectangle(getX() + 2, getY() + 14, 18, 4, mEngine.getVertexBufferObjectManager()); + } + else if(crystalType == 2) { + crystalSprite = new Sprite(pX, pYBottom, crystalRegion3, mEngine.getVertexBufferObjectManager()); + hitArea[0] = new Rectangle(getX() + 10, getY() + 30, 34, 46, mEngine.getVertexBufferObjectManager()); + hitArea[1] = new Rectangle(getX() + 1, getY() + 44, 10, 32, mEngine.getVertexBufferObjectManager()); + hitArea[2] = new Rectangle(getX() + 30, getY() + 0, 6, 35, mEngine.getVertexBufferObjectManager()); + hitArea[3] = new Rectangle(getX() + 22, getY() + 14, 22, 20, mEngine.getVertexBufferObjectManager()); + } + crystalSprite.setY(crystalSprite.getY() - crystalSprite.getHeight()); + scn.attachChild(crystalSprite); + } + + public Rectangle[] getCollidingRectangles(){ + return hitArea; + } + + private void updateColliderPosition(){ + if(currentCrystalType == 0) { + hitArea[0].setPosition(getX(), getY() + 19); + hitArea[1].setPosition(getX() + 9, getY()); + hitArea[2].setPosition(getX() + 5, getY() + 10); + hitArea[3].setPosition(getX() + 2, getY() + 14); + } + else if(currentCrystalType == 1) { + hitArea[0].setPosition(getX(), getY() + 18); + hitArea[1].setPosition(getX() + 9, getY() + 1); + hitArea[2].setPosition(getX() + 4, getY() + 10); + hitArea[3].setPosition(getX() + 2, getY() + 14); + } + else if(currentCrystalType == 2) { + hitArea[0].setPosition(getX() + 10, getY() + 30); + hitArea[1].setPosition(getX() + 1, getY() + 44); + hitArea[2].setPosition(getX() + 30, getY() + 0); + hitArea[3].setPosition(getX() + 22, getY() + 14); + } + } + + public Sprite getSprite(){ + return crystalSprite; + } + + public void setX(float nval) { crystalSprite.setX(nval); updateColliderPosition(); } + public void setY(float nval) { crystalSprite.setY(nval); updateColliderPosition(); } + public float getX() { return crystalSprite.getX();} + public float getY() { return crystalSprite.getY();} + public float getW() { return crystalSprite.getWidth();} + public float getH() { return crystalSprite.getHeight();} + +} diff --git a/src/com/hkri/HoppyGirl/Floor.java b/src/com/hkri/HoppyGirl/Floor.java new file mode 100644 index 0000000..24f0c25 --- /dev/null +++ b/src/com/hkri/HoppyGirl/Floor.java @@ -0,0 +1,61 @@ +package com.hkri.HoppyGirl; + +import org.andengine.engine.Engine; +import org.andengine.entity.scene.Scene; +import org.andengine.entity.sprite.Sprite; +import org.andengine.opengl.texture.region.ITextureRegion; + +/** + * (c) 2014 John Espiritu + * (c) 2014 hkri studios + * + * @author John Espiritu + * @since December 29, 2014 + * + */ + +public class Floor { + + Sprite floorSprite; + ITextureRegion floorRegion; + Engine mEngine; + + public Floor(ITextureRegion rgn, Engine ngn){ + floorRegion = rgn; + mEngine = ngn; + } + + public void attachSprite(Scene pScene, float pX, float pY){ + floorSprite = new Sprite(pX, pY, floorRegion, mEngine.getVertexBufferObjectManager()); + pScene.attachChild(floorSprite); + } + + public Sprite getFloorSprite(){ + return floorSprite; + } + + public float getSpriteW(){ + return floorSprite.getWidth(); + } + + public float getSpriteH() { + return floorSprite.getHeight(); + } + + public void setSpriteX(float nVal){ + floorSprite.setX(nVal); + } + + public void setSpriteY(float nVal){ + floorSprite.setY(nVal); + } + + public float getSpriteX(){ + return floorSprite.getX(); + } + + public float getSpriteY(){ + return floorSprite.getY(); + } + +} diff --git a/src/com/hkri/HoppyGirl/GameScreen.java b/src/com/hkri/HoppyGirl/GameScreen.java new file mode 100644 index 0000000..4a9d9e0 --- /dev/null +++ b/src/com/hkri/HoppyGirl/GameScreen.java @@ -0,0 +1,733 @@ +package com.hkri.HoppyGirl; + +import org.andengine.audio.sound.Sound; +import org.andengine.audio.sound.SoundFactory; +import org.andengine.engine.camera.Camera; +import org.andengine.engine.Engine; +import org.andengine.engine.handler.timer.ITimerCallback; +import org.andengine.engine.handler.timer.TimerHandler; +import org.andengine.entity.IEntity; +import org.andengine.entity.modifier.AlphaModifier; +import org.andengine.entity.modifier.DelayModifier; +import org.andengine.entity.modifier.SequenceEntityModifier; +import org.andengine.entity.primitive.Rectangle; +import org.andengine.entity.scene.IOnSceneTouchListener; +import org.andengine.entity.scene.Scene; +import org.andengine.entity.scene.background.Background; +import org.andengine.entity.sprite.Sprite; +import org.andengine.entity.sprite.TiledSprite; +import org.andengine.input.touch.TouchEvent; +import org.andengine.opengl.texture.TextureManager; +import org.andengine.opengl.texture.TextureOptions; +import org.andengine.opengl.texture.atlas.bitmap.BuildableBitmapTextureAtlas; +import org.andengine.opengl.texture.atlas.bitmap.source.IBitmapTextureAtlasSource; +import org.andengine.opengl.texture.atlas.buildable.builder.BlackPawnTextureAtlasBuilder; +import org.andengine.opengl.texture.atlas.buildable.builder.ITextureAtlasBuilder; +import org.andengine.opengl.texture.region.ITextureRegion; +import org.andengine.opengl.texture.region.ITiledTextureRegion; +import org.andengine.ui.activity.SimpleBaseGameActivity; +import org.andengine.opengl.texture.atlas.bitmap.BitmapTextureAtlas; +import org.andengine.opengl.texture.atlas.bitmap.BitmapTextureAtlasTextureRegionFactory; +import org.andengine.util.debug.Debug; + +import java.util.ArrayList; + +/** + * (c) 2014 John Espiritu + * (c) 2014 hkri studios + * + * @author John Espiritu + * @since December 26, 2014 + * + */ + +public class GameScreen extends Scene implements IOnSceneTouchListener { + + //Sounds! + Sound selectSound; + Sound dieSound; + + //Scoring sprites + BitmapTextureAtlas scoreDigitAtlas; + ITextureRegion mScoreLabelMain; + BuildableBitmapTextureAtlas scoreDigitsAtlas; + ITiledTextureRegion mNumbersRegion; + Sprite mScoreLabelMainSprite; + ArrayList scoreDigitsMain = new ArrayList(); + ArrayList scoreDigitsScoreboard = new ArrayList(); + ArrayList scoreDigitsScoreboardBest = new ArrayList(); + + //Button elements + ITextureRegion mReplayButtonRegion; + ITextureRegion mLeaderboardButtonRegion; + + //Scoreboard elements + ITextureRegion mGameoverRegion; + Sprite mGameoverSprite; + Sprite mLeaderboardButtonSprite; + Sprite mReplayButtonSprite; + ITextureRegion mCrownRegion; + Sprite mCrownSprite; + + //Crash cover + Rectangle crashCover; + + //Game atlas. + BitmapTextureAtlas bmpAtlas; + BitmapTextureAtlas crystalAtlas; + + //Crystal regions + ITextureRegion mCrystal1Region, mCrystal2Region, mCrystal3Region; + + //Cover sprite + ITextureRegion mCoverRegion; + Sprite mCoverSprite; + + //Guide variable + ITextureRegion mGetReadyRegion; + Sprite mGetReadySprite; + + //Floor variables + ITextureRegion mFloorRegion; + float FLOOR_Y = 0.0f; + float FLOOR_VELOCITY = 5f; + + //Cloud variables + ITextureRegion mCloudRegion; + float CLOUD_VELOCITY = 1f; + float CLOUD_Y = 40f; + + //Collections + ArrayList lstFloors = new ArrayList(); + ArrayList lstClouds = new ArrayList(); + + //Obstacle collections + ArrayList lstCrystalO = new ArrayList(); + + //Activity properties + TextureManager mTManager; + SimpleBaseGameActivity mActivity; + Engine mEngine; + Camera mCamera; + boolean gameoverShown = false; + + //Player variable + Player mPlayer; + int gameScore = 0; + boolean scoreMainVisible = false; + float mTime = 0; + + //Obstacle variable + float[] crystalObstacleIntervals = { 36f, 45f, 75f, 10f, 55f, 50f, 25f}; + float crystalObstacleCurrentInterval = 50f; + float crystalObstacleCtr = 0; + int consecutiveClose = 0; + + //Scorer obstacle jumped + Rectangle scoreChecker; + + public GameScreen(final SimpleBaseGameActivity actvt, TextureManager tmgr, Engine engn, Camera cm){ + //Setup activity properties + mTManager = tmgr; + mActivity = actvt; + mEngine = engn; + mCamera = cm; + + loadResources(); //Load resources to memory. + + setOnSceneTouchListener(this); //Set screen touch listener + setTouchAreaBindingOnActionDownEnabled(true); + + //Setup score text main + mScoreLabelMainSprite = new Sprite(mCamera.getWidth() - mScoreLabelMain.getWidth() - 15f, 15f, mScoreLabelMain, mEngine.getVertexBufferObjectManager()); + mScoreLabelMainSprite.setZIndex(5); + mScoreLabelMainSprite.setAlpha(0f); + attachChild(mScoreLabelMainSprite); + + //FLOOR_Y = (mPlayer.getPlayerSprite().getY() + mPlayer.getPlayerSprite().getHeight()); + FLOOR_Y = (mCamera.getHeight() - 60f); + + //Setup scene background + setBackground(new Background(Hoppy_Girl.getClr(237), Hoppy_Girl.getClr(237), Hoppy_Girl.getClr(237))); + + //Add fader (fade in) + mCoverSprite = new Sprite(0, 0, mCoverRegion, mEngine.getVertexBufferObjectManager()); + mCoverSprite.registerEntityModifier(new AlphaModifier(0.3f, 1.0f, 0.0f)); + mCoverSprite.setSize(cm.getWidth(), cm.getHeight()); + mCoverSprite.setZIndex(100); + attachChild(mCoverSprite); + + //scoreboard labels setup + mGameoverSprite = new Sprite((mCamera.getWidth() - mGameoverRegion.getWidth()) * 0.5f - 30f, 105f, mGameoverRegion, mEngine.getVertexBufferObjectManager()); + mGameoverSprite.setZIndex(110); + mGameoverSprite.setAlpha(0.0f); + attachChild(mGameoverSprite); + + //Crash white cover + crashCover = new Rectangle(0, 0, mCamera.getWidth(), mCamera.getHeight(), mEngine.getVertexBufferObjectManager()); + crashCover.setColor(Hoppy_Girl.getClr(237),Hoppy_Girl.getClr(237),Hoppy_Girl.getClr(237)); + crashCover.setAlpha(0f); + crashCover.setZIndex(99); + attachChild(crashCover); + + while(getLastCloudRight() < mCamera.getWidth() + 50f) addCloud(); + + while(getLastFloorRight() < mCamera.getWidth() + 50f) addFloor(); + + //Add player + mPlayer = new Player(mActivity, mTManager, mEngine); + mPlayer.getPlayerSprite().setPosition(50f, FLOOR_Y - mPlayer.getPlayerSprite().getHeight()); + mPlayer.setFloorLimit(FLOOR_Y - mPlayer.getPlayerSprite().getHeight()); + mPlayer.attachPlayerSprite(this); + + //SCORE CHECKER SETUP + scoreChecker = new Rectangle(mPlayer.getPlayerSprite().getX(), FLOOR_Y - 30f, 10f, 30f, mEngine.getVertexBufferObjectManager()); + scoreChecker.setColor(org.andengine.util.color.Color.TRANSPARENT); + attachChild(scoreChecker); + + //Add scoreboard buttons + mReplayButtonSprite = new Sprite((mCamera.getWidth() - mReplayButtonRegion.getWidth()) * 0.5f - (mReplayButtonRegion.getWidth() * 0.5f + 15f), 265f, mReplayButtonRegion, mEngine.getVertexBufferObjectManager()) { + boolean isPressed = false; + @Override + public boolean onAreaTouched(TouchEvent e, float pX, float pY){ + if(e.getAction() == TouchEvent.ACTION_UP) { + isPressed = false; + mReplayButtonSprite.setY(mReplayButtonSprite.getY() - 3f); + if (Hoppy_Girl.currentState == Hoppy_Girl.GAMESTATE.GAMEOVER) { + if (gameoverShown) { + resetGame(); + selectSound.play(); + } + } + } + if(e.getAction() == TouchEvent.ACTION_DOWN){ + isPressed = true; + mReplayButtonSprite.setY(mReplayButtonSprite.getY() + 3f); + } + return true; + } + }; + mReplayButtonSprite.setZIndex(110); + mReplayButtonSprite.setAlpha(0f); + attachChild(mReplayButtonSprite); + + mLeaderboardButtonSprite = new Sprite((mCamera.getWidth() - mLeaderboardButtonRegion.getWidth()) * 0.5f + (mLeaderboardButtonRegion.getWidth() * 0.5f + 15f), 265f, mLeaderboardButtonRegion, mEngine.getVertexBufferObjectManager()); + mLeaderboardButtonSprite.setZIndex(110); + mLeaderboardButtonSprite.setAlpha(0f); + attachChild(mLeaderboardButtonSprite); + + //Add get ready + float grW = mGetReadyRegion.getWidth() * 1.50f, grH = mGetReadyRegion.getHeight() * 1.50f; + mGetReadySprite = new Sprite((mCamera.getWidth() - grW) * 0.5f, 90f, mGetReadyRegion, mEngine.getVertexBufferObjectManager()); + mGetReadySprite.setSize(grW, grH); + attachChild(mGetReadySprite); + + //Add crown icon + mCrownSprite = new Sprite(mGameoverSprite.getWidth() * 0.5f + mGameoverSprite.getX() + 140f, mGameoverSprite.getY() + 4f, mCrownRegion, mEngine.getVertexBufferObjectManager()); + mCrownSprite.setAlpha(0f); + mCrownSprite.setZIndex(103); + attachChild(mCrownSprite); + + setScoresDigits(mCamera.getWidth() - 15f, 42f, 7); //setup score digits on game screen + + sortChildren(); + hideScoreMain(); + } + + @Override + public void onManagedUpdate(final float mSecondsElapsed){ + + if(Hoppy_Girl.currentState == Hoppy_Girl.GAMESTATE.READY || Hoppy_Girl.currentState == Hoppy_Girl.GAMESTATE.RUNNING || Hoppy_Girl.currentState == Hoppy_Girl.GAMESTATE.GAMEOVER) { + + //------------ basic elements ------------------------ + //Infinite floors and clouds + if(Hoppy_Girl.currentState == Hoppy_Girl.GAMESTATE.READY || Hoppy_Girl.currentState == Hoppy_Girl.GAMESTATE.RUNNING) { + moveFloors(); + moveClouds(); + removeOffscreenCloud(); + removeOffscreenFloor(); + if (getLastCloudRight() < mCamera.getWidth() + 50f) addCloud(); + if (getLastFloorRight() < mCamera.getWidth() + 50f) addFloor(); + } + + //---------- obstacles ------------------ + if(Hoppy_Girl.currentState == Hoppy_Girl.GAMESTATE.RUNNING) { + + //----------------------- INCREMENT SCORE -------------------------- +// mTime += mSecondsElapsed; +// if(mTime >= 0.005f){ +// gameScore++; +// mTime = 0; +// } +// setScoreMain(gameScore); + checkPassedCrystalObstacles(); + if(gameScore == 200){ + FLOOR_VELOCITY = 6f; + } + + //---------------------- CRYSTALS ----------------------------------- + //Move crystals + moveCrystalObstacles(); + removeOffscreenCrystalObstacles(); + + //Create crystal obstacle + float speedIndependentCrystalCurrentInterval = (5f / FLOOR_VELOCITY) * crystalObstacleCurrentInterval; + if (crystalObstacleCtr >= speedIndependentCrystalCurrentInterval) { + spawnCrystalObstacle(); + setNextCrystalObstacleInterval(); + if(crystalObstacleCurrentInterval < 30f) + consecutiveClose++; + else + consecutiveClose = 0; + if(consecutiveClose == 3) { + crystalObstacleCurrentInterval = 55f; + consecutiveClose = 0; + } + crystalObstacleCtr = 0; + } + + //update obstacle counter. + crystalObstacleCtr++; + + //check collisions with crystal + for(CrystalObstacles crys : lstCrystalO){ + if(mPlayer.playerCollidesWith(crys.getCollidingRectangles())){ + flashWhite(); + mPlayer.die(); + Hoppy_Girl.currentState = Hoppy_Girl.GAMESTATE.GAMEOVER; + registerUpdateHandler(new TimerHandler(1f, new ITimerCallback() { + @Override + public void onTimePassed(TimerHandler pTimerHandler) { + setGameOver(); + } + })); + } + } + + //--------------------------------------------------------------------- + + } + //---------------------------------------- + + //------------- player ------------------------------- + + //Update player position + mPlayer.update(mSecondsElapsed); + + //--------------------------------------------------- + + + } + + + super.onManagedUpdate(mSecondsElapsed); + } + + @Override + public boolean onSceneTouchEvent(Scene scn, TouchEvent e){ + if(e.isActionDown()){ + if(Hoppy_Girl.currentState != Hoppy_Girl.GAMESTATE.GAMEOVER) { + if (Hoppy_Girl.currentState == Hoppy_Girl.GAMESTATE.READY) { + Hoppy_Girl.currentState = Hoppy_Girl.GAMESTATE.RUNNING; + mGetReadySprite.registerEntityModifier(new AlphaModifier(0.5f, 1.0f, 0.0f)); + mScoreLabelMainSprite.registerEntityModifier(new AlphaModifier(1f, 0f, 1f)); + showScoreMain(0); + } + if (Hoppy_Girl.currentState != Hoppy_Girl.GAMESTATE.GAMEOVER) + mPlayer.jump(); + } + } + return false; + } + + public void loadResources(){ + BitmapTextureAtlasTextureRegionFactory.setAssetBasePath("gfx/"); + + //--------------- SCORE DIGIT ASSETS ------------------------------- + scoreDigitAtlas = new BitmapTextureAtlas(mTManager, 85, 25, TextureOptions.NEAREST); + mScoreLabelMain = BitmapTextureAtlasTextureRegionFactory.createFromAsset(scoreDigitAtlas, mActivity, "score_label_game.png", 0, 0); + scoreDigitAtlas.load(); + + //-------------- SOUND ASSETS------------------------- + SoundFactory.setAssetBasePath("sfx/"); + try { + selectSound = SoundFactory.createSoundFromAsset(mActivity.getSoundManager(), mActivity, "selectsound.wav"); + selectSound.setVolume(0.3f); + } catch (Exception ex){ + Debug.e(ex); + } + + + // ------------- MAIN ASSETS ---------------------------------------- + bmpAtlas = new BitmapTextureAtlas(mTManager, 480, 670, TextureOptions.NEAREST); + + //Load cover resources. + mCoverRegion = BitmapTextureAtlasTextureRegionFactory.createFromAsset(bmpAtlas, mActivity, "black_bg.png", 0, 0); + + //Load floor resources. + mFloorRegion = BitmapTextureAtlasTextureRegionFactory.createFromAsset(bmpAtlas, mActivity, "floor_tile.png", 0, 3); + + //Load cloud resources + mCloudRegion = BitmapTextureAtlasTextureRegionFactory.createFromAsset(bmpAtlas, mActivity, "clouds_bg.png", 0, 92); + + //Load region resources + mGetReadyRegion = BitmapTextureAtlasTextureRegionFactory.createFromAsset(bmpAtlas, mActivity, "get_ready.png", 0, 264); + + //Score label region + mGameoverRegion = BitmapTextureAtlasTextureRegionFactory.createFromAsset(bmpAtlas, mActivity, "score_labels.png", 0, 381); + + //Replay button + mReplayButtonRegion = BitmapTextureAtlasTextureRegionFactory.createFromAsset(bmpAtlas, mActivity, "replay_button.png", 0, 508); + + //Leaderboard button + mLeaderboardButtonRegion = BitmapTextureAtlasTextureRegionFactory.createFromAsset(bmpAtlas, mActivity, "leaderboard_button.png", 0, 578); + + //Crown icon + mCrownRegion = BitmapTextureAtlasTextureRegionFactory.createFromAsset(bmpAtlas, mActivity, "crown_highscore.png", 83, 4); + + //--------------------------------------------------------------------- + + //--------------- CRYSTAL OBSTACLE ASSET ------------------------------ + //Load crystal obstacles + crystalAtlas = new BitmapTextureAtlas(mTManager, 50, 220, TextureOptions.NEAREST); + + //Crystals + mCrystal1Region = BitmapTextureAtlasTextureRegionFactory.createFromAsset(crystalAtlas, mActivity, "crystal_1.png", 0, 0); + mCrystal2Region = BitmapTextureAtlasTextureRegionFactory.createFromAsset(crystalAtlas, mActivity, "crystal_2.png", 0, 84); + mCrystal3Region = BitmapTextureAtlasTextureRegionFactory.createFromAsset(crystalAtlas, mActivity, "crystal_3.png", 0, 137); + + //--------------------------------------------------------------------- + + + //Load atlas + crystalAtlas.load(); + bmpAtlas.load(); + } + + public void hideScoreMain(){ + for(TiledSprite dig : scoreDigitsMain){ + dig.setAlpha(0f); + } + scoreMainVisible = false; + } + + public void showScoreMain(int score){ + scoreMainVisible = true; + String str = score + ""; + setScoreMain(score); + int spriteLast = scoreDigitsMain.size() - 1; + for(int i = str.length() - 1; i >= 0; i--) { + scoreDigitsMain.get(spriteLast).registerEntityModifier(new AlphaModifier(1f, 0f, 1f)); + spriteLast--; + } + while(spriteLast >= 0) { + scoreDigitsMain.get(spriteLast).setAlpha(0f); + spriteLast--; + } + } + + private void checkPassedCrystalObstacles(){ + for(int i = 0; i < lstCrystalO.size(); i++){ + CrystalObstacles obs = lstCrystalO.get(i); + if(scoreChecker.collidesWith(obs.getSprite())){ + if(obs.obstacleChecked == false) { + obs.obstacleChecked = true; + gameScore++; + setScoreMain(gameScore); + } + } + } + } + + private void setScoresDigits(float pXRight, float pY, int digits){ + //------- SETUP DIGIT TEXTURE------------- + scoreDigitsAtlas = new BuildableBitmapTextureAtlas(mTManager, 220, 40, TextureOptions.NEAREST); + mNumbersRegion = BitmapTextureAtlasTextureRegionFactory.createTiledFromAsset(scoreDigitsAtlas, mActivity, "numbers_tiled.png", 10, 1); + //Build Atlas. + try { + scoreDigitsAtlas.build(new BlackPawnTextureAtlasBuilder(1, 1, 4)); + scoreDigitsAtlas.load(); + } catch(ITextureAtlasBuilder.TextureAtlasBuilderException e){ + Debug.e(e); + } + + //-------- SETUP INGAME SCORE DIGITS --------- + float digitsW = (21 * digits); + float digitsX = pXRight - digitsW; + for(int i = 0; i < digits; i++){ + TiledSprite sprt = new TiledSprite(digitsX + (21f * i), pY, mNumbersRegion, mEngine.getVertexBufferObjectManager()); + sprt.setCurrentTileIndex(0); + scoreDigitsMain.add(sprt); + attachChild(sprt); + } + + //---------- SETUP SCOREBOARD DIGITS --------- + digitsX = mGameoverSprite.getWidth() * 0.5f + mGameoverSprite.getX() + 53f; + float digitsSCScoreY = mGameoverSprite.getY() + 30f; + float digitsSCBestY = mGameoverSprite.getY() + 97f; + //Score digits + for(int i = 0; i < digits; i++){ + TiledSprite sprt = new TiledSprite(digitsX + (21f * i), digitsSCScoreY, mNumbersRegion, mEngine.getVertexBufferObjectManager()); + sprt.setCurrentTileIndex(0); + sprt.setZIndex(103); + sprt.setAlpha(0f); + scoreDigitsScoreboard.add(sprt); + attachChild(sprt); + //Best score digits. + }for(int i = 0; i < digits; i++){ + TiledSprite sprt = new TiledSprite(digitsX + (21f * i), digitsSCBestY, mNumbersRegion, mEngine.getVertexBufferObjectManager()); + sprt.setCurrentTileIndex(0); + sprt.setZIndex(103); + sprt.setAlpha(0f); + scoreDigitsScoreboardBest.add(sprt); + attachChild(sprt); + } + + } + + private void hideScoreboardScores(){ + for(TiledSprite dig : scoreDigitsScoreboard){ + if(dig.getAlpha() > 0f) dig.registerEntityModifier(new AlphaModifier(0.2f, 1f, 0f)); + } + for(TiledSprite dig : scoreDigitsScoreboardBest){ + if(dig.getAlpha() > 0f) dig.registerEntityModifier(new AlphaModifier(0.2f, 1f, 0f)); + } + } + + private void showScoreboardScores(){ + for(TiledSprite dig : scoreDigitsScoreboard){ + if(dig.getAlpha() > 0f) dig.registerEntityModifier(new AlphaModifier(0.4f, 0f, 1f)); + } + for(TiledSprite dig : scoreDigitsScoreboardBest){ + if(dig.getAlpha() > 0f) dig.registerEntityModifier(new AlphaModifier(0.4f, 0f, 1f)); + } + } + + private void setScoreboardScore(int score, boolean showDigits){ + String str = score + ""; + int spriteLast = 0; + for(int i = 0; i < str.length(); i++){ + int ndig = Integer.parseInt(str.charAt(i) + ""); + if(showDigits) scoreDigitsScoreboard.get(spriteLast).setAlpha(1f); + else scoreDigitsScoreboard.get(spriteLast).setAlpha(0.01f); + scoreDigitsScoreboard.get(spriteLast).setCurrentTileIndex(ndig); + spriteLast++; + } + while(spriteLast < scoreDigitsScoreboard.size()) { + if(showDigits) scoreDigitsScoreboard.get(spriteLast).setAlpha(0f); + spriteLast++; + } + } + + private void setScoreboardBestScore(int score, boolean showDigits){ + String str = score + ""; + int spriteLast = 0; + for(int i = 0; i < str.length(); i++){ + int ndig = Integer.parseInt(str.charAt(i) + ""); + if(showDigits) scoreDigitsScoreboardBest.get(spriteLast).setAlpha(1f); + else scoreDigitsScoreboardBest.get(spriteLast).setAlpha(0.01f); + scoreDigitsScoreboardBest.get(spriteLast).setCurrentTileIndex(ndig); + spriteLast++; + } + while(spriteLast < scoreDigitsScoreboardBest.size()) { + if(showDigits) scoreDigitsScoreboardBest.get(spriteLast).setAlpha(0f); + spriteLast++; + } + } + + public void setScoreMain(Integer score){ + String str = score + ""; + int spriteLast = scoreDigitsMain.size() - 1; + for(int i = str.length() - 1; i >= 0; i--){ + int ndig = Integer.parseInt(str.charAt(i) + ""); + scoreDigitsMain.get(spriteLast).setAlpha(1f); + scoreDigitsMain.get(spriteLast).setCurrentTileIndex(ndig); + spriteLast--; + } + while(spriteLast >= 0) { + scoreDigitsMain.get(spriteLast).setAlpha(0f); + spriteLast--; + } + } + + public void resetGame(){ + clearCrystalObstacles(); + mScoreLabelMainSprite.setAlpha(0f); + Hoppy_Girl.currentState = Hoppy_Girl.GAMESTATE.READY; + mPlayer.reset(); + hideGameOver(); + hideScoreMain(); + gameScore = 0; + FLOOR_VELOCITY = 5f; + } + + private void hideGameOver(){ + unregisterTouchArea(mReplayButtonSprite); + unregisterTouchArea(mLeaderboardButtonSprite); + sortChildren(); + //show white cover + ((Hoppy_Girl)mActivity).hideAds(); + hideScoreboardScores(); + stopCrownIconFlash(); + mLeaderboardButtonSprite.registerEntityModifier(new AlphaModifier(0.2f, 1f, 0f)); + mReplayButtonSprite.registerEntityModifier(new AlphaModifier(0.2f, 1f, 0f)); + mGameoverSprite.registerEntityModifier(new AlphaModifier(0.2f, 1f, 0f){ + @Override + protected void onModifierFinished(IEntity pItem){ + crashCover.registerEntityModifier(new AlphaModifier(0.2f, 1f, 0f)); + mGetReadySprite.registerEntityModifier(new AlphaModifier(0.3f, 0f, 1f)); + gameoverShown = false; + } + }); + } + + TimerHandler flashUpdateTimer; + private void flashCrownIcon(){ + flashUpdateTimer = new TimerHandler(0.5f, new ITimerCallback() { + @Override + public void onTimePassed(TimerHandler pTimerHandler) { + if(mCrownSprite.getAlpha() == 0f) mCrownSprite.setAlpha(1f); + else mCrownSprite.setAlpha(0f); + pTimerHandler.reset(); + } + }); + mCrownSprite.registerUpdateHandler(flashUpdateTimer); + } + + private void stopCrownIconFlash(){ + if(flashUpdateTimer != null) mCrownSprite.unregisterUpdateHandler(flashUpdateTimer); + mCrownSprite.setAlpha(0f); + flashUpdateTimer = null; + } + + private void setGameOver(){ + crashCover.setZIndex(101); + sortChildren(); + //show white cover + crashCover.registerEntityModifier(new AlphaModifier(0.4f, 0.0f, 1f){ + @Override + protected void onModifierFinished(IEntity pItem){ + mGameoverSprite.registerEntityModifier(new AlphaModifier(0.4f, 0.0f, 1f)); + mLeaderboardButtonSprite.registerEntityModifier(new AlphaModifier(0.4f, 0.0f, 0.3f)); + mReplayButtonSprite.registerEntityModifier(new AlphaModifier(0.4f, 0.0f, 1f)); + gameoverShown = true; + ((Hoppy_Girl)mActivity).showAds(); + + Hoppy_Girl mGame = (Hoppy_Girl)mActivity; + int HS = mGame.getBestScore(); + if(gameScore > HS){ + mGame.saveBestScore(gameScore); + flashCrownIcon(); + } + setScoreboardScore(gameScore, false); + setScoreboardBestScore(mGame.getBestScore(), false); + + showScoreboardScores(); + registerTouchArea(mReplayButtonSprite); + registerTouchArea(mLeaderboardButtonSprite); + } + }); + } + + private void flashWhite(){ + AlphaModifier flashin = new AlphaModifier(0.07f, 0f, 1f); + DelayModifier flashpause = new DelayModifier(0.02f); + AlphaModifier flashout = new AlphaModifier(0.07f, 1f, 0f); + sortChildren(); + //crashCover.registerEntityModifier(flashin); + crashCover.registerEntityModifier(new SequenceEntityModifier(flashin, flashpause, flashout)); + } + + private float getLastCloudRight(){ + if(lstClouds.size() == 0) return 0f; + CloudsBG lastC = lstClouds.get(lstClouds.size() - 1); + return lastC.getX() + lastC.getW(); + } + + private float getLastFloorRight(){ + if(lstFloors.size() == 0) return 0f; + Floor lastF = lstFloors.get(lstFloors.size() - 1); + return lastF.getSpriteX() + lastF.getSpriteW(); + } + + private void moveClouds(){ + for(CloudsBG cld : lstClouds){ + cld.setX(cld.getX() - CLOUD_VELOCITY); + } + } + + private void moveFloors(){ + for(Floor flr : lstFloors){ + flr.setSpriteX(flr.getSpriteX() - FLOOR_VELOCITY); + } + } + + private void removeOffscreenFloor(){ + if(lstFloors.size() > 0){ + if(lstFloors.get(0).getSpriteX() < -90f){ + detachChild(lstFloors.get(0).getFloorSprite()); + lstFloors.remove(0); + } + } + } + + private void removeOffscreenCloud(){ + if(lstClouds.size() > 0){ + if(lstClouds.get(0).getX() < -480f){ + detachChild(lstClouds.get(0).getSprite()); + lstClouds.remove(0); + } + } + } + + private void addCloud(){ + CloudsBG cld = new CloudsBG(mCloudRegion, mEngine); + cld.attachSprite(this, getLastCloudRight() + 150f, CLOUD_Y); + cld.getSprite().setZIndex(0); + lstClouds.add(cld); + sortChildren(); + } + + private void addFloor(){ + Floor flr = new Floor(mFloorRegion, mEngine); + flr.attachSprite(this, getLastFloorRight(), FLOOR_Y); + flr.getFloorSprite().setZIndex(0); + lstFloors.add(flr); + sortChildren(); + } + + private void setNextCrystalObstacleInterval(){ + int randInterval = (int)(Math.floor(Math.random() * (crystalObstacleIntervals.length))); + crystalObstacleCurrentInterval = crystalObstacleIntervals[randInterval]; + } + + private void moveCrystalObstacles(){ + for(CrystalObstacles obs : lstCrystalO) + obs.setX(obs.getX() - FLOOR_VELOCITY); + } + + private void removeOffscreenCrystalObstacles(){ + if(lstCrystalO.size() == 0) return; + CrystalObstacles obs = lstCrystalO.get(0); + if(obs.getX() < - 50f){ + obs.disposeObject(this); + lstCrystalO.remove(0); + } + } + + private void clearCrystalObstacles(){ + for(CrystalObstacles crys : lstCrystalO){ + detachChild(crys.getSprite()); + } + lstCrystalO.clear(); + } + + private void spawnCrystalObstacle(){ + CrystalObstacles obs = new CrystalObstacles(mCrystal1Region, mCrystal2Region, mCrystal3Region, mEngine); + int randType = (int)(Math.floor(Math.random() * 3)); + obs.attachCrystal(this, mCamera.getWidth() + 50f, FLOOR_Y, randType); + obs.getSprite().setZIndex(2); + lstCrystalO.add(obs); + } + +} diff --git a/src/com/hkri/HoppyGirl/Hoppy_Girl.java b/src/com/hkri/HoppyGirl/Hoppy_Girl.java new file mode 100644 index 0000000..e6b7c0a --- /dev/null +++ b/src/com/hkri/HoppyGirl/Hoppy_Girl.java @@ -0,0 +1,198 @@ +package com.hkri.HoppyGirl; + +import android.app.ActionBar; +import android.content.Context; +import android.util.DisplayMetrics; +import android.view.Gravity; +import android.view.View; +import android.widget.FrameLayout; +import org.andengine.engine.camera.Camera; +import org.andengine.engine.options.EngineOptions; +import org.andengine.engine.options.ScreenOrientation; +import org.andengine.engine.options.resolutionpolicy.FillResolutionPolicy; +import org.andengine.engine.options.resolutionpolicy.FixedResolutionPolicy; +import org.andengine.engine.options.resolutionpolicy.RatioResolutionPolicy; +import org.andengine.engine.options.resolutionpolicy.RelativeResolutionPolicy; +import org.andengine.entity.scene.Scene; +import org.andengine.entity.scene.background.Background; +import org.andengine.entity.util.FPSLogger; +import org.andengine.opengl.view.RenderSurfaceView; +import org.andengine.ui.activity.SimpleBaseGameActivity; + +import com.google.android.gms.ads.AdRequest; +import com.google.android.gms.ads.AdSize; +import com.google.android.gms.ads.AdView; +import org.andengine.util.debug.Debug; + +import java.io.*; + +public class Hoppy_Girl extends SimpleBaseGameActivity { + + //Best score + static int BESTSCORE = 0; + + //Objects + private Camera camera; + + //AdView + public AdView myAd; + + //Screens + SplashScreen splash; + StartScreen sStart; + GameScreen sGame; + + //Current game state + public static GAMESTATE currentState = GAMESTATE.SPLASH; + + //Game states + public static enum GAMESTATE{ + SPLASH, + START, + READY, + RUNNING, + GAMEOVER, + PAUSED + } + + @Override + protected void onSetContentView(){ + mRenderSurfaceView = new RenderSurfaceView(this); + mRenderSurfaceView.setRenderer(mEngine, this); + AdRequest adreq = new AdRequest.Builder().addTestDevice(AdRequest.DEVICE_ID_EMULATOR) + .addTestDevice("CC5F2C72DF2B356BBF0DA198") + .build(); + + final FrameLayout frameLayout = new FrameLayout(this); + final FrameLayout.LayoutParams frameLayoutParams = new FrameLayout.LayoutParams(FrameLayout.LayoutParams.MATCH_PARENT, FrameLayout.LayoutParams.MATCH_PARENT); + final FrameLayout.LayoutParams adViewLayoutParams = new FrameLayout.LayoutParams(FrameLayout.LayoutParams.WRAP_CONTENT, FrameLayout.LayoutParams.WRAP_CONTENT, Gravity.TOP | Gravity.CENTER_HORIZONTAL); + + myAd = new AdView(this); + myAd.setAdSize(AdSize.BANNER); + myAd.setAdUnitId(getResources().getString(R.string.ad_unit_id)); + myAd.loadAd(adreq); + myAd.setVisibility(View.INVISIBLE); + + frameLayout.addView(mRenderSurfaceView, super.createSurfaceViewLayoutParams()); + frameLayout.addView(myAd, adViewLayoutParams); + + setContentView(frameLayout, frameLayoutParams); + } + + @Override + public EngineOptions onCreateEngineOptions() { + + //Compute camera size by aspect ratio. + //Pick some value for your height. + float cameraHeight = 380; + + //Get the display metrics object. + final DisplayMetrics displayMetrics = new DisplayMetrics(); + + //Populate it with data about your display. + this.getWindowManager().getDefaultDisplay().getMetrics(displayMetrics); + + //Calculate the aspect ratio of the device. + float aspectRatio = (float) displayMetrics.widthPixels / (float) displayMetrics.heightPixels; + + //Multiply the aspect ratio by the fixed height. + float cameraWidth = Math.round(aspectRatio * cameraHeight); + + //Create the camera using those values. + camera = new Camera(0, 0, cameraWidth, cameraHeight); + + EngineOptions engineOptions = new EngineOptions(true, ScreenOrientation.LANDSCAPE_FIXED, new FillResolutionPolicy(), camera); + engineOptions.getAudioOptions().setNeedsSound(true); + return engineOptions; + + } + + @Override + public void onCreateResources(){ + + } + + @Override + public Scene onCreateScene(){ + //Retrieve best score. + retrieveBestScore(); + + //Start on splash screen. + splash = new SplashScreen(this, this.getTextureManager(), mEngine, camera); + return splash; + } + + public int getBestScore(){ + return BESTSCORE; + } + + public void saveBestScore(int newbest){ + BESTSCORE = newbest; + String bs = new Integer(BESTSCORE).toString(); + try { + FileOutputStream fout = openFileOutput("hoppygirl_data", Context.MODE_PRIVATE); + fout.write(bs.getBytes()); + fout.close(); + } catch(Exception ex){ + Debug.e(ex); + } + } + + public void retrieveBestScore(){ + try { + if (getApplicationContext().getFileStreamPath("hoppygirl_data") != null) { + FileInputStream finp = openFileInput("hoppygirl_data"); + BufferedReader rd = new BufferedReader(new InputStreamReader(finp)); + String ln = rd.readLine(); + if (ln != null) { + BESTSCORE = Integer.parseInt(ln); + } + rd.close(); + finp.close(); + } else { + String bs = new Integer(0).toString(); + FileOutputStream fout = openFileOutput("hoppygirl_data", Context.MODE_PRIVATE); + fout.write(bs.getBytes()); + fout.close(); + } + }catch(Exception e){ + Debug.e(e); + } + + } + + public void setGameOnStarting(){ + Hoppy_Girl.currentState = GAMESTATE.START; + sStart = new StartScreen(this, getTextureManager(), mEngine, camera); + mEngine.setScene(sStart); + } + + public void hideAds(){ + runOnUiThread(new Runnable() { + @Override + public void run() { + myAd.setVisibility(View.INVISIBLE); + } + }); + } + + public void showAds(){ + runOnUiThread(new Runnable() { + @Override + public void run() { + myAd.setVisibility(View.VISIBLE); + } + }); + } + + public void setGameonGameScene(){ + Hoppy_Girl.currentState = Hoppy_Girl.GAMESTATE.READY; + sGame = new GameScreen(this, getTextureManager(), mEngine, camera); + mEngine.setScene(sGame); + } + + public static float getClr(int colorval){ + return (float)colorval / 255f; + } + +} diff --git a/src/com/hkri/HoppyGirl/Player.java b/src/com/hkri/HoppyGirl/Player.java new file mode 100644 index 0000000..c903b1a --- /dev/null +++ b/src/com/hkri/HoppyGirl/Player.java @@ -0,0 +1,228 @@ +package com.hkri.HoppyGirl; + +import org.andengine.audio.sound.Sound; +import org.andengine.audio.sound.SoundFactory; +import org.andengine.engine.Engine; +import org.andengine.engine.camera.Camera; +import org.andengine.entity.IEntity; +import org.andengine.entity.primitive.Rectangle; +import org.andengine.entity.scene.Scene; +import org.andengine.entity.shape.IShape; +import org.andengine.entity.sprite.AnimatedSprite; +import org.andengine.opengl.texture.TextureManager; +import org.andengine.opengl.texture.TextureOptions; +import org.andengine.opengl.texture.atlas.bitmap.BitmapTextureAtlas; +import org.andengine.opengl.texture.atlas.bitmap.BitmapTextureAtlasTextureRegionFactory; +import org.andengine.opengl.texture.atlas.bitmap.BuildableBitmapTextureAtlas; +import org.andengine.opengl.texture.atlas.bitmap.source.IBitmapTextureAtlasSource; +import org.andengine.opengl.texture.atlas.buildable.builder.BlackPawnTextureAtlasBuilder; +import org.andengine.opengl.texture.atlas.buildable.builder.ITextureAtlasBuilder; +import org.andengine.opengl.texture.region.TiledTextureRegion; +import org.andengine.ui.activity.BaseGameActivity; +import org.andengine.util.debug.Debug; + +/** + * (c) 2014 John Espiritu + * (c) 2014 hkri studios + * + * @author John Espiritu + * @since December 27, 2014 + * + */ + +public class Player{ + + BuildableBitmapTextureAtlas bmpAtlas; + + TiledTextureRegion playerRegion; + AnimatedSprite playerSprite; + + Engine mEngine; + + Sound jumpSound; + Sound hitSound; + + float VERTICAL_SPEED = 0.0f; + float FALLING_CONSTANT = -2000f; + float FLOOR_Y_LIMIT = 0.0f; + final float JUMP_CONSTANT = -750f; + final float JUMP2_CONSTANT = -650f; + + Rectangle areaBody; + Rectangle areaHead; + + public PLAYERSTATE mystate = PLAYERSTATE.RUNNING; + int JUMPFRAME = 0; + + public enum PLAYERSTATE{ + RUNNING, + JUMPING, + DOUBLEJUMP, + DEAD, + } + + public Player(BaseGameActivity actv, TextureManager tmgr, Engine ngn){ + //Get engine. + mEngine = ngn; + + //Prepare texture. + bmpAtlas = new BuildableBitmapTextureAtlas(tmgr, 1050, 120, TextureOptions.NEAREST_PREMULTIPLYALPHA); + BitmapTextureAtlasTextureRegionFactory.setAssetBasePath("gfx/"); + playerRegion = BitmapTextureAtlasTextureRegionFactory.createTiledFromAsset(bmpAtlas, actv, "player_tiled.png", 14, 1); + + //Build Atlas. + try { + bmpAtlas.build(new BlackPawnTextureAtlasBuilder(0, 0, 1)); + bmpAtlas.load(); + } catch(ITextureAtlasBuilder.TextureAtlasBuilderException e){ + Debug.e(e); + } + + //Load sprite. + setupSprite(); + + //-------------- SOUND ASSETS------------------------- + SoundFactory.setAssetBasePath("sfx/"); + try { + jumpSound = SoundFactory.createSoundFromAsset(actv.getSoundManager(), actv, "jumpsound.wav"); + jumpSound.setVolume(0.3f); + + hitSound = SoundFactory.createSoundFromAsset(actv.getSoundManager(), actv, "hitsound.wav"); + hitSound.setVolume(0.5f); + } catch (Exception ex){ + Debug.e(ex); + } + + //Setup collision areas + areaHead = new Rectangle(playerSprite.getX() + 6, playerSprite.getY() + 10, 52, 54, mEngine.getVertexBufferObjectManager()); + areaBody = new Rectangle(playerSprite.getX() + 13, playerSprite.getY() + 63, 31, 52, mEngine.getVertexBufferObjectManager()); + + } + + public boolean playerCollidesWith(IShape entity){ + if(entity.collidesWith(areaHead)) + return true; + if(entity.collidesWith(areaBody)) + return true; + return false; + } + + public boolean playerCollidesWith(Rectangle[] rects){ + for(Rectangle rect : rects) { + if (rect.collidesWith(areaHead)) + return true; + if (rect.collidesWith(areaBody)) + return true; + } + return false; + } + + public void setFloorLimit(float ylimit){ + FLOOR_Y_LIMIT = ylimit; + } + + public void update(float mElapsedTime){ + + playerSprite.setZIndex(5); + + float nVal = playerSprite.getY() + (VERTICAL_SPEED * mElapsedTime); + if(nVal <= FLOOR_Y_LIMIT) + playerSprite.setY(nVal); + else { + playerSprite.setY(FLOOR_Y_LIMIT); + if(mystate == PLAYERSTATE.JUMPING || mystate == PLAYERSTATE.DOUBLEJUMP) { + mystate = PLAYERSTATE.RUNNING; + playerSprite.stopAnimation(); + playerSprite.animate(new long[]{160, 160, 160, 160}, 0, 3, true); + } + } + VERTICAL_SPEED -= FALLING_CONSTANT * mElapsedTime; + + //Update collsion areas + //Setup collision areas + areaHead.setPosition(playerSprite.getX() + 17, playerSprite.getY() + 10); + areaBody.setPosition(playerSprite.getX() + 22, playerSprite.getY() + 63); + + //Set jump animation. + if(mystate == PLAYERSTATE.JUMPING || mystate == PLAYERSTATE.DOUBLEJUMP){ + if((VERTICAL_SPEED > (3 * JUMP_CONSTANT / 4f)) && JUMPFRAME == 0){ + playerSprite.stopAnimation(); + playerSprite.animate(new long[]{5000, 5000}, 4, 5, true); + JUMPFRAME = 1; + } + if((VERTICAL_SPEED > (JUMP_CONSTANT / 2f)) && JUMPFRAME == 1){ + playerSprite.stopAnimation(); + playerSprite.animate(new long[]{5000, 5000}, 5, 6, true); + JUMPFRAME = 2; + } + if(VERTICAL_SPEED < 50f && JUMPFRAME == 2){ + playerSprite.stopAnimation(); + playerSprite.animate(new long[]{5000, 5000}, 6, 7, true); + JUMPFRAME = 3; + } + if(VERTICAL_SPEED < -50f && JUMPFRAME == 3){ + playerSprite.stopAnimation(); + playerSprite.animate(new long[]{200, 150, 5000}, 7, 9, true); + JUMPFRAME = 4; + } + } + } + + public void jump(){ + if(mystate == PLAYERSTATE.RUNNING) { + VERTICAL_SPEED = JUMP_CONSTANT; + mystate = PLAYERSTATE.JUMPING; + jumpSound.play(); + } else if (mystate == PLAYERSTATE.JUMPING){ + //initiate double jump. + mystate = PLAYERSTATE.DOUBLEJUMP; + VERTICAL_SPEED = JUMP2_CONSTANT; + jumpSound.play(); + } + JUMPFRAME = 0; + } + + public void reset(){ + setRunning(); + JUMPFRAME = 0; + } + + private void setRunning(){ + mystate = PLAYERSTATE.RUNNING; + playerSprite.animate(new long[]{160, 160, 160, 160}, 0, 3, true); + } + + public void die(){ + mystate = PLAYERSTATE.DEAD; + VERTICAL_SPEED = -300f; + playerSprite.animate(new long[]{400, 200}, 10, 11, false, new AnimatedSprite.IAnimationListener() { + @Override + public void onAnimationStarted(AnimatedSprite pAnimatedSprite, int pInitialLoopCount) {} + @Override + public void onAnimationFrameChanged(AnimatedSprite pAnimatedSprite, int pOldFrameIndex, int pNewFrameIndex) {} + @Override + public void onAnimationLoopFinished(AnimatedSprite pAnimatedSprite, int pRemainingLoopCount, int pInitialLoopCount) {} + + @Override + public void onAnimationFinished(AnimatedSprite pAnimatedSprite) { + playerSprite.animate(new long[]{250, 250}, 12, 13, true); + } + }); + hitSound.play(); + } + + public void attachPlayerSprite(Scene scn){ + scn.attachChild(playerSprite); + } + + public AnimatedSprite getPlayerSprite(){ + return playerSprite; + } + + private void setupSprite(){ + playerSprite = new AnimatedSprite(0, 0, playerRegion, mEngine.getVertexBufferObjectManager()); + setRunning(); + } + + +} diff --git a/src/com/hkri/HoppyGirl/SplashScreen.java b/src/com/hkri/HoppyGirl/SplashScreen.java new file mode 100644 index 0000000..9888442 --- /dev/null +++ b/src/com/hkri/HoppyGirl/SplashScreen.java @@ -0,0 +1,115 @@ +package com.hkri.HoppyGirl; + +import org.andengine.engine.camera.Camera; +import org.andengine.engine.handler.timer.ITimerCallback; +import org.andengine.engine.handler.timer.TimerHandler; +import org.andengine.engine.Engine; +import org.andengine.entity.IEntity; +import org.andengine.entity.modifier.AlphaModifier; +import org.andengine.entity.scene.Scene; +import org.andengine.entity.scene.background.Background; +import org.andengine.entity.sprite.Sprite; +import org.andengine.opengl.texture.TextureManager; +import org.andengine.opengl.texture.TextureOptions; +import org.andengine.opengl.texture.region.ITextureRegion; +import org.andengine.opengl.util.GLState; +import org.andengine.ui.activity.SimpleBaseGameActivity; +import org.andengine.opengl.texture.atlas.bitmap.BitmapTextureAtlas; +import org.andengine.opengl.texture.atlas.bitmap.BitmapTextureAtlasTextureRegionFactory; + +/** + * Created by John Espiritu on 12/25/2014. + */ + +public class SplashScreen extends Scene{ + + //Splash Logo + BitmapTextureAtlas splashatlas; + ITextureRegion splashRegion; + + //Fade cover + BitmapTextureAtlas coveratlas; + ITextureRegion coverRegion; + + Sprite cover; + Sprite splash; + Engine mEngine; + Camera mCamera; + + //Constructor + public SplashScreen(final SimpleBaseGameActivity actvt, TextureManager tmgr, Engine engn, Camera cm){ + super(); //Superclass init. + mEngine = engn; //Game Engine + mCamera = cm; //Camera + + //Setup texture atlas base path. + BitmapTextureAtlasTextureRegionFactory.setAssetBasePath("gfx/"); + + //Initialize splash logo + splashatlas = new BitmapTextureAtlas(tmgr, 111, 54, TextureOptions.NEAREST); + splashRegion = BitmapTextureAtlasTextureRegionFactory.createFromAsset(splashatlas, actvt, "splash_logo.png", 0, 0); + splashatlas.load(); + + //Initialize cover sprite. + coveratlas = new BitmapTextureAtlas(tmgr, 2, 2, TextureOptions.NEAREST); + coverRegion = BitmapTextureAtlasTextureRegionFactory.createFromAsset(coveratlas, actvt, "black_bg.png", 0, 0); + coveratlas.load(); + + //Setup screen. + setBackground(new Background(Hoppy_Girl.getClr(237), Hoppy_Girl.getClr(237), Hoppy_Girl.getClr(237))); + setupContents(); + + //Splash animation: fade in and out and unload. + cover.registerEntityModifier(new AlphaModifier(0.5f, 1.0f, 0.0f){ + @Override + protected void onModifierFinished(IEntity pItem){ + mEngine.registerUpdateHandler(new TimerHandler(2f, new ITimerCallback() { + @Override + public void onTimePassed(TimerHandler pTimerHandler) { + mEngine.unregisterUpdateHandler(pTimerHandler); + cover.registerEntityModifier(new AlphaModifier(0.5f, 0.0f, 1.0f){ + @Override + protected void onModifierFinished(IEntity pItem){ + mEngine.registerUpdateHandler(new TimerHandler(0.5f, new ITimerCallback() { + @Override + public void onTimePassed(TimerHandler pTimerHandler) { + mEngine.unregisterUpdateHandler(pTimerHandler); + //Dispose elements. + detachChildren(); + ((Hoppy_Girl)actvt).setGameOnStarting(); + disposeScene(); + } + })); + } + }); + } + })); + } + }); + } + + private void disposeScene(){ + if(isDisposed() == false){dispose();} + } + + private void setupContents(){ + //Splash logo + splash = new Sprite(0, 0, splashRegion, mEngine.getVertexBufferObjectManager()) { + @Override + protected void preDraw(GLState pGLState, Camera pCamera){ + super.preDraw(pGLState, pCamera); + pGLState.enableDither(); + } + }; + splash.setPosition((mCamera.getWidth() - splash.getWidth()) * 0.5f, (mCamera.getHeight() - splash.getHeight()) * 0.5f); + + cover = new Sprite(0, 0, coverRegion, mEngine.getVertexBufferObjectManager()); + cover.setSize(mCamera.getWidth(), mCamera.getHeight()); + cover.setZIndex(99); + + //Attach sprites + attachChild(splash); + attachChild(cover); + } + +} diff --git a/src/com/hkri/HoppyGirl/StartScreen.java b/src/com/hkri/HoppyGirl/StartScreen.java new file mode 100644 index 0000000..5e35be6 --- /dev/null +++ b/src/com/hkri/HoppyGirl/StartScreen.java @@ -0,0 +1,279 @@ +package com.hkri.HoppyGirl; + +import org.andengine.engine.camera.Camera; +import org.andengine.engine.Engine; +import org.andengine.entity.IEntity; +import org.andengine.entity.modifier.AlphaModifier; +import org.andengine.entity.modifier.DelayModifier; +import org.andengine.entity.modifier.MoveYModifier; +import org.andengine.entity.modifier.SequenceEntityModifier; +import org.andengine.entity.scene.IOnSceneTouchListener; +import org.andengine.entity.scene.Scene; +import org.andengine.entity.scene.background.Background; +import org.andengine.entity.sprite.Sprite; +import org.andengine.input.touch.TouchEvent; +import org.andengine.opengl.texture.TextureManager; +import org.andengine.opengl.texture.TextureOptions; +import org.andengine.opengl.texture.region.ITextureRegion; +import org.andengine.ui.activity.SimpleBaseGameActivity; +import org.andengine.opengl.texture.atlas.bitmap.BitmapTextureAtlas; +import org.andengine.opengl.texture.atlas.bitmap.BitmapTextureAtlasTextureRegionFactory; + +import java.util.ArrayList; + +/** + * (c) 2014 John Espiritu + * (c) 2014 hkri studios + * + * @author John Espiritu + * @since December 26, 2014 + * + */ +public class StartScreen extends Scene implements IOnSceneTouchListener { + + //Floor variables + BitmapTextureAtlas bmpAtlas; + ITextureRegion floorRegion; + float FLOOR_Y = 0.0f; + float FLOOR_VELOCITY = 4f; + + //Cloud bg variables + ITextureRegion cloudsRegion; + float CLOUD_VELOCITY = 1f; + float CLOUD_Y = 40f; + + //Tap to start variable + ITextureRegion instructionRegion; + Sprite mInstructionTap; + + //Title variable + ITextureRegion titleRegion; + Sprite mGameTitle; + + //Cover + BitmapTextureAtlas coveratlas; + ITextureRegion coverRegion; + Sprite cover; + + //Game properties + Engine mEngine; + Camera mCamera; + TextureManager mTManager; + SimpleBaseGameActivity mActivity; + + //Intro contents + Player mPlayer; + + Floor mFloor; + CloudsBG mCloud; + + ArrayList lstFloors = new ArrayList(); + ArrayList lstClouds = new ArrayList(); + + public StartScreen(final SimpleBaseGameActivity actvt, TextureManager tmgr, Engine engn, Camera cm){ + super(); //Superclass init. + mActivity = actvt; + mEngine = engn; //Game Engine + mCamera = cm; //Camera + mTManager = tmgr; //Texture manager. + + //Register touch handler + setOnSceneTouchListener(this); + + BitmapTextureAtlasTextureRegionFactory.setAssetBasePath("gfx/"); + + //Setup contents + setupContents(); + + //Fade in animation. + cover.registerEntityModifier(new AlphaModifier(0.3f, 1.0f, 0.0f)); + + //Set scene. + setBackground(new Background(Hoppy_Girl.getClr(237), Hoppy_Girl.getClr(237), Hoppy_Girl.getClr(237))); + + //Add player + addPlayer(); + + //Add clouds bg + addCloud(); + + //Add floor sprite + FLOOR_Y = (mPlayer.getPlayerSprite().getY() + mPlayer.getPlayerSprite().getHeight()); + + while(getLastFloorRight() < mCamera.getWidth() + 50f) { + addFloor(); + } + + //title sprite + float titleW = 429f, titleH = 102f; + mGameTitle = new Sprite((mCamera.getWidth() - titleW) * 0.5f, 60f, titleRegion, mEngine.getVertexBufferObjectManager()); + mGameTitle.setSize(titleW, titleH); + + MoveYModifier modTitleYDown = new MoveYModifier(0.4f, 60f, 65f); + MoveYModifier modTitleYUp = new MoveYModifier(0.4f, 65f, 60f); + SequenceEntityModifier modTitleFloat = new SequenceEntityModifier(modTitleYDown, modTitleYUp){ + @Override + protected void onModifierFinished(IEntity pItem){ + super.reset(); + } + }; + mGameTitle.registerEntityModifier(modTitleFloat); + mGameTitle.setZIndex(2); + + //Add tap to start sprite. + mInstructionTap = new Sprite((mCamera.getWidth() - instructionRegion.getWidth()) * 0.5f, mCamera.getHeight() - 70f, instructionRegion, mEngine.getVertexBufferObjectManager()); + mInstructionTap.setZIndex(2); + AlphaModifier insDisappear = new AlphaModifier(0.01f, 1f, 0f); + AlphaModifier insAppear = new AlphaModifier(0.01f, 0f, 1f); + DelayModifier insDelay = new DelayModifier(0.7f); + DelayModifier insDelay2 = new DelayModifier(0.7f); + SequenceEntityModifier modInstructionflash = new SequenceEntityModifier(insDisappear, insDelay, insAppear, insDelay2){ + @Override + protected void onModifierFinished(IEntity pItem){ + super.reset(); + } + }; + mInstructionTap.registerEntityModifier(modInstructionflash); + + attachChild(mInstructionTap); + attachChild(mGameTitle); + } + + private void setupContents(){ + //Floor resources + bmpAtlas = new BitmapTextureAtlas(mTManager, 670, 470, TextureOptions.NEAREST); + floorRegion = BitmapTextureAtlasTextureRegionFactory.createFromAsset(bmpAtlas, mActivity, "floor_tile.png", 0, 0); + + //Cloud resources + cloudsRegion = BitmapTextureAtlasTextureRegionFactory.createFromAsset(bmpAtlas, mActivity, "clouds_bg.png", 0, 89); + + //Title resources + titleRegion = BitmapTextureAtlasTextureRegionFactory.createFromAsset(bmpAtlas, mActivity, "Hoppy_girl_gamelogo.png", 0, 260); + + //Tap to start resources + instructionRegion = BitmapTextureAtlasTextureRegionFactory.createFromAsset(bmpAtlas, mActivity, "tap_to_start.png", 0, 417); + + //Load bmp atlas. + bmpAtlas.load(); + + //Initialize cover resources. + coveratlas = new BitmapTextureAtlas(mTManager, 2, 2, TextureOptions.NEAREST); + coverRegion = BitmapTextureAtlasTextureRegionFactory.createFromAsset(coveratlas, mActivity, "black_bg.png", 0, 0); + coveratlas.load(); + + //cover sprite + cover = new Sprite(0, 0, coverRegion, mEngine.getVertexBufferObjectManager()); + cover.setSize(mCamera.getWidth(), mCamera.getHeight()); + cover.setZIndex(100); + attachChild(cover); + + } + + @Override + protected void onManagedUpdate(final float pSecondsElapsed){ + moveFloors(); + moveClouds(); + removeOffscreenFloors(); + removeOffscreenClouds(); + + if(getLastCloudRight() < mCamera.getWidth() + 50f) + addCloud(); + + if(getLastFloorRight() < mCamera.getWidth() + 50f) + addFloor(); + + super.onManagedUpdate(pSecondsElapsed); + } + + @Override + public boolean onSceneTouchEvent(Scene scn, final TouchEvent e){ + if(e.isActionDown()){ + //Fade out animation. + cover.registerEntityModifier(new AlphaModifier(0.3f, 0.0f, 1f){ + @Override + protected void onModifierFinished(IEntity pItem){ + //Unload scene. + detachChildren(); + ((Hoppy_Girl)mActivity).setGameonGameScene(); + disposeScene(); + } + }); + } + return false; + } + + private void disposeScene(){ + if(isDisposed() == false){dispose();} + } + + private void removeOffscreenFloors(){ + if(lstFloors.size() > 0){ + if(lstFloors.get(0).getSpriteX() < -100f){ + detachChild(lstFloors.get(0).getFloorSprite()); + lstFloors.remove(0); + } + } + } + + private void removeOffscreenClouds(){ + if(lstClouds.size() > 0){ + if(lstClouds.get(0).getX() < - 500f){ + detachChild(lstClouds.get(0).getSprite()); + lstClouds.remove(0); + } + } + } + + private void moveFloors(){ + for(Floor flr : lstFloors){ + flr.setSpriteX(flr.getSpriteX() - FLOOR_VELOCITY); + } + } + + private void moveClouds(){ + for(CloudsBG cld : lstClouds){ + cld.setX(cld.getX() - CLOUD_VELOCITY); + } + } + + private float getLastFloorRight(){ + if(lstFloors.size() == 0) + return 0; + Floor lastFloor = lstFloors.get(lstFloors.size() - 1); //get last floor + return lastFloor.getSpriteX() + lastFloor.getSpriteW(); + } + + private float getLastCloudRight(){ + if(lstClouds.size() == 0) + return 0; + CloudsBG lastCloud = lstClouds.get(lstClouds.size() - 1); //get last cloud + return lastCloud.getX() + lastCloud.getW(); + } + + private void addFloor(){ + mFloor = new Floor(floorRegion, mEngine); + mFloor.attachSprite(this, getLastFloorRight(), FLOOR_Y); + mFloor.getFloorSprite().setZIndex(0); + lstFloors.add(mFloor); + sortChildren(); + } + + private void addCloud(){ + //Setup cloud. + mCloud = new CloudsBG(cloudsRegion, mEngine); + mCloud.attachSprite(this, getLastCloudRight() + 150f, CLOUD_Y); + mCloud.getSprite().setZIndex(0); + lstClouds.add(mCloud); + } + + private void addPlayer(){ + //Setup player + mPlayer = new Player(mActivity, mTManager, mEngine); + mPlayer.attachPlayerSprite(this); + + //Center sprite. + mPlayer.getPlayerSprite().setPosition((mCamera.getWidth() - mPlayer.getPlayerSprite().getWidth()) * 0.5f, (mCamera.getHeight() - mPlayer.getPlayerSprite().getHeight()) * 0.5f + 55); + + } + +}