/* * To change this template, choose Tools | Templates * and open the template in the editor. */ package com.fourisland.fourpuzzle.window; import com.fourisland.fourpuzzle.Display; import com.fourisland.fourpuzzle.Game; import com.fourisland.fourpuzzle.PuzzleApplication; import com.fourisland.fourpuzzle.util.Interval; import com.fourisland.fourpuzzle.util.Renderable; import java.awt.Graphics2D; import java.awt.Rectangle; import java.awt.TexturePaint; import java.awt.event.KeyAdapter; import java.awt.event.KeyEvent; import java.awt.image.BufferedImage; import java.util.ArrayList; import java.util.List; import java.util.concurrent.CountDownLatch; /** * * @author hatkirby */ public class MessageWindow implements Renderable { private static final int SPACER = 4; private static final int HEIGHT = 4*(Display.createCanvas(1, 1).createGraphics().getFontMetrics().getHeight()+SPACER); private volatile List messages; int width; BufferedImage cacheBase; int num = 0; int upTo = 0; boolean bounceArrow = false; Interval in = Interval.createTickInterval(4); private MessageWindow(String message) { width = Game.WIDTH - Window.Default.getFullWidth(0); messages = new ArrayList(); initalizeMessages(message, Display.createCanvas(1, 1).createGraphics()); cacheBase = Window.Default.getImage(width, HEIGHT); } public static void displayMessage(String message) throws InterruptedException { final MessageWindow mw = new MessageWindow(message); final CountDownLatch cdl = new CountDownLatch(1); Display.registerRenderable(mw); KeyAdapter ka = new KeyAdapter() { @Override public void keyPressed(KeyEvent e) { if ((e.getKeyCode() == KeyEvent.VK_ENTER) || (e.getKeyCode() == KeyEvent.VK_SPACE)) { if (mw.pushEnter()) { cdl.countDown(); } } Game.setKey(null); } }; PuzzleApplication.gameFrame.addKeyListener(ka); cdl.await(); PuzzleApplication.gameFrame.removeKeyListener(ka); Display.unregisterRenderable(mw); } private void initalizeMessages(String message, Graphics2D g) { Display.setFont(g); String temp = message; int len = 0; while (!temp.isEmpty()) { while ((g.getFontMetrics().stringWidth(temp.substring(0, len)) < (width - SPACER)) && (len < temp.length())) { len++; } if (len != temp.length()) { while ((!temp.substring(len, len+1).equals(" ")) && (len > 0)) { len--; } } messages.add(temp.substring(0, len)); if (len != temp.length()) { temp = temp.substring(len+1); } else { temp = ""; } len = 0; } setLength(); } private void setLength() { num = 0; for (int i=0;i= num) { int msgs = messages.size(); for (int i=0;i 0) { upTo = 0; setLength(); } else { return true; } } return false; } public static enum MessageWindowLocation { Top(0), Middle((Game.HEIGHT/2)-(Window.Default.getFullHeight(MessageWindow.HEIGHT)/2)), Bottom(Game.HEIGHT-Window.Default.getFullHeight(MessageWindow.HEIGHT)); private int y; private MessageWindowLocation(int y) { this.y = y; } public int getY() { return y; } } }