使用libgdx缩放和绘制纹理以触摸坐标

时间:2013-08-04 12:15:42

标签: java libgdx

我正在尝试从屏幕中心到触摸坐标(时钟指针)绘制纹理。为了说明这一点,我创建了一个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();
     } 

我非常感谢能帮助解决这个问题。

2 个答案:

答案 0 :(得分:3)

您需要为此计算一个以度数(0..360)为单位的旋转。

  1. 计算从中心到触摸点的矢量。
  2. 通过Math.atan2(y,x)
  3. 将其转换为极角phi
  4. 将[-PI..PI]的phi缩放为[0..360]
  5. 因为起源点不同而添加90(?)
  6. 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;

这对你有用。