实现移动运动体

问题描述 投票:0回答:1

项目:我正在制作一个简单的项目,我希望能够制作一个运动体并将其从点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() {  


    }  
 }  
java libgdx box2d kinematics
1个回答
3
投票

看起来好像您没有在任何地方使用fixtureDef 对象。创建主体后,您应该将其设置为主体。

创建运动体的方式与静态体没有太大区别。唯一的区别是如何定义 BodyDef 的类型。


创建运动体 它也可以是 StaticBody 或 DynamicBody。取决于您想要实现什么。

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

创建FixtureDefinition(描述灯具属性的定义) 还要创建一个形状并将其分配给夹具。 您可以修改 tempFD 的 firction、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();

你就完成了。

© www.soinside.com 2019 - 2024. All rights reserved.