2017-05-01 8 views
0

私は世界中の私の体が動くどこにでもスプライトを移動しようとしています。だから私はスプライトのsetPositionメソッドを使用していたが、それは助けにはならなかったことが判明。私のイメージはちょうどポジション(0,0)に座っています。なぜ私は理解できません。スプライトのsetPositionメソッドが機能しません

ここ

コードです:ここでは

package com.example.shapetest; 

import com.badlogic.gdx.ApplicationListener; 
import com.badlogic.gdx.Gdx; 
import com.badlogic.gdx.graphics.GL20; 
import com.badlogic.gdx.graphics.OrthographicCamera; 
import com.badlogic.gdx.graphics.Texture; 
import com.badlogic.gdx.graphics.g2d.Animation; 
import com.badlogic.gdx.graphics.g2d.Sprite; 
import com.badlogic.gdx.graphics.g2d.SpriteBatch; 
import com.badlogic.gdx.graphics.g2d.TextureAtlas; 
import com.badlogic.gdx.graphics.g2d.TextureRegion; 
import com.badlogic.gdx.math.Matrix4; 
import com.badlogic.gdx.math.Rectangle; 
import com.badlogic.gdx.math.Vector2; 
import com.badlogic.gdx.physics.box2d.Body; 
import com.badlogic.gdx.physics.box2d.BodyDef; 
import com.badlogic.gdx.physics.box2d.BodyDef.BodyType; 
import com.badlogic.gdx.physics.box2d.Box2DDebugRenderer; 
import com.badlogic.gdx.physics.box2d.FixtureDef; 
import com.badlogic.gdx.physics.box2d.PolygonShape; 
import com.badlogic.gdx.physics.box2d.World; 

class ShapeTest implements ApplicationListener { 

    SpriteBatch batch; 
    World world; 
    OrthographicCamera camera; 
    Box2DDebugRenderer debugRenderer; 
    Texture squareTx; 
    Sprite square; 
    Body body; 

    @Override 
    public void create() { 
     batch = new SpriteBatch(); 
     world = new World(new Vector2(0,-10),false); 
     squareTx = new Texture(Gdx.files.internal("sq.png")); 
     square = new Sprite(squareTx); 

     debugRenderer = new Box2DDebugRenderer(); 
     camera = new OrthographicCamera(); 
     camera.setToOrtho(false); 

     BodyDef bd = new BodyDef(); 
     bd.type = BodyType.DynamicBody; 
     bd.position.set(new Vector2((Gdx.graphics.getWidth()/2) * 0.01f, Gdx.graphics.getHeight() * 0.01f)); 
     body = world.createBody(bd); 
     BodyDef bd2 = new BodyDef(); 
     bd2.type = BodyType.StaticBody; 
     bd2.position.set(new Vector2(Gdx.graphics.getWidth()/2 * 0.01f, 100 * 0.01f)); 
     Body body2 = world.createBody(bd2); 

     square.setSize(100,100); 

     PolygonShape shape = new PolygonShape(); 
     shape.setAsBox(0.5f,0.5f); 
     PolygonShape shape2 = new PolygonShape(); 
     shape2.setAsBox(1.6f,0.3f); 

     FixtureDef fd = new FixtureDef(); 
     fd.density = 1; 
     fd.restitution = 0.2f; 
     fd.shape = shape; 
     fd.friction = 0.4f; 

     body.createFixture(fd); 
     body2.createFixture(shape2, 0f); 

     shape.dispose(); 
    } 

    @Override 
    public void resize(int width, int height) { 

    } 

    @Override 
    public void render() { 
     Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT); 

     Vector2 pos = body.getPosition(); 
     square.setPosition(pos.x ,pos.y); 

     camera.update(); 
       batch.setProjectionMatrix(camera.combined); 
     Matrix4 cameraCopy = camera.combined.cpy(); 
     debugRenderer.render(world, cameraCopy.scl(100f)); 
     world.step(1/60f,10,10); 
     batch.begin(); 
     square.draw(batch); 
     batch.end(); 
    } 

    @Override 
    public void pause() { 

    } 

    @Override 
    public void resume() { 

    } 

    @Override 
    public void dispose() { 
     batch.dispose(); 
    } 
} 

が結果です:

(スプライトがピンクの箱の位置に従うべきである) sprite should follow the pink box position

+0

あなたは 'batch.setProjectionMatrix(camera.combined);'を忘れていました。そしてあなたのカメラは 'resize()'でサイズを変更する必要があります。そして、それはbox2dの世界とあなたのゲームシーンに別のカメラスケールを使うことに巻き込まれます。 LibGDXビューポートで読み上げます。 – Tenfour04

+0

@ Tenfour04がコードを編集し、 'batch.setProjectionMatrix(camera.combined);'を追加しましたが、スプライトをそのピンクボックス位置に移動できません。 –

+0

...カメラのサイズ変更やビューポート、または世界とゲームのために同じカメラを使用して... – Tenfour04

答えて

0

body.getPosition()返り小さな値ので、描画するための必要にその値をピクセル値に変換します。

あなたの話によれば、スプライトサイズは100ピクセルで、ポリゴンシェイプである物理シェイプ(物理単位は0.5f * 2 = 1;単位、物理単位は1単位/ 100ピクセル)を表します。

Vector2 pos = body.getPosition(); // value return in physics unit 
square.setPosition(pos.x*100 ,pos.y*100); 
関連する問題