package it.marteEngine;
import it.marteEngine.entity.Entity;
import java.util.HashMap;
import java.util.Map;
import org.newdawn.slick.Color;
import org.newdawn.slick.GameContainer;
import org.newdawn.slick.Graphics;
import org.newdawn.slick.SlickException;
import org.newdawn.slick.geom.RoundedRectangle;
import org.newdawn.slick.particles.ParticleSystem;
import org.newdawn.slick.state.StateBasedGame;
/**
* Marte Engine Utility class
*
* @author RandomTower
* @project MarteEngine
*/
public class ME {
/** true if debug is enabled, shows hitbox of entities **/
public static boolean debugEnabled = false;
/** place debug information on top or at bottom **/
public static boolean debugWindowAtTop = true;
/** key to activate debug mode **/
public static int keyToggleDebug = -1;
/** default border color of hitbox in debug mode **/
public static Color borderColor = Color.red;
/** key for restarting game **/
public static int keyRestart = -1;
/** key for mute music and sounds **/
public static int keyMuteMusic = -1;
public static boolean playMusic = true;
/** key for full screen mode **/
public static int keyFullScreen = -1;
/** x scale factor for graphics, default 1 (nothing) **/
public static float scaleX = 1;
/** y scale factor for graphics, default 1 (nothing) **/
public static float scaleY = 1;
/** top z order **/
public static final Integer Z_LEVEL_TOP = 100;
public static final String WALK_LEFT = "walk_Left";
public static final String WALK_RIGHT = "walk_Right";
public static final String WALK_UP = "walk_Up";
public static final String WALK_DOWN = "walk_Down";
/** game attributes **/
public static Map<String, Object> attributes = new HashMap<String, Object>();
public static World world;
/** do we base time calculations on delta timing or on frames per second? */
public static boolean useDeltaTiming = false;
/** value of current delta of update call. might be helpful here */
public static int delta;
/** the frames per seconds we targeted in our main class */
public static int targetFrameRate;
public static ParticleSystem ps;
public static boolean renderParticle = false;
public static void setTargetFrameRate(GameContainer container,
int targetframerate) {
container.setTargetFrameRate(targetframerate);
ME.targetFrameRate = targetframerate;
}
/**
* Update entities and add new entities and remove old entities
*
* @param container
* @param delta
* @throws SlickException
*/
public static void update(GameContainer container, StateBasedGame game,
int delta) throws SlickException {
if (container == null)
throw new SlickException("no container set");
if (world == null)
throw new SlickException("no world set");
// special key handling
if (keyToggleDebug != -1) {
if (container.getInput().isKeyPressed(keyToggleDebug)) {
debugEnabled = !debugEnabled;
}
}
if (keyRestart != -1) {
if (container.getInput().isKeyPressed(keyRestart)) {
ME.world.clear();
ME.world.init(container, game);
// TODO: go to first state?
}
}
if (keyMuteMusic != -1) {
if (container.getInput().isKeyPressed(keyMuteMusic)) {
playMusic = !playMusic;
muteMusic();
}
}
if (keyFullScreen != -1) {
if (container.getInput().isKeyPressed(keyFullScreen)) {
container
.setFullscreen(!container.isFullscreen());
}
}
if (ME.ps != null) {
ME.ps.update(delta);
}
}
/**
* Render entities following camera, show debug information if in debug mode
*
* @param container
* @param g
* @throws SlickException
*/
public static void render(GameContainer container, StateBasedGame game,
Graphics g) throws SlickException {
if (container == null)
throw new SlickException("no container set");
if (world == null)
throw new SlickException("no world set");
if (scaleX != 1 || scaleY != 1)
g.scale(scaleX, scaleY);
// render debug stuff
int ypos = 1;
if (debugWindowAtTop)
ypos = 1;
else
ypos = container.getHeight() - 40;
if (debugEnabled) {
String text = "Entities: " + world.getEntities().size()
+ ", rendered Entities: " + world.renderedEntities;
// int xpos= container.getWidth() - 350;/*130*/
int xpos = 0;
showMessage(container, g, xpos, ypos, container.getWidth() - 1, 40,
20, Color.lightGray, text, 350);
container.setShowFPS(true);
} else {
container.setShowFPS(false);
}
}
public static void showMessage(GameContainer container, Graphics g,
int xpos, int ypos, int width, int height, int radius, Color c,
String text, int spaceText) {
RoundedRectangle r = new RoundedRectangle(xpos, ypos, width, height,
radius);
c.a = 0.6f;
g.setColor(c);
g.fill(r);
g.draw(r);
g.setColor(Color.white);
g.resetFont();
g.drawString(text, xpos + spaceText, ypos + 9);
}
/**
* Set scale factor for graphics
*
* @param sx
* @param sy
*/
public static void scale(float sx, float sy) {
scaleX = sx;
scaleY = sy;
}
public static void remove(Entity entity) {
if (world != null) {
world.remove(entity);
}
}
public static void muteMusic() {
if (playMusic) {
SFX.setMusicVolume(1.0f);
SFX.setSoundVolume(1.0f);
} else {
SFX.setMusicVolume(0f);
SFX.setSoundVolume(0f);
}
}
}