Поворот изображения по часовой стрелке с использованием LibGDX - PullRequest
5 голосов
/ 25 февраля 2012

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

Ответы [ 8 ]

10 голосов
/ 25 февраля 2012

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

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

4 голосов
/ 28 марта 2014

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

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-=.

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

3 голосов
/ 04 апреля 2012

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

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;
1 голос
/ 18 июля 2013

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

Sprite sprite = new Sprite(textureRegion, 0, 0, 128, 128);
sprite.setPosition(++mX, 0);
angle++;
sprite.setRotation(angle);
sprite.draw(batcher);
1 голос
/ 26 февраля 2012

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

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

0 голосов
/ 08 декабря 2017

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

Метод 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));
0 голосов
/ 20 мая 2014

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

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

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

img.rotate(2f); or img.rotate(-2f);
0 голосов
/ 23 декабря 2012

Вы тоже можете сделать это так:

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

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

в вашем рендере (float delta)

sprite.setX( sprite.getX() + delta ).setRotation( sprite.getRotation() + delta ); 
...