2017-03-08 5 views
1

私はこのtutorialのような衝突検出のためにBulletラッパーを使ってLibgdxのContactListener派生クラスを作成しようとしていますが、別のクラスです。これは、レンダリングのためのクラスとゲームの世界を分離します。クラスRenderrender()メソッドでは、モデルインスタンスの配列をこの派生クラスに渡します。しかし、私はそれを実行すると、配列サイズがゼロであるために与える。ここで派生クラスがある:ここではなぜLibgdx BulletのContactListener派生クラスの配列サイズが常にゼロですか?

package com.anutrix.brickbreaker3d.Helpers; 

import com.badlogic.gdx.Gdx; 
import com.badlogic.gdx.graphics.g3d.ModelInstance; 
import com.badlogic.gdx.physics.bullet.collision.ContactListener; 
import com.badlogic.gdx.utils.Array; 

public class CollisionListener extends ContactListener { 

    private Array<ModelInstance> instances; 

    public CollisionListener() { 
     this.instances = new Array<ModelInstance>(); 
    } 

    public void setModelInstances(Array<ModelInstance> instances) { 
     this.instances = instances; 
    } 

    @Override 
    public boolean onContactAdded(int userValue0, int partId0, int index0, int userValue1, int partId1, int index1) { 
//instances.get(colObj1Wrap.getCollisionObject().getUserValue()).collided = false;error 
     Gdx.app.log("instances.size", Integer.toString(instances.size));//zero 
     Gdx.app.log("ddhbdfhd", "fhfgjfgj"); 
     return true; 
    } 
} 

は、レンダラクラスである:私は間違っ

package com.anutrix.brickbreaker3d.gameWorld; 

import com.anutrix.brickbreaker3d.gameObjects.Ball; 
import com.anutrix.brickbreaker3d.gameObjects.Brick; 
import com.badlogic.gdx.Gdx; 
import com.badlogic.gdx.graphics.GL20; 
import com.badlogic.gdx.graphics.PerspectiveCamera; 
import com.badlogic.gdx.graphics.g3d.Environment; 
import com.badlogic.gdx.graphics.g3d.ModelBatch; 
import com.badlogic.gdx.graphics.g3d.ModelInstance; 
import com.badlogic.gdx.graphics.g3d.attributes.ColorAttribute; 
import com.badlogic.gdx.graphics.g3d.environment.DirectionalLight; 
import com.badlogic.gdx.graphics.g3d.utils.CameraInputController; 
import com.badlogic.gdx.graphics.g3d.utils.ModelBuilder; 
import com.badlogic.gdx.physics.bullet.DebugDrawer; 
import com.badlogic.gdx.physics.bullet.collision.btCollisionDispatcher; 
import com.badlogic.gdx.physics.bullet.collision.btCollisionWorld; 
import com.badlogic.gdx.physics.bullet.collision.btDbvtBroadphase; 
import com.badlogic.gdx.physics.bullet.collision.btDefaultCollisionConfiguration; 
import com.badlogic.gdx.physics.bullet.linearmath.btIDebugDraw; 
import com.badlogic.gdx.utils.Array; 
import com.badlogic.gdx.utils.Disposable; 

public class GameRenderer implements Disposable { 

    private GameWorld gameWorld; 
    private PerspectiveCamera cam; 
    public ModelBatch modelBatch; 
    private CameraInputController camController; 
    private Environment environment; 
    public Array<ModelInstance> instances; 
    ModelBuilder mb = new ModelBuilder(); 
    btCollisionDispatcher dispatcher; 

    public GameRenderer(GameWorld world) { 
     this.modelBatch = new ModelBatch(); 
     this.environment = new Environment(); 
     this.instances = new Array<ModelInstance>(); 

     gameWorld = world; 
     cam = new PerspectiveCamera(67, Gdx.graphics.getWidth(), Gdx.graphics.getHeight()); 
     cam.position.set(10f, 10f, 0f); 
     cam.lookAt(0, 0, 0); 
     cam.near = 1f; 
     cam.far = 300f; 
     cam.update(); 

     camController = new CameraInputController(cam); 
     Gdx.input.setInputProcessor(camController); 
     environment.set(new ColorAttribute(ColorAttribute.AmbientLight, 0.4f, 0.4f, 0.4f, 1f)); 
     environment.add(new DirectionalLight().set(0.8f, 0.8f, 0.8f, -1f, -0.8f, -0.2f)); 


    } 

    public void render() { 
     //Gdx.app.log("GameRenderer", "render"); 
     Gdx.gl.glViewport(0, 0, Gdx.graphics.getWidth(), Gdx.graphics.getHeight()); 
     Gdx.gl.glClearColor(0f, 0.2f, 0.2f, 1); 
     Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT | GL20.GL_DEPTH_BUFFER_BIT); 

     for (Brick b : gameWorld.bricks) { 
      b.getObject().setUserValue(instances.size); 
      instances.add(b.getModelInstance()); 
     } 
     for (Ball b : gameWorld.balls) { 
      b.getObject().setUserValue(instances.size); 
      instances.add(b.getModelInstance()); 
     } 

     gameWorld.collisionListener.setModelInstances(instances); 

     modelBatch.begin(cam); 
     modelBatch.render(instances, environment); 
     modelBatch.end(); 

     instances.clear(); 

    } 

    @Override 
    public void dispose() { 
     modelBatch.dispose(); 
    } 

} 

何をしているのですか? setModelInstances()の中では、instances.sizeは正しいです。しかし、それを呼び出すたびにinstances.sizeは0になります。 また、(Javaは値渡しを使用しているので)参照渡しについてはわかりませんでした。だから、もし私がsetInstances()を一度だけ呼び出すと、(それがうまくいくと)より良いのでしょうか?

答えて

2

CollisionListener#instancesGameRenderer#instancesは、GameRenderer#render()メソッド内でgameWorld.collisionListener.setModelInstances(instances);を呼び出した後で同じ参照を指しています。

次に、メソッドの最後に、あなたが呼び出している:これはinstancesを一掃されるだろう

instances.clear(); 

。したがって、renderに電話するとサイズは0になります。


代わりに、あなたのsetModelInstancesメソッド内で、次のような新しいArrayインスタンスを作成することができます。

public void setModelInstances(Array<ModelInstance> instances) { 
    this.instances = new Array<>(instances); 
} 

は、この情報がお役に立てば幸い!

+0

次に、 'instances.clear();'をどのように置き換えることができますか?それを取り除くと、ループごとにインスタンス数が増えるだけです。 – Anutrix

+1

@Anutrix(参照を代入する代わりに) 'setModelInstances'で配列をコピーすることができます – UnholySheep

+0

私の更新された答えを見てください.. – anacron

関連する問題