【问题标题】:box2d libgdx - 'binding' a box2d body to a sprite or other objectbox2d libgdx - 将 box2d 主体“绑定”到精灵或其他对象
【发布时间】:2015-11-17 01:11:19
【问题描述】:

提前感谢您的帮助! 我正在学习 box2d 教程,了解如何在我的游戏中添加实体,但它们似乎只是在使用调试器绘制。

我只是在练习,我有一个 zelda snes 风格的游戏地图和英雄角色加载很好。在我的游戏地图中,我有对象(矩形地图对象)支撑树桩矩形(我想用它来阻止英雄穿过树)。

在这个例子中可以使用Box2d 吗?我不想要任何gravity/friction/mass 等,但我想做的是从树桩矩形中制作“静态物体”,我可以检测到与英雄矩形的碰撞。当然,我可以编写自己的代码来检查碰撞,但它总是有问题,我正在努力想出正确的方法来循环所有树桩矩形并阻止英雄穿过它。

(注意:我也是编写平台游戏的一部分。一切正常,他登陆平台,但我没有使用Box2d,例如,当你走过平台的边缘,它会一直走,直到你跳起来,然后它会检测到平台的位置。-这就是为什么我想学习box2d)

box2d 可以制作这些静态物体(以我上面所说的方式),如果可以,如何将这些物体链接到您已经拥有的精灵(以及我从 TMX file 中提取的矩形数组)

希望这对人们来说是清楚的。非常感谢

【问题讨论】:

    标签: java libgdx box2d scene2d


    【解决方案1】:

    您应该为角色和树木创建固定装置

    vertexArray = new Vector2[3];
        vertexArray[0] = new Vector2(0, 0);
        vertexArray[1] = new Vector2(2, 0);
        vertexArray[2] = new Vector2(1, 3);
    
        treePolygonShape = new PolygonShape();
        treePolygonShape.set(vertexArray);
    
        fixtureTree = new FixtureDef();
        fixtureTree.shape = treePolygonShape;
        fixtureTree.filter.categoryBits = Game.TREE;  // 0x0001 short int
        fixtureTree.filter.maskBits = Game.CHARACTER; //0x0002 short int
    
        characterShape = new CircleShape();
        shape.setRadius(1);
    
        fixtureCharacter = new FixtureDef();
        fixtureCharacter.shape = characterShape;
        fixtureCharacter.filter.categoryBits = Game.CHARACTER;
        fixtureCharacter.filter.maskBits =  Game.TREE;
    

    ...

    创建身体

        characterBodyDef.type = BodyDef.BodyType.KinematicBody; //I suppose your body is kinematic but it can be dynamic too
    
        Body body = world.createBody(characterBodyDef);
        body.setUserData(characterView); //display object of your character which is linked to the physical body in this way
        characterView.setBody(body); // you can create this setter to have a reference to the physical body from display object
        body.createFixture(fixtureCharacter);
    

    ...

        treeBodyDef.type = BodyDef.BodyType.StaticBody; 
        treeBodyDef.position.set(treeX, treeY); //you can set tree position here , or later using setTransform(x, y, angle) function
    
        Body treeBody = world.createBody(treeBodyDef);
        treeBody.setUserData(treeView); //display object of your tree linked to the body
        treeView.setBody(treeBody); // you can create this setter to have a reference to the physical body from display object
        treeBody.createFixture(fixtureTree);
    

    您的显示对象坐标应遵循物理身体的位置(为方便起见,您可以将它们与一些系数相乘,例如 PIXELS_TO_METERS = 100)

    现在可以

    body.setLinearVelocity(velocityX, velocityY);
    

    到你的角色的身体和渲染(绘制或行动)功能,你可以同步显示对象坐标与身体的位置 为树木设置一个位置,你可以

    treeBody.setTransform(x, y, angle) 
    

    使用此功能

    我希望这对你的游戏有所帮助;)祝你好运

    【讨论】:

    • 您好,非常感谢您提供如此明确的答案。请你告诉我,如何处理角色走进树的事件。例如,如果我只是让速度 = 0,它会让玩家永远无法接触树,不是吗??
    • 你应该对树形体和角色体类型都使用运动学类型,因为在 box2d 中运动学体和静态体不会相互碰撞,因为它们都有无限的质量。所以如果你的角色是运动型的,树也应该是运动型的,只是你不会为它们设置任何速度。但是如果你想要角色的动态类型,你可以为树木和地面使用静态类型......这取决于游戏玩法
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多