From 76da17dfbe39c67e77d4826b374f86ad4ce9941e Mon Sep 17 00:00:00 2001 From: "SLAPTOP\\marvi" Date: Sat, 21 Jun 2025 06:25:34 +0200 Subject: [PATCH] newest Version as of right now --- .gitignore | 17 - README.md | 1 - .../assets/textures/360x360 idle 4.png | Bin 24069 -> 0 bytes .../assets/textures/Player Roll 144x144.png | Bin 0 -> 3638 bytes ....import => Player Roll 144x144.png.import} | 8 +- .../textures/player reverse vault 144x144.png | Bin 0 -> 5025 bytes .../player reverse vault 144x144.png.import | 34 ++ .../textures/player wallrun 144x144.png | Bin 0 -> 5477 bytes .../player wallrun 144x144.png.import | 34 ++ sidescroller/project.godot | 16 +- sidescroller/scenes/Player.tscn | 290 +++++++++++++++++- sidescroller/scenes/box.tscn | 8 +- sidescroller/scenes/large_box.tscn | 17 + sidescroller/scenes/obstacle.tscn | 42 +++ sidescroller/scenes/platform.tscn | 17 + sidescroller/scenes/world.tscn | 95 +++--- sidescroller/scenes/world.tscn29144192732.tmp | 74 +++++ sidescroller/scenes/world.tscn29150253813.tmp | 74 +++++ sidescroller/scenes/world.tscn3795407388.tmp | 74 +++++ sidescroller/scripts/obstacle.gd | 19 ++ sidescroller/scripts/obstacle.gd.uid | 1 + sidescroller/scripts/player.gd | 131 ++++++-- .../scripts/playeraccelerationdeceleration.gd | 18 -- .../playeraccelerationdeceleration.gd.uid | 1 - sidescroller/scripts/playerclimbup.gd | 53 +++- sidescroller/scripts/playercrouch.gd | 2 +- sidescroller/scripts/playerdash.gd | 25 ++ sidescroller/scripts/playerdash.gd.uid | 1 + sidescroller/scripts/playerdoublejump.gd | 2 + sidescroller/scripts/playerfall.gd | 57 +++- sidescroller/scripts/playerfallroll.gd | 29 ++ sidescroller/scripts/playerfallroll.gd.uid | 1 + sidescroller/scripts/playeridle.gd | 5 +- sidescroller/scripts/playerjump.gd | 10 +- sidescroller/scripts/playerroll.gd | 29 ++ sidescroller/scripts/playerroll.gd.uid | 1 + sidescroller/scripts/playerrun.gd | 8 + sidescroller/scripts/playervault.gd | 58 ++++ sidescroller/scripts/playervault.gd.uid | 1 + sidescroller/scripts/playerwallrun.gd | 7 +- 40 files changed, 1104 insertions(+), 156 deletions(-) delete mode 100644 .gitignore delete mode 100644 README.md delete mode 100644 sidescroller/assets/textures/360x360 idle 4.png create mode 100644 sidescroller/assets/textures/Player Roll 144x144.png rename sidescroller/assets/textures/{360x360 idle 4.png.import => Player Roll 144x144.png.import} (65%) create mode 100644 sidescroller/assets/textures/player reverse vault 144x144.png create mode 100644 sidescroller/assets/textures/player reverse vault 144x144.png.import create mode 100644 sidescroller/assets/textures/player wallrun 144x144.png create mode 100644 sidescroller/assets/textures/player wallrun 144x144.png.import create mode 100644 sidescroller/scenes/large_box.tscn create mode 100644 sidescroller/scenes/obstacle.tscn create mode 100644 sidescroller/scenes/platform.tscn create mode 100644 sidescroller/scenes/world.tscn29144192732.tmp create mode 100644 sidescroller/scenes/world.tscn29150253813.tmp create mode 100644 sidescroller/scenes/world.tscn3795407388.tmp create mode 100644 sidescroller/scripts/obstacle.gd create mode 100644 sidescroller/scripts/obstacle.gd.uid delete mode 100644 sidescroller/scripts/playeraccelerationdeceleration.gd delete mode 100644 sidescroller/scripts/playeraccelerationdeceleration.gd.uid create mode 100644 sidescroller/scripts/playerdash.gd create mode 100644 sidescroller/scripts/playerdash.gd.uid create mode 100644 sidescroller/scripts/playerfallroll.gd create mode 100644 sidescroller/scripts/playerfallroll.gd.uid create mode 100644 sidescroller/scripts/playerroll.gd create mode 100644 sidescroller/scripts/playerroll.gd.uid create mode 100644 sidescroller/scripts/playervault.gd create mode 100644 sidescroller/scripts/playervault.gd.uid diff --git a/.gitignore b/.gitignore deleted file mode 100644 index bf83296..0000000 --- a/.gitignore +++ /dev/null @@ -1,17 +0,0 @@ -# ---> Godot -# Godot 4+ specific ignores -.godot/ - -# Godot-specific ignores -.import/ -export.cfg -export_presets.cfg - -# Imported translations (automatically generated from CSV files) -*.translation - -# Mono-specific ignores -.mono/ -data_*/ -mono_crash.*.json - diff --git a/README.md b/README.md deleted file mode 100644 index 8318c86..0000000 --- a/README.md +++ /dev/null @@ -1 +0,0 @@ -Test \ No newline at end of file diff --git a/sidescroller/assets/textures/360x360 idle 4.png b/sidescroller/assets/textures/360x360 idle 4.png deleted file mode 100644 index 71d87b2d3e069d0b8db35291b55f9827c926631c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 24069 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 diff --git a/sidescroller/assets/textures/Player Roll 144x144.png b/sidescroller/assets/textures/Player Roll 144x144.png new file mode 100644 index 0000000000000000000000000000000000000000..d6e041060647a56bfdb1e55ffe978a738434d367 GIT binary patch literal 3638 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 WkGjD=m!y3P<6!GzL$vz-r+)$VbG6X` literal 0 HcmV?d00001 diff --git a/sidescroller/assets/textures/360x360 idle 4.png.import b/sidescroller/assets/textures/Player Roll 144x144.png.import similarity index 65% rename from sidescroller/assets/textures/360x360 idle 4.png.import rename to sidescroller/assets/textures/Player Roll 144x144.png.import index b450a66..52d3944 100644 --- a/sidescroller/assets/textures/360x360 idle 4.png.import +++ b/sidescroller/assets/textures/Player Roll 144x144.png.import @@ -2,16 +2,16 @@ importer="texture" type="CompressedTexture2D" -uid="uid://c2vs4ssjqtd2i" -path="res://.godot/imported/360x360 idle 4.png-6f340b4285f1ced246665e4a52a5b3e6.ctex" +uid="uid://bnmsf8vhuo0d5" +path="res://.godot/imported/Player Roll 144x144.png-5553df63b4cd5f1e98261ab104a261b2.ctex" metadata={ "vram_texture": false } [deps] -source_file="res://assets/textures/360x360 idle 4.png" -dest_files=["res://.godot/imported/360x360 idle 4.png-6f340b4285f1ced246665e4a52a5b3e6.ctex"] +source_file="res://assets/textures/Player Roll 144x144.png" +dest_files=["res://.godot/imported/Player Roll 144x144.png-5553df63b4cd5f1e98261ab104a261b2.ctex"] [params] diff --git a/sidescroller/assets/textures/player reverse vault 144x144.png b/sidescroller/assets/textures/player reverse vault 144x144.png new file mode 100644 index 0000000000000000000000000000000000000000..b4ace8dc1b44254ad7485edb729c68cdf479874b GIT binary patch literal 5025 zcmcgwXIN8Nw~k`FiejWA!U%(rCL*A8lupnfArz6KiGm3rh9V^-K^>7AbZCNsj1(at zO$kViek3p=MIZzOfe{G3NC}Zd;5*EW_YXeL{ddogbM}w5_g?LN*IFm$GR*4WewqCs z5a^(dwK*IF+H)FMKi;8X!3tPkxc$GN6MDiX*o#gXKVb_=6;bLe*4JhMKk8aE|75da0!3cKgY~_?-2TX zRnRU}WV{1dUaNqja^S8~&orXFcU;?F!^n)$ z5pvmi?8n(^*Z$rI>H#0$4FY{u6xUL6#puI4s-N)T_Mcm-M;~QmfIashvTc14?V1TF zMRxDHrXys6B(Gu&kuv!CIc2|&I22rXSx(M~AKAbJ!^cTi^};w!Lp)=;Q6N#rk~G-; z>{6zi{-)QAv42DebR87ORw7-TmAcXOQ#(!{;W2{7(0-1_A>S{XKp1X}{IZKwnGZ3k z@S>bvC5fD#hjCZiR{sYJM@g1CYtUBaJ+qYiHy>EFS8ljM*|3t> zw(8Kaj`N&oJn}tsf;wJf68hIt7s1Y<+`jW)3kY|~VvRIhcp$hlt+2zx8ypE?d@w-KQ7$ygaVAs$s$vd)O9c_tj5|xX+=t%x$m5VW{?6<`!nZ$Z+3Pt#I=AV`>b)M7bB#f` zbZyG3%NV2d!1^syW*7Say3l;bSL@iw1Sd zO+I{dCL>yUOE(DYQ&(;;R9eA;V^XsTdRVv~oGY4#nHt*nYE^*7G^Fv}Dp=Zi*~9?i|} zxVcoTc_=F3tO!$aAE!h5qGx((WHYcSwBf+V2_KE4MF+R)LM;bK=*isa-M*Cp;Fu zVnJp_z{~CJ(_B)L8;}uq?flP95XV|cGYzJiFqIlU$EQt)&!G&^d2}L=QcpH}+0&&< zrO`4y+V6$uj^s8Ff^$BdO3+a)E|<;XIM4KrCRP#%T>3`-C(?3HRUJ54` zvM>%H+zEF^5%)7&Y|O3mT%CG1_|MXZ1*=SXulc~SR@lshyX#J>Q(8ee8P%SQc_uC} z^9*o(-7|293GgWPyf+qsw-w;fxY{+|TBwf?I*hGq zRN$!K=_NHc{Zm}d_%`#J@J6-4VTszw zy2{&WN80?^pN3GyTtGZq>bSVyOL^aQH(yrSilZ&HAVI9$zEOvL_ATO4VIx6Ze`i6E z8uYz%jzVzP;A+gL&2bTVbfVhihch!)ZLU0#X+0qYS0_%$3a1qVg1U%`u0WnuVo(si##BI5_@H7~3WKa)_`vE-PWNevT9Y<*dC zgY}gwj}j|-yE2`#Zm)lTYvtK0KuJfE`wEf~vm)mu^RRGyo3uy&&}~vuY*H+xd0jd+ zbaRWK0y|3Q8+iDciK~+RJ^_y4Co8J$MLFCMxeUQmdIPP>kD#Nbw|JRm!?fYlJ$jk2 zowN|{Ta1|*5MDp4yAo>6@z zyH`|!R2AK!Emjm8Rd7Y65D7-Ab1G_j0iz!Fhkkv_8Q(0@zO6v;&-!q)miH^SRz#1c z$sWc}KM{p6FhZUtJo8n@8kMF^o z#xJ%r`h&#B&~*!LLoV_~dqc1`LuQs~gMYP1t?YghgM}-{MW+`&w>aQZEVV<7V{V%_ z63K3#4Kh;SudemGLX)Jq^KklLc20oU?-8r6s^k8p-sK*2oAf}1NoTWpx~B;Czh()`W|rK>hoW(zf<(N zgue~o*_gOEegNaEFkiQ{@_jhME5F0xdL&Yn-xD&PD1^lFV-uk7V-!K4KWcRsR1%V6 z1^MItnmbR5LzGSwz(R%v4WB%M$cXraSY%s45}zxsl&NUBH&Gb|-99*3iXRsbj>W_< zD$A|`gHV4z6lfk?ZZF9BRZ0$8wv+{-CB>z+4{7-Mchr$I3Da5YRaKIqULa8G@1hWH z8+Rs9-gDRG%zzSHd{T=ZjD*N_Y2U!aly9F>GCM7;kA0hr^QyHavs^aA4NN{6)$4^+ z*tP(CTuEpsCzMUGbM+C%dB;r@!&k)xXa(t*`uCJ2|8FEYer3 z@yOK+sJKamk=%me=BrmP9b}wcZayUM(W4AZKDH8+1DH5rCC}+FVkdMocf@!RCtU() z6$SgL6H^ra^Dr6EPT4)X$)j%Vz62dS7?M*9HDP^`OC38peHpO}=R4cnjnoNo0K*S({~kF}sjr;mI&!?=5taEkr@%qWx9 z5hNA&BB$bE9WZ#JKiu&>=cSL#9Am^u+krsiuUox$Og{-9va{H0m9@9ISli>JHe4;k zG^lL5pA5^UMI&85;}-z#mjtVe57b8W)mYGxbLv_x@tkgz_Uyd=_ldVXd)g=d19FK@sYn@uA~ zfYo(Y*y^j!`V#An^g-dx;6REI5!os&QEsp13L6N$A-n_RLMH1{zg17{t~m^G%=a(x zq*U8^(ghBo%|F94KrggWrc)*m#H=tf%8t-iG3U0vL}Q~~xCT^sUUES1O6RA)Knz^- z75|R)yZbD^zrX?Q)^~;~t-u9-CqS_9?()eQpY{%ysUM94>VJPk{Gyo4kDcwSx$~Sx zQ)#kchEillBBNBrxk;mWkO3cR1wpEWjI}X1jgR3;j<#xZ+(MQQgCcvDg!grq7e-HY z@r2AGLW+OFLotu1yP}d}V_S~Dc#uqXy3938Oa1b^V(HSAx`rZ*bCkUrhM!H*S!_9SLVr=EIpL4nznU+Hvt^nK8q2A~a!PuU)Lpn_l= zf$aVTZu0g_Owvve;BhHsa_ln_rB~uYt8P3OpYxMluiTY;Vjax{jxZeQ8;PHXQJXFr zVzu50rY3bc8S9)^Mtyh_vs(xhsn4lXjmCshY(i-DrE=Xk$aXTMR_fdkW`qd$o*7tg zVs+`<9Le44*QHJ4H%9Kn>FO3PhAamyu_6e?3PceI)o%Y7F$Q$hvz zg^W^h-crQ147AK;6cyJwsf86^#_dd_LXS?To&xy9OFqYgc zw;KQeNM5{f&ISP3C7J>fe%vX#UV4gRiEi6)HpagJ$~u9Q0DuhW;yFW9aQ5tgVUZ^~ zQ~XN+ygG9m)1rOH#i|Q`-o80ebN0s*za2brE^Nkd-^{%eJH?oojLxz{)i}Ak;pX2n?^!L@U(6}P4bql+V1;_n($G$wsh3yqo*F%0o(ssM8zr0Ob|DC8uYb+PHXFT*sjx48wyzd zYm{d+FyJ@I<-GfARwmv>KO-7}CC5{eWCL1ukv#9q@x{IzBEz+1+%}1xN$&^j*jy;+ zeRyYFjEre91;csTOetidvgjOi^no1ztXk$@B-gjW{)^sO$yF6hO*Tlz4dlIj-zK4( z?cYgNc~?H-6#HS_0i}1%DhRXlX)QmivJya;7OB5DI!mTaOW7#BA)ZxK9hAUIh#rb0 z`1^Cju|8d@`79QONYsqT*mY);{#)>`fNlRQ&M*}JQD~HSCQ*2#p>Rbk&C^WZiW6&m zede@^OI^?(q1$gn&14n5GsOpBUP)zcMFI#tWCB8E|a?U~eWI=BDl+nL`=9 zpOW4F;=Wk>AIsXX%WU-C!2hMYVnEnzrg1M(g3fOnGCzsYY*6(`1{M5bI+`Gj(aZ#K z7z~f~yp(n;59ZpNscRgD`_<#Xtbm@(7bhxRk9*!1F#j=p45emD!x-ZiI4|*P$%|VS zU#$h%_T#2T;p01xY|bY>XcJ>Fsd1eUe!9=+wb6&N$s{~ALAmeOAdAcQkR`V+?=c-$ zO(KD3rgfFk>*^itbUg1~X%_;&7{^-ybmZi+3PLw{n&Y$Om#~zzwb_mE>yK(-!=JSJ;el-QqunCq z{XL%U`u+!ygtSf=HY`?Rof!HNg0>;e&|E@dsnKvO_cH?FaLTB?#nr~7IwfDuHe8}?*5~2NBPwoNQ6uL_8HEfTp#pfoS)$(rm69QEOY7qL& z|82dV_3%Rdp<4|N1)b60Q5N2O>}xOm5+bg5C)<5t`psb7mn)Vf2y`vIVB9g+d66`} zc69tp&-5o(X>67W7CAB<|D>)SFDyr_xSo6-_2R*!>2_4_wec3q_KPOIc;Om@?z-Xf zu?_8L=|CwEV40fCuDkVucB0cpZhKBHki;lS$+&$%af-xGMmjmX1X(Jqy6mD)*S|78 z&&%Ws^mt}`gHrGoj%vRo;|8O;k_zM`bL5syv&LI&On~Hcq_`dAa-zVTI-X)z{I((c zDk~;FZV_(T|8=;hw=QBB^ms72vMF#J(XgR4&E-Yhh;#)-XFhA*u&@Nj z;P3vLu-O(_S$$jlVarYzP49w&y(Kk$dXLy{Q;li0qfc_cH3^w4DgniIdju_1fHH`L zN0PnkeYKwVTHm|Atiy*-FQR+nvFfM*^4PRy057Y0*he+U;jB#>_3Mqa;T17oXCp#;U=T6ReKPfdNF zCy>RnGK2nR3sRjqPLV>b!8$clNG7Jsg^-y|xh`Yjp`n1xMZUg7$Ygc3cJoJ;BeMc! z3#W61*MepbwY7Y#PXGL#$f70eE(FgMPw7KPgd!jP^u+r{Q&?H8&T2t7MXL`Sbk78Z z%PB0-QC4287Oc*zm5ODFLP*Er8C&x<`+(yVYl8B!gHh+uD;y=Kz!8`K&B}|M7qySV z1T25mR1l3|X%77WTxP-<29Y@a&?_yK?=s!@xq7-_yQZ!9J`J(_^vI2o&>GeN`?J4| z8kCslYdrbm1Z^G(C%D*3!|>rD5XZH?F(sme9+d6V18Y8Nq@KN((eH5Q*pp9;d2nCt zXvW+qtgFq7M~u4?ftcFf*Fy`{R~TV z5^~oG>Ii{D3V|rlc+`6fMba$yM#yaR+z^mwsn5HvZ$KQ=2z})(i?7Gnqf;MOr7Zcf zqgPJDB0-3Tg?@7Up~@)@QVm6qdzf*u>T~&v&@1aVn4$fN!f~&yu*7xsMjMovm6BcC zrMe*ZO3kKskM|Yt4wxFgJbPX(Fu)@V^ZVC#$+fB>pgwEIXq#kG_u6Po572i_C30>O zw0@O~jYDVcFGt446e!GPt6qtvz&7%kYRs|9K)j!kBnDSZNhqU7*!9(eU0nIlUOLyhw9!eqRTQDq@}kL z{3M%x(cG4b4DEa!JOVzZiZ=B&Qm}V5sXmoDxS{C2m3W^u8U>`Azy;bgCdhF=!+`gA zt>P%vl@m?O;~rMUuXYxAH|fsdb0VfHJ0k1YLrXq8uvq~CP{zvx#&r}ic~Pj=O|0D0 zH5eH@4?^om;hK$$?R*(YVKvfN)Gw;!b#%#s2{S|z)blTch`l|Tf`QO=wkUJ2lLpvs zB<|@eWmn@I$efh+g|WHfpy!HO<3%d%AG7GoYpc@?%&||2NbZ5@>zu$kj%k;Sms;8J zxfNUobu62bqF4+LO{82SP~`UH6DT<>S_cZdf1NM|7X`j+jPeGSry8|jeH=@7L>R1e z&DM4-*o$w87*8}GD77nQ%g6VBfDLv6xBw@rUgB2d)_{wSCfPQN*`&M)RELz>v zx}6R52*dKFnKtx*0GVm+d=#|#ipxOEU5nVff(Y{dhPkl#p+%sro`1?^UrD5v(mvyF zaX}^-3{flfQaj(AmfmW6GylHt&Px87ohvqQfK3X7y*OcQG?1@1avoa!()J8zd5*N2b?G*o5PkbmLhW3KG)~)KpKrU zqwe$of!(`kctt`kfs-=Le4r#sOXJ4g4=B-Dns^5C3;eG28`wc$SM zR=Dz3mlnnuD4By4Py5MOKfUL6>dE^-dtjU~Zl?{f*2i-s*hK_orWuucHEqN8LqftQ zX`&c+kG*pSZ6Vp}N!Lh>WgUKPQyP2b^r^~&H{vjD*;FrzroZmxS+uAAWLvH43#u^A zWV$h*h8?$e>8BT}=XTp#rT4~<7ge+;Qu^{-%yks$FJE=)sX|1)(vzJ{h+*ODROHJP z6yh>!*^3>oy91jYSq%j2$w(LT>Ibb3P9=!>=u{U{pc@zgl{sCe3W_726tl(*9P7xS z{^;Y-IdsxdDF0w9kzWFf)8rPjDF8iT6WUV$j+&irebCZGjbC->YEF;{lwDwtjd_yq zt&M7{RBHJH*BdYrtlLzrE5HSj7obK*J=JX8tzO<|#r%r;2+7TEf0M|8GG1hm$Z>{b zXQr86z)2ljTcoJkN{Yp^OAyHAj$S+!e^sj|?&fT7GisH3fXlqr$}~Du`YJPd|eV;V2!APqTIuKe)7LZQhZLZF@jGrCMc34ld)rQ8lQXUp#3P z$AVShWCWx!x>v?`1s6{2KQ+@;p3*}L59aO)l&uLldv`@kOO@AX%)ZExW+~O>OGq!Z z2Z_T3EmtcAn6jA; zPNGQ9Jx_+y?33L$*ab9=EM&HPZF!CQiK)uH?Q-mNWk_1G^0KU@??BYG@2h^MV& z-Qz`ErHo|U^^n9Nx9wcsDi7b<=TV6<;#ojf!YFe=a}hDnEIU#BMTtO}14Xt&j%noT zSR{tTy-in~ZbZ$`pw%Hz;=hnFcMX8BKsW2jmncVZ?;P3JC=r8woC)F;DYo%}j6}rxVf_|Ys*JRE~@H4kigxji46Iu&G}Q0f%pjsAxoJI zAbR0gw`Iq6KeIpEl84zhk)wY^y-~C;%4MriQ?lycq~2(sG{=iENtFVa2J~-xdZ_HL zI<#KpQZf(0O+17)BDzkIlg5lp~55j+o7p%{Cpcx z2e;zMOnJZA8HK}tZv#|pg?s;b|9^I~n%)3Js^d&3tuL*<5xscc;#}EpZg>6-3Mc+4 literal 0 HcmV?d00001 diff --git a/sidescroller/assets/textures/player wallrun 144x144.png.import b/sidescroller/assets/textures/player wallrun 144x144.png.import new file mode 100644 index 0000000..fa511f3 --- /dev/null +++ b/sidescroller/assets/textures/player wallrun 144x144.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://qat50ripqu32" +path="res://.godot/imported/player wallrun 144x144.png-95291f2b882699223dcb597652983c1b.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/textures/player wallrun 144x144.png" +dest_files=["res://.godot/imported/player wallrun 144x144.png-95291f2b882699223dcb597652983c1b.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/sidescroller/project.godot b/sidescroller/project.godot index 662dab8..acdce4e 100644 --- a/sidescroller/project.godot +++ b/sidescroller/project.godot @@ -23,10 +23,6 @@ window/size/window_width_override=1280 window/size/window_height_override=720 window/stretch/mode="canvas_items" -[dotnet] - -project/assembly_name="Sidescroller" - [input] jump={ @@ -49,6 +45,18 @@ crouch={ "events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":83,"key_label":0,"unicode":115,"location":0,"echo":false,"script":null) ] } +sprint={ +"deadzone": 0.2, +"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":4194325,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null) +] +} + +[layer_names] + +2d_render/layer_1="world" +2d_render/layer_2="interactions" +2d_physics/layer_1="world" +2d_physics/layer_2="interactions" [rendering] diff --git a/sidescroller/scenes/Player.tscn b/sidescroller/scenes/Player.tscn index b24cabe..95fb715 100644 --- a/sidescroller/scenes/Player.tscn +++ b/sidescroller/scenes/Player.tscn @@ -1,4 +1,4 @@ -[gd_scene load_steps=38 format=3 uid="uid://c3w3n7ysd02bd"] +[gd_scene load_steps=48 format=3 uid="uid://c3w3n7ysd02bd"] [ext_resource type="Texture2D" uid="uid://c1my4xbvhsdq8" path="res://assets/textures/Player Idle 144x144.png" id="1_p0vlq"] [ext_resource type="Texture2D" uid="uid://crkx6pt8e4cmc" path="res://assets/textures/player new jump 144x144.png" id="2_qu4a1"] @@ -9,11 +9,14 @@ [ext_resource type="Texture2D" uid="uid://co5l6328i3y76" path="res://assets/textures/Player Crouch-Idle 144x144.png" id="6_cw2d6"] [ext_resource type="Script" uid="uid://c0iqbs1ms86cw" path="res://scripts/State Machine.gd" id="9_bruh7"] [ext_resource type="Texture2D" uid="uid://d4dnvylog631n" path="res://assets/textures/ledge hang 144x144.png" id="9_sfy4j"] +[ext_resource type="Texture2D" uid="uid://bnmsf8vhuo0d5" path="res://assets/textures/Player Roll 144x144.png" id="10_6e537"] [ext_resource type="Script" uid="uid://cawr3av2aa8jb" path="res://scripts/playercrouch.gd" id="10_6eyey"] [ext_resource type="Texture2D" uid="uid://cry06ubemcrcf" path="res://assets/textures/player ledge climb 144x144.png" id="10_b8lor"] +[ext_resource type="Texture2D" uid="uid://qat50ripqu32" path="res://assets/textures/player wallrun 144x144.png" id="11_p07f3"] [ext_resource type="Script" uid="uid://dyee6xwb8js1s" path="res://scripts/playerrun.gd" id="11_p7iby"] [ext_resource type="Script" uid="uid://dhvehwhg63p2h" path="res://scripts/playercrouchwalk.gd" id="11_srp4u"] [ext_resource type="Script" uid="uid://d0cc7xgq16onu" path="res://scripts/playerjump.gd" id="12_0rnld"] +[ext_resource type="Texture2D" uid="uid://nf8iaga2ce0g" path="res://assets/textures/player reverse vault 144x144.png" id="12_viqgg"] [ext_resource type="Script" uid="uid://bcnm70o0yo87k" path="res://scripts/playerwallrun.gd" id="13_srp4u"] [ext_resource type="Script" uid="uid://cgsyaphtn6k6q" path="res://scripts/playerdoublejump.gd" id="14_61ith"] [ext_resource type="Script" uid="uid://d34ia87aolokd" path="res://scripts/playeridle.gd" id="14_jfpux"] @@ -21,6 +24,10 @@ [ext_resource type="Script" uid="uid://whap2d3r3yk" path="res://scripts/playerfall.gd" id="16_jfpux"] [ext_resource type="Script" uid="uid://c46i4062efgw1" path="res://scripts/playerledgegrab.gd" id="19_ebwui"] [ext_resource type="Script" uid="uid://boe7p8pcolkln" path="res://scripts/playerclimbup.gd" id="21_gv3ic"] +[ext_resource type="Script" uid="uid://clru46wbu1bi1" path="res://scripts/playerroll.gd" id="22_b8lor"] +[ext_resource type="Script" uid="uid://dq3g3qck2e0wv" path="res://scripts/playervault.gd" id="26_fgkxt"] +[ext_resource type="Script" uid="uid://qf4kjhw6b8ip" path="res://scripts/playerdash.gd" id="27_xsi7p"] +[ext_resource type="Script" uid="uid://bjln8dh5ajphf" path="res://scripts/playerfallroll.gd" id="28_1jpwa"] [sub_resource type="GDScript" id="GDScript_khinc"] script/source = "extends CharacterBody2D @@ -91,11 +98,35 @@ tracks/4/keys = { "update": 0, "values": [Vector2(0, 0)] } +tracks/5/type = "value" +tracks/5/imported = false +tracks/5/enabled = true +tracks/5/path = NodePath("../Sprite2D:position") +tracks/5/interp = 1 +tracks/5/loop_wrap = true +tracks/5/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Vector2(11, -60)] +} +tracks/6/type = "value" +tracks/6/imported = false +tracks/6/enabled = true +tracks/6/path = NodePath("../RootMotion:position") +tracks/6/interp = 1 +tracks/6/loop_wrap = true +tracks/6/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Vector2(11, -60)] +} [sub_resource type="Animation" id="Animation_6e537"] resource_name = "climb up" length = 0.5 -step = 0.03 +step = 0.01 tracks/0/type = "value" tracks/0/imported = false tracks/0/enabled = true @@ -139,11 +170,23 @@ tracks/3/path = NodePath("../Sprite2D:frame") tracks/3/interp = 1 tracks/3/loop_wrap = true tracks/3/keys = { -"times": PackedFloat32Array(0, 0.0909091, 0.181818, 0.30303, 0.454545), +"times": PackedFloat32Array(0, 0.08, 0.16, 0.27, 0.4), "transitions": PackedFloat32Array(1, 1, 1, 1, 1), "update": 1, "values": [0, 1, 2, 3, 4] } +tracks/4/type = "value" +tracks/4/imported = false +tracks/4/enabled = true +tracks/4/path = NodePath("../RootMotion:position") +tracks/4/interp = 1 +tracks/4/loop_wrap = true +tracks/4/keys = { +"times": PackedFloat32Array(0, 0.08, 0.16, 0.27, 0.4), +"transitions": PackedFloat32Array(1, 1, 1, 1, 1), +"update": 1, +"values": [Vector2(0, -60), Vector2(11, -75), Vector2(11, -93), Vector2(32, -111), Vector2(60, -111)] +} [sub_resource type="Animation" id="Animation_cw2d6"] resource_name = "crouch idle" @@ -409,6 +452,18 @@ tracks/3/keys = { "update": 1, "values": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] } +tracks/4/type = "value" +tracks/4/imported = false +tracks/4/enabled = true +tracks/4/path = NodePath("../Sprite2D:position") +tracks/4/interp = 1 +tracks/4/loop_wrap = true +tracks/4/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Vector2(0, -48)] +} [sub_resource type="Animation" id="Animation_d3wef"] resource_name = "jump" @@ -526,6 +581,136 @@ tracks/4/keys = { "values": [Vector2(0, 0)] } +[sub_resource type="Animation" id="Animation_fgkxt"] +resource_name = "reverse vault" +length = 0.75 +step = 0.025 +tracks/0/type = "value" +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/path = NodePath("../Sprite2D:texture") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 1, +"values": [ExtResource("12_viqgg")] +} +tracks/1/type = "value" +tracks/1/imported = false +tracks/1/enabled = true +tracks/1/path = NodePath("../Sprite2D:hframes") +tracks/1/interp = 1 +tracks/1/loop_wrap = true +tracks/1/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 1, +"values": [11] +} +tracks/2/type = "value" +tracks/2/imported = false +tracks/2/enabled = true +tracks/2/path = NodePath("../Sprite2D:vframes") +tracks/2/interp = 1 +tracks/2/loop_wrap = true +tracks/2/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 1, +"values": [1] +} +tracks/3/type = "value" +tracks/3/imported = false +tracks/3/enabled = true +tracks/3/path = NodePath("../Sprite2D:frame") +tracks/3/interp = 1 +tracks/3/loop_wrap = true +tracks/3/keys = { +"times": PackedFloat32Array(0, 0.075, 0.15, 0.225, 0.3, 0.375, 0.45, 0.525, 0.6, 0.675), +"transitions": PackedFloat32Array(1, 1, 1, 1, 1, 1, 1, 1, 1, 1), +"update": 1, +"values": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] +} +tracks/4/type = "value" +tracks/4/imported = false +tracks/4/enabled = true +tracks/4/path = NodePath("../RootMotion:position") +tracks/4/interp = 1 +tracks/4/loop_wrap = true +tracks/4/keys = { +"times": PackedFloat32Array(0, 0.075, 0.225, 0.6, 0.675), +"transitions": PackedFloat32Array(1, 1, 1, 1, 1), +"update": 0, +"values": [Vector2(0, -70), Vector2(0, -70), Vector2(0, -100), Vector2(0, -94), Vector2(0, -70)] +} + +[sub_resource type="Animation" id="Animation_p07f3"] +resource_name = "roll" +length = 0.55 +step = 0.05 +tracks/0/type = "value" +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/path = NodePath("../Sprite2D:texture") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 1, +"values": [ExtResource("10_6e537")] +} +tracks/1/type = "value" +tracks/1/imported = false +tracks/1/enabled = true +tracks/1/path = NodePath("../Sprite2D:hframes") +tracks/1/interp = 1 +tracks/1/loop_wrap = true +tracks/1/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 1, +"values": [7] +} +tracks/2/type = "value" +tracks/2/imported = false +tracks/2/enabled = true +tracks/2/path = NodePath("../Sprite2D:vframes") +tracks/2/interp = 1 +tracks/2/loop_wrap = true +tracks/2/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 1, +"values": [1] +} +tracks/3/type = "value" +tracks/3/imported = false +tracks/3/enabled = true +tracks/3/path = NodePath("../Sprite2D:frame") +tracks/3/interp = 1 +tracks/3/loop_wrap = true +tracks/3/keys = { +"times": PackedFloat32Array(0, 0.1, 0.2, 0.3, 0.4, 0.5), +"transitions": PackedFloat32Array(1, 1, 1, 1, 1, 1), +"update": 1, +"values": [0, 1, 2, 3, 4, 5] +} +tracks/4/type = "value" +tracks/4/imported = false +tracks/4/enabled = true +tracks/4/path = NodePath("../Sprite2D:position") +tracks/4/interp = 1 +tracks/4/loop_wrap = true +tracks/4/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Vector2(0, -48)] +} + [sub_resource type="Animation" id="Animation_lkdrv"] resource_name = "run" length = 0.81 @@ -580,6 +765,59 @@ tracks/3/keys = { "values": [0, 1, 2, 3, 4, 5, 6, 7] } +[sub_resource type="Animation" id="Animation_viqgg"] +resource_name = "wallrun" +length = 0.8 +step = 0.05 +tracks/0/type = "value" +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/path = NodePath("../Sprite2D:texture") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 1, +"values": [ExtResource("11_p07f3")] +} +tracks/1/type = "value" +tracks/1/imported = false +tracks/1/enabled = true +tracks/1/path = NodePath("../Sprite2D:hframes") +tracks/1/interp = 1 +tracks/1/loop_wrap = true +tracks/1/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 1, +"values": [16] +} +tracks/2/type = "value" +tracks/2/imported = false +tracks/2/enabled = true +tracks/2/path = NodePath("../Sprite2D:vframes") +tracks/2/interp = 1 +tracks/2/loop_wrap = true +tracks/2/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 1, +"values": [1] +} +tracks/3/type = "value" +tracks/3/imported = false +tracks/3/enabled = true +tracks/3/path = NodePath("../Sprite2D:frame") +tracks/3/interp = 1 +tracks/3/loop_wrap = true +tracks/3/keys = { +"times": PackedFloat32Array(0, 0.05, 0.1, 0.15, 0.2, 0.25, 0.3, 0.35, 0.4, 0.45, 0.5, 0.55, 0.6, 0.65, 0.7, 0.75), +"transitions": PackedFloat32Array(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1), +"update": 1, +"values": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15] +} + [sub_resource type="AnimationLibrary" id="AnimationLibrary_0rnld"] _data = { &"RESET": SubResource("Animation_6eyey"), @@ -591,7 +829,10 @@ _data = { &"idle": SubResource("Animation_bruh7"), &"jump": SubResource("Animation_d3wef"), &"ledge hang": SubResource("Animation_gv3ic"), -&"run": SubResource("Animation_lkdrv") +&"reverse vault": SubResource("Animation_fgkxt"), +&"roll": SubResource("Animation_p07f3"), +&"run": SubResource("Animation_lkdrv"), +&"wallrun": SubResource("Animation_viqgg") } [sub_resource type="RectangleShape2D" id="RectangleShape2D_bruh7"] @@ -600,11 +841,13 @@ _data = { [sub_resource type="RectangleShape2D" id="RectangleShape2D_6eyey"] -[node name="Player" type="CharacterBody2D"] +[node name="Player" type="CharacterBody2D" groups=["player"]] +collision_layer = 3 +collision_mask = 3 script = SubResource("GDScript_khinc") [node name="Sprite2D" type="Sprite2D" parent="."] -position = Vector2(0, -48) +position = Vector2(11, -60) texture = ExtResource("1_p0vlq") hframes = 10 frame = 1 @@ -615,8 +858,17 @@ shape = SubResource("RectangleShape2D_gv3ic") [node name="Camera2D" type="Camera2D" parent="."] position = Vector2(0, -90) +zoom = Vector2(0.6, 0.6) +position_smoothing_enabled = true +position_smoothing_speed = 10.0 +drag_vertical_offset = 1.0 +drag_left_margin = 0.1 +drag_top_margin = 0.1 +drag_right_margin = 0.1 +drag_bottom_margin = 0.1 -[node name="RootMotion" type="Node" parent="."] +[node name="RootMotion" type="Node2D" parent="."] +position = Vector2(11, -60) [node name="AnimationPlayer" type="AnimationPlayer" parent="."] root_node = NodePath("../Camera2D") @@ -635,19 +887,19 @@ target_position = Vector2(0, -37) [node name="wallrunrcright1" type="RayCast2D" parent="."] position = Vector2(0, -22) -target_position = Vector2(120, 0) +target_position = Vector2(100, 0) [node name="wallrunrcright2" type="RayCast2D" parent="."] position = Vector2(0, -97) -target_position = Vector2(120, 0) +target_position = Vector2(100, 0) [node name="wallrunrcleft1" type="RayCast2D" parent="."] position = Vector2(0, -22) -target_position = Vector2(-120, 0) +target_position = Vector2(-100, 0) [node name="wallrunrcleft2" type="RayCast2D" parent="."] position = Vector2(0, -97) -target_position = Vector2(-120, 0) +target_position = Vector2(-100, 0) [node name="wallcheckleft" type="ShapeCast2D" parent="."] position = Vector2(-28, -60) @@ -724,3 +976,19 @@ metadata/_custom_type_script = "uid://c46i4062efgw1" [node name="PlayerClimbUp" type="Node" parent="StateMachine"] script = ExtResource("21_gv3ic") metadata/_custom_type_script = "uid://boe7p8pcolkln" + +[node name="PlayerRoll" type="Node" parent="StateMachine"] +script = ExtResource("22_b8lor") +metadata/_custom_type_script = "uid://clru46wbu1bi1" + +[node name="PlayerVault" type="Node" parent="StateMachine"] +script = ExtResource("26_fgkxt") +metadata/_custom_type_script = "uid://dq3g3qck2e0wv" + +[node name="PlayerDash" type="Node" parent="StateMachine"] +script = ExtResource("27_xsi7p") +metadata/_custom_type_script = "uid://qf4kjhw6b8ip" + +[node name="PlayerFallRoll" type="Node" parent="StateMachine"] +script = ExtResource("28_1jpwa") +metadata/_custom_type_script = "uid://bjln8dh5ajphf" diff --git a/sidescroller/scenes/box.tscn b/sidescroller/scenes/box.tscn index 5cfa9bb..69aeaca 100644 --- a/sidescroller/scenes/box.tscn +++ b/sidescroller/scenes/box.tscn @@ -3,16 +3,16 @@ [sub_resource type="QuadMesh" id="QuadMesh_on5l8"] [sub_resource type="RectangleShape2D" id="RectangleShape2D_on5l8"] -size = Vector2(144, 231) +size = Vector2(144, 230) [node name="Box" type="StaticBody2D"] [node name="MeshInstance2D" type="MeshInstance2D" parent="."] modulate = Color(0.72817, 0.433509, 0.493915, 1) -position = Vector2(96, 39.125) -scale = Vector2(143.5, 232.25) +position = Vector2(96, 40.125) +scale = Vector2(143.5, 230.25) mesh = SubResource("QuadMesh_on5l8") [node name="CollisionShape2D" type="CollisionShape2D" parent="."] -position = Vector2(96, 39.5) +position = Vector2(96, 40) shape = SubResource("RectangleShape2D_on5l8") diff --git a/sidescroller/scenes/large_box.tscn b/sidescroller/scenes/large_box.tscn new file mode 100644 index 0000000..0234305 --- /dev/null +++ b/sidescroller/scenes/large_box.tscn @@ -0,0 +1,17 @@ +[gd_scene load_steps=3 format=3 uid="uid://b8jkjejwkvr6w"] + +[sub_resource type="QuadMesh" id="QuadMesh_4wyf3"] + +[sub_resource type="RectangleShape2D" id="RectangleShape2D_k0juu"] +size = Vector2(146, 368) + +[node name="large box" type="StaticBody2D"] + +[node name="MeshInstance2D" type="MeshInstance2D" parent="."] +position = Vector2(3509, 93) +scale = Vector2(146, 368) +mesh = SubResource("QuadMesh_4wyf3") + +[node name="CollisionShape2D" type="CollisionShape2D" parent="."] +position = Vector2(3509, 93) +shape = SubResource("RectangleShape2D_k0juu") diff --git a/sidescroller/scenes/obstacle.tscn b/sidescroller/scenes/obstacle.tscn new file mode 100644 index 0000000..e1e52ab --- /dev/null +++ b/sidescroller/scenes/obstacle.tscn @@ -0,0 +1,42 @@ +[gd_scene load_steps=5 format=3 uid="uid://ctw5n2m0kj374"] + +[ext_resource type="Script" uid="uid://b8ewx8kbbdns1" path="res://scripts/obstacle.gd" id="1_7ukg5"] + +[sub_resource type="RectangleShape2D" id="RectangleShape2D_71j4m"] +size = Vector2(76, 72) + +[sub_resource type="QuadMesh" id="QuadMesh_71j4m"] + +[sub_resource type="RectangleShape2D" id="RectangleShape2D_7ukg5"] +size = Vector2(71, 20) + +[node name="Obstacle" type="StaticBody2D"] +script = ExtResource("1_7ukg5") + +[node name="CollisionShape2D" type="CollisionShape2D" parent="."] +position = Vector2(0, -36) +shape = SubResource("RectangleShape2D_71j4m") + +[node name="MeshInstance2D" type="MeshInstance2D" parent="."] +modulate = Color(0.204699, 0.452404, 0.537435, 1) +position = Vector2(0, -36.543) +scale = Vector2(-76.1197, 73.0578) +mesh = SubResource("QuadMesh_71j4m") + +[node name="triggerzone_left" type="Area2D" parent="."] +collision_layer = 2 +collision_mask = 2 + +[node name="triggerzone_left_cs" type="CollisionShape2D" parent="triggerzone_left"] +position = Vector2(-190, -10) +scale = Vector2(0.5, 1) +shape = SubResource("RectangleShape2D_7ukg5") + +[node name="triggerzone_right" type="Area2D" parent="."] +collision_layer = 2 +collision_mask = 2 + +[node name="triggerzone_right_cs" type="CollisionShape2D" parent="triggerzone_right"] +position = Vector2(190, -10) +scale = Vector2(0.5, 1) +shape = SubResource("RectangleShape2D_7ukg5") diff --git a/sidescroller/scenes/platform.tscn b/sidescroller/scenes/platform.tscn new file mode 100644 index 0000000..e508d34 --- /dev/null +++ b/sidescroller/scenes/platform.tscn @@ -0,0 +1,17 @@ +[gd_scene load_steps=3 format=3 uid="uid://bwakdn8hnjoq4"] + +[sub_resource type="QuadMesh" id="QuadMesh_go701"] +size = Vector2(1000, 100) + +[sub_resource type="RectangleShape2D" id="RectangleShape2D_go701"] +size = Vector2(1001, 98) + +[node name="Platform" type="StaticBody2D"] + +[node name="MeshInstance2D" type="MeshInstance2D" parent="."] +position = Vector2(-35, 194) +mesh = SubResource("QuadMesh_go701") + +[node name="CollisionShape2D" type="CollisionShape2D" parent="."] +position = Vector2(-35.5, 194) +shape = SubResource("RectangleShape2D_go701") diff --git a/sidescroller/scenes/world.tscn b/sidescroller/scenes/world.tscn index b4eb1a0..8a7d331 100644 --- a/sidescroller/scenes/world.tscn +++ b/sidescroller/scenes/world.tscn @@ -1,66 +1,77 @@ -[gd_scene load_steps=6 format=3 uid="uid://21dnwl0rfjcd"] +[gd_scene load_steps=7 format=3 uid="uid://21dnwl0rfjcd"] [ext_resource type="PackedScene" uid="uid://c3w3n7ysd02bd" path="res://scenes/Player.tscn" id="1_go701"] [ext_resource type="Script" uid="uid://d2jx8gdq5o5d7" path="res://scripts/player.gd" id="2_5a7ea"] [ext_resource type="PackedScene" uid="uid://bnaknh1h8isk0" path="res://scenes/box.tscn" id="3_4wyf3"] - -[sub_resource type="QuadMesh" id="QuadMesh_go701"] -size = Vector2(1000, 100) - -[sub_resource type="RectangleShape2D" id="RectangleShape2D_go701"] -size = Vector2(1001, 98) +[ext_resource type="PackedScene" uid="uid://bwakdn8hnjoq4" path="res://scenes/platform.tscn" id="3_71j4m"] +[ext_resource type="PackedScene" uid="uid://b8jkjejwkvr6w" path="res://scenes/large_box.tscn" id="5_qfnet"] +[ext_resource type="PackedScene" uid="uid://ctw5n2m0kj374" path="res://scenes/obstacle.tscn" id="6_qfnet"] [node name="World" type="Node2D"] [node name="Player" parent="." instance=ExtResource("1_go701")] position = Vector2(589, 149) script = ExtResource("2_5a7ea") -speed = 350 +speed = 400 grav = 40 +fallgrav = 60 jump_force = 800 -fallvelocity_cap = 1000 +fallvelocity_cap = 1500 max_air_jumps = 1 sprint_mult = 1.5 crouch_mult = 0.4 +roll_mult = 1.5 +jump_mult = 1.3 -[node name="Platform" type="StaticBody2D" parent="."] -position = Vector2(604, 135) +[node name="Platform" parent="." instance=ExtResource("3_71j4m")] +position = Vector2(597, 130) -[node name="MeshInstance2D" type="MeshInstance2D" parent="Platform"] -position = Vector2(-35, 194) -mesh = SubResource("QuadMesh_go701") - -[node name="CollisionShape2D" type="CollisionShape2D" parent="Platform"] -position = Vector2(-35.5, 194) -shape = SubResource("RectangleShape2D_go701") - -[node name="Platform2" type="StaticBody2D" parent="."] -position = Vector2(2118, 133) - -[node name="MeshInstance2D" type="MeshInstance2D" parent="Platform2"] -position = Vector2(-35, 194) -mesh = SubResource("QuadMesh_go701") - -[node name="CollisionShape2D" type="CollisionShape2D" parent="Platform2"] -position = Vector2(-35.5, 194) -shape = SubResource("RectangleShape2D_go701") - -[node name="Platform3" type="StaticBody2D" parent="."] -position = Vector2(1385, 233) - -[node name="MeshInstance2D" type="MeshInstance2D" parent="Platform3"] -position = Vector2(-35, 194) -mesh = SubResource("QuadMesh_go701") - -[node name="CollisionShape2D" type="CollisionShape2D" parent="Platform3"] -position = Vector2(-35.5, 194) -shape = SubResource("RectangleShape2D_go701") +[node name="Platform2" parent="." instance=ExtResource("3_71j4m")] +position = Vector2(1402, 228) [node name="Box" parent="." instance=ExtResource("3_4wyf3")] position = Vector2(1808, 48) [node name="Box2" parent="." instance=ExtResource("3_4wyf3")] -position = Vector2(2500, 121) +position = Vector2(2498, 122) [node name="Box3" parent="." instance=ExtResource("3_4wyf3")] -position = Vector2(2500, -108) +position = Vector2(-1738, -53) + +[node name="large box" parent="." instance=ExtResource("5_qfnet")] + +[node name="Platform3" parent="." instance=ExtResource("3_71j4m")] +position = Vector2(2117, 130) + +[node name="Platform4" parent="." instance=ExtResource("3_71j4m")] +position = Vector2(3117, 130) + +[node name="Platform5" parent="." instance=ExtResource("3_71j4m")] +position = Vector2(4111, 130) + +[node name="Platform6" parent="." instance=ExtResource("3_71j4m")] +position = Vector2(5099, 130) + +[node name="Obstacle" parent="." instance=ExtResource("6_qfnet")] +position = Vector2(4493, 274) + +[node name="Obstacle2" parent="." instance=ExtResource("6_qfnet")] +position = Vector2(-1124, 274) + +[node name="Obstacle3" parent="." instance=ExtResource("6_qfnet")] +position = Vector2(-1675, 274) + +[node name="Platform7" parent="." instance=ExtResource("3_71j4m")] +position = Vector2(-913, 130) + +[node name="Platform8" parent="." instance=ExtResource("3_71j4m")] +position = Vector2(-1916, 130) + +[node name="Platform9" parent="." instance=ExtResource("3_71j4m")] +position = Vector2(-107, 1004) + +[node name="Box4" parent="." instance=ExtResource("3_4wyf3")] +position = Vector2(-665, 994) + +[node name="Box5" parent="." instance=ExtResource("3_4wyf3")] +position = Vector2(-2443, 123) diff --git a/sidescroller/scenes/world.tscn29144192732.tmp b/sidescroller/scenes/world.tscn29144192732.tmp new file mode 100644 index 0000000..f41045f --- /dev/null +++ b/sidescroller/scenes/world.tscn29144192732.tmp @@ -0,0 +1,74 @@ +[gd_scene load_steps=7 format=3 uid="uid://21dnwl0rfjcd"] + +[ext_resource type="PackedScene" uid="uid://c3w3n7ysd02bd" path="res://scenes/Player.tscn" id="1_go701"] +[ext_resource type="Script" uid="uid://d2jx8gdq5o5d7" path="res://scripts/player.gd" id="2_5a7ea"] +[ext_resource type="PackedScene" uid="uid://bnaknh1h8isk0" path="res://scenes/box.tscn" id="3_4wyf3"] +[ext_resource type="PackedScene" uid="uid://bwakdn8hnjoq4" path="res://scenes/platform.tscn" id="3_71j4m"] +[ext_resource type="PackedScene" uid="uid://b8jkjejwkvr6w" path="res://scenes/large_box.tscn" id="5_qfnet"] +[ext_resource type="PackedScene" uid="uid://ctw5n2m0kj374" path="res://scenes/obstacle.tscn" id="6_qfnet"] + +[node name="World" type="Node2D"] + +[node name="Player" parent="." instance=ExtResource("1_go701")] +position = Vector2(589, 149) +script = ExtResource("2_5a7ea") +speed = 400 +grav = 40 +fallgrav = 60 +jump_force = 800 +fallvelocity_cap = 1500 +max_air_jumps = 1 +sprint_mult = 1.5 +crouch_mult = 0.4 +roll_mult = 1.5 +jump_mult = 1.3 + +[node name="Platform" parent="." instance=ExtResource("3_71j4m")] +position = Vector2(597, 130) + +[node name="Platform2" parent="." instance=ExtResource("3_71j4m")] +position = Vector2(1402, 228) + +[node name="Box" parent="." instance=ExtResource("3_4wyf3")] +position = Vector2(1808, 48) + +[node name="Box2" parent="." instance=ExtResource("3_4wyf3")] +position = Vector2(2498, 122) + +[node name="Box3" parent="." instance=ExtResource("3_4wyf3")] +position = Vector2(-1770, -23) + +[node name="large box" parent="." instance=ExtResource("5_qfnet")] + +[node name="Platform3" parent="." instance=ExtResource("3_71j4m")] +position = Vector2(2117, 130) + +[node name="Platform4" parent="." instance=ExtResource("3_71j4m")] +position = Vector2(3117, 130) + +[node name="Platform5" parent="." instance=ExtResource("3_71j4m")] +position = Vector2(4111, 130) + +[node name="Platform6" parent="." instance=ExtResource("3_71j4m")] +position = Vector2(5099, 130) + +[node name="Obstacle" parent="." instance=ExtResource("6_qfnet")] +position = Vector2(4493, 274) + +[node name="Obstacle2" parent="." instance=ExtResource("6_qfnet")] +position = Vector2(-1124, 274) + +[node name="Obstacle3" parent="." instance=ExtResource("6_qfnet")] +position = Vector2(-1675, 274) + +[node name="Platform7" parent="." instance=ExtResource("3_71j4m")] +position = Vector2(-913, 130) + +[node name="Platform8" parent="." instance=ExtResource("3_71j4m")] +position = Vector2(-1912, 130) + +[node name="Platform9" parent="." instance=ExtResource("3_71j4m")] +position = Vector2(-107, 1004) + +[node name="Box4" parent="." instance=ExtResource("3_4wyf3")] +position = Vector2(-665, 994) diff --git a/sidescroller/scenes/world.tscn29150253813.tmp b/sidescroller/scenes/world.tscn29150253813.tmp new file mode 100644 index 0000000..f41045f --- /dev/null +++ b/sidescroller/scenes/world.tscn29150253813.tmp @@ -0,0 +1,74 @@ +[gd_scene load_steps=7 format=3 uid="uid://21dnwl0rfjcd"] + +[ext_resource type="PackedScene" uid="uid://c3w3n7ysd02bd" path="res://scenes/Player.tscn" id="1_go701"] +[ext_resource type="Script" uid="uid://d2jx8gdq5o5d7" path="res://scripts/player.gd" id="2_5a7ea"] +[ext_resource type="PackedScene" uid="uid://bnaknh1h8isk0" path="res://scenes/box.tscn" id="3_4wyf3"] +[ext_resource type="PackedScene" uid="uid://bwakdn8hnjoq4" path="res://scenes/platform.tscn" id="3_71j4m"] +[ext_resource type="PackedScene" uid="uid://b8jkjejwkvr6w" path="res://scenes/large_box.tscn" id="5_qfnet"] +[ext_resource type="PackedScene" uid="uid://ctw5n2m0kj374" path="res://scenes/obstacle.tscn" id="6_qfnet"] + +[node name="World" type="Node2D"] + +[node name="Player" parent="." instance=ExtResource("1_go701")] +position = Vector2(589, 149) +script = ExtResource("2_5a7ea") +speed = 400 +grav = 40 +fallgrav = 60 +jump_force = 800 +fallvelocity_cap = 1500 +max_air_jumps = 1 +sprint_mult = 1.5 +crouch_mult = 0.4 +roll_mult = 1.5 +jump_mult = 1.3 + +[node name="Platform" parent="." instance=ExtResource("3_71j4m")] +position = Vector2(597, 130) + +[node name="Platform2" parent="." instance=ExtResource("3_71j4m")] +position = Vector2(1402, 228) + +[node name="Box" parent="." instance=ExtResource("3_4wyf3")] +position = Vector2(1808, 48) + +[node name="Box2" parent="." instance=ExtResource("3_4wyf3")] +position = Vector2(2498, 122) + +[node name="Box3" parent="." instance=ExtResource("3_4wyf3")] +position = Vector2(-1770, -23) + +[node name="large box" parent="." instance=ExtResource("5_qfnet")] + +[node name="Platform3" parent="." instance=ExtResource("3_71j4m")] +position = Vector2(2117, 130) + +[node name="Platform4" parent="." instance=ExtResource("3_71j4m")] +position = Vector2(3117, 130) + +[node name="Platform5" parent="." instance=ExtResource("3_71j4m")] +position = Vector2(4111, 130) + +[node name="Platform6" parent="." instance=ExtResource("3_71j4m")] +position = Vector2(5099, 130) + +[node name="Obstacle" parent="." instance=ExtResource("6_qfnet")] +position = Vector2(4493, 274) + +[node name="Obstacle2" parent="." instance=ExtResource("6_qfnet")] +position = Vector2(-1124, 274) + +[node name="Obstacle3" parent="." instance=ExtResource("6_qfnet")] +position = Vector2(-1675, 274) + +[node name="Platform7" parent="." instance=ExtResource("3_71j4m")] +position = Vector2(-913, 130) + +[node name="Platform8" parent="." instance=ExtResource("3_71j4m")] +position = Vector2(-1912, 130) + +[node name="Platform9" parent="." instance=ExtResource("3_71j4m")] +position = Vector2(-107, 1004) + +[node name="Box4" parent="." instance=ExtResource("3_4wyf3")] +position = Vector2(-665, 994) diff --git a/sidescroller/scenes/world.tscn3795407388.tmp b/sidescroller/scenes/world.tscn3795407388.tmp new file mode 100644 index 0000000..dee8be9 --- /dev/null +++ b/sidescroller/scenes/world.tscn3795407388.tmp @@ -0,0 +1,74 @@ +[gd_scene load_steps=7 format=3 uid="uid://21dnwl0rfjcd"] + +[ext_resource type="PackedScene" uid="uid://c3w3n7ysd02bd" path="res://scenes/Player.tscn" id="1_go701"] +[ext_resource type="Script" uid="uid://d2jx8gdq5o5d7" path="res://scripts/player.gd" id="2_5a7ea"] +[ext_resource type="PackedScene" uid="uid://bnaknh1h8isk0" path="res://scenes/box.tscn" id="3_4wyf3"] +[ext_resource type="PackedScene" uid="uid://bwakdn8hnjoq4" path="res://scenes/platform.tscn" id="3_71j4m"] +[ext_resource type="PackedScene" uid="uid://b8jkjejwkvr6w" path="res://scenes/large_box.tscn" id="5_qfnet"] +[ext_resource type="PackedScene" uid="uid://ctw5n2m0kj374" path="res://scenes/obstacle.tscn" id="6_qfnet"] + +[node name="World" type="Node2D"] + +[node name="Player" parent="." instance=ExtResource("1_go701")] +position = Vector2(589, 149) +script = ExtResource("2_5a7ea") +speed = 400 +grav = 40 +fallgrav = 60 +jump_force = 800 +fallvelocity_cap = 1500 +max_air_jumps = 1 +sprint_mult = 1.5 +crouch_mult = 0.4 +roll_mult = 1.5 +jump_mult = 1.3 + +[node name="Platform" parent="." instance=ExtResource("3_71j4m")] +position = Vector2(597, 130) + +[node name="Platform2" parent="." instance=ExtResource("3_71j4m")] +position = Vector2(1402, 228) + +[node name="Box" parent="." instance=ExtResource("3_4wyf3")] +position = Vector2(1808, 48) + +[node name="Box2" parent="." instance=ExtResource("3_4wyf3")] +position = Vector2(2498, 122) + +[node name="Box3" parent="." instance=ExtResource("3_4wyf3")] +position = Vector2(-1771, -25) + +[node name="large box" parent="." instance=ExtResource("5_qfnet")] + +[node name="Platform3" parent="." instance=ExtResource("3_71j4m")] +position = Vector2(2117, 130) + +[node name="Platform4" parent="." instance=ExtResource("3_71j4m")] +position = Vector2(3117, 130) + +[node name="Platform5" parent="." instance=ExtResource("3_71j4m")] +position = Vector2(4111, 130) + +[node name="Platform6" parent="." instance=ExtResource("3_71j4m")] +position = Vector2(5099, 130) + +[node name="Obstacle" parent="." instance=ExtResource("6_qfnet")] +position = Vector2(4493, 274) + +[node name="Obstacle2" parent="." instance=ExtResource("6_qfnet")] +position = Vector2(-1124, 274) + +[node name="Obstacle3" parent="." instance=ExtResource("6_qfnet")] +position = Vector2(-1675, 274) + +[node name="Platform7" parent="." instance=ExtResource("3_71j4m")] +position = Vector2(-913, 130) + +[node name="Platform8" parent="." instance=ExtResource("3_71j4m")] +position = Vector2(-1912, 130) + +[node name="Platform9" parent="." instance=ExtResource("3_71j4m")] +position = Vector2(-107, 1004) + +[node name="Box4" parent="." instance=ExtResource("3_4wyf3")] +position = Vector2(-665, 994) diff --git a/sidescroller/scripts/obstacle.gd b/sidescroller/scripts/obstacle.gd new file mode 100644 index 0000000..1bf3f73 --- /dev/null +++ b/sidescroller/scripts/obstacle.gd @@ -0,0 +1,19 @@ +extends StaticBody2D + +func _ready(): + var player = get_tree().get_first_node_in_group("player") + + $triggerzone_left.connect("body_entered", Callable(self, "_on_trigger_entered").bind("triggerzone_left", player)) + $triggerzone_left.connect("body_exited", Callable(self, "_on_trigger_exited").bind("triggerzone_left", player)) + + $triggerzone_right.connect("body_entered", Callable(self, "_on_trigger_entered").bind("triggerzone_right", player)) + $triggerzone_right.connect("body_exited", Callable(self, "_on_trigger_exited").bind("triggerzone_right", player)) + + +func _on_trigger_entered(body: Node, trigger_name: String, player: Node): + if body.is_in_group("player"): + player._on_vault_trigger_entered(trigger_name) + +func _on_trigger_exited(body: Node, trigger_name: String, player: Node): + if body.is_in_group("player"): + player._on_vault_trigger_exited(trigger_name) diff --git a/sidescroller/scripts/obstacle.gd.uid b/sidescroller/scripts/obstacle.gd.uid new file mode 100644 index 0000000..246def4 --- /dev/null +++ b/sidescroller/scripts/obstacle.gd.uid @@ -0,0 +1 @@ +uid://b8ewx8kbbdns1 diff --git a/sidescroller/scripts/player.gd b/sidescroller/scripts/player.gd index 488aeca..581ec87 100644 --- a/sidescroller/scripts/player.gd +++ b/sidescroller/scripts/player.gd @@ -1,17 +1,34 @@ extends CharacterBody2D -@export var speed = 350 +#Rootmotion +var rootmotion_prev := Vector2.ZERO +@onready var RootMotion := $RootMotion +@onready var mainbody := $mainbody + +@export var speed = 400 #350 init @export var grav = 40 +@export var fallgrav = 60 #gravity only applied when falling @export var jump_force = 800 -@export var fallvelocity_cap = 1000 # How fast the player can get when falling +@export var fallvelocity_cap = 1500 # How fast the player can get when falling @export var max_air_jumps = 1 # Number of total jumps allowed (1 = normal, 2 = double jump) +var jumps_done = 0 +var air_jumps_done = 0 + +var coyote_timer = 0.0 +var coyote_time = 0.2 +var jump_buffered := false +var jump_buffer_timer = 0.0 +var jump_buffer_time = 0.2 + var input_direction = 0 var direction_locked = false var facing_direction = 1 # 1 = right, -1 = left @export var sprint_mult = 1.5 @export var crouch_mult = 0.4 +@export var roll_mult = 1.5 +@export var jump_mult = 1.3 @onready var ap = $AnimationPlayer @onready var sprite = $Sprite2D @@ -33,46 +50,72 @@ var horizontal_direction = 0 var v_mult = 1 #velocity multiplier var v_push = 0 #velocity push in either direction -var air_jumps_done = 0 - var stuck_under_object = false +#wallrun and pushoff var wallrun_available := true var wallrun_timer := 0.0 #:= bedeutet, dass der Typ fest festgelegt ist (z.B int, bool etc.) -var wallrun_time := 1 # Dauer des Wallruns in Sekunden -var wallrun_speed := -250.0 # Geschwindigkeit nach oben (negativ wegen y-Achse) +var wallrun_time := 0.7 # Dauer des Wallruns in Sekunden +var wallrun_speed := -400.0 # Geschwindigkeit nach oben (negativ wegen y-Achse) var wallpushoff_force := 450 # Stärke des Abstoßens var wallpushoff_mult := 0.3 # schränkt die velocity.x Kontrolle des Spielers ein. var wallpushoff_timer := 0.0 var wallpushoff_time := 0.5 # dauer des pushoffs -var climbup_pos1 = Vector2(0, 0) -var climbup_pos2 = Vector2(0, 0) -var climbup_pos1_reached = false +#dash +var dash_available := false +var dash_timer := 0.0 +var dash_time := 0.2 +var dash_mult := 2 + +#climbup var climbup_speed_y = 100 var climbup_speed_x = 500 +#obstacle vault +var can_vault := false +var vault_direction := Vector2.ZERO +var vault_mult := 1.3 + +#fallroll +var fallroll_timer := 0.0 +var fallroll_input_timer := 0.0 +var fallroll_time := 0.5 #time till you need to fallroll +var fallroll_input_time := 0.5 #timewindow in which the fallroll works +var fallrolling := false +var can_fallroll := true +var fallroll_mult := 0.8 #velocity mult of fallroll differs from roll +var land_delay_timer := 0.0 +var land_delay_time := 0.1 #time in which player will stay in falling state after hitting the ground + func _process(delta): #turnmovement() pass func _physics_process(delta): + + #print("jump buffered: ", jump_buffered) + #move_and_collide() move_and_slide() - input_direction = Input.get_axis("move_left", "move_right") + if !direction_locked: + input_direction = Input.get_axis("move_left", "move_right") + else: + input_direction = facing_direction #print(statemachine.current_state.get_state_name()) # zum debuggen aktivieren - if statemachine.current_state.get_state_name() not in ["PlayerWallrun", "PlayerClimbUp"]: - gravity() + if statemachine.current_state.get_state_name() not in ["PlayerClimbUp", "PlayerVault", "PlayerDash"]: + gravity(delta) if statemachine.current_state.get_state_name() not in ["PlayerWallrun", "PlayerWallrunPushoff", "PlayerLedgeGrab", "PlayerClimbUp"]: turnmovement() - $ledgecollision.disabled = statemachine.current_state.get_state_name() in ["PlayerIdle", "PlayerRun", "PlayerCrouch", "PlayerCrouchWalk", "PlayerJump", "PlayerWallrun", "PlayerClimbUp"] or velocity.y < 0 or Input.is_action_pressed("crouch") or(topcheck1.is_colliding() and topcheck2.is_colliding() and statemachine.current_state.get_state_name() != "PlayerLedgeGrab") + $ledgecollision.disabled = statemachine.current_state.get_state_name() in ["PlayerIdle", "PlayerRun", "PlayerCrouch", "PlayerCrouchWalk", "PlayerJump", "PlayerWallrun", "PlayerClimbUp", "PlayerRoll", "PlayerVault"] or velocity.y < 0 or Input.is_action_pressed("crouch") or(topcheck1.is_colliding() and topcheck2.is_colliding() and statemachine.current_state.get_state_name() != "PlayerLedgeGrab") + $mainbody.disabled = statemachine.current_state.get_state_name() in ["PlayerClimbUp"] func movement(): velocity.x = speed * input_direction * v_mult + v_push @@ -96,13 +139,7 @@ func set_facing_direction(dir: int): #manual flip if dir in [-1, 1] and dir != facing_direction: switch_direction(dir) -func lock_direction(): - direction_locked = true - -func unlock_direction(): - direction_locked = false - -func gravity(): +func gravity(delta): velocity.y += grav if velocity.y > fallvelocity_cap: velocity.y = fallvelocity_cap @@ -118,6 +155,42 @@ func wall_detected_left() -> bool: func wall_detected_right() -> bool: var result = wallrun_raycast_right1.is_colliding() && wallrun_raycast_right2.is_colliding() return result + +func _on_vault_trigger_entered(trigger_name: String) -> void: + print("vault trigger entered:", trigger_name) + can_vault = true + if trigger_name == "triggerzone_left": + vault_direction = Vector2.RIGHT + elif trigger_name == "triggerzone_right": + vault_direction = Vector2.LEFT + else: + vault_direction = Vector2.ZERO + +func _on_vault_trigger_exited(trigger_name: String) -> void: + print("vault trigger exited:", trigger_name) + can_vault = false + vault_direction = Vector2.ZERO + +func is_facing_vault_direction() -> bool: + var input_dir := Input.get_action_strength("move_right") - Input.get_action_strength("move_left") + + # only allow vault if input matches vault_direction + if vault_direction == Vector2.RIGHT and input_dir > 0: + return true + elif vault_direction == Vector2.LEFT and input_dir < 0: + return true + return false + +func jumpbuffer(delta): + + if Input.is_action_just_pressed("jump"): + jump_buffered = true + jump_buffer_timer = 0.0 + + if jump_buffered: + jump_buffer_timer += delta + if jump_buffer_timer >= jump_buffer_time: + jump_buffered = false # transition functions @@ -128,9 +201,13 @@ func transitionidle() -> bool: func transitionrun() -> bool: var result = Input.get_axis("move_left", "move_right") != 0 && is_on_floor() return result - + +func transitioncoyotejump() -> bool: + var result = coyote_time >= coyote_timer and Input.is_action_just_pressed("jump") and (jumps_done == 0) + return result + func transitionjump() -> bool: - var result = Input.is_action_just_pressed("jump") && is_on_floor() + var result = (Input.is_action_just_pressed("jump") or jump_buffered) and is_on_floor() return result func transitiondoublejump() -> bool: @@ -157,3 +234,13 @@ func transitionwallrun() -> bool: var result = Input.is_action_just_pressed("jump") and ((Input.is_action_pressed("move_right") && wall_detected_right()) or (Input.is_action_pressed("move_left") && wall_detected_left())) and wallrun_available return result +func transitionroll() -> bool: + var result = Input.is_action_just_pressed("sprint") and is_on_floor() + return result + +#func transitionfallroll() -> bool: +#func transitionhardlanding() -> bool: + +func transitiondash() -> bool: + var result = Input.is_action_just_pressed("sprint") and !is_on_floor() and dash_available and fallroll_timer < fallroll_time + return result diff --git a/sidescroller/scripts/playeraccelerationdeceleration.gd b/sidescroller/scripts/playeraccelerationdeceleration.gd deleted file mode 100644 index 83fe2d7..0000000 --- a/sidescroller/scripts/playeraccelerationdeceleration.gd +++ /dev/null @@ -1,18 +0,0 @@ -extends State -class_name AccelDecel - -@export var acceleration = 2000 -@export var deceleration = 1500 - -func movement(velocity_x, speed, input_direction, v_mult, v_push, delta): - var target_speed = speed * input_direction * v_mult + v_push - if input_direction != 0: - return move_toward(velocity_x, target_speed, acceleration * delta) - return move_toward(velocity_x, 0, deceleration * delta) - -func turnmovement(velocity_x, speed, input_direction, v_mult, v_push, delta, direction_locked, facing_direction): - var vx = movement(velocity_x, speed, input_direction, v_mult, v_push, delta) - var fd = facing_direction - if not direction_locked and input_direction != 0 and sign(input_direction) != facing_direction: - fd = sign(input_direction) - return [vx, fd] diff --git a/sidescroller/scripts/playeraccelerationdeceleration.gd.uid b/sidescroller/scripts/playeraccelerationdeceleration.gd.uid deleted file mode 100644 index c114dce..0000000 --- a/sidescroller/scripts/playeraccelerationdeceleration.gd.uid +++ /dev/null @@ -1 +0,0 @@ -uid://cst40h14xfhjk diff --git a/sidescroller/scripts/playerclimbup.gd b/sidescroller/scripts/playerclimbup.gd index 2d45e2d..2c2d194 100644 --- a/sidescroller/scripts/playerclimbup.gd +++ b/sidescroller/scripts/playerclimbup.gd @@ -9,38 +9,57 @@ var standing_cshape = preload("res://resources/player standing cshape.tres") func enter(): - player.climbup_pos1 = player.position + Vector2(0, -52) - player.climbup_pos2 = player.position + Vector2(player.facing_direction * 40, -52) - - print(player.position) - print (player.climbup_pos1) - player.ap.play("climb up") + player.ap.playback_process_mode = AnimationPlayer.ANIMATION_PROCESS_MANUAL #rootmotion + var root_node := player.get_node("RootMotion") #rootmotion + + player.rootmotion_prev = root_node.position #rootmotion + player.sprite.position.x = player.facing_direction * 11 player.sprite.position.y = -60 player.cshape.shape = ledge_cshape player.cshape.position.y = -69 + player.z_index = 10 + func exit(): - player.cshape.shape = standing_cshape - player.cshape.position.y = -43 + player.ap.playback_process_mode = AnimationPlayer.ANIMATION_PROCESS_IDLE #rootmotion + player.RootMotion.position = Vector2(11, -60) #rootmotion + player.rootmotion_prev = Vector2(11, -60) #rootmotion player.sprite.position.x = 0 player.sprite.position.y = -48 - player.climbup_pos1_reached = false + player.cshape.shape = standing_cshape + player.cshape.position.y = -43 + player.z_index = 0 + func update(delta): pass func physics_update(delta): - if player.position != player.climbup_pos1 && !player.climbup_pos1_reached: - player.position = player.position.move_toward(player.climbup_pos1, player.climbup_speed_y * delta) - if player.position == player.climbup_pos1: - player.climbup_pos1_reached = true - elif player.position != player.climbup_pos2 && player.climbup_pos1_reached: - player.position = player.position.move_toward(player.climbup_pos2, player.climbup_speed_x * delta) - elif player.position == player.climbup_pos2: - Transitioned.emit(self, "PlayerFall") + player.jumpbuffer(delta) + + player.ap.advance(delta) + + var current_root_pos = player.RootMotion.position #rootmotion + var root_delta = current_root_pos - player.rootmotion_prev #rootmotion + + player.position += Vector2(root_delta.x * player.facing_direction, root_delta.y) + player.rootmotion_prev = current_root_pos #rootmotion + + if not player.ap.is_playing(): + Transitioned.emit(self, "PlayerFall") + + #ursprüngliches manuelles bewegen des players während dem Climb up: + #if player.position != player.climbup_pos1 && !player.climbup_pos1_reached: + #player.position = player.position.move_toward(player.climbup_pos1, player.climbup_speed_y * delta) + #if player.position == player.climbup_pos1: + #player.climbup_pos1_reached = true + #elif player.position != player.climbup_pos2 && player.climbup_pos1_reached: + #player.position = player.position.move_toward(player.climbup_pos2, player.climbup_speed_x * delta) + #elif player.position == player.climbup_pos2: + #Transitioned.emit(self, "PlayerFall") diff --git a/sidescroller/scripts/playercrouch.gd b/sidescroller/scripts/playercrouch.gd index 8cf90c6..c3ea6c3 100644 --- a/sidescroller/scripts/playercrouch.gd +++ b/sidescroller/scripts/playercrouch.gd @@ -13,7 +13,7 @@ func enter(): func exit(): player.cshape.shape = standing_cshape - player.cshape.position.y = -44 + player.cshape.position.y = -43 func update(delta): diff --git a/sidescroller/scripts/playerdash.gd b/sidescroller/scripts/playerdash.gd new file mode 100644 index 0000000..e3a83f4 --- /dev/null +++ b/sidescroller/scripts/playerdash.gd @@ -0,0 +1,25 @@ +extends State +class_name PlayerDash + +func get_state_name(): + return str(self).split(":")[0] + +func enter(): + player.dash_available = false + player.direction_locked = true + player.v_mult = player.dash_mult + player.velocity.y = 0 + +func exit(): + player.direction_locked = false + player.v_mult = 1 + player.dash_timer = 0 + +func update(delta): + pass + +func physics_update(delta): + player.dash_timer += delta + + if player.dash_timer >= player.dash_time: + Transitioned.emit(self, "PlayerFall") diff --git a/sidescroller/scripts/playerdash.gd.uid b/sidescroller/scripts/playerdash.gd.uid new file mode 100644 index 0000000..33f1fab --- /dev/null +++ b/sidescroller/scripts/playerdash.gd.uid @@ -0,0 +1 @@ +uid://qf4kjhw6b8ip diff --git a/sidescroller/scripts/playerdoublejump.gd b/sidescroller/scripts/playerdoublejump.gd index a101e7e..830f7f9 100644 --- a/sidescroller/scripts/playerdoublejump.gd +++ b/sidescroller/scripts/playerdoublejump.gd @@ -19,6 +19,8 @@ func update(delta): Transitioned.emit(self, "PlayerDoubleJump") elif player.is_on_floor() && player.velocity.x != 0: Transitioned.emit(self, "PlayerRun") + elif player.transitiondash(): + Transitioned.emit(self, "PlayerDash") elif player.is_on_floor(): Transitioned.emit(self, "PlayerIdle") diff --git a/sidescroller/scripts/playerfall.gd b/sidescroller/scripts/playerfall.gd index 83412b1..d55a199 100644 --- a/sidescroller/scripts/playerfall.gd +++ b/sidescroller/scripts/playerfall.gd @@ -1,30 +1,65 @@ extends State class_name PlayerFall +var initgrav = 0 + func get_state_name(): return str(self).split(":")[0] func enter(): - pass + initgrav = player.grav + player.grav = player.fallgrav func exit(): - pass + player.grav = initgrav + player.fallroll_timer = 0.0 + player.fallroll_input_timer = 0.0 + player.land_delay_timer = 0.0 + player.can_fallroll = true + player.fallrolling = false + player.jump_buffered = false func update(delta): player.ap.play("fall") + player.coyote_timer += delta + + fallrollcheck(delta) + + player.jumpbuffer(delta) + if player.transitionledgegrab(): Transitioned.emit(self, "PlayerLedgeGrab") - elif player.transitiondoublejump(): - Transitioned.emit(self, "PlayerDoubleJump") - elif player.transitionidle(): - Transitioned.emit(self, "PlayerIdle") - elif player.transitionrun(): - Transitioned.emit(self, "PlayerRun") - - player.gravity() + + if player.fallroll_timer <= player.fallroll_time or player.land_delay_timer >= player.land_delay_time: + if player.transitioncoyotejump() or player.transitionjump(): + Transitioned.emit(self, "PlayerJump") + elif player.transitiondoublejump(): + Transitioned.emit(self, "PlayerDoubleJump") + elif player.is_on_floor() and player.fallroll_timer >= player.fallroll_time and player.fallrolling: + print("fallroll") + Transitioned.emit(self, "PlayerFallRoll") #ersetzen durch state: PlayerFallRoll + elif player.transitionidle(): + Transitioned.emit(self, "PlayerIdle") + elif player.transitionrun(): + Transitioned.emit(self, "PlayerRun") + #elif player.transitiondash(): + #Transitioned.emit(self, "PlayerDash") func physics_update(delta): pass - #player.turnmovement() + +func fallrollcheck(delta): + player.fallroll_timer += delta + + if Input.is_action_just_pressed("sprint") and player.can_fallroll: + player.fallrolling = true + player.can_fallroll = false + if player.fallrolling == true: + player.fallroll_input_timer += delta + if player.fallroll_input_timer >= player.fallroll_input_time: + player.fallrolling = false + + if player.is_on_floor(): + player.land_delay_timer += delta diff --git a/sidescroller/scripts/playerfallroll.gd b/sidescroller/scripts/playerfallroll.gd new file mode 100644 index 0000000..0b37663 --- /dev/null +++ b/sidescroller/scripts/playerfallroll.gd @@ -0,0 +1,29 @@ +extends State +class_name PlayerFallRoll + +var crouching_cshape = preload("res://resources/player crouching cshape.tres") +var standing_cshape = preload("res://resources/player standing cshape.tres") + +func get_state_name(): + return str(self).split(":")[0] + +func enter(): + player.ap.play("roll") + player.direction_locked = true + + player.cshape.shape = crouching_cshape + player.cshape.position.y = -31 + player.v_mult = player.fallroll_mult + +func exit(): + player.cshape.shape = standing_cshape + player.cshape.position.y = -44 + player.v_mult = 1 + player.direction_locked = false + +func update(delta): + pass + +func physics_update(delta): + if not player.ap.is_playing(): + Transitioned.emit(self, "PlayerCrouch") diff --git a/sidescroller/scripts/playerfallroll.gd.uid b/sidescroller/scripts/playerfallroll.gd.uid new file mode 100644 index 0000000..373c7f2 --- /dev/null +++ b/sidescroller/scripts/playerfallroll.gd.uid @@ -0,0 +1 @@ +uid://bjln8dh5ajphf diff --git a/sidescroller/scripts/playeridle.gd b/sidescroller/scripts/playeridle.gd index a395c83..865dddf 100644 --- a/sidescroller/scripts/playeridle.gd +++ b/sidescroller/scripts/playeridle.gd @@ -6,7 +6,10 @@ func get_state_name(): func enter(): player.air_jumps_done = 0 + player.jumps_done = 0 + player.coyote_timer = 0.0 player.wallrun_available = true + player.dash_available = true func exit(): pass @@ -24,4 +27,4 @@ func update(delta): Transitioned.emit(self, "PlayerJump") func physics_update(delta): - player.gravity() + player.gravity(delta) diff --git a/sidescroller/scripts/playerjump.gd b/sidescroller/scripts/playerjump.gd index b81a03c..536c2fa 100644 --- a/sidescroller/scripts/playerjump.gd +++ b/sidescroller/scripts/playerjump.gd @@ -7,12 +7,20 @@ func get_state_name(): func enter(): player.ap.play("jump") player.velocity.y = -player.jump_force + player.jumps_done += 1 + player.v_mult = player.jump_mult + func exit(): - pass + player.v_mult = 1 + func update(delta): + player.jumpbuffer(delta) + if player.transitionledgegrab(): Transitioned.emit(self, "PlayerLedgeGrab") + elif player.transitiondash(): + Transitioned.emit(self, "PlayerDash") elif player.transitionfall(): Transitioned.emit(self, "PlayerFall") elif !player.is_on_floor() and Input.is_action_just_pressed("jump") and (player.air_jumps_done < player.max_air_jumps): diff --git a/sidescroller/scripts/playerroll.gd b/sidescroller/scripts/playerroll.gd new file mode 100644 index 0000000..c293c27 --- /dev/null +++ b/sidescroller/scripts/playerroll.gd @@ -0,0 +1,29 @@ +extends State +class_name PlayerRoll + +var crouching_cshape = preload("res://resources/player crouching cshape.tres") +var standing_cshape = preload("res://resources/player standing cshape.tres") + +func get_state_name(): + return str(self).split(":")[0] + +func enter(): + player.ap.play("roll") + player.direction_locked = true + + player.cshape.shape = crouching_cshape + player.cshape.position.y = -31 + player.v_mult = player.roll_mult + +func exit(): + player.cshape.shape = standing_cshape + player.cshape.position.y = -44 + player.v_mult = 1 + player.direction_locked = false + +func update(delta): + pass + +func physics_update(delta): + if not player.ap.is_playing(): + Transitioned.emit(self, "PlayerCrouch") diff --git a/sidescroller/scripts/playerroll.gd.uid b/sidescroller/scripts/playerroll.gd.uid new file mode 100644 index 0000000..87e10bb --- /dev/null +++ b/sidescroller/scripts/playerroll.gd.uid @@ -0,0 +1 @@ +uid://clru46wbu1bi1 diff --git a/sidescroller/scripts/playerrun.gd b/sidescroller/scripts/playerrun.gd index cc4ddb0..5beac8e 100644 --- a/sidescroller/scripts/playerrun.gd +++ b/sidescroller/scripts/playerrun.gd @@ -6,7 +6,10 @@ func get_state_name(): func enter(): player.air_jumps_done = 0 + player.jumps_done = 0 + player.coyote_timer = 0.0 player.wallrun_available = true + player.dash_available = true player.v_mult = 1 func exit(): pass @@ -15,10 +18,15 @@ func update(delta): if player.transitionidle(): Transitioned.emit(self, "PlayerIdle") + elif player.transitionroll(): + Transitioned.emit(self, "PlayerRoll") elif player.transitioncrouch(): Transitioned.emit(self, "PlayerCrouchwalk") elif player.transitionwallrun(): Transitioned.emit(self, "PlayerWallrun") + elif Input.is_action_just_pressed("jump") and player.can_vault and player.is_facing_vault_direction(): + Transitioned.emit(self, "PlayerVault") + Transitioned.emit(self, "PlayerVault") elif player.transitionjump(): Transitioned.emit(self, "PlayerJump") elif player.transitionfall(): diff --git a/sidescroller/scripts/playervault.gd b/sidescroller/scripts/playervault.gd new file mode 100644 index 0000000..5f62e3a --- /dev/null +++ b/sidescroller/scripts/playervault.gd @@ -0,0 +1,58 @@ +extends State +class_name PlayerVault + +var crouching_cshape = preload("res://resources/player crouching cshape.tres") +var standing_cshape = preload("res://resources/player standing cshape.tres") + +func get_state_name(): + return str(self).split(":")[0] + +func enter(): + player.direction_locked = true + #player.cshape.shape = crouching_cshape + #player.cshape.position.y = -74 + + player.ap.play("reverse vault") + + player.v_mult = player.vault_mult + + player.ap.playback_process_mode = AnimationPlayer.ANIMATION_PROCESS_MANUAL #rootmotion + var root_node := player.get_node("RootMotion") #rootmotion + + player.rootmotion_prev = root_node.position #rootmotion + + #player.z_index = 10 +func exit(): + player.direction_locked = false + player.cshape.shape = standing_cshape + player.cshape.position.y = -43 + player.sprite.position.y = -48 + + player.v_mult = 1 + + player.ap.playback_process_mode = AnimationPlayer.ANIMATION_PROCESS_IDLE #rootmotion + player.RootMotion.position = Vector2(11, -60) #rootmotion + player.rootmotion_prev = Vector2(11, -60) #rootmotion + + #player.z_index = 0 +func update(delta): + + if player.wallcheckleft.is_colliding() or player.wallcheckright.is_colliding(): + player.cshape.shape = crouching_cshape + player.cshape.position.y = -66 + player.sprite.position.y = -42 + else: + player.cshape.shape = standing_cshape + player.cshape.position.y = -30 + player.sprite.position.y = -44 + + player.ap.advance(delta) + + var current_root_pos = player.RootMotion.position #rootmotion + var root_delta = current_root_pos - player.rootmotion_prev #rootmotion + + player.position += Vector2(root_delta.x * player.facing_direction, root_delta.y) + player.rootmotion_prev = current_root_pos #rootmotion +func physics_update(delta): + if not player.ap.is_playing(): + Transitioned.emit(self, "PlayerFall") diff --git a/sidescroller/scripts/playervault.gd.uid b/sidescroller/scripts/playervault.gd.uid new file mode 100644 index 0000000..384d20e --- /dev/null +++ b/sidescroller/scripts/playervault.gd.uid @@ -0,0 +1 @@ +uid://dq3g3qck2e0wv diff --git a/sidescroller/scripts/playerwallrun.gd b/sidescroller/scripts/playerwallrun.gd index 827d81b..4136a8e 100644 --- a/sidescroller/scripts/playerwallrun.gd +++ b/sidescroller/scripts/playerwallrun.gd @@ -9,8 +9,13 @@ func enter(): player.velocity.x = 2000 * player.facing_direction # An Wand haften + player.ap.play("wallrun") + player.sprite.position.x = player.facing_direction * -10 + func exit(): player.wallrun_timer = 0.0 + player.sprite.position.x = 0 + player.velocity.y = 0 func update(delta): pass @@ -21,7 +26,7 @@ func physics_update(delta): if player.facing_direction > 0 && !player.wallrun_raycast_right2.is_colliding(): Transitioned.emit(self, "PlayerFall") - if player.facing_direction < 1 && !player.wallrun_raycast_left2.is_colliding(): + elif player.facing_direction < 1 && !player.wallrun_raycast_left2.is_colliding(): Transitioned.emit(self, "PlayerFall") elif player.wallrun_timer >= player.wallrun_time: Transitioned.emit(self, "PlayerWallrunPushoff")