我正在尝试从屏幕中心到触摸坐标(时钟指针)绘制纹理。为了说明这一点,我创建了一个ShapeRenderer
来创建从中心到触摸点的直线。代码下方
if (Gdx.input.isTouched()) {
camera.unproject(touchPoint.set(Gdx.input.getX(), Gdx.input.getY(), 0));
debugRenderer.begin(ShapeType.Line);
debugRenderer.setColor(Color.ORANGE);
debugRenderer.line(centerObject.x, centerObject.y, touchPoint.x, touchPoint.y);
debugRenderer.end()
}
这很好用。现在我需要用实际图像替换线(我需要根据触摸位置进行缩放)。我尝试从中心点绘制纹理。我想用
public void draw (TextureRegion region, float x, float y, float originX, float originY, float width, float height,
float scaleX, float scaleY, float rotation)
SpriteBatch
的帮助我绘制纹理。但它不起作用。代码下方
private TextureRegion handRegion;
private Texture handTexture;
handTexture = new Texture(
Gdx.files.internal("hand.png"));
handRegion = new TextureRegion(handTexture);
//origin_X,origin_Y are the center of the screen
if (Gdx.input.isTouched()) {
camera.unproject(touchPoint.set(Gdx.input.getX(), Gdx.input.getY(), 0));
game.batch.begin();
game.batch.draw(handRegion, touchPoint.x, touchPoint.y, origin_X, origin_Y,10,100,1,1,0);
game.batch.end();
}
我非常感谢能帮助解决这个问题。
答案 0 :(得分:3)
您需要为此计算一个以度数(0..360)为单位的旋转。
package com.me.mygdxgame.Screens;
import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.Screen;
import com.badlogic.gdx.graphics.GL10;
import com.badlogic.gdx.graphics.OrthographicCamera;
import com.badlogic.gdx.graphics.Texture;
import com.badlogic.gdx.graphics.g2d.SpriteBatch;
import com.badlogic.gdx.graphics.g2d.TextureRegion;
import com.badlogic.gdx.math.Vector3;
public class HandScreen implements Screen{
SpriteBatch batch = new SpriteBatch();
OrthographicCamera camera;
TextureRegion handRegion;
Texture handTexture;
Vector3 touchPoint = new Vector3(0,0,0);
double rotation = 0;
float width,height;
@Override
public void render(float delta) {
Gdx.gl.glClear(GL10.GL_COLOR_BUFFER_BIT);
if (Gdx.input.isTouched()) {
camera.unproject(touchPoint.set(Gdx.input.getX(), Gdx.input.getY(),0));
// the center of your hand
Vector3 center = new Vector3(width/2,height/2,0);
// you need a vector from the center to your touchpoint
touchPoint.sub(center);
// now convert into polar angle
rotation = Math.atan2(touchPoint.y, touchPoint.x);
// rotation should now be between -PI and PI
// so scale to 0..1
rotation = (rotation + Math.PI)/(Math.PI * 2);
// SpriteBatch.draw needs degrees
rotation *= 360;
// add Offset because of reasons
rotation += 90;
}
batch.begin();
batch.draw(handRegion,
width/2, // x, center of rotation
height/2, //y, center of rotation
0, // origin x in the texture region
0,// origin y in the texture region
10, // width
100, // height
1, // scale x
1,// scale y
(float)rotation); // rotation !
batch.end();
}
@Override
public void show() {
handTexture = new Texture(Gdx.files.internal("img/coin.png"));
handRegion = new TextureRegion(handTexture);
width = Gdx.graphics.getWidth();
height = Gdx.graphics.getHeight();
camera = new OrthographicCamera();
camera.viewportHeight = height;
camera.viewportWidth = width;
camera.position.set(camera.viewportWidth * .5f, camera.viewportHeight * .5f, 0f);
camera.update();
}
// rest of screen interface
@Override
public void hide() {
}
@Override
public void pause() {
}
@Override
public void resume() {
}
@Override
public void dispose() {
}
@Override
public void resize(int width, int height) {
}
}
答案 1 :(得分:0)
当您使用spriteBatch的以下功能时
public void draw (TextureRegion region, float x, float y, float originX, float originY, float width, float height,
float scaleX, float scaleY, float rotation) ;
originX和originY必须是纹理区域的原点。根据这一点应用缩放和旋转。
您需要做的是将这些值视为texureRegion
origin_x = handRegion.getRegionWidth()/2f;
origin_y = handRegion.getRegionHeight()/2f;
这对你有用。