package uk.co.flyingsquirrels.gamestates; import java.util.ArrayList; import java.util.List; import org.newdawn.slick.Color; import org.newdawn.slick.Font; import org.newdawn.slick.GameContainer; import org.newdawn.slick.Graphics; import org.newdawn.slick.Input; import org.newdawn.slick.SlickException; import org.newdawn.slick.state.BasicGameState; import org.newdawn.slick.state.StateBasedGame; import uk.co.flyingsquirrels.menuoptions.MenuOption; import uk.co.flyingsquirrels.utils.FontFactory; public class MenuGameState extends BasicGameState { private static final int START_Y = 250; private static final int SPACING_Y = 50; private final int id; private final String title; private final Font font; private final List<MenuOption> menuOptions = new ArrayList<MenuOption>(); private int optionIndex; private int maxTextWidth; public MenuGameState(int id) { this(id, null); } public MenuGameState(int id, String title) { this.id = id; this.title = title; font = FontFactory.loadFont("demo2"); } public void addMenuOption(MenuOption menuOption) { menuOptions.add(menuOption); } public int getID() { return id; } public final void init(GameContainer container, StateBasedGame game) throws SlickException { initInternal(container, game); calculateMaxOptionWidth(); } private void calculateMaxOptionWidth() { for (MenuOption menuOption : menuOptions) { int optionWidth = font.getWidth(menuOption.getText()); if (optionWidth > maxTextWidth) { maxTextWidth = optionWidth; } } } public final void render(GameContainer container, StateBasedGame game, Graphics g) throws SlickException { if (renderInternal(container, game, g)) { return; } if (title != null) { drawCentredString(container, font, title, 50); } for (int i = 0; i < menuOptions.size(); i++) { drawString(container, font, menuOptions.get(i).getText(), START_Y + (i * SPACING_Y)); if (i == optionIndex) { g.setColor(Color.white); g.drawRect(container.getWidth() / 2 - maxTextWidth / 2 - 20, START_Y - 10 + (i * SPACING_Y), maxTextWidth + 40, 50); } } } private void drawString(GameContainer container, Font font, String text, int y) { font.drawString(calculateFontXOffset(container, font, text), y, text); } protected void drawCentredString(GameContainer container, Font font, String text, int y) { font.drawString(calculateFontXOffset(container, font, text), y, text); } private int calculateFontXOffset(GameContainer container, Font font, String text) { return (container.getWidth() / 2 - font.getWidth(text) / 2); } public void update(GameContainer container, StateBasedGame game, int delta) throws SlickException { } public final void keyReleased(int key, char c) { if (keyReleasedInternal(key, c)) { return; } if (key == Input.KEY_DOWN) { optionIndex++; if (optionIndex >= menuOptions.size()) { optionIndex = 0; } } if (key == Input.KEY_UP) { optionIndex--; if (optionIndex < 0) { optionIndex = menuOptions.size() - 1; } } if (key == Input.KEY_ENTER) { menuOptions.get(optionIndex).select(); } } public void initInternal(GameContainer container, StateBasedGame game) throws SlickException { } /** * @return true in your subclass to skip further rendering */ protected boolean renderInternal(GameContainer container, StateBasedGame game, Graphics g) throws SlickException { return false; } /** * @return true in your subclass to skip further key processing */ protected boolean keyReleasedInternal(int key, char c) { return false; } }