Повернуть изображение по часовой стрелке с помощью LibGDX

Как мы можем повернуть изображение по часовой стрелке с помощью LibGDX? я смотрю, когда изображение загружается, предположим, звезда, мне нужно повернуть его от начала экрана до конца экрана по горизонтали, при этом звезда вращается, как я могу сделать это в libgdx?


person Alex Mathew    schedule 25.02.2012    source источник
comment
Ваш вопрос не очень ясен. Вы вращаете текстуру, спрайт или изображение? Поворачивая его от начала экрана к концу экрана по горизонтали, с вращением звезды, вы имеете в виду, что хотите, чтобы звезда двигалась горизонтально во время вращения?   -  person Rahat Ahmed    schedule 25.02.2012
comment
@RahatAhmed: извините, у меня есть текстура, да. Мне нужно, чтобы она вращалась при движении по горизонтали   -  person Alex Mathew    schedule 25.02.2012


Ответы (8)


Когда вы рисуете текстуру с помощью SpriteBatch, вы можете использовать одну из функций рисования, которая включает вращение. В этом javadoc есть все функции рисования: SpriteBatch

Вы можете сохранить переменную для положения и поворота и увеличивать поворот и x компонент положения каждый раз, когда вы визуализируете, чтобы заставить его вращаться при движении по горизонтали.

person Rahat Ahmed    schedule 25.02.2012

Libgdx дает вам несколько способов сделать это: вы можете использовать Scene2D и добавить Image к вашему Stage. Image является подклассом Actor, поэтому вы можете добавить к нему Action:

Image myImage = new Image(myTexture);
myImage.addAction(Actions.parallel(Actions.moveTo(endX, endY, duration), Actions.rotateBy(degrees, duration)));
myImage.setPosition(startX, startY);
myImage.setOrigin(sizeX/2, sizeY/2);
stage.add(myImage);

В render вы можете затем вызвать stage.act(), который обновит положение, вращение, масштаб... всех ваших Actor, а затем вызвать stage.draw(), который вызовет draw() для всех ваших Actor. Image уже обрабатывает draw(), поэтому вам больше не нужно об этом заботиться.

Вы также можете сделать это без scene2d, обновив все самостоятельно:
Вы можете сохранить int rotationSpeed в градусах/сек
Вы можете сохранить int moveSpeed в единицах/сек (возможно, в пикселях, но я бы посоветовал использовать камеру или область просмотра и используйте свою единицу измерения, которая одинакова на всех устройствах)
Сохраните float angle, которое является текущим поворотом вашего Texture, и сохраните Vector2 position, которое содержит координаты x и y вашего Texture.
Если вы хотите двигаться в направлении x и y, вы также можете сохранить Vector2 direction, который является нормализованным Vector, дающим процент движения в направлении x и y, но это другая история.

Затем в своем render(float delta) вы все обновляете:

angle+=delta*rotationSpeed;
angl%=360;      // Limits the angle to be <= 360
while (angle < 0)  // Unfortunally the "modulo" in java gives negative result for negativ values.
    angle+=360;
position.x+=direction.x*moveSpeed*delta;
position.y+=direction.y*movSpeed*delta;
spriteBatch.draw(yourTextureRegion, position.x, position.y, sizeX/2, sizeY/2, sizeX, sizeY, scaleX, scaleY, angle);

Для вращения по часовой стрелке просто используйте отрицательное число rotationSpeed или замените angle+= на angle-=.

Надеюсь, поможет.

person Springrbua    schedule 28.03.2014

Ниже приведена реализация поворота любого спрайта.

batch.draw(sprite,(Gdx.graphics.getWidth() - sprite.getRegionWidth()) / 2.0f,(Gdx.graphics.getHeight() - sprite.getRegionHeight()) / 2.0f,sprite.getRegionWidth()/2.0f,sprite.getRegionHeight()/2.0f, sprite.getRegionWidth(), sprite.getRegionHeight(), 1f, 1f,count, false);

if(count < 0.0f)
count = 360.0f;
else
count --;

Изначально установите счетчик на

private float count =360.0f;
person Siddharth    schedule 04.04.2012

Вы также можете использовать действия Scene2D. У меня есть пример с астероидом, который падает на экран и вращается.

http://www.netthreads.co.uk/2012/02/09/libgdx-scene2d-demo-with-scene-transitions/

person alrutherford    schedule 26.02.2012

Чтобы повернуть против часовой стрелки и по горизонтали... создайте textureRegion, затем

Sprite sprite = new Sprite(textureRegion, 0, 0, 128, 128);
sprite.setPosition(++mX, 0);
angle++;
sprite.setRotation(angle);
sprite.draw(batcher);
person Nitin Sharma    schedule 18.07.2013

Вы также можете сделать это следующим образом:

в вашем методе создания

sprite.setOrigin(sprite.getWitdh() /2f, sprite.getHeight() /2f);
sprite.setPosition( 0, 200 ); //200 it's a example

на вашем рендере (плавающая дельта)

sprite.setX( sprite.getX() + delta ).setRotation( sprite.getRotation() + delta ); 
person Jose Luis CM    schedule 23.12.2012

Вот простой способ вращения актера в libgdx. Сначала вам нужно установить происхождение:

img.setOrigin(getWidth/2,getHeight/2);

И затем вы можете вращать по часовой стрелке и против часовой стрелки в соответствии с вашими потребностями:

img.rotate(2f); or img.rotate(-2f);
person Sudhir singh    schedule 20.05.2014

Итак, у меня работал следующий образец (бесконечное вращение)

Способ 1: (рекомендуется)

loadingActor.addAction(Actions.repeat(RepeatAction.FOREVER, Actions.rotateBy(360, 1)));

Метод 2:

Image loadingActor = new Image(AssetsController.getInstance().getLoading());
loadingActor.setOrigin(Align.center);
final SequenceAction infiniteRotate = Actions.sequence();
infiniteRotate.addAction(Actions.rotateTo(0 , 0f) );
infiniteRotate.addAction(Actions.rotateTo(360 , 1f) );
loadingActor.addAction(Actions.forever(infiniteRotate));
person ultra.deep    schedule 08.12.2017