Collision detection works for real now.
This commit is contained in:
@@ -232,7 +232,7 @@ public class BombGameEntityCreator extends EntityCreatorBase{
|
|||||||
private void addRobotArm(EntityParameters parameters){
|
private void addRobotArm(EntityParameters parameters){
|
||||||
Entity robotArm = world.createEntity();
|
Entity robotArm = world.createEntity();
|
||||||
|
|
||||||
robotArm.addComponent(new GeometryComponent(new Vector3(-1.0f, 0.0f, 0.0f), new Matrix3(), new Vector3(1, 1, 1)));
|
robotArm.addComponent(new GeometryComponent(new Vector3(0.0f, 0.0f, 0.5f), new Matrix3(), new Vector3(1, 1, 1)));
|
||||||
robotArm.addComponent(new EnvironmentComponent(parameters.environment));
|
robotArm.addComponent(new EnvironmentComponent(parameters.environment));
|
||||||
robotArm.addComponent(new ShaderComponent(parameters.shader));
|
robotArm.addComponent(new ShaderComponent(parameters.shader));
|
||||||
robotArm.addComponent(new RenderModelComponent(robotArmModel));
|
robotArm.addComponent(new RenderModelComponent(robotArmModel));
|
||||||
|
|||||||
@@ -15,7 +15,6 @@
|
|||||||
*/
|
*/
|
||||||
package ve.ucv.ciens.ccg.nxtar.systems;
|
package ve.ucv.ciens.ccg.nxtar.systems;
|
||||||
|
|
||||||
import ve.ucv.ciens.ccg.nxtar.components.BombGameObjectTypeComponent;
|
|
||||||
import ve.ucv.ciens.ccg.nxtar.components.CollisionDetectionComponent;
|
import ve.ucv.ciens.ccg.nxtar.components.CollisionDetectionComponent;
|
||||||
import ve.ucv.ciens.ccg.nxtar.components.CollisionModelComponent;
|
import ve.ucv.ciens.ccg.nxtar.components.CollisionModelComponent;
|
||||||
import ve.ucv.ciens.ccg.nxtar.components.MarkerCodeComponent;
|
import ve.ucv.ciens.ccg.nxtar.components.MarkerCodeComponent;
|
||||||
@@ -28,6 +27,7 @@ import com.artemis.annotations.Mapper;
|
|||||||
import com.artemis.managers.GroupManager;
|
import com.artemis.managers.GroupManager;
|
||||||
import com.artemis.systems.EntityProcessingSystem;
|
import com.artemis.systems.EntityProcessingSystem;
|
||||||
import com.artemis.utils.ImmutableBag;
|
import com.artemis.utils.ImmutableBag;
|
||||||
|
import com.badlogic.gdx.Gdx;
|
||||||
import com.badlogic.gdx.math.collision.BoundingBox;
|
import com.badlogic.gdx.math.collision.BoundingBox;
|
||||||
|
|
||||||
public class CollisionDetectionSystem extends EntityProcessingSystem {
|
public class CollisionDetectionSystem extends EntityProcessingSystem {
|
||||||
@@ -36,13 +36,16 @@ public class CollisionDetectionSystem extends EntityProcessingSystem {
|
|||||||
@Mapper ComponentMapper<CollisionModelComponent> collisionModelMapper;
|
@Mapper ComponentMapper<CollisionModelComponent> collisionModelMapper;
|
||||||
@Mapper ComponentMapper<CollisionDetectionComponent> collisionDetectionMapper;
|
@Mapper ComponentMapper<CollisionDetectionComponent> collisionDetectionMapper;
|
||||||
@Mapper ComponentMapper<VisibilityComponent> visibilityMapper;
|
@Mapper ComponentMapper<VisibilityComponent> visibilityMapper;
|
||||||
@Mapper ComponentMapper<BombGameObjectTypeComponent> typeMapper;
|
|
||||||
|
|
||||||
private GroupManager groupManager;
|
private GroupManager groupManager;
|
||||||
|
private BoundingBox colBB;
|
||||||
|
private BoundingBox targetBB;
|
||||||
|
|
||||||
@SuppressWarnings("unchecked")
|
@SuppressWarnings("unchecked")
|
||||||
public CollisionDetectionSystem(){
|
public CollisionDetectionSystem(){
|
||||||
super(Aspect.getAspectForAll(CollisionModelComponent.class, CollisionDetectionComponent.class).exclude(MarkerCodeComponent.class));
|
super(Aspect.getAspectForAll(CollisionModelComponent.class, CollisionDetectionComponent.class).exclude(MarkerCodeComponent.class));
|
||||||
|
colBB = new BoundingBox();
|
||||||
|
targetBB = new BoundingBox();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -52,35 +55,50 @@ public class CollisionDetectionSystem extends EntityProcessingSystem {
|
|||||||
CollisionModelComponent target;
|
CollisionModelComponent target;
|
||||||
CollisionDetectionComponent onCollision;
|
CollisionDetectionComponent onCollision;
|
||||||
CollisionDetectionComponent onCollisionTarget;
|
CollisionDetectionComponent onCollisionTarget;
|
||||||
BoundingBox colBB = new BoundingBox();
|
|
||||||
BoundingBox targetBB = new BoundingBox();
|
|
||||||
ImmutableBag<Entity> collidables;
|
ImmutableBag<Entity> collidables;
|
||||||
|
|
||||||
groupManager = this.world.getManager(GroupManager.class);
|
// Get this entity's known necessary components.
|
||||||
collidables = groupManager.getEntities(COLLIDABLE_OBJECT);
|
|
||||||
|
|
||||||
collision = collisionModelMapper.get(e);
|
collision = collisionModelMapper.get(e);
|
||||||
onCollision = collisionDetectionMapper.get(e);
|
onCollision = collisionDetectionMapper.get(e);
|
||||||
|
|
||||||
|
// Get all other entities this entity can collide with.
|
||||||
|
groupManager = this.world.getManager(GroupManager.class);
|
||||||
|
collidables = groupManager.getEntities(COLLIDABLE_OBJECT);
|
||||||
|
|
||||||
for(int i = 0; i < collidables.size(); ++i){
|
for(int i = 0; i < collidables.size(); ++i){
|
||||||
|
// Try to get the necessary components for the collidable entity.
|
||||||
target = collisionModelMapper.getSafe(collidables.get(i));
|
target = collisionModelMapper.getSafe(collidables.get(i));
|
||||||
visibility = visibilityMapper.getSafe(collidables.get(i));
|
visibility = visibilityMapper.getSafe(collidables.get(i));
|
||||||
onCollisionTarget = collisionDetectionMapper.getSafe(collidables.get(i));
|
onCollisionTarget = collisionDetectionMapper.getSafe(collidables.get(i));
|
||||||
|
|
||||||
|
// If any of the needed components does not exist then proceed to the next entity.
|
||||||
if(target == null || visibility == null || onCollisionTarget == null) continue;
|
if(target == null || visibility == null || onCollisionTarget == null) continue;
|
||||||
|
|
||||||
|
// Id the target is visible then examine the collision. Else there is no collision possible.
|
||||||
if(visibility.visible){
|
if(visibility.visible){
|
||||||
|
// Get the bounding box for both entities.
|
||||||
collision.instance.calculateBoundingBox(colBB);
|
collision.instance.calculateBoundingBox(colBB);
|
||||||
target.instance.calculateBoundingBox(targetBB);
|
target.instance.calculateBoundingBox(targetBB);
|
||||||
|
|
||||||
if(colBB.contains(targetBB)){
|
// Apply the model matrix to the bounding boxes.
|
||||||
|
colBB.mul(collision.instance.transform);
|
||||||
|
targetBB.mul(target.instance.transform);
|
||||||
|
|
||||||
|
// If the bounding boxes intersect then there is a collision.
|
||||||
|
if(colBB.intersects(targetBB) || targetBB.intersects(colBB)){
|
||||||
|
Gdx.app.log("TAG", "Collision hit.");
|
||||||
onCollision.colliding = true;
|
onCollision.colliding = true;
|
||||||
onCollisionTarget.colliding = true;
|
onCollisionTarget.colliding = true;
|
||||||
|
break;
|
||||||
|
}else{
|
||||||
|
Gdx.app.log("TAG", "Collision miss.");
|
||||||
|
onCollision.colliding = false;
|
||||||
|
onCollisionTarget.colliding = false;
|
||||||
|
}
|
||||||
}else{
|
}else{
|
||||||
onCollision.colliding = false;
|
onCollision.colliding = false;
|
||||||
onCollisionTarget.colliding = false;
|
onCollisionTarget.colliding = false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -141,13 +141,13 @@ public class RobotArmPositioningSystem extends EntityProcessingSystem {
|
|||||||
|
|
||||||
Gdx.app.log(TAG, CLASS_NAME + ".autoMove(): Current position: " + Utils.vector2String(geometry.position));
|
Gdx.app.log(TAG, CLASS_NAME + ".autoMove(): Current position: " + Utils.vector2String(geometry.position));
|
||||||
|
|
||||||
if(auto.distance >= 1.0f || collision.colliding){
|
if(auto.distance <= 0.0f){
|
||||||
auto.forward = false;
|
|
||||||
Gdx.app.log(TAG, CLASS_NAME + ".autoMove(): Going backwards now.");
|
|
||||||
}else if(auto.distance <= 0.0f){
|
|
||||||
auto.forward = true;
|
auto.forward = true;
|
||||||
auto.moving = false;
|
auto.moving = false;
|
||||||
Gdx.app.log(TAG, CLASS_NAME + ".autoMove(): Going forward now.");
|
Gdx.app.log(TAG, CLASS_NAME + ".autoMove(): Going forward now.");
|
||||||
|
}else if(auto.distance >= 1.0f || collision.colliding){
|
||||||
|
auto.forward = false;
|
||||||
|
Gdx.app.log(TAG, CLASS_NAME + ".autoMove(): Going backwards now.");
|
||||||
}
|
}
|
||||||
|
|
||||||
}else return;
|
}else return;
|
||||||
|
|||||||
Reference in New Issue
Block a user