Libgdx,我可以在Body中附加动画吗?

时间:2016-12-19 19:13:49

标签: java android libgdx game-engine

我有点新的在这里,任何...我对Android游戏应用开发感兴趣,我正在学习如何做到这一点,使用Libgdx作为我的游戏引擎,已经做了一个小游戏,而不是令人兴奋的事情。

我最近开始学习如何使用World变量并在其中创建实体,我想创建一个扩展Actor的类,给它动画(我知道如何给动画)并尝试在它上面显示它身体,所以无论身体在哪里,动画都会在它上面播放(动画的下方基本上是未显示的动画)

所以我的问题是: 有没有办法让这个服装演员进入身体所以它会在身体上播放? (附加它们)

非常感谢您的帮助!

**注意:请注意我的知识仍然有限,我是程序工程的大学生,我还没有深入研究java(我的大学没有教授游戏引擎)**

更新

我创建了一个服装类,为每个动作制作了动画(比如herowalk,herosit ......等等)

我写了一个渲染方法:

public void render(SpriteBatch batch) {
    float posX = bbody.getPosition().x * PPM;
    float posY = bbody.getPosition().y * PPM;

    float rotation = (float) Math.toDegrees(bbody.getAngle());

    sprite.setPosition(posX,posY);
    sprite.setRotation(rotation);

    sprite.draw(batch);
}

并创建了一个实体,将其放置在我的屏幕中间,并使用SetUserData()将精灵附加到它:

BodyDef bdef = new BodyDef();
    bdef.position.set(160 / PPM, 200 / PPM);
    bdef.type = BodyDef.BodyType.DynamicBody;
    PolygonShape shape = new PolygonShape();
    shape.setAsBox(5 / PPM, 5 / PPM);
    bbody = world.createBody(bdef);
    Bodyarray.add(bbody);
    FixtureDef fdef = new FixtureDef();
    fdef.shape = shape;
    fdef.filter.categoryBits = BIT_BOX;
    fdef.filter.maskBits = BIT_PLATFORM | BIT_BALL;
    bbody.createFixture(fdef);
    bbody.setUserData(sprite);

在我的主要课程中,我用批处理我写道:

player.sprite.setRegion(player.getAnimationup().getKeyFrame(dt, true));
        dt += elapsedTime;
        player.render(batch);

不断更改动画取决于玩家是向右,向左,向上,向下转动。

我唯一的问题是它自己的精灵(动画效果很好)被绘制在屏幕的左下方(而不是0,0,它看起来像是得到了身体的x,y)但是仍然远离它)并且可以看到它在移动身体时附着在它上面(我设置控制来控制身体运动)并且我看到精灵随之移动。

例如我试图像往常一样用Gdx.app.log检查身体和精灵的X,Y的协调,并且两者都具有相同的精确X和Y.(ofc精灵有他的乘以PPM(将它放置为100)因为精灵不是物理身体)

导致精灵位置错误的原因是什么?

1 个答案:

答案 0 :(得分:1)

欢迎使用Stack Overflow!

你问题的答案是"不完全是。" Box2D为您提供了一个名为Body#setUserData()的方法,它允许您创建从Body到任何对象的引用(在本例中为Animation对象,但由您决定保持其位置同步。请参阅伪代码低于改编from the libGDX wiki

// Create an array to be filled with the bodies
// (better don't create a new one every time though)
Array<Body> bodies = new Array<Body>();
// Now fill the array with all bodies
world.getBodies(bodies);

for (Body b : bodies) {
    // Get the body's user data - in this example, our user 
    // data is an instance of the Entity class
    Animation anim = (Animation) b.getUserData();

    if (anim != null) {
        // Update the entities/sprites position and angle
        TextureRegion frame = anim.getKeyFrame( ... );
        // Now draw the frame using b.getPosition() and b.getAngle()
    }
}

顺便说一下,当你开始学习libGDX时,libGDX wiki是一个优秀的资源和参考。