2017-10-10 5 views
1

J'ai regardé d'autres threads, et malgré tout ce que j'ai essayé, les formes que j'ai créées dans box2d ne sont pas rendues. C'est très bizarre, et j'espère que vous pourrez apporter une solution.Box2D Formes non-Rendu

public class worldRender { 
fighterGame game; 
PlayScreen renderGame; 
private Viewport gamePort = new StretchViewport(1020/game.PPM,760/game.PPM); 
World world = new World(new Vector2(0,-10), true); 
Box2DDebugRenderer b2dr = new Box2DDebugRenderer(); 
private OrthographicCamera gameCam = new OrthographicCamera(); 
BodyDef bDef = new BodyDef(); 
public Body b2body; 
FixtureDef fixtureDef = new FixtureDef(); 
ShapeRenderer shapeRender; 


public worldRender() { 

    gameCam = new OrthographicCamera(Gdx.graphics.getWidth(), Gdx.graphics.getHeight()); 
    gameCam.position.set(1020/2, 760/2, 0); 


} 

public worldRender(float dt) { 

    gameCam.update(); 
    world.step(1/60f, 6, 2); 


    b2dr.render(world, gameCam.combined); 
    bodyRender(); 

} 
public void bodyRender() { 

    BodyDef bdef = new BodyDef(); 
    bdef.position.set(0.0f/game.PPM,4.0f/game.PPM); 
    bdef.type = BodyDef.BodyType.DynamicBody; 
    b2body = world.createBody(bdef); 
    FixtureDef fdef = new FixtureDef(); 
    fdef.friction = 0.25f; 
    CircleShape shape = new CircleShape(); 
    shape.setRadius(5); 
    fdef.shape = shape; 
    fdef.density = 1.0f; 
    b2body.createFixture(fdef); 


} 

}

+0

quelle est la valeur de 'PPM', est-ce une constante statique?, Tout d'abord' gameCam' viewport ne dépend pas de 'gamePort' mais vous définissez la position par le paramètre viewport. De plus, votre code n'est pas complet ... depuis que vous appelez quelle méthode – Aryan

+0

Pour toute personne intéressée, cette question est discutée plus loin ici: https://www.reddit.com/r/libgdx/comments/75lio3/box2d_shapes_not_rendering/ –

+0

Créez-vous une nouvelle instance de 'worldRender' chaque fois que vous rendez la scène? Quand est appelé 'worldRender (float dt)'? –

Répondre

0

Je vais à la liste de quelques solutions car tout est clair dans l'extrait:

  1. Etes-vous sûr la méthode worldRender() est en cours d'exécution
    • Si vous utilisez Game and Screen, assurez-vous que la méthode render() de votre jeu appelle super() sinon votre méthode Screen render() ne sera pas exécutée;
  2. Comme mentionné précédemment est la valeur de PPM correcte/quel est-il?

Est-ce tirage au sort:

// First we create a body definition 
BodyDef bodyDef = new BodyDef(); 
bodyDef.type = BodyType.StaticBody; 

// Set our body's starting position in the world 
bodyDef.position.set(50, 50); 

// Create our body in the world using our body definition 
Body body = world.createBody(bodyDef); 

// Create a circle shape and set its radius to 6 
CircleShape circle = new CircleShape(); 
circle.setRadius(10f); 

// Create a fixture definition to apply our shape to 
FixtureDef fixtureDef = new FixtureDef(); 
fixtureDef.shape = circle; 

// Create our fixture and attach it to the body 
Fixture fixture = body.createFixture(fixtureDef); 

// Remember to dispose of any shapes after you're done with them! 
// BodyDef and FixtureDef don't need disposing, but shapes do. 
circle.dispose(); 

Cela devrait dessiner un cercle de rayon de 10 à x = 10, y = 10 (assurez-vous que ces points sont dans votre port vue

+0

Oui, ces parties du programme sont en cours d'exécution, j'ai testé cela en faisant println dans ces sections et il apparaît. Le PPM est de 100 – SkinnySpangler

0

je le ferais. suggère de nettoyer un peu votre code, et d'étudier d'autres tutoriels, cela résoudra probablement vos problèmes, mais laissez-moi vous donner quelques conseils pour vous aider:

Je suspecte que vous créez un objet worldRender à chaque frame. Java est un ga le langage collecté, ce qui aura un impact considérable sur vos performances. Persister autant d'objets que possible. Dans mes jeux les plus gros, je crée à côté de 0 objets chaque rendu et logique de jeu. But pour cela.

Enfin, ce qui va probablement résoudre votre problème: la caméra que vous utilisez pour rendre votre box2ddebugrenderer ("dbrndr") a des pixels d'écran comme unités. Le dbrndr utilise des mètres comme unités de rendu. Vous devez donner au dbrndr sa propre caméra en mètres. Votre méthode actuelle dessine un cercle large de 10 pixels à 0/4 pixels dans le coin inférieur gauche.

Créez-vous votre monde avec gravité? si oui, le cercle tombe instantanément de votre écran ... Oui, vous le faites.

Vous pourriez même voir votre cercle pour une fraction de seconde dans le coin inférieur gauche après le démarrage ... étant donné que vous rendez avant de faire la logique box2d.

Veuillez jeter() tous les objets que vous créez, sinon la mémoire qu'ils occupent n'est pas libre par la suite.