Fix screen wrapping math
Rather than place entities directly on the screen edge boundary, add the distance they were beyond the screen edge. Store aabb in ModelComponent for use by multiple systems.
This commit is contained in:
parent
22fc504619
commit
d8b82c4fee
@ -1,10 +1,11 @@
|
|||||||
package com.me.asteroids.components;
|
package com.me.asteroids.components;
|
||||||
|
|
||||||
import com.badlogic.gdx.math.Polygon;
|
import com.badlogic.gdx.math.Polygon;
|
||||||
|
import com.badlogic.gdx.math.Rectangle;
|
||||||
import com.me.common.ecs.Component;
|
import com.me.common.ecs.Component;
|
||||||
|
|
||||||
public class ModelComponent extends Component {
|
public class ModelComponent extends Component {
|
||||||
|
|
||||||
public Polygon model;
|
public Polygon model;
|
||||||
|
public Rectangle aabb;
|
||||||
}
|
}
|
||||||
|
@ -41,6 +41,7 @@ public class MovementSystem extends EntitySystem {
|
|||||||
Polygon model = modelComponent.model;
|
Polygon model = modelComponent.model;
|
||||||
model.setPosition(position.x, position.y);
|
model.setPosition(position.x, position.y);
|
||||||
model.setRotation(positionComponent.rotation - 90);
|
model.setRotation(positionComponent.rotation - 90);
|
||||||
|
modelComponent.aabb = model.getBoundingRectangle();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,6 +1,5 @@
|
|||||||
package com.me.asteroids.systems;
|
package com.me.asteroids.systems;
|
||||||
|
|
||||||
import com.badlogic.gdx.math.Polygon;
|
|
||||||
import com.badlogic.gdx.math.Rectangle;
|
import com.badlogic.gdx.math.Rectangle;
|
||||||
import com.badlogic.gdx.math.Vector2;
|
import com.badlogic.gdx.math.Vector2;
|
||||||
import com.me.asteroids.Constants;
|
import com.me.asteroids.Constants;
|
||||||
@ -21,17 +20,16 @@ public class ScreenWrapSystem extends EntitySystem {
|
|||||||
ModelComponent modelComponent = entity.getComponent(ModelComponent.class);
|
ModelComponent modelComponent = entity.getComponent(ModelComponent.class);
|
||||||
|
|
||||||
Vector2 position = positionComponent.position;
|
Vector2 position = positionComponent.position;
|
||||||
Polygon model = modelComponent.model;
|
Rectangle aabb = modelComponent.aabb;
|
||||||
Rectangle aabb = model.getBoundingRectangle();
|
|
||||||
|
|
||||||
// Check top/bottom edges
|
// Check top/bottom edges
|
||||||
float minY = aabb.y;
|
float minY = aabb.y;
|
||||||
float maxY = minY + aabb.height;
|
float maxY = minY + aabb.height;
|
||||||
if (minY > Constants.HEIGHT) {
|
if (minY > Constants.HEIGHT) {
|
||||||
position.y = position.y - maxY;
|
position.y = (position.y - maxY) + (minY - Constants.HEIGHT);
|
||||||
return;
|
return;
|
||||||
} else if (maxY < 0) {
|
} else if (maxY < 0) {
|
||||||
position.y = Constants.HEIGHT + (position.y - minY);
|
position.y = Constants.HEIGHT + (position.y - minY) + maxY;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -39,9 +37,9 @@ public class ScreenWrapSystem extends EntitySystem {
|
|||||||
float minX = aabb.x;
|
float minX = aabb.x;
|
||||||
float maxX = minX + aabb.width;
|
float maxX = minX + aabb.width;
|
||||||
if (maxX < 0) {
|
if (maxX < 0) {
|
||||||
position.x = Constants.WIDTH + (position.x - minX);
|
position.x = Constants.WIDTH + (position.x - minX) + maxX;
|
||||||
} else if (minX > Constants.WIDTH) {
|
} else if (minX > Constants.WIDTH) {
|
||||||
position.x = position.x - maxX;
|
position.x = (position.x - maxX) + (minX - Constants.WIDTH);
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user