Как мы можем повернуть изображение по часовой стрелке с помощью LibGDX? я смотрю, когда изображение загружается, предположим, звезда, мне нужно повернуть его от начала экрана до конца экрана по горизонтали, при этом звезда вращается, как я могу сделать это в libgdx?
Повернуть изображение по часовой стрелке с помощью LibGDX
Ответы (8)
Когда вы рисуете текстуру с помощью SpriteBatch, вы можете использовать одну из функций рисования, которая включает вращение. В этом javadoc есть все функции рисования: SpriteBatch
Вы можете сохранить переменную для положения и поворота и увеличивать поворот и x компонент положения каждый раз, когда вы визуализируете, чтобы заставить его вращаться при движении по горизонтали.
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-=
.
Надеюсь, поможет.
Ниже приведена реализация поворота любого спрайта.
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;
Вы также можете использовать действия Scene2D. У меня есть пример с астероидом, который падает на экран и вращается.
http://www.netthreads.co.uk/2012/02/09/libgdx-scene2d-demo-with-scene-transitions/
Чтобы повернуть против часовой стрелки и по горизонтали... создайте textureRegion, затем
Sprite sprite = new Sprite(textureRegion, 0, 0, 128, 128);
sprite.setPosition(++mX, 0);
angle++;
sprite.setRotation(angle);
sprite.draw(batcher);
Вы также можете сделать это следующим образом:
в вашем методе создания
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 );
Вот простой способ вращения актера в libgdx. Сначала вам нужно установить происхождение:
img.setOrigin(getWidth/2,getHeight/2);
И затем вы можете вращать по часовой стрелке и против часовой стрелки в соответствии с вашими потребностями:
img.rotate(2f); or img.rotate(-2f);
Итак, у меня работал следующий образец (бесконечное вращение)
Способ 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));