簡體   English   中英

將精靈附加到Box2d主體以進行移動

[英]Attaching a sprite to a Box2d body for movement

我在Box2d上的新手遇到了問題,無法解決。 當用戶觸摸我的左右按鈕時,我想左右移動播放器。 我創建了一個固定裝置,可以移動身體和固定裝置,但不能移動播放器精靈,如何將播放器精靈附加到我的身體上? 我應該如何控制身體,因為我無法阻止它。 我想在box2d中找到一種控制播放器的正確方法。 我無法使用setLinerVelocity等。

這是我的密碼

public World world;
public Body bplayer;
public Box2DDebugRenderer b2dr;
public Matrix4 cameraBox2D;

播放屏幕

buttonimage.addListener(new ClickListener() {
    public boolean touchDown(InputEvent event, float x, float y, int pointer, int button)
    {

    bplayer.setLinearVelocity(-5*PPM , 0);



    return true;
    }
});
world = new World(new Vector2(player.getPosition().x , player.getPosition().y) , false);
b2dr = new Box2DDebugRenderer();
bplayer = createPlayer(player.getPosition().x , player.getPosition().y);

顯示方法

buttonimage.setPosition(160,0);
rightbuttonimage.setPosition(320,0);
pauseimage.setPosition(220,-20);
cameraBox2D = camera.combined.cpy();

渲染方法

Gdx.gl.glClearColor(0, 0, 2f, 1);
Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);


sb.setProjectionMatrix(camera.combined);

player.position.y += 500 * Gdx.graphics.getDeltaTime();
sb.begin();
sb.draw(bg, 0, camera.position.y - (camera.viewportHeight/2));
sb.draw(player.sprite, player.getPosition().x , player.getPosition().y);
for (Tube tube : tubes) {
    sb.draw(tube.getlefttube(), tube.getposlefttube().x, tube.getposlefttube().y);
    sb.draw(tube.getrighttube(), tube.getposrighttube().x, tube.getposrighttube().y);
    sb.draw(tube.getLight() , tube.getPoslight().x , tube.getPoslight().y);
}





delta*=speed;
sb.end();

update(delta);
b2dr.render(world , cameraBox2D);
stage.draw();

app.batch.begin();
app.font23.draw(app.batch,"Lights collected :" + dropsGathered , 0, 720);
app.batch.end();

cameraUpdate方法

Vector3 position = camera.position;
position.x = player.position.x;
position.y = player.position.y;
camera.position.set(position);

createPlayer方法

Body pBody;
BodyDef def = new BodyDef();
def.type = BodyDef.BodyType.DynamicBody;
def.position.set(x * PPM, y * PPM  );
def.fixedRotation = true;
pBody = world.createBody(def);

return pBody;

更新方法

world.step(1 / 60f , 6 , 2);

for(int i = 0; i < tubes.size; i++) {

    Tube tube = tubes.get(i);

    if (camera.position.y - (camera.viewportWidth/2) > tube.getposlefttube().y + tube.getlefttube().getWidth()) {
        tube.reposition(tube.getposlefttube().y + ( TUBE_COUNT) );

    }

    if (tube.collides(player.getBounds())){
        app.setScreen(new GameOver(app));


    }

    if (tube.gathered(player.getBounds())){

            dropsGathered++;




    }

    if (dropsGathered >= 50){
        //app.setScreen(new Stage2(app));
    }


}
camera.update();

handleInput();
camera.position.y = player.getPosition().y + 300;
player.update(delta);
camera.update();

cameraUpdate(delta);

stage.act(delta);

不要使用Sprite類。 請改用TextureRegion類。 Sprite是TextureRegion的令人困惑的子類,因此當您調用batch.draw(sprite, ...)其位置和旋轉參數將被忽略,因為它被視為TextureRegion。

您可以通過調用sprite.draw(batch)使用Sprite,但是Sprite是多余的,因為您的Body已經具有位置和旋轉參數。

直接在SpriteBatch中使用TextureRegion。 您可以使用傳遞到draw方法中的旋轉參數來使其定向。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM