当前位置: 首页 > 知识库问答 >
问题:

将精灵连接到Box2d身体进行移动

夏侯朝斑
2023-03-14

我是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();

相机更新方法

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

共有1个答案

江英华
2023-03-14

请勿使用Sprite类。请改用TexureArea类。Sprite的子类来自于TexureArea,因此,当您调用batch.draw(Sprite,...)时,它的位置和旋转参数将被忽略,因为它被视为一个TexureArea。

你可以通过调用sprite.draw(批处理)来使用Sprite,但是Sprite是多余的,因为你的身体已经有了位置和旋转参数。

直接在SpriteBatch中使用纹理区域。可以使用传递到draw方法的旋转参数来确定其方向。

 类似资料:
  • 我刚刚为游戏塑造了我的角色,这是一个box2d动态身体: 可以给身体添加纹理或精灵吗?或者我把精灵的位置和我身体的位置一样?因此,它将覆盖身体的形状,并像实际的box2d身体一样移动。

  • 我想再写一个像Flappy Bird这样的游戏。所以,我有一个身体,与鸟,并设置他的位置在开始在屏幕中部与精灵在上面。现在当用户点击屏幕时,我想把鸟向上移动。但我怎样才能做到呢?身体setTransform(向量、角度)不是我想要的。你能帮我解决这个问题吗?

  • 移动精灵 现在你知道了如何展示精灵,但是让它们移动呢?很简单:使用Pixi的ticker。这被称为 游戏循环 。任何在游戏循环里的代码都会1秒更新60次。你可以用下面的代码让 cat 精灵以每帧1像素的速率移动。 function setup() { //Start the game loop by adding the `gameLoop` function to //Pixi's `t

  • 我制作了一个身体,我想在点击按钮时移动它,我已经能够使用但它不准确。假设我想以40的线速度移动我的身体7米,我该怎么做? 我可以用身体。setTransform()但我需要身体真正移动,而不是传送。提前谢谢

  • 我正在用PyGame制作一个小游戏,相机聚焦在一个代表角色的精灵上,当按下箭头键时,地图会围绕它移动。问题是地图不动。我以前多次遇到过这个问题,我想我已经把它缩小到可能的范围,但是我不知道如何真正解决这个问题。 这是代码: 基于我过去的PyGame程序,我总是在移动被绘制到屏幕上的精灵集时遇到问题,比如我在这里所做的。即使是平庸简单的例子也会失败。我想知道的是这是为什么,我怎样才能简明扼要地画出大

  • 当相机/屏幕移动时,我试图让精灵停留在静止物体(实际上是它的固定装置)的顶部。我需要做什么来实现这一点? :我有一个播放器(它是动态的,多边形形状,设置为一个盒子),当播放器在屏幕上向上移动时,相机会跟随它。 每X米,我在玩家前面几米处生成一个(静态)矩形。这个矩形是我试图在上面画一个精灵的身体,问题是当我画它的时候,精灵在屏幕上保持静态,不会停留在身体/固定装置的顶部。 我的游戏屏幕像这样跟随我