? Need help with directional sprite movement/animation (Page 1) ● SmileBASIC Source Forums

Sign In

Register
*Usernames are case-sensitive
Forgot my password

Need help with directional sprite movement/animation

  • #1 ✎ 19 thatguy Intermediate Programmer I can make programs, but I still have trouble here and there. Programming Strength Video Games I like to play video games! Hobbies Night Person I like the quiet night and sleep late. Express Yourself This is a little bit complicated to explain but it comes down to if I for example hold right on the dpad and then press or hold up on the dpad the the sprite changes rapidly from up and down what I want it to do is that the sprite walks to the right with the animation of walking right and when I press or hold up it still uses the animation of walking to the right only it also goes up. Where the problem is in this, is I also want to be able to do the same for up and then pressing or holding right but then using the animation of walking up. I also want it to work with the joystick and a combination of the dpad and joystick.(I have vsync 2 if that makes a diffrence.) Posted Edited by thatguy
  • #2 ✎ 477 SquareFingers I think the way I would implement this is to have two variables, one for the direction on the frame previous to the current one (say PREVDIR%), one for the direction on the current frame (say CURRDIR%). For initialization, set CURRDIR% to zero, indicating the sprite is stationary. In the superloop, have two lines like PREVDIR%=CURRDIR% CURRDIR%=BUTTON() AND (#LEFT OR #RIGHT OR #UP OR #DOWN) Now, if CURRDIR% is one of the four values #LEFT, #RIGHT, #UP, or #DOWN, then your sprite is moving in a cardinal direction and the sprite's appearance needs to correspond to that. If CURRDIR% is nonzero, but not a cardinal direction, then it is a diagonal direction. There are two cases to consider when the sprite is moving diagonally. First, if PREVDIR% is nonzero, then you are in a situation like, the user has been holding 'down', then just started holding 'right' at the same time. In this case, do not change the appearance of the sprite. Second, if PREVDIR% is zero, then the user went from stationary directly to moving diagonally. You have to choose which cardinal direction you'd prefer for the appearance of your sprite. I think I would choose left/right over up/down, since the screen is wider than it is tall, but it is your choice. Posted Edited by SquareFingers
  • #3 ✎ 19 thatguy Intermediate Programmer I can make programs, but I still have trouble here and there. Programming Strength Video Games I like to play video games! Hobbies Night Person I like the quiet night and sleep late. Express Yourself Could you give a example code because I don't understand it anymore by the currdir% is non zero or an explaination so a dummy like I can understand it :p Posted
  • #4 ✎ 477 SquareFingers This code is not tested. CURRDIR%=0 ANIMATIONDIR%=0 WHILE #TRUE VSYNC PREVDIR%=CURRDIR% CURRDIR%=BUTTON() AND (#LEFT OR #RIGHT OR #UP OR #DOWN) IF CURRDIR%==0 THEN ' Stop the animation ANIMATIONDIR%=0 ELSEIF (CURRDIR%==#LEFT) || (PREVDIR%==0 && (CURRDIR% AND #LEFT)) THEN IF ANIMATIONDIR%!=#LEFT THEN ' Start left-facing animation ENDIF ANIMATIONDIR%=#LEFT ELSEIF (CURRDIR%==#RIGHT) || (PREVDIR%==0 && (CURRDIR% AND #RIGHT)) THEN ' ... right ELSEIF (CURRDIR%==#UP) || (PREVDIR%==0 && (CURRDIR% AND #UP)) THEN ' ... up ELSEIF (CURRDIR%==#DOWN) || (PREVDIR%==0 && (CURRDIR% AND #DOWN)) THEN ' ... down ENDIF ' Everything else in your superloop WEND Posted Edited by SquareFingers
  • #5 ✎ 19 thatguy Intermediate Programmer I can make programs, but I still have trouble here and there. Programming Strength Video Games I like to play video games! Hobbies Night Person I like the quiet night and sleep late. Express Yourself Alright thanks for your help! Posted
  • #6 ✎ 477 SquareFingers Actually, the last two guards can be ELSEIF CURRDIR%==#UP THEN ' ... up ELSEIF CURRDIR%==#DOWN THEN ' ... down since the stationary-to-diagonal cases are covered by the previous guards. Posted Edited by SquareFingers
  • #7 ✎ 19 thatguy Intermediate Programmer I can make programs, but I still have trouble here and there. Programming Strength Video Games I like to play video games! Hobbies Night Person I like the quiet night and sleep late. Express Yourself I know i am kinda asking much but I have been playing around with the code and I can't figure out how to use it. If you have time or someone els I would highly appreciate it if you post the full code or a key. Again sorry for being so big of a noob 🙃 Posted
  • #8 ✎ 477 SquareFingers 'How to use it' is, type it in, and fill in details I have left out. Can you be more specific about what you can't figure out? Posted
  • #9 ✎ 19 thatguy Intermediate Programmer I can make programs, but I still have trouble here and there. Programming Strength Video Games I like to play video games! Hobbies Night Person I like the quiet night and sleep late. Express Yourself For example i want to keep the animation status stored I have that done wit a variable and the spchr 0,old,0,0,0 old is the variable I use to declare the state where the animation has to stop if press one of the cardinal directions. But the thing I don't understand is if I press for example up while holding left the the sprite simply stops and doesn't go up even if don't use the variable and just do what you have explained. So I probaly am typing something wrong that is why I am asking for a full example code so that I just simply can swap the sprites out with mine and use the code without adding additional code because this stuff is past my understanding. Posted
  • #10 ✎ 477 SquareFingers
    I am asking for a full example code so that I just simply can swap the sprites out with mine and use the code without adding additional code because this stuff is past my understanding.
    That's unlikely to happen. No-one will make the effort of writing your game, so you can call it yours after they have done the work. And if it remains past your understanding, you will not be able to debug, tweak, or add to the game, without bugging someone again. So, the best approach is to extend your understanding. From the symptoms you describe, I imagine some of your code is like IF BUTTON()==#UP THEN ' Move up ENDIF If, instead, you use IF BUTTON()&&#UP THEN ' Move up ENDIF then diagonal motion should work.
    Posted
  • #11 ✎ 19 thatguy Intermediate Programmer I can make programs, but I still have trouble here and there. Programming Strength Video Games I like to play video games! Hobbies Night Person I like the quiet night and sleep late. Express Yourself That did the trick thanks! Posted
  • #12 ✎ 93 niconii Video Games I like to play video games! Hobbies Expert Programmer Programming no longer gives me any trouble. Come to me for help, if you like! Programming Strength Drawing I like to draw! Hobbies
    IF BUTTON()&&#UP THEN ' Move up ENDIF
    You want BUTTON() AND #UP, not BUTTON() && #UP. The latter will be true if you press any button, not just #UP, because && is boolean AND rather than bitwise AND, and only checks that both sides aren't 0. In other words, these are all equivalent: BUTTON() && #UP (BUTTON() != 0) && (#UP != 0) (BUTTON() != 0) && (1 != 0) (BUTTON() != 0) && TRUE BUTTON() != 0 BUTTON()
    Posted Edited by niconii
  • #13 ✎ 477 SquareFingers Thank you niconii, you're right that they are all equivalent, when used as a guard for an IF. I apologize for posting code I hadn't tested, or thought through enough. Posted