2012-02-25 54 views
5

Làm cách nào để xoay hình ảnh theo chiều kim đồng hồ bằng LibGDX? những gì tôi đang tìm kiếm là khi một hình ảnh được tải, giả sử một ngôi sao, tôi cần phải xoay nó từ đầu màn hình đến cuối màn hình theo chiều ngang, với sao quay, làm thế nào tôi có thể làm điều đó trong libgdx?Xoay ảnh theo chiều kim đồng hồ bằng cách sử dụng LibGDX

+0

Câu hỏi của bạn không rõ ràng lắm. Bạn đang xoay một Texture, Sprite, hoặc hình ảnh? Bằng cách "xoay nó từ đầu màn hình đến cuối màn hình theo chiều ngang, với sao quay", bạn có nghĩa là bạn muốn ngôi sao di chuyển theo chiều ngang trong khi xoay? –

+0

@RahatAhmed: xin lỗi, tôi đang có kết cấu, yes.i cần nó xoay trong khi di chuyển theo chiều ngang –

Trả lời

10

Khi bạn vẽ họa tiết bằng SpriteBatch, bạn có thể sử dụng một trong các chức năng vẽ bao gồm xoay vòng. Javadoc này có tất cả các chức năng vẽ: SpriteBatch

Bạn có thể giữ một biến cho vị trí và xoay, và tăng thành phần xoay và x của vị trí mỗi khi bạn render để làm cho nó xoay trong khi di chuyển theo chiều ngang.

3

Tiếp theo là việc thực hiện để xoay bất kỳ sprite

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 --; 

Ban đầu thiết lập bộ đếm đến

private float count =360.0f; 
0

Bạn có thể làm điều đó quá như thế này:

trên tạo của bạn phương pháp

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

trên render (đồng bằng float) của bạn

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

Để xoay ngược và ngang .. tạo textureRegion sau đó

Sprite sprite = new Sprite(textureRegion, 0, 0, 128, 128); 
sprite.setPosition(++mX, 0); 
angle++; 
sprite.setRotation(angle); 
sprite.draw(batcher); 
3

Libgdx mang đến cho bạn nhiều hơn thì một trong những cách để làm điều đó : Bạn có thể sử dụng Scene2D và thêm Image vào số Stage của mình. Image là một lớp con của Actor, vì vậy bạn có thể thêm Action s với nó:

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); 

Trong render sau đó bạn có thể gọi stage.act(), cập nhật vị trí, luân chuyển, quy mô ... của tất cả các Actor của bạn và sau đó gọi stage.draw() sẽ gọi draw() cho tất cả Actor giây của bạn. Hình ảnh allready xử lý các draw() vì vậy bạn không cần phải quan tâm về điều đó nữa.

Bạn cũng có thể làm điều đó mà không scene2d, bằng cách cập nhật tất cả những gì mình:
Bạn có thể lưu trữ một int rotationSpeed trong độ/giây
Bạn có thể lưu trữ một int moveSpeed trong các đơn vị/giây (có thể điểm ảnh nhưng tôi sẽ đề nghị sử dụng máy ảnh hoặc chế độ xem và sử dụng đơn vị riêng của bạn, bằng nhau trên tất cả các thiết bị)
Lưu trữ float angle, là vòng quay hiện tại của Texture và lưu trữ Vector2 position, chứa vị trí x và y của Texture.
Nếu bạn muốn di chuyển theo hướng x và y, bạn cũng có thể lưu trữ Vector2 direction, được chuẩn hóa Vector, cho phần trăm chuyển động theo hướng x và y, nhưng đó là một câu chuyện khác.

Sau đó, trong bạn render(float delta) bạn cập nhật tất cả mọi thứ:

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); 

Đối với xoay chiều kim đồng hồ chỉ cần sử dụng một tiêu cực rotationSpeed hoặc thay thế angle+= với angle-=.

Hy vọng điều đó sẽ hữu ích.

0

Đây là cách đơn giản để xoay một diễn viên trong libgdx. Trước tiên, bạn cần phải thiết lập nguồn gốc:

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

Và sau đó bạn có thể xoay chiều kim đồng hồ và ngược lại theo nhu cầu của bạn:

img.rotate(2f); or img.rotate(-2f); 
0

Vì vậy, các mẫu sau đây làm việc cho tôi (xoay vô hạn)

Phương pháp 1: (được khuyến nghị)

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

Phương pháp 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)); 
Các vấn đề liên quan