From 2019e8f3106c5929f041067ecf57f15f2d77f836 Mon Sep 17 00:00:00 2001 From: Sergio Valor Date: Wed, 8 Apr 2026 08:23:08 +0200 Subject: [PATCH] turn and jump --- data/player/player.gif | Bin 672 -> 828 bytes data/player/player.yaml | 23 +++++++++++++++++++---- data/sound/jump.wav | Bin 9814 -> 7161 bytes source/game/entities/player.cpp | 24 +++++++++++++++++++++--- source/game/entities/player.hpp | 2 ++ 5 files changed, 42 insertions(+), 7 deletions(-) diff --git a/data/player/player.gif b/data/player/player.gif index 5ec8ae3737b0ff6a6ac009eed52d3bff0849ce66..0b80dbb64fe6e49d0c3c847df165dc43036174ef 100644 GIT binary patch delta 611 zcmV-p0-XJz1-u3aM@dFFH(^wf2j+iN02lxO2LC{S5Kt%(hr@zFSu7%n%VjeeZ5okG zsZ*G>Vyn|{aVgdsuTbXn40fWs>$LeO_r8}tA5)z7J-K*!PfUG(X@z`(gMog31qhG` zXorx9fCWC4iiDbtmzfBNoS}-8q@F~N0SEzGT$rquubBasMYOW1xTUwTrMiE3`Pm;X?3F^z*2{ z_Cxj_#2y}o{`mv=q+gGJ0SzJ?^6$ex4-OFtJV+49!;2L$J}js)V@Hk}hxqFgqL`qL z08gSMh|yt104o_@bP4jI!+n2wOol*o&?Q9w4}~6v7#dp2D+upDc*TJJ zazWTd3&Zu2`G^}hZ?Soe1zY9o2ixMm-sBE0Y}myU&WBqh_Q9EM9?pMA`fw(k`gCDK zio=0Mvih*0)t*12*1h^qZ{NR#;6@CbuxKQQYa2A~B8M@dFFH(@-H2j+h~02lxO2LC_+pkN>tjs>C8SVS(1&7)GtL?)?F z>(l7G4zt}aSL&^X&E&0bJyo-(#s9n=jiF;-R;!n?DWd> z9_@GBA^yqrmVNLS;#|LfJ-+E9cu$#}5IycZBdF(DJBAVGO!Vi=8o`9c)?^IfXH7Rf za>m^;$qiUU50OHd9QJYl1^@igmgv;gFu*MkcF?}!}tbv zI!(H&tM08%_&C_`82X zE;aYpb#6GUnMsLrbvN^q*3GbW@k#3vT-|Aew)ZSt+YM_*7_w)pM+mYCceFj$l!u91 zhP0ex4W{b0#G2xeJ=cO5V}(9*t_i;)({wx8sT`&%!yaE6_L!#e&h%l(DpOQOPxnRX z!WCtt5VvPuQlImrS($#biF$f>gtGK(W?v>PcMhXTBZt;Z@Rk>8%bE0Kx@TJUsU=Mm zJ1O%<9_O3X(ND-1_fGyPBIlvM zg_;p_o^}up&yB%Z=wE+3O7`=Rd??%Z=TR;z;s2+=j7 ze)5-3k8w1k)I-LNl)PdlhCW7 z4bEK@@OoL#Ii{dD@n#F>&hd6|_m!u6hOl{yPHhnD_xp8fxRVu%?aBa~8vLZ=g-#zx z^OiUL21q{yhSxe+89$yN_Kogv`F#LNowU7~{73p2Vao~6Xrojw9u4~^Vtt~NA4&+c zjvy_;_SYGhIXc>4Qmd3hM3D;I1Z57hoPuY`WHNhza3>L{p^S=qxq{&-EY;KC_Ogjv{+5IlScWwg%=1hnGUrw&(vC(%y(d%eTEtD@r2ms@)NaMp6Vd z(gz>XWKRd_ZU<1L0-XTA(@~odXhVt-0u~IkHGwUN(*h{C(R?lgzg5#naBMXJj<-o0 zDFeS*F{;C5wE?i?Kmq8D-Hgnx1IWpK73j`3?`Hu!bwD00G#`OouW1}Gwsrv)SY&f7 zz}~H}1{zjt0adhNZ*~H^=C$XIQ~}Cp4we?Mt3^?->;$NSgbL)HiX<0Gl>l3`%Yj@` x+Y&aQB*_+#ZAso%wi;m-1xh1TsgmFpJ-IwYmVI$>u_PYcl8fXHoDt*5{{evt)H(nF literal 9814 zcmb`L$#Ub!5r#E4AN>eE`QW#3ggp_y_~3)*FltHELQ>p!5(Eg4;J&LxN?b&(?V}&k zSwK|*$V|1Yp7|Bhp}xwsvH(*5`p3^d|MSmBN5A~_-+zy1D}Vaq(b3UQ@bkC-9(lh% z9sS|xGFFNG1@=sK&u`!UgZ0o%#=ac?N_1Skd3d4wxAnvsxBaBGeti8#+%HR)r`-0$ zXv-w?WT#>$$26HQ#_fSR|2E0<&ePM~Co<<#d9TjT?dCICmae#_@Ew13)8|}IVx7Au z+7mx*(!tNUX0v`9WG}cp*oOQro7ptp84-R$)|EI6E9nNC@;i>%xqfHzpvwn3c<-Ec zVa{By-@ez&0pG)K;_T=(WNUk;59#Timd0N|e=^Z?h96A!*beYSqLaoJ_RKyo*sZ)* zHUU0Ywk*E`c*3}5@u~VpfO^F{EiCB3@R@S+&6j`K-;l>JpD4GJ_sK=)^W-X;de3y! z&=Xs{T%uj#)8snOx{P)1pYYp_%@QVr#AXW@Q->eOGRbH;+(y$F0?5+nRIf^kJFgr0iWBpgs&y696~H7kgBoFwtoc=q7IRKXwI~*(2>c)NPn1=Nho?2v7L&M;KqNj|z z_9HuR6q*Oll-7c)CH)X>4}TP8zWJuS_5PcN^MK02Ap zn1H@=lkKBmo}S#?)%lr*snPx8vx1VHNdY@NzeoX#pT`tBO9OjS@DbQWOvBt{6R-y- zE0|JwCYaRL%3NKXD|Bw&>;g8gTwew(?ymNaPtx$QUrYj1%1`befce^3*?7P%%;ol= z*}R&%3fOgTwL3gYxN~xes|&6AeDeUz7np%dr4*QHwsZ2yt4jqh&BbPaIQWK#aXA$S zCRG@(!Axq^%qFiiOZRTKd&TaoTr#d%!d`Cn4-Y=vxy4lCN-1tG?stL-?fa!v0?ecu zv%BqHu~8+RjB8e%thc+p5BH-=CYgvU0on-U38U3!r`V{PxlSmvL}Ln8p#6Tg+xE%= zNhPiMdb1S_wCR*G*GYx0okf6FRv~?zR4m)Ox!Y`|7L9xgkW^{(H9*5^HbB?bY;~`! z)=nvtx>jbn?s9#;GrL_Yv^0y^v_ffcx4M(Mb;`L+TB$NzuGW&Qd)0haqe6FnyH;pWF9aml znSEWYrN)h7E~AunrZ<{Qo26V8=PgcHwGW}QOf5$1b+%0@OCS0 z2K8b`G#T5CT2+C1M*v^L763(z?nr~aSqC6x^+yv)CT=qTHD>_8 z*T^;kV7SAv0zIoyuPL>9qp>98b~6C=_5gsdLCdIX3#&WSpkp@biZt4N4F)!NQnI>( z5eQt3Ms3s3!03R1RM#>Z3N-BAK!JhN1Rw>DhC`nWg(D@i(-**#YXt^I8yrdXTBf1p z^!fuyV7;l=?JlhQ>en<=Vk|3*0NU?Un|1$5p^}U|q?9 zb*WBh-EIf#jvefGI(oeg>k`cH0RF)|Eo5V!P6Z H%kBRGKUU^s diff --git a/source/game/entities/player.cpp b/source/game/entities/player.cpp index 43b0ef4..3df6f6e 100644 --- a/source/game/entities/player.cpp +++ b/source/game/entities/player.cpp @@ -135,6 +135,16 @@ void Player::updateVelocity(float delta_time) { break; } + // Detectar cambio de dirección en el suelo + if (state_ != State::ON_AIR && target != 0.0F) { + Direction new_facing = (target > 0.0F) ? Direction::RIGHT : Direction::LEFT; + if (new_facing != facing_) { + facing_ = new_facing; + turning_ = true; + sprite_->resetAnimation(); + } + } + // Orientación del sprite if (target > 0.0F) { sprite_->setFlip(Flip::RIGHT); @@ -533,11 +543,18 @@ void Player::placeSprite() { void Player::animate(float delta_time) { // NOLINT(readability-make-member-function-const) if (state_ == State::ON_AIR) { - sprite_->setCurrentAnimation("jump"); + turning_ = false; + const bool NEAR_PEAK = vy_ > JUMP_VELOCITY * 0.5F && vy_ < -JUMP_VELOCITY * 0.5F; + sprite_->setCurrentAnimation(NEAR_PEAK ? "jump_peak" : "jump"); } else if (vx_ != 0) { - sprite_->setCurrentAnimation("default"); + if (turning_) { + sprite_->setCurrentAnimation("turn_walk"); + } else { + sprite_->setCurrentAnimation("walk"); + } sprite_->update(delta_time); } else { + turning_ = false; sprite_->setCurrentAnimation("stand"); } } @@ -581,7 +598,7 @@ void Player::initSprite(const std::string& animations_path) { // NOLINT(readabi sprite_ = std::make_unique(animation_data); sprite_->setWidth(WIDTH); sprite_->setHeight(HEIGHT); - sprite_->setCurrentAnimation("default"); + sprite_->setCurrentAnimation("walk"); } void Player::initSounds() { // NOLINT(readability-convert-member-functions-to-static) @@ -597,6 +614,7 @@ void Player::applySpawnValues(const SpawnData& spawn) { last_grounded_position_ = spawn.last_grounded_position; state_ = spawn.state; sprite_->setFlip(spawn.flip); + facing_ = (spawn.flip == Flip::LEFT) ? Direction::LEFT : Direction::RIGHT; } // ============================================================================ diff --git a/source/game/entities/player.hpp b/source/game/entities/player.hpp index cac4c13..2b1f3b9 100644 --- a/source/game/entities/player.hpp +++ b/source/game/entities/player.hpp @@ -128,6 +128,8 @@ class Player { bool is_alive_ = true; bool is_paused_ = false; bool ignore_input_ = false; + bool turning_ = false; + Direction facing_ = Direction::RIGHT; Room::Border border_ = Room::Border::TOP; int last_grounded_position_ = 0;