2014-06-25 42 views
1

项目:我正在制作一个简单的项目,我希望能够制作一个运动体并将其从点x移动到y。似乎没有太多直接的“创造运动机构”。我一直在遵循一些关于实现运动物体的不同教程,因为我找不到指定如何正确执行运动物体的教程。libgdx - 实现移动的运动主体

问题:这似乎是一个简单的修复,但我只是无法弄清楚是什么问题,因为我不完全理解如何实现运动机构。我认为,问题就出在这个代码kinematicBody.setLinearVelocity(0.0f, 1.0f);,因为我得到了"setLinearVelocity"一个错误,说明“的方法setLinearVelocity(浮动,浮动)是未定义的类型BodyDef”我觉得我在这里做得不对

成果我想要:我希望能够创建一个从x点移动到y点的运动体。

这里是我的相关代码:

package com.mohamed.JungleFighter; 

import com.badlogic.gdx.ApplicationAdapter; 
import com.badlogic.gdx.Game; 
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.SpriteBatch; 
import com.badlogic.gdx.math.Vector2; 
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.CircleShape; 
import com.badlogic.gdx.physics.box2d.FixtureDef; 
import com.badlogic.gdx.physics.box2d.PolygonShape; 
import com.badlogic.gdx.physics.box2d.World; 
import com.sun.xml.internal.ws.wsdl.writer.document.soap.Body; 

public class JungleFighter extends Game { 


    World world = new World(new Vector2(0, -100), true); 
    Box2DDebugRenderer debugRenderer; 
    OrthographicCamera camera; 
    static final float STEP=1/60f; 
    static final int VELOCITYITERATIONS=6; 
    static final int POSITIONITERATIONS=2; 
    static final float WORLD_TO_BOX=0.01f; 
    static final float BOX_WORLD_TO=100f; 
    @Override 
    public void create() {    
     camera = new OrthographicCamera(); 
     camera.viewportHeight = 320; 
     camera.viewportWidth = 480; 
     camera.position.set(camera.viewportWidth * .5f, camera.viewportHeight * .5f, 0f); 
     camera.update(); 

//test platform 3 
      BodyDef kinematicBody =new BodyDef(); 

     kinematicBody.type = BodyType.KinematicBody; 
     kinematicBody.position.set(100, 250); 

     PolygonShape shape = new PolygonShape(); 
     shape.setAsBox(50f, 25f); 

     fixtureDef.shape = shape; 
     fixtureDef.density = 0; 
     fixtureDef.friction = 0; 
     fixtureDef.restitution = 0; 

     kinematicBody.setLinearVelocity(0.0f, 1.0f); 


     // Create our body in the world using our body definition 
     world.createBody(kinematicBody).createFixture(shape, 50.0f); 
     shape.dispose(); 


     debugRenderer = new Box2DDebugRenderer(); 
    } 
    @Override 
    public void dispose() { 
    } 
    @Override 
    public void render() {    
     Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT); 
     debugRenderer.render(world, camera.combined); 
     world.step(STEP, VELOCITYITERATIONS, POSITIONITERATIONS); 
    } 
    @Override 
    public void resize(int width, int height) { 
    } 
    @Override 
    public void pause() { 
    } 
    @Override 
    public void resume() { 


    } 
} 

回答

1

它,如果你不使用fixtureDef对象出现在任何地方。一旦它被创建,你应该将它设置到身体上。

您创建可调体的方式与静体并无太大区别。唯一的区别是你如何定义BodyDef的类型。


创建一个运动体 这可能是一个StaticBody或DynamicBody过。取决于你想完成什么。

BodyDef tempBodyDef = new BodyDef(); 
tempBodyDef.type = BodyType.KinematicBody; 

创建FixtureDefinition 另外创建形状,并且将其分配给固定装置(描述夹具的性能的一个)。 你可以修改tempFD的契合,isSensor等属性来获得你想要的结果。

FixtureDef tempFD = new FixtureDef(); 
PolygonShape tempShape = new PolygonShape(); 
tempFD.shape = tempShape; 

形状为主体的中心将在0,0

Vector2 tempVector = new Vector2(); 
tempVector.x = 0; 
tempVector.y = 0; 

设置人体的形状的大小和位置。 注意我正在使用宽度和高度的一半,因为这是setAsBox函数需要的。

tempShape.setAsBox(myWidth/2f, myHeight/2f, tempVector, myAngle); 
tempBodyDef.position.set(myXPosition, myYPosition); 

创建主体和固定分配给它

Body testBody = world.createBody(tempBodyDef); 
testBody.createFixture(tempFD); 

不要忘记,一旦你用它做处置形状。

tempShape.dispose(); 

然后你就完成了。

+1

感谢@cavpollo,工作,我如何获得运动机构从点x移动到y? “kinematicBody.setLinearVelocity(-200.0f,200。0f);“仍然没有工作,我仍然得到错误说”方法setLinearVelocity(float,float)未定义类型BodyDef“ – RooneyMUFC

+0

@RoneyNUFC,setLinearVelocity方法应该在Body上调用(它是testBody变量上面的例子),而不是BodyDef,这只是一个临时的便利类来描述身体属性。 –

+0

@WillKru我试着做Body bodyBody = world.createBody(tempBodyDef); testBody.createFixture(tempFD);但那似乎不为我的程序工作,所以我修改它为world.createBody(testBody).createFixture(tempshape,50.0f);编译 – RooneyMUFC