libgdx - реализация движущегося кинематического тела

проект: я делаю простой проект, в котором хочу создать кинематическое тело и переместить его из точки 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() {  


    }  
 }  

person RooneyMUFC    schedule 25.06.2014    source источник


Ответы (1)


Похоже, вы нигде не используете объект fixdef. Вы должны установить его в тело после его создания.

Способ создания кинематического тела не сильно отличается от статического тела. Единственная разница будет заключаться в том, как вы определяете тип BodyDef.


Создание кинематического тела Это также может быть StaticBody или DynamicBody. Зависит от того, чего вы хотите достичь.

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

Создайте FixtureDefinition (тот, который описывает свойства прибора). Также создайте форму и назначьте ее прибору. Вы можете изменить свойства firction, isSensor и т. д. tempFD, чтобы получить желаемые результаты.

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();

Готово.

person cavpollo    schedule 25.06.2014
comment
спасибо @cavpollo, это сработало, как мне заставить кинематическое тело двигаться из точки x в y? kinematicBody.setLinearVelocity(-200.0f, 200.0f); все еще не работает, я все еще получаю сообщение об ошибке: метод setLinearVelocity (float, float) не определен для типа BodyDef - person RooneyMUFC; 26.06.2014
comment
@RooneyMUFC, метод setLinearVelocity следует вызывать для тела (которое является переменной testBody в приведенном выше примере), а не для BodyDef, который является просто временным удобным классом для описания свойств тела. - person Will Kru; 26.06.2014
comment
@WillKru я пытался сделать Body testBody = world.createBody(tempBodyDef); testBody.createFixture (tempFD); но это не работает для моей программы, поэтому я изменил ее на world.createBody(testBody).createFixture(tempshape, 50.0f); который составил - person RooneyMUFC; 26.06.2014
comment
когда я пытаюсь Body testBody = world.createBody(kinematicBody); я получаю эту ошибку Несоответствие типа: невозможно преобразовать из com.badlogic.gdx.physics.box2d.Body в com.sun.xml.internal.ws.wsdl.writer.document.soap.Body - person RooneyMUFC; 26.06.2014
comment
Убедитесь, что ваш импорт правильный. В верхней части документа замените com.sun.xml.internal.ws.wsdl.writer.document.soap.Body на com.badlogic.gdx.physics.box2d.Body. LibGDX поддерживает метод createFixture(FixtureDef), поэтому, возможно, что-то не так с вашей стороны. Я бы порекомендовал посетить IRC-канал libGDX, если вам нужна немедленная помощь, люди там действительно помогут. - person Will Kru; 26.06.2014