diff options
8 files changed, 203 insertions, 56 deletions
| diff --git a/src/com/fourisland/fourpuzzle/Display.java b/src/com/fourisland/fourpuzzle/Display.java index 85acaf4..ec835ab 100755 --- a/src/com/fourisland/fourpuzzle/Display.java +++ b/src/com/fourisland/fourpuzzle/Display.java | |||
| @@ -11,6 +11,7 @@ import com.fourisland.fourpuzzle.transition.OutTransition; | |||
| 11 | import com.fourisland.fourpuzzle.transition.Transition; | 11 | import com.fourisland.fourpuzzle.transition.Transition; |
| 12 | import com.fourisland.fourpuzzle.transition.TransitionDirection; | 12 | import com.fourisland.fourpuzzle.transition.TransitionDirection; |
| 13 | import com.fourisland.fourpuzzle.transition.TransitionUnsupportedException; | 13 | import com.fourisland.fourpuzzle.transition.TransitionUnsupportedException; |
| 14 | import com.fourisland.fourpuzzle.util.Renderable; | ||
| 14 | import java.awt.Font; | 15 | import java.awt.Font; |
| 15 | import java.awt.FontFormatException; | 16 | import java.awt.FontFormatException; |
| 16 | import java.awt.Graphics2D; | 17 | import java.awt.Graphics2D; |
| @@ -20,6 +21,8 @@ import java.awt.image.BufferedImage; | |||
| 20 | import java.awt.image.VolatileImage; | 21 | import java.awt.image.VolatileImage; |
| 21 | import java.io.IOException; | 22 | import java.io.IOException; |
| 22 | import java.io.InputStream; | 23 | import java.io.InputStream; |
| 24 | import java.util.List; | ||
| 25 | import java.util.concurrent.CopyOnWriteArrayList; | ||
| 23 | import java.util.concurrent.CountDownLatch; | 26 | import java.util.concurrent.CountDownLatch; |
| 24 | import java.util.logging.Level; | 27 | import java.util.logging.Level; |
| 25 | import java.util.logging.Logger; | 28 | import java.util.logging.Logger; |
| @@ -33,6 +36,8 @@ import org.jdesktop.application.ResourceMap; | |||
| 33 | public class Display { | 36 | public class Display { |
| 34 | 37 | ||
| 35 | public static int tileAnimationFrame = 0; | 38 | public static int tileAnimationFrame = 0; |
| 39 | |||
| 40 | private static List<Renderable> renderables = new CopyOnWriteArrayList<Renderable>(); | ||
| 36 | 41 | ||
| 37 | public static void render(JDialog gameFrame) | 42 | public static void render(JDialog gameFrame) |
| 38 | { | 43 | { |
| @@ -95,18 +100,37 @@ public class Display { | |||
| 95 | g.drawImage(midTransition, 0, 0, null); | 100 | g.drawImage(midTransition, 0, 0, null); |
| 96 | } | 101 | } |
| 97 | } else { | 102 | } else { |
| 98 | Game.getGameState().render(g); | 103 | render(g); |
| 99 | } | 104 | } |
| 100 | 105 | ||
| 101 | g.dispose(); | 106 | g.dispose(); |
| 102 | } | 107 | } |
| 103 | 108 | ||
| 109 | private static void render(Graphics2D g) | ||
| 110 | { | ||
| 111 | Game.getGameState().render(g); | ||
| 112 | |||
| 113 | for (Renderable r : renderables) | ||
| 114 | { | ||
| 115 | r.render(g); | ||
| 116 | } | ||
| 117 | } | ||
| 118 | |||
| 119 | public static void registerRenderable(Renderable r) | ||
| 120 | { | ||
| 121 | renderables.add(r); | ||
| 122 | } | ||
| 123 | |||
| 124 | public static void unregisterRenderable(Renderable r) | ||
| 125 | { | ||
| 126 | renderables.remove(r); | ||
| 127 | } | ||
| 128 | |||
| 104 | private static boolean startedTransition = false; | 129 | private static boolean startedTransition = false; |
| 105 | private static Transition transition; | 130 | private static Transition transition; |
| 106 | private static CountDownLatch transitionWait; | 131 | private static CountDownLatch transitionWait; |
| 107 | private static boolean transitionRunning = false; | 132 | private static boolean transitionRunning = false; |
| 108 | private static BufferedImage midTransition = null; | 133 | private static BufferedImage midTransition = null; |
| 109 | private static BufferedImage postTransition = null; | ||
| 110 | public static void transition(Transition transition) throws InterruptedException | 134 | public static void transition(Transition transition) throws InterruptedException |
| 111 | { | 135 | { |
| 112 | if (transition instanceof MultidirectionalTransition) | 136 | if (transition instanceof MultidirectionalTransition) |
| @@ -125,13 +149,13 @@ public class Display { | |||
| 125 | { | 149 | { |
| 126 | temp.setPreTransition(midTransition); | 150 | temp.setPreTransition(midTransition); |
| 127 | 151 | ||
| 128 | postTransition = Display.createCanvas(Game.WIDTH, Game.HEIGHT); | 152 | BufferedImage bImg = Display.createCanvas(Game.WIDTH, Game.HEIGHT); |
| 129 | Game.getGameState().render(postTransition.createGraphics()); | 153 | render(bImg.createGraphics()); |
| 130 | temp.setPostTransition(postTransition); | 154 | temp.setPostTransition(bImg); |
| 131 | } else { | 155 | } else { |
| 132 | BufferedImage preTransition = Display.createCanvas(Game.WIDTH, Game.HEIGHT); | 156 | BufferedImage bImg = Display.createCanvas(Game.WIDTH, Game.HEIGHT); |
| 133 | Game.getGameState().render(preTransition.createGraphics()); | 157 | render(bImg.createGraphics()); |
| 134 | temp.setPreTransition(preTransition); | 158 | temp.setPreTransition(bImg); |
| 135 | } | 159 | } |
| 136 | } else { | 160 | } else { |
| 137 | if (startedTransition && !(transition instanceof InTransition)) | 161 | if (startedTransition && !(transition instanceof InTransition)) |
| @@ -146,13 +170,13 @@ public class Display { | |||
| 146 | { | 170 | { |
| 147 | transition.setPreTransition(midTransition); | 171 | transition.setPreTransition(midTransition); |
| 148 | 172 | ||
| 149 | postTransition = Display.createCanvas(Game.WIDTH, Game.HEIGHT); | 173 | BufferedImage bImg = Display.createCanvas(Game.WIDTH, Game.HEIGHT); |
| 150 | Game.getGameState().render(postTransition.createGraphics()); | 174 | render(bImg.createGraphics()); |
| 151 | ((InTransition) transition).setPostTransition(postTransition); | 175 | ((InTransition) transition).setPostTransition(bImg); |
| 152 | } else { | 176 | } else { |
| 153 | BufferedImage preTransition = Display.createCanvas(Game.WIDTH, Game.HEIGHT); | 177 | BufferedImage bImg = Display.createCanvas(Game.WIDTH, Game.HEIGHT); |
| 154 | Game.getGameState().render(preTransition.createGraphics()); | 178 | render(bImg.createGraphics()); |
| 155 | transition.setPreTransition(preTransition); | 179 | transition.setPreTransition(bImg); |
| 156 | } | 180 | } |
| 157 | } | 181 | } |
| 158 | 182 | ||
| diff --git a/src/com/fourisland/fourpuzzle/gamestate/GameState.java b/src/com/fourisland/fourpuzzle/gamestate/GameState.java index de4d7de..e7bd783 100755 --- a/src/com/fourisland/fourpuzzle/gamestate/GameState.java +++ b/src/com/fourisland/fourpuzzle/gamestate/GameState.java | |||
| @@ -5,30 +5,18 @@ | |||
| 5 | 5 | ||
| 6 | package com.fourisland.fourpuzzle.gamestate; | 6 | package com.fourisland.fourpuzzle.gamestate; |
| 7 | 7 | ||
| 8 | import java.awt.Graphics2D; | 8 | import com.fourisland.fourpuzzle.util.Renderable; |
| 9 | 9 | ||
| 10 | /** | 10 | /** |
| 11 | * | 11 | * |
| 12 | * @author hatkirby | 12 | * @author hatkirby |
| 13 | */ | 13 | */ |
| 14 | public interface GameState { | 14 | public interface GameState extends Renderable { |
| 15 | 15 | ||
| 16 | public void initalize(); | 16 | public void initalize(); |
| 17 | public void deinitalize(); | 17 | public void deinitalize(); |
| 18 | 18 | ||
| 19 | public void processInput(); | 19 | public void processInput(); |
| 20 | public void doGameCycle(); | 20 | public void doGameCycle(); |
| 21 | public void render(Graphics2D g); | ||
| 22 | 21 | ||
| 23 | } | 22 | } \ No newline at end of file |
| 24 | |||
| 25 | /* | ||
| 26 | TitleScreen | ||
| 27 | MapView | ||
| 28 | Battle | ||
| 29 | GameOver | ||
| 30 | Menu | ||
| 31 | LoadFile | ||
| 32 | SaveFile | ||
| 33 | Transition | ||
| 34 | */ \ No newline at end of file | ||
| diff --git a/src/com/fourisland/fourpuzzle/gamestate/TitleScreenGameState.java b/src/com/fourisland/fourpuzzle/gamestate/TitleScreenGameState.java index 272c4f0..d5b4f90 100755 --- a/src/com/fourisland/fourpuzzle/gamestate/TitleScreenGameState.java +++ b/src/com/fourisland/fourpuzzle/gamestate/TitleScreenGameState.java | |||
| @@ -27,20 +27,20 @@ import java.util.Arrays; | |||
| 27 | public class TitleScreenGameState implements GameState { | 27 | public class TitleScreenGameState implements GameState { |
| 28 | 28 | ||
| 29 | ChoiceWindow choices; | 29 | ChoiceWindow choices; |
| 30 | int wx, wy; | ||
| 31 | 30 | ||
| 32 | public void initalize() | 31 | public void initalize() |
| 33 | { | 32 | { |
| 34 | Audio.playMusic(Database.getMusic(Music.Title)); | 33 | Audio.playMusic(Database.getMusic(Music.Title)); |
| 35 | 34 | ||
| 36 | choices = new ChoiceWindow(Arrays.asList(Database.getVocab(Vocabulary.NewGame), Database.getVocab(Vocabulary.LoadGame), Database.getVocab(Vocabulary.EndGame)), true); | 35 | choices = new ChoiceWindow(Arrays.asList(Database.getVocab(Vocabulary.NewGame), Database.getVocab(Vocabulary.LoadGame), Database.getVocab(Vocabulary.EndGame)), true, ChoiceWindow.ChoiceWindowLocation.BottomLeft); |
| 37 | wx = (Game.WIDTH/5)-(choices.getWidth()/2); | 36 | Display.registerRenderable(choices); |
| 38 | wy = (Game.HEIGHT/4*3)-(choices.getHeight()/2); | ||
| 39 | } | 37 | } |
| 40 | 38 | ||
| 41 | public void deinitalize() | 39 | public void deinitalize() |
| 42 | { | 40 | { |
| 43 | Audio.stopMusic(); | 41 | Audio.stopMusic(); |
| 42 | |||
| 43 | Display.unregisterRenderable(choices); | ||
| 44 | } | 44 | } |
| 45 | 45 | ||
| 46 | PauseTimer pt = new PauseTimer(0); | 46 | PauseTimer pt = new PauseTimer(0); |
| @@ -112,7 +112,6 @@ public class TitleScreenGameState implements GameState { | |||
| 112 | public void render(Graphics2D g) | 112 | public void render(Graphics2D g) |
| 113 | { | 113 | { |
| 114 | g.drawImage(ObjectLoader.getImage("Picture", "Title"), 0, 0, null); | 114 | g.drawImage(ObjectLoader.getImage("Picture", "Title"), 0, 0, null); |
| 115 | choices.render(g, wx, wy); | ||
| 116 | } | 115 | } |
| 117 | 116 | ||
| 118 | } | 117 | } |
| diff --git a/src/com/fourisland/fourpuzzle/gamestate/mapview/MapViewGameState.java b/src/com/fourisland/fourpuzzle/gamestate/mapview/MapViewGameState.java index 3ed23c3..a20062d 100755 --- a/src/com/fourisland/fourpuzzle/gamestate/mapview/MapViewGameState.java +++ b/src/com/fourisland/fourpuzzle/gamestate/mapview/MapViewGameState.java | |||
| @@ -23,7 +23,6 @@ import com.fourisland.fourpuzzle.gamestate.mapview.event.specialmove.MoveEventTh | |||
| 23 | import com.fourisland.fourpuzzle.gamestate.mapview.viewpoint.AutomaticViewpoint; | 23 | import com.fourisland.fourpuzzle.gamestate.mapview.viewpoint.AutomaticViewpoint; |
| 24 | import com.fourisland.fourpuzzle.gamestate.mapview.viewpoint.Viewpoint; | 24 | import com.fourisland.fourpuzzle.gamestate.mapview.viewpoint.Viewpoint; |
| 25 | import com.fourisland.fourpuzzle.util.Functions; | 25 | import com.fourisland.fourpuzzle.util.Functions; |
| 26 | import com.fourisland.fourpuzzle.window.MessageWindow; | ||
| 27 | import java.awt.Graphics2D; | 26 | import java.awt.Graphics2D; |
| 28 | import java.awt.event.KeyEvent; | 27 | import java.awt.event.KeyEvent; |
| 29 | import java.awt.image.BufferedImage; | 28 | import java.awt.image.BufferedImage; |
| @@ -229,11 +228,6 @@ public class MapViewGameState implements GameState { | |||
| 229 | 228 | ||
| 230 | g.drawImage(eventLayer, 0, 0, Game.WIDTH, Game.HEIGHT, x, y, x+Game.WIDTH, y+Game.HEIGHT, null); | 229 | g.drawImage(eventLayer, 0, 0, Game.WIDTH, Game.HEIGHT, x, y, x+Game.WIDTH, y+Game.HEIGHT, null); |
| 231 | g.drawImage(currentMap.renderUpper(), 0, 0, Game.WIDTH, Game.HEIGHT, x, y, x+Game.WIDTH, y+Game.HEIGHT, null); | 230 | g.drawImage(currentMap.renderUpper(), 0, 0, Game.WIDTH, Game.HEIGHT, x, y, x+Game.WIDTH, y+Game.HEIGHT, null); |
| 232 | |||
| 233 | if (mw != null) | ||
| 234 | { | ||
| 235 | mw.render(g); | ||
| 236 | } | ||
| 237 | } | 231 | } |
| 238 | 232 | ||
| 239 | public void setCurrentMap(String mapName) | 233 | public void setCurrentMap(String mapName) |
| @@ -256,11 +250,5 @@ public class MapViewGameState implements GameState { | |||
| 256 | { | 250 | { |
| 257 | currentViewpoint = viewpoint; | 251 | currentViewpoint = viewpoint; |
| 258 | } | 252 | } |
| 259 | |||
| 260 | volatile MessageWindow mw = null; | ||
| 261 | public void displayMessage(String message) | ||
| 262 | { | ||
| 263 | mw = new MessageWindow(message); | ||
| 264 | } | ||
| 265 | 253 | ||
| 266 | } | 254 | } |
| diff --git a/src/com/fourisland/fourpuzzle/gamestate/mapview/event/SpecialEvent.java b/src/com/fourisland/fourpuzzle/gamestate/mapview/event/SpecialEvent.java index 7ca08ff..2b54dc9 100755 --- a/src/com/fourisland/fourpuzzle/gamestate/mapview/event/SpecialEvent.java +++ b/src/com/fourisland/fourpuzzle/gamestate/mapview/event/SpecialEvent.java | |||
| @@ -17,6 +17,7 @@ import com.fourisland.fourpuzzle.gamestate.mapview.viewpoint.MovingViewpoint; | |||
| 17 | import com.fourisland.fourpuzzle.gamestate.mapview.viewpoint.Viewpoint; | 17 | import com.fourisland.fourpuzzle.gamestate.mapview.viewpoint.Viewpoint; |
| 18 | import com.fourisland.fourpuzzle.transition.InTransition; | 18 | import com.fourisland.fourpuzzle.transition.InTransition; |
| 19 | import com.fourisland.fourpuzzle.transition.OutTransition; | 19 | import com.fourisland.fourpuzzle.transition.OutTransition; |
| 20 | import com.fourisland.fourpuzzle.window.MessageWindow; | ||
| 20 | import java.util.concurrent.CountDownLatch; | 21 | import java.util.concurrent.CountDownLatch; |
| 21 | 22 | ||
| 22 | /** | 23 | /** |
| @@ -50,10 +51,11 @@ public class SpecialEvent { | |||
| 50 | * been read. | 51 | * been read. |
| 51 | * | 52 | * |
| 52 | * @param message The message to display | 53 | * @param message The message to display |
| 54 | * @throws InterruptedException | ||
| 53 | */ | 55 | */ |
| 54 | public void DisplayMessage(String message) | 56 | public void DisplayMessage(String message) throws InterruptedException |
| 55 | { | 57 | { |
| 56 | mapView.displayMessage(message); | 58 | MessageWindow.displayMessage(message); |
| 57 | } | 59 | } |
| 58 | 60 | ||
| 59 | /** | 61 | /** |
| diff --git a/src/com/fourisland/fourpuzzle/util/Renderable.java b/src/com/fourisland/fourpuzzle/util/Renderable.java new file mode 100644 index 0000000..a6aeb1a --- /dev/null +++ b/src/com/fourisland/fourpuzzle/util/Renderable.java | |||
| @@ -0,0 +1,18 @@ | |||
| 1 | /* | ||
| 2 | * To change this template, choose Tools | Templates | ||
| 3 | * and open the template in the editor. | ||
| 4 | */ | ||
| 5 | |||
| 6 | package com.fourisland.fourpuzzle.util; | ||
| 7 | |||
| 8 | import java.awt.Graphics2D; | ||
| 9 | |||
| 10 | /** | ||
| 11 | * | ||
| 12 | * @author hatkirby | ||
| 13 | */ | ||
| 14 | public interface Renderable { | ||
| 15 | |||
| 16 | public void render(Graphics2D g); | ||
| 17 | |||
| 18 | } | ||
| diff --git a/src/com/fourisland/fourpuzzle/window/ChoiceWindow.java b/src/com/fourisland/fourpuzzle/window/ChoiceWindow.java index ca84383..8399422 100755 --- a/src/com/fourisland/fourpuzzle/window/ChoiceWindow.java +++ b/src/com/fourisland/fourpuzzle/window/ChoiceWindow.java | |||
| @@ -7,8 +7,10 @@ package com.fourisland.fourpuzzle.window; | |||
| 7 | 7 | ||
| 8 | import com.fourisland.fourpuzzle.Audio; | 8 | import com.fourisland.fourpuzzle.Audio; |
| 9 | import com.fourisland.fourpuzzle.Display; | 9 | import com.fourisland.fourpuzzle.Display; |
| 10 | import com.fourisland.fourpuzzle.Game; | ||
| 10 | import com.fourisland.fourpuzzle.database.Database; | 11 | import com.fourisland.fourpuzzle.database.Database; |
| 11 | import com.fourisland.fourpuzzle.database.Sound; | 12 | import com.fourisland.fourpuzzle.database.Sound; |
| 13 | import com.fourisland.fourpuzzle.util.Renderable; | ||
| 12 | import java.awt.Graphics2D; | 14 | import java.awt.Graphics2D; |
| 13 | import java.awt.Rectangle; | 15 | import java.awt.Rectangle; |
| 14 | import java.awt.TexturePaint; | 16 | import java.awt.TexturePaint; |
| @@ -19,7 +21,7 @@ import java.util.List; | |||
| 19 | * | 21 | * |
| 20 | * @author hatkirby | 22 | * @author hatkirby |
| 21 | */ | 23 | */ |
| 22 | public class ChoiceWindow { | 24 | public class ChoiceWindow implements Renderable { |
| 23 | 25 | ||
| 24 | private static final int SPACER = 4; | 26 | private static final int SPACER = 4; |
| 25 | 27 | ||
| @@ -29,7 +31,9 @@ public class ChoiceWindow { | |||
| 29 | private int width; | 31 | private int width; |
| 30 | private int height; | 32 | private int height; |
| 31 | BufferedImage cacheBase; | 33 | BufferedImage cacheBase; |
| 32 | public ChoiceWindow(List<String> choices, boolean center) | 34 | int x; |
| 35 | int y; | ||
| 36 | public ChoiceWindow(List<String> choices, boolean center, ChoiceWindowLocation cwl) | ||
| 33 | { | 37 | { |
| 34 | this.choices = choices; | 38 | this.choices = choices; |
| 35 | numChoices = choices.size(); | 39 | numChoices = choices.size(); |
| @@ -52,9 +56,12 @@ public class ChoiceWindow { | |||
| 52 | width += SPACER*2; | 56 | width += SPACER*2; |
| 53 | 57 | ||
| 54 | cacheBase = Window.Default.getImage(width, height); | 58 | cacheBase = Window.Default.getImage(width, height); |
| 59 | |||
| 60 | x = cwl.getX(width); | ||
| 61 | y = cwl.getY(height); | ||
| 55 | } | 62 | } |
| 56 | 63 | ||
| 57 | public void render(Graphics2D g2, int x, int y) | 64 | public void render(Graphics2D g2) |
| 58 | { | 65 | { |
| 59 | Display.setFont(g2); | 66 | Display.setFont(g2); |
| 60 | 67 | ||
| @@ -119,5 +126,37 @@ public class ChoiceWindow { | |||
| 119 | { | 126 | { |
| 120 | return choices.get(selected); | 127 | return choices.get(selected); |
| 121 | } | 128 | } |
| 129 | |||
| 130 | public static enum ChoiceWindowLocation | ||
| 131 | { | ||
| 132 | BottomLeft | ||
| 133 | { | ||
| 134 | public int getX(int width) | ||
| 135 | { | ||
| 136 | return (Game.WIDTH/5)-(width/2); | ||
| 137 | } | ||
| 138 | }, | ||
| 139 | BottomCenter | ||
| 140 | { | ||
| 141 | public int getX(int width) | ||
| 142 | { | ||
| 143 | return (Game.WIDTH/2)-(width/2); | ||
| 144 | } | ||
| 145 | }, | ||
| 146 | BottomRight | ||
| 147 | { | ||
| 148 | public int getX(int width) | ||
| 149 | { | ||
| 150 | return (Game.WIDTH/5*4)-(width/2); | ||
| 151 | } | ||
| 152 | }; | ||
| 153 | |||
| 154 | public abstract int getX(int width); | ||
| 155 | |||
| 156 | public int getY(int height) | ||
| 157 | { | ||
| 158 | return (Game.HEIGHT/4*3)-(height/2); | ||
| 159 | } | ||
| 160 | } | ||
| 122 | 161 | ||
| 123 | } \ No newline at end of file | 162 | } \ No newline at end of file |
| diff --git a/src/com/fourisland/fourpuzzle/window/MessageWindow.java b/src/com/fourisland/fourpuzzle/window/MessageWindow.java index deab252..3272fcc 100644 --- a/src/com/fourisland/fourpuzzle/window/MessageWindow.java +++ b/src/com/fourisland/fourpuzzle/window/MessageWindow.java | |||
| @@ -7,26 +7,36 @@ package com.fourisland.fourpuzzle.window; | |||
| 7 | 7 | ||
| 8 | import com.fourisland.fourpuzzle.Display; | 8 | import com.fourisland.fourpuzzle.Display; |
| 9 | import com.fourisland.fourpuzzle.Game; | 9 | import com.fourisland.fourpuzzle.Game; |
| 10 | import com.fourisland.fourpuzzle.PuzzleApplication; | ||
| 11 | import com.fourisland.fourpuzzle.util.Interval; | ||
| 12 | import com.fourisland.fourpuzzle.util.Renderable; | ||
| 10 | import java.awt.Graphics2D; | 13 | import java.awt.Graphics2D; |
| 11 | import java.awt.Rectangle; | 14 | import java.awt.Rectangle; |
| 12 | import java.awt.TexturePaint; | 15 | import java.awt.TexturePaint; |
| 16 | import java.awt.event.KeyAdapter; | ||
| 17 | import java.awt.event.KeyEvent; | ||
| 13 | import java.awt.image.BufferedImage; | 18 | import java.awt.image.BufferedImage; |
| 14 | import java.util.ArrayList; | 19 | import java.util.ArrayList; |
| 15 | import java.util.List; | 20 | import java.util.List; |
| 21 | import java.util.concurrent.CountDownLatch; | ||
| 16 | 22 | ||
| 17 | /** | 23 | /** |
| 18 | * | 24 | * |
| 19 | * @author hatkirby | 25 | * @author hatkirby |
| 20 | */ | 26 | */ |
| 21 | public class MessageWindow { | 27 | public class MessageWindow implements Renderable { |
| 22 | 28 | ||
| 23 | private static final int SPACER = 4; | 29 | private static final int SPACER = 4; |
| 24 | private static final int HEIGHT = 4*(Display.createCanvas(1, 1).createGraphics().getFontMetrics().getHeight()+SPACER); | 30 | private static final int HEIGHT = 4*(Display.createCanvas(1, 1).createGraphics().getFontMetrics().getHeight()+SPACER); |
| 25 | 31 | ||
| 26 | private List<String> messages; | 32 | private volatile List<String> messages; |
| 27 | int width; | 33 | int width; |
| 28 | BufferedImage cacheBase; | 34 | BufferedImage cacheBase; |
| 29 | public MessageWindow(String message) | 35 | int num = 0; |
| 36 | int upTo = 0; | ||
| 37 | boolean bounceArrow = false; | ||
| 38 | Interval in = Interval.createTickInterval(4); | ||
| 39 | private MessageWindow(String message) | ||
| 30 | { | 40 | { |
| 31 | width = Game.WIDTH - Window.Default.getFullWidth(0); | 41 | width = Game.WIDTH - Window.Default.getFullWidth(0); |
| 32 | messages = new ArrayList<String>(); | 42 | messages = new ArrayList<String>(); |
| @@ -36,6 +46,36 @@ public class MessageWindow { | |||
| 36 | cacheBase = Window.Default.getImage(width, HEIGHT); | 46 | cacheBase = Window.Default.getImage(width, HEIGHT); |
| 37 | } | 47 | } |
| 38 | 48 | ||
| 49 | public static void displayMessage(String message) throws InterruptedException | ||
| 50 | { | ||
| 51 | final MessageWindow mw = new MessageWindow(message); | ||
| 52 | final CountDownLatch cdl = new CountDownLatch(1); | ||
| 53 | |||
| 54 | Display.registerRenderable(mw); | ||
| 55 | |||
| 56 | KeyAdapter ka = new KeyAdapter() { | ||
| 57 | @Override | ||
| 58 | public void keyPressed(KeyEvent e) { | ||
| 59 | if ((e.getKeyCode() == KeyEvent.VK_ENTER) || (e.getKeyCode() == KeyEvent.VK_SPACE)) | ||
| 60 | { | ||
| 61 | if (mw.pushEnter()) | ||
| 62 | { | ||
| 63 | cdl.countDown(); | ||
| 64 | } | ||
| 65 | } | ||
| 66 | |||
| 67 | Game.setKey(null); | ||
| 68 | } | ||
| 69 | }; | ||
| 70 | |||
| 71 | PuzzleApplication.gameFrame.addKeyListener(ka); | ||
| 72 | |||
| 73 | cdl.await(); | ||
| 74 | |||
| 75 | PuzzleApplication.gameFrame.removeKeyListener(ka); | ||
| 76 | Display.unregisterRenderable(mw); | ||
| 77 | } | ||
| 78 | |||
| 39 | private void initalizeMessages(String message, Graphics2D g) | 79 | private void initalizeMessages(String message, Graphics2D g) |
| 40 | { | 80 | { |
| 41 | Display.setFont(g); | 81 | Display.setFont(g); |
| @@ -68,12 +108,24 @@ public class MessageWindow { | |||
| 68 | 108 | ||
| 69 | len = 0; | 109 | len = 0; |
| 70 | } | 110 | } |
| 111 | |||
| 112 | setLength(); | ||
| 113 | } | ||
| 114 | |||
| 115 | private void setLength() | ||
| 116 | { | ||
| 117 | num = 0; | ||
| 118 | |||
| 119 | for (int i=0;i<messages.size();i++) | ||
| 120 | { | ||
| 121 | num += messages.get(i).length(); | ||
| 122 | } | ||
| 71 | } | 123 | } |
| 72 | 124 | ||
| 73 | public void render(Graphics2D g2) | 125 | public void render(Graphics2D g2) |
| 74 | { | 126 | { |
| 75 | int y = MessageWindowLocation.Bottom.getY(); | 127 | int y = MessageWindowLocation.Bottom.getY(); |
| 76 | 128 | ||
| 77 | Display.setFont(g2); | 129 | Display.setFont(g2); |
| 78 | 130 | ||
| 79 | g2.drawImage(cacheBase, 0, y, null); | 131 | g2.drawImage(cacheBase, 0, y, null); |
| @@ -81,6 +133,7 @@ public class MessageWindow { | |||
| 81 | int fh = g2.getFontMetrics().getHeight(); | 133 | int fh = g2.getFontMetrics().getHeight(); |
| 82 | int ty = Window.Default.getTopY()+fh-(SPACER/2)+y; | 134 | int ty = Window.Default.getTopY()+fh-(SPACER/2)+y; |
| 83 | int msgs = Math.min(messages.size(), 4); | 135 | int msgs = Math.min(messages.size(), 4); |
| 136 | int toPrint = upTo; | ||
| 84 | for (int i=0;i<msgs;i++) | 137 | for (int i=0;i<msgs;i++) |
| 85 | { | 138 | { |
| 86 | String message = messages.get(i); | 139 | String message = messages.get(i); |
| @@ -88,10 +141,46 @@ public class MessageWindow { | |||
| 88 | int tx = Window.Default.getLeftX(); | 141 | int tx = Window.Default.getLeftX(); |
| 89 | 142 | ||
| 90 | g2.setPaint(new TexturePaint(SystemGraphic.getTextColor(), new Rectangle(tx, ty, fw, fh))); | 143 | g2.setPaint(new TexturePaint(SystemGraphic.getTextColor(), new Rectangle(tx, ty, fw, fh))); |
| 91 | g2.drawString(message, tx, ty); | 144 | g2.drawString(message.substring(0, Math.min(toPrint, message.length())), tx, ty); |
| 92 | 145 | ||
| 93 | ty+=(SPACER+g2.getFontMetrics().getHeight()); | 146 | ty+=(SPACER+g2.getFontMetrics().getHeight()); |
| 147 | |||
| 148 | toPrint -= Math.min(toPrint, message.length()); | ||
| 149 | } | ||
| 150 | |||
| 151 | if (upTo < num) | ||
| 152 | { | ||
| 153 | upTo+=3; | ||
| 154 | } else { | ||
| 155 | g2.drawImage(SystemGraphic.getDownArrow(), (Window.Default.getFullWidth(width)/2)-5, y+HEIGHT-SPACER+(bounceArrow ? 1 : 0), null); | ||
| 156 | |||
| 157 | if (in.isElapsed()) | ||
| 158 | { | ||
| 159 | bounceArrow = !bounceArrow; | ||
| 160 | } | ||
| 161 | } | ||
| 162 | } | ||
| 163 | |||
| 164 | private synchronized boolean pushEnter() | ||
| 165 | { | ||
| 166 | if (upTo >= num) | ||
| 167 | { | ||
| 168 | int msgs = messages.size(); | ||
| 169 | for (int i=0;i<Math.min(4, msgs);i++) | ||
| 170 | { | ||
| 171 | messages.remove(0); | ||
| 172 | } | ||
| 173 | |||
| 174 | if (messages.size() > 0) | ||
| 175 | { | ||
| 176 | upTo = 0; | ||
| 177 | setLength(); | ||
| 178 | } else { | ||
| 179 | return true; | ||
| 180 | } | ||
| 94 | } | 181 | } |
| 182 | |||
| 183 | return false; | ||
| 95 | } | 184 | } |
| 96 | 185 | ||
| 97 | public static enum MessageWindowLocation | 186 | public static enum MessageWindowLocation |
