我想使用Bullet在Libgdx中製作碰撞檢測器。在這裏,我想將一個碰撞對象的power
變量作爲參數傳遞給另一個對象的onCollision()
函數。這裏Ball
和Brick
延伸AbstractObject
。另外power
和onCollision()
在AbstractObject
中聲明,但在Brick
和Ball
中初始化。我在每個班級都設置了btCollisionObject.userData=this
。什麼是最有效的方法? 這是我目前的contactListener:如何將存儲爲java對象的對象變量傳遞給存儲爲java對象的另一個對象的Function?
package com.anutrix.brickbreaker3d.Helpers;
import com.anutrix.brickbreaker3d.gameObjects.AbstractObject;
import com.anutrix.brickbreaker3d.gameObjects.Ball;
import com.anutrix.brickbreaker3d.gameObjects.Brick;
import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.graphics.g3d.ModelInstance;
import com.badlogic.gdx.physics.bullet.collision.ContactListener;
import com.badlogic.gdx.physics.bullet.collision.btCollisionObject;
import com.badlogic.gdx.utils.Array;
public class CollisionListener extends ContactListener {
@Override
public boolean onContactAdded(btCollisionObject ob0, int partId0, int index0, btCollisionObject ob1, int partId1, int index1) {
Gdx.app.log("sdkjg", "fsfgsdg");
Ball bl = null;
Brick br = null;
AbstractObject aO0 = (AbstractObject) ob0.userData;
AbstractObject aO1 = (AbstractObject) ob1.userData;
if (aO0 instanceof Ball) {
bl = (Ball) aO0;
} else if (aO1 instanceof Ball) {
bl = (Ball) aO1;
}
if (aO0 instanceof Brick) {
br = (Brick) aO0;
} else if (aO1 instanceof Brick) {
br = (Brick) aO1;
}
bl.onCollision(br.power);
br.onCollision(bl.power);
return true;
}
}
這裏是Ball
類:
public class Ball extends AbstractObject {
public Integer power;
public Ball(Integer id, Integer type, Vector3 position) {
super(id, type, position);
modelInstance = new ModelInstance(Assets.instance.ball.get(type));
shape = new btSphereShape(0.2f);
body = new btCollisionObject();
body.setCollisionShape(shape);
super.setPosition(position);
this.power = type + 1;
this.body.setCollisionFlags(this.body.getCollisionFlags() | btCollisionObject.CollisionFlags.CF_CUSTOM_MATERIAL_CALLBACK);
active=true;
body.userData=this;
}
public Integer getPower() {
return power;
}
public void resetPower() {
this.power = this.getType()+1;
}
public void onCollision(Integer power) {
this.collided=true;
}
@Override
public void getDetails(){
Gdx.app.log("Life", power.toString());
Gdx.app.log("Active", Boolean.toString(this.active));
super.getDetails();
}
}
這裏的磚類:
package com.anutrix.brickbreaker3d.gameObjects;
import com.anutrix.brickbreaker3d.Helpers.Assets;
import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.graphics.g3d.ModelInstance;
import com.badlogic.gdx.math.Vector3;
import com.badlogic.gdx.physics.bullet.collision.btBoxShape;
import com.badlogic.gdx.physics.bullet.collision.btCollisionObject;
/**
*
* @author Anutrix
*/
public class Brick extends AbstractObject {
public Integer power;
public Brick(Integer id, Integer type, Vector3 position) {
super(id, type, position);
modelInstance = new ModelInstance(Assets.instance.brick.get(type));
shape = new btBoxShape(new Vector3(1f, 0.5f, 1f));
body = new btCollisionObject();
body.setCollisionShape(shape);
super.setPosition(position);
this.power = type + 1;
this.body.setCollisionFlags(this.body.getCollisionFlags() | btCollisionObject.CollisionFlags.CF_CUSTOM_MATERIAL_CALLBACK);
active=true;
body.userData=this;
}
public Integer getPower() {
return power;
}
public void onCollision(Integer power) {
this.power = this.power-power;
if(this.power<=0){
this.active=false;
}
this.collided=false;//reset
}
@Override
public void getDetails(){
Gdx.app.log("Life", power.toString());
Gdx.app.log("Active", Boolean.toString(this.active));
super.getDetails();
}
}
這裏是AbstractObject類:
package com.anutrix.brickbreaker3d.gameObjects;
import com.anutrix.brickbreaker3d.Helpers.Assets;
import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.graphics.g3d.ModelInstance;
import com.badlogic.gdx.math.Vector3;
import com.badlogic.gdx.physics.bullet.collision.btCollisionObject;
import com.badlogic.gdx.physics.bullet.collision.btCollisionShape;
public class AbstractObject {
private Integer id;
private Integer type;
private Vector3 position;
public ModelInstance modelInstance;
public btCollisionShape shape;
public btCollisionObject body;
public Integer power;
public boolean collided;
public boolean active;
public AbstractObject(Integer id, Integer type, Vector3 position) {
this.id = id;
this.type = type;
this.position = position;
this.collided = false;
}
public void setPosition(float x, float y, float z) {
this.setPosition(new Vector3(x, y, z));
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public Integer getType() {
return type;
}
public void setType(Integer type) {
this.type = type;
this.setModelInstance(new ModelInstance(Assets.instance.brick.get(type)));
}
public Vector3 getPosition() {
return position;
}
public void setPosition(Vector3 position) {
this.position = position;
this.modelInstance.transform.translate(position);
this.body.setWorldTransform(modelInstance.transform);
}
public ModelInstance getModelInstance() {
return modelInstance;
}
public void setModelInstance(ModelInstance modelInstance) {
this.modelInstance = modelInstance;
}
public btCollisionObject getObject() {
return body;
}
public void onCollision(Integer power){
}
public void getDetails() {
Gdx.app.log("ID", id.toString());
Gdx.app.log("Type", type.toString());
Gdx.app.log("Position", position.toString());
Gdx.app.log("Collision", Boolean.toString(collided));
Gdx.app.log("---------------", "---------------");
}
public void dispose() {
shape.dispose();
body.dispose();
Gdx.app.log(this.toString(), "dispose");
}
}
是否有替代所有的鑄造?鑄造會降低性能嗎?
請張貼'Ball'和'Brick'代碼,並解釋什麼是錯了你當前的代碼 – 2017-03-09 13:33:30
,我不相信你需要第二個if塊(假設兩個對象都不同)的否則,如果能換對於一個普通別人也 – efekctive
我會用一個抽象的'onCollision(INT)'和'getPower()''在你@RC取出一個連鑄圓的AbstractObject' – 2017-03-09 15:30:46