Rev 704 | Details | Compare with Previous | Last modification | View Log | RSS feed
| Rev | Author | Line No. | Line |
|---|---|---|---|
| 521 | chris | 1 | package com.gebauz.Bauzoid.menu; |
| 2 | |||
| 3 | import java.lang.reflect.InvocationTargetException; |
||
| 4 | import java.util.Vector; |
||
| 5 | |||
| 6 | import com.gebauz.Bauzoid.game.Game; |
||
| 7 | import com.gebauz.Bauzoid.game.GameObject; |
||
| 8 | import com.gebauz.Bauzoid.graphics.renderstates.RenderStates; |
||
| 704 | chris | 9 | import com.gebauz.Bauzoid.graphics.sprite.TileBatch; |
| 521 | chris | 10 | import com.gebauz.Bauzoid.math.Vector2; |
| 11 | import com.gebauz.Bauzoid.parser.ScanException; |
||
| 12 | import com.gebauz.Bauzoid.parser.Tokenizer; |
||
| 13 | |||
| 14 | public class Menu extends GameObject |
||
| 15 | { |
||
| 16 | |||
| 17 | // Constants======================================================================================== |
||
| 531 | chris | 18 | |
| 521 | chris | 19 | // Embedded Types=================================================================================== |
| 20 | |||
| 531 | chris | 21 | public enum FadeState |
| 22 | { |
||
| 23 | FADE_IN, |
||
| 24 | NO_FADE, |
||
| 25 | FADE_OUT |
||
| 26 | } |
||
| 27 | |||
| 521 | chris | 28 | // Fields=========================================================================================== |
| 29 | |||
| 30 | private String mName = ""; |
||
| 31 | private Vector<MenuItem> mMenuItems = new Vector<MenuItem>(); |
||
| 32 | |||
| 33 | private MenuEventListener mEventListener = null; |
||
| 34 | |||
| 35 | /** Origin position (0, 0) of the Menu. Can be used to shift the entire menu. */ |
||
| 36 | private Vector2 mOrigin = new Vector2(0, 0); |
||
| 530 | chris | 37 | |
| 531 | chris | 38 | private boolean mVisible = true; |
| 39 | private boolean mEnabled = true; |
||
| 40 | |||
| 41 | /** Time required for fade in. */ |
||
| 42 | private float mFadeTime = 0.5f; |
||
| 43 | private float mFadeTimer = 0.0f; |
||
| 44 | private FadeState mFadeState = FadeState.NO_FADE; |
||
| 45 | |||
| 521 | chris | 46 | // Methods========================================================================================== |
| 47 | |||
| 48 | public Menu(Game game, String name) |
||
| 49 | { |
||
| 50 | super(game); |
||
| 51 | mName = name; |
||
| 52 | } |
||
| 53 | |||
| 54 | public void init() |
||
| 55 | { |
||
| 531 | chris | 56 | if (mFadeTime > 0.0f) |
| 57 | { |
||
| 58 | mFadeTimer = mFadeTime; |
||
| 59 | mFadeState = FadeState.FADE_IN; |
||
| 60 | } |
||
| 61 | |||
| 521 | chris | 62 | for (int i = 0; i < mMenuItems.size(); i++) |
| 63 | { |
||
| 64 | mMenuItems.get(i).init(); |
||
| 65 | } |
||
| 66 | } |
||
| 67 | |||
| 68 | public void exit() |
||
| 69 | { |
||
| 70 | for (int i = 0; i < mMenuItems.size(); i++) |
||
| 71 | { |
||
| 72 | mMenuItems.get(i).exit(); |
||
| 73 | } |
||
| 530 | chris | 74 | mMenuItems.clear(); |
| 521 | chris | 75 | } |
| 76 | |||
| 77 | public void parseLine(Tokenizer tokenizer) throws ScanException |
||
| 78 | { |
||
| 79 | String identifier = tokenizer.readIdentifier(); |
||
| 80 | |||
| 81 | if (identifier.equalsIgnoreCase("origin")) |
||
| 82 | { |
||
| 83 | mOrigin = MenuUtil.parseVector2(tokenizer); |
||
| 84 | } |
||
| 531 | chris | 85 | else if (identifier.equalsIgnoreCase("fadeTime")) |
| 86 | { |
||
| 87 | mFadeTime = MenuUtil.parseNumber(tokenizer); |
||
| 88 | } |
||
| 521 | chris | 89 | else |
| 90 | { |
||
| 91 | // otherwise check if it's a proper menu item |
||
| 92 | parseMenuItem(identifier, tokenizer); |
||
| 93 | } |
||
| 94 | } |
||
| 95 | |||
| 96 | public void parseMenuItem(String menuItemId, Tokenizer tokenizer) throws ScanException |
||
| 97 | { |
||
| 98 | String menuItemName = tokenizer.readString(); |
||
| 99 | |||
| 100 | tokenizer.readToken("{"); |
||
| 101 | |||
| 102 | // find item class |
||
| 103 | try |
||
| 104 | { |
||
| 105 | Class<? extends MenuItem> menuItemClass = Class.forName(Menu.class.getPackage().getName() + "." + menuItemId).asSubclass(MenuItem.class); |
||
| 106 | |||
| 107 | //MenuItem menuItem = menuItemClass.newInstance(); |
||
| 108 | MenuItem menuItem = (MenuItem)menuItemClass.getDeclaredConstructor(Game.class, Menu.class, String.class).newInstance(getGame(), this, menuItemName); |
||
| 109 | |||
| 110 | while (!tokenizer.checkToken("}")) |
||
| 111 | { |
||
| 112 | String identifier = tokenizer.readIdentifier(); |
||
| 113 | menuItem.parseLine(identifier, tokenizer); |
||
| 114 | } |
||
| 115 | tokenizer.readToken("}"); |
||
| 116 | |||
| 117 | // add item to menu item list |
||
| 118 | mMenuItems.add(menuItem); |
||
| 119 | } |
||
| 120 | catch (ClassNotFoundException e) |
||
| 121 | { |
||
| 122 | throw new ScanException(e.getMessage(), tokenizer.getSurroundings()); |
||
| 123 | } |
||
| 124 | catch (NoSuchMethodException ex) |
||
| 125 | { |
||
| 126 | throw new ScanException("NoSuchMethodException when trying to instantiate " + menuItemId + "(" + menuItemName + ")", tokenizer.getSurroundings()); |
||
| 127 | } |
||
| 128 | catch (InvocationTargetException ex) |
||
| 129 | { |
||
| 130 | throw new ScanException("InvocationTargetEception when trying to instantiate " + menuItemId + "(" + menuItemName + ")", tokenizer.getSurroundings()); |
||
| 131 | } |
||
| 132 | catch (InstantiationException ex) |
||
| 133 | { |
||
| 134 | throw new ScanException("InstantiationException when trying to instantiate " + menuItemId + "(" + menuItemName + ")", tokenizer.getSurroundings()); |
||
| 135 | } |
||
| 136 | catch (IllegalAccessException ex) |
||
| 137 | { |
||
| 138 | throw new ScanException("IllegalAccessException when trying to instantiate " + menuItemId + "(" + menuItemName + ")", tokenizer.getSurroundings()); |
||
| 139 | } |
||
| 140 | } |
||
| 141 | |||
| 142 | public void update(float deltaTime) |
||
| 143 | { |
||
| 531 | chris | 144 | if (mFadeTimer > 0.0f) |
| 145 | mFadeTimer -= deltaTime; |
||
| 146 | |||
| 721 | chris | 147 | if (mFadeTimer <= 0.0f) |
| 531 | chris | 148 | { |
| 149 | mFadeTimer = 0.0f; |
||
| 150 | |||
| 151 | if (mFadeState == FadeState.FADE_OUT) |
||
| 152 | { |
||
| 153 | // disable/hide this menu |
||
| 154 | setVisible(false); |
||
| 155 | setEnabled(false); |
||
| 156 | } |
||
| 157 | |||
| 158 | mFadeState = FadeState.NO_FADE; |
||
| 159 | } |
||
| 160 | |||
| 521 | chris | 161 | for (int i = 0; i < mMenuItems.size(); i++) |
| 162 | { |
||
| 531 | chris | 163 | mMenuItems.get(i).update(deltaTime); |
| 164 | if (mMenuItems.get(i).getUpdateListener() != null) |
||
| 165 | mMenuItems.get(i).getUpdateListener().onUpdate(mMenuItems.get(i), deltaTime); |
||
| 521 | chris | 166 | } |
| 531 | chris | 167 | |
| 168 | handleInput(deltaTime); |
||
| 521 | chris | 169 | } |
| 170 | |||
| 531 | chris | 171 | public void handleInput(float deltaTime) |
| 172 | { |
||
| 173 | if (!isEnabled()) |
||
| 174 | return; |
||
| 175 | |||
| 176 | if (mFadeState == FadeState.NO_FADE) |
||
| 177 | { |
||
| 178 | for (int i = 0; i < mMenuItems.size(); i++) |
||
| 179 | { |
||
| 180 | if (mMenuItems.get(i).isEnabled()) |
||
| 181 | mMenuItems.get(i).handleInput(deltaTime); |
||
| 182 | } |
||
| 183 | } |
||
| 184 | } |
||
| 185 | |||
| 521 | chris | 186 | public void render() |
| 187 | { |
||
| 531 | chris | 188 | if (!isVisible()) |
| 189 | return; |
||
| 704 | chris | 190 | |
| 191 | TileBatch batch = getGraphics().getBatch(); |
||
| 192 | |||
| 693 | chris | 193 | |
| 521 | chris | 194 | RenderStates rs = getGame().getGraphics().renderStates; |
| 195 | rs.pushViewMatrix(); |
||
| 537 | chris | 196 | //rs.view = Matrix4.createTranslation(mOrigin.x, mOrigin.y, 0); |
| 197 | rs.view.setTranslation(mOrigin.x, mOrigin.y, 0); |
||
| 521 | chris | 198 | for (int i = 0; i < mMenuItems.size(); i++) |
| 199 | { |
||
| 524 | chris | 200 | MenuItem item = mMenuItems.get(i); |
| 201 | if (item.isVisible()) |
||
| 531 | chris | 202 | { |
| 203 | // adjust alpha for fading |
||
| 204 | |||
| 704 | chris | 205 | batch.begin(); |
| 206 | |||
| 531 | chris | 207 | float oldAlpha = item.getColor().w; |
| 208 | item.getColor().w *= getFadeAlpha(); |
||
| 524 | chris | 209 | item.render(); |
| 531 | chris | 210 | item.getColor().w = oldAlpha; |
| 704 | chris | 211 | |
| 212 | batch.end(); |
||
| 531 | chris | 213 | } |
| 521 | chris | 214 | } |
| 215 | rs.popViewMatrix(); |
||
| 704 | chris | 216 | |
| 521 | chris | 217 | } |
| 218 | |||
| 219 | public void sendEvent(MenuItem sender, String msgType, String param) |
||
| 220 | { |
||
| 221 | if (mEventListener != null) |
||
| 222 | { |
||
| 223 | mEventListener.onMessage(this, sender, msgType, EventProcessor.parseParameter(param)); |
||
| 224 | } |
||
| 225 | } |
||
| 226 | |||
| 227 | /** Find a Menu item (first occurence) with the specified name. */ |
||
| 228 | public MenuItem findMenuItem(String name) |
||
| 229 | { |
||
| 230 | for (int i = 0; i < mMenuItems.size(); i++) |
||
| 231 | { |
||
| 232 | MenuItem item = mMenuItems.get(i); |
||
| 233 | if (item.getName().equalsIgnoreCase(name)) |
||
| 234 | return item; |
||
| 235 | } |
||
| 236 | return null; |
||
| 237 | } |
||
| 238 | |||
| 239 | /** Get numbers of Menu Items. */ |
||
| 240 | public int getNumMenuItems() |
||
| 241 | { |
||
| 242 | return mMenuItems.size(); |
||
| 243 | } |
||
| 244 | |||
| 245 | /** Get a specific menu item per index. */ |
||
| 246 | public MenuItem getMenuItem(int index) |
||
| 247 | { |
||
| 248 | if ((index < 0) || (index >= mMenuItems.size())) |
||
| 249 | return null; |
||
| 250 | |||
| 251 | return mMenuItems.get(index); |
||
| 252 | } |
||
| 531 | chris | 253 | |
| 254 | /** Start to fade in. */ |
||
| 255 | public void startFadeIn() |
||
| 256 | { |
||
| 257 | mFadeTimer = mFadeTime; |
||
| 258 | mFadeState = FadeState.FADE_IN; |
||
| 259 | } |
||
| 260 | |||
| 261 | /** Start to fade out. */ |
||
| 262 | public void startFadeOut() |
||
| 263 | { |
||
| 264 | mFadeTimer = mFadeTime; |
||
| 265 | mFadeState = FadeState.FADE_OUT; |
||
| 266 | } |
||
| 267 | |||
| 268 | public float getFadeAlpha() |
||
| 269 | { |
||
| 270 | float fadeAlpha = 1.0f; |
||
| 271 | if (mFadeState == FadeState.FADE_IN) |
||
| 272 | fadeAlpha = 1.0f - mFadeTimer / mFadeTime; |
||
| 273 | else if (mFadeState == FadeState.FADE_OUT) |
||
| 274 | fadeAlpha = mFadeTimer / mFadeTime; |
||
| 275 | return fadeAlpha; |
||
| 276 | } |
||
| 521 | chris | 277 | |
| 278 | |||
| 279 | // Getters/Setters================================================================================== |
||
| 280 | |||
| 281 | public String getName() { return mName; } |
||
| 282 | |||
| 283 | public final MenuEventListener getEventListener() { return mEventListener; } |
||
| 284 | public void setEventListener(MenuEventListener handler) { mEventListener = handler; } |
||
| 285 | |||
| 286 | public Vector2 getOrigin() { return mOrigin; } |
||
| 287 | public void setOrigin(Vector2 origin) { mOrigin = origin; } |
||
| 531 | chris | 288 | |
| 289 | public boolean isFadingDone() { return (mFadeTimer <= 0.0f); } |
||
| 290 | public FadeState getFadeState() { return mFadeState; } |
||
| 521 | chris | 291 | |
| 531 | chris | 292 | public boolean isVisible() { return mVisible; } |
| 293 | public void setVisible(boolean visible) { mVisible = visible; } |
||
| 294 | |||
| 295 | public boolean isEnabled() { return mEnabled; } |
||
| 296 | public void setEnabled(boolean enabled) { mEnabled = enabled; } |
||
| 297 | |||
| 521 | chris | 298 | } |
| 299 | |||
| 300 |