Subversion Repositories AndroidProjects

Rev

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