I have code that changes texture in each frame depending on the player's state - walking, idle.

My problem is that the idle texture (from separate png) has a slightly different size, and due to that it appears not in line with rest of the animations, seemingly being in a slightly different position when returning to idle.

How can I position the frames based on the center of texture instead of the bottom left?

batch.draw(determineTexture(), position.x, position.y,
            currentFrame.getRegionWidth()/2f, currentFrame.getRegionHeight()/2f,
            currentFrame.getRegionWidth(), currentFrame.getRegionHeight(),1f,1f, rotation,false);

TextureRegion determineTexture(){
        if(playerState == State.idle)
            currentFrame = idleAnimation.getKeyFrame(stateTime, true);
        else if (playerState == State.walkingUP || playerState == State.walkingDOWN || playerState == State.walkingRIGHT || playerState == State.walkingLEFT )
            currentFrame = walkAnimation.getKeyFrame(stateTime, true);
        return currentFrame;

One png has a height of 57 - idle, while 6 columns and one row of walking frames have a height of 87 pixels.

  • \$\begingroup\$ Why don't you make them the same size? \$\endgroup\$ – Vaillancourt Jul 25 '19 at 23:08
  • \$\begingroup\$ See some past Q&A about a similar issue. \$\endgroup\$ – DMGregory Jul 25 '19 at 23:27
  • \$\begingroup\$ @AlexandreVaillancourt Tried it just resizing png with this ps2pdf.com/resize-png but now image is blurry and visibly bigger by ~ 25 % from other frames of animation. Its just that walking animation has arms spread wider and its bigger in resolution size thanks to that. \$\endgroup\$ – new User Jul 26 '19 at 8:03
  • \$\begingroup\$ @DMGregory a bit simillar at first glance thanks, but not really useful :(. Shame i really struggle right now because that free asset pack looks cool and i wonder if thats me doing something wrong or i should look for new asset pack because you cant have two different heights. \$\endgroup\$ – new User Jul 26 '19 at 8:07
  • \$\begingroup\$ What force in the universe prevents you from having two different heights? Just offset your draw position accordingly, using a defined hotpoint/pivot you've defined each frame. This is addition and subtraction, not the halting problem. \$\endgroup\$ – DMGregory Jul 26 '19 at 8:20

SOLVED ! I have modified the code as follows: instead of just position.x and position.y as arguments in SpriteBatch.draw() i modified those values as follows after some trial and error

position.x - currentFrame.getRegionWidth()/2f 
position.y - currentFrame.getRegionHeight()/2f

So batch draw call looks now like this:

 batch.draw(determineTexture(), position.x - currentFrame.getRegionWidth()/2f, position.y - currentFrame.getRegionHeight()/2f,
            currentFrame.getRegionWidth()/2f, currentFrame.getRegionHeight()/2f,
            currentFrame.getRegionWidth(), currentFrame.getRegionHeight(),1f,1f, rotation,false);

That makes it centered every time i think Maybe i should mark it as beginner question next time but it felt satysfying to solve after some hints from @DMGregory thanks

| improve this answer | |
  • \$\begingroup\$ This answer would be better if it showed the code change in context and described how/why making this change solves your problem. \$\endgroup\$ – DMGregory Jul 26 '19 at 8:46
  • \$\begingroup\$ @DMGregory I am still figuring out why it works \$\endgroup\$ – new User Jul 26 '19 at 9:09

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.