Search code examples
libgdx

How to move an object similar to sinusoidal wave movement?-LibGdx


I want to move my object vertically in zig-zag motion,similar to sisnusoidal motion;

enter image description here

I am moving my object like this:

public void moveLeavesDown(float delta) {

    setY(getY() - (getSpeed()* delta));

}

How can I get this kind of movement?


Solution

  • You can add a timer and use the math.sin function to add an offset to your leaves.

    This demo below shows how it can be done:

    import com.badlogic.gdx.ApplicationAdapter;
    import com.badlogic.gdx.Gdx;
    import com.badlogic.gdx.graphics.GL20;
    import com.badlogic.gdx.graphics.g2d.SpriteBatch;
    import com.badlogic.gdx.graphics.g2d.TextureRegion;
    import com.badlogic.gdx.math.Vector2;
    
    public class Test extends ApplicationAdapter{
    
        float time =0; // timer to store current elapsed time
        Vector2 leaf = new Vector2(150,150); // holds the leaf x,y pos
        float sinOffset = 0; // the offset for adding to the image
        private SpriteBatch sb; // spritebatch for rendering
        TextureRegion tx;  // a texture region(the leaf)
    
    
        @Override
        public void create() {
            sb = new SpriteBatch(); // make spritebatch
            tx = DFUtils.makeTextureRegion(10, 10, "FFFFFF"); // makes a textureRegion of 10x10 of pure white
    
        }
    
        @Override
        public void render() {
            // clear screen
            Gdx.gl.glClearColor(0f, 0f, 0f, 0f);
            Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
    
            leaf.y = leaf.y-0.2f; // move downwards
            time+= Gdx.graphics.getDeltaTime(); // update sin timer
            sinOffset =(float)Math.sin(time)*10; // calculate offset
    
            // draw leaf with offset
            sb.begin();
            sb.draw(tx, leaf.x+sinOffset, leaf.y);
            sb.end();
    
        }
    }