package com.shade.states; import java.util.LinkedList; import java.util.Scanner; import org.newdawn.slick.GameContainer; import org.newdawn.slick.Graphics; import org.newdawn.slick.SlickException; import org.newdawn.slick.TrueTypeFont; import org.newdawn.slick.state.BasicGameState; import org.newdawn.slick.state.StateBasedGame; import org.newdawn.slick.util.ResourceLoader; import com.centerkey.utils.BareBonesBrowserLaunch; import com.shade.controls.Button; import com.shade.controls.ClickListener; import com.shade.controls.ScrollingText; import com.shade.controls.SlickButton; import com.shade.util.ResourceManager; public class CreditState extends BasicGameState { private static final int CREDIT_DELAY = 1000; public static final int ID = 5; private static final String FEEDBACK_URL = "http://anotherearlymorning.com/shade/feedback"; private MasterState master; private ResourceManager resource; private SlickButton play, feedback, back; private int timer; private LinkedList<ScrollingText> credits; public CreditState(MasterState m) throws SlickException { master = m; resource = m.resource; resource.register("feedback-up", "states/credits/feedback-up.png"); resource.register("feedback-down", "states/credits/feedback-down.png"); initCredits(master.daisySmall); } @Override public int getID() { return ID; } public void init(GameContainer container, StateBasedGame game) throws SlickException { throw new RuntimeException("CreditState was init'd!"); } @Override public void enter(GameContainer container, StateBasedGame game) throws SlickException { initButtons(); initCredits(master.daisySmall); timer = 0; master.dimmer.reset(); } // render the aquarium public void render(GameContainer container, StateBasedGame game, Graphics g) throws SlickException { master.control.render(game, g, resource.get("background")); master.dimmer.render(game, g); if (timer > CREDIT_DELAY) { for (ScrollingText s : credits) { s.render(game, g); } } resource.get("header").draw(400, 0); play.render(game, g); feedback.render(game, g); back.render(game, g); resource.get("trim").draw(); } // render the aquarium public void update(GameContainer container, StateBasedGame game, int delta) throws SlickException { master.control.update(game, delta); master.dimmer.update(game, delta); timer += delta; if (timer > MasterState.STATE_TRANSITION_DELAY) { play.update(game, delta); feedback.update(game, delta); back.update(game, delta); } for (ScrollingText s : credits) { s.update(game, delta); if (timer > CREDIT_DELAY) { s.start(); } } } private void initButtons() throws SlickException { initPlayButton(); initFeedbackButton(); initBackButton(); } private void initPlayButton() throws SlickException { play = new SlickButton(620, 110, resource.get("play-up"), resource .get("play-down")); play.addListener(new ClickListener() { public void onClick(StateBasedGame game, Button clicked) { game.enterState(SelectState.ID); } }); } private void initFeedbackButton() throws SlickException { feedback = new SlickButton(620, 130, resource.get("feedback-up"), resource.get("feedback-down")); feedback.addListener(new ClickListener() { public void onClick(StateBasedGame game, Button clicked) { BareBonesBrowserLaunch.openURL(FEEDBACK_URL); } }); } private void initBackButton() throws SlickException { back = new SlickButton(620, 150, resource.get("back-up"), resource .get("back-down")); back.addListener(new ClickListener() { public void onClick(StateBasedGame game, Button clicked) { game.enterState(TitleState.ID); master.dimmer.reverse(); } }); } private void initCredits(TrueTypeFont f) { credits = new LinkedList<ScrollingText>(); Scanner s = new Scanner(ResourceLoader .getResourceAsStream("states/credits/credits.txt")); float y = 0; float d = f.getHeight() * 1.5f; while (s.hasNextLine()) { String[] credit = s.nextLine().split(","); credits.add(new ScrollingText(credit[0], f, 40, 600 + y * d)); if (credit.length > 1) { credits.add(new ScrollingText(credit[1], f, 300, 600 + y * d)); } y++; } } }