项目:我正在制作一个简单的项目,我希望能够制作一个运动体并将其从x点移动到y点。似乎没有太多直接"创建运动体"。我一直在遵循一些关于实现运动学体的不同教程,因为我找不到一个指定如何正确地做到这一点。
问题:这似乎是一个简单的修复,但我只是无法找出问题是什么,因为我不完全理解如何实现一个运动学体。我认为问题在于这个代码kinematicBody.setLinearVelocity(0.0f, 1.0f);
,因为我得到一个错误在"setLinearVelocity"
声明"方法setLinearVelocity(float, float)是未定义的类型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() {
}
}
看起来好像你没有在任何地方使用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);
创建主体并为其分配fixture
Body testBody = world.createBody(tempBodyDef);
testBody.createFixture(tempFD);
使用完Shape后,不要忘记处理它。
tempShape.dispose();