Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with
or
.
Download ZIP
Browse files

Refactor menu code a bit

git-svn-id: http://svn.nickg.me.uk/work/lander/trunk@301 a97b1542-0b21-0410-a459-e47997c36f34
  • Loading branch information...
commit 90d87b9eeae46b3ce9639ebc9d44d6fc187082dc 1 parent 4cccf91
nick authored
View
0  AUTHORS
No changes.
View
0  ChangeLog
No changes.
View
339 Copying.txt
@@ -1,339 +0,0 @@
- GNU GENERAL PUBLIC LICENSE
- Version 2, June 1991
-
- Copyright (C) 1989, 1991 Free Software Foundation, Inc.,
- 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- Everyone is permitted to copy and distribute verbatim copies
- of this license document, but changing it is not allowed.
-
- Preamble
-
- The licenses for most software are designed to take away your
-freedom to share and change it. By contrast, the GNU General Public
-License is intended to guarantee your freedom to share and change free
-software--to make sure the software is free for all its users. This
-General Public License applies to most of the Free Software
-Foundation's software and to any other program whose authors commit to
-using it. (Some other Free Software Foundation software is covered by
-the GNU Lesser General Public License instead.) You can apply it to
-your programs, too.
-
- When we speak of free software, we are referring to freedom, not
-price. Our General Public Licenses are designed to make sure that you
-have the freedom to distribute copies of free software (and charge for
-this service if you wish), that you receive source code or can get it
-if you want it, that you can change the software or use pieces of it
-in new free programs; and that you know you can do these things.
-
- To protect your rights, we need to make restrictions that forbid
-anyone to deny you these rights or to ask you to surrender the rights.
-These restrictions translate to certain responsibilities for you if you
-distribute copies of the software, or if you modify it.
-
- For example, if you distribute copies of such a program, whether
-gratis or for a fee, you must give the recipients all the rights that
-you have. You must make sure that they, too, receive or can get the
-source code. And you must show them these terms so they know their
-rights.
-
- We protect your rights with two steps: (1) copyright the software, and
-(2) offer you this license which gives you legal permission to copy,
-distribute and/or modify the software.
-
- Also, for each author's protection and ours, we want to make certain
-that everyone understands that there is no warranty for this free
-software. If the software is modified by someone else and passed on, we
-want its recipients to know that what they have is not the original, so
-that any problems introduced by others will not reflect on the original
-authors' reputations.
-
- Finally, any free program is threatened constantly by software
-patents. We wish to avoid the danger that redistributors of a free
-program will individually obtain patent licenses, in effect making the
-program proprietary. To prevent this, we have made it clear that any
-patent must be licensed for everyone's free use or not licensed at all.
-
- The precise terms and conditions for copying, distribution and
-modification follow.
-
- GNU GENERAL PUBLIC LICENSE
- TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
-
- 0. This License applies to any program or other work which contains
-a notice placed by the copyright holder saying it may be distributed
-under the terms of this General Public License. The "Program", below,
-refers to any such program or work, and a "work based on the Program"
-means either the Program or any derivative work under copyright law:
-that is to say, a work containing the Program or a portion of it,
-either verbatim or with modifications and/or translated into another
-language. (Hereinafter, translation is included without limitation in
-the term "modification".) Each licensee is addressed as "you".
-
-Activities other than copying, distribution and modification are not
-covered by this License; they are outside its scope. The act of
-running the Program is not restricted, and the output from the Program
-is covered only if its contents constitute a work based on the
-Program (independent of having been made by running the Program).
-Whether that is true depends on what the Program does.
-
- 1. You may copy and distribute verbatim copies of the Program's
-source code as you receive it, in any medium, provided that you
-conspicuously and appropriately publish on each copy an appropriate
-copyright notice and disclaimer of warranty; keep intact all the
-notices that refer to this License and to the absence of any warranty;
-and give any other recipients of the Program a copy of this License
-along with the Program.
-
-You may charge a fee for the physical act of transferring a copy, and
-you may at your option offer warranty protection in exchange for a fee.
-
- 2. You may modify your copy or copies of the Program or any portion
-of it, thus forming a work based on the Program, and copy and
-distribute such modifications or work under the terms of Section 1
-above, provided that you also meet all of these conditions:
-
- a) You must cause the modified files to carry prominent notices
- stating that you changed the files and the date of any change.
-
- b) You must cause any work that you distribute or publish, that in
- whole or in part contains or is derived from the Program or any
- part thereof, to be licensed as a whole at no charge to all third
- parties under the terms of this License.
-
- c) If the modified program normally reads commands interactively
- when run, you must cause it, when started running for such
- interactive use in the most ordinary way, to print or display an
- announcement including an appropriate copyright notice and a
- notice that there is no warranty (or else, saying that you provide
- a warranty) and that users may redistribute the program under
- these conditions, and telling the user how to view a copy of this
- License. (Exception: if the Program itself is interactive but
- does not normally print such an announcement, your work based on
- the Program is not required to print an announcement.)
-
-These requirements apply to the modified work as a whole. If
-identifiable sections of that work are not derived from the Program,
-and can be reasonably considered independent and separate works in
-themselves, then this License, and its terms, do not apply to those
-sections when you distribute them as separate works. But when you
-distribute the same sections as part of a whole which is a work based
-on the Program, the distribution of the whole must be on the terms of
-this License, whose permissions for other licensees extend to the
-entire whole, and thus to each and every part regardless of who wrote it.
-
-Thus, it is not the intent of this section to claim rights or contest
-your rights to work written entirely by you; rather, the intent is to
-exercise the right to control the distribution of derivative or
-collective works based on the Program.
-
-In addition, mere aggregation of another work not based on the Program
-with the Program (or with a work based on the Program) on a volume of
-a storage or distribution medium does not bring the other work under
-the scope of this License.
-
- 3. You may copy and distribute the Program (or a work based on it,
-under Section 2) in object code or executable form under the terms of
-Sections 1 and 2 above provided that you also do one of the following:
-
- a) Accompany it with the complete corresponding machine-readable
- source code, which must be distributed under the terms of Sections
- 1 and 2 above on a medium customarily used for software interchange; or,
-
- b) Accompany it with a written offer, valid for at least three
- years, to give any third party, for a charge no more than your
- cost of physically performing source distribution, a complete
- machine-readable copy of the corresponding source code, to be
- distributed under the terms of Sections 1 and 2 above on a medium
- customarily used for software interchange; or,
-
- c) Accompany it with the information you received as to the offer
- to distribute corresponding source code. (This alternative is
- allowed only for noncommercial distribution and only if you
- received the program in object code or executable form with such
- an offer, in accord with Subsection b above.)
-
-The source code for a work means the preferred form of the work for
-making modifications to it. For an executable work, complete source
-code means all the source code for all modules it contains, plus any
-associated interface definition files, plus the scripts used to
-control compilation and installation of the executable. However, as a
-special exception, the source code distributed need not include
-anything that is normally distributed (in either source or binary
-form) with the major components (compiler, kernel, and so on) of the
-operating system on which the executable runs, unless that component
-itself accompanies the executable.
-
-If distribution of executable or object code is made by offering
-access to copy from a designated place, then offering equivalent
-access to copy the source code from the same place counts as
-distribution of the source code, even though third parties are not
-compelled to copy the source along with the object code.
-
- 4. You may not copy, modify, sublicense, or distribute the Program
-except as expressly provided under this License. Any attempt
-otherwise to copy, modify, sublicense or distribute the Program is
-void, and will automatically terminate your rights under this License.
-However, parties who have received copies, or rights, from you under
-this License will not have their licenses terminated so long as such
-parties remain in full compliance.
-
- 5. You are not required to accept this License, since you have not
-signed it. However, nothing else grants you permission to modify or
-distribute the Program or its derivative works. These actions are
-prohibited by law if you do not accept this License. Therefore, by
-modifying or distributing the Program (or any work based on the
-Program), you indicate your acceptance of this License to do so, and
-all its terms and conditions for copying, distributing or modifying
-the Program or works based on it.
-
- 6. Each time you redistribute the Program (or any work based on the
-Program), the recipient automatically receives a license from the
-original licensor to copy, distribute or modify the Program subject to
-these terms and conditions. You may not impose any further
-restrictions on the recipients' exercise of the rights granted herein.
-You are not responsible for enforcing compliance by third parties to
-this License.
-
- 7. If, as a consequence of a court judgment or allegation of patent
-infringement or for any other reason (not limited to patent issues),
-conditions are imposed on you (whether by court order, agreement or
-otherwise) that contradict the conditions of this License, they do not
-excuse you from the conditions of this License. If you cannot
-distribute so as to satisfy simultaneously your obligations under this
-License and any other pertinent obligations, then as a consequence you
-may not distribute the Program at all. For example, if a patent
-license would not permit royalty-free redistribution of the Program by
-all those who receive copies directly or indirectly through you, then
-the only way you could satisfy both it and this License would be to
-refrain entirely from distribution of the Program.
-
-If any portion of this section is held invalid or unenforceable under
-any particular circumstance, the balance of the section is intended to
-apply and the section as a whole is intended to apply in other
-circumstances.
-
-It is not the purpose of this section to induce you to infringe any
-patents or other property right claims or to contest validity of any
-such claims; this section has the sole purpose of protecting the
-integrity of the free software distribution system, which is
-implemented by public license practices. Many people have made
-generous contributions to the wide range of software distributed
-through that system in reliance on consistent application of that
-system; it is up to the author/donor to decide if he or she is willing
-to distribute software through any other system and a licensee cannot
-impose that choice.
-
-This section is intended to make thoroughly clear what is believed to
-be a consequence of the rest of this License.
-
- 8. If the distribution and/or use of the Program is restricted in
-certain countries either by patents or by copyrighted interfaces, the
-original copyright holder who places the Program under this License
-may add an explicit geographical distribution limitation excluding
-those countries, so that distribution is permitted only in or among
-countries not thus excluded. In such case, this License incorporates
-the limitation as if written in the body of this License.
-
- 9. The Free Software Foundation may publish revised and/or new versions
-of the General Public License from time to time. Such new versions will
-be similar in spirit to the present version, but may differ in detail to
-address new problems or concerns.
-
-Each version is given a distinguishing version number. If the Program
-specifies a version number of this License which applies to it and "any
-later version", you have the option of following the terms and conditions
-either of that version or of any later version published by the Free
-Software Foundation. If the Program does not specify a version number of
-this License, you may choose any version ever published by the Free Software
-Foundation.
-
- 10. If you wish to incorporate parts of the Program into other free
-programs whose distribution conditions are different, write to the author
-to ask for permission. For software which is copyrighted by the Free
-Software Foundation, write to the Free Software Foundation; we sometimes
-make exceptions for this. Our decision will be guided by the two goals
-of preserving the free status of all derivatives of our free software and
-of promoting the sharing and reuse of software generally.
-
- NO WARRANTY
-
- 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
-FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
-OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
-PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
-OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
-MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
-TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
-PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
-REPAIR OR CORRECTION.
-
- 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
-WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
-REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
-INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
-OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
-TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
-YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
-PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
-POSSIBILITY OF SUCH DAMAGES.
-
- END OF TERMS AND CONDITIONS
-
- How to Apply These Terms to Your New Programs
-
- If you develop a new program, and you want it to be of the greatest
-possible use to the public, the best way to achieve this is to make it
-free software which everyone can redistribute and change under these terms.
-
- To do so, attach the following notices to the program. It is safest
-to attach them to the start of each source file to most effectively
-convey the exclusion of warranty; and each file should have at least
-the "copyright" line and a pointer to where the full notice is found.
-
- <one line to give the program's name and a brief idea of what it does.>
- Copyright (C) <year> <name of author>
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License along
- with this program; if not, write to the Free Software Foundation, Inc.,
- 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
-
-Also add information on how to contact you by electronic and paper mail.
-
-If the program is interactive, make it output a short notice like this
-when it starts in an interactive mode:
-
- Gnomovision version 69, Copyright (C) year name of author
- Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
- This is free software, and you are welcome to redistribute it
- under certain conditions; type `show c' for details.
-
-The hypothetical commands `show w' and `show c' should show the appropriate
-parts of the General Public License. Of course, the commands you use may
-be called something other than `show w' and `show c'; they could even be
-mouse-clicks or menu items--whatever suits your program.
-
-You should also get your employer (if you work as a programmer) or your
-school, if any, to sign a "copyright disclaimer" for the program, if
-necessary. Here is a sample; alter the names:
-
- Yoyodyne, Inc., hereby disclaims all copyright interest in the program
- `Gnomovision' (which makes passes at compilers) written by James Hacker.
-
- <signature of Ty Coon>, 1 April 1989
- Ty Coon, President of Vice
-
-This General Public License does not permit incorporating your program into
-proprietary programs. If your program is a subroutine library, you may
-consider it more useful to permit linking proprietary applications with the
-library. If this is what you want to do, use the GNU Lesser General
-Public License instead of this License.
View
0  NEWS
No changes.
View
0  README
No changes.
View
4 configure.ac
@@ -1,7 +1,7 @@
AC_INIT([Lunar Lander], [0.9],
- [Nick Gasson <nick.gasson@yahoo.co.uk>],
+ [Nick Gasson <nick@cakesniffer.co.uk>],
[lander])
-AM_INIT_AUTOMAKE([-Wall -Werror foreign])
+AM_INIT_AUTOMAKE([-Wall -Werror])
AC_PROG_CC
AC_PROG_CXX
View
2  src/Makefile.am
@@ -8,6 +8,6 @@ lander_SOURCES = Main.cpp Lander.hpp Game.cpp \
HighScores.cpp HighScores.hpp Input.cpp Input.hpp \
DataFile.cpp DataFile.hpp File.cpp File.hpp Platform.hpp \
OpenGL.cpp OpenGL.hpp Menu.cpp Menu.hpp Emitter.cpp \
- Emitter.hpp Screens.cpp Screens.hpp Strings.hpp
+ Emitter.hpp Screens.cpp Screens.hpp Strings.hpp
dist_pkgdata_DATA = ../lander.dat ../Default_Font.ttf ../Hollow_Font.ttf
View
589 src/Menu.cpp
@@ -25,350 +25,303 @@ extern DataFile *g_pData;
/* Loads menu data */
void MainMenu::Load()
{
- OpenGL &opengl = OpenGL::GetInstance();
+ OpenGL &opengl = OpenGL::GetInstance();
- // Load textures
- if (!m_hasloaded)
- {
- uStartTexture = opengl.LoadTextureAlpha(g_pData, "StartOption.bmp");
- uHighTexture = opengl.LoadTextureAlpha(g_pData, "HighScoreOption.bmp");
- uOptionsTexture = opengl.LoadTextureAlpha(g_pData, "Options.bmp");
- uExitTexture = opengl.LoadTextureAlpha(g_pData, "ExitOption.bmp");
- uStarTexture = opengl.LoadTextureAlpha(g_pData, "Star.bmp");
- }
+ // Load textures
+ if (!hasloaded) {
+ uStartTexture = opengl.LoadTextureAlpha(g_pData, "StartOption.bmp");
+ uHighTexture = opengl.LoadTextureAlpha(g_pData, "HighScoreOption.bmp");
+ uOptionsTexture = opengl.LoadTextureAlpha(g_pData, "Options.bmp");
+ uExitTexture = opengl.LoadTextureAlpha(g_pData, "ExitOption.bmp");
+ hasloaded = true;
+ }
- // Create start button
- start.x = (opengl.GetWidth() - 256) / 2;
- start.y = (opengl.GetHeight() - 128) / 2;
- start.height = 32;
- start.width = 256;
- start.uTexture = uStartTexture;
+ // Create start button
+ start.x = (opengl.GetWidth() - 256) / 2;
+ start.y = (opengl.GetHeight() - 128) / 2;
+ start.height = 32;
+ start.width = 256;
+ start.uTexture = uStartTexture;
- // Create high score button
- highscore.x = (opengl.GetWidth() - 512) / 2;
- highscore.y = start.y + 32;
- highscore.height = 32;
- highscore.width = 512;
- highscore.uTexture = uHighTexture;
+ // Create high score button
+ highscore.x = (opengl.GetWidth() - 512) / 2;
+ highscore.y = start.y + 32;
+ highscore.height = 32;
+ highscore.width = 512;
+ highscore.uTexture = uHighTexture;
- // Create options button
- options.x = (opengl.GetWidth() - 256) / 2;
- options.y = start.y + 64;
- options.height = 32;
- options.width = 256;
- options.uTexture = uOptionsTexture;
+ // Create options button
+ options.x = (opengl.GetWidth() - 256) / 2;
+ options.y = start.y + 64;
+ options.height = 32;
+ options.width = 256;
+ options.uTexture = uOptionsTexture;
- // Create exit button
- exit.x = (opengl.GetWidth() - 128) / 2;
- exit.y = start.y + 96;
- exit.height = 32;
- exit.width = 128;
- exit.uTexture = uExitTexture;
+ // Create exit button
+ exit.x = (opengl.GetWidth() - 128) / 2;
+ exit.y = start.y + 96;
+ exit.height = 32;
+ exit.width = 128;
+ exit.uTexture = uExitTexture;
- // Set fade in state
- m_state = msFadeIn;
- m_fade = 0.0f;
+ // Set fade in state
+ state = msFadeIn;
+ fade = 0.0f;
- // Reset the stars
- for (int i = 0; i < NUM_STARS; i++)
- {
- stars[i].active = false;
- stars[i].quad.uTexture = uStarTexture;
- stars[i].scale = 0.5f;
- }
- m_stardelay = 1;
- m_starrotate = 0.0f;
-
- // Set default selections
- m_starsel = 1.5f;
- m_optsel = 1.0f;
- m_highsel = 1.0f;
- m_exitsel = 1.0f;
+ // Set default selections
+ starsel = 1.5f;
+ optsel = 1.0f;
+ highsel = 1.0f;
+ exitsel = 1.0f;
- // Show a new hint
- m_hint_timeout = 0;
- m_hintidx = 0;
+ // Show a new hint
+ hint_timeout = 0;
+ hintidx = 0;
}
/* Processes user input */
void MainMenu::Process()
{
- Input &input = Input::GetInstance();
- OpenGL &opengl = OpenGL::GetInstance();
- ScreenManager &sm = ScreenManager::GetInstance();
- int i;
+ Input &input = Input::GetInstance();
+ OpenGL &opengl = OpenGL::GetInstance();
+ ScreenManager &sm = ScreenManager::GetInstance();
+ int i;
+
+ // Stop user doing something when they're not supposed to
+ if (state == msInMenu) {
+ // Look at keys
+ if (input.GetKeyState(SDLK_DOWN) || input.QueryJoystickAxis(1) > 0) {
+ // Move the selection down
+ if (starsel > 1.4f) {
+ starsel = 1.0f;
+ highsel = 1.5f;
+ }
+ else if (highsel > 1.4f) {
+ highsel = 1.0f;
+ optsel = 1.5f;
+ }
+ else if (optsel > 1.4f) {
+ optsel = 1.0f;
+ exitsel = 1.5f;
+ }
+ input.ResetKey(SDLK_DOWN);
+ //opengl.di.ResetProp(DIJ_YAXIS);
+ }
+ else if (input.GetKeyState(SDLK_UP) /*|| opengl.di.QueryJoystick(DIJ_YAXIS) < 0*/) {
+ // Move the selection up
+ if (highsel > 1.4f) {
+ highsel = 1.0f;
+ starsel = 1.5f;
+ }
+ else if (optsel > 1.4f) {
+ optsel = 1.0f;
+ highsel = 1.5f;
+ }
+ else if (exitsel > 1.4f) {
+ exitsel = 1.0f;
+ optsel = 1.5f;
+ }
+ input.ResetKey(SDLK_UP);
+ //opengl.di.ResetProp(DIJ_YAXIS);
+ }
+ else if (input.GetKeyState(SDLK_RETURN)
+ /*|| opengl.di.QueryJoystick(DIJ_BUTTON0) || opengl.di.QueryJoystick(DIJ_BUTTON1)*/ ) {
+ // Select this option
+ if (starsel > 1.4f)
+ state = msFadeToStart;
+ else if (highsel > 1.4f)
+ state = msFadeToHigh;
+ else if (optsel > 1.4f)
+ state = msFadeToOpt;
+ else if (exitsel > 1.4f)
+ state = msFadeToExit;
+ input.ResetKey(SDLK_RETURN);
+ /*opengl.di.ResetProp(DIJ_BUTTON0);
+ opengl.di.ResetProp(DIJ_BUTTON1);*/
+ }
+ }
+
+ // See what menu state we're in
+ if (state == msFadeIn) {
+ // Apply the fade to the menu items
+ if (fade >= 1.0f) {
+ // Switch to the next state
+ state = msInMenu;
+ fade = 1.0f;
+ }
+ else
+ fade += MENU_FADE_SPEED;
+ }
+ else if (state == msFadeToStart) {
+ // Apply fade
+ if (fade <= 0.0f) {
+ // Move to the game screen
+ sm.SelectScreen("GAME");
+ Game *g = static_cast<Game*>(sm.GetScreenById("GAME"));
+ g->NewGame();
+ }
+ else {
+ fade -= MENU_FADE_SPEED;
+ starsel += 0.5f;
+ }
+ }
+ else if (state == msFadeToHigh) {
+ // Apply fade
+ if (fade <= 0.0f) {
+ // Move to the high score screen
+ HighScores *hs = static_cast<HighScores*>(sm.GetScreenById("HIGH SCORES"));
+ hs->DisplayScores();
+ }
+ else {
+ fade -= MENU_FADE_SPEED;
+ highsel += 0.5f;
+ }
+ }
+ else if (state == msFadeToOpt) {
+ // Apply fade
+ if (fade <= 0.0f) {
+ // Move to the options screen
+ // TODO!
+ sm.SelectScreen("MAIN MENU");
+ }
+ else {
+ fade -= MENU_FADE_SPEED;
+ optsel += 0.5f;
+ }
+ }
+ else if (state == msFadeToExit) {
+ // Apply fade
+ if (fade <= 0.0f) {
+ // Exit the game
+ opengl.Stop();
+ }
+ else {
+ fade -= MENU_FADE_SPEED;
+ exitsel += 0.5f;
+ }
+ }
+
+ // Move the stars
+ StarListIt it = stars.begin();
+ while (it != stars.end()) {
+ if ((*it).Move()) {
+ // Star has left the screen
+ it = stars.erase(it);
+ }
+ else
+ ++it;
+ }
+
+ // Maybe create a new star
+ if (stars.size() < MAX_STARS)
+ stars.push_back(MenuStar());
+}
- // Stop user doing something when they're not supposed to
- if (m_state == msInMenu)
- {
- // Look at keys
- if (input.GetKeyState(SDLK_DOWN) || input.QueryJoystickAxis(1) > 0)
- {
- // Move the selection down
- if (m_starsel > 1.4f)
- {
- m_starsel = 1.0f;
- m_highsel = 1.5f;
- }
- else if (m_highsel > 1.4f)
- {
- m_highsel = 1.0f;
- m_optsel = 1.5f;
- }
- else if (m_optsel > 1.4f)
- {
- m_optsel = 1.0f;
- m_exitsel = 1.5f;
- }
- input.ResetKey(SDLK_DOWN);
- //opengl.di.ResetProp(DIJ_YAXIS);
- }
- else if (input.GetKeyState(SDLK_UP) /*|| opengl.di.QueryJoystick(DIJ_YAXIS) < 0*/)
- {
- // Move the selection up
- if (m_highsel > 1.4f)
- {
- m_highsel = 1.0f;
- m_starsel = 1.5f;
- }
- else if (m_optsel > 1.4f)
- {
- m_optsel = 1.0f;
- m_highsel = 1.5f;
- }
- else if (m_exitsel > 1.4f)
- {
- m_exitsel = 1.0f;
- m_optsel = 1.5f;
- }
- input.ResetKey(SDLK_UP);
- //opengl.di.ResetProp(DIJ_YAXIS);
- }
- else if (input.GetKeyState(SDLK_RETURN)
- /*|| opengl.di.QueryJoystick(DIJ_BUTTON0) || opengl.di.QueryJoystick(DIJ_BUTTON1)*/ )
- {
- // Select this option
- if (m_starsel > 1.4f)
- m_state = msFadeToStart;
- else if (m_highsel > 1.4f)
- m_state = msFadeToHigh;
- else if (m_optsel > 1.4f)
- m_state = msFadeToOpt;
- else if (m_exitsel > 1.4f)
- m_state = msFadeToExit;
- input.ResetKey(SDLK_RETURN);
- /*opengl.di.ResetProp(DIJ_BUTTON0);
- opengl.di.ResetProp(DIJ_BUTTON1);*/
- }
- }
+void MainMenu::Display()
+{
+ OpenGL &opengl = OpenGL::GetInstance();
- // See what menu state we're in
- if (m_state == msFadeIn)
- {
- // Apply the fade to the menu items
- if (m_fade >= 1.0f)
- {
- // Switch to the next state
- m_state = msInMenu;
- m_fade = 1.0f;
- }
- else
- m_fade += MENU_FADE_SPEED;
- }
- else if (m_state == msFadeToStart)
- {
- // Apply fade
- if (m_fade <= 0.0f)
- {
- // Move to the game screen
- sm.SelectScreen("GAME");
- Game *g = static_cast<Game*>(sm.GetScreenById("GAME"));
- g->NewGame();
- }
- else
- {
- m_fade -= MENU_FADE_SPEED;
- m_starsel += 0.5f;
- }
- }
- else if (m_state == msFadeToHigh)
- {
- // Apply fade
- if (m_fade <= 0.0f)
- {
- // Move to the high score screen
- HighScores *hs = static_cast<HighScores*>(sm.GetScreenById("HIGH SCORES"));
- hs->DisplayScores();
- }
- else
- {
- m_fade -= MENU_FADE_SPEED;
- m_highsel += 0.5f;
- }
- }
- else if (m_state == msFadeToOpt)
- {
- // Apply fade
- if (m_fade <= 0.0f)
- {
- // Move to the options screen
- // TODO!
- sm.SelectScreen("MAIN MENU");
- }
- else
- {
- m_fade -= MENU_FADE_SPEED;
- m_optsel += 0.5f;
- }
- }
- else if (m_state == msFadeToExit)
- {
- // Apply fade
- if (m_fade <= 0.0f)
- {
- // Exit the game
- opengl.Stop();
- }
- else
- {
- m_fade -= MENU_FADE_SPEED;
- m_exitsel += 0.5f;
- }
- }
+ for (StarListIt it = stars.begin(); it != stars.end(); ++it) {
+ (*it).Display();
+ }
+
+ // Draw logo and menu items
+ opengl.DrawBlendScale(&start, fade, starsel);
+ opengl.DrawBlendScale(&highscore, fade, highsel);
+ opengl.DrawBlendScale(&options, fade, optsel);
+ opengl.DrawBlendScale(&exit, fade, exitsel);
- // Move the stars
- for (i = 0; i < NUM_STARS; i++)
- {
- if (stars[i].active)
- {
- if (stars[i].xpos > opengl.GetWidth()/2)
- {
- stars[i].xpos += 4 * (float)cos(stars[i].angle);
- stars[i].ypos += 4 * (float)sin(stars[i].angle);
- }
- else
- {
- stars[i].xpos -= 4 * (float)cos(stars[i].angle);
- stars[i].ypos -= 4 * (float)sin(stars[i].angle);
- }
- stars[i].quad.x = (int)stars[i].xpos;
- stars[i].quad.y = (int)stars[i].ypos;
- stars[i].scale += 0.003f;
+ FreeType &ft = FreeType::GetInstance();
- // See if it left the screen
- if ((stars[i].quad.x > opengl.GetWidth()) ||
- (stars[i].quad.y > opengl.GetHeight()) ||
- (stars[i].quad.x + stars[i].quad.width < 0) ||
- (stars[i].quad.y + stars[i].quad.height < 0))
- stars[i].active = false;
- }
- }
+ opengl.Colour(0.0f, 1.0f, 0.0f, fade);
+ ft.Print(ftHollow, (opengl.GetWidth() - ft.GetStringWidth(ftHollow, S_TITLE))/2, 60, S_TITLE);
+
+ // Draw some hint texts
+ const int numhints = 7;
+ const char *hints[][2] = {
+ { "Use the arrow keys to rotate the ship", "" },
+ { "Press the up arrow to fire the thruster", "" },
+ { "Smaller landing pads give you more points", "" },
+ { "Press P to pause the game", "" },
+ { "Press escape to self destruct", "" },
+ { "You can only land safely when the", "speed bar is green" },
+ { "Collect the spinning rings to", "unlock the landing pads" }
+ };
- // Create a new star
- if (--m_stardelay == 0)
- {
- for (i = 0; i < NUM_STARS; i++)
- {
- if (!stars[i].active)
- {
- stars[i].quad.height = 20;
- stars[i].quad.width = 20;
- stars[i].xpos = (float)(rand()%(opengl.GetWidth()/2)+opengl.GetWidth()/4);
- stars[i].ypos = (float)(rand()%(opengl.GetHeight()/2)+opengl.GetHeight()/4);
- stars[i].quad.x = (int)stars[i].xpos;
- stars[i].quad.y = (int)stars[i].ypos;
- stars[i].scale = 0.1f;
- if (stars[i].xpos-opengl.GetWidth()/2 < -0.01f || stars[i].xpos-opengl.GetWidth()/2 > 0.01f)
- {
- stars[i].angle = (float)atan((stars[i].ypos-opengl.GetHeight()/2)/(stars[i].xpos-opengl.GetWidth()/2));
- stars[i].active = true;
- }
- break;
- }
- }
- m_stardelay = 1;
- }
+ if (hint_timeout == 0) {
+ hintidx = rand() % numhints;
+ hint_timeout = HINT_DISPLAY_TIME;
+ }
+ else
+ hint_timeout--;
+
+ ft.Print(ftNormal,
+ (opengl.GetWidth() - ft.GetStringWidth(ftNormal, hints[hintidx][0])) / 2,
+ opengl.GetHeight() - 140,
+ hints[hintidx][0]);
+ ft.Print(ftNormal,
+ (opengl.GetWidth() - ft.GetStringWidth(ftNormal, hints[hintidx][1])) / 2,
+ opengl.GetHeight() - 120,
+ hints[hintidx][1]);
}
-/* Displays scene to user */
-void MainMenu::Display()
+bool MenuStar::hasLoaded = false;
+float MenuStar::starRotate = 0.0f;
+GLuint MenuStar::uStarTexture = 0;
+
+MenuStar::MenuStar()
+ : active(false),
+ scale(INIT_SCALE)
{
- int i;
+ OpenGL &opengl = OpenGL::GetInstance();
+
+ if (!hasLoaded) {
+ uStarTexture = opengl.LoadTextureAlpha(g_pData, "Star.bmp");
+ hasLoaded = true;
+ }
- OpenGL &opengl = OpenGL::GetInstance();
+ const int screenWidth = opengl.GetWidth();
+ const int screenHeight = opengl.GetHeight();
- // Display stars
- for (i = 0; i < NUM_STARS; i++) {
- if (stars[i].active) {
- if (m_state == msFadeIn || m_state == msInMenu)
- opengl.DrawRotateScale(&stars[i].quad, m_starrotate, stars[i].scale);
- else
- opengl.DrawRotateBlendScale(&stars[i].quad, m_starrotate, m_fade, stars[i].scale);
- m_starrotate += 0.005f;
- }
- }
+ xpos = (float)(rand()%(screenWidth/2) + screenWidth/4);
+ ypos = (float)(rand()%(screenHeight/2) + screenHeight/4);
- // Draw logo and menu items
- opengl.DrawBlendScale(&start, m_fade, m_starsel);
- opengl.DrawBlendScale(&highscore, m_fade, m_highsel);
- opengl.DrawBlendScale(&options, m_fade, m_optsel);
- opengl.DrawBlendScale(&exit, m_fade, m_exitsel);
+ float ratio = (ypos - screenHeight/2) / (xpos - screenWidth/2);
+ angle = atanf(ratio);
+
+ quad.uTexture = uStarTexture;
+ quad.height = TEXTURE_SIZE;
+ quad.width = TEXTURE_SIZE;
+ quad.x = (int)xpos;
+ quad.y = (int)ypos;
+}
- FreeType &ft = FreeType::GetInstance();
+void MenuStar::Display(float fade)
+{
+ OpenGL::GetInstance().DrawRotateBlendScale(&quad, starRotate, fade, scale);
+ starRotate += ROTATE_SPEED;
+}
- opengl.Colour(0.0f, 1.0f, 0.0f, m_fade);
- ft.Print(ftHollow, (opengl.GetWidth() - ft.GetStringWidth(ftHollow, S_TITLE))/2, 60, S_TITLE);
-
- // This is a huge hack to neatly format revision data from subversion
- const char *rev = "$Rev$";
- char revstr[4];
- revstr[0] = rev[6];
- revstr[1] = rev[7];
- revstr[2] = rev[8];
- revstr[3] = '\0';
-
- ft.Print
- (
- ftNormal,
- 10,
- opengl.GetHeight() - 20,
- S_VERSION,
- revstr
- );
+bool MenuStar::Move()
+{
+ const int screenWidth = OpenGL::GetInstance().GetWidth();
+ const int screenHeight = OpenGL::GetInstance().GetHeight();
- // Draw some hint texts
- const int numhints = 7;
- const char *hints[][2] =
- {
- { "Use the arrow keys to rotate the ship", "" },
- { "Press the up arrow to fire the thruster", "" },
- { "Smaller landing pads give you more points", "" },
- { "Press P to pause the game", "" },
- { "Press escape to self destruct", "" },
- { "You can only land safely when the", "speed bar is green" },
- { "Collect the spinning rings to", "unlock the landing pads" }
- };
+ if (xpos > screenWidth / 2) {
+ xpos += SPEED * cosf(angle);
+ ypos += SPEED * sinf(angle);
+ }
+ else {
+ xpos -= SPEED * cosf(angle);
+ ypos -= SPEED * sinf(angle);
+ }
+ quad.x = (int)xpos;
+ quad.y = (int)ypos;
+ scale += ENLARGE_RATE;
- if (m_hint_timeout == 0)
- {
- m_hintidx = rand() % numhints;
- m_hint_timeout = HINT_DISPLAY_TIME;
- }
- else
- m_hint_timeout--;
-
- ft.Print
- (
- ftNormal,
- (opengl.GetWidth() - ft.GetStringWidth(ftNormal, hints[m_hintidx][0])) / 2,
- opengl.GetHeight() - 140,
- hints[m_hintidx][0]
- );
- ft.Print
- (
- ftNormal,
- (opengl.GetWidth() - ft.GetStringWidth(ftNormal, hints[m_hintidx][1])) / 2,
- opengl.GetHeight() - 120,
- hints[m_hintidx][1]
- );
+ // Has it left the screen?
+ return (quad.x > screenWidth
+ || quad.y > screenHeight
+ || quad.x + quad.width < 0
+ || quad.y + quad.height < 0);
}
View
73 src/Menu.hpp
@@ -23,45 +23,58 @@
#include "Screens.hpp"
#define MENU_FADE_SPEED 0.1f
-#define NUM_STARS 512
#define HINT_DISPLAY_TIME 140
-/*
- * The menu screen.
- */
-class MainMenu : public Screen
-{
+class MenuStar {
+public:
+ MenuStar();
+
+ bool Move();
+ void Display(float fade=1.0f);
+
+private:
+ static const float ROTATE_SPEED = 0.005f;
+ static const float ENLARGE_RATE = 0.003f;
+ static const float INIT_SCALE = 0.1f;
+ static const int SPEED = 4;
+ static const int TEXTURE_SIZE = 20;
+
+ TextureQuad quad;
+ float scale;
+ bool active;
+ float angle, xpos, ypos;
+
+ static float starRotate;
+ static bool hasLoaded;
+ static GLuint uStarTexture;
+};
+
+class MainMenu : public Screen {
public:
- MainMenu() : m_hasloaded(false) { }
- virtual ~MainMenu() { }
+ MainMenu() : hasloaded(false) { }
+ virtual ~MainMenu() { }
- void Load();
- void Process();
- void Display();
+ void Load();
+ void Process();
+ void Display();
private:
- enum MenuState { msFadeIn, msInMenu, msFadeToStart,
- msFadeToHigh, msFadeToOpt, msFadeToExit };
+ enum MenuState { msFadeIn, msInMenu, msFadeToStart,
+ msFadeToHigh, msFadeToOpt, msFadeToExit };
- TextureQuad logo, start, highscore, options, exit;
- float m_fade, m_starsel, m_highsel, m_optsel, m_exitsel;
- bool m_hasloaded;
- GLuint uStartTexture, uHighTexture, uOptionsTexture, uExitTexture;
- GLuint uStarTexture;
- MenuState m_state;
+ TextureQuad logo, start, highscore, options, exit;
+ float fade, starsel, highsel, optsel, exitsel;
+ bool hasloaded;
+ GLuint uStartTexture, uHighTexture, uOptionsTexture, uExitTexture;
+ MenuState state;
- int m_hint_timeout, m_hintidx;
+ int hint_timeout, hintidx;
- // Stars
- struct Star
- {
- TextureQuad quad;
- float scale;
- bool active;
- float angle, xpos, ypos;
- } stars[NUM_STARS];
- int m_stardelay;
- float m_starrotate;
+ static const int MAX_STARS = 80;
+ typedef vector<MenuStar> StarList;
+ typedef StarList::iterator StarListIt;
+ vector<MenuStar> stars;
};
+
#endif
View
136 src/Screens.hpp
@@ -1,69 +1,67 @@
-/*
- * Screens.hpp - Definition of abstract class to represent game screens.
- * Copyright (C) 2006 Nick Gasson
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- */
-
-#ifndef INC_SCREENS_HPP
-#define INC_SCREENS_HPP
-
-#include "Platform.hpp"
-
-/*
- * A screen within the game that can be displayed.
- */
-class Screen
-{
-public:
- virtual ~Screen() { }
- virtual void Load() { }
- virtual void Unload() { }
- virtual void Display() { }
- virtual void Process() { }
-};
-
-
-/*
- * Manages the transition between the various m_screens in the game.
- */
-class ScreenManager
-{
-public:
- ScreenManager();
- ~ScreenManager();
-
- static ScreenManager &GetInstance();
-
- void AddScreen(const char *id, Screen *ptr);
- void SelectScreen(const char *id);
- void Process();
- void Display();
- Screen *GetScreenById(const char *id) const;
-
-private:
- // Holds data about the state of an individual screen
- struct ScreenData
- {
- bool loaded;
- Screen *ptr;
- };
-
- typedef map<string, ScreenData> ScreenMap;
- ScreenMap m_screens;
- ScreenData m_active;
-};
-
-#endif
+/*
+ * Screens.hpp - Definition of abstract class to represent game screens.
+ * Copyright (C) 2006 Nick Gasson
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ */
+
+#ifndef INC_SCREENS_HPP
+#define INC_SCREENS_HPP
+
+#include "Platform.hpp"
+
+/*
+ * A screen within the game that can be displayed.
+ */
+class Screen {
+public:
+ virtual ~Screen() { }
+ virtual void Load() { }
+ virtual void Unload() { }
+ virtual void Display() { }
+ virtual void Process() { }
+};
+
+
+/*
+ * Manages the transition between the various screens in the game.
+ */
+class ScreenManager {
+public:
+ ScreenManager();
+ ~ScreenManager();
+
+ static ScreenManager &GetInstance();
+
+ void AddScreen(const char *id, Screen *ptr);
+ void SelectScreen(const char *id);
+ void Process();
+ void Display();
+ Screen *GetScreenById(const char *id) const;
+
+private:
+ // Holds data about the state of an individual screen
+ struct ScreenData
+ {
+ bool loaded;
+ Screen *ptr;
+ };
+
+ typedef map<string, ScreenData> ScreenMap;
+ ScreenMap m_screens;
+ ScreenData m_active;
+};
+
+#endif
Please sign in to comment.
Something went wrong with that request. Please try again.