- Home /
Changing animation when moving horizontally without flipping sprite
Hi, I have been having this problem for a few days so I decided to ask here. I am working on a 2D platformer game using Animator Controller. My character was able to move horizontally by using one sprite sheet for horizontal movement flipped over by multiplying -1 to the x scale everytime it needed to.
 private function Flip() {
     var theScale:Vector2 = smileyFace.transform.localScale;
     theScale.x *= -1;
     smileyFace.transform.localScale = theScale;
 }
This was crucial part because my character had to bounce off the wall when it hits the wall. I made it so that the character would bounce off the wall by 1) changing its target position, and 2) flip the sprite horizontally.
However, I noticed that the shading on my character looked wrong when flipped over horizontally so I decided to create separate animation set for moving left and right. So I created new sets of sprite sheets and created animation states accordingly. I took the Flip function out of the original code. Now, my character can move horizontally with correct animations.
The problem came when I was trying to bounce off the wall. My bounce would not work anymore. It would completely ignore my bounce function and just jitter around until it goes through the wall. I was trying to figure out hard to find what parameter is not being updated correctly. It was updating moving direction and its new target position but twice in a row to nullify the bounce and force itself to go through the wall.
After trying to fix my code for several hours, I have found out that my character will bounce off fine if I put the Flip function back in. Well...bounce works fine but the image is now flipped over so the animation is off. So what did I do? call Flip function twice. Now everything works as I have planned. But why do I have to flip the image to make my character bounce? This should be completely unnecessary.
 function HitWall() {
     // swap current position and target position for bouncing back
     var tempPos:SmileyPos;
     tempPos = smileyPos;
     smileyPos = targetPos;
     targetPos = tempPos;
     
     startX = ColToX(smileyPos.col);
     targetX = ColToX(targetPos.col);
     
     // updating moving time
     moveStartTime -= (1.0f - hMoveFrac) - hMoveFrac;
     hMoveFrac = 1.0f - hMoveFrac;
     
     movingRight = !movingRight;
     movingLeft = !movingLeft;
     anim.SetBool("moveRight", movingRight);
     anim.SetBool("moveLeft", movingLeft);
     
     var animationName:int;
     if (movingRight && !movingLeft) {
         animationName = Animator.StringToHash("Base Layer.move_hRight");
     }
     else if (movingLeft && !movingRight) {
         animationName = Animator.StringToHash("Base Layer.move_hLeft");
     }
     anim.Play(animationName, 0, 1.0f - anim.GetCurrentAnimatorStateInfo(0).normalizedTime);
     
     //why is this required??
     /*Flip();
     Flip();*/
 }
So here's my code for when my character hits the wall. HitWall function is called by the Character Controller from its OnCollisionEnter2D function.

Here's the Animator state of the game.
Your answer
 
 
              koobas.hobune.stream
koobas.hobune.stream 
                       
                
                       
			     
			 
                