package com.deftwun.zombiecopter.systems; import com.badlogic.ashley.core.Entity; import com.badlogic.ashley.core.EntityListener; import com.badlogic.ashley.core.Family; import com.badlogic.ashley.systems.IteratingSystem; import com.badlogic.gdx.graphics.g2d.Sprite; import com.badlogic.gdx.graphics.g2d.SpriteBatch; import com.badlogic.gdx.math.MathUtils; import com.badlogic.gdx.math.Vector2; import com.badlogic.gdx.physics.box2d.Body; import com.badlogic.gdx.utils.Logger; import com.badlogic.gdx.utils.ObjectMap; import com.badlogic.gdx.utils.ObjectSet; import com.deftwun.zombiecopter.App; import com.deftwun.zombiecopter.SpriteLayer; import com.deftwun.zombiecopter.components.PhysicsComponent; import com.deftwun.zombiecopter.components.SpriteComponent; public class SpriteRenderSystem extends IteratingSystem implements EntityListener{ private Logger logger; private int LOG_LEVEL = Logger.INFO; private SpriteBatch batch; private ObjectMap<SpriteLayer,ObjectSet<Sprite>> spriteLayers = new ObjectMap<SpriteLayer,ObjectSet<Sprite>>(); //private SpriteLayer[] layerNames = SpriteLayer.values(); @SuppressWarnings("unchecked") public SpriteRenderSystem() { super(Family.all(PhysicsComponent.class,SpriteComponent.class).get()); logger = new Logger("SpriteRenderSystem",LOG_LEVEL); logger.debug("initializing"); batch = new SpriteBatch(); for (SpriteLayer l : SpriteLayer.values()){ spriteLayers.put(l, new ObjectSet<Sprite>()); } } @Override protected void processEntity(Entity entity, float deltaTime) { SpriteComponent spriteCom = App.engine.mappers.sprite.get(entity); PhysicsComponent physics = App.engine.mappers.physics.get(entity); Vector2 pixelPosition; float angleDegrees; for (ObjectMap.Entry<String,Sprite> entry: spriteCom.spriteMap.entries()){ Body b = physics.getBody(entry.key); if (b == null){ pixelPosition = physics.getPosition().scl(App.engine.PIXELS_PER_METER); angleDegrees = physics.getRotation(); } else { pixelPosition = b.getWorldCenter().scl(App.engine.PIXELS_PER_METER); angleDegrees = b.getAngle() * MathUtils.radDeg; } Sprite s = entry.value; s.setCenter(pixelPosition.x,pixelPosition.y); s.setRotation(angleDegrees); //s.setFlip(spriteCom.flipX,spriteCom.flipY); } } public void render(){ logger.debug("Render"); batch.setProjectionMatrix(App.engine.systems.camera.getCamera().combined); batch.begin(); for (SpriteLayer l : SpriteLayer.values()){ for (Sprite s : spriteLayers.get(l)){ //Camera Culling float spriteRadius = s.getWidth() < s.getHeight() ? s.getHeight() : s.getWidth(); if (App.engine.systems.camera.getCamera().frustum.sphereInFrustum(s.getX(), s.getY(), 0, spriteRadius)) {s.draw(batch);} } } batch.end(); } @Override public void entityAdded(Entity entity) { SpriteComponent spriteCom = App.engine.mappers.sprite.get(entity); if (spriteCom == null) return; logger.debug("SpriteComponent added " + entity); for (Sprite s : spriteCom.spriteMap.values()){ spriteLayers.get(spriteCom.layer).add(s); } } @Override public void entityRemoved(Entity entity) { SpriteComponent spriteCom = App.engine.mappers.sprite.get(entity); if (spriteCom == null) return; logger.debug("SpriteComponent removed " + entity); for (Sprite s : spriteCom.spriteMap.values()){ spriteLayers.get(spriteCom.layer).remove(s); } } }