From 8d0409bd0c5cc5023d18e7edddb466798aeda78a Mon Sep 17 00:00:00 2001 From: James Turk Date: Thu, 21 Nov 2002 05:40:49 +0000 Subject: [PATCH] Initial revision --- authors.txt | 1 + changelog.txt | 101 ++ doc/ZEngine.linux.doxygen | 191 +++ doc/ZEngine.log | 10 + doc/ZEngine.win32.doxygen | 193 +++ doc/html/ZE__DataPtr_8h-source.html | 77 + doc/html/ZE__DataPtr_8h.html | 32 + doc/html/ZE__Defines_8h-source.html | 36 + doc/html/ZE__Defines_8h.html | 45 + doc/html/ZE__Error_8cpp.html | 30 + doc/html/ZE__Error_8h-source.html | 48 + doc/html/ZE__Error_8h.html | 90 + doc/html/ZE__Includes_8h-source.html | 55 + doc/html/ZE__Includes_8h.html | 44 + doc/html/ZE__ZConfigFile_8cpp.html | 30 + doc/html/ZE__ZConfigFile_8h-source.html | 91 + doc/html/ZE__ZConfigFile_8h.html | 32 + doc/html/ZE__ZEngine_8cpp.html | 30 + doc/html/ZE__ZEngine_8h-source.html | 203 +++ doc/html/ZE__ZEngine_8h.html | 35 + doc/html/ZE__ZFont_8cpp.html | 28 + doc/html/ZE__ZFont_8h-source.html | 94 ++ doc/html/ZE__ZFont_8h.html | 33 + doc/html/ZE__ZImage_8cpp.html | 30 + doc/html/ZE__ZImage_8h-source.html | 81 + doc/html/ZE__ZImage_8h.html | 32 + doc/html/ZE__ZMusic_8cpp.html | 28 + doc/html/ZE__ZMusic_8h-source.html | 85 + doc/html/ZE__ZMusic_8h.html | 32 + doc/html/ZE__ZObject_8h-source.html | 43 + doc/html/ZE__ZObject_8h.html | 32 + doc/html/ZE__ZRect_8cpp.html | 30 + doc/html/ZE__ZRect_8h-source.html | 90 + doc/html/ZE__ZRect_8h.html | 32 + doc/html/ZE__ZSound_8cpp.html | 28 + doc/html/ZE__ZSound_8h-source.html | 84 + doc/html/ZE__ZSound_8h.html | 32 + doc/html/ZE__ZTimer_8cpp.html | 30 + doc/html/ZE__ZTimer_8h-source.html | 60 + doc/html/ZE__ZTimer_8h.html | 32 + doc/html/ZEngine_8h-source.html | 27 + doc/html/ZEngine_8h.html | 37 + doc/html/annotated.html | 29 + doc/html/classZE_1_1FontData-members.html | 18 + doc/html/classZE_1_1FontData.html | 63 + doc/html/classZE_1_1ImageData-members.html | 18 + doc/html/classZE_1_1ImageData.html | 63 + doc/html/classZE_1_1MusicData-members.html | 18 + doc/html/classZE_1_1MusicData.html | 63 + doc/html/classZE_1_1SoundData-members.html | 18 + doc/html/classZE_1_1SoundData.html | 63 + doc/html/classZE_1_1ZConfigFile-members.html | 37 + doc/html/classZE_1_1ZConfigFile.html | 595 +++++++ doc/html/classZE_1_1ZEngine-members.html | 77 + doc/html/classZE_1_1ZEngine.html | 1566 ++++++++++++++++++ doc/html/classZE_1_1ZFont-members.html | 40 + doc/html/classZE_1_1ZFont.html | 768 +++++++++ doc/html/classZE_1_1ZImage-members.html | 36 + doc/html/classZE_1_1ZImage.html | 678 ++++++++ doc/html/classZE_1_1ZMusic-members.html | 35 + doc/html/classZE_1_1ZMusic.html | 531 ++++++ doc/html/classZE_1_1ZObject-members.html | 18 + doc/html/classZE_1_1ZObject.html | 92 + doc/html/classZE_1_1ZRect-members.html | 41 + doc/html/classZE_1_1ZRect.html | 861 ++++++++++ doc/html/classZE_1_1ZSound-members.html | 35 + doc/html/classZE_1_1ZSound.html | 504 ++++++ doc/html/classZE_1_1ZTimer-members.html | 29 + doc/html/classZE_1_1ZTimer.html | 262 +++ doc/html/doxygen.css | 49 + doc/html/doxygen.gif | Bin 0 -> 2378 bytes doc/html/doxygen.png | Bin 0 -> 2352 bytes doc/html/files.html | 40 + doc/html/functions.html | 248 +++ doc/html/globals.html | 40 + doc/html/hierarchy.html | 31 + doc/html/index.html | 35 + doc/html/namespaceZE.html | 209 +++ doc/html/namespacemembers.html | 27 + doc/html/namespaces.html | 17 + doc/html/physfsrwops_8h-source.html | 54 + include/ZE_DataPtr.h | 127 ++ include/ZE_Defines.h | 41 + include/ZE_Error.h | 81 + include/ZE_Includes.h | 55 + include/ZE_ZConfigFile.h | 192 +++ include/ZE_ZEngine.h | 522 ++++++ include/ZE_ZFont.h | 230 +++ include/ZE_ZImage.h | 201 +++ include/ZE_ZMusic.h | 183 ++ include/ZE_ZObject.h | 58 + include/ZE_ZRect.h | 244 +++ include/ZE_ZSound.h | 178 ++ include/ZE_ZTimer.h | 107 ++ include/ZEngine.h | 54 + include/external/physfsrwops.h | 80 + licensing.txt | 38 + makefile | 22 + makefile.mingw32 | 20 + readme-external.txt | 1 + src/ZE_Error.cpp | 53 + src/ZE_ZConfigFile.cpp | 326 ++++ src/ZE_ZEngine.cpp | 535 ++++++ src/ZE_ZFont.cpp | 203 +++ src/ZE_ZImage.cpp | 214 +++ src/ZE_ZMusic.cpp | 160 ++ src/ZE_ZRect.cpp | 201 +++ src/ZE_ZSound.cpp | 156 ++ src/ZE_ZTimer.cpp | 81 + src/external/physfsrwops.cpp | 194 +++ tab2space.py | 43 + test/ZFontTest.cpp | 87 + test/ZImageTest.cpp | 87 + test/ZMouseTest.cpp | 97 ++ test/ZMusicTest.cpp | 111 ++ test/ZRectTest.cpp | 90 + test/ZSoundTest.cpp | 110 ++ test/ZTimerTest.cpp | 127 ++ test/bin/data/almontew.ttf | Bin 0 -> 165024 bytes test/bin/data/axaxax.ttf | Bin 0 -> 41596 bytes test/bin/data/betsy.ttf | Bin 0 -> 104360 bytes test/bin/data/betsy.txt | 63 + test/bin/data/carcrash.wav | Bin 0 -> 23778 bytes test/bin/data/cursor.bmp | Bin 0 -> 822 bytes test/bin/data/kick.wav | Bin 0 -> 6504 bytes test/bin/data/monkey.wav | Bin 0 -> 110098 bytes test/bin/data/rooster.wav | Bin 0 -> 14050 bytes test/bin/data/test01.bmp | Bin 0 -> 12342 bytes test/bin/data/test02.bmp | Bin 0 -> 12342 bytes test/bin/data/thanks.txt | 3 + test/bin/data/whip.wav | Bin 0 -> 2996 bytes test/bin/music.txt | 1 + test/bin/readme.txt | 14 + test/bin/tests.zcf | 5 + thanks.txt | 17 + todo.txt | 9 + vc7/ZEngine.sln | 72 + vc7/ZEngine.vcproj | 211 +++ vc7/ZFontTest.vcproj | 123 ++ vc7/ZImageTest.vcproj | 123 ++ vc7/ZMouseTest.vcproj | 122 ++ vc7/ZMusicTest.vcproj | 122 ++ vc7/ZRectTest.vcproj | 122 ++ vc7/ZSoundTest.vcproj | 122 ++ vc7/ZTimerTest.vcproj | 122 ++ 145 files changed, 16242 insertions(+) create mode 100644 authors.txt create mode 100644 changelog.txt create mode 100644 doc/ZEngine.linux.doxygen create mode 100644 doc/ZEngine.log create mode 100644 doc/ZEngine.win32.doxygen create mode 100644 doc/html/ZE__DataPtr_8h-source.html create mode 100644 doc/html/ZE__DataPtr_8h.html create mode 100644 doc/html/ZE__Defines_8h-source.html create mode 100644 doc/html/ZE__Defines_8h.html create mode 100644 doc/html/ZE__Error_8cpp.html create mode 100644 doc/html/ZE__Error_8h-source.html create mode 100644 doc/html/ZE__Error_8h.html create mode 100644 doc/html/ZE__Includes_8h-source.html create mode 100644 doc/html/ZE__Includes_8h.html create mode 100644 doc/html/ZE__ZConfigFile_8cpp.html create mode 100644 doc/html/ZE__ZConfigFile_8h-source.html create mode 100644 doc/html/ZE__ZConfigFile_8h.html create mode 100644 doc/html/ZE__ZEngine_8cpp.html create mode 100644 doc/html/ZE__ZEngine_8h-source.html create mode 100644 doc/html/ZE__ZEngine_8h.html create mode 100644 doc/html/ZE__ZFont_8cpp.html create mode 100644 doc/html/ZE__ZFont_8h-source.html create mode 100644 doc/html/ZE__ZFont_8h.html create mode 100644 doc/html/ZE__ZImage_8cpp.html create mode 100644 doc/html/ZE__ZImage_8h-source.html create mode 100644 doc/html/ZE__ZImage_8h.html create mode 100644 doc/html/ZE__ZMusic_8cpp.html create mode 100644 doc/html/ZE__ZMusic_8h-source.html create mode 100644 doc/html/ZE__ZMusic_8h.html create mode 100644 doc/html/ZE__ZObject_8h-source.html create mode 100644 doc/html/ZE__ZObject_8h.html create mode 100644 doc/html/ZE__ZRect_8cpp.html create mode 100644 doc/html/ZE__ZRect_8h-source.html create mode 100644 doc/html/ZE__ZRect_8h.html create mode 100644 doc/html/ZE__ZSound_8cpp.html create mode 100644 doc/html/ZE__ZSound_8h-source.html create mode 100644 doc/html/ZE__ZSound_8h.html create mode 100644 doc/html/ZE__ZTimer_8cpp.html create mode 100644 doc/html/ZE__ZTimer_8h-source.html create mode 100644 doc/html/ZE__ZTimer_8h.html create mode 100644 doc/html/ZEngine_8h-source.html create mode 100644 doc/html/ZEngine_8h.html create mode 100644 doc/html/annotated.html create mode 100644 doc/html/classZE_1_1FontData-members.html create mode 100644 doc/html/classZE_1_1FontData.html create mode 100644 doc/html/classZE_1_1ImageData-members.html create mode 100644 doc/html/classZE_1_1ImageData.html create mode 100644 doc/html/classZE_1_1MusicData-members.html create mode 100644 doc/html/classZE_1_1MusicData.html create mode 100644 doc/html/classZE_1_1SoundData-members.html create mode 100644 doc/html/classZE_1_1SoundData.html create mode 100644 doc/html/classZE_1_1ZConfigFile-members.html create mode 100644 doc/html/classZE_1_1ZConfigFile.html create mode 100644 doc/html/classZE_1_1ZEngine-members.html create mode 100644 doc/html/classZE_1_1ZEngine.html create mode 100644 doc/html/classZE_1_1ZFont-members.html create mode 100644 doc/html/classZE_1_1ZFont.html create mode 100644 doc/html/classZE_1_1ZImage-members.html create mode 100644 doc/html/classZE_1_1ZImage.html create mode 100644 doc/html/classZE_1_1ZMusic-members.html create mode 100644 doc/html/classZE_1_1ZMusic.html create mode 100644 doc/html/classZE_1_1ZObject-members.html create mode 100644 doc/html/classZE_1_1ZObject.html create mode 100644 doc/html/classZE_1_1ZRect-members.html create mode 100644 doc/html/classZE_1_1ZRect.html create mode 100644 doc/html/classZE_1_1ZSound-members.html create mode 100644 doc/html/classZE_1_1ZSound.html create mode 100644 doc/html/classZE_1_1ZTimer-members.html create mode 100644 doc/html/classZE_1_1ZTimer.html create mode 100644 doc/html/doxygen.css create mode 100644 doc/html/doxygen.gif create mode 100644 doc/html/doxygen.png create mode 100644 doc/html/files.html create mode 100644 doc/html/functions.html create mode 100644 doc/html/globals.html create mode 100644 doc/html/hierarchy.html create mode 100644 doc/html/index.html create mode 100644 doc/html/namespaceZE.html create mode 100644 doc/html/namespacemembers.html create mode 100644 doc/html/namespaces.html create mode 100644 doc/html/physfsrwops_8h-source.html create mode 100644 include/ZE_DataPtr.h create mode 100644 include/ZE_Defines.h create mode 100644 include/ZE_Error.h create mode 100644 include/ZE_Includes.h create mode 100644 include/ZE_ZConfigFile.h create mode 100644 include/ZE_ZEngine.h create mode 100644 include/ZE_ZFont.h create mode 100644 include/ZE_ZImage.h create mode 100644 include/ZE_ZMusic.h create mode 100644 include/ZE_ZObject.h create mode 100644 include/ZE_ZRect.h create mode 100644 include/ZE_ZSound.h create mode 100644 include/ZE_ZTimer.h create mode 100644 include/ZEngine.h create mode 100644 include/external/physfsrwops.h create mode 100644 licensing.txt create mode 100644 makefile create mode 100644 makefile.mingw32 create mode 100644 readme-external.txt create mode 100644 src/ZE_Error.cpp create mode 100644 src/ZE_ZConfigFile.cpp create mode 100644 src/ZE_ZEngine.cpp create mode 100644 src/ZE_ZFont.cpp create mode 100644 src/ZE_ZImage.cpp create mode 100644 src/ZE_ZMusic.cpp create mode 100644 src/ZE_ZRect.cpp create mode 100644 src/ZE_ZSound.cpp create mode 100644 src/ZE_ZTimer.cpp create mode 100644 src/external/physfsrwops.cpp create mode 100755 tab2space.py create mode 100644 test/ZFontTest.cpp create mode 100644 test/ZImageTest.cpp create mode 100644 test/ZMouseTest.cpp create mode 100644 test/ZMusicTest.cpp create mode 100644 test/ZRectTest.cpp create mode 100644 test/ZSoundTest.cpp create mode 100644 test/ZTimerTest.cpp create mode 100644 test/bin/data/almontew.ttf create mode 100644 test/bin/data/axaxax.ttf create mode 100644 test/bin/data/betsy.ttf create mode 100644 test/bin/data/betsy.txt create mode 100644 test/bin/data/carcrash.wav create mode 100644 test/bin/data/cursor.bmp create mode 100644 test/bin/data/kick.wav create mode 100644 test/bin/data/monkey.wav create mode 100644 test/bin/data/rooster.wav create mode 100644 test/bin/data/test01.bmp create mode 100644 test/bin/data/test02.bmp create mode 100644 test/bin/data/thanks.txt create mode 100644 test/bin/data/whip.wav create mode 100644 test/bin/music.txt create mode 100644 test/bin/readme.txt create mode 100644 test/bin/tests.zcf create mode 100644 thanks.txt create mode 100644 todo.txt create mode 100644 vc7/ZEngine.sln create mode 100644 vc7/ZEngine.vcproj create mode 100644 vc7/ZFontTest.vcproj create mode 100644 vc7/ZImageTest.vcproj create mode 100644 vc7/ZMouseTest.vcproj create mode 100644 vc7/ZMusicTest.vcproj create mode 100644 vc7/ZRectTest.vcproj create mode 100644 vc7/ZSoundTest.vcproj create mode 100644 vc7/ZTimerTest.vcproj diff --git a/authors.txt b/authors.txt new file mode 100644 index 0000000..95a15a5 --- /dev/null +++ b/authors.txt @@ -0,0 +1 @@ +James Turk james@conceptofzero.net - Core Engine and Classes for Data Types diff --git a/changelog.txt b/changelog.txt new file mode 100644 index 0000000..7574a29 --- /dev/null +++ b/changelog.txt @@ -0,0 +1,101 @@ +ZEngine Version Log for Version 0.7.4 +$Id: changelog.txt,v 1.1 2002/11/21 05:40:49 cozman Exp $ + +0.7.5 + -Converted all tabs to spaces. + -Added CVS lines to files for date tracking. + -Fixed file layout for CVS and reuploaded files to CVS. + + +0.7.4 + -Modified behavior of ZImage::Attach and changed ZImageTest to use it. + -Added makefile for Linux build support. + -Renamed old makefile to makefile.mingw32 + -Fixed problem in ZImage::SetAlpha when failure occured. + -Added warnings in ZImage for when the display format fails. + -Completely rewrote ZConfigFile to avoid problems with STL map. + -Fixed problem in ZImage with transparency. + -Added doxygen script for linux, and renamed old doxygen script. + +0.7.3 + -Globally evised source variable naming standards. + -Fixed Error Logging in ZImage. + -Added SDL_DisplaySurface and SDL_DisplaySurfaceAlpha calls to speed up blitting in ZImage. + -Fixed bug in ZConfigFile that caused a NULL file to be closed. + -Several Documentation errors corrected. + -Added ZRect class, and ZRectTest. + +0.7.2 + -Fixed small source problem in PhysFS handling of non-supported types. + -Added makefile for Cygwin and Mingw32 + -Removed AFL license, and switched to BSD-style license. + +0.7.1 + -Changed directory layout. + -Changed source files to compile without PhysicsFS. + -Added newline to end of all source files. + +0.7.0 + -Changed slash direction in example programs (fixed non-windows problems). + -Added support for PhysicsFS. + -Added ZConfigFile. + -Updated all examples to be cleaner style and use more features. + -Addes ZConfigFile for test programs. + +0.6.3 + -Fixed directory issues in distribution. + -Updated to specify SDL 1.2.5 compatibility. + -Added IsLoaded method to ZSound,ZMusic,ZImage and ZFont + -Added music.ogg warning to ZMusicTest. + -Minor fixes in Doxygen settings. + -Fixed issues compiling the ZObject Inherited Wrapper types caused by changes in documentation. + -Added file-level documentation for doxygen in src directory. + +0.6.2 + -Updated License to APL 1.1 and all files with it. + +0.6.1 + -Added Mouse Example + -Changed Email Address to james@conceptofzero.net + -Added more test data and information on where data came from + -Removed Ogg file from distribution. + -Changed names of the libraries. + +0.6.0 + -Updated all documentation (including doxygen docs). + -Rewrote Licensing.txt + -Added Authors.txt and Credits.txt + -Added VC7 Non-Debug Projects. + -Removed LGPL.txt (legacy) and Added APL.txt + -Fixed a bug occuring in ZSound and ZFont test programs. + -Proofread and fixed some documentation errors. + +0.5.0 + -Added APL Notice to source files. + -Updated source guidelines file for APL licensing. + -Added ZSound and test program. + -Updated examples to have similar coding guidelines. + +0.4.0 + -Added Source Guidelines file. + -Added ZMusic and test program. + -Fixed a small keypress checking error in fullscreen mode. + -Redesigned entire data storage system (aka ZDataPtr classes) + -Fixed USE_SDL_MIXER and USE_SDL_TTF bugs in ZEngine. + -Removed LGPL licensing messages from source. + -Rewrote buggy ZImage::Attach code that was affecting the test program. + +0.3.0 + -Added ZTimer and ZFont classes and test programs. + -Fixed major hardware setting bugs in ZImage and ZEngine. + -Added alpha blending to tests. + -Reorganized Directory Structure and VC7 Project Files + +0.2.0 + -Doxygen Documentation and LGPL license addition + -Added ZImage, and test program. + -Fixed bugs throughout core of ZEngine and changed methods used to keep static vectors of data. + -Designed ZObject class with virtual destructor. + +0.1.0 + -Initial ZEngine Proof of Concept, core ZEngine class. diff --git a/doc/ZEngine.linux.doxygen b/doc/ZEngine.linux.doxygen new file mode 100644 index 0000000..2edc9c2 --- /dev/null +++ b/doc/ZEngine.linux.doxygen @@ -0,0 +1,191 @@ +# Doxyfile 1.2.17 + +#--------------------------------------------------------------------------- +# General configuration options +#--------------------------------------------------------------------------- +PROJECT_NAME = ZEngine +PROJECT_NUMBER = 0.7.0 +OUTPUT_DIRECTORY = /home/James/ZEngine-dev/doc +OUTPUT_LANGUAGE = English +EXTRACT_ALL = NO +EXTRACT_PRIVATE = YES +EXTRACT_STATIC = YES +EXTRACT_LOCAL_CLASSES = NO +HIDE_UNDOC_MEMBERS = NO +HIDE_UNDOC_CLASSES = NO +HIDE_FRIEND_COMPOUNDS = NO +BRIEF_MEMBER_DESC = YES +REPEAT_BRIEF = NO +ALWAYS_DETAILED_SEC = NO +INLINE_INHERITED_MEMB = NO +FULL_PATH_NAMES = YES +INTERNAL_DOCS = NO +STRIP_CODE_COMMENTS = YES +CASE_SENSE_NAMES = YES +SHORT_NAMES = NO +HIDE_SCOPE_NAMES = NO +VERBATIM_HEADERS = YES +SHOW_INCLUDE_FILES = YES +JAVADOC_AUTOBRIEF = NO +MULTILINE_CPP_IS_BRIEF = NO +DETAILS_AT_TOP = YES +INHERIT_DOCS = YES +INLINE_INFO = YES +SORT_MEMBER_DOCS = NO +DISTRIBUTE_GROUP_DOC = NO +TAB_SIZE = 8 +GENERATE_TODOLIST = YES +GENERATE_TESTLIST = YES +GENERATE_BUGLIST = YES +GENERATE_DEPRECATEDLIST= YES +ALIASES = +ENABLED_SECTIONS = +MAX_INITIALIZER_LINES = 30 +OPTIMIZE_OUTPUT_FOR_C = NO +OPTIMIZE_OUTPUT_JAVA = NO +SHOW_USED_FILES = YES +#--------------------------------------------------------------------------- +# configuration options related to warning and progress messages +#--------------------------------------------------------------------------- +QUIET = NO +WARNINGS = YES +WARN_IF_UNDOCUMENTED = YES +WARN_FORMAT = "$file:$line: $text" +WARN_LOGFILE = /home/James/ZEngine-dev/doc/ZEngine.log +#--------------------------------------------------------------------------- +# configuration options related to the input files +#--------------------------------------------------------------------------- +INPUT = /home/James/ZEngine-dev/src \ + /home/James/ZEngine-dev/include +FILE_PATTERNS = +RECURSIVE = YES +EXCLUDE = +EXCLUDE_SYMLINKS = NO +EXCLUDE_PATTERNS = +EXAMPLE_PATH = +EXAMPLE_PATTERNS = +EXAMPLE_RECURSIVE = NO +IMAGE_PATH = +INPUT_FILTER = +FILTER_SOURCE_FILES = NO +#--------------------------------------------------------------------------- +# configuration options related to source browsing +#--------------------------------------------------------------------------- +SOURCE_BROWSER = NO +INLINE_SOURCES = NO +REFERENCED_BY_RELATION = YES +REFERENCES_RELATION = YES +#--------------------------------------------------------------------------- +# configuration options related to the alphabetical class index +#--------------------------------------------------------------------------- +ALPHABETICAL_INDEX = NO +COLS_IN_ALPHA_INDEX = 1 +IGNORE_PREFIX = +#--------------------------------------------------------------------------- +# configuration options related to the HTML output +#--------------------------------------------------------------------------- +GENERATE_HTML = YES +HTML_OUTPUT = html +HTML_FILE_EXTENSION = .html +HTML_HEADER = +HTML_FOOTER = +HTML_STYLESHEET = +HTML_ALIGN_MEMBERS = YES +GENERATE_HTMLHELP = NO +CHM_FILE = +HHC_LOCATION = +GENERATE_CHI = NO +BINARY_TOC = NO +TOC_EXPAND = NO +DISABLE_INDEX = NO +ENUM_VALUES_PER_LINE = 4 +GENERATE_TREEVIEW = NO +TREEVIEW_WIDTH = 250 +#--------------------------------------------------------------------------- +# configuration options related to the LaTeX output +#--------------------------------------------------------------------------- +GENERATE_LATEX = NO +LATEX_OUTPUT = latex +LATEX_CMD_NAME = latex +MAKEINDEX_CMD_NAME = makeindex +COMPACT_LATEX = NO +PAPER_TYPE = a4wide +EXTRA_PACKAGES = +LATEX_HEADER = +PDF_HYPERLINKS = NO +USE_PDFLATEX = NO +LATEX_BATCHMODE = NO +#--------------------------------------------------------------------------- +# configuration options related to the RTF output +#--------------------------------------------------------------------------- +GENERATE_RTF = NO +RTF_OUTPUT = rtf +COMPACT_RTF = NO +RTF_HYPERLINKS = NO +RTF_STYLESHEET_FILE = +RTF_EXTENSIONS_FILE = +#--------------------------------------------------------------------------- +# configuration options related to the man page output +#--------------------------------------------------------------------------- +GENERATE_MAN = NO +MAN_OUTPUT = man +MAN_EXTENSION = .3 +MAN_LINKS = NO +#--------------------------------------------------------------------------- +# configuration options related to the XML output +#--------------------------------------------------------------------------- +GENERATE_XML = NO +XML_SCHEMA = +XML_DTD = +#--------------------------------------------------------------------------- +# configuration options for the AutoGen Definitions output +#--------------------------------------------------------------------------- +GENERATE_AUTOGEN_DEF = NO +#--------------------------------------------------------------------------- +# Configuration options related to the preprocessor +#--------------------------------------------------------------------------- +ENABLE_PREPROCESSING = YES +MACRO_EXPANSION = NO +EXPAND_ONLY_PREDEF = NO +SEARCH_INCLUDES = YES +INCLUDE_PATH = +INCLUDE_FILE_PATTERNS = +PREDEFINED = +EXPAND_AS_DEFINED = +SKIP_FUNCTION_MACROS = YES +#--------------------------------------------------------------------------- +# Configuration::addtions related to external references +#--------------------------------------------------------------------------- +TAGFILES = +GENERATE_TAGFILE = +ALLEXTERNALS = NO +EXTERNAL_GROUPS = YES +PERL_PATH = /usr/bin/perl +#--------------------------------------------------------------------------- +# Configuration options related to the dot tool +#--------------------------------------------------------------------------- +CLASS_DIAGRAMS = NO +HIDE_UNDOC_RELATIONS = YES +HAVE_DOT = NO +CLASS_GRAPH = YES +COLLABORATION_GRAPH = NO +TEMPLATE_RELATIONS = NO +INCLUDE_GRAPH = NO +INCLUDED_BY_GRAPH = NO +GRAPHICAL_HIERARCHY = NO +DOT_IMAGE_FORMAT = png +DOTFILE_DIRS = +MAX_DOT_GRAPH_WIDTH = 1024 +MAX_DOT_GRAPH_HEIGHT = 1024 +GENERATE_LEGEND = YES +DOT_CLEANUP = YES +#--------------------------------------------------------------------------- +# Configuration::addtions related to the search engine +#--------------------------------------------------------------------------- +SEARCHENGINE = NO +CGI_NAME = search.cgi +CGI_URL = +DOC_URL = +DOC_ABSPATH = +BIN_ABSPATH = /usr/local/bin/ +EXT_DOC_PATHS = diff --git a/doc/ZEngine.log b/doc/ZEngine.log new file mode 100644 index 0000000..8d7ff92 --- /dev/null +++ b/doc/ZEngine.log @@ -0,0 +1,10 @@ +/home/James/ZEngine-dev/include/ZE_ZConfigFile.h:49: Warning: Compound ZE::ZConfigFile::ZCF_Section is not documented. +/home/James/ZEngine-dev/include/ZE_ZConfigFile.h:43: Warning: Compound ZE::ZConfigFile::ZCF_Variable is not documented. +/home/James/ZEngine-dev/include/ZEngine.h:35: Error: end of paragraph without end of style command +/home/James/ZEngine-dev/include/ZEngine.h:37: Error: Found unknown command `\conceptofzero' +/home/James/ZEngine-dev/include/ZEngine.h:39: Error: found tag without matching in the same paragraph +/home/James/ZEngine-dev/include/ZE_Error.h:58: Error: Unsupported html tag found +/home/James/ZEngine-dev/include/ZE_ZConfigFile.h:70: Warning: Member Exists of class ZE::ZConfigFile is not documented. +/home/James/ZEngine-dev/include/ZE_ZConfigFile.h:71: Warning: Member Exists of class ZE::ZConfigFile is not documented. +/home/James/ZEngine-dev/include/ZE_ZConfigFile.h:72: Warning: Member SetVariable of class ZE::ZConfigFile is not documented. +/home/James/ZEngine-dev/include/ZE_ZConfigFile.h:73: Warning: Member GetVariable of class ZE::ZConfigFile is not documented. diff --git a/doc/ZEngine.win32.doxygen b/doc/ZEngine.win32.doxygen new file mode 100644 index 0000000..7ca7843 --- /dev/null +++ b/doc/ZEngine.win32.doxygen @@ -0,0 +1,193 @@ +# Doxyfile 1.2.17 + +#--------------------------------------------------------------------------- +# General configuration options +#--------------------------------------------------------------------------- +PROJECT_NAME = ZEngine +PROJECT_NUMBER = 0.7.0 +OUTPUT_DIRECTORY = F:\libs\ZEngine-dev\doc\ +OUTPUT_LANGUAGE = English +EXTRACT_ALL = NO +EXTRACT_PRIVATE = YES +EXTRACT_STATIC = YES +EXTRACT_LOCAL_CLASSES = NO +HIDE_UNDOC_MEMBERS = NO +HIDE_UNDOC_CLASSES = NO +HIDE_FRIEND_COMPOUNDS = NO +BRIEF_MEMBER_DESC = YES +REPEAT_BRIEF = NO +ALWAYS_DETAILED_SEC = NO +INLINE_INHERITED_MEMB = NO +FULL_PATH_NAMES = YES +STRIP_FROM_PATH = F:\libs\ZEngine-dev +INTERNAL_DOCS = NO +STRIP_CODE_COMMENTS = YES +CASE_SENSE_NAMES = YES +SHORT_NAMES = NO +HIDE_SCOPE_NAMES = NO +VERBATIM_HEADERS = YES +SHOW_INCLUDE_FILES = YES +JAVADOC_AUTOBRIEF = NO +MULTILINE_CPP_IS_BRIEF = NO +DETAILS_AT_TOP = YES +INHERIT_DOCS = YES +INLINE_INFO = YES +SORT_MEMBER_DOCS = NO +DISTRIBUTE_GROUP_DOC = NO +TAB_SIZE = 8 +GENERATE_TODOLIST = YES +GENERATE_TESTLIST = YES +GENERATE_BUGLIST = YES +GENERATE_DEPRECATEDLIST= YES +ALIASES = +ENABLED_SECTIONS = +MAX_INITIALIZER_LINES = 30 +OPTIMIZE_OUTPUT_FOR_C = NO +OPTIMIZE_OUTPUT_JAVA = NO +SHOW_USED_FILES = YES +#--------------------------------------------------------------------------- +# configuration options related to warning and progress messages +#--------------------------------------------------------------------------- +QUIET = NO +WARNINGS = YES +WARN_IF_UNDOCUMENTED = YES +WARN_FORMAT = "$file:$line: $text" +WARN_LOGFILE = F:\libs\ZEngine-dev\doc\ZEngine.log +#--------------------------------------------------------------------------- +# configuration options related to the input files +#--------------------------------------------------------------------------- +INPUT = F:/libs/ZEngine-dev/src \ + F:/libs/ZEngine-dev/include +FILE_PATTERNS = +RECURSIVE = YES +EXCLUDE = +EXCLUDE_SYMLINKS = NO +EXCLUDE_PATTERNS = +EXAMPLE_PATH = +EXAMPLE_PATTERNS = +EXAMPLE_RECURSIVE = NO +IMAGE_PATH = +INPUT_FILTER = +FILTER_SOURCE_FILES = NO +#--------------------------------------------------------------------------- +# configuration options related to source browsing +#--------------------------------------------------------------------------- +SOURCE_BROWSER = NO +INLINE_SOURCES = NO +REFERENCED_BY_RELATION = YES +REFERENCES_RELATION = YES +#--------------------------------------------------------------------------- +# configuration options related to the alphabetical class index +#--------------------------------------------------------------------------- +ALPHABETICAL_INDEX = NO +COLS_IN_ALPHA_INDEX = 1 +IGNORE_PREFIX = +#--------------------------------------------------------------------------- +# configuration options related to the HTML output +#--------------------------------------------------------------------------- +GENERATE_HTML = YES +HTML_OUTPUT = html +HTML_FILE_EXTENSION = .html +HTML_HEADER = +HTML_FOOTER = +HTML_STYLESHEET = +HTML_ALIGN_MEMBERS = YES +GENERATE_HTMLHELP = NO +CHM_FILE = +HHC_LOCATION = +GENERATE_CHI = NO +BINARY_TOC = NO +TOC_EXPAND = NO +DISABLE_INDEX = NO +ENUM_VALUES_PER_LINE = 4 +GENERATE_TREEVIEW = NO +TREEVIEW_WIDTH = 250 +#--------------------------------------------------------------------------- +# configuration options related to the LaTeX output +#--------------------------------------------------------------------------- +GENERATE_LATEX = NO +LATEX_OUTPUT = latex +LATEX_CMD_NAME = latex +MAKEINDEX_CMD_NAME = makeindex +COMPACT_LATEX = NO +PAPER_TYPE = a4wide +EXTRA_PACKAGES = +LATEX_HEADER = +PDF_HYPERLINKS = NO +USE_PDFLATEX = NO +LATEX_BATCHMODE = NO +#--------------------------------------------------------------------------- +# configuration options related to the RTF output +#--------------------------------------------------------------------------- +GENERATE_RTF = NO +RTF_OUTPUT = rtf +COMPACT_RTF = NO +RTF_HYPERLINKS = NO +RTF_STYLESHEET_FILE = +RTF_EXTENSIONS_FILE = +#--------------------------------------------------------------------------- +# configuration options related to the man page output +#--------------------------------------------------------------------------- +GENERATE_MAN = NO +MAN_OUTPUT = man +MAN_EXTENSION = .3 +MAN_LINKS = NO +#--------------------------------------------------------------------------- +# configuration options related to the XML output +#--------------------------------------------------------------------------- +GENERATE_XML = NO +XML_SCHEMA = +XML_DTD = +#--------------------------------------------------------------------------- +# configuration options for the AutoGen Definitions output +#--------------------------------------------------------------------------- +GENERATE_AUTOGEN_DEF = NO +#--------------------------------------------------------------------------- +# Configuration options related to the preprocessor +#--------------------------------------------------------------------------- +ENABLE_PREPROCESSING = YES +MACRO_EXPANSION = NO +EXPAND_ONLY_PREDEF = NO +SEARCH_INCLUDES = YES +INCLUDE_PATH = +INCLUDE_FILE_PATTERNS = +PREDEFINED = +EXPAND_AS_DEFINED = +SKIP_FUNCTION_MACROS = YES +#--------------------------------------------------------------------------- +# Configuration::addtions related to external references +#--------------------------------------------------------------------------- +TAGFILES = +GENERATE_TAGFILE = +ALLEXTERNALS = NO +EXTERNAL_GROUPS = YES +PERL_PATH = /usr/bin/perl +#--------------------------------------------------------------------------- +# Configuration options related to the dot tool +#--------------------------------------------------------------------------- +CLASS_DIAGRAMS = NO +HIDE_UNDOC_RELATIONS = YES +HAVE_DOT = NO +CLASS_GRAPH = YES +COLLABORATION_GRAPH = NO +TEMPLATE_RELATIONS = NO +INCLUDE_GRAPH = NO +INCLUDED_BY_GRAPH = NO +GRAPHICAL_HIERARCHY = NO +DOT_IMAGE_FORMAT = png +DOT_PATH = "c:/Program Files/KingsTools/" +DOTFILE_DIRS = +MAX_DOT_GRAPH_WIDTH = 1024 +MAX_DOT_GRAPH_HEIGHT = 1024 +GENERATE_LEGEND = YES +DOT_CLEANUP = YES +#--------------------------------------------------------------------------- +# Configuration::addtions related to the search engine +#--------------------------------------------------------------------------- +SEARCHENGINE = NO +CGI_NAME = search.cgi +CGI_URL = +DOC_URL = +DOC_ABSPATH = +BIN_ABSPATH = /usr/local/bin/ +EXT_DOC_PATHS = diff --git a/doc/html/ZE__DataPtr_8h-source.html b/doc/html/ZE__DataPtr_8h-source.html new file mode 100644 index 0000000..08c961e --- /dev/null +++ b/doc/html/ZE__DataPtr_8h-source.html @@ -0,0 +1,77 @@ + + +/home/James/ZEngine-dev/include/ZE_DataPtr.h Source File + + + +
+Main Page   Namespace List   Class Hierarchy   Compound List   File List   Namespace Members   Compound Members   File Members  
+

/home/James/ZEngine-dev/include/ZE_DataPtr.h

Go to the documentation of this file.
00001 /*******************************************************************************
+00002          This file is Part of the ZEngine Library for SDL Game Development.
+00003                       Copyright (C) 2002 ConceptOfZero.net
+00004 
+00005              Licensed under the BSD License, see licensing.txt.
+00006 
+00007     The maintainer of this library is James Turk (jturk@conceptofzero.net) 
+00008          and the home of this Library is http://www.conceptofzero.net/
+00009 *******************************************************************************/
+00010 
+00025 #ifndef __ze_dataptr_h__
+00026 #define __ze_dataptr_h__
+00027 
+00028 #include "ZE_Includes.h"
+00029 
+00030 namespace ZE
+00031 {
+00032 
+00034 //Utility Classes Used Throughout ZEngine//
+00036 
+00042 class ImageData
+00043 {
+00044         public:
+00046                 SDL_Surface *image;
+00048                 string filename;
+00054                 ImageData() { image = NULL; };
+00055 };
+00056 
+00057 #ifdef USE_SDL_TTF
+00058 
+00064 class FontData
+00065 {
+00066         public:
+00068                 TTF_Font *font;
+00070                 string filename;
+00076                 FontData() { font = NULL; };
+00077 };
+00078 
+00079 #endif //USE_SDL_TTF
+00080 
+00081 #ifdef USE_SDL_MIXER
+00082 
+00088 class SoundData
+00089 {
+00090         public:
+00092                 Mix_Chunk *sound;
+00094                 string filename;
+00100                 SoundData() { sound = NULL; };
+00101 };
+00102 
+00108 class MusicData
+00109 {
+00110         public:
+00112                 Mix_Music *music;
+00114                 string filename;
+00120                 MusicData() { music = NULL; };
+00121 };
+00122 
+00123 #endif //USE_SDL_MIXER
+00124 
+00125 }
+00126 
+00127 #endif //__ze_dataptr_h__
+

Generated on Wed Nov 20 01:18:05 2002 for ZEngine by + +doxygen1.3-rc1
+ + diff --git a/doc/html/ZE__DataPtr_8h.html b/doc/html/ZE__DataPtr_8h.html new file mode 100644 index 0000000..3a7625e --- /dev/null +++ b/doc/html/ZE__DataPtr_8h.html @@ -0,0 +1,32 @@ + + +ZE_DataPtr.h File Reference + + + +
+Main Page   Namespace List   Class Hierarchy   Compound List   File List   Namespace Members   Compound Members   File Members  
+

/home/James/ZEngine-dev/include/ZE_DataPtr.h File Reference


Detailed Description

+
File Header:
File: Types/ZE_DataPtr.h
+ Description: Header file for ZEngine Data Pointer Classes
+ Author(s): James Turk
+ Last Updated: 9/8/02
+
+ +

+Definition file for ZEngine Data Pointer Classes. ([Image,Font,Sound,Music]Ptr) These classes are used to keep track of the Images (Fonts and Sounds) throughout the entire ZEngine. +

+#include "ZE_Includes.h"
+ +

+Go to the source code of this file. + + + +

Namespaces

namespace  ZE
+


Generated on Wed Nov 20 01:18:05 2002 for ZEngine by + +doxygen1.3-rc1
+ + diff --git a/doc/html/ZE__Defines_8h-source.html b/doc/html/ZE__Defines_8h-source.html new file mode 100644 index 0000000..1a94d14 --- /dev/null +++ b/doc/html/ZE__Defines_8h-source.html @@ -0,0 +1,36 @@ + + +/home/James/ZEngine-dev/include/ZE_Defines.h Source File + + + +
+Main Page   Namespace List   Class Hierarchy   Compound List   File List   Namespace Members   Compound Members   File Members  
+

/home/James/ZEngine-dev/include/ZE_Defines.h

Go to the documentation of this file.
00001 /*******************************************************************************
+00002          This file is Part of the ZEngine Library for SDL Game Development.
+00003                       Copyright (C) 2002 ConceptOfZero.net
+00004 
+00005              Licensed under the BSD License, see licensing.txt.
+00006 
+00007     The maintainer of this library is James Turk (jturk@conceptofzero.net) 
+00008          and the home of this Library is http://www.conceptofzero.net/
+00009 *******************************************************************************/
+00010 
+00024 #ifndef __ze_defines_h__
+00025 #define __ze_defines_h__
+00026 
+00027 //defines- undefine any of these if you dont have the indicated SDL extension//
+00029 #define USE_SDL_TTF
+00031 #define USE_SDL_IMAGE
+00033 #define USE_SDL_MIXER
+00035 //#define USE_PHYSFS
+00037 #define DEBUG_STREAM
+00039 #define VERSION "0.7.3"
+00040 
+00041 #endif //__ze_defines_h__
+

Generated on Wed Nov 20 01:18:05 2002 for ZEngine by + +doxygen1.3-rc1
+ + diff --git a/doc/html/ZE__Defines_8h.html b/doc/html/ZE__Defines_8h.html new file mode 100644 index 0000000..15f90b0 --- /dev/null +++ b/doc/html/ZE__Defines_8h.html @@ -0,0 +1,45 @@ + + +ZE_Defines.h File Reference + + + +
+Main Page   Namespace List   Class Hierarchy   Compound List   File List   Namespace Members   Compound Members   File Members  
+

/home/James/ZEngine-dev/include/ZE_Defines.h File Reference


Detailed Description

+
File Header:
File: ZE_Defines.h
+ Description: Defines header file for ZEngine class, where all #define statements to control compilation options are placed.
+ Author(s): James Turk
+ Last Updated: 11/07/02
+
+ +

+Definition file, holds #define statements describing optional features of ZEngine. +

+ +

+Go to the source code of this file. + + + + + + + + + + + + +

Defines

+#define USE_SDL_TTF
 Define to include font support.

+#define USE_SDL_IMAGE
 Define to include non-bmp image file support.

+#define USE_SDL_MIXER
 Define to include sound support.

+#define DEBUG_STREAM
 Undefine to disable debug streams for Error Handler.

+#define VERSION   "0.7.3"
 Version number.

+


Generated on Wed Nov 20 01:18:05 2002 for ZEngine by + +doxygen1.3-rc1
+ + diff --git a/doc/html/ZE__Error_8cpp.html b/doc/html/ZE__Error_8cpp.html new file mode 100644 index 0000000..8c5f12e --- /dev/null +++ b/doc/html/ZE__Error_8cpp.html @@ -0,0 +1,30 @@ + + +ZE_Error.cpp File Reference + + + +
+Main Page   Namespace List   Class Hierarchy   Compound List   File List   Namespace Members   Compound Members   File Members  
+

/home/James/ZEngine-dev/src/ZE_Error.cpp File Reference


Detailed Description

+
File Header:
File: Util/ZE_Error.cpp
+ Description: Implementation source file for ZEngine error logging utility functions.
+ Author(s): James Turk
+ Last Updated: 10/8/02
+
+ +

+Error logging utilities for ZEngine and programs making use of ZEngine. +

+#include "ZE_Error.h"
+ + + + +

Namespaces

namespace  ZE
+


Generated on Wed Nov 20 01:18:05 2002 for ZEngine by + +doxygen1.3-rc1
+ + diff --git a/doc/html/ZE__Error_8h-source.html b/doc/html/ZE__Error_8h-source.html new file mode 100644 index 0000000..c337a68 --- /dev/null +++ b/doc/html/ZE__Error_8h-source.html @@ -0,0 +1,48 @@ + + +/home/James/ZEngine-dev/include/ZE_Error.h Source File + + + +
+Main Page   Namespace List   Class Hierarchy   Compound List   File List   Namespace Members   Compound Members   File Members  
+

/home/James/ZEngine-dev/include/ZE_Error.h

Go to the documentation of this file.
00001 /*******************************************************************************
+00002          This file is Part of the ZEngine Library for SDL Game Development.
+00003                       Copyright (C) 2002 ConceptOfZero.net
+00004 
+00005              Licensed under the BSD License, see licensing.txt.
+00006 
+00007     The maintainer of this library is James Turk (jturk@conceptofzero.net) 
+00008          and the home of this Library is http://www.conceptofzero.net/
+00009 *******************************************************************************/
+00010 
+00024 #ifndef __ze_error_h__
+00025 #define __ze_error_h__
+00026 
+00027 #include "ZE_Includes.h"
+00028 
+00029 namespace ZE
+00030 {
+00031 
+00032 
+00034 //Error Logging + Formatting//
+00036 
+00046 string _GetError(int line, string file, string str);
+00047 
+00056 void _LogError(int line, string file, string str);
+00057 
+00067 string FormatStr(const char *fmtstr, ...);
+00068 
+00072 #define GetError(str) _GetError(__LINE__,__FILE__,str)
+00073 
+00077 #define LogError(str) _LogError(__LINE__,__FILE__,str)
+00078 
+00079 }
+00080 
+00081 #endif //__ze_error_h__
+

Generated on Wed Nov 20 01:18:05 2002 for ZEngine by + +doxygen1.3-rc1
+ + diff --git a/doc/html/ZE__Error_8h.html b/doc/html/ZE__Error_8h.html new file mode 100644 index 0000000..9cd2ad1 --- /dev/null +++ b/doc/html/ZE__Error_8h.html @@ -0,0 +1,90 @@ + + +ZE_Error.h File Reference + + + +
+Main Page   Namespace List   Class Hierarchy   Compound List   File List   Namespace Members   Compound Members   File Members  
+

/home/James/ZEngine-dev/include/ZE_Error.h File Reference


Detailed Description

+
File Header:
File: Util/ZE_Error.h
+ Description: Header file for ZEngine Error Handling Functions.
+ Author(s): James Turk
+ Last Updated: 9/8/02
+
+ +

+Definition file for ZEngine Error Logging + Formatting functions which are used for internal and external errors. +

+#include "ZE_Includes.h"
+ +

+Go to the source code of this file. + + + + + + +

Namespaces

namespace  ZE

Defines

#define GetError(str)   _GetError(__LINE__,__FILE__,str)
#define LogError(str)   _LogError(__LINE__,__FILE__,str)
+


Define Documentation

+

+ + + + +
+ + + + + + + +
#define GetErrorstr      _GetError(__LINE__,__FILE__,str) +
+
+ + + + + +
+   + + +

+Creates a string about an error, telling what file it occured in and where, and gives a user defined string as well.

+

+ + + + +
+ + + + + + + +
#define LogErrorstr      _LogError(__LINE__,__FILE__,str) +
+
+ + + + + +
+   + + +

+Logs a string about an error, telling what file it occured in and where, and gives a user defined string as well.

+


Generated on Wed Nov 20 01:18:05 2002 for ZEngine by + +doxygen1.3-rc1
+ + diff --git a/doc/html/ZE__Includes_8h-source.html b/doc/html/ZE__Includes_8h-source.html new file mode 100644 index 0000000..9111dcd --- /dev/null +++ b/doc/html/ZE__Includes_8h-source.html @@ -0,0 +1,55 @@ + + +/home/James/ZEngine-dev/include/ZE_Includes.h Source File + + + +
+Main Page   Namespace List   Class Hierarchy   Compound List   File List   Namespace Members   Compound Members   File Members  
+

/home/James/ZEngine-dev/include/ZE_Includes.h

Go to the documentation of this file.
00001 /*******************************************************************************
+00002          This file is Part of the ZEngine Library for SDL Game Development.
+00003                       Copyright (C) 2002 ConceptOfZero.net
+00004 
+00005              Licensed under the BSD License, see licensing.txt.
+00006 
+00007     The maintainer of this library is James Turk (jturk@conceptofzero.net) 
+00008          and the home of this Library is http://www.conceptofzero.net/
+00009 *******************************************************************************/
+00010 
+00025 #ifndef __ze_includes_h__
+00026 #define __ze_includes_h__
+00027 
+00028 #include "ZE_Defines.h"
+00029 
+00030 #include "SDL.h"
+00031 #ifdef USE_SDL_IMAGE
+00032 #include "SDL_image.h"
+00033 #endif
+00034 #ifdef USE_SDL_TTF
+00035 #include "SDL_ttf.h"
+00036 #endif
+00037 #ifdef USE_SDL_MIXER
+00038 #include "SDL_mixer.h"
+00039 #endif
+00040 #ifdef USE_PHYSFS
+00041 #include "physfs.h"
+00042 #include "external/physfsrwops.h"
+00043 #endif
+00044 
+00045 #include <string>
+00046 #include <vector>
+00047 #include <fstream>
+00048 #include <list>
+00049 #include <cstdio>
+00050 #include <cstdlib>
+00051 #include <cstdarg>
+00052 #include <cctype>
+00053 using namespace std;
+00054 
+00055 #endif //__ze_includes_h__
+

Generated on Wed Nov 20 01:18:05 2002 for ZEngine by + +doxygen1.3-rc1
+ + diff --git a/doc/html/ZE__Includes_8h.html b/doc/html/ZE__Includes_8h.html new file mode 100644 index 0000000..4266161 --- /dev/null +++ b/doc/html/ZE__Includes_8h.html @@ -0,0 +1,44 @@ + + +ZE_Includes.h File Reference + + + +
+Main Page   Namespace List   Class Hierarchy   Compound List   File List   Namespace Members   Compound Members   File Members  
+

/home/James/ZEngine-dev/include/ZE_Includes.h File Reference


Detailed Description

+
File Header:
File: ZE_Includes.h
+ Description: Header file for ZEngine universal includes.
+ Author(s): James Turk
+ Last Updated: 11/01/02
+
+ +

+ZE_*.h files should only include this file and any other ZE_*.h files that they need, External Library or C/C++ Standard Library files should be included from within this file. +

+#include "ZE_Defines.h"
+#include "SDL.h"
+#include "SDL_image.h"
+#include "SDL_ttf.h"
+#include "SDL_mixer.h"
+#include <string>
+#include <vector>
+#include <fstream>
+#include <list>
+#include <cstdio>
+#include <cstdlib>
+#include <cstdarg>
+#include <cctype>
+ +

+Go to the source code of this file. + + + +

Namespaces

namespace  std
+


Generated on Wed Nov 20 01:18:05 2002 for ZEngine by + +doxygen1.3-rc1
+ + diff --git a/doc/html/ZE__ZConfigFile_8cpp.html b/doc/html/ZE__ZConfigFile_8cpp.html new file mode 100644 index 0000000..41ec606 --- /dev/null +++ b/doc/html/ZE__ZConfigFile_8cpp.html @@ -0,0 +1,30 @@ + + +ZE_ZConfigFile.cpp File Reference + + + +
+Main Page   Namespace List   Class Hierarchy   Compound List   File List   Namespace Members   Compound Members   File Members  
+

/home/James/ZEngine-dev/src/ZE_ZConfigFile.cpp File Reference


Detailed Description

+
File Header:
File: Types/ZE_ZConfigFile.cpp
+ Description: Implementation source file for ZConfigFile, the ZEngine INI-Style Config File.
+ Author(s): James Turk
+ Last Updated: 11/07/02
+
+ +

+Implementation of ZConfigFile, the ZEngine INI-Style Config File. +

+#include "ZE_ZConfigFile.h"
+ + + + +

Namespaces

namespace  ZE
+


Generated on Wed Nov 20 01:18:05 2002 for ZEngine by + +doxygen1.3-rc1
+ + diff --git a/doc/html/ZE__ZConfigFile_8h-source.html b/doc/html/ZE__ZConfigFile_8h-source.html new file mode 100644 index 0000000..09c0d70 --- /dev/null +++ b/doc/html/ZE__ZConfigFile_8h-source.html @@ -0,0 +1,91 @@ + + +/home/James/ZEngine-dev/include/ZE_ZConfigFile.h Source File + + + +
+Main Page   Namespace List   Class Hierarchy   Compound List   File List   Namespace Members   Compound Members   File Members  
+

/home/James/ZEngine-dev/include/ZE_ZConfigFile.h

Go to the documentation of this file.
00001 /*******************************************************************************
+00002          This file is Part of the ZEngine Library for SDL Game Development.
+00003                       Copyright (C) 2002 ConceptOfZero.net
+00004 
+00005              Licensed under the BSD License, see licensing.txt.
+00006 
+00007     The maintainer of this library is James Turk (jturk@conceptofzero.net) 
+00008          and the home of this Library is http://www.conceptofzero.net/
+00009 *******************************************************************************/
+00010 
+00025 #ifndef __ze_zconfigfile_h__
+00026 #define __ze_zconfigfile_h__
+00027 
+00028 #include "ZE_ZObject.h"         //included even though ZCF isn't derived (to obtain all other needed headers)
+00029 
+00030 namespace ZE
+00031 {
+00032 
+00038 class ZConfigFile : public ZObject
+00039 {
+00040         private:
+00041 
+00042                 /*Private Types*/
+00043                 class ZCF_Variable
+00044                 {
+00045                         public:
+00046                                 string var;
+00047                                 string val;
+00048                 };
+00049                 class ZCF_Section
+00050                 {
+00051                         public:
+00052                                 string section;
+00053                                 list<ZCF_Variable> varList;
+00054                 };
+00055 
+00057                 list<ZCF_Section> mFileLayout;
+00058 
+00060                 string mFilename;
+00061 
+00069                 string CleanString(string str);
+00070                 
+00071                 bool Exists(string sec);
+00072                 bool Exists(string sec, string var);
+00073                 void SetVariable(string sec, string var, string val);
+00074                 string GetVariable(string sec, string var, string defVal);
+00075 
+00076         public:
+00077 
+00083                 ZConfigFile();
+00084 
+00091                 ZConfigFile(string filename);
+00092 
+00098                 ~ZConfigFile();
+00099 
+00106                 void Process(string filename);
+00107 
+00117                 int GetInt(string section, string var, int defVal);
+00118 
+00129                 bool GetBool(string section, string var, bool defVal);
+00130 
+00140                 string GetString(string section, string var, string defVal);
+00141 
+00151                 void SetInt(string section, string var, int val);
+00152 
+00162                 void SetBool(string section, string var, bool val);
+00163 
+00173                 void SetString(string section, string var, string val);
+00174                 
+00180                 void Flush();
+00181 
+00187                 void Close();
+00188 };
+00189 
+00190 }
+00191 
+00192 #endif //__ze_zconfigfile_h__
+

Generated on Wed Nov 20 01:18:05 2002 for ZEngine by + +doxygen1.3-rc1
+ + diff --git a/doc/html/ZE__ZConfigFile_8h.html b/doc/html/ZE__ZConfigFile_8h.html new file mode 100644 index 0000000..d37d0d1 --- /dev/null +++ b/doc/html/ZE__ZConfigFile_8h.html @@ -0,0 +1,32 @@ + + +ZE_ZConfigFile.h File Reference + + + +
+Main Page   Namespace List   Class Hierarchy   Compound List   File List   Namespace Members   Compound Members   File Members  
+

/home/James/ZEngine-dev/include/ZE_ZConfigFile.h File Reference


Detailed Description

+
File Header:
File: Types/ZE_ZConfigFile.h
+ Description: Header file for ZEngine INI-Style Config Files.
+ Author(s): James Turk
+ Last Updated: 11/07/02
+
+ +

+Definition file for ZConfigFile, an INI-style Config format. +

+#include "ZE_ZObject.h"
+ +

+Go to the source code of this file. + + + +

Namespaces

namespace  ZE
+


Generated on Wed Nov 20 01:18:05 2002 for ZEngine by + +doxygen1.3-rc1
+ + diff --git a/doc/html/ZE__ZEngine_8cpp.html b/doc/html/ZE__ZEngine_8cpp.html new file mode 100644 index 0000000..e3f623a --- /dev/null +++ b/doc/html/ZE__ZEngine_8cpp.html @@ -0,0 +1,30 @@ + + +ZE_ZEngine.cpp File Reference + + + +
+Main Page   Namespace List   Class Hierarchy   Compound List   File List   Namespace Members   Compound Members   File Members  
+

/home/James/ZEngine-dev/src/ZE_ZEngine.cpp File Reference


Detailed Description

+
File Header:
File: ZE_ZEngine.cpp
+ Description: Implementation source file for ZEngine library main singleton class.
+ Author(s): James Turk
+ Last Updated: 11/07/02
+
+ +

+Actual implementation of ZEngine singleton class at heart of ZEngine. +

+#include "ZE_ZEngine.h"
+ + + + +

Namespaces

namespace  ZE
+


Generated on Wed Nov 20 01:18:05 2002 for ZEngine by + +doxygen1.3-rc1
+ + diff --git a/doc/html/ZE__ZEngine_8h-source.html b/doc/html/ZE__ZEngine_8h-source.html new file mode 100644 index 0000000..9fc1c9b --- /dev/null +++ b/doc/html/ZE__ZEngine_8h-source.html @@ -0,0 +1,203 @@ + + +/home/James/ZEngine-dev/include/ZE_ZEngine.h Source File + + + +
+Main Page   Namespace List   Class Hierarchy   Compound List   File List   Namespace Members   Compound Members   File Members  
+

/home/James/ZEngine-dev/include/ZE_ZEngine.h

Go to the documentation of this file.
00001 /*******************************************************************************
+00002          This file is Part of the ZEngine Library for SDL Game Development.
+00003                       Copyright (C) 2002 ConceptOfZero.net
+00004 
+00005              Licensed under the BSD License, see licensing.txt.
+00006 
+00007     The maintainer of this library is James Turk (jturk@conceptofzero.net) 
+00008          and the home of this Library is http://www.conceptofzero.net/
+00009 *******************************************************************************/
+00010 
+00024 #ifndef __ze_zengine_h__
+00025 #define __ze_zengine_h__
+00026 
+00027 #include "ZE_DataPtr.h"
+00028 #include "ZE_Error.h"
+00029 #include "ZE_Defines.h"
+00030 #include "ZE_Includes.h"
+00031 
+00037 namespace ZE
+00038 {
+00039 
+00046 class ZEngine
+00047 {
+00049         //Singleton + Memory Management//
+00051 
+00052         private:
+00054                 static ZEngine *sInstance;
+00055 
+00061                 ZEngine();
+00062 
+00063         public:
+00064 
+00071                 static ZEngine* GetInstance();
+00072 
+00078                 static void ReleaseInstance();
+00079 
+00086                 static string GetVersion();
+00087 
+00089         //Initialization//
+00091 
+00092         private:
+00094                 int mWidth;
+00096                 int mHeight;
+00098                 int mBPP;
+00100                 bool mFullscreen;
+00101 
+00102 #ifdef USE_SDL_MIXER 
+00103 
+00104                 int mRate;
+00106                 bool mStereo;
+00107 #endif 
+00108 
+00109 
+00110         public:
+00111                 //add initialization
+00112 
+00123                 void SetupDisplay(int width, int height, int bpp, bool fullscreen);
+00124 
+00125 #ifdef USE_SDL_MIXER
+00126 
+00134                 void SetupSound(int rate, bool stereo);
+00135 #endif 
+00136 
+00146                 void CreateWindow(string title, string icon="");
+00147 
+00153                 void CloseWindow();
+00154 
+00156         //Screen Access//
+00158 
+00159         private:
+00161                 SDL_Surface *mScreen;
+00162 
+00163         public:
+00170                 SDL_Surface *GetDisplay();
+00171 
+00177                 void UpdateScreen();
+00178 
+00190                 Uint32 MapColor(Uint8 r, Uint8 g, Uint8 b, Uint8 a=255);
+00191 
+00199                 void Clear(Uint32 color=0, SDL_Rect *rect=NULL);
+00200 
+00202         //Timer and Framerate Independent Movement//
+00204         
+00205         private:
+00207                 bool mPaused;
+00209                 bool mUnpauseOnActive;
+00211                 Uint32 mLastPause;
+00213                 Uint32 mPausedTime;
+00215                 Uint32 mLastTime;
+00217                 double mSecPerFrame;
+00218 
+00219         public:
+00226                 void Sleep(Uint32 milliseconds);
+00227 
+00234                 Uint32 GetTime();
+00235 
+00241                 void PauseTimer();
+00242 
+00248                 void UnpauseTimer();
+00249 
+00256                 double GetFrameTime();
+00257 
+00264                 bool IsPaused();
+00265 
+00267         //Event and Input Handling//
+00269 
+00270         private:
+00272                 bool mActive;
+00274                 bool mQuit;
+00276                 Uint8 *mKeyPressed;
+00278                 int mMouseX;
+00280                 int mMouseY;
+00282                 Uint8 mMouseB;
+00283 
+00284         public:
+00291                 bool IsActive();
+00292 
+00299                 void RequestQuit();
+00300 
+00308                 bool QuitRequested();
+00309                 
+00317                 bool KeyIsPressed(SDLKey key);
+00318 
+00324                 void HideCursor();
+00325 
+00331                 void ShowCursor();
+00332 
+00339                 int GetMouseX();
+00340 
+00347                 int GetMouseY();
+00348 
+00355                 bool LButtonPressed();
+00356 
+00363                 bool RButtonPressed();
+00364 
+00372                 bool MouseInRect(SDL_Rect *rect);
+00373 
+00379                 void CheckEvents();
+00380 
+00381 #ifdef USE_PHYSFS
+00382 
+00383         //Physfs Utilities//
+00385         public:
+00392                 void InitPhysFS(string argv);
+00393 
+00400                 void AddPhysFSDir(string dir);
+00401 
+00402 #endif  //USE_PHYSFS
+00403 
+00404 
+00406         //Data Loading + Unloading//
+00408         public:
+00416                 ImageData LoadImage(string filename);
+00417 
+00424                 void FreeImage(ImageData &image);
+00425 
+00426 #ifdef USE_SDL_MIXER
+00427 
+00434                 SoundData LoadSound(string filename);
+00435 
+00442                 void FreeSound(SoundData &sound);
+00443 
+00451                 MusicData LoadMusic(string filename);
+00452 
+00459                 void FreeMusic(MusicData &music);
+00460 #endif
+00461 
+00462 #ifdef USE_SDL_TTF
+00463 
+00471                 FontData LoadFont(string filename, int size);
+00472 
+00479                 void FreeFont(FontData &font);
+00480 #endif 
+00481 
+00483         //Accessors//
+00485         
+00486         public: 
+00493                 int GetWidth();
+00494 
+00501                 int GetHeight();
+00502 
+00509                 int GetBPP();
+00510 
+00517                 bool IsFullscreen();
+00518 };
+00519 
+00520 }
+00521 
+00522 #endif //__ze_zengine_h__
+

Generated on Wed Nov 20 01:18:05 2002 for ZEngine by + +doxygen1.3-rc1
+ + diff --git a/doc/html/ZE__ZEngine_8h.html b/doc/html/ZE__ZEngine_8h.html new file mode 100644 index 0000000..ba52078 --- /dev/null +++ b/doc/html/ZE__ZEngine_8h.html @@ -0,0 +1,35 @@ + + +ZE_ZEngine.h File Reference + + + +
+Main Page   Namespace List   Class Hierarchy   Compound List   File List   Namespace Members   Compound Members   File Members  
+

/home/James/ZEngine-dev/include/ZE_ZEngine.h File Reference


Detailed Description

+
File Header:
File: ZE_ZEngine.h
+ Description: Header file for ZEngine class, the core of the ZEngine.
+ Author(s): James Turk
+ Last Updated: 11/07/02
+
+ +

+ZEngine Game Engine core Engine definition. +

+#include "ZE_DataPtr.h"
+#include "ZE_Error.h"
+#include "ZE_Defines.h"
+#include "ZE_Includes.h"
+ +

+Go to the source code of this file. + + + +

Namespaces

namespace  ZE
+


Generated on Wed Nov 20 01:18:05 2002 for ZEngine by + +doxygen1.3-rc1
+ + diff --git a/doc/html/ZE__ZFont_8cpp.html b/doc/html/ZE__ZFont_8cpp.html new file mode 100644 index 0000000..ba1c922 --- /dev/null +++ b/doc/html/ZE__ZFont_8cpp.html @@ -0,0 +1,28 @@ + + +ZE_ZFont.cpp File Reference + + + +
+Main Page   Namespace List   Class Hierarchy   Compound List   File List   Namespace Members   Compound Members   File Members  
+

/home/James/ZEngine-dev/src/ZE_ZFont.cpp File Reference


Detailed Description

+
File Header:
File: Types/ZE_ZFont.cpp
+ Description: Implementation source file for core ZEngine Font Object.
+ Author(s): James Turk
+ Last Updated: 11/07/02
+
+ +

+Implementation of ZFont, the basic Font class for ZEngine. +

+#include "ZE_ZFont.h"
+ + +
+


Generated on Wed Nov 20 01:18:05 2002 for ZEngine by + +doxygen1.3-rc1
+ + diff --git a/doc/html/ZE__ZFont_8h-source.html b/doc/html/ZE__ZFont_8h-source.html new file mode 100644 index 0000000..808359e --- /dev/null +++ b/doc/html/ZE__ZFont_8h-source.html @@ -0,0 +1,94 @@ + + +/home/James/ZEngine-dev/include/ZE_ZFont.h Source File + + + +
+Main Page   Namespace List   Class Hierarchy   Compound List   File List   Namespace Members   Compound Members   File Members  
+

/home/James/ZEngine-dev/include/ZE_ZFont.h

Go to the documentation of this file.
00001 /*******************************************************************************
+00002          This file is Part of the ZEngine Library for SDL Game Development.
+00003                       Copyright (C) 2002 ConceptOfZero.net
+00004 
+00005              Licensed under the BSD License, see licensing.txt.
+00006 
+00007     The maintainer of this library is James Turk (jturk@conceptofzero.net) 
+00008          and the home of this Library is http://www.conceptofzero.net/
+00009 *******************************************************************************/
+00010 
+00024 #ifndef __ze_zfont_h__
+00025 #define __ze_zfont_h__
+00026 
+00027 #include "ZE_ZObject.h"
+00028 #include "ZE_ZImage.h"
+00029 
+00030 #ifdef USE_SDL_TTF
+00031 
+00032 namespace ZE
+00033 {
+00034 
+00040 class ZFont : public ZObject
+00041 {
+00042         protected:
+00044                 FontData rFont;
+00046                 SDL_Color rColor;
+00048                 SDL_Color rBGColor;
+00049 
+00050         public:
+00051 
+00053                 //Opening and Closing//
+00055 
+00061                 ZFont();
+00062 
+00070                 ZFont(string filename, int size);
+00071 
+00077                 ~ZFont();
+00078 
+00086                 void Open(string filename, int size);
+00087 
+00093                 void Release();
+00094 
+00096                 //Settings and Drawing//
+00098 
+00106                 void DrawText(string text, ZImage &image);
+00107 
+00115                 void DrawShadedText(string text, ZImage &image);
+00116 
+00125                 void SetColor(Uint8 r, Uint8 g, Uint8 b);
+00126 
+00135                 void SetBGColor(Uint8 r, Uint8 g, Uint8 b);
+00136 
+00145                 void SetStyle(bool bold, bool italic, bool underline);
+00146 
+00153                 void Resize(int size);
+00154 
+00156                 //Accessors//
+00158 
+00165                 bool IsLoaded();
+00166 
+00173                 bool IsBold();
+00174 
+00181                 bool IsItalic();
+00182 
+00189                 bool IsUnderlined();
+00190 
+00197                 int GetHeight();
+00198 
+00205                 int GetLineSkip();
+00206 
+00214                 int GetStringWidth(string text);
+00215 
+00223                 int GetStringHeight(string text);
+00224 };
+00225 
+00226 }
+00227 
+00228 #endif //USE_SDL_TTF
+00229 
+00230 #endif //__ze_zfont_h__
+

Generated on Wed Nov 20 01:18:05 2002 for ZEngine by + +doxygen1.3-rc1
+ + diff --git a/doc/html/ZE__ZFont_8h.html b/doc/html/ZE__ZFont_8h.html new file mode 100644 index 0000000..71abe65 --- /dev/null +++ b/doc/html/ZE__ZFont_8h.html @@ -0,0 +1,33 @@ + + +ZE_ZFont.h File Reference + + + +
+Main Page   Namespace List   Class Hierarchy   Compound List   File List   Namespace Members   Compound Members   File Members  
+

/home/James/ZEngine-dev/include/ZE_ZFont.h File Reference


Detailed Description

+
File Header:
File: Types/ZE_ZFont.h
+ Description: Header file for core ZEngine Font Object.
+ Author(s): James Turk
+ Last Updated: 11/07/02
+
+ +

+Definition file for ZFont, the basic Font class for ZEngine. +

+#include "ZE_ZObject.h"
+#include "ZE_ZImage.h"
+ +

+Go to the source code of this file. + + + +

Namespaces

namespace  ZE
+


Generated on Wed Nov 20 01:18:05 2002 for ZEngine by + +doxygen1.3-rc1
+ + diff --git a/doc/html/ZE__ZImage_8cpp.html b/doc/html/ZE__ZImage_8cpp.html new file mode 100644 index 0000000..e491df2 --- /dev/null +++ b/doc/html/ZE__ZImage_8cpp.html @@ -0,0 +1,30 @@ + + +ZE_ZImage.cpp File Reference + + + +
+Main Page   Namespace List   Class Hierarchy   Compound List   File List   Namespace Members   Compound Members   File Members  
+

/home/James/ZEngine-dev/src/ZE_ZImage.cpp File Reference


Detailed Description

+
File Header:
File: Types/ZE_ZImage.cpp
+ Description: Implementation source file for core ZEngine Image Object.
+ Author(s): James Turk
+ Last Updated: 11/07/02
+
+ +

+Implementation of ZImage, the basic Image class for ZEngine. +

+#include "ZE_ZImage.h"
+ + + + +

Namespaces

namespace  ZE
+


Generated on Wed Nov 20 01:18:05 2002 for ZEngine by + +doxygen1.3-rc1
+ + diff --git a/doc/html/ZE__ZImage_8h-source.html b/doc/html/ZE__ZImage_8h-source.html new file mode 100644 index 0000000..325f628 --- /dev/null +++ b/doc/html/ZE__ZImage_8h-source.html @@ -0,0 +1,81 @@ + + +/home/James/ZEngine-dev/include/ZE_ZImage.h Source File + + + +
+Main Page   Namespace List   Class Hierarchy   Compound List   File List   Namespace Members   Compound Members   File Members  
+

/home/James/ZEngine-dev/include/ZE_ZImage.h

Go to the documentation of this file.
00001 /*******************************************************************************
+00002          This file is Part of the ZEngine Library for SDL Game Development.
+00003                       Copyright (C) 2002 ConceptOfZero.net
+00004 
+00005              Licensed under the BSD License, see licensing.txt.
+00006 
+00007     The maintainer of this library is James Turk (jturk@conceptofzero.net) 
+00008          and the home of this Library is http://www.conceptofzero.net/
+00009 *******************************************************************************/
+00010 
+00024 #ifndef __ze_zimage_h__
+00025 #define __ze_zimage_h__
+00026 
+00027 #include "ZE_ZObject.h"
+00028 
+00029 namespace ZE
+00030 {
+00031 
+00037 class ZImage : public ZObject
+00038 {
+00039         protected:
+00041                 ImageData rImage;
+00042         public:
+00043 
+00049                 ZImage();
+00050 
+00057                 ZImage(string filename);
+00058 
+00065                 ZImage(SDL_Surface *surface);
+00066 
+00078                 ZImage(SDL_Surface *img, Sint16 x, Sint16 y, Sint16 w, Sint16 h);
+00079 
+00085                 ~ZImage();
+00086 
+00088                 //Opening and Closing//
+00090 
+00097                 void Open(string filename);
+00098 
+00110                 void OpenFromImage(SDL_Surface *img, Sint16 x, Sint16 y, Sint16 w, Sint16 h);
+00111 
+00118                 void Attach(SDL_Surface *surface);
+00119 
+00125                 void Release();
+00126 
+00128                 //Graphics//
+00130 
+00137                 void SetAlpha(Uint8 alpha);
+00138 
+00145                 void SetColorKey(Uint32 color);
+00146 
+00154                 void Draw(Sint16 x, Sint16 y);
+00155 
+00157                 //Accessors//
+00159 
+00166                 bool IsLoaded();
+00167 
+00173                 SDL_Surface *GetImage();
+00174 
+00181                 int GetWidth();
+00182 
+00189                 int GetHeight();
+00190 
+00197                 string GetFilename();
+00198 };
+00199 }
+00200 
+00201 #endif //__ze_zimage_h__
+

Generated on Wed Nov 20 01:18:05 2002 for ZEngine by + +doxygen1.3-rc1
+ + diff --git a/doc/html/ZE__ZImage_8h.html b/doc/html/ZE__ZImage_8h.html new file mode 100644 index 0000000..508b131 --- /dev/null +++ b/doc/html/ZE__ZImage_8h.html @@ -0,0 +1,32 @@ + + +ZE_ZImage.h File Reference + + + +
+Main Page   Namespace List   Class Hierarchy   Compound List   File List   Namespace Members   Compound Members   File Members  
+

/home/James/ZEngine-dev/include/ZE_ZImage.h File Reference


Detailed Description

+
File Header:
File: Types/ZE_ZImage.h
+ Description: Header file for core ZEngine Image Object.
+ Author(s): James Turk
+ Last Updated: 11/08/02
+
+ +

+Definition file for ZImage, the basic Image class for ZEngine. +

+#include "ZE_ZObject.h"
+ +

+Go to the source code of this file. + + + +

Namespaces

namespace  ZE
+


Generated on Wed Nov 20 01:18:05 2002 for ZEngine by + +doxygen1.3-rc1
+ + diff --git a/doc/html/ZE__ZMusic_8cpp.html b/doc/html/ZE__ZMusic_8cpp.html new file mode 100644 index 0000000..7ed367f --- /dev/null +++ b/doc/html/ZE__ZMusic_8cpp.html @@ -0,0 +1,28 @@ + + +ZE_ZMusic.cpp File Reference + + + +
+Main Page   Namespace List   Class Hierarchy   Compound List   File List   Namespace Members   Compound Members   File Members  
+

/home/James/ZEngine-dev/src/ZE_ZMusic.cpp File Reference


Detailed Description

+
File Header:
File: Types/ZE_ZMusic.cpp
+ Description: Implementation source file for core ZEngine Music Object.
+ Author(s): James Turk
+ Last Updated: 11/07/02
+
+ +

+Implementation of ZMusic, the basic Music class for ZEngine. +

+#include "ZE_ZMusic.h"
+ + +
+


Generated on Wed Nov 20 01:18:05 2002 for ZEngine by + +doxygen1.3-rc1
+ + diff --git a/doc/html/ZE__ZMusic_8h-source.html b/doc/html/ZE__ZMusic_8h-source.html new file mode 100644 index 0000000..1609224 --- /dev/null +++ b/doc/html/ZE__ZMusic_8h-source.html @@ -0,0 +1,85 @@ + + +/home/James/ZEngine-dev/include/ZE_ZMusic.h Source File + + + +
+Main Page   Namespace List   Class Hierarchy   Compound List   File List   Namespace Members   Compound Members   File Members  
+

/home/James/ZEngine-dev/include/ZE_ZMusic.h

Go to the documentation of this file.
00001 /*******************************************************************************
+00002          This file is Part of the ZEngine Library for SDL Game Development.
+00003                       Copyright (C) 2002 ConceptOfZero.net
+00004 
+00005              Licensed under the BSD License, see licensing.txt.
+00006 
+00007     The maintainer of this library is James Turk (jturk@conceptofzero.net) 
+00008          and the home of this Library is http://www.conceptofzero.net/
+00009 *******************************************************************************/
+00010 
+00024 #ifndef __ze_zmusic_h__
+00025 #define __ze_zmusic_h__
+00026 
+00027 #include "ZE_ZObject.h"
+00028 
+00029 #ifdef USE_SDL_MIXER
+00030 
+00031 namespace ZE
+00032 {
+00033 
+00039 class ZMusic : public ZObject 
+00040 {
+00041         protected:
+00043                 MusicData rMusic;
+00044 
+00045         public:
+00047                 static const int LoopInfinite;
+00048 
+00050                 //Opening and Closing//
+00052 
+00058                 ZMusic();
+00059 
+00066                 ZMusic(string filename);
+00067 
+00073                 ~ZMusic();
+00074 
+00081                 void Open(string filename);
+00082 
+00088                 void Release();
+00089 
+00091                 //Play Controls//
+00093 
+00102                 void Play(int loopNum=0, int fadeTime=0);
+00103 
+00109                 void Pause();
+00110 
+00116                 void Unpause();
+00117 
+00123                 void Rewind();
+00124 
+00131                 void Stop(int fadeTime=0);
+00132 
+00139                 void SetVolume(int volume);
+00140 
+00142                 //Accessors//
+00144 
+00151                 bool IsLoaded();
+00152 
+00159                 bool IsPlaying();
+00160 
+00167                 bool IsPaused();
+00168 
+00175                 int GetVolume();
+00176 };
+00177 
+00178 
+00179 }
+00180 
+00181 #endif //USE_SDL_MIXER
+00182 
+00183 #endif //__ze_zmusic_h__
+

Generated on Wed Nov 20 01:18:05 2002 for ZEngine by + +doxygen1.3-rc1
+ + diff --git a/doc/html/ZE__ZMusic_8h.html b/doc/html/ZE__ZMusic_8h.html new file mode 100644 index 0000000..32652bc --- /dev/null +++ b/doc/html/ZE__ZMusic_8h.html @@ -0,0 +1,32 @@ + + +ZE_ZMusic.h File Reference + + + +
+Main Page   Namespace List   Class Hierarchy   Compound List   File List   Namespace Members   Compound Members   File Members  
+

/home/James/ZEngine-dev/include/ZE_ZMusic.h File Reference


Detailed Description

+
File Header:
File: Types/ZE_ZMusic.h
+ Description: Header file for core ZEngine Music Wrapper Object.
+ Author(s): James Turk
+ Last Updated: 11/07/02
+
+ +

+Definition file for ZMusic, the Music file wrapper for ZEngine. +

+#include "ZE_ZObject.h"
+ +

+Go to the source code of this file. + + + +

Namespaces

namespace  ZE
+


Generated on Wed Nov 20 01:18:05 2002 for ZEngine by + +doxygen1.3-rc1
+ + diff --git a/doc/html/ZE__ZObject_8h-source.html b/doc/html/ZE__ZObject_8h-source.html new file mode 100644 index 0000000..b5acf5a --- /dev/null +++ b/doc/html/ZE__ZObject_8h-source.html @@ -0,0 +1,43 @@ + + +/home/James/ZEngine-dev/include/ZE_ZObject.h Source File + + + +
+Main Page   Namespace List   Class Hierarchy   Compound List   File List   Namespace Members   Compound Members   File Members  
+

/home/James/ZEngine-dev/include/ZE_ZObject.h

Go to the documentation of this file.
00001 /*******************************************************************************
+00002          This file is Part of the ZEngine Library for SDL Game Development.
+00003                       Copyright (C) 2002 ConceptOfZero.net
+00004 
+00005              Licensed under the BSD License, see licensing.txt.
+00006 
+00007     The maintainer of this library is James Turk (jturk@conceptofzero.net) 
+00008          and the home of this Library is http://www.conceptofzero.net/
+00009 *******************************************************************************/
+00010 
+00024 #ifndef __ze_zobject_h__
+00025 #define __ze_zobject_h__
+00026 
+00027 #include "ZE_ZEngine.h"
+00028 
+00029 namespace ZE
+00030 {
+00036 class ZObject
+00037 {
+00038         protected:
+00040                 ZEngine* rEngine;
+00041         public:
+00047                 ZObject() { rEngine = ZEngine::GetInstance(); };
+00048 
+00054                 virtual ~ZObject() {};
+00055 };
+00056 }
+00057 
+00058 #endif //__ze_zobject_h__
+

Generated on Wed Nov 20 01:18:05 2002 for ZEngine by + +doxygen1.3-rc1
+ + diff --git a/doc/html/ZE__ZObject_8h.html b/doc/html/ZE__ZObject_8h.html new file mode 100644 index 0000000..10c8aaa --- /dev/null +++ b/doc/html/ZE__ZObject_8h.html @@ -0,0 +1,32 @@ + + +ZE_ZObject.h File Reference + + + +
+Main Page   Namespace List   Class Hierarchy   Compound List   File List   Namespace Members   Compound Members   File Members  
+

/home/James/ZEngine-dev/include/ZE_ZObject.h File Reference


Detailed Description

+
File Header:
File: Types/ZE_ZObject.h
+ Description: Header file for ZEngine core Object ZObject, base of most ZEngine objects.
+ Author(s): James Turk
+ Last Updated: 11/07/02
+
+ +

+Definition file for ZObject the Virtual Base Class for majority of the ZEngine Objects. +

+#include "ZE_ZEngine.h"
+ +

+Go to the source code of this file. + + + +

Namespaces

namespace  ZE
+


Generated on Wed Nov 20 01:18:05 2002 for ZEngine by + +doxygen1.3-rc1
+ + diff --git a/doc/html/ZE__ZRect_8cpp.html b/doc/html/ZE__ZRect_8cpp.html new file mode 100644 index 0000000..08a0325 --- /dev/null +++ b/doc/html/ZE__ZRect_8cpp.html @@ -0,0 +1,30 @@ + + +ZE_ZRect.cpp File Reference + + + +
+Main Page   Namespace List   Class Hierarchy   Compound List   File List   Namespace Members   Compound Members   File Members  
+

/home/James/ZEngine-dev/src/ZE_ZRect.cpp File Reference


Detailed Description

+
File Header:
File: ZE_ZRect.cpp
+ Description: Implementation source file for core ZEngine Rectangle Object.
+ Author(s): James Turk
+ Last Updated: 11/08/02
+
+ +

+Implementation of ZRect, the Rectangle class for ZEngine. +

+#include "ZE_ZRect.h"
+ + + + +

Namespaces

namespace  ZE
+


Generated on Wed Nov 20 01:18:05 2002 for ZEngine by + +doxygen1.3-rc1
+ + diff --git a/doc/html/ZE__ZRect_8h-source.html b/doc/html/ZE__ZRect_8h-source.html new file mode 100644 index 0000000..edd3cd0 --- /dev/null +++ b/doc/html/ZE__ZRect_8h-source.html @@ -0,0 +1,90 @@ + + +/home/James/ZEngine-dev/include/ZE_ZRect.h Source File + + + +
+Main Page   Namespace List   Class Hierarchy   Compound List   File List   Namespace Members   Compound Members   File Members  
+

/home/James/ZEngine-dev/include/ZE_ZRect.h

Go to the documentation of this file.
00001 /*******************************************************************************
+00002          This file is Part of the ZEngine Library for SDL Game Development.
+00003                       Copyright (C) 2002 ConceptOfZero.net
+00004 
+00005              Licensed under the BSD License, see licensing.txt.
+00006 
+00007     The maintainer of this library is James Turk (jturk@conceptofzero.net) 
+00008          and the home of this Library is http://www.conceptofzero.net/
+00009 *******************************************************************************/
+00010 
+00024 #ifndef __ze_zrect_h__
+00025 #define __ze_zrect_h__
+00026 
+00027 #include "ZE_ZObject.h"         //included even though ZRect isn't derived (to obtain all other needed headers)
+00028 
+00029 namespace ZE
+00030 {
+00031 
+00037 class ZRect
+00038 {
+00039         private:
+00041                 int mX;
+00043                 int mY;
+00045                 int mWidth;
+00047                 int mHeight;
+00048 
+00049         public:
+00050 
+00056                 ZRect();
+00057 
+00067                 ZRect(int x, int y, int width, int height);
+00068 
+00075                 ZRect(const ZRect &rhs);
+00076 
+00084                 const ZRect& operator=(const ZRect &rhs);
+00085 
+00094                 bool operator<(const ZRect &rhs) const;
+00095 
+00103                 void Move(int x, int y);
+00104 
+00112                 void MoveRel(int xMove, int yMove);
+00113 
+00121                 void Resize(int width, int height);
+00122 
+00130                 void ResizeRel(int widthChange, int heightChange);
+00131 
+00139                 bool Intersects(const ZRect &rect) const;
+00140 
+00149                 bool Contains(int x, int y) const;
+00150 
+00158                 bool Contains(const ZRect &rect) const;
+00159 
+00167                 ZRect Intersection(const ZRect &rect) const;
+00168 
+00175                 SDL_Rect SDLrect() const;
+00176 
+00183                 int X() const;
+00184 
+00191                 int Y() const;
+00192 
+00199                 int Left() const;
+00200 
+00207                 int Right() const;
+00208 
+00215                 int Top() const;
+00216 
+00223                 int Bottom() const;
+00224 
+00231                 int Width() const;
+00232 
+00239                 int Height() const;
+00240 };
+00241 
+00242 } //namspace ZE
+00243 
+00244 #endif //__ze_zrect_h__
+

Generated on Wed Nov 20 01:18:05 2002 for ZEngine by + +doxygen1.3-rc1
+ + diff --git a/doc/html/ZE__ZRect_8h.html b/doc/html/ZE__ZRect_8h.html new file mode 100644 index 0000000..2db4fab --- /dev/null +++ b/doc/html/ZE__ZRect_8h.html @@ -0,0 +1,32 @@ + + +ZE_ZRect.h File Reference + + + +
+Main Page   Namespace List   Class Hierarchy   Compound List   File List   Namespace Members   Compound Members   File Members  
+

/home/James/ZEngine-dev/include/ZE_ZRect.h File Reference


Detailed Description

+
File Header:
File: ZE_ZRect.h
+ Description: Header file for core ZEngine Rectangle Object.
+ Author(s): James Turk
+ Last Updated: 11/08/02
+
+ +

+Definition file for ZRect, the Rectangle class for ZEngine. +

+#include "ZE_ZObject.h"
+ +

+Go to the source code of this file. + + + +

Namespaces

namespace  ZE
+


Generated on Wed Nov 20 01:18:05 2002 for ZEngine by + +doxygen1.3-rc1
+ + diff --git a/doc/html/ZE__ZSound_8cpp.html b/doc/html/ZE__ZSound_8cpp.html new file mode 100644 index 0000000..4813c83 --- /dev/null +++ b/doc/html/ZE__ZSound_8cpp.html @@ -0,0 +1,28 @@ + + +ZE_ZSound.cpp File Reference + + + +
+Main Page   Namespace List   Class Hierarchy   Compound List   File List   Namespace Members   Compound Members   File Members  
+

/home/James/ZEngine-dev/src/ZE_ZSound.cpp File Reference


Detailed Description

+
File Header:
File: Types/ZE_ZSound.cpp
+ Description: Implementation source file for core ZEngine Sound Object.
+ Author(s): James Turk
+ Last Updated: 11/07/02
+
+ +

+Implementation of ZSound, the basic Sound class for ZEngine. +

+#include "ZE_ZSound.h"
+ + +
+


Generated on Wed Nov 20 01:18:05 2002 for ZEngine by + +doxygen1.3-rc1
+ + diff --git a/doc/html/ZE__ZSound_8h-source.html b/doc/html/ZE__ZSound_8h-source.html new file mode 100644 index 0000000..1c24441 --- /dev/null +++ b/doc/html/ZE__ZSound_8h-source.html @@ -0,0 +1,84 @@ + + +/home/James/ZEngine-dev/include/ZE_ZSound.h Source File + + + +
+Main Page   Namespace List   Class Hierarchy   Compound List   File List   Namespace Members   Compound Members   File Members  
+

/home/James/ZEngine-dev/include/ZE_ZSound.h

Go to the documentation of this file.
00001 /*******************************************************************************
+00002          This file is Part of the ZEngine Library for SDL Game Development.
+00003                       Copyright (C) 2002 ConceptOfZero.net
+00004 
+00005              Licensed under the BSD License, see licensing.txt.
+00006 
+00007     The maintainer of this library is James Turk (jturk@conceptofzero.net) 
+00008          and the home of this Library is http://www.conceptofzero.net/
+00009 *******************************************************************************/
+00010 
+00024 #ifndef __ze_zsound_h__
+00025 #define __ze_zsound_h__
+00026 
+00027 #include "ZE_ZObject.h"
+00028 
+00029 #ifdef USE_SDL_MIXER
+00030 
+00031 namespace ZE
+00032 {
+00033 
+00039 class ZSound : public ZObject 
+00040 {
+00041         protected:
+00043                 SoundData rSound;
+00045                 int rChannelID;
+00046 
+00047         public:
+00049                 static const int LoopInfinite;
+00050 
+00052                 //Opening and Closing//
+00054 
+00060                 ZSound();
+00061 
+00068                 ZSound(string filename);
+00069 
+00075                 ~ZSound();
+00076 
+00083                 void Open(string filename);
+00084 
+00090                 void Release();
+00091 
+00093                 //Play Controls//
+00095 
+00104                 void Play(int loopNum=0, int fadeTime=0);
+00105 
+00111                 void Pause();
+00112 
+00118                 void Unpause();
+00119 
+00126                 void Stop(int fadeTime=0);
+00127 
+00134                 void SetVolume(int volume);
+00135 
+00137                 //Accessors//
+00139 
+00146                 bool IsLoaded();
+00147 
+00154                 bool IsPlaying();
+00155 
+00162                 bool IsPaused();
+00163 
+00170                 int GetVolume();
+00171 };
+00172 
+00173 
+00174 }
+00175 
+00176 #endif //USE_SDL_MIXER
+00177 
+00178 #endif //__ze_zsound_h__
+

Generated on Wed Nov 20 01:18:05 2002 for ZEngine by + +doxygen1.3-rc1
+ + diff --git a/doc/html/ZE__ZSound_8h.html b/doc/html/ZE__ZSound_8h.html new file mode 100644 index 0000000..c312b84 --- /dev/null +++ b/doc/html/ZE__ZSound_8h.html @@ -0,0 +1,32 @@ + + +ZE_ZSound.h File Reference + + + +
+Main Page   Namespace List   Class Hierarchy   Compound List   File List   Namespace Members   Compound Members   File Members  
+

/home/James/ZEngine-dev/include/ZE_ZSound.h File Reference


Detailed Description

+
File Header:
File: Types/ZE_ZSound.h
+ Description: Header file for core ZEngine Sound Wrapper Object.
+ Author(s): James Turk
+ Last Updated: 11/07/02
+
+ +

+Definition file for ZSound, the Sound Effect wrapper for ZEngine. +

+#include "ZE_ZObject.h"
+ +

+Go to the source code of this file. + + + +

Namespaces

namespace  ZE
+


Generated on Wed Nov 20 01:18:05 2002 for ZEngine by + +doxygen1.3-rc1
+ + diff --git a/doc/html/ZE__ZTimer_8cpp.html b/doc/html/ZE__ZTimer_8cpp.html new file mode 100644 index 0000000..1b4056f --- /dev/null +++ b/doc/html/ZE__ZTimer_8cpp.html @@ -0,0 +1,30 @@ + + +ZE_ZTimer.cpp File Reference + + + +
+Main Page   Namespace List   Class Hierarchy   Compound List   File List   Namespace Members   Compound Members   File Members  
+

/home/James/ZEngine-dev/src/ZE_ZTimer.cpp File Reference


Detailed Description

+
File Header:
File: ZE_ZTimer.cpp
+ Description: Implementation source file for core ZEngine Timer Object.
+ Author(s): James Turk
+ Last Updated: 11/08/02
+
+ +

+Implementation of ZTimer, the basic Timer class for ZEngine. +

+#include "ZE_ZTimer.h"
+ + + + +

Namespaces

namespace  ZE
+


Generated on Wed Nov 20 01:18:05 2002 for ZEngine by + +doxygen1.3-rc1
+ + diff --git a/doc/html/ZE__ZTimer_8h-source.html b/doc/html/ZE__ZTimer_8h-source.html new file mode 100644 index 0000000..85472bc --- /dev/null +++ b/doc/html/ZE__ZTimer_8h-source.html @@ -0,0 +1,60 @@ + + +/home/James/ZEngine-dev/include/ZE_ZTimer.h Source File + + + +
+Main Page   Namespace List   Class Hierarchy   Compound List   File List   Namespace Members   Compound Members   File Members  
+

/home/James/ZEngine-dev/include/ZE_ZTimer.h

Go to the documentation of this file.
00001 /*******************************************************************************
+00002          This file is Part of the ZEngine Library for SDL Game Development.
+00003                       Copyright (C) 2002 ConceptOfZero.net
+00004 
+00005              Licensed under the BSD License, see licensing.txt.
+00006 
+00007     The maintainer of this library is James Turk (jturk@conceptofzero.net) 
+00008          and the home of this Library is http://www.conceptofzero.net/
+00009 *******************************************************************************/
+00010 
+00024 #ifndef __ze_ztimer_h__
+00025 #define __ze_ztimer_h__
+00026 
+00027 #include "ZE_ZObject.h"
+00028 
+00029 namespace ZE
+00030 {
+00031 
+00037 class ZTimer : public ZObject 
+00038 {
+00039         protected:
+00041                 bool rPaused;
+00043                 bool rUseZEngine;
+00045                 Uint32 rPausedTime;
+00047                 Uint32 rLastPause;
+00048 
+00055                 Uint32 GetParentTime();
+00056 
+00057         public:
+00058 
+00065                 ZTimer(bool useZEngine=true);
+00066 
+00072                 void Reset();
+00073 
+00079                 void Pause();
+00080 
+00086                 void Unpause();
+00087 
+00094                 Uint32 GetTime();
+00095 
+00102                 bool IsPaused();
+00103 };
+00104 
+00105 }
+00106 
+00107 #endif //__ze_ztimer_h__
+

Generated on Wed Nov 20 01:18:05 2002 for ZEngine by + +doxygen1.3-rc1
+ + diff --git a/doc/html/ZE__ZTimer_8h.html b/doc/html/ZE__ZTimer_8h.html new file mode 100644 index 0000000..feda7ba --- /dev/null +++ b/doc/html/ZE__ZTimer_8h.html @@ -0,0 +1,32 @@ + + +ZE_ZTimer.h File Reference + + + +
+Main Page   Namespace List   Class Hierarchy   Compound List   File List   Namespace Members   Compound Members   File Members  
+

/home/James/ZEngine-dev/include/ZE_ZTimer.h File Reference


Detailed Description

+
File Header:
File: Types/ZE_ZTimer.h
+ Description: Header file for core ZEngine Timer Object.
+ Author(s): James Turk
+ Last Updated: 11/07/02
+
+ +

+Definition file for ZTimer, the Timer class for ZEngine. +

+#include "ZE_ZObject.h"
+ +

+Go to the source code of this file. + + + +

Namespaces

namespace  ZE
+


Generated on Wed Nov 20 01:18:05 2002 for ZEngine by + +doxygen1.3-rc1
+ + diff --git a/doc/html/ZEngine_8h-source.html b/doc/html/ZEngine_8h-source.html new file mode 100644 index 0000000..3cc0afb --- /dev/null +++ b/doc/html/ZEngine_8h-source.html @@ -0,0 +1,27 @@ + + +/home/James/ZEngine-dev/include/ZEngine.h Source File + + + +
+Main Page   Namespace List   Class Hierarchy   Compound List   File List   Namespace Members   Compound Members   File Members  
+

/home/James/ZEngine-dev/include/ZEngine.h

Go to the documentation of this file.
00001 
+00043 #include "ZE_ZEngine.h"
+00044 #include "ZE_ZImage.h"
+00045 #include "ZE_ZTimer.h"
+00046 #include "ZE_ZConfigFile.h"
+00047 #include "ZE_ZRect.h"
+00048 #ifdef USE_SDL_TTF
+00049 #include "ZE_ZFont.h"
+00050 #endif
+00051 #ifdef USE_SDL_MIXER
+00052 #include "ZE_ZSound.h"
+00053 #include "ZE_ZMusic.h"
+00054 #endif
+

Generated on Wed Nov 20 01:18:05 2002 for ZEngine by + +doxygen1.3-rc1
+ + diff --git a/doc/html/ZEngine_8h.html b/doc/html/ZEngine_8h.html new file mode 100644 index 0000000..5bb7b41 --- /dev/null +++ b/doc/html/ZEngine_8h.html @@ -0,0 +1,37 @@ + + +ZEngine.h File Reference + + + +
+Main Page   Namespace List   Class Hierarchy   Compound List   File List   Namespace Members   Compound Members   File Members  
+

/home/James/ZEngine-dev/include/ZEngine.h File Reference


Detailed Description

+
File Header:
File: ZEngine.h
+ Description: Public Header File for ZEngine.
+ Author(s): James Turk
+ Last Updated: 11/07/02
+
+ +

+Header file for ZEngine Game Engine from Concept of Zero, this is the file that programs that wish to utilize ZEngine should include. +

+#include "ZE_ZEngine.h"
+#include "ZE_ZImage.h"
+#include "ZE_ZTimer.h"
+#include "ZE_ZConfigFile.h"
+#include "ZE_ZRect.h"
+#include "ZE_ZFont.h"
+#include "ZE_ZSound.h"
+#include "ZE_ZMusic.h"
+ +

+Go to the source code of this file. + +
+


Generated on Wed Nov 20 01:18:05 2002 for ZEngine by + +doxygen1.3-rc1
+ + diff --git a/doc/html/annotated.html b/doc/html/annotated.html new file mode 100644 index 0000000..691175d --- /dev/null +++ b/doc/html/annotated.html @@ -0,0 +1,29 @@ + + +Annotated Index + + + +
+Main Page   Namespace List   Class Hierarchy   Compound List   File List   Namespace Members   Compound Members   File Members  
+

ZEngine Compound List

Here are the classes, structs, unions and interfaces with brief descriptions: + + + + + + + + + + + + + +
ZE::FontDataClass to wrap TTF_Font pointers
ZE::ImageDataClass to wrap SDL_Surface pointers
ZE::MusicDataClass to wrap Mix_Music pointers
ZE::SoundDataClass to wrap Mix_Chunk pointers
ZE::ZConfigFileZConfigFile Class for use in ZEngine
ZE::ZEngineMain ZEngine Singleton Class
ZE::ZFontZFont class for basic Font use
ZE::ZImageZImage class for basic Image use
ZE::ZMusicZMusic class for playing full length music (eg. ogg or wav)
ZE::ZObjectZObject base class for other ZEngine objects
ZE::ZRectZEngine class for simplified rectangle use
ZE::ZSoundZSound class for playing sound effects. (WAV)
ZE::ZTimerZTimer class for Timer use
+
Generated on Wed Nov 20 01:18:05 2002 for ZEngine by + +doxygen1.3-rc1
+ + diff --git a/doc/html/classZE_1_1FontData-members.html b/doc/html/classZE_1_1FontData-members.html new file mode 100644 index 0000000..ddf043b --- /dev/null +++ b/doc/html/classZE_1_1FontData-members.html @@ -0,0 +1,18 @@ + + +Member List + + + +
+Main Page   Namespace List   Class Hierarchy   Compound List   File List   Namespace Members   Compound Members   File Members  
+

ZE::FontData Member List

This is the complete list of members for ZE::FontData, including all inherited members. + + + +
filenameZE::FontData
fontZE::FontData
FontData()ZE::FontData [inline]

Generated on Wed Nov 20 01:18:05 2002 for ZEngine by + +doxygen1.3-rc1
+ + diff --git a/doc/html/classZE_1_1FontData.html b/doc/html/classZE_1_1FontData.html new file mode 100644 index 0000000..42c48f4 --- /dev/null +++ b/doc/html/classZE_1_1FontData.html @@ -0,0 +1,63 @@ + + +ZE::FontData class Reference + + + +
+Main Page   Namespace List   Class Hierarchy   Compound List   File List   Namespace Members   Compound Members   File Members  
+

ZE::FontData Class Reference

#include <ZE_DataPtr.h> +

+List of all members.


Detailed Description

+Class used to keep track of loaded data and associate a TTF_Font with an index number and filename. +

+ + + + + + + + + + +

Public Methods

 FontData ()
 Initialize FontData.


Public Attributes

+TTF_Font * font
 Pointer to SDL_TTF font data.

+string filename
 File font was loaded from.

+


Constructor & Destructor Documentation

+

+ + + + +
+ + + + + + + + + +
ZE::FontData::FontData   [inline]
+
+ + + + + +
+   + + +

+Sets font pointer to NULL

+


The documentation for this class was generated from the following file: +
Generated on Wed Nov 20 01:18:05 2002 for ZEngine by + +doxygen1.3-rc1
+ + diff --git a/doc/html/classZE_1_1ImageData-members.html b/doc/html/classZE_1_1ImageData-members.html new file mode 100644 index 0000000..2f2be83 --- /dev/null +++ b/doc/html/classZE_1_1ImageData-members.html @@ -0,0 +1,18 @@ + + +Member List + + + +
+Main Page   Namespace List   Class Hierarchy   Compound List   File List   Namespace Members   Compound Members   File Members  
+

ZE::ImageData Member List

This is the complete list of members for ZE::ImageData, including all inherited members. + + + +
filenameZE::ImageData
imageZE::ImageData
ImageData()ZE::ImageData [inline]

Generated on Wed Nov 20 01:18:05 2002 for ZEngine by + +doxygen1.3-rc1
+ + diff --git a/doc/html/classZE_1_1ImageData.html b/doc/html/classZE_1_1ImageData.html new file mode 100644 index 0000000..116f861 --- /dev/null +++ b/doc/html/classZE_1_1ImageData.html @@ -0,0 +1,63 @@ + + +ZE::ImageData class Reference + + + +
+Main Page   Namespace List   Class Hierarchy   Compound List   File List   Namespace Members   Compound Members   File Members  
+

ZE::ImageData Class Reference

#include <ZE_DataPtr.h> +

+List of all members.


Detailed Description

+Class used to keep track of loaded data and associate an SDL_Surface with an index number and filename. +

+ + + + + + + + + + +

Public Methods

 ImageData ()
 Initialize ImageData.


Public Attributes

+SDL_Surface * image
 Pointer to SDL_Surface.

+string filename
 File image was loaded from.

+


Constructor & Destructor Documentation

+

+ + + + +
+ + + + + + + + + +
ZE::ImageData::ImageData   [inline]
+
+ + + + + +
+   + + +

+Sets image pointer to NULL

+


The documentation for this class was generated from the following file: +
Generated on Wed Nov 20 01:18:05 2002 for ZEngine by + +doxygen1.3-rc1
+ + diff --git a/doc/html/classZE_1_1MusicData-members.html b/doc/html/classZE_1_1MusicData-members.html new file mode 100644 index 0000000..dc3d551 --- /dev/null +++ b/doc/html/classZE_1_1MusicData-members.html @@ -0,0 +1,18 @@ + + +Member List + + + +
+Main Page   Namespace List   Class Hierarchy   Compound List   File List   Namespace Members   Compound Members   File Members  
+

ZE::MusicData Member List

This is the complete list of members for ZE::MusicData, including all inherited members. + + + +
filenameZE::MusicData
musicZE::MusicData
MusicData()ZE::MusicData [inline]

Generated on Wed Nov 20 01:18:06 2002 for ZEngine by + +doxygen1.3-rc1
+ + diff --git a/doc/html/classZE_1_1MusicData.html b/doc/html/classZE_1_1MusicData.html new file mode 100644 index 0000000..36739da --- /dev/null +++ b/doc/html/classZE_1_1MusicData.html @@ -0,0 +1,63 @@ + + +ZE::MusicData class Reference + + + +
+Main Page   Namespace List   Class Hierarchy   Compound List   File List   Namespace Members   Compound Members   File Members  
+

ZE::MusicData Class Reference

#include <ZE_DataPtr.h> +

+List of all members.


Detailed Description

+Class used to keep track of loaded data and associate a Mix_Music with an index number and filename. +

+ + + + + + + + + + +

Public Methods

 MusicData ()
 Initialize MusicData.


Public Attributes

+Mix_Music * music
 Pointer to SDL_Mixer music data.

+string filename
 File music was loaded from.

+


Constructor & Destructor Documentation

+

+ + + + +
+ + + + + + + + + +
ZE::MusicData::MusicData   [inline]
+
+ + + + + +
+   + + +

+Sets music pointer to NULL

+


The documentation for this class was generated from the following file: +
Generated on Wed Nov 20 01:18:06 2002 for ZEngine by + +doxygen1.3-rc1
+ + diff --git a/doc/html/classZE_1_1SoundData-members.html b/doc/html/classZE_1_1SoundData-members.html new file mode 100644 index 0000000..c671b86 --- /dev/null +++ b/doc/html/classZE_1_1SoundData-members.html @@ -0,0 +1,18 @@ + + +Member List + + + +
+Main Page   Namespace List   Class Hierarchy   Compound List   File List   Namespace Members   Compound Members   File Members  
+

ZE::SoundData Member List

This is the complete list of members for ZE::SoundData, including all inherited members. + + + +
filenameZE::SoundData
soundZE::SoundData
SoundData()ZE::SoundData [inline]

Generated on Wed Nov 20 01:18:05 2002 for ZEngine by + +doxygen1.3-rc1
+ + diff --git a/doc/html/classZE_1_1SoundData.html b/doc/html/classZE_1_1SoundData.html new file mode 100644 index 0000000..f389970 --- /dev/null +++ b/doc/html/classZE_1_1SoundData.html @@ -0,0 +1,63 @@ + + +ZE::SoundData class Reference + + + +
+Main Page   Namespace List   Class Hierarchy   Compound List   File List   Namespace Members   Compound Members   File Members  
+

ZE::SoundData Class Reference

#include <ZE_DataPtr.h> +

+List of all members.


Detailed Description

+Class used to keep track of loaded data and associate a Mix_Chunk with an index number and filename. +

+ + + + + + + + + + +

Public Methods

 SoundData ()
 Initialize SoundData.


Public Attributes

+Mix_Chunk * sound
 Pointer to SDL_Mixer sound effect data.

+string filename
 File sound effect was loaded from.

+


Constructor & Destructor Documentation

+

+ + + + +
+ + + + + + + + + +
ZE::SoundData::SoundData   [inline]
+
+ + + + + +
+   + + +

+Sets sound pointer to NULL

+


The documentation for this class was generated from the following file: +
Generated on Wed Nov 20 01:18:05 2002 for ZEngine by + +doxygen1.3-rc1
+ + diff --git a/doc/html/classZE_1_1ZConfigFile-members.html b/doc/html/classZE_1_1ZConfigFile-members.html new file mode 100644 index 0000000..c8cdf03 --- /dev/null +++ b/doc/html/classZE_1_1ZConfigFile-members.html @@ -0,0 +1,37 @@ + + +Member List + + + +
+Main Page   Namespace List   Class Hierarchy   Compound List   File List   Namespace Members   Compound Members   File Members  
+

ZE::ZConfigFile Member List

This is the complete list of members for ZE::ZConfigFile, including all inherited members. + + + + + + + + + + + + + + + + + + + + + + +
CleanString(string str)ZE::ZConfigFile [private]
Close()ZE::ZConfigFile
Exists(string sec) (defined in ZE::ZConfigFile)ZE::ZConfigFile [private]
Exists(string sec, string var) (defined in ZE::ZConfigFile)ZE::ZConfigFile [private]
Flush()ZE::ZConfigFile
GetBool(string section, string var, bool defVal)ZE::ZConfigFile
GetInt(string section, string var, int defVal)ZE::ZConfigFile
GetString(string section, string var, string defVal)ZE::ZConfigFile
GetVariable(string sec, string var, string defVal) (defined in ZE::ZConfigFile)ZE::ZConfigFile [private]
mFileLayoutZE::ZConfigFile [private]
mFilenameZE::ZConfigFile [private]
Process(string filename)ZE::ZConfigFile
rEngineZE::ZObject [protected]
SetBool(string section, string var, bool val)ZE::ZConfigFile
SetInt(string section, string var, int val)ZE::ZConfigFile
SetString(string section, string var, string val)ZE::ZConfigFile
SetVariable(string sec, string var, string val) (defined in ZE::ZConfigFile)ZE::ZConfigFile [private]
ZConfigFile()ZE::ZConfigFile
ZConfigFile(string filename)ZE::ZConfigFile
ZObject()ZE::ZObject [inline]
~ZConfigFile()ZE::ZConfigFile
~ZObject()ZE::ZObject [inline, virtual]

Generated on Wed Nov 20 01:18:06 2002 for ZEngine by + +doxygen1.3-rc1
+ + diff --git a/doc/html/classZE_1_1ZConfigFile.html b/doc/html/classZE_1_1ZConfigFile.html new file mode 100644 index 0000000..427e10a --- /dev/null +++ b/doc/html/classZE_1_1ZConfigFile.html @@ -0,0 +1,595 @@ + + +ZE::ZConfigFile class Reference + + + +
+Main Page   Namespace List   Class Hierarchy   Compound List   File List   Namespace Members   Compound Members   File Members  
+

ZE::ZConfigFile Class Reference

#include <ZE_ZConfigFile.h> +

+Inherits ZE::ZObject. +

+List of all members.


Detailed Description

+ZConfigFile class for INI-style configuration files for games or applications. Inherited from ZObject. +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Public Methods

 ZConfigFile ()
 Default constructor.

 ZConfigFile (string filename)
 Constructor which takes filename.

 ~ZConfigFile ()
 Destructor, flushes file.

void Process (string filename)
 Parse a file.

int GetInt (string section, string var, int defVal)
 Get value in integer format from file.

bool GetBool (string section, string var, bool defVal)
 Get value in boolean format from file.

string GetString (string section, string var, string defVal)
 Get value in string format from file.

void SetInt (string section, string var, int val)
 Set value in integer format in file.

void SetBool (string section, string var, bool val)
 Set value in boolean format in file.

void SetString (string section, string var, string val)
 Set value in string format in file.

void Flush ()
 Write all values to file.

void Close ()
 Close the file.


Private Methods

string CleanString (string str)
 Reformat a string in a form more suitable to parsing.

+bool Exists (string sec)
+bool Exists (string sec, string var)
+void SetVariable (string sec, string var, string val)
+string GetVariable (string sec, string var, string defVal)

Private Attributes

+list< ZCF_Section > mFileLayout
 List of sections of internal type.

+string mFilename
 Filename of file currently open.

+


Constructor & Destructor Documentation

+

+ + + + +
+ + + + + + + + + +
ZE::ZConfigFile::ZConfigFile  
+
+ + + + + +
+   + + +

+A no-op default constructor.

+

+ + + + +
+ + + + + + + + + + +
ZE::ZConfigFile::ZConfigFile string   filename
+
+ + + + + +
+   + + +

+Constructor takes filename, and calls process on it.

Parameters:
+ + +
filename File to load as ZConfigFile.
+
+
+

+ + + + +
+ + + + + + + + + +
ZE::ZConfigFile::~ZConfigFile  
+
+ + + + + +
+   + + +

+Flushes the file, ensures a flush if the file is left open.

+


Member Function Documentation

+

+ + + + +
+ + + + + + + + + + +
string ZE::ZConfigFile::CleanString string   str [private]
+
+ + + + + +
+   + + +

+Removes whitespace from a string and makes all characters lowercase.

Parameters:
+ + +
str The string to get a clean version of.
+
+
Returns:
Cleaned string.
+
+

+ + + + +
+ + + + + + + + + + +
void ZE::ZConfigFile::Process string   filename
+
+ + + + + +
+   + + +

+Parses the file, reading the contents into the fileLayout map.

Parameters:
+ + +
filename File to parse and attach this ZDataFile to.
+
+
+

+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + +
int ZE::ZConfigFile::GetInt string   section,
string   var,
int   defVal
+
+ + + + + +
+   + + +

+Get the current value of a variable in the file, or defVal if not found in file.

Parameters:
+ + + + +
section Name of section to seek variable under.
var Name of variable to seek value for.
defVal Value to return if var does not exist within section.
+
+
Returns:
Contents of the variable in integer format.
+
+

+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + +
bool ZE::ZConfigFile::GetBool string   section,
string   var,
bool   defVal
+
+ + + + + +
+   + + +

+Get the current value of a variable in the file, or defVal if not found in file. (Valid values are "0","1","true" and "false")

Parameters:
+ + + + +
section Name of section to seek variable under.
var Name of variable to seek value for.
defVal Value to return if var does not exist within section.
+
+
Returns:
Contents of the variable in boolean format.
+
+

+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + +
string ZE::ZConfigFile::GetString string   section,
string   var,
string   defVal
+
+ + + + + +
+   + + +

+Get the current value of a variable in the file, or defVal if not found in file.

Parameters:
+ + + + +
section Name of section to seek variable under.
var Name of variable to seek value for.
defVal Value to return if var does not exist within section.
+
+
Returns:
Contents of the variable in string format.
+
+

+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + +
void ZE::ZConfigFile::SetInt string   section,
string   var,
int   val
+
+ + + + + +
+   + + +

+Set the new value of a variable in the file to val, creating the section and variable if not already found in file.

Parameters:
+ + + + +
section Name of section to edit variable under.
var Name of variable to set value for.
val Integer value to set variable to in file.
+
+
+

+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + +
void ZE::ZConfigFile::SetBool string   section,
string   var,
bool   val
+
+ + + + + +
+   + + +

+Set the new value of a variable in the file to val, creating the section and variable if not already found in file.

Parameters:
+ + + + +
section Name of section to edit variable under.
var Name of variable to set value for.
val Boolean value to set variable to in file.
+
+
+

+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + +
void ZE::ZConfigFile::SetString string   section,
string   var,
string   val
+
+ + + + + +
+   + + +

+Set the new value of a variable in the file to val, creating the section and variable if not already found in file.

Parameters:
+ + + + +
section Name of section to edit variable under.
var Name of variable to set value for.
val String value to set variable to in file.
+
+
+

+ + + + +
+ + + + + + + + + +
void ZE::ZConfigFile::Flush  
+
+ + + + + +
+   + + +

+Writes all values and sections to file.

+

+ + + + +
+ + + + + + + + + +
void ZE::ZConfigFile::Close  
+
+ + + + + +
+   + + +

+Flush the file and clear the filename.

+


The documentation for this class was generated from the following files: +
Generated on Wed Nov 20 01:18:06 2002 for ZEngine by + +doxygen1.3-rc1
+ + diff --git a/doc/html/classZE_1_1ZEngine-members.html b/doc/html/classZE_1_1ZEngine-members.html new file mode 100644 index 0000000..3462ac3 --- /dev/null +++ b/doc/html/classZE_1_1ZEngine-members.html @@ -0,0 +1,77 @@ + + +Member List + + + +
+Main Page   Namespace List   Class Hierarchy   Compound List   File List   Namespace Members   Compound Members   File Members  
+

ZE::ZEngine Member List

This is the complete list of members for ZE::ZEngine, including all inherited members. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
CheckEvents()ZE::ZEngine
Clear(Uint32 color=0, SDL_Rect *rect=NULL)ZE::ZEngine
CloseWindow()ZE::ZEngine
CreateWindow(string title, string icon="")ZE::ZEngine
FreeFont(FontData &font)ZE::ZEngine
FreeImage(ImageData &image)ZE::ZEngine
FreeMusic(MusicData &music)ZE::ZEngine
FreeSound(SoundData &sound)ZE::ZEngine
GetBPP()ZE::ZEngine
GetDisplay()ZE::ZEngine
GetFrameTime()ZE::ZEngine
GetHeight()ZE::ZEngine
GetInstance()ZE::ZEngine [static]
GetMouseX()ZE::ZEngine
GetMouseY()ZE::ZEngine
GetTime()ZE::ZEngine
GetVersion()ZE::ZEngine [static]
GetWidth()ZE::ZEngine
HideCursor()ZE::ZEngine
IsActive()ZE::ZEngine
IsFullscreen()ZE::ZEngine
IsPaused()ZE::ZEngine
KeyIsPressed(SDLKey key)ZE::ZEngine
LButtonPressed()ZE::ZEngine
LoadFont(string filename, int size)ZE::ZEngine
LoadImage(string filename)ZE::ZEngine
LoadMusic(string filename)ZE::ZEngine
LoadSound(string filename)ZE::ZEngine
mActiveZE::ZEngine [private]
MapColor(Uint8 r, Uint8 g, Uint8 b, Uint8 a=255)ZE::ZEngine
mBPPZE::ZEngine [private]
mFullscreenZE::ZEngine [private]
mHeightZE::ZEngine [private]
mKeyPressedZE::ZEngine [private]
mLastPauseZE::ZEngine [private]
mLastTimeZE::ZEngine [private]
mMouseBZE::ZEngine [private]
mMouseXZE::ZEngine [private]
mMouseYZE::ZEngine [private]
MouseInRect(SDL_Rect *rect)ZE::ZEngine
mPausedZE::ZEngine [private]
mPausedTimeZE::ZEngine [private]
mQuitZE::ZEngine [private]
mRateZE::ZEngine [private]
mScreenZE::ZEngine [private]
mSecPerFrameZE::ZEngine [private]
mStereoZE::ZEngine [private]
mUnpauseOnActiveZE::ZEngine [private]
mWidthZE::ZEngine [private]
PauseTimer()ZE::ZEngine
QuitRequested()ZE::ZEngine
RButtonPressed()ZE::ZEngine
ReleaseInstance()ZE::ZEngine [static]
RequestQuit()ZE::ZEngine
SetupDisplay(int width, int height, int bpp, bool fullscreen)ZE::ZEngine
SetupSound(int rate, bool stereo)ZE::ZEngine
ShowCursor()ZE::ZEngine
sInstanceZE::ZEngine [private, static]
Sleep(Uint32 milliseconds)ZE::ZEngine
UnpauseTimer()ZE::ZEngine
UpdateScreen()ZE::ZEngine
ZEngine()ZE::ZEngine [private]

Generated on Wed Nov 20 01:18:06 2002 for ZEngine by + +doxygen1.3-rc1
+ + diff --git a/doc/html/classZE_1_1ZEngine.html b/doc/html/classZE_1_1ZEngine.html new file mode 100644 index 0000000..c6de3cf --- /dev/null +++ b/doc/html/classZE_1_1ZEngine.html @@ -0,0 +1,1566 @@ + + +ZE::ZEngine class Reference + + + +
+Main Page   Namespace List   Class Hierarchy   Compound List   File List   Namespace Members   Compound Members   File Members  
+

ZE::ZEngine Class Reference

#include <ZE_ZEngine.h> +

+List of all members.


Detailed Description

+ZEngine Singleton Class, accessible from anywhere in a ZEngine-based program by nature. Controls core elements of program and does majority of SDL wrapping. Also keeps track of loaded data and helps programs avoid memory leaks and dangling pointers. +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Public Methods

void SetupDisplay (int width, int height, int bpp, bool fullscreen)
 Setup Display for SDL.

void SetupSound (int rate, bool stereo)
 Initialize Sound for SDL.

void CreateWindow (string title, string icon="")
 Create Window with predefined settings.

void CloseWindow ()
 Quit SDL and any Subsystems.

SDL_Surface * GetDisplay ()
 Allow access to Screen Surface.

void UpdateScreen ()
 Update screen contents.

Uint32 MapColor (Uint8 r, Uint8 g, Uint8 b, Uint8 a=255)
 Create Color in SDL Uint32 Format.

void Clear (Uint32 color=0, SDL_Rect *rect=NULL)
 Clear screen or portion of screen to a color.

void Sleep (Uint32 milliseconds)
 Sleep for a certain amount of time.

Uint32 GetTime ()
 Get Global ZEngine time.

void PauseTimer ()
 Pause ZEngine.

void UnpauseTimer ()
 Unpause ZEngine.

double GetFrameTime ()
 Get Seconds Per Frame.

bool IsPaused ()
 Check Engine Paused State.

bool IsActive ()
 Find out if application is active.

void RequestQuit ()
 Request A Quit.

bool QuitRequested ()
 Find out if user has requested to quit.

bool KeyIsPressed (SDLKey key)
 Find the state of a key.

void HideCursor ()
 Hide mouse cursor.

void ShowCursor ()
 Show mouse cursor.

int GetMouseX ()
 Get X Position of Mouse.

int GetMouseY ()
 Get Y Position of Mouse.

bool LButtonPressed ()
 Get Status of Left Button.

bool RButtonPressed ()
 Get Status of Right Button.

bool MouseInRect (SDL_Rect *rect)
 Check if mouse is in given rectangle.

void CheckEvents ()
 Check for Activation, Window Manager, and Quit Events.

ImageData LoadImage (string filename)
 Load an Image.

void FreeImage (ImageData &image)
 Free an Image.

SoundData LoadSound (string filename)
 Load a Sound.

void FreeSound (SoundData &sound)
 Free a Sound.

MusicData LoadMusic (string filename)
 Load a Music File.

void FreeMusic (MusicData &music)
 Free a Music Sample.

FontData LoadFont (string filename, int size)
 Load a Font.

void FreeFont (FontData &font)
 Free a Font.

int GetWidth ()
 Get Current Display Width.

int GetHeight ()
 Get Current Display Height.

int GetBPP ()
 Get Current Display BPP.

bool IsFullscreen ()
 Get Fullscreen setting.


Static Public Methods

ZEngine * GetInstance ()
 Get Instance.

void ReleaseInstance ()
 Release Instance.

string GetVersion ()
 Get Current Version.


Private Methods

 ZEngine ()
 Constructor for ZEngine.


Private Attributes

+int mWidth
 Width of Display.

+int mHeight
 Height of Display.

+int mBPP
 BPP Setting of Display.

+bool mFullscreen
 Fullscreen setting of Display.

+int mRate
 Sound Bitrate.

+bool mStereo
 Stereo setting of Sound Subsystem.

+SDL_Surface * mScreen
 Pointer to Display.

+bool mPaused
 Keep track of paused state of game.

+bool mUnpauseOnActive
 Keep track of if ZEngine should unpause on active event.

+Uint32 mLastPause
 Keep track of time game was last paused.

+Uint32 mPausedTime
 Keep track of total globally paused time.

+Uint32 mLastTime
 Keep track of last screen update time.

+double mSecPerFrame
 Seconds per frame.

+bool mActive
 bool describing Active or Inactive State of Game

+bool mQuit
 bool for checking if a Quit event has been detected

+Uint8 * mKeyPressed
 Pointer to array of Keys.

+int mMouseX
 X Position of Mouse.

+int mMouseY
 Y Position of Mouse.

+Uint8 mMouseB
 Mouse Button Information.


Static Private Attributes

+ZEngine * sInstance = NULL
 Static Pointer to Instance of ZEngine for Singleton.

+


Constructor & Destructor Documentation

+

+ + + + +
+ + + + + + + + + +
ZE::ZEngine::ZEngine   [private]
+
+ + + + + +
+   + + +

+Initialize ZEngine values to defaults. (Private so that only one instance may be created.)

+


Member Function Documentation

+

+ + + + +
+ + + + + + + + + +
ZEngine * ZE::ZEngine::GetInstance   [static]
+
+ + + + + +
+   + + +

+Static function, returns pointer to instance of ZEngine, creating an instance if none exist.

Returns:
Instance to the ZEngine.
+
+

+ + + + +
+ + + + + + + + + +
void ZE::ZEngine::ReleaseInstance   [static]
+
+ + + + + +
+   + + +

+Release memory held by instance of engine and closes window.

+

+ + + + +
+ + + + + + + + + +
string ZE::ZEngine::GetVersion   [static]
+
+ + + + + +
+   + + +

+Get Version Number of ZEngine. (Major.Minor.Extension#)

Returns:
string containing version number
+
+

+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
void ZE::ZEngine::SetupDisplay int   width,
int   height,
int   bpp,
bool   fullscreen
+
+ + + + + +
+   + + +

+Sets display parameters to specified parameters. (called before CreateDisplay) +

+

Parameters:
+ + + + + +
width Desired width of screen or window.
height Desired height of screen or window.
bpp Desired BPP for screen (only works in fullscreen).
fullscreen A bool for fullscreen setting.
+
+
+

+ + + + +
+ + + + + + + + + + + + + + + + + + + +
void ZE::ZEngine::SetupSound int   rate,
bool   stereo
+
+ + + + + +
+   + + +

+Set sound settings to specified parameters. (called before CreateDisplay) +

+

Parameters:
+ + + +
rate Desired sound bitrate.
stereo A bool for stereo setting.
+
+
+

+ + + + +
+ + + + + + + + + + + + + + + + + + + +
void ZE::ZEngine::CreateWindow string   title,
string   icon = ""
+
+ + + + + +
+   + + +

+SetupDisplay and SetupSound should be called prior to this to change settings, settings from those do not go into effect until this function is called. Specify no icon file to use default OS icon. +

+

Parameters:
+ + + +
title Window Title.
icon Path to Icon File.
+
+
+

+ + + + +
+ + + + + + + + + +
void ZE::ZEngine::CloseWindow  
+
+ + + + + +
+   + + +

+Shut down SDL (and SDL_ttf,SDL_mixer if necessary).

+

+ + + + +
+ + + + + + + + + +
SDL_Surface * ZE::ZEngine::GetDisplay  
+
+ + + + + +
+   + + +

+Get pointer to screen SDL_Surface, allowing direct screen manipulation using SDL.

Returns:
Pointer to Display Surface.
+
+

+ + + + +
+ + + + + + + + + +
void ZE::ZEngine::UpdateScreen  
+
+ + + + + +
+   + + +

+Flip double buffer in SDL if double buffered, otherwise tell video to refresh entire screen.

+

+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Uint32 ZE::ZEngine::MapColor Uint8   r,
Uint8   g,
Uint8   b,
Uint8   a = 255
+
+ + + + + +
+   + + +

+Turn RGBA values into SDL Uint32 color. (Alpha value will be ignored if not in use) +

+

Parameters:
+ + + + + +
r Red component of color (0-255).
g Green component of color (0-255).
b Blue component of color (0-255).
a Alpha (translucency) component of color (0-255). [Default 255]
+
+
Returns:
Uint32 of color requested.
+
+

+ + + + +
+ + + + + + + + + + + + + + + + + + + +
void ZE::ZEngine::Clear Uint32   color = 0,
SDL_Rect *   rect = NULL
+
+ + + + + +
+   + + +

+Clears a rectangle on screen to a color.

Parameters:
+ + + +
color Color to clear surface to, defaults to black.
rect Rectangle of screen to clear or NULL for entire surface.
+
+
+

+ + + + +
+ + + + + + + + + + +
void ZE::ZEngine::Sleep Uint32   milliseconds
+
+ + + + + +
+   + + +

+Freeze everything for given number of milliseconds.

Parameters:
+ + +
milliseconds Number of milliseconds to freeze.
+
+
+

+ + + + +
+ + + + + + + + + +
Uint32 ZE::ZEngine::GetTime  
+
+ + + + + +
+   + + +

+Get active time since ZEngine initialization in milliseconds, paused time doesn't count.

Returns:
Number of active milliseconds since initialization.
+
+

+ + + + +
+ + + + + + + + + +
void ZE::ZEngine::PauseTimer  
+
+ + + + + +
+   + + +

+Pause ZEngine timer and all ZTimer objects that rely on ZEngine.

+

+ + + + +
+ + + + + + + + + +
void ZE::ZEngine::UnpauseTimer  
+
+ + + + + +
+   + + +

+Unpause ZEngine timer and all ZTimer objects that rely on ZEngine.

+

+ + + + +
+ + + + + + + + + +
double ZE::ZEngine::GetFrameTime  
+
+ + + + + +
+   + + +

+Get double that describes the time passed between screen updates. (used for Framerate Independant Movement)

Returns:
Time between screen updates.
+
+

+ + + + +
+ + + + + + + + + +
bool ZE::ZEngine::IsPaused  
+
+ + + + + +
+   + + +

+Find out if engine timer is paused.

Returns:
Paused State of engine.
+
+

+ + + + +
+ + + + + + + + + +
bool ZE::ZEngine::IsActive  
+
+ + + + + +
+   + + +

+Function to find out if application currently has focus.

Returns:
bool telling active/inactive state of application.
+
+

+ + + + +
+ + + + + + + + + +
void ZE::ZEngine::RequestQuit  
+
+ + + + + +
+   + + +

+Tell the engine that it should behave as if a Quit was requested, does not call any shutdown functions.

+

+ + + + +
+ + + + + + + + + +
bool ZE::ZEngine::QuitRequested  
+
+ + + + + +
+   + + +

+Function to find out if user or operating system has requested program cease execution, can be set by Alt-F4, SDL_Quit event or ZEngine::RequestQuit().

Returns:
bool telling if quit has been requested.
+
+

+ + + + +
+ + + + + + + + + + +
bool ZE::ZEngine::KeyIsPressed SDLKey   key
+
+ + + + + +
+   + + +

+Function returns true/false based on if key is pressed or not.

Parameters:
+ + +
key code of key to find status of.
+
+
Returns:
bool state of requested key.
+
+

+ + + + +
+ + + + + + + + + +
void ZE::ZEngine::HideCursor  
+
+ + + + + +
+   + + +

+Hide the system mouse cursor.

+

+ + + + +
+ + + + + + + + + +
void ZE::ZEngine::ShowCursor  
+
+ + + + + +
+   + + +

+Show the system mouse cursor.

+

+ + + + +
+ + + + + + + + + +
int ZE::ZEngine::GetMouseX  
+
+ + + + + +
+   + + +

+Find X Position of Mouse on screen.

Returns:
X Position of Mouse.
+
+

+ + + + +
+ + + + + + + + + +
int ZE::ZEngine::GetMouseY  
+
+ + + + + +
+   + + +

+Find Y Position of Mouse on screen.

Returns:
Y Position of Mouse.
+
+

+ + + + +
+ + + + + + + + + +
bool ZE::ZEngine::LButtonPressed  
+
+ + + + + +
+   + + +

+Get pressed status of left button of mouse.

Returns:
true if left button is pressed, false otherwise.
+
+

+ + + + +
+ + + + + + + + + +
bool ZE::ZEngine::RButtonPressed  
+
+ + + + + +
+   + + +

+Get pressed status of right button of mouse.

Returns:
true if right button is pressed, false otherwise.
+
+

+ + + + +
+ + + + + + + + + + +
bool ZE::ZEngine::MouseInRect SDL_Rect *   rect
+
+ + + + + +
+   + + +

+Return status of mouse in current rectangle (used for buttons)

Parameters:
+ + +
rect Rectangle to check if mouse is in.
+
+
Returns:
true if mouse is in rectangle, false otherwise
+
+

+ + + + +
+ + + + + + + + + +
void ZE::ZEngine::CheckEvents  
+
+ + + + + +
+   + + +

+Cycle through event queue, processing events, updating all Event Related variables, should be called once per frame.

+

+ + + + +
+ + + + + + + + + + +
ImageData ZE::ZEngine::LoadImage string   filename
+
+ + + + + +
+   + + +

+Loads an Image to an ImageData class which keeps vital information on the Image.

Parameters:
+ + +
filename path to file to load.
+
+
Returns:
A ImageData class containing filename and pointer to data.
+
+

+ + + + +
+ + + + + + + + + + +
void ZE::ZEngine::FreeImage ImageData  image
+
+ + + + + +
+   + + +

+Free memory of an Image in an ImageData class.

Parameters:
+ + +
image ImageData structure of image to free.
+
+
+

+ + + + +
+ + + + + + + + + + +
SoundData ZE::ZEngine::LoadSound string   filename
+
+ + + + + +
+   + + +

+Loads a Sound to a SoundData class which keeps vital information on the Sound

Parameters:
+ + +
filename path to file to load.
+
+
Returns:
A SoundData class containing filename and pointer to data.
+
+

+ + + + +
+ + + + + + + + + + +
void ZE::ZEngine::FreeSound SoundData  sound
+
+ + + + + +
+   + + +

+Free memory of a Sound in a SoundData class.

Parameters:
+ + +
sound SoundData structure of sound to free.
+
+
+

+ + + + +
+ + + + + + + + + + +
MusicData ZE::ZEngine::LoadMusic string   filename
+
+ + + + + +
+   + + +

+Loads a Music Clip to a MusicData class which keeps vital information on the Music Data

Parameters:
+ + +
filename path to file to load.
+
+
Returns:
A MusicData class containing filename and pointer to data.
+
+

+ + + + +
+ + + + + + + + + + +
void ZE::ZEngine::FreeMusic MusicData  music
+
+ + + + + +
+   + + +

+Free memory of Music in a MusicData class.

Parameters:
+ + +
music MusicData structure of music to free.
+
+
+

+ + + + +
+ + + + + + + + + + + + + + + + + + + +
FontData ZE::ZEngine::LoadFont string   filename,
int   size
+
+ + + + + +
+   + + +

+Loads a Font to a FontData class which keeps vital information on the Font

Parameters:
+ + + +
filename path to file to load.
size point size of font
+
+
Returns:
A FontData class containing filename and pointer to data.
+
+

+ + + + +
+ + + + + + + + + + +
void ZE::ZEngine::FreeFont FontData  font
+
+ + + + + +
+   + + +

+Free memory of a Font in a FontData class.

Parameters:
+ + +
font FontData structure of font to free.
+
+
+

+ + + + +
+ + + + + + + + + +
int ZE::ZEngine::GetWidth  
+
+ + + + + +
+   + + +

+Get Width of Window or Fullscreen mode.

Returns:
Width of Display.
+
+

+ + + + +
+ + + + + + + + + +
int ZE::ZEngine::GetHeight  
+
+ + + + + +
+   + + +

+Get Height of Window or Fullscreen mode.

Returns:
Height of Display.
+
+

+ + + + +
+ + + + + + + + + +
int ZE::ZEngine::GetBPP  
+
+ + + + + +
+   + + +

+Get BPP of Window or Fullscreen mode.

Returns:
BPP of Display.
+
+

+ + + + +
+ + + + + + + + + +
bool ZE::ZEngine::IsFullscreen  
+
+ + + + + +
+   + + +

+Get Fullscreen setting of Display.

Returns:
True if Fullscreen, False if Windowed
+
+


The documentation for this class was generated from the following files: +
Generated on Wed Nov 20 01:18:06 2002 for ZEngine by + +doxygen1.3-rc1
+ + diff --git a/doc/html/classZE_1_1ZFont-members.html b/doc/html/classZE_1_1ZFont-members.html new file mode 100644 index 0000000..b45e5f0 --- /dev/null +++ b/doc/html/classZE_1_1ZFont-members.html @@ -0,0 +1,40 @@ + + +Member List + + + +
+Main Page   Namespace List   Class Hierarchy   Compound List   File List   Namespace Members   Compound Members   File Members  
+

ZE::ZFont Member List

This is the complete list of members for ZE::ZFont, including all inherited members. + + + + + + + + + + + + + + + + + + + + + + + + + +
DrawShadedText(string text, ZImage &image)ZE::ZFont
DrawText(string text, ZImage &image)ZE::ZFont
GetHeight()ZE::ZFont
GetLineSkip()ZE::ZFont
GetStringHeight(string text)ZE::ZFont
GetStringWidth(string text)ZE::ZFont
IsBold()ZE::ZFont
IsItalic()ZE::ZFont
IsLoaded()ZE::ZFont
IsUnderlined()ZE::ZFont
Open(string filename, int size)ZE::ZFont
rBGColorZE::ZFont [protected]
rColorZE::ZFont [protected]
Release()ZE::ZFont
rEngineZE::ZObject [protected]
Resize(int size)ZE::ZFont
rFontZE::ZFont [protected]
SetBGColor(Uint8 r, Uint8 g, Uint8 b)ZE::ZFont
SetColor(Uint8 r, Uint8 g, Uint8 b)ZE::ZFont
SetStyle(bool bold, bool italic, bool underline)ZE::ZFont
ZFont()ZE::ZFont
ZFont(string filename, int size)ZE::ZFont
ZObject()ZE::ZObject [inline]
~ZFont()ZE::ZFont
~ZObject()ZE::ZObject [inline, virtual]

Generated on Wed Nov 20 01:18:06 2002 for ZEngine by + +doxygen1.3-rc1
+ + diff --git a/doc/html/classZE_1_1ZFont.html b/doc/html/classZE_1_1ZFont.html new file mode 100644 index 0000000..083fab0 --- /dev/null +++ b/doc/html/classZE_1_1ZFont.html @@ -0,0 +1,768 @@ + + +ZE::ZFont class Reference + + + +
+Main Page   Namespace List   Class Hierarchy   Compound List   File List   Namespace Members   Compound Members   File Members  
+

ZE::ZFont Class Reference

#include <ZE_ZFont.h> +

+Inherits ZE::ZObject. +

+List of all members.


Detailed Description

+ZFont font container class, class wraps common features of SDL_TTF. Inherited from ZObject. +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Public Methods

 ZFont ()
 Default Constructor.

 ZFont (string filename, int size)
 Constructor that opens a font with a certain size.

 ~ZFont ()
 Destructor, frees memory.

void Open (string filename, int size)
 Opens a font with a certain size.

void Release ()
 Release font.

void DrawText (string text, ZImage &image)
 Draws a string in a color to a ZImage.

void DrawShadedText (string text, ZImage &image)
 Draws a string with a colored background to a ZImage.

void SetColor (Uint8 r, Uint8 g, Uint8 b)
 Set Text rColor.

void SetBGColor (Uint8 r, Uint8 g, Uint8 b)
 Set Background rColor.

void SetStyle (bool bold, bool italic, bool underline)
 Set display format.

void Resize (int size)
 Resize Font.

bool IsLoaded ()
 Check if file is loaded.

bool IsBold ()
 Get Bold Setting.

bool IsItalic ()
 Get Italic Setting.

bool IsUnderlined ()
 Get Underlined Setting.

int GetHeight ()
 Get Height of Font.

int GetLineSkip ()
 Get Line Skip for Font.

int GetStringWidth (string text)
 Get String Width.

int GetStringHeight (string text)
 Get String Height.


Protected Attributes

+FontData rFont
 Class containing font and filename.

+SDL_Color rColor
 SDL_Color for current text color.

+SDL_Color rBGColor
 SDL_Color for background color to be used in shaded draws.

+


Constructor & Destructor Documentation

+

+ + + + +
+ + + + + + + + + +
ZE::ZFont::ZFont  
+
+ + + + + +
+   + + +

+Default Constructor, does nothing.

+

+ + + + +
+ + + + + + + + + + + + + + + + + + + +
ZE::ZFont::ZFont string   filename,
int   size
+
+ + + + + +
+   + + +

+Constructor simply calls ZFont::Open() with same parameters.

Parameters:
+ + + +
filename Font to open.
size Size to use for font.
+
+
+

+ + + + +
+ + + + + + + + + +
ZE::ZFont::~ZFont  
+
+ + + + + +
+   + + +

+Destructor calls ZFont::Release().

+


Member Function Documentation

+

+ + + + +
+ + + + + + + + + + + + + + + + + + + +
void ZE::ZFont::Open string   filename,
int   size
+
+ + + + + +
+   + + +

+Opens a font given a filename and a point size.

Parameters:
+ + + +
filename Font to open.
size Size to use for font.
+
+
+

+ + + + +
+ + + + + + + + + +
void ZE::ZFont::Release  
+
+ + + + + +
+   + + +

+Release memory held by font.

+

+ + + + +
+ + + + + + + + + + + + + + + + + + + +
void ZE::ZFont::DrawText string   text,
ZImage  image
+
+ + + + + +
+   + + +

+Draw to a surface in specified color and associate that surface with a ZImage.

Parameters:
+ + + +
text String to write.
image ZImage to draw to.
+
+
+

+ + + + +
+ + + + + + + + + + + + + + + + + + + +
void ZE::ZFont::DrawShadedText string   text,
ZImage  image
+
+ + + + + +
+   + + +

+Draw to a surface a string with a background of rBGColor and lettering in the normal color and associate that surface with a ZImage.

Parameters:
+ + + +
text String to write.
image ZImage to draw to.
+
+
+

+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + +
void ZE::ZFont::SetColor Uint8   r,
Uint8   g,
Uint8   b
+
+ + + + + +
+   + + +

+Set rColor of Text Output.

Parameters:
+ + + + +
r Red component of color (0-255).
g Green component of color (0-255).
b Blue component of color (0-255).
+
+
+

+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + +
void ZE::ZFont::SetBGColor Uint8   r,
Uint8   g,
Uint8   b
+
+ + + + + +
+   + + +

+Set rColor of Background for Shaded Draw.

Parameters:
+ + + + +
r Red component of color (0-255).
g Green component of color (0-255).
b Blue component of color (0-255).
+
+
+

+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + +
void ZE::ZFont::SetStyle bool   bold,
bool   italic,
bool   underline
+
+ + + + + +
+   + + +

+Set display format (bold, italic, underline).

Parameters:
+ + + + +
bold Decides bold setting of font.
italic Decides italic setting of font.
underline Decides underline setting of font.
+
+
+

+ + + + +
+ + + + + + + + + + +
void ZE::ZFont::Resize int   size
+
+ + + + + +
+   + + +

+Release and Reopen font in new size.

Parameters:
+ + +
size New size for font.
+
+
+

+ + + + +
+ + + + + + + + + +
bool ZE::ZFont::IsLoaded  
+
+ + + + + +
+   + + +

+Check if file is loaded and pointer to data is non-NULL.

Returns:
Loaded or Unloaded state of data.
+
+

+ + + + +
+ + + + + + + + + +
bool ZE::ZFont::IsBold  
+
+ + + + + +
+   + + +

+Check if font output is currently bold.

Returns:
True or False state of bold.
+
+

+ + + + +
+ + + + + + + + + +
bool ZE::ZFont::IsItalic  
+
+ + + + + +
+   + + +

+Check if font output is currently italic.

Returns:
True or False state of italic.
+
+

+ + + + +
+ + + + + + + + + +
bool ZE::ZFont::IsUnderlined  
+
+ + + + + +
+   + + +

+Check if font output is currently underline.

Returns:
True or False state of underline.
+
+

+ + + + +
+ + + + + + + + + +
int ZE::ZFont::GetHeight  
+
+ + + + + +
+   + + +

+Check font height as reported by SDL_ttf.

Returns:
Height of font.
+
+

+ + + + +
+ + + + + + + + + +
int ZE::ZFont::GetLineSkip  
+
+ + + + + +
+   + + +

+Check font line skip as reported by SDL_ttf.

Returns:
Recommended Line Skip of font.
+
+

+ + + + +
+ + + + + + + + + + +
int ZE::ZFont::GetStringWidth string   text
+
+ + + + + +
+   + + +

+Get Width of String in Current Font in Pixels.

Parameters:
+ + +
text String to get width of.
+
+
Returns:
Width of String in Current font.
+
+

+ + + + +
+ + + + + + + + + + +
int ZE::ZFont::GetStringHeight string   text
+
+ + + + + +
+   + + +

+Get Height of String in Current Font in Pixels.

Parameters:
+ + +
text String to get height of.
+
+
Returns:
Height of String in Current font.
+
+


The documentation for this class was generated from the following file: +
Generated on Wed Nov 20 01:18:06 2002 for ZEngine by + +doxygen1.3-rc1
+ + diff --git a/doc/html/classZE_1_1ZImage-members.html b/doc/html/classZE_1_1ZImage-members.html new file mode 100644 index 0000000..393fafa --- /dev/null +++ b/doc/html/classZE_1_1ZImage-members.html @@ -0,0 +1,36 @@ + + +Member List + + + +
+Main Page   Namespace List   Class Hierarchy   Compound List   File List   Namespace Members   Compound Members   File Members  
+

ZE::ZImage Member List

This is the complete list of members for ZE::ZImage, including all inherited members. + + + + + + + + + + + + + + + + + + + + + +
Attach(SDL_Surface *surface)ZE::ZImage
Draw(Sint16 x, Sint16 y)ZE::ZImage
GetFilename()ZE::ZImage
GetHeight()ZE::ZImage
GetImage()ZE::ZImage
GetWidth()ZE::ZImage
IsLoaded()ZE::ZImage
Open(string filename)ZE::ZImage
OpenFromImage(SDL_Surface *img, Sint16 x, Sint16 y, Sint16 w, Sint16 h)ZE::ZImage
Release()ZE::ZImage
rEngineZE::ZObject [protected]
rImageZE::ZImage [protected]
SetAlpha(Uint8 alpha)ZE::ZImage
SetColorKey(Uint32 color)ZE::ZImage
ZImage()ZE::ZImage
ZImage(string filename)ZE::ZImage
ZImage(SDL_Surface *surface)ZE::ZImage
ZImage(SDL_Surface *img, Sint16 x, Sint16 y, Sint16 w, Sint16 h)ZE::ZImage
ZObject()ZE::ZObject [inline]
~ZImage()ZE::ZImage
~ZObject()ZE::ZObject [inline, virtual]

Generated on Wed Nov 20 01:18:06 2002 for ZEngine by + +doxygen1.3-rc1
+ + diff --git a/doc/html/classZE_1_1ZImage.html b/doc/html/classZE_1_1ZImage.html new file mode 100644 index 0000000..f0f44db --- /dev/null +++ b/doc/html/classZE_1_1ZImage.html @@ -0,0 +1,678 @@ + + +ZE::ZImage class Reference + + + +
+Main Page   Namespace List   Class Hierarchy   Compound List   File List   Namespace Members   Compound Members   File Members  
+

ZE::ZImage Class Reference

#include <ZE_ZImage.h> +

+Inherits ZE::ZObject. +

+List of all members.


Detailed Description

+ZImage image drawing class, class wraps common features of SDL_Surface. Inherited from ZObject. +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Public Methods

 ZImage ()
 Default Constructor.

 ZImage (string filename)
 Constructor to Construct from File.

 ZImage (SDL_Surface *surface)
 Constructor to Construct from SDL_Surface*.

 ZImage (SDL_Surface *img, Sint16 x, Sint16 y, Sint16 w, Sint16 h)
 Constructor to Construct from part of an SDL_Surface*.

 ~ZImage ()
 Destructor, frees memory.

void Open (string filename)
 Opens a file.

void OpenFromImage (SDL_Surface *img, Sint16 x, Sint16 y, Sint16 w, Sint16 h)
 Cuts part of an existing image to create the new image.

void Attach (SDL_Surface *surface)
 Attach an existing surface to class.

void Release ()
 Releases image.

void SetAlpha (Uint8 alpha)
 Sets Alpha (transparency) value of Image.

void SetColorKey (Uint32 color)
 Set Color Key (transparent color) of Image.

void Draw (Sint16 x, Sint16 y)
 Draw Image to Screen.

bool IsLoaded ()
 Check if file is loaded.

SDL_Surface * GetImage ()
 Get SDL_Surface. Get SDL_Surface pointer to actual image data.

int GetWidth ()
 Get Width.

int GetHeight ()
 Get Height.

string GetFilename ()
 Get filename of image.


Protected Attributes

+ImageData rImage
 Class containing image and filename.

+


Constructor & Destructor Documentation

+

+ + + + +
+ + + + + + + + + +
ZE::ZImage::ZImage  
+
+ + + + + +
+   + + +

+Default Constructor, does nothing.

+

+ + + + +
+ + + + + + + + + + +
ZE::ZImage::ZImage string   filename
+
+ + + + + +
+   + + +

+Constructor is same as calling ZImage::Open() on passed filename.

Parameters:
+ + +
filename File to open as rImage.
+
+
+

+ + + + +
+ + + + + + + + + + +
ZE::ZImage::ZImage SDL_Surface *   surface
+
+ + + + + +
+   + + +

+Constructor is same as calling ZImage::Attach() on passed SDL_Surface*.

Parameters:
+ + +
surface SDL_Surface* to use as rImage.
+
+
+

+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ZE::ZImage::ZImage SDL_Surface *   img,
Sint16   x,
Sint16   y,
Sint16   w,
Sint16   h
+
+ + + + + +
+   + + +

+Constructor is same as calling ZImage::OpenFromImage. +

+

Parameters:
+ + + + + + +
img Image to take new image from.
x X Coordinate in source of top left corner.
y Y Coordinate in source of top left corner.
w Width of new image.
h Height of new image.
+
+
+

+ + + + +
+ + + + + + + + + +
ZE::ZImage::~ZImage  
+
+ + + + + +
+   + + +

+Destructor calls ZImage::Release().

+


Member Function Documentation

+

+ + + + +
+ + + + + + + + + + +
void ZE::ZImage::Open string   filename
+
+ + + + + +
+   + + +

+Open a file using ZEngine. Loads into rImage member of class.

Parameters:
+ + +
filename File to open as rImage.
+
+
+

+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
void ZE::ZImage::OpenFromImage SDL_Surface *   img,
Sint16   x,
Sint16   y,
Sint16   w,
Sint16   h
+
+ + + + + +
+   + + +

+Cut part of an SDL_Surface to create a new Image. +

+

Parameters:
+ + + + + + +
img Image to take new image from.
x X Coordinate in source of top left corner.
y Y Coordinate in source of top left corner.
w Width of new image.
h Height of new image.
+
+
+

+ + + + +
+ + + + + + + + + + +
void ZE::ZImage::Attach SDL_Surface *   surface
+
+ + + + + +
+   + + +

+Attach a pointer to instance of ZImage. (NOTE: Should not be used on a surface that is owned elsewhere.)

Parameters:
+ + +
surface SDL_Surface* to use as rImage.
+
+
+

+ + + + +
+ + + + + + + + + +
void ZE::ZImage::Release  
+
+ + + + + +
+   + + +

+Frees memory via call to SDL_FreeSurface for the image.

+

+ + + + +
+ + + + + + + + + + +
void ZE::ZImage::SetAlpha Uint8   alpha
+
+ + + + + +
+   + + +

+Set Alpha channel of an Image, only used in 32 bit mode.

Parameters:
+ + +
alpha Number 0-255 describing translucency of image. (0 = transparent, 255 = opaque)
+
+
+

+ + + + +
+ + + + + + + + + + +
void ZE::ZImage::SetColorKey Uint32   color
+
+ + + + + +
+   + + +

+Set color which will not be drawn in image.

Parameters:
+ + +
color Uint32 color describing color to use as transparent.
+
+
+

+ + + + +
+ + + + + + + + + + + + + + + + + + + +
void ZE::ZImage::Draw Sint16   x,
Sint16   y
+
+ + + + + +
+   + + +

+Draw Image to screen at specified location.

Parameters:
+ + + +
x X coord to draw Image to.
y Y coord to draw Image to.
+
+
+

+ + + + +
+ + + + + + + + + +
bool ZE::ZImage::IsLoaded  
+
+ + + + + +
+   + + +

+Check if file is loaded and pointer to data is non-NULL.

Returns:
Loaded or Unloaded state of data.
+
+

+ + + + +
+ + + + + + + + + +
SDL_Surface * ZE::ZImage::GetImage  
+
+ + + + + +
+   + + +

+

Returns:
SDL_Surface* of rImage.
+
+

+ + + + +
+ + + + + + + + + +
int ZE::ZImage::GetWidth  
+
+ + + + + +
+   + + +

+Get Width of Image.

Returns:
Image Width.
+
+

+ + + + +
+ + + + + + + + + +
int ZE::ZImage::GetHeight  
+
+ + + + + +
+   + + +

+Get Height of Image.

Returns:
Image Height.
+
+

+ + + + +
+ + + + + + + + + +
string ZE::ZImage::GetFilename  
+
+ + + + + +
+   + + +

+Get filename of image or if Image doesn't have a specific filename string describing origin of image.

Returns:
Image Filename.
+
+


The documentation for this class was generated from the following files: +
Generated on Wed Nov 20 01:18:06 2002 for ZEngine by + +doxygen1.3-rc1
+ + diff --git a/doc/html/classZE_1_1ZMusic-members.html b/doc/html/classZE_1_1ZMusic-members.html new file mode 100644 index 0000000..752e0fb --- /dev/null +++ b/doc/html/classZE_1_1ZMusic-members.html @@ -0,0 +1,35 @@ + + +Member List + + + +
+Main Page   Namespace List   Class Hierarchy   Compound List   File List   Namespace Members   Compound Members   File Members  
+

ZE::ZMusic Member List

This is the complete list of members for ZE::ZMusic, including all inherited members. + + + + + + + + + + + + + + + + + + + + +
GetVolume()ZE::ZMusic
IsLoaded()ZE::ZMusic
IsPaused()ZE::ZMusic
IsPlaying()ZE::ZMusic
LoopInfiniteZE::ZMusic [static]
Open(string filename)ZE::ZMusic
Pause()ZE::ZMusic
Play(int loopNum=0, int fadeTime=0)ZE::ZMusic
Release()ZE::ZMusic
rEngineZE::ZObject [protected]
Rewind()ZE::ZMusic
rMusicZE::ZMusic [protected]
SetVolume(int volume)ZE::ZMusic
Stop(int fadeTime=0)ZE::ZMusic
Unpause()ZE::ZMusic
ZMusic()ZE::ZMusic
ZMusic(string filename)ZE::ZMusic
ZObject()ZE::ZObject [inline]
~ZMusic()ZE::ZMusic
~ZObject()ZE::ZObject [inline, virtual]

Generated on Wed Nov 20 01:18:06 2002 for ZEngine by + +doxygen1.3-rc1
+ + diff --git a/doc/html/classZE_1_1ZMusic.html b/doc/html/classZE_1_1ZMusic.html new file mode 100644 index 0000000..df80789 --- /dev/null +++ b/doc/html/classZE_1_1ZMusic.html @@ -0,0 +1,531 @@ + + +ZE::ZMusic class Reference + + + +
+Main Page   Namespace List   Class Hierarchy   Compound List   File List   Namespace Members   Compound Members   File Members  
+

ZE::ZMusic Class Reference

#include <ZE_ZMusic.h> +

+Inherits ZE::ZObject. +

+List of all members.


Detailed Description

+ZMusic music class, class wraps common features for SDL_Mixer's Mix_Music. Inherited from ZObject. +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Public Methods

 ZMusic ()
 Default Constructor.

 ZMusic (string filename)
 Constructor that opens a music file.

 ~ZMusic ()
 Destructor, frees memory.

void Open (string filename)
 Opens a music file.

void Release ()
 Release music.

void Play (int loopNum=0, int fadeTime=0)
 Play currently loaded music.

void Pause ()
 Pause music.

void Unpause ()
 Unpause music.

void Rewind ()
 Rewind music.

void Stop (int fadeTime=0)
 Stop music.

void SetVolume (int volume)
 Change Volume.

bool IsLoaded ()
 Check if file is loaded.

bool IsPlaying ()
 Check if music is Playing.

bool IsPaused ()
 Check if music is Paused.

int GetVolume ()
 Find Current Volume of Music.


Static Public Attributes

+const int LoopInfinite
 Static Variable For Infinite loop of sound. (Defined as -1).


Protected Attributes

+MusicData rMusic
 Class containing music data and music filename.

+


Constructor & Destructor Documentation

+

+ + + + +
+ + + + + + + + + +
ZE::ZMusic::ZMusic  
+
+ + + + + +
+   + + +

+Default Constructor, does nothing.

+

+ + + + +
+ + + + + + + + + + +
ZE::ZMusic::ZMusic string   filename
+
+ + + + + +
+   + + +

+Constructor simply calls ZMusic::Open() with same filename. (WAV,MOD,MID,OGG)

Parameters:
+ + +
filename Music to open.
+
+
+

+ + + + +
+ + + + + + + + + +
ZE::ZMusic::~ZMusic  
+
+ + + + + +
+   + + +

+Destructor calls ZMusic::Release().

+


Member Function Documentation

+

+ + + + +
+ + + + + + + + + + +
void ZE::ZMusic::Open string   filename
+
+ + + + + +
+   + + +

+Open a music file to be used.

Parameters:
+ + +
filename Music to open.
+
+
+

+ + + + +
+ + + + + + + + + +
void ZE::ZMusic::Release  
+
+ + + + + +
+   + + +

+Release memory held by music data.

+

+ + + + +
+ + + + + + + + + + + + + + + + + + + +
void ZE::ZMusic::Play int   loopNum = 0,
int   fadeTime = 0
+
+ + + + + +
+   + + +

+Play music currently loaded in ZMusic, looping loopNum times. (use ZMusic::LoopInfinite to loop forever.) If fade is not zero (which it defaults to) music will fade in over specified number of milliseconds.

Parameters:
+ + + +
loopNum Number of times to loop song, defaults to zero.
fadeTime Milliseconds to fade to full volume, defaults to zero for no fade.
+
+
+

+ + + + +
+ + + + + + + + + +
void ZE::ZMusic::Pause  
+
+ + + + + +
+   + + +

+Pause currently playing music.

+

+ + + + +
+ + + + + + + + + +
void ZE::ZMusic::Unpause  
+
+ + + + + +
+   + + +

+Unpause currently paused music.

+

+ + + + +
+ + + + + + + + + +
void ZE::ZMusic::Rewind  
+
+ + + + + +
+   + + +

+Rewind music to beginning.

+

+ + + + +
+ + + + + + + + + + +
void ZE::ZMusic::Stop int   fadeTime = 0
+
+ + + + + +
+   + + +

+Stop currently playing music, if fadeTime is not zero, fade out over specified time.

Parameters:
+ + +
fadeTime Milliseconds to fade out over, defaults to zero for immediate stop.
+
+
+

+ + + + +
+ + + + + + + + + + +
void ZE::ZMusic::SetVolume int   volume
+
+ + + + + +
+   + + +

+Change volume of currently playing music.

Parameters:
+ + +
volume Volume to change to, can be in a range from 0 to 128
+
+
+

+ + + + +
+ + + + + + + + + +
bool ZE::ZMusic::IsLoaded  
+
+ + + + + +
+   + + +

+Check if file is loaded and pointer to data is non-NULL.

Returns:
Loaded or Unloaded state of data.
+
+

+ + + + +
+ + + + + + + + + +
bool ZE::ZMusic::IsPlaying  
+
+ + + + + +
+   + + +

+Check if music is playing, specifically if it is not stopped. (Paused state should be checked for by IsPaused)

Returns:
Playing / Not Playing State of Music.
+
+

+ + + + +
+ + + + + + + + + +
bool ZE::ZMusic::IsPaused  
+
+ + + + + +
+   + + +

+Check if music is "playing" but currently paused.

Returns:
Paused / Not Paused State of Music.
+
+

+ + + + +
+ + + + + + + + + +
int ZE::ZMusic::GetVolume  
+
+ + + + + +
+   + + +

+Get current volume of music represented as a value from 0-128.

Returns:
Volume of music, 0-128.
+
+


The documentation for this class was generated from the following file: +
Generated on Wed Nov 20 01:18:06 2002 for ZEngine by + +doxygen1.3-rc1
+ + diff --git a/doc/html/classZE_1_1ZObject-members.html b/doc/html/classZE_1_1ZObject-members.html new file mode 100644 index 0000000..a10b432 --- /dev/null +++ b/doc/html/classZE_1_1ZObject-members.html @@ -0,0 +1,18 @@ + + +Member List + + + +
+Main Page   Namespace List   Class Hierarchy   Compound List   File List   Namespace Members   Compound Members   File Members  
+

ZE::ZObject Member List

This is the complete list of members for ZE::ZObject, including all inherited members. + + + +
rEngineZE::ZObject [protected]
ZObject()ZE::ZObject [inline]
~ZObject()ZE::ZObject [inline, virtual]

Generated on Wed Nov 20 01:18:06 2002 for ZEngine by + +doxygen1.3-rc1
+ + diff --git a/doc/html/classZE_1_1ZObject.html b/doc/html/classZE_1_1ZObject.html new file mode 100644 index 0000000..848fc69 --- /dev/null +++ b/doc/html/classZE_1_1ZObject.html @@ -0,0 +1,92 @@ + + +ZE::ZObject class Reference + + + +
+Main Page   Namespace List   Class Hierarchy   Compound List   File List   Namespace Members   Compound Members   File Members  
+

ZE::ZObject Class Reference

#include <ZE_ZObject.h> +

+Inherited by ZE::ZConfigFile, ZE::ZFont, ZE::ZImage, ZE::ZMusic, ZE::ZSound, and ZE::ZTimer. +

+List of all members.


Detailed Description

+This is the base class from which all ZEngine internal objects are derived from. +

+ + + + + + + + + + +

Public Methods

 ZObject ()
 ZEngine Constructor.

virtual ~ZObject ()
 ZEngine Virtual destructor.


Protected Attributes

+ZEnginerEngine
 Pointer to ZEngine Object.

+


Constructor & Destructor Documentation

+

+ + + + +
+ + + + + + + + + +
ZE::ZObject::ZObject   [inline]
+
+ + + + + +
+   + + +

+ZEngine Constructor, gets Engine pointer for Object.

+

+ + + + +
+ + + + + + + + + +
virtual ZE::ZObject::~ZObject   [inline, virtual]
+
+ + + + + +
+   + + +

+ZEngine destructor, provided to make class safely inheritable.

+


The documentation for this class was generated from the following file: +
Generated on Wed Nov 20 01:18:06 2002 for ZEngine by + +doxygen1.3-rc1
+ + diff --git a/doc/html/classZE_1_1ZRect-members.html b/doc/html/classZE_1_1ZRect-members.html new file mode 100644 index 0000000..1e9c938 --- /dev/null +++ b/doc/html/classZE_1_1ZRect-members.html @@ -0,0 +1,41 @@ + + +Member List + + + +
+Main Page   Namespace List   Class Hierarchy   Compound List   File List   Namespace Members   Compound Members   File Members  
+

ZE::ZRect Member List

This is the complete list of members for ZE::ZRect, including all inherited members. + + + + + + + + + + + + + + + + + + + + + + + + + + +
Bottom() constZE::ZRect
Contains(int x, int y) constZE::ZRect
Contains(const ZRect &rect) constZE::ZRect
Height() constZE::ZRect
Intersection(const ZRect &rect) constZE::ZRect
Intersects(const ZRect &rect) constZE::ZRect
Left() constZE::ZRect
mHeightZE::ZRect [private]
Move(int x, int y)ZE::ZRect
MoveRel(int xMove, int yMove)ZE::ZRect
mWidthZE::ZRect [private]
mXZE::ZRect [private]
mYZE::ZRect [private]
operator<(const ZRect &rhs) constZE::ZRect
operator=(const ZRect &rhs)ZE::ZRect
Resize(int width, int height)ZE::ZRect
ResizeRel(int widthChange, int heightChange)ZE::ZRect
Right() constZE::ZRect
SDLrect() constZE::ZRect
Top() constZE::ZRect
Width() constZE::ZRect
X() constZE::ZRect
Y() constZE::ZRect
ZRect()ZE::ZRect
ZRect(int x, int y, int width, int height)ZE::ZRect
ZRect(const ZRect &rhs)ZE::ZRect

Generated on Wed Nov 20 01:18:06 2002 for ZEngine by + +doxygen1.3-rc1
+ + diff --git a/doc/html/classZE_1_1ZRect.html b/doc/html/classZE_1_1ZRect.html new file mode 100644 index 0000000..d3baaed --- /dev/null +++ b/doc/html/classZE_1_1ZRect.html @@ -0,0 +1,861 @@ + + +ZE::ZRect class Reference + + + +
+Main Page   Namespace List   Class Hierarchy   Compound List   File List   Namespace Members   Compound Members   File Members  
+

ZE::ZRect Class Reference

#include <ZE_ZRect.h> +

+List of all members.


Detailed Description

+ZRect Rectangle class, used to define a rectangular area or perform operations on the defined area. +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Public Methods

 ZRect ()
 Default constructor for ZRect.

 ZRect (int x, int y, int width, int height)
 Constructor for ZRect that takes inital values.

 ZRect (const ZRect &rhs)
 Copy constructor for ZRect.

const ZRect & operator= (const ZRect &rhs)
 Overload for = operator with ZRect.

bool operator< (const ZRect &rhs) const
 Overload for < operator with ZRect, based upon location then size.

void Move (int x, int y)
 Changes the location of the rectangle.

void MoveRel (int xMove, int yMove)
 Changes the location of the rectangle based upon the current location.

void Resize (int width, int height)
 Resize rectangle.

void ResizeRel (int widthChange, int heightChange)
 Grows or shrinks current rectangle.

bool Intersects (const ZRect &rect) const
 Check if one ZRect intersects another.

bool Contains (int x, int y) const
 Check if a rectangle contains a given point.

bool Contains (const ZRect &rect) const
 Check if a rectangle contains a given point.

ZRect Intersection (const ZRect &rect) const
 Finds intersection of two rectangles.

SDL_Rect SDLrect () const
 Returns an SDL_Rect representing the rectangle.

int X () const
 Returns X Location.

int Y () const
 Returns Y Location.

int Left () const
 Return position of left side.

int Right () const
 Return position of right side.

int Top () const
 Return position of top side.

int Bottom () const
 Return position of bottom side.

int Width () const
 Returns Width.

int Height () const
 Returns Height.


Private Attributes

+int mX
 X Position of top left corner of rectangle.

+int mY
 Y Position of top left corner of rectangle.

+int mWidth
 Width of Rectangle.

+int mHeight
 Height of Rectangle.

+


Constructor & Destructor Documentation

+

+ + + + +
+ + + + + + + + + +
ZE::ZRect::ZRect  
+
+ + + + + +
+   + + +

+Default constructor, initializes all values to zero.

+

+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ZE::ZRect::ZRect int   x,
int   y,
int   width,
int   height
+
+ + + + + +
+   + + +

+Constructor for ZRect that takes inital values for all four members.

Parameters:
+ + + + + +
x Value for x position.
y Value for y position.
width Value for width.
height Value for height.
+
+
+

+ + + + +
+ + + + + + + + + + +
ZE::ZRect::ZRect const ZRect &   rhs
+
+ + + + + +
+   + + +

+Takes a ZRect and constructs a new identical rectangle.

Parameters:
+ + +
rhs Rectangle to construct from.
+
+
+


Member Function Documentation

+

+ + + + +
+ + + + + + + + + + +
const ZRect & ZE::ZRect::operator= const ZRect &   rhs
+
+ + + + + +
+   + + +

+Copies all values from one ZRect into another.

Parameters:
+ + +
rhs Rectangle to copy values from.
+
+
Returns:
New value of the ZRect.
+
+

+ + + + +
+ + + + + + + + + + +
bool ZE::ZRect::operator< const ZRect &   rhs const
+
+ + + + + +
+   + + +

+Rectangles are sorted by y value, followed by x value, if they start at the same place, the smaller of the two is deemed less than the other.

Parameters:
+ + +
rhs Rectangle to compare.
+
+
Returns:
True if this rectangle is smaller than the rhs rectangle, false otherwise.
+
+

+ + + + +
+ + + + + + + + + + + + + + + + + + + +
void ZE::ZRect::Move int   x,
int   y
+
+ + + + + +
+   + + +

+Changes the current x,y position of the rectangle.

Parameters:
+ + + +
x New x position for rectangle.
y New y position for rectangle.
+
+
+

+ + + + +
+ + + + + + + + + + + + + + + + + + + +
void ZE::ZRect::MoveRel int   xMove,
int   yMove
+
+ + + + + +
+   + + +

+Changes the current x,y position of the rectangle relative to the current location.

Parameters:
+ + + +
xMove Offset for new x position from current.
yMove Offset for new y position from current.
+
+
+

+ + + + +
+ + + + + + + + + + + + + + + + + + + +
void ZE::ZRect::Resize int   width,
int   height
+
+ + + + + +
+   + + +

+Changes the current width and height of the rectangle.

Parameters:
+ + + +
width New width for rectangle.
height New height for rectangle.
+
+
+

+ + + + +
+ + + + + + + + + + + + + + + + + + + +
void ZE::ZRect::ResizeRel int   widthChange,
int   heightChange
+
+ + + + + +
+   + + +

+Changes the current width and height of the rectangle based upon current values.

Parameters:
+ + + +
widthChange Amount to add or subtract from width.
heightChange Amount to add or subtract from height.
+
+
+

+ + + + +
+ + + + + + + + + + +
bool ZE::ZRect::Intersects const ZRect &   rect const
+
+ + + + + +
+   + + +

+Checks for overlap and returns boolean value based on if overlap exists.

Parameters:
+ + +
rect Rectangle to check for intersection with.
+
+
Returns:
True if intersection occured, false otherwise.
+
+

+ + + + +
+ + + + + + + + + + + + + + + + + + + +
bool ZE::ZRect::Contains int   x,
int   y
const
+
+ + + + + +
+   + + +

+Checks point against boundaries of rectangle and returns result.

Parameters:
+ + + +
x X value of point to check.
y Y value of poitn to check.
+
+
Returns:
Boolean variable, true if point is inside rectangle, false otherwise.
+
+

+ + + + +
+ + + + + + + + + + +
bool ZE::ZRect::Contains const ZRect &   rect const
+
+ + + + + +
+   + + +

+Checks point against boundaries of rectangle and returns result.

Parameters:
+ + +
rect Rectangle to check for point.
+
+
Returns:
Boolean variable, true if point is inside rectangle, false otherwise.
+
+

+ + + + +
+ + + + + + + + + + +
ZRect ZE::ZRect::Intersection const ZRect &   rect const
+
+ + + + + +
+   + + +

+Checks for intersection, and returns rectangle where the two rectangles intersect.

Parameters:
+ + +
rect Rectangle to check intersection with.
+
+
Returns:
ZRect describing intersection area.
+
+

+ + + + +
+ + + + + + + + + +
SDL_Rect ZE::ZRect::SDLrect   const
+
+ + + + + +
+   + + +

+Makes a SDL_Rect representing the rectangle, for use where functions require an SDL_Rect.

Returns:
SDL_Rect representing the ZRect.
+
+

+ + + + +
+ + + + + + + + + +
int ZE::ZRect::X   const
+
+ + + + + +
+   + + +

+Access private X location member.

Returns:
Value of mX.
+
+

+ + + + +
+ + + + + + + + + +
int ZE::ZRect::Y   const
+
+ + + + + +
+   + + +

+Access private Y location member.

Returns:
Value of mY.
+
+

+ + + + +
+ + + + + + + + + +
int ZE::ZRect::Left   const
+
+ + + + + +
+   + + +

+Find X position of left side of rectangle.

Returns:
X position of left side.
+
+

+ + + + +
+ + + + + + + + + +
int ZE::ZRect::Right   const
+
+ + + + + +
+   + + +

+Find X position of right side of rectangle.

Returns:
X position of right side.
+
+

+ + + + +
+ + + + + + + + + +
int ZE::ZRect::Top   const
+
+ + + + + +
+   + + +

+Find Y position of top side of rectangle.

Returns:
Y position of top side.
+
+

+ + + + +
+ + + + + + + + + +
int ZE::ZRect::Bottom   const
+
+ + + + + +
+   + + +

+Find Y position of left side of rectangle.

Returns:
Y position of bottom side.
+
+

+ + + + +
+ + + + + + + + + +
int ZE::ZRect::Width   const
+
+ + + + + +
+   + + +

+Access private width member.

Returns:
Value of mWidth.
+
+

+ + + + +
+ + + + + + + + + +
int ZE::ZRect::Height   const
+
+ + + + + +
+   + + +

+Access private height member.

Returns:
Value of mHeight.
+
+


The documentation for this class was generated from the following files: +
Generated on Wed Nov 20 01:18:06 2002 for ZEngine by + +doxygen1.3-rc1
+ + diff --git a/doc/html/classZE_1_1ZSound-members.html b/doc/html/classZE_1_1ZSound-members.html new file mode 100644 index 0000000..3715fb1 --- /dev/null +++ b/doc/html/classZE_1_1ZSound-members.html @@ -0,0 +1,35 @@ + + +Member List + + + +
+Main Page   Namespace List   Class Hierarchy   Compound List   File List   Namespace Members   Compound Members   File Members  
+

ZE::ZSound Member List

This is the complete list of members for ZE::ZSound, including all inherited members. + + + + + + + + + + + + + + + + + + + + +
GetVolume()ZE::ZSound
IsLoaded()ZE::ZSound
IsPaused()ZE::ZSound
IsPlaying()ZE::ZSound
LoopInfiniteZE::ZSound [static]
Open(string filename)ZE::ZSound
Pause()ZE::ZSound
Play(int loopNum=0, int fadeTime=0)ZE::ZSound
rChannelIDZE::ZSound [protected]
Release()ZE::ZSound
rEngineZE::ZObject [protected]
rSoundZE::ZSound [protected]
SetVolume(int volume)ZE::ZSound
Stop(int fadeTime=0)ZE::ZSound
Unpause()ZE::ZSound
ZObject()ZE::ZObject [inline]
ZSound()ZE::ZSound
ZSound(string filename)ZE::ZSound
~ZObject()ZE::ZObject [inline, virtual]
~ZSound()ZE::ZSound

Generated on Wed Nov 20 01:18:06 2002 for ZEngine by + +doxygen1.3-rc1
+ + diff --git a/doc/html/classZE_1_1ZSound.html b/doc/html/classZE_1_1ZSound.html new file mode 100644 index 0000000..afc5287 --- /dev/null +++ b/doc/html/classZE_1_1ZSound.html @@ -0,0 +1,504 @@ + + +ZE::ZSound class Reference + + + +
+Main Page   Namespace List   Class Hierarchy   Compound List   File List   Namespace Members   Compound Members   File Members  
+

ZE::ZSound Class Reference

#include <ZE_ZSound.h> +

+Inherits ZE::ZObject. +

+List of all members.


Detailed Description

+ZSound music class, class wraps common features for SDL_Mixer's Mix_Chunk. Inherited from ZObject. +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Public Methods

 ZSound ()
 Default Constructor.

 ZSound (string filename)
 Constructor that opens a sound effect file.

 ~ZSound ()
 Destructor, frees memory.

void Open (string filename)
 Opens a sound effect file.

void Release ()
 Release sound effect.

void Play (int loopNum=0, int fadeTime=0)
 Play currently loaded sound effect.

void Pause ()
 Pause sound.

void Unpause ()
 Unpause sound.

void Stop (int fadeTime=0)
 Stop sound.

void SetVolume (int volume)
 Change Volume.

bool IsLoaded ()
 Check if file is loaded.

bool IsPlaying ()
 Check if sound is Playing.

bool IsPaused ()
 Check if sound is Paused.

int GetVolume ()
 Find Current Volume of Sound Channel.


Static Public Attributes

+const int LoopInfinite
 Static Variable For Infinite loop of sound. (Defined as -1).


Protected Attributes

+SoundData rSound
 Class containing music data and music filename.

+int rChannelID
 Channel ID Number from SDL_Mixer.

+


Constructor & Destructor Documentation

+

+ + + + +
+ + + + + + + + + +
ZE::ZSound::ZSound  
+
+ + + + + +
+   + + +

+Default Constructor, does nothing.

+

+ + + + +
+ + + + + + + + + + +
ZE::ZSound::ZSound string   filename
+
+ + + + + +
+   + + +

+Constructor simply calls ZSound::Open() with same filename. (WAV,MOD,MID,OGG)

Parameters:
+ + +
filename Sound effect to open.
+
+
+

+ + + + +
+ + + + + + + + + +
ZE::ZSound::~ZSound  
+
+ + + + + +
+   + + +

+Destructor calls ZSound::Release().

+


Member Function Documentation

+

+ + + + +
+ + + + + + + + + + +
void ZE::ZSound::Open string   filename
+
+ + + + + +
+   + + +

+Open a music file to be used.

Parameters:
+ + +
filename Music to open.
+
+
+

+ + + + +
+ + + + + + + + + +
void ZE::ZSound::Release  
+
+ + + + + +
+   + + +

+Release memory held by sample data.

+

+ + + + +
+ + + + + + + + + + + + + + + + + + + +
void ZE::ZSound::Play int   loopNum = 0,
int   fadeTime = 0
+
+ + + + + +
+   + + +

+Play sound effect, looping loopNum times. (use ZSound::LoopInfinite to loop forever.) If fade is not zero (which it defaults to) music will fade in over specified number of milliseconds.

Parameters:
+ + + +
loopNum Number of times to loop song, defaults to zero.
fadeTime Milliseconds to fade to full volume, defaults to zero for no fade.
+
+
+

+ + + + +
+ + + + + + + + + +
void ZE::ZSound::Pause  
+
+ + + + + +
+   + + +

+Pause currently playing sound.

+

+ + + + +
+ + + + + + + + + +
void ZE::ZSound::Unpause  
+
+ + + + + +
+   + + +

+Unpause currently playing sound.

+

+ + + + +
+ + + + + + + + + + +
void ZE::ZSound::Stop int   fadeTime = 0
+
+ + + + + +
+   + + +

+Stop currently playing sound, if fadeTime is not zero, fade out over specified time.

Parameters:
+ + +
fadeTime Milliseconds to fade out over, defaults to zero for immediate stop.
+
+
+

+ + + + +
+ + + + + + + + + + +
void ZE::ZSound::SetVolume int   volume
+
+ + + + + +
+   + + +

+Change volume of currently playing sample.

Parameters:
+ + +
volume Volume to change to, can be in a range from 0 to 128.
+
+
+

+ + + + +
+ + + + + + + + + +
bool ZE::ZSound::IsLoaded  
+
+ + + + + +
+   + + +

+Check if file is loaded and pointer to data is non-NULL.

Returns:
Loaded or Unloaded state of data.
+
+

+ + + + +
+ + + + + + + + + +
bool ZE::ZSound::IsPlaying  
+
+ + + + + +
+   + + +

+Check if sound is playing, specifically if it is not stopped. (Paused state should be checked for by IsPaused)

Returns:
Playing / Not Playing State of sound.
+
+

+ + + + +
+ + + + + + + + + +
bool ZE::ZSound::IsPaused  
+
+ + + + + +
+   + + +

+Check if sound is "playing" but currently paused.

Returns:
Paused / Not Paused State of Sound.
+
+

+ + + + +
+ + + + + + + + + +
int ZE::ZSound::GetVolume  
+
+ + + + + +
+   + + +

+Get current volume of sound channel represented as a value from 0-128.

Returns:
Volume of sound channel, 0-128.
+
+


The documentation for this class was generated from the following file: +
Generated on Wed Nov 20 01:18:06 2002 for ZEngine by + +doxygen1.3-rc1
+ + diff --git a/doc/html/classZE_1_1ZTimer-members.html b/doc/html/classZE_1_1ZTimer-members.html new file mode 100644 index 0000000..572d972 --- /dev/null +++ b/doc/html/classZE_1_1ZTimer-members.html @@ -0,0 +1,29 @@ + + +Member List + + + +
+Main Page   Namespace List   Class Hierarchy   Compound List   File List   Namespace Members   Compound Members   File Members  
+

ZE::ZTimer Member List

This is the complete list of members for ZE::ZTimer, including all inherited members. + + + + + + + + + + + + + + +
GetParentTime()ZE::ZTimer [protected]
GetTime()ZE::ZTimer
IsPaused()ZE::ZTimer
Pause()ZE::ZTimer
rEngineZE::ZObject [protected]
Reset()ZE::ZTimer
rLastPauseZE::ZTimer [protected]
rPausedZE::ZTimer [protected]
rPausedTimeZE::ZTimer [protected]
rUseZEngineZE::ZTimer [protected]
Unpause()ZE::ZTimer
ZObject()ZE::ZObject [inline]
ZTimer(bool useZEngine=true)ZE::ZTimer
~ZObject()ZE::ZObject [inline, virtual]

Generated on Wed Nov 20 01:18:06 2002 for ZEngine by + +doxygen1.3-rc1
+ + diff --git a/doc/html/classZE_1_1ZTimer.html b/doc/html/classZE_1_1ZTimer.html new file mode 100644 index 0000000..a73e213 --- /dev/null +++ b/doc/html/classZE_1_1ZTimer.html @@ -0,0 +1,262 @@ + + +ZE::ZTimer class Reference + + + +
+Main Page   Namespace List   Class Hierarchy   Compound List   File List   Namespace Members   Compound Members   File Members  
+

ZE::ZTimer Class Reference

#include <ZE_ZTimer.h> +

+Inherits ZE::ZObject. +

+List of all members.


Detailed Description

+ZTimer timing class, class wraps common features of SDL timer. Inherited from ZObject and tied to ZEngine main timer. +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + +

Public Methods

 ZTimer (bool useZEngine=true)
 Constructs a new Timer.

void Reset ()
 Reset Timer.

void Pause ()
 Pause Timer.

void Unpause ()
 Unpause Timer.

Uint32 GetTime ()
 Get Time of Timer.

bool IsPaused ()
 Get paused state.


Protected Methods

Uint32 GetParentTime ()
 Get time from parent timer.


Protected Attributes

+bool rPaused
 Paused / Unpaused state of Timer.

+bool rUseZEngine
 Using ZEngine timer or SDL global timer.

+Uint32 rPausedTime
 Total time this timer has been paused.

+Uint32 rLastPause
 Time this Timer was paused.

+


Constructor & Destructor Documentation

+

+ + + + +
+ + + + + + + + + + +
ZE::ZTimer::ZTimer bool   useZEngine = true
+
+ + + + + +
+   + + +

+Sets TimePaused to current ZEngine time if useZEngine is true, otherwise uses SDL timer.

Parameters:
+ + +
useZEngine Tells if timer should use ZEngine or SDL.
+
+
+


Member Function Documentation

+

+ + + + +
+ + + + + + + + + +
Uint32 ZE::ZTimer::GetParentTime   [protected]
+
+ + + + + +
+   + + +

+Protected method to get time from whichever timer is parent.

Returns:
Time on parent timer.
+
+

+ + + + +
+ + + + + + + + + +
void ZE::ZTimer::Reset  
+
+ + + + + +
+   + + +

+Set Timer back to Zero, will also unpause timer if it was paused.

+

+ + + + +
+ + + + + + + + + +
void ZE::ZTimer::Pause  
+
+ + + + + +
+   + + +

+Pause the timer if it is unpaused.

+

+ + + + +
+ + + + + + + + + +
void ZE::ZTimer::Unpause  
+
+ + + + + +
+   + + +

+Unpause the timer if it is paused.

+

+ + + + +
+ + + + + + + + + +
Uint32 ZE::ZTimer::GetTime  
+
+ + + + + +
+   + + +

+Get current time accounting for time paused.

Returns:
Current Timer Time.
+
+

+ + + + +
+ + + + + + + + + +
bool ZE::ZTimer::IsPaused  
+
+ + + + + +
+   + + +

+Find out paused state of timer.

Returns:
Paused state for timer.
+
+


The documentation for this class was generated from the following files: +
Generated on Wed Nov 20 01:18:06 2002 for ZEngine by + +doxygen1.3-rc1
+ + diff --git a/doc/html/doxygen.css b/doc/html/doxygen.css new file mode 100644 index 0000000..e527a57 --- /dev/null +++ b/doc/html/doxygen.css @@ -0,0 +1,49 @@ +H1 { text-align: center; } +CAPTION { font-weight: bold } +A.qindex {} +A.qindexRef {} +A.el { text-decoration: none; font-weight: bold } +A.elRef { font-weight: bold } +A.code { text-decoration: none; font-weight: normal; color: #4444ee } +A.codeRef { font-weight: normal; color: #4444ee } +A:hover { text-decoration: none; background-color: #f2f2ff } +DL.el { margin-left: -1cm } +DIV.fragment { width: 100%; border: none; background-color: #eeeeee } +DIV.ah { background-color: black; font-weight: bold; color: #ffffff; margin-bottom: 3px; margin-top: 3px } +TD.md { background-color: #f2f2ff; font-weight: bold; } +TD.mdname1 { background-color: #f2f2ff; font-weight: bold; color: #602020; } +TD.mdname { background-color: #f2f2ff; font-weight: bold; color: #602020; width: 600px; } +DIV.groupHeader { margin-left: 16px; margin-top: 12px; margin-bottom: 6px; font-weight: bold } +DIV.groupText { margin-left: 16px; font-style: italic; font-size: smaller } +BODY { background: white } +TD.indexkey { + background-color: #eeeeff; + font-weight: bold; + padding-right : 10px; + padding-top : 2px; + padding-left : 10px; + padding-bottom : 2px; + margin-left : 0px; + margin-right : 0px; + margin-top : 2px; + margin-bottom : 2px +} +TD.indexvalue { + background-color: #eeeeff; + font-style: italic; + padding-right : 10px; + padding-top : 2px; + padding-left : 10px; + padding-bottom : 2px; + margin-left : 0px; + margin-right : 0px; + margin-top : 2px; + margin-bottom : 2px +} +span.keyword { color: #008000 } +span.keywordtype { color: #604020 } +span.keywordflow { color: #e08000 } +span.comment { color: #800000 } +span.preprocessor { color: #806020 } +span.stringliteral { color: #002080 } +span.charliteral { color: #008080 } diff --git a/doc/html/doxygen.gif b/doc/html/doxygen.gif new file mode 100644 index 0000000000000000000000000000000000000000..192c83ce05078f6475c1e81290fdadded6d25467 GIT binary patch literal 2378 zcmV-Q3AOe|Nk%w1VQv650OtSz|Nr8jARx9SCIA26|Nq?I-^TyU%-^!I{`}Lwzp4NK z!AJl$=%to{Pn!Dk|EsHq~G7iKRhfS z91pmqSoh+E_1twJ9~uAt+rPi6_u+;4>Y>o9Ci2iy|NPV1&W%7nHQd#u_u_{7@UK2Q zC_q3tKtMO!(wV!kc>C|K*1%`_>!ID+u=e4G1Ox;A{M1}gCc3O{-`~UU#x(HCLb<7A z|Nh(_8x0>E5g#2C_1$(`Q6}BmuleerKRqwCoITdTXWY`6`s<+8yjR)DfImJmJ~}1- z_{iGMj36K!_vVw=#&tb69{caE{rSkgy`H408y_AP9~%w7zokGx zIN#j4{Pn%`)@AzYq1efR@XJEq-oPFh2KL-_zrU#1#&y=fX7}cj@ybHdvO2!LoQBU|vkZw|@5Fh4$iw4-E!FJ}bVvm)y~rJv0@)w~d&FKADM1?!`1GB^lw+ zgkWG&J~<&iI3ZwPPeepJ?#4A98VdH^cH7dJwVXcO(wK#985kE3(5)_$d?@b5G(0pF z-Py0>vxI<15b0p7VOf*ylGM zmLI?j=JM6&Sb2uIr(S>pw!{Zp1AH*R0}wXI)(37e!QcQ)L?|H>^(@HXT5K_4NXSa)9_?J1IWMk&ArPV+x2A*5hJ`3_9pmOL-8$fD8EQ1jLAnDWmYz6G0N0&Y^=Ub09#f zrBqo_fe00ta6$|mArZp~(TZ?FJdDM+T!|MGV&>46PA|-ed&|C`>Sc3M6#o z&JGh$K*0|6P@wS+Bp~r92`Y$8!7BA&v4hDd&_RJD9dks2B&SS}G0m%B!BHnZQ$R~7 z#mH}6d}F_8m!*E21V3xh%3P) zk_-Am)RV*O8XPjk6k;3?Jnt<<0>J_cAj1MUzyU7^5CZ?ZLp_!Nzy zXPBNRY=8&;8+ZW^I=};Gbl`_HNJc%XaD*e$paVxZf&-@Lhbr{pi7!|KH@Z=V7rfvI z8+bxJq%g)c2$2VC_zNnY&<9F9F^Dtd$P=8{0UG=;h-IipACCA8LP$Xhgm}RQI`D!# zI;0+jZ~zRZC=LgVVu}tRf(zI6VIArP_%gcG0&hC%iG@i_P4+du5gD-+~OMdxX4Yea+k~8<~sMeQwazFJ2OgsC;$Ke literal 0 HcmV?d00001 diff --git a/doc/html/doxygen.png b/doc/html/doxygen.png new file mode 100644 index 0000000000000000000000000000000000000000..96ae72c2978be48bb081e0795f5e9a5d6905a5b9 GIT binary patch literal 2352 zcmaJ@XHXM}5)Mc=AW}p^5e%RSEsY{YdPy*fgck593B?GZMk&IDB6^_&r6UR=V1t07 zqDYYB{P-jdO973>Gf8e9NRM)Dp)o!g0qM<4Vj=zPe@|Dq666;okhst+uYS@xk zAe#!=^Zln?PyVKr%6E;`S(kqWY=*HsfA1V;)fhQ<$CMos^=cI}FxoX8aHZD(`7N&D z>eW}uY`q&yA(Aq{v|hyY~*BV!IpRizEa^A zSwUf5fG8o|FrCa?7W_ZsbCSbIMfvD5rc2)xa_CE)&3MK>PdiZzPSx=EY{5R=Lw9$W zFB~Q4-_erioglSItWbyFcScK%P|Bx2nok_;7V~gL{^sw)Hmw`$rsv1K}`8Yt2#c0pX2g5sO;y1o~4%iuIyi#qw zFm*RC`MvCuf!1<4v?T_#Q{Sw>Dv=96=Qk`bvEfC+V}+C_G!9f5qp+Mfqpdo&v-7X2 zEsjl=2Zs2jpeR3I^jOrC#EnCRYK7ykw~Y<^$KBzQ$j?=wli)Z_dg%f@3mh@mn~ zY-rW-_)2Tp)x!)>H?E^r>=E{}#T=G-CW-@osY zch;71#~zaaQaCN&u+y;iqyJD$efQ0`ds~0bG7EEg?iz@?@KkW>xdI>kcON*eM-mkj z{Hg4Mq|yM@aKlnN8Ad!tqDiW7k~_vI0!L4-1Z&Wup7|~d>#qjJ0-uA&ia#r&mdx8v zh{Ysj=iMgA&&1A@moF|nsz(e)_;Uiol|tq()vU(gqOB|ji;{rH_>zyt2xSg9h+h{C zv+F5Xy#5KK7P)%}Ck#D|^?1V$N)szVm7J2X#m+w(imL|lM%~vBw^Q~q$CrnXoTf$H zzF~>!<$mS2O?lzwP|kfiF}g8jcl3mUEgkkkh%w!KZMvAFF9^}~ej@k#Gd^V_{0z7E zlS6D1*YZT=yhuXqJ9{VQ#HEDN*DR$8sI6F7<;IiQSrcoeN7g_o#?!`Af^b9`2;50K zitSJI72p0Sb8pZ7DS_NNl_sYR+va{vYOi<{J}UY2dXxVnRvC@qh1F8VTgYH6vT~(% zZ2N{=>^>N0x=jb@(&D^o^RLm}($~_;&Kub{C2Xfmah^5anC-b6$;BEl3*$8jem8}c z3*MM|I(n@y9TAF*ctIWJT!UQdUmM^y{K3@8sQJdNrafkJtINN7ONa1e;w?Mt{_JhM zvRka(c#HYT@E0V`S6xwQ!o-vU4DQhKh-)xd(lG?l6971ya~`Kg%#4-Zl9lG!@VLCj zn%e5Mm!q<2O$UGcRpXu>y%9VED_L9OY%qWuy3i~< z+emnMRoLY#-xm~rEgRP6atqF;dvM1{=%Q7NcKcBg&Z1l zV~6}Z`XPV+=bsYaz2&oFCc3ZEn}yXbvh;enHYUk;@jUTd(xG51%O-4mi-__eW*D%0++`&?dm# zPd_nXLUL4%gBDan;34>)_!5SOs{V7u1HVyR7H*pVx$aUUgqXX95@2i(7j1|H^I|!M zS3hU81OfgU9~=o25UZE}Kn~T?I2_2;b7HMR`%*)h);W}}SN$d(wjY3w22CPf3pSEK z`@JL}GUw`L^lZx+{KurgBTG8o(X~G|(-<9c9%;J8&^(JEc$Oi*N?=TC)Lzw#&F7Nl zHQB3u-YV(8aQrkAK!U7fLifRwqTWQcQt+0@;kmR<&^uK8n9YK;XTuDH?XY{HL*v09 z8svU;%Hhy$AH9$^e+pAEde;2I<;K%f*-dV3{IarZHE-WX1+D)GFP8KnOsc_^ z6q~mV=laSj_m1;^5X}%ECLfW5I$=E3`=TMVtLt?(a30*5=_&F*bvhx?FF`d>rP;x^MFfsMbkCxS5D-e^%!V{JsKKS`i`&ka` z-g#uQghXfa@Au4JFJ6eWrAEFVsOiW@X;hgN@VQgD2(fD=RxXatsl;WS2C1NQ5IP1br%vg@40K^|6=DP_ zk`iN1j)|m@h&uj}I)0bKLPIDz#87e&KcIbI4*IVgDKNyBa(Q1*52cUvH89j85a4h> zq`m + +File Index + + + +
+Main Page   Namespace List   Class Hierarchy   Compound List   File List   Namespace Members   Compound Members   File Members  
+

ZEngine File List

Here is a list of all documented files with brief descriptions: + + + + + + + + + + + + + + + + + + + + + + + + +
/home/James/ZEngine-dev/include/ZE_DataPtr.h [code]Definition file for ZEngine Data/Pointer Classes. ([Image,Font,Sound,Music]Data/Ptr)
/home/James/ZEngine-dev/include/ZE_Defines.h [code]Define file for ZEngine
/home/James/ZEngine-dev/include/ZE_Error.h [code]Definition file for ZEngine Error Handling Functions
/home/James/ZEngine-dev/include/ZE_Includes.h [code]Include file for SDL and C++ Includes that many ZEngine files need
/home/James/ZEngine-dev/include/ZE_ZConfigFile.h [code]Definition file for ZConfigFile
/home/James/ZEngine-dev/include/ZE_ZEngine.h [code]Definition file for core ZEngine class
/home/James/ZEngine-dev/include/ZE_ZFont.h [code]Definition file for ZFont
/home/James/ZEngine-dev/include/ZE_ZImage.h [code]Definition file for ZImage
/home/James/ZEngine-dev/include/ZE_ZMusic.h [code]Definition file for ZMusic
/home/James/ZEngine-dev/include/ZE_ZObject.h [code]Definition file for ZObject Base Class
/home/James/ZEngine-dev/include/ZE_ZRect.h [code]Definition file for ZRect
/home/James/ZEngine-dev/include/ZE_ZSound.h [code]Definition file for ZSound
/home/James/ZEngine-dev/include/ZE_ZTimer.h [code]Definition file for ZTimer
/home/James/ZEngine-dev/include/ZEngine.h [code]Header file for ZEngine
/home/James/ZEngine-dev/include/external/physfsrwops.h [code]
/home/James/ZEngine-dev/src/ZE_Error.cppSource file for error logging utilities
/home/James/ZEngine-dev/src/ZE_ZConfigFile.cppSource file for ZConfigFile
/home/James/ZEngine-dev/src/ZE_ZEngine.cppCentral source file for ZEngine
/home/James/ZEngine-dev/src/ZE_ZFont.cppSource file for ZFont
/home/James/ZEngine-dev/src/ZE_ZImage.cppSource file for ZImage
/home/James/ZEngine-dev/src/ZE_ZMusic.cppSource file for ZMusic
/home/James/ZEngine-dev/src/ZE_ZRect.cppSource file for ZRect
/home/James/ZEngine-dev/src/ZE_ZSound.cppSource file for ZSound
/home/James/ZEngine-dev/src/ZE_ZTimer.cppSource file for ZTimer
+
Generated on Wed Nov 20 01:18:05 2002 for ZEngine by + +doxygen1.3-rc1
+ + diff --git a/doc/html/functions.html b/doc/html/functions.html new file mode 100644 index 0000000..1156f14 --- /dev/null +++ b/doc/html/functions.html @@ -0,0 +1,248 @@ + + +Compound Member Index + + + +
+Main Page   Namespace List   Class Hierarchy   Compound List   File List   Namespace Members   Compound Members   File Members  
+

ZEngine Compound Members

+a | b | c | d | f | g | h | i | k | l | m | o | p | q | r | s | t | u | w | x | y | z | ~
+ +

+Here is a list of all documented class members with links to the class documentation for each member:

- a - +

+

- b - +

+

- c - +

+

- d - +

+

- f - +

+

- g - +

+

- h - +

+

- i - +

+

- k - +

+

- l - +

+

- m - +

+

- o - +

+

- p - +

+

- q - +

+

- r - +

+

- s - +

+

- t - +

+

- u - +

+

- w - +

+

- x - +

+

- y - +

+

- z - +

+

- ~ - +

+
Generated on Wed Nov 20 01:18:05 2002 for ZEngine by + +doxygen1.3-rc1
+ + diff --git a/doc/html/globals.html b/doc/html/globals.html new file mode 100644 index 0000000..973e73f --- /dev/null +++ b/doc/html/globals.html @@ -0,0 +1,40 @@ + + +File Member Index + + + +
+Main Page   Namespace List   Class Hierarchy   Compound List   File List   Namespace Members   Compound Members   File Members  
+

ZEngine File Members

+d | g | l | u | v
+ +

+Here is a list of all documented file members with links to the documentation:

- d - +

+

- g - +

+

- l - +

+

- u - +

+

- v - +

+
Generated on Wed Nov 20 01:18:06 2002 for ZEngine by + +doxygen1.3-rc1
+ + diff --git a/doc/html/hierarchy.html b/doc/html/hierarchy.html new file mode 100644 index 0000000..231b099 --- /dev/null +++ b/doc/html/hierarchy.html @@ -0,0 +1,31 @@ + + +Hierarchical Index + + + +
+Main Page   Namespace List   Class Hierarchy   Compound List   File List   Namespace Members   Compound Members   File Members  
+

ZEngine Class Hierarchy

This inheritance list is sorted roughly, but not completely, alphabetically: +
Generated on Wed Nov 20 01:18:05 2002 for ZEngine by + +doxygen1.3-rc1
+ + diff --git a/doc/html/index.html b/doc/html/index.html new file mode 100644 index 0000000..c6154e1 --- /dev/null +++ b/doc/html/index.html @@ -0,0 +1,35 @@ + + +ZEngine Documentation + + + +
+Main Page   Namespace List   Class Hierarchy   Compound List   File List   Namespace Members   Compound Members   File Members  
+

ZEngine Documentation

+

+

0.7.0

Author:
James Turk
+
Version:
0.7.3
+
Date:
07 November, 2002
+

+About ZEngine

+
+ ZEngine is designed to wrap common interfaces of the SDL API in an Object Oriented manner. It is licensed under the Academic Free License, and anyone is free to suggest or implement changes to be added to the Engine. In addition ZEngine hopes to provide a core engine which can be used to develop a game without having to rewrite large amounts of code.

+Licensing

+
+
+
+         This file is Part of the ZEngine Library for SDL Game Development.
+                      Copyright (C) 2002 ConceptOfZero.net
+ +

+Licensed under the BSD License, see licensing.txt. +

+The maintainer of this library is James Turk (james.net) and the home of this Library is http://www.conceptofzero.net/

+Contributing Authors

+James Turk james@conceptofzero.net - Core Engine and Classes for Data Types
Generated on Wed Nov 20 01:18:05 2002 for ZEngine by + +doxygen1.3-rc1
+ + diff --git a/doc/html/namespaceZE.html b/doc/html/namespaceZE.html new file mode 100644 index 0000000..b201f28 --- /dev/null +++ b/doc/html/namespaceZE.html @@ -0,0 +1,209 @@ + + +ZE Namespace Reference + + + +
+Main Page   Namespace List   Class Hierarchy   Compound List   File List   Namespace Members   Compound Members   File Members  
+

ZE Namespace Reference


Detailed Description

+Namespace for ZEngine classes and utility functions. +

+ +

+ +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Compounds

class  ImageData
 Class to wrap SDL_Surface pointers. More...

class  FontData
 Class to wrap TTF_Font pointers. More...

class  SoundData
 Class to wrap Mix_Chunk pointers. More...

class  MusicData
 Class to wrap Mix_Music pointers. More...

class  ZConfigFile
 ZConfigFile Class for use in ZEngine. More...

class  ZCF_Variable
class  ZCF_Section
class  ZEngine
 Main ZEngine Singleton Class. More...

class  ZFont
 ZFont class for basic Font use. More...

class  ZImage
 ZImage class for basic Image use. More...

class  ZMusic
 ZMusic class for playing full length music (eg. ogg or wav). More...

class  ZObject
 ZObject base class for other ZEngine objects. More...

class  ZRect
 ZEngine class for simplified rectangle use. More...

class  ZSound
 ZSound class for playing sound effects. (WAV). More...

class  ZTimer
 ZTimer class for Timer use. More...


Functions

string _GetError (int line, string file, string str)
 Error handling Utiltity function.

void _LogError (int line, string file, string str)
 Error handling Utiltity function.

string FormatStr (const char *fmtstr,...)
 Parses a string and interprets variable arguments, similar to sprintf.

+


Function Documentation

+

+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + +
string ZE::_GetError int   line,
string   file,
string   str
+
+ + + + + +
+   + + +

+Get string describing error given appropriate details.

Parameters:
+ + + + +
line Line error occured on.
file Name of file error occured in.
str More detail on error.
+
+
Returns:
String describing error.
+
+

+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + +
void ZE::_LogError int   line,
string   file,
string   str
+
+ + + + + +
+   + + +

+Log error to stderr, describing error given appropriate details.

Parameters:
+ + + + +
line Line error occured on.
file Name of file error occured in.
str More detail on error.
+
+
+

+ + + + +
+ + + + + + + + + + + + + + + + + + + +
string ZE::FormatStr const char *   fmtstr,
...  
+
+ + + + + +
+   + + +

+Takes identifiers out of fmtstr and parses them, replacing them with cooresponding values in the variable arguments list. For more detail view documentation.

Parameters:
+ + + +
fmtstr defines format of resulting string
... variable number of arguments after fmtstr
+
+
Returns:
string of parsed and combined string
+
+


Generated on Wed Nov 20 01:18:05 2002 for ZEngine by + +doxygen1.3-rc1
+ + diff --git a/doc/html/namespacemembers.html b/doc/html/namespacemembers.html new file mode 100644 index 0000000..c9149ec --- /dev/null +++ b/doc/html/namespacemembers.html @@ -0,0 +1,27 @@ + + +Namespace Member Index + + + +
+Main Page   Namespace List   Class Hierarchy   Compound List   File List   Namespace Members   Compound Members   File Members  
+

ZEngine Namespace Members

+_ | f
+ +

+Here is a list of all documented namespace members with links to the namespaces they belong to:

- _ - +

    +
  • _GetError() +: ZE
  • _LogError() +: ZE
+

- f - +

    +
  • FormatStr() +: ZE
+
Generated on Wed Nov 20 01:18:06 2002 for ZEngine by + +doxygen1.3-rc1
+ + diff --git a/doc/html/namespaces.html b/doc/html/namespaces.html new file mode 100644 index 0000000..70ec724 --- /dev/null +++ b/doc/html/namespaces.html @@ -0,0 +1,17 @@ + + +Namespace Index + + + +
+Main Page   Namespace List   Class Hierarchy   Compound List   File List   Namespace Members   Compound Members   File Members  
+

ZEngine Namespace List

Here is a list of all documented namespaces with brief descriptions: + +
ZEZEngine Namespace
+
Generated on Wed Nov 20 01:18:05 2002 for ZEngine by + +doxygen1.3-rc1
+ + diff --git a/doc/html/physfsrwops_8h-source.html b/doc/html/physfsrwops_8h-source.html new file mode 100644 index 0000000..74340b6 --- /dev/null +++ b/doc/html/physfsrwops_8h-source.html @@ -0,0 +1,54 @@ + + +/home/James/ZEngine-dev/include/external/physfsrwops.h Source File + + + +
+Main Page   Namespace List   Class Hierarchy   Compound List   File List   Namespace Members   Compound Members   File Members  
+

/home/James/ZEngine-dev/include/external/physfsrwops.h

00001 /*
+00002  * This code provides a glue layer between PhysicsFS and Simple Directmedia
+00003  *  Layer's (SDL) RWops i/o abstraction.
+00004  *
+00005  * License: this code is public domain. I make no warranty that it is useful,
+00006  *  correct, harmless, or environmentally safe.
+00007  *
+00008  * This particular file may be used however you like, including copying it
+00009  *  verbatim into a closed-source project, exploiting it commercially, and
+00010  *  removing any trace of my name from the source (although I hope you won't
+00011  *  do that). I welcome enhancements and corrections to this file, but I do
+00012  *  not require you to send me patches if you make changes.
+00013  *
+00014  * Unless otherwise stated, the rest of PhysicsFS falls under the GNU Lesser
+00015  *  General Public License: http://www.gnu.org/licenses/lgpl.txt
+00016  *
+00017  * SDL falls under the LGPL, too. You can get SDL at http://www.libsdl.org/
+00018  *
+00019  *  This file was written by Ryan C. Gordon. (icculus@clutteredmind.org).
+00020  */
+00021 
+00022 #ifndef _INCLUDE_PHYSFSRWOPS_H_
+00023 #define _INCLUDE_PHYSFSRWOPS_H_
+00024 
+00025 #include <physfs.h>
+00026 #include <SDL.h>
+00027 
+00038 SDL_RWops *PHYSFSRWOPS_openRead(const char *fname);
+00039 
+00050 SDL_RWops *PHYSFSRWOPS_openWrite(const char *fname);
+00051 
+00062 SDL_RWops *PHYSFSRWOPS_openAppend(const char *fname);
+00063 
+00074 SDL_RWops *PHYSFSRWOPS_makeRWops(PHYSFS_file *handle);
+00075 
+00076 
+00077 #endif /* include-once blocker */
+00078 
+00079 /* end of physfsrwops.h ... */
+00080 
+

Generated on Wed Nov 20 01:18:05 2002 for ZEngine by + +doxygen1.3-rc1
+ + diff --git a/include/ZE_DataPtr.h b/include/ZE_DataPtr.h new file mode 100644 index 0000000..d44bc6d --- /dev/null +++ b/include/ZE_DataPtr.h @@ -0,0 +1,127 @@ +/******************************************************************************* + This file is Part of the ZEngine Library for SDL Game Development. + Copyright (C) 2002 ConceptOfZero.net + + Licensed under the BSD License, see licensing.txt. + + The maintainer of this library is James Turk (jturk@conceptofzero.net) + and the home of this Library is http://www.conceptofzero.net/ +*******************************************************************************/ + +/*! +\par File Header: +File: ZE_DataPtr.h
+Description: Header file for ZEngine Data Pointer Classes
+Author(s): James Turk
+$Id: ZE_DataPtr.h,v 1.1 2002/11/21 05:41:10 cozman Exp $
+ + \file ZE_DataPtr.h + \brief Definition file for ZEngine Data/Pointer Classes. ([Image,Font,Sound,Music]Data/Ptr) + + Definition file for ZEngine Data Pointer Classes. ([Image,Font,Sound,Music]Ptr) These classes are used to keep track of the Images (Fonts and Sounds) throughout + the entire ZEngine. +**/ + +#ifndef __ze_dataptr_h__ +#define __ze_dataptr_h__ + +#include "ZE_Includes.h" + +namespace ZE +{ + +/////////////////////////////////////////// +//Utility Classes Used Throughout ZEngine// +/////////////////////////////////////////// + +/*! + \brief Class to wrap SDL_Surface pointers. + + Class used to keep track of loaded data and associate an SDL_Surface with an index number and filename. +**/ +class ImageData +{ + public: + //! Pointer to SDL_Surface. + SDL_Surface *image; + //! File image was loaded from. + string filename; + /*! + \brief Initialize ImageData. + + Sets image pointer to NULL + **/ + ImageData() { image = NULL; }; +}; + +#ifdef USE_SDL_TTF + +/*! + \brief Class to wrap TTF_Font pointers. + + Class used to keep track of loaded data and associate a TTF_Font with an index number and filename. +**/ +class FontData +{ + public: + //! Pointer to SDL_TTF font data. + TTF_Font *font; + //! File font was loaded from. + string filename; + /*! + \brief Initialize FontData. + + Sets font pointer to NULL + **/ + FontData() { font = NULL; }; +}; + +#endif //USE_SDL_TTF + +#ifdef USE_SDL_MIXER + +/*! + \brief Class to wrap Mix_Chunk pointers. + + Class used to keep track of loaded data and associate a Mix_Chunk with an index number and filename. +**/ +class SoundData +{ + public: + //! Pointer to SDL_Mixer sound effect data. + Mix_Chunk *sound; + //! File sound effect was loaded from. + string filename; + /*! + \brief Initialize SoundData. + + Sets sound pointer to NULL + **/ + SoundData() { sound = NULL; }; +}; + +/*! + \brief Class to wrap Mix_Music pointers. + + Class used to keep track of loaded data and associate a Mix_Music with an index number and filename. +**/ +class MusicData +{ + public: + //! Pointer to SDL_Mixer music data. + Mix_Music *music; + //! File music was loaded from. + string filename; + /*! + \brief Initialize MusicData. + + Sets music pointer to NULL + **/ + MusicData() { music = NULL; }; +}; + +#endif //USE_SDL_MIXER + +} + +#endif //__ze_dataptr_h__ diff --git a/include/ZE_Defines.h b/include/ZE_Defines.h new file mode 100644 index 0000000..f37edc3 --- /dev/null +++ b/include/ZE_Defines.h @@ -0,0 +1,41 @@ +/******************************************************************************* + This file is Part of the ZEngine Library for SDL Game Development. + Copyright (C) 2002 ConceptOfZero.net + + Licensed under the BSD License, see licensing.txt. + + The maintainer of this library is James Turk (jturk@conceptofzero.net) + and the home of this Library is http://www.conceptofzero.net/ +*******************************************************************************/ + +/*! +\par File Header: +File: ZE_Defines.h
+Description: Defines header file for ZEngine class, where all #define statements to control compilation options are placed.
+Author(s): James Turk
+$Id: ZE_Defines.h,v 1.1 2002/11/21 05:41:10 cozman Exp $
+ + \file ZE_Defines.h + \brief Define file for ZEngine. + + Definition file, holds #define statements describing optional features of ZEngine. +**/ + +#ifndef __ze_defines_h__ +#define __ze_defines_h__ + +//defines- undefine any of these if you dont have the indicated SDL extension// +//! Define to include font support. +#define USE_SDL_TTF +//! Define to include non-bmp image file support. +#define USE_SDL_IMAGE +//! Define to include sound support. +#define USE_SDL_MIXER +//! Define to use the Physfs file system. +//#define USE_PHYSFS +//! Undefine to disable debug streams for Error Handler. +#define DEBUG_STREAM +//! Version number. +#define VERSION "0.7.3" + +#endif //__ze_defines_h__ diff --git a/include/ZE_Error.h b/include/ZE_Error.h new file mode 100644 index 0000000..ec9540f --- /dev/null +++ b/include/ZE_Error.h @@ -0,0 +1,81 @@ +/******************************************************************************* + This file is Part of the ZEngine Library for SDL Game Development. + Copyright (C) 2002 ConceptOfZero.net + + Licensed under the BSD License, see licensing.txt. + + The maintainer of this library is James Turk (jturk@conceptofzero.net) + and the home of this Library is http://www.conceptofzero.net/ +*******************************************************************************/ + +/*! +\par File Header: +File: ZE_Error.h
+Description: Header file for ZEngine Error Handling Functions.
+Author(s): James Turk
+$Id: ZE_Error.h,v 1.1 2002/11/21 05:41:10 cozman Exp $
+ + \file ZE_Error.h + \brief Definition file for ZEngine Error Handling Functions. + + Definition file for ZEngine Error Logging + Formatting functions which are used for internal and external errors. +**/ + +#ifndef __ze_error_h__ +#define __ze_error_h__ + +#include "ZE_Includes.h" + +namespace ZE +{ + + +////////////////////////////// +//Error Logging + Formatting// +////////////////////////////// + +/*! + \brief Error handling Utiltity function. + + Get string describing error given appropriate details. + \param line Line error occured on. + \param file Name of file error occured in. + \param str More detail on error. + \return String describing error. +**/ +string _GetError(int line, string file, string str); + +/*! + \brief Error handling Utiltity function. + + Log error to stderr, describing error given appropriate details. + \param line Line error occured on. + \param file Name of file error occured in. + \param str More detail on error. +**/ +void _LogError(int line, string file, string str); + +/*! + \brief Parses a string and interprets variable arguments, similar to sprintf. + + Takes % identifiers out of fmtstr and parses them, replacing them with cooresponding values + in the variable arguments list. For more detail view documentation. + \param fmtstr defines format of resulting string + \param ... variable number of arguments after fmtstr + \return string of parsed and combined string +**/ +string FormatStr(const char *fmtstr, ...); + +/*! + Creates a string about an error, telling what file it occured in and where, and gives a user defined string as well. +**/ +#define GetError(str) _GetError(__LINE__,__FILE__,str) + +/*! + Logs a string about an error, telling what file it occured in and where, and gives a user defined string as well. +**/ +#define LogError(str) _LogError(__LINE__,__FILE__,str) + +} + +#endif //__ze_error_h__ diff --git a/include/ZE_Includes.h b/include/ZE_Includes.h new file mode 100644 index 0000000..3281760 --- /dev/null +++ b/include/ZE_Includes.h @@ -0,0 +1,55 @@ +/******************************************************************************* + This file is Part of the ZEngine Library for SDL Game Development. + Copyright (C) 2002 ConceptOfZero.net + + Licensed under the BSD License, see licensing.txt. + + The maintainer of this library is James Turk (jturk@conceptofzero.net) + and the home of this Library is http://www.conceptofzero.net/ +*******************************************************************************/ + +/*! +\par File Header: +File: ZE_Includes.h
+Description: Header file for ZEngine universal includes.
+Author(s): James Turk
+$Id: ZE_Includes.h,v 1.1 2002/11/21 05:41:10 cozman Exp $
+ + \file ZE_Includes.h + \brief Include file for SDL and C++ Includes that many ZEngine files need. + + ZE_*.h files should only include this file and any other ZE_*.h files that they need, External Library or C/C++ Standard Library + files should be included from within this file. +**/ + +#ifndef __ze_includes_h__ +#define __ze_includes_h__ + +#include "ZE_Defines.h" + +#include "SDL.h" +#ifdef USE_SDL_IMAGE +#include "SDL_image.h" +#endif +#ifdef USE_SDL_TTF +#include "SDL_ttf.h" +#endif +#ifdef USE_SDL_MIXER +#include "SDL_mixer.h" +#endif +#ifdef USE_PHYSFS +#include "physfs.h" +#include "external/physfsrwops.h" +#endif + +#include +#include +#include +#include +#include +#include +#include +#include +using namespace std; + +#endif //__ze_includes_h__ diff --git a/include/ZE_ZConfigFile.h b/include/ZE_ZConfigFile.h new file mode 100644 index 0000000..c0da5da --- /dev/null +++ b/include/ZE_ZConfigFile.h @@ -0,0 +1,192 @@ +/******************************************************************************* + This file is Part of the ZEngine Library for SDL Game Development. + Copyright (C) 2002 ConceptOfZero.net + + Licensed under the BSD License, see licensing.txt. + + The maintainer of this library is James Turk (jturk@conceptofzero.net) + and the home of this Library is http://www.conceptofzero.net/ +*******************************************************************************/ + +/*! +\par File Header: +File: Types/ZE_ZConfigFile.h
+Description: Header file for ZEngine INI-Style Config Files.
+Author(s): James Turk
+$Id: ZE_ZConfigFile.h,v 1.1 2002/11/21 05:41:10 cozman Exp $
+ + \file ZE_ZConfigFile.h + \brief Definition file for ZConfigFile. + + Definition file for ZConfigFile, an INI-style Config format. +**/ + + +#ifndef __ze_zconfigfile_h__ +#define __ze_zconfigfile_h__ + +#include "ZE_ZObject.h" //included even though ZCF isn't derived (to obtain all other needed headers) + +namespace ZE +{ + +/*! + \brief ZConfigFile Class for use in ZEngine. + + ZConfigFile class for INI-style configuration files for games or applications. Inherited from ZObject. +**/ +class ZConfigFile : public ZObject +{ + private: + + /*Private Types*/ + class ZCF_Variable + { + public: + string var; + string val; + }; + class ZCF_Section + { + public: + string section; + list varList; + }; + + //! List of sections of internal type. + list mFileLayout; + + //! Filename of file currently open. + string mFilename; + + /*! + \brief Reformat a string in a form more suitable to parsing. + + Removes whitespace from a string and makes all characters lowercase. + \param str The string to get a clean version of. + \return Cleaned string. + **/ + string CleanString(string str); + + bool Exists(string sec); + bool Exists(string sec, string var); + void SetVariable(string sec, string var, string val); + string GetVariable(string sec, string var, string defVal); + + public: + + /*! + \brief Default constructor. + + A no-op default constructor. + **/ + ZConfigFile(); + + /*! + \brief Constructor which takes filename. + + Constructor takes filename, and calls process on it. + \param filename File to load as ZConfigFile. + **/ + ZConfigFile(string filename); + + /*! + \brief Destructor, flushes file. + + Flushes the file, ensures a flush if the file is left open. + **/ + ~ZConfigFile(); + + /*! + \brief Parse a file. + + Parses the file, reading the contents into the fileLayout map. + \param filename File to parse and attach this ZDataFile to. + **/ + void Process(string filename); + + /*! + \brief Get value in integer format from file. + + Get the current value of a variable in the file, or defVal if not found in file. + \param section Name of section to seek variable under. + \param var Name of variable to seek value for. + \param defVal Value to return if var does not exist within section. + \return Contents of the variable in integer format. + **/ + int GetInt(string section, string var, int defVal); + + /*! + \brief Get value in boolean format from file. + + Get the current value of a variable in the file, or defVal if not found in file. + (Valid values are "0","1","true" and "false") + \param section Name of section to seek variable under. + \param var Name of variable to seek value for. + \param defVal Value to return if var does not exist within section. + \return Contents of the variable in boolean format. + **/ + bool GetBool(string section, string var, bool defVal); + + /*! + \brief Get value in string format from file. + + Get the current value of a variable in the file, or defVal if not found in file. + \param section Name of section to seek variable under. + \param var Name of variable to seek value for. + \param defVal Value to return if var does not exist within section. + \return Contents of the variable in string format. + **/ + string GetString(string section, string var, string defVal); + + /*! + \brief Set value in integer format in file. + + Set the new value of a variable in the file to val, creating the section and variable + if not already found in file. + \param section Name of section to edit variable under. + \param var Name of variable to set value for. + \param val Integer value to set variable to in file. + **/ + void SetInt(string section, string var, int val); + + /*! + \brief Set value in boolean format in file. + + Set the new value of a variable in the file to val, creating the section and variable + if not already found in file. + \param section Name of section to edit variable under. + \param var Name of variable to set value for. + \param val Boolean value to set variable to in file. + **/ + void SetBool(string section, string var, bool val); + + /*! + \brief Set value in string format in file. + + Set the new value of a variable in the file to val, creating the section and variable + if not already found in file. + \param section Name of section to edit variable under. + \param var Name of variable to set value for. + \param val String value to set variable to in file. + **/ + void SetString(string section, string var, string val); + + /*! + \brief Write all values to file + + Writes all values and sections to file. + **/ + void Flush(); + + /*! + \brief Close the file. + + Flush the file and clear the filename. + **/ + void Close(); +}; + +} + +#endif //__ze_zconfigfile_h__ diff --git a/include/ZE_ZEngine.h b/include/ZE_ZEngine.h new file mode 100644 index 0000000..7885d89 --- /dev/null +++ b/include/ZE_ZEngine.h @@ -0,0 +1,522 @@ +/******************************************************************************* + This file is Part of the ZEngine Library for SDL Game Development. + Copyright (C) 2002 ConceptOfZero.net + + Licensed under the BSD License, see licensing.txt. + + The maintainer of this library is James Turk (jturk@conceptofzero.net) + and the home of this Library is http://www.conceptofzero.net/ +*******************************************************************************/ + +/*! +\par File Header: +File: ZE_ZEngine.h
+Description: Header file for ZEngine class, the core of the ZEngine.
+Author(s): James Turk
+$Id: ZE_ZEngine.h,v 1.1 2002/11/21 05:41:10 cozman Exp $
+ + \file ZE_ZEngine.h + \brief Definition file for core ZEngine class. + + ZEngine Game Engine core Engine definition. +**/ + +#ifndef __ze_zengine_h__ +#define __ze_zengine_h__ + +#include "ZE_DataPtr.h" +#include "ZE_Error.h" +#include "ZE_Defines.h" +#include "ZE_Includes.h" + +/*! + \brief ZEngine Namespace. + + Namespace for ZEngine classes and utility functions. +**/ +namespace ZE +{ + +/*! + \brief Main ZEngine Singleton Class + + ZEngine Singleton Class, accessible from anywhere in a ZEngine-based program by nature. Controls core elements of program and does + majority of SDL wrapping. Also keeps track of loaded data and helps programs avoid memory leaks and dangling pointers. +**/ +class ZEngine +{ + ///////////////////////////////// + //Singleton + Memory Management// + ///////////////////////////////// + + private: + //! Static Pointer to Instance of ZEngine for Singleton. + static ZEngine *sInstance; + + /*! + \brief Constructor for ZEngine. + + Initialize ZEngine values to defaults. (Private so that only one instance may be created.) + **/ + ZEngine(); + + public: + + /*! + \brief Get Instance. + + Static function, returns pointer to instance of ZEngine, creating an instance if none exist. + \return Instance to the ZEngine. + **/ + static ZEngine* GetInstance(); + + /*! + \brief Release Instance. + + Release memory held by instance of engine and closes window. + **/ + static void ReleaseInstance(); + + /*! + \brief Get Current Version. + + Get Version Number of ZEngine. (Major.Minor.Extension#) + \return string containing version number + **/ + static string GetVersion(); + + ////////////////// + //Initialization// + ////////////////// + + private: + //! Width of Display + int mWidth; + //! Height of Display + int mHeight; + //! BPP Setting of Display + int mBPP; + //! Fullscreen setting of Display + bool mFullscreen; + +#ifdef USE_SDL_MIXER + //! Sound Bitrate + int mRate; + //! Stereo setting of Sound Subsystem + bool mStereo; +#endif + + + public: + //add initialization + + /*! + \brief Setup Display for SDL. + + Sets display parameters to specified parameters. (called before CreateDisplay) + + \param width Desired width of screen or window. + \param height Desired height of screen or window. + \param bpp Desired BPP for screen (only works in fullscreen). + \param fullscreen A bool for fullscreen setting. + **/ + void SetupDisplay(int width, int height, int bpp, bool fullscreen); + +#ifdef USE_SDL_MIXER + /*! + \brief Initialize Sound for SDL. + + Set sound settings to specified parameters. (called before CreateDisplay) + + \param rate Desired sound bitrate. + \param stereo A bool for stereo setting. + **/ + void SetupSound(int rate, bool stereo); +#endif + + /*! + \brief Create Window with predefined settings. + + SetupDisplay and SetupSound should be called prior to this to change settings, settings from those do not go into effect + until this function is called. Specify no icon file to use default OS icon. + + \param title Window Title. + \param icon Path to Icon File. + **/ + void CreateWindow(string title, string icon=""); + + /*! + \brief Quit SDL and any Subsystems. + + Shut down SDL (and SDL_ttf,SDL_mixer if necessary). + **/ + void CloseWindow(); + + ///////////////// + //Screen Access// + ///////////////// + + private: + //! Pointer to Display + SDL_Surface *mScreen; + + public: + /*! + \brief Allow access to Screen Surface. + + Get pointer to screen SDL_Surface, allowing direct screen manipulation using SDL. + \return Pointer to Display Surface. + **/ + SDL_Surface *GetDisplay(); + + /*! + \brief Update screen contents. + + Flip double buffer in SDL if double buffered, otherwise tell video to refresh entire screen. + **/ + void UpdateScreen(); + + /*! + \brief Create Color in SDL Uint32 Format + + Turn RGBA values into SDL Uint32 color. (Alpha value will be ignored if not in use) + + \param r Red component of color (0-255). + \param g Green component of color (0-255). + \param b Blue component of color (0-255). + \param a Alpha (translucency) component of color (0-255). [Default 255] + \return Uint32 of color requested. + **/ + Uint32 MapColor(Uint8 r, Uint8 g, Uint8 b, Uint8 a=255); + + /*! + \brief Clear screen or portion of screen to a color. + + Clears a rectangle on screen to a color. + \param color Color to clear surface to, defaults to black. + \param rect Rectangle of screen to clear or NULL for entire surface. + **/ + void Clear(Uint32 color=0, SDL_Rect *rect=NULL); + + //////////////////////////////////////////// + //Timer and Framerate Independent Movement// + //////////////////////////////////////////// + + private: + //! Keep track of paused state of game. + bool mPaused; + //! Keep track of if ZEngine should unpause on active event. + bool mUnpauseOnActive; + //! Keep track of time game was last paused. + Uint32 mLastPause; + //! Keep track of total globally paused time. + Uint32 mPausedTime; + //! Keep track of last screen update time. + Uint32 mLastTime; + //! Seconds per frame. + double mSecPerFrame; + + public: + /*! + \brief Sleep for a certain amount of time. + + Freeze everything for given number of milliseconds. + \param milliseconds Number of milliseconds to freeze. + **/ + void Sleep(Uint32 milliseconds); + + /*! + \brief Get Global ZEngine time. + + Get active time since ZEngine initialization in milliseconds, paused time doesn't count. + \return Number of active milliseconds since initialization. + **/ + Uint32 GetTime(); + + /*! + \brief Pause ZEngine. + + Pause ZEngine timer and all ZTimer objects that rely on ZEngine. + **/ + void PauseTimer(); + + /*! + \brief Unpause ZEngine. + + Unpause ZEngine timer and all ZTimer objects that rely on ZEngine. + **/ + void UnpauseTimer(); + + /*! + \brief Get Seconds Per Frame. + + Get double that describes the time passed between screen updates. (used for Framerate Independant Movement) + \return Time between screen updates. + **/ + double GetFrameTime(); + + /*! + \brief Check Engine Paused State. + + Find out if engine timer is paused. + \return Paused State of engine. + **/ + bool IsPaused(); + + //////////////////////////// + //Event and Input Handling// + //////////////////////////// + + private: + //! bool describing Active or Inactive State of Game + bool mActive; + //! bool for checking if a Quit event has been detected + bool mQuit; + //! Pointer to array of Keys + Uint8 *mKeyPressed; + //! X Position of Mouse + int mMouseX; + //! Y Position of Mouse + int mMouseY; + //! Mouse Button Information + Uint8 mMouseB; + + public: + /*! + \brief Find out if application is active. + + Function to find out if application currently has focus. + \return bool telling active/inactive state of application. + **/ + bool IsActive(); + + /*! + \brief Request A Quit. + + Tell the engine that it should behave as if a Quit was requested, does not call + any shutdown functions. + **/ + void RequestQuit(); + + /*! + \brief Find out if user has requested to quit. + + Function to find out if user or operating system has requested program cease execution, can be + set by Alt-F4, SDL_Quit event or ZEngine::RequestQuit(). + \return bool telling if quit has been requested. + **/ + bool QuitRequested(); + + /*! + \brief Find the state of a key. + + Function returns true/false based on if key is pressed or not. + \param key code of key to find status of. + \return bool state of requested key. + **/ + bool KeyIsPressed(SDLKey key); + + /*! + \brief Hide mouse cursor. + + Hide the system mouse cursor. + **/ + void HideCursor(); + + /*! + \brief Show mouse cursor. + + Show the system mouse cursor. + **/ + void ShowCursor(); + + /*! + \brief Get X Position of Mouse. + + Find X Position of Mouse on screen. + \return X Position of Mouse. + **/ + int GetMouseX(); + + /*! + \brief Get Y Position of Mouse. + + Find Y Position of Mouse on screen. + \return Y Position of Mouse. + **/ + int GetMouseY(); + + /*! + \brief Get Status of Left Button. + + Get pressed status of left button of mouse. + \return true if left button is pressed, false otherwise. + **/ + bool LButtonPressed(); + + /*! + \brief Get Status of Right Button. + + Get pressed status of right button of mouse. + \return true if right button is pressed, false otherwise. + **/ + bool RButtonPressed(); + + /*! + \brief Check if mouse is in given rectangle. + + Return status of mouse in current rectangle (used for buttons) + \param rect Rectangle to check if mouse is in. + \return true if mouse is in rectangle, false otherwise + **/ + bool MouseInRect(SDL_Rect *rect); + + /*! + \brief Check for Activation, Window Manager, and Quit Events. + + Cycle through event queue, processing events, updating all Event Related variables, should be called once per frame. + **/ + void CheckEvents(); + +#ifdef USE_PHYSFS + //////////////////// + //Physfs Utilities// + //////////////////// + public: + /*! + \brief Initialize PhysicsFS + + Sets up PhysicsFS, must be called when application is started. + \param argv argv[0] from application's main. + **/ + void InitPhysFS(string argv); + + /*! + \brief Add Directory to PhysFS Search Path. + + Add Directory to PhysicsFS search path, the path it looks in for files when attempting to load. + \param dir Directory to add to search path. + **/ + void AddPhysFSDir(string dir); + +#endif //USE_PHYSFS + + + //////////////////////////// + //Data Loading + Unloading// + //////////////////////////// + public: + /*! + \brief Load an Image. + + Loads an Image to an ImageData class which keeps vital information on the Image. + \param filename path to file to load. + \return A ImageData class containing filename and pointer to data. + **/ + ImageData LoadImage(string filename); + + /*! + \brief Free an Image. + + Free memory of an Image in an ImageData class. + \param image ImageData structure of image to free. + **/ + void FreeImage(ImageData &image); + +#ifdef USE_SDL_MIXER + /*! + \brief Load a Sound + + Loads a Sound to a SoundData class which keeps vital information on the Sound + \param filename path to file to load. + \return A SoundData class containing filename and pointer to data. + **/ + SoundData LoadSound(string filename); + + /*! + \brief Free a Sound. + + Free memory of a Sound in a SoundData class. + \param sound SoundData structure of sound to free. + **/ + void FreeSound(SoundData &sound); + + /*! + \brief Load a Music File + + Loads a Music Clip to a MusicData class which keeps vital information on the Music Data + \param filename path to file to load. + \return A MusicData class containing filename and pointer to data. + **/ + MusicData LoadMusic(string filename); + + /*! + \brief Free a Music Sample. + + Free memory of Music in a MusicData class. + \param music MusicData structure of music to free. + **/ + void FreeMusic(MusicData &music); +#endif + +#ifdef USE_SDL_TTF + /*! + \brief Load a Font. + + Loads a Font to a FontData class which keeps vital information on the Font + \param filename path to file to load. + \param size point size of font + \return A FontData class containing filename and pointer to data. + **/ + FontData LoadFont(string filename, int size); + + /*! + \brief Free a Font. + + Free memory of a Font in a FontData class. + \param font FontData structure of font to free. + **/ + void FreeFont(FontData &font); +#endif + + ///////////// + //Accessors// + ///////////// + + public: + /*! + \brief Get Current Display Width. + + Get Width of Window or Fullscreen mode. + \return Width of Display. + **/ + int GetWidth(); + + /*! + \brief Get Current Display Height. + + Get Height of Window or Fullscreen mode. + \return Height of Display. + **/ + int GetHeight(); + + /*! + \brief Get Current Display BPP. + + Get BPP of Window or Fullscreen mode. + \return BPP of Display. + **/ + int GetBPP(); + + /*! + \brief Get Fullscreen setting. + + Get Fullscreen setting of Display. + \return True if Fullscreen, False if Windowed + **/ + bool IsFullscreen(); +}; + +} + +#endif //__ze_zengine_h__ diff --git a/include/ZE_ZFont.h b/include/ZE_ZFont.h new file mode 100644 index 0000000..dd1458c --- /dev/null +++ b/include/ZE_ZFont.h @@ -0,0 +1,230 @@ +/******************************************************************************* + This file is Part of the ZEngine Library for SDL Game Development. + Copyright (C) 2002 ConceptOfZero.net + + Licensed under the BSD License, see licensing.txt. + + The maintainer of this library is James Turk (jturk@conceptofzero.net) + and the home of this Library is http://www.conceptofzero.net/ +*******************************************************************************/ + +/*! +\par File Header: +File: ZE_ZFont.h
+Description: Header file for core ZEngine Font Object.
+Author(s): James Turk
+$Id: ZE_ZFont.h,v 1.1 2002/11/21 05:41:10 cozman Exp $
+ + \file ZE_ZFont.h + \brief Definition file for ZFont. + + Definition file for ZFont, the basic Font class for ZEngine. +**/ + +#ifndef __ze_zfont_h__ +#define __ze_zfont_h__ + +#include "ZE_ZObject.h" +#include "ZE_ZImage.h" + +#ifdef USE_SDL_TTF + +namespace ZE +{ + +/*! + \brief ZFont class for basic Font use. + + ZFont font container class, class wraps common features of SDL_TTF. Inherited from ZObject. +**/ +class ZFont : public ZObject +{ + protected: + //! Class containing font and filename. + FontData rFont; + //! SDL_Color for current text color. + SDL_Color rColor; + //! SDL_Color for background color to be used in shaded draws. + SDL_Color rBGColor; + + public: + + /////////////////////// + //Opening and Closing// + /////////////////////// + + /*! + \brief Default Constructor. + + Default Constructor, does nothing. + **/ + ZFont(); + + /*! + \brief Constructor that opens a font with a certain size. + + Constructor simply calls ZFont::Open() with same parameters. + \param filename Font to open. + \param size Size to use for font. + **/ + ZFont(string filename, int size); + + /*! + \brief Destructor, frees memory. + + Destructor calls ZFont::Release(). + **/ + ~ZFont(); + + /*! + \brief Opens a font with a certain size. + + Opens a font given a filename and a point size. + \param filename Font to open. + \param size Size to use for font. + **/ + void Open(string filename, int size); + + /*! + \brief Release font. + + Release memory held by font. + **/ + void Release(); + + //////////////////////// + //Settings and Drawing// + //////////////////////// + + /*! + \brief Draws a string in a color to a ZImage. + + Draw to a surface in specified color and associate that surface with a ZImage. + \param text String to write. + \param image ZImage to draw to. + **/ + void DrawText(string text, ZImage &image); + + /*! + \brief Draws a string with a colored background to a ZImage. + + Draw to a surface a string with a background of rBGColor and lettering in the normal color and associate that surface with a ZImage. + \param text String to write. + \param image ZImage to draw to. + **/ + void DrawShadedText(string text, ZImage &image); + + /*! + \brief Set Text rColor. + + Set rColor of Text Output. + \param r Red component of color (0-255). + \param g Green component of color (0-255). + \param b Blue component of color (0-255). + **/ + void SetColor(Uint8 r, Uint8 g, Uint8 b); + + /*! + \brief Set Background rColor. + + Set rColor of Background for Shaded Draw. + \param r Red component of color (0-255). + \param g Green component of color (0-255). + \param b Blue component of color (0-255). + **/ + void SetBGColor(Uint8 r, Uint8 g, Uint8 b); + + /*! + \brief Set display format. + + Set display format (bold, italic, underline). + \param bold Decides bold setting of font. + \param italic Decides italic setting of font. + \param underline Decides underline setting of font. + **/ + void SetStyle(bool bold, bool italic, bool underline); + + /*! + \brief Resize Font. + + Release and Reopen font in new size. + \param size New size for font. + **/ + void Resize(int size); + + ///////////// + //Accessors// + ///////////// + + /*! + \brief Check if file is loaded. + + Check if file is loaded and pointer to data is non-NULL. + \return Loaded or Unloaded state of data. + **/ + bool IsLoaded(); + + /*! + \brief Get Bold Setting. + + Check if font output is currently bold. + \return True or False state of bold. + **/ + bool IsBold(); + + /*! + \brief Get Italic Setting. + + Check if font output is currently italic. + \return True or False state of italic. + **/ + bool IsItalic(); + + /*! + \brief Get Underlined Setting. + + Check if font output is currently underline. + \return True or False state of underline. + **/ + bool IsUnderlined(); + + /*! + \brief Get Height of Font. + + Check font height as reported by SDL_ttf. + \return Height of font. + **/ + int GetHeight(); + + /*! + \brief Get Line Skip for Font. + + Check font line skip as reported by SDL_ttf. + \return Recommended Line Skip of font. + **/ + int GetLineSkip(); + + /*! + \brief Get String Width. + + Get Width of String in Current Font in Pixels. + \param text String to get width of. + \return Width of String in Current font. + **/ + int GetStringWidth(string text); + + /*! + \brief Get String Height. + + Get Height of String in Current Font in Pixels. + \param text String to get height of. + \return Height of String in Current font. + **/ + int GetStringHeight(string text); +}; + +} + +#endif //USE_SDL_TTF + +#endif //__ze_zfont_h__ diff --git a/include/ZE_ZImage.h b/include/ZE_ZImage.h new file mode 100644 index 0000000..378be7e --- /dev/null +++ b/include/ZE_ZImage.h @@ -0,0 +1,201 @@ +/******************************************************************************* + This file is Part of the ZEngine Library for SDL Game Development. + Copyright (C) 2002 ConceptOfZero.net + + Licensed under the BSD License, see licensing.txt. + + The maintainer of this library is James Turk (jturk@conceptofzero.net) + and the home of this Library is http://www.conceptofzero.net/ +*******************************************************************************/ + +/*! +\par File Header: +File: ZE_ZImage.h
+Description: Header file for core ZEngine Image Object.
+Author(s): James Turk
+$Id: ZE_ZImage.h,v 1.1 2002/11/21 05:41:10 cozman Exp $
+ + \file ZE_ZImage.h + \brief Definition file for ZImage. + + Definition file for ZImage, the basic Image class for ZEngine. +**/ + +#ifndef __ze_zimage_h__ +#define __ze_zimage_h__ + +#include "ZE_ZObject.h" + +namespace ZE +{ + +/*! + \brief ZImage class for basic Image use. + + ZImage image drawing class, class wraps common features of SDL_Surface. Inherited from ZObject. +**/ +class ZImage : public ZObject +{ + protected: + //! Class containing image and filename. + ImageData rImage; + public: + + /*! + \brief Default Constructor. + + Default Constructor, does nothing. + **/ + ZImage(); + + /*! + \brief Constructor to Construct from File. + + Constructor is same as calling ZImage::Open() on passed filename. + \param filename File to open as rImage. + **/ + ZImage(string filename); + + /*! + \brief Constructor to Construct from SDL_Surface*. + + Constructor is same as calling ZImage::Attach() on passed SDL_Surface*. + \param surface SDL_Surface* to use as rImage. + **/ + ZImage(SDL_Surface *surface); + + /*! + \brief Constructor to Construct from part of an SDL_Surface*. + + Constructor is same as calling ZImage::OpenFromImage. + + \param img Image to take new image from. + \param x X Coordinate in source of top left corner. + \param y Y Coordinate in source of top left corner. + \param w Width of new image. + \param h Height of new image. + **/ + ZImage(SDL_Surface *img, Sint16 x, Sint16 y, Sint16 w, Sint16 h); + + /*! + \brief Destructor, frees memory. + + Destructor calls ZImage::Release(). + **/ + ~ZImage(); + + /////////////////////// + //Opening and Closing// + /////////////////////// + + /*! + \brief Opens a file. + + Open a file using ZEngine. Loads into rImage member of class. + \param filename File to open as rImage. + **/ + void Open(string filename); + + /*! + \brief Cuts part of an existing image to create the new image. + + Cut part of an SDL_Surface to create a new Image. + + \param img Image to take new image from. + \param x X Coordinate in source of top left corner. + \param y Y Coordinate in source of top left corner. + \param w Width of new image. + \param h Height of new image. + **/ + void OpenFromImage(SDL_Surface *img, Sint16 x, Sint16 y, Sint16 w, Sint16 h); + + /*! + \brief Attach an existing surface to class. + + Attach a pointer to instance of ZImage. (NOTE: Should not be used on a surface that is owned elsewhere.) + \param surface SDL_Surface* to use as rImage. + **/ + void Attach(SDL_Surface *surface); + + /*! + \brief Releases image. + + Frees memory via call to SDL_FreeSurface for the image. + **/ + void Release(); + + //////////// + //Graphics// + //////////// + + /*! + \brief Sets Alpha (transparency) value of Image. + + Set Alpha channel of an Image, only used in 32 bit mode. + \param alpha Number 0-255 describing translucency of image. (0 = transparent, 255 = opaque) + **/ + void SetAlpha(Uint8 alpha); + + /*! + \brief Set Color Key (transparent color) of Image. + + Set color which will not be drawn in image. + \param color Uint32 color describing color to use as transparent. + **/ + void SetColorKey(Uint32 color); + + /*! + \brief Draw Image to Screen. + + Draw Image to screen at specified location. + \param x X coord to draw Image to. + \param y Y coord to draw Image to. + **/ + void Draw(Sint16 x, Sint16 y); + + ///////////// + //Accessors// + ///////////// + + /*! + \brief Check if file is loaded. + + Check if file is loaded and pointer to data is non-NULL. + \return Loaded or Unloaded state of data. + **/ + bool IsLoaded(); + + /*! + \brief Get SDL_Surface. + Get SDL_Surface pointer to actual image data. + \return SDL_Surface* of rImage. + **/ + SDL_Surface *GetImage(); + + /*! + \brief Get Width. + + Get Width of Image. + \return Image Width. + **/ + int GetWidth(); + + /*! + \brief Get Height. + + Get Height of Image. + \return Image Height. + **/ + int GetHeight(); + + /*! + \brief Get filename of image. + + Get filename of image or if Image doesn't have a specific filename string describing origin of image. + \return Image Filename. + **/ + string GetFilename(); +}; +} + +#endif //__ze_zimage_h__ diff --git a/include/ZE_ZMusic.h b/include/ZE_ZMusic.h new file mode 100644 index 0000000..ab5d87c --- /dev/null +++ b/include/ZE_ZMusic.h @@ -0,0 +1,183 @@ +/******************************************************************************* + This file is Part of the ZEngine Library for SDL Game Development. + Copyright (C) 2002 ConceptOfZero.net + + Licensed under the BSD License, see licensing.txt. + + The maintainer of this library is James Turk (jturk@conceptofzero.net) + and the home of this Library is http://www.conceptofzero.net/ +*******************************************************************************/ + +/*! +\par File Header: +File: ZE_ZMusic.h
+Description: Header file for core ZEngine Music Wrapper Object.
+Author(s): James Turk
+$Id: ZE_ZMusic.h,v 1.1 2002/11/21 05:41:11 cozman Exp $
+ + \file ZE_ZMusic.h + \brief Definition file for ZMusic. + + Definition file for ZMusic, the Music file wrapper for ZEngine. +**/ + +#ifndef __ze_zmusic_h__ +#define __ze_zmusic_h__ + +#include "ZE_ZObject.h" + +#ifdef USE_SDL_MIXER + +namespace ZE +{ + +/*! + \brief ZMusic class for playing full length music (eg. ogg or wav). + + ZMusic music class, class wraps common features for SDL_Mixer's Mix_Music. Inherited from ZObject. +**/ +class ZMusic : public ZObject +{ + protected: + //! Class containing music data and music filename. + MusicData rMusic; + + public: + //! Static Variable For Infinite loop of sound. (Defined as -1) + static const int LoopInfinite; + + /////////////////////// + //Opening and Closing// + /////////////////////// + + /*! + \brief Default Constructor. + + Default Constructor, does nothing. + **/ + ZMusic(); + + /*! + \brief Constructor that opens a music file. + + Constructor simply calls ZMusic::Open() with same filename. (WAV,MOD,MID,OGG) + \param filename Music to open. + **/ + ZMusic(string filename); + + /*! + \brief Destructor, frees memory. + + Destructor calls ZMusic::Release(). + **/ + ~ZMusic(); + + /*! + \brief Opens a music file. + + Open a music file to be used. + \param filename Music to open. + **/ + void Open(string filename); + + /*! + \brief Release music. + + Release memory held by music data. + **/ + void Release(); + + ///////////////// + //Play Controls// + ///////////////// + + /*! + \brief Play currently loaded music. + + Play music currently loaded in ZMusic, looping loopNum times. (use ZMusic::LoopInfinite to loop forever.) + If fade is not zero (which it defaults to) music will fade in over specified number of milliseconds. + \param loopNum Number of times to loop song, defaults to zero. + \param fadeTime Milliseconds to fade to full volume, defaults to zero for no fade. + **/ + void Play(int loopNum=0, int fadeTime=0); + + /*! + \brief Pause music. + + Pause currently playing music. + **/ + void Pause(); + + /*! + \brief Unpause music. + + Unpause currently paused music. + **/ + void Unpause(); + + /*! + \brief Rewind music. + + Rewind music to beginning. + **/ + void Rewind(); + + /*! + \brief Stop music. + + Stop currently playing music, if fadeTime is not zero, fade out over specified time. + \param fadeTime Milliseconds to fade out over, defaults to zero for immediate stop. + **/ + void Stop(int fadeTime=0); + + /*! + \brief Change Volume. + + Change volume of currently playing music. + \param volume Volume to change to, can be in a range from 0 to 128 + **/ + void SetVolume(int volume); + + ///////////// + //Accessors// + ///////////// + + /*! + \brief Check if file is loaded. + + Check if file is loaded and pointer to data is non-NULL. + \return Loaded or Unloaded state of data. + **/ + bool IsLoaded(); + + /*! + \brief Check if music is Playing. + + Check if music is playing, specifically if it is not stopped. (Paused state should be checked for by IsPaused) + \return Playing / Not Playing State of Music. + **/ + bool IsPlaying(); + + /*! + \brief Check if music is Paused. + + Check if music is "playing" but currently paused. + \return Paused / Not Paused State of Music. + **/ + bool IsPaused(); + + /*! + \brief Find Current Volume of Music. + + Get current volume of music represented as a value from 0-128. + \return Volume of music, 0-128. + **/ + int GetVolume(); +}; + + +} + +#endif //USE_SDL_MIXER + +#endif //__ze_zmusic_h__ diff --git a/include/ZE_ZObject.h b/include/ZE_ZObject.h new file mode 100644 index 0000000..2b0c7b2 --- /dev/null +++ b/include/ZE_ZObject.h @@ -0,0 +1,58 @@ +/******************************************************************************* + This file is Part of the ZEngine Library for SDL Game Development. + Copyright (C) 2002 ConceptOfZero.net + + Licensed under the BSD License, see licensing.txt. + + The maintainer of this library is James Turk (jturk@conceptofzero.net) + and the home of this Library is http://www.conceptofzero.net/ +*******************************************************************************/ + +/*! +\par File Header: +File: ZE_ZObject.h
+Description: Header file for ZEngine core Object ZObject, base of most ZEngine objects.
+Author(s): James Turk
+$Id: ZE_ZObject.h,v 1.1 2002/11/21 05:41:11 cozman Exp $
+ + \file ZE_ZObject.h + \brief Definition file for ZObject Base Class. + + Definition file for ZObject the Virtual Base Class for majority of the ZEngine Objects. +**/ + +#ifndef __ze_zobject_h__ +#define __ze_zobject_h__ + +#include "ZE_ZEngine.h" + +namespace ZE +{ +/*! + \brief ZObject base class for other ZEngine objects. + + This is the base class from which all ZEngine internal objects are derived from. +**/ +class ZObject +{ + protected: + //! Pointer to ZEngine Object + ZEngine* rEngine; + public: + /*! + \brief ZEngine Constructor. + + ZEngine Constructor, gets Engine pointer for Object. + **/ + ZObject() { rEngine = ZEngine::GetInstance(); }; + + /*! + \brief ZEngine Virtual destructor. + + ZEngine destructor, provided to make class safely inheritable. + **/ + virtual ~ZObject() {}; +}; +} + +#endif //__ze_zobject_h__ diff --git a/include/ZE_ZRect.h b/include/ZE_ZRect.h new file mode 100644 index 0000000..ebce462 --- /dev/null +++ b/include/ZE_ZRect.h @@ -0,0 +1,244 @@ +/******************************************************************************* + This file is Part of the ZEngine Library for SDL Game Development. + Copyright (C) 2002 ConceptOfZero.net + + Licensed under the BSD License, see licensing.txt. + + The maintainer of this library is James Turk (jturk@conceptofzero.net) + and the home of this Library is http://www.conceptofzero.net/ +*******************************************************************************/ + +/*! +\par File Header: +File: ZE_ZRect.h
+Description: Header file for core ZEngine Rectangle Object.
+Author(s): James Turk
+$Id: ZE_ZRect.h,v 1.1 2002/11/21 05:41:11 cozman Exp $
+ + \file ZE_ZRect.h + \brief Definition file for ZRect. + + Definition file for ZRect, the Rectangle class for ZEngine. +**/ + +#ifndef __ze_zrect_h__ +#define __ze_zrect_h__ + +#include "ZE_ZObject.h" //included even though ZRect isn't derived (to obtain all other needed headers) + +namespace ZE +{ + +/*! + \brief ZEngine class for simplified rectangle use. + + ZRect Rectangle class, used to define a rectangular area or perform operations on the defined area. +**/ +class ZRect +{ + private: + //! X Position of top left corner of rectangle. + int mX; + //! Y Position of top left corner of rectangle. + int mY; + //! Width of Rectangle. + int mWidth; + //! Height of Rectangle. + int mHeight; + + public: + + /*! + \brief Default constructor for ZRect. + + Default constructor, initializes all values to zero. + **/ + ZRect(); + + /*! + \brief Constructor for ZRect that takes inital values. + + Constructor for ZRect that takes inital values for all four members. + \param x Value for x position. + \param y Value for y position. + \param width Value for width. + \param height Value for height. + **/ + ZRect(int x, int y, int width, int height); + + /*! + \brief Copy constructor for ZRect. + + Takes a ZRect and constructs a new identical rectangle. + \param rhs Rectangle to construct from. + **/ + ZRect(const ZRect &rhs); + + /*! + \brief Overload for = operator with ZRect. + + Copies all values from one ZRect into another. + \param rhs Rectangle to copy values from. + \return New value of the ZRect. + **/ + const ZRect& operator=(const ZRect &rhs); + + /*! + \brief Overload for < operator with ZRect, based upon location then size. + + Rectangles are sorted by y value, followed by x value, if they start at the same place, + the smaller of the two is deemed less than the other. + \param rhs Rectangle to compare. + \return True if this rectangle is smaller than the rhs rectangle, false otherwise. + **/ + bool operator<(const ZRect &rhs) const; + + /*! + \brief Changes the location of the rectangle. + + Changes the current x,y position of the rectangle. + \param x New x position for rectangle. + \param y New y position for rectangle. + **/ + void Move(int x, int y); + + /*! + \brief Changes the location of the rectangle based upon the current location. + + Changes the current x,y position of the rectangle relative to the current location. + \param xMove Offset for new x position from current. + \param yMove Offset for new y position from current. + **/ + void MoveRel(int xMove, int yMove); + + /*! + \brief Resize rectangle. + + Changes the current width and height of the rectangle. + \param width New width for rectangle. + \param height New height for rectangle. + **/ + void Resize(int width, int height); + + /*! + \brief Grows or shrinks current rectangle. + + Changes the current width and height of the rectangle based upon current values. + \param widthChange Amount to add or subtract from width. + \param heightChange Amount to add or subtract from height. + **/ + void ResizeRel(int widthChange, int heightChange); + + /*! + \brief Check if one ZRect intersects another. + + Checks for overlap and returns boolean value based on if overlap exists. + \param rect Rectangle to check for intersection with. + \return True if intersection occured, false otherwise. + **/ + bool Intersects(const ZRect &rect) const; + + /*! + \brief Check if a rectangle contains a given point. + + Checks point against boundaries of rectangle and returns result. + \param x X value of point to check. + \param y Y value of poitn to check. + \return Boolean variable, true if point is inside rectangle, false otherwise. + **/ + bool Contains(int x, int y) const; + + /*! + \brief Check if a rectangle contains a given point. + + Checks point against boundaries of rectangle and returns result. + \param rect Rectangle to check for point. + \return Boolean variable, true if point is inside rectangle, false otherwise. + **/ + bool Contains(const ZRect &rect) const; + + /*! + \brief Finds intersection of two rectangles. + + Checks for intersection, and returns rectangle where the two rectangles intersect. + \param rect Rectangle to check intersection with. + \return ZRect describing intersection area. + **/ + ZRect Intersection(const ZRect &rect) const; + + /*! + \brief Returns an SDL_Rect representing the rectangle. + + Makes a SDL_Rect representing the rectangle, for use where functions require an SDL_Rect. + \return SDL_Rect representing the ZRect. + **/ + SDL_Rect SDLrect() const; + + /*! + \brief Returns X Location. + + Access private X location member. + \return Value of mX. + **/ + int X() const; + + /*! + \brief Returns Y Location. + + Access private Y location member. + \return Value of mY. + **/ + int Y() const; + + /*! + \brief Return position of left side. + + Find X position of left side of rectangle. + \return X position of left side. + **/ + int Left() const; + + /*! + \brief Return position of right side. + + Find X position of right side of rectangle. + \return X position of right side. + **/ + int Right() const; + + /*! + \brief Return position of top side. + + Find Y position of top side of rectangle. + \return Y position of top side. + **/ + int Top() const; + + /*! + \brief Return position of bottom side. + + Find Y position of left side of rectangle. + \return Y position of bottom side. + **/ + int Bottom() const; + + /*! + \brief Returns Width. + + Access private width member. + \return Value of mWidth. + **/ + int Width() const; + + /*! + \brief Returns Height. + + Access private height member. + \return Value of mHeight. + **/ + int Height() const; +}; + +} //namspace ZE + +#endif //__ze_zrect_h__ diff --git a/include/ZE_ZSound.h b/include/ZE_ZSound.h new file mode 100644 index 0000000..654fef0 --- /dev/null +++ b/include/ZE_ZSound.h @@ -0,0 +1,178 @@ +/******************************************************************************* + This file is Part of the ZEngine Library for SDL Game Development. + Copyright (C) 2002 ConceptOfZero.net + + Licensed under the BSD License, see licensing.txt. + + The maintainer of this library is James Turk (jturk@conceptofzero.net) + and the home of this Library is http://www.conceptofzero.net/ +*******************************************************************************/ + +/*! +\par File Header: +File: ZE_ZSound.h
+Description: Header file for core ZEngine Sound Wrapper Object.
+Author(s): James Turk
+$Id: ZE_ZSound.h,v 1.1 2002/11/21 05:41:12 cozman Exp $
+ + \file ZE_ZSound.h + \brief Definition file for ZSound. + + Definition file for ZSound, the Sound Effect wrapper for ZEngine. +**/ + +#ifndef __ze_zsound_h__ +#define __ze_zsound_h__ + +#include "ZE_ZObject.h" + +#ifdef USE_SDL_MIXER + +namespace ZE +{ + +/*! + \brief ZSound class for playing sound effects. (WAV) + + ZSound music class, class wraps common features for SDL_Mixer's Mix_Chunk. Inherited from ZObject. +**/ +class ZSound : public ZObject +{ + protected: + //! Class containing music data and music filename. + SoundData rSound; + //! Channel ID Number from SDL_Mixer. + int rChannelID; + + public: + //! Static Variable For Infinite loop of sound. (Defined as -1) + static const int LoopInfinite; + + /////////////////////// + //Opening and Closing// + /////////////////////// + + /*! + \brief Default Constructor. + + Default Constructor, does nothing. + **/ + ZSound(); + + /*! + \brief Constructor that opens a sound effect file. + + Constructor simply calls ZSound::Open() with same filename. (WAV,MOD,MID,OGG) + \param filename Sound effect to open. + **/ + ZSound(string filename); + + /*! + \brief Destructor, frees memory. + + Destructor calls ZSound::Release(). + **/ + ~ZSound(); + + /*! + \brief Opens a sound effect file. + + Open a music file to be used. + \param filename Music to open. + **/ + void Open(string filename); + + /*! + \brief Release sound effect. + + Release memory held by sample data. + **/ + void Release(); + + ///////////////// + //Play Controls// + ///////////////// + + /*! + \brief Play currently loaded sound effect. + + Play sound effect, looping loopNum times. (use ZSound::LoopInfinite to loop forever.) + If fade is not zero (which it defaults to) music will fade in over specified number of milliseconds. + \param loopNum Number of times to loop song, defaults to zero. + \param fadeTime Milliseconds to fade to full volume, defaults to zero for no fade. + **/ + void Play(int loopNum=0, int fadeTime=0); + + /*! + \brief Pause sound. + + Pause currently playing sound. + **/ + void Pause(); + + /*! + \brief Unpause sound. + + Unpause currently playing sound. + **/ + void Unpause(); + + /*! + \brief Stop sound. + + Stop currently playing sound, if fadeTime is not zero, fade out over specified time. + \param fadeTime Milliseconds to fade out over, defaults to zero for immediate stop. + **/ + void Stop(int fadeTime=0); + + /*! + \brief Change Volume. + + Change volume of currently playing sample. + \param volume Volume to change to, can be in a range from 0 to 128. + **/ + void SetVolume(int volume); + + ///////////// + //Accessors// + ///////////// + + /*! + \brief Check if file is loaded. + + Check if file is loaded and pointer to data is non-NULL. + \return Loaded or Unloaded state of data. + **/ + bool IsLoaded(); + + /*! + \brief Check if sound is Playing. + + Check if sound is playing, specifically if it is not stopped. (Paused state should be checked for by IsPaused) + \return Playing / Not Playing State of sound. + **/ + bool IsPlaying(); + + /*! + \brief Check if sound is Paused. + + Check if sound is "playing" but currently paused. + \return Paused / Not Paused State of Sound. + **/ + bool IsPaused(); + + /*! + \brief Find Current Volume of Sound Channel. + + Get current volume of sound channel represented as a value from 0-128. + \return Volume of sound channel, 0-128. + **/ + int GetVolume(); +}; + + +} + +#endif //USE_SDL_MIXER + +#endif //__ze_zsound_h__ diff --git a/include/ZE_ZTimer.h b/include/ZE_ZTimer.h new file mode 100644 index 0000000..3602129 --- /dev/null +++ b/include/ZE_ZTimer.h @@ -0,0 +1,107 @@ +/******************************************************************************* + This file is Part of the ZEngine Library for SDL Game Development. + Copyright (C) 2002 ConceptOfZero.net + + Licensed under the BSD License, see licensing.txt. + + The maintainer of this library is James Turk (jturk@conceptofzero.net) + and the home of this Library is http://www.conceptofzero.net/ +*******************************************************************************/ + +/*! +\par File Header: +File: ZE_ZTimer.h
+Description: Header file for core ZEngine Timer Object.
+Author(s): James Turk
+$Id: ZE_ZTimer.h,v 1.1 2002/11/21 05:41:12 cozman Exp $
+ + \file ZE_ZTimer.h + \brief Definition file for ZTimer. + + Definition file for ZTimer, the Timer class for ZEngine. +**/ + +#ifndef __ze_ztimer_h__ +#define __ze_ztimer_h__ + +#include "ZE_ZObject.h" + +namespace ZE +{ + +/*! + \brief ZTimer class for Timer use. + + ZTimer timing class, class wraps common features of SDL timer. Inherited from ZObject and tied to ZEngine main timer. +**/ +class ZTimer : public ZObject +{ + protected: + //! Paused / Unpaused state of Timer + bool rPaused; + //! Using ZEngine timer or SDL global timer. + bool rUseZEngine; + //! Total time this timer has been paused. + Uint32 rPausedTime; + //! Time this Timer was paused. + Uint32 rLastPause; + + /*! + \brief Get time from parent timer. + + Protected method to get time from whichever timer is parent. + \return Time on parent timer. + **/ + Uint32 GetParentTime(); + + public: + + /*! + \brief Constructs a new Timer. + + Sets TimePaused to current ZEngine time if useZEngine is true, otherwise uses SDL timer. + \param useZEngine Tells if timer should use ZEngine or SDL. + **/ + ZTimer(bool useZEngine=true); + + /*! + \brief Reset Timer. + + Set Timer back to Zero, will also unpause timer if it was paused. + **/ + void Reset(); + + /*! + \brief Pause Timer. + + Pause the timer if it is unpaused. + **/ + void Pause(); + + /*! + \brief Unpause Timer. + + Unpause the timer if it is paused. + **/ + void Unpause(); + + /*! + \brief Get Time of Timer. + + Get current time accounting for time paused. + \return Current Timer Time. + **/ + Uint32 GetTime(); + + /*! + \brief Get paused state. + + Find out paused state of timer. + \return Paused state for timer. + **/ + bool IsPaused(); +}; + +} + +#endif //__ze_ztimer_h__ diff --git a/include/ZEngine.h b/include/ZEngine.h new file mode 100644 index 0000000..34e27ef --- /dev/null +++ b/include/ZEngine.h @@ -0,0 +1,54 @@ +/*! +\par File Header: +File: ZEngine.h
+Description: Public Header File for ZEngine.
+Author(s): James Turk
+$Id: ZEngine.h,v 1.1 2002/11/21 05:41:10 cozman Exp $
+ + \file ZEngine.h + \brief Header file for ZEngine. + + Header file for ZEngine Game Engine from Concept of Zero, this is the file that programs that wish to + utilize ZEngine should include. +**/ + +/*! + \mainpage ZEngine Documentation + + \author James Turk + \version 0.7.5 + \date 21 November, 2002 + + \section ZEngine About ZEngine +
+ ZEngine is designed to wrap common interfaces of the SDL API in an Object Oriented manner. It is licensed under + a very liberal BSD-style license, and anyone is free to suggest or implement changes to be added to the Engine. In addition + ZEngine hopes to provide a core engine which can be used to develop a game without having to rewrite large amounts + of code. + + \section Licensing Licensing +
+         This file is Part of the ZEngine Library for SDL Game Development.
+                      Copyright (C) 2002 ConceptOfZero.net
+
+             Licensed under the BSD License, see licensing.txt.
+
+    The maintainer of this library is James Turk (james@conceptofzero.net) 
+         and the home of this Library is http://www.conceptofzero.net/
+     
+ \section Authors Contributing Authors + James Turk james@conceptofzero.net - Core Engine and Classes for Data Types +**/ + +#include "ZE_ZEngine.h" +#include "ZE_ZImage.h" +#include "ZE_ZTimer.h" +#include "ZE_ZConfigFile.h" +#include "ZE_ZRect.h" +#ifdef USE_SDL_TTF +#include "ZE_ZFont.h" +#endif +#ifdef USE_SDL_MIXER +#include "ZE_ZSound.h" +#include "ZE_ZMusic.h" +#endif diff --git a/include/external/physfsrwops.h b/include/external/physfsrwops.h new file mode 100644 index 0000000..9f58c89 --- /dev/null +++ b/include/external/physfsrwops.h @@ -0,0 +1,80 @@ +/* + * This code provides a glue layer between PhysicsFS and Simple Directmedia + * Layer's (SDL) RWops i/o abstraction. + * + * License: this code is public domain. I make no warranty that it is useful, + * correct, harmless, or environmentally safe. + * + * This particular file may be used however you like, including copying it + * verbatim into a closed-source project, exploiting it commercially, and + * removing any trace of my name from the source (although I hope you won't + * do that). I welcome enhancements and corrections to this file, but I do + * not require you to send me patches if you make changes. + * + * Unless otherwise stated, the rest of PhysicsFS falls under the GNU Lesser + * General Public License: http://www.gnu.org/licenses/lgpl.txt + * + * SDL falls under the LGPL, too. You can get SDL at http://www.libsdl.org/ + * + * This file was written by Ryan C. Gordon. (icculus@clutteredmind.org). + */ + +#ifndef _INCLUDE_PHYSFSRWOPS_H_ +#define _INCLUDE_PHYSFSRWOPS_H_ + +#include +#include + +/** + * Open a platform-independent filename for reading, and make it accessible + * via an SDL_RWops structure. The file will be closed in PhysicsFS when the + * RWops is closed. PhysicsFS should be configured to your liking before + * opening files through this method. + * + * @param filename File to open in platform-independent notation. + * @return A valid SDL_RWops structure on success, NULL on error. Specifics + * of the error can be gleaned from PHYSFS_getLastError(). + */ +SDL_RWops *PHYSFSRWOPS_openRead(const char *fname); + +/** + * Open a platform-independent filename for writing, and make it accessible + * via an SDL_RWops structure. The file will be closed in PhysicsFS when the + * RWops is closed. PhysicsFS should be configured to your liking before + * opening files through this method. + * + * @param filename File to open in platform-independent notation. + * @return A valid SDL_RWops structure on success, NULL on error. Specifics + * of the error can be gleaned from PHYSFS_getLastError(). + */ +SDL_RWops *PHYSFSRWOPS_openWrite(const char *fname); + +/** + * Open a platform-independent filename for appending, and make it accessible + * via an SDL_RWops structure. The file will be closed in PhysicsFS when the + * RWops is closed. PhysicsFS should be configured to your liking before + * opening files through this method. + * + * @param filename File to open in platform-independent notation. + * @return A valid SDL_RWops structure on success, NULL on error. Specifics + * of the error can be gleaned from PHYSFS_getLastError(). + */ +SDL_RWops *PHYSFSRWOPS_openAppend(const char *fname); + +/** + * Make a SDL_RWops from an existing PhysicsFS file handle. You should + * dispose of any references to the handle after successful creation of + * the RWops. The actual PhysicsFS handle will be destroyed when the + * RWops is closed. + * + * @param handle a valid PhysicsFS file handle. + * @return A valid SDL_RWops structure on success, NULL on error. Specifics + * of the error can be gleaned from PHYSFS_getLastError(). + */ +SDL_RWops *PHYSFSRWOPS_makeRWops(PHYSFS_file *handle); + + +#endif /* include-once blocker */ + +/* end of physfsrwops.h ... */ + diff --git a/licensing.txt b/licensing.txt new file mode 100644 index 0000000..4ea798b --- /dev/null +++ b/licensing.txt @@ -0,0 +1,38 @@ +Copyright (c) James Turk, 2002 +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, + are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + * Neither the name of the Concept of Zero nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR +ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +In this distribution all files which fall under the license are marked as such with +the following notice: + +/******************************************************************************* + This file is Part of the ZEngine Library for SDL Game Development. + Copyright (C) 2002 ConceptOfZero.net + + Licensed under the BSD License, see licensing.txt. + + The maintainer of this library is James Turk (james@conceptofzero.net) + and the home of this Library is http://www.conceptofzero.net/ +*******************************************************************************/ \ No newline at end of file diff --git a/makefile b/makefile new file mode 100644 index 0000000..a00026e --- /dev/null +++ b/makefile @@ -0,0 +1,22 @@ +CC=g++ +CFLAGS=-O2 -W -Wall -I"/usr/include/SDL" -I"/home/James/ZEngine-dev/include" -L"/usr/lib/SDL" -L"/home/James/ZEngine-dev/lib" +LIBS=-lZEngineS -lSDL_mixer -lSDL_image -lSDL_ttf -lSDLmain -lSDL + +ZEngineS.a: src/ZE_ZTimer.cpp src/ZE_ZImage.cpp src/ZE_ZFont.cpp src/ZE_ZMusic.cpp src/ZE_ZConfigFile.cpp src/ZE_ZSound.cpp src/ZE_ZMusic.cpp src/ZE_ZRect.cpp src/ZE_Error.cpp src/ZE_ZEngine.cpp + $(CC) $(CFLAGS) -c src/ZE_ZTimer.cpp src/ZE_ZImage.cpp src/ZE_ZFont.cpp src/ZE_ZMusic.cpp src/ZE_ZConfigFile.cpp src/ZE_ZSound.cpp src/ZE_ZMusic.cpp src/ZE_ZRect.cpp src/ZE_Error.cpp src/ZE_ZEngine.cpp + ar rcs lib/libZEngineS.a ZE_ZTimer.o ZE_ZImage.o ZE_ZFont.o ZE_ZMusic.o ZE_ZConfigFile.o ZE_ZSound.o ZE_ZMusic.o ZE_Error.o ZE_ZRect.o ZE_ZEngine.o + +tests: test/ZFontTest.cpp test/ZMouseTest.cpp test/ZMusicTest.cpp test/ZSoundTest.cpp test/ZTimerTest.cpp test/ZImageTest.cpp test/ZRectTest.cpp + $(CC) $(CFLAGS) test/ZFontTest.cpp -o test/bin/ZFontTest $(LIBS) + $(CC) $(CFLAGS) test/ZMouseTest.cpp -o test/bin/ZMouseTest $(LIBS) + $(CC) $(CFLAGS) test/ZMusicTest.cpp -o test/bin/ZMusicTest $(LIBS) + $(CC) $(CFLAGS) test/ZSoundTest.cpp -o test/bin/ZSoundTest $(LIBS) + $(CC) $(CFLAGS) test/ZTimerTest.cpp -o test/bin/ZTimerTest $(LIBS) + $(CC) $(CFLAGS) test/ZImageTest.cpp -o test/bin/ZImageTest $(LIBS) + $(CC) $(CFLAGS) test/ZRectTest.cpp -o test/bin/ZRectTest $(LIBS) + +.PHONY: clean + +clean: + rm *.o + diff --git a/makefile.mingw32 b/makefile.mingw32 new file mode 100644 index 0000000..44a368a --- /dev/null +++ b/makefile.mingw32 @@ -0,0 +1,20 @@ +CC=g++ +CFLAGS=-O2 -W -Wall -pedantic -I"c:/zengine-dev/include/" -L"c:/zengine-dev/lib/" +LIBS=-lmingw32 -mwindows -lZEngine -lSDL_mixer -lSDL_ttf -lSDLmain -lSDL + +zengine.a: src/ZE_ZTimer.cpp src/ZE_ZImage.cpp src/ZE_ZFont.cpp src/ZE_ZMusic.cpp src/ZE_ZConfigFile.cpp src/ZE_ZSound.cpp src/ZE_ZMusic.cpp src/ZE_Error.cpp src/ZE_ZEngine.cpp + $(CC) $(CFLAGS) -c src/ZE_ZTimer.cpp src/ZE_ZImage.cpp src/ZE_ZFont.cpp src/ZE_ZMusic.cpp src/ZE_ZConfigFile.cpp src/ZE_ZSound.cpp src/ZE_ZMusic.cpp src/ZE_Error.cpp src/ZE_ZEngine.cpp + ar rcs lib/libZEngine.a ZE_ZTimer.o ZE_ZImage.o ZE_ZFont.o ZE_ZMusic.o ZE_ZConfigFile.o ZE_ZSound.o ZE_ZMusic.o ZE_Error.o ZE_ZEngine.o + +tests: test/ZFontTest.cpp test/ZMouseTest.cpp test/ZMusicTest.cpp test/ZSoundTest.cpp test/ZTimerTest.cpp test/ZImageTest.cpp + $(CC) $(CFLAGS) test/ZFontTest.cpp -o test/bin/ZFontTest.exe $(LIBS) + $(CC) $(CFLAGS) test/ZMouseTest.cpp -o test/bin/ZMouseTest.exe $(LIBS) + $(CC) $(CFLAGS) test/ZMusicTest.cpp -o test/bin/ZMusicTest.exe $(LIBS) + $(CC) $(CFLAGS) test/ZSoundTest.cpp -o test/bin/ZSoundTest.exe $(LIBS) + $(CC) $(CFLAGS) test/ZTimerTest.cpp -o test/bin/ZTimerTest.exe $(LIBS) + $(CC) $(CFLAGS) test/ZImageTest.cpp -o test/bin/ZImageTest.exe $(LIBS) + +.PHONY: clean + +clean: + rm *.o \ No newline at end of file diff --git a/readme-external.txt b/readme-external.txt new file mode 100644 index 0000000..4190736 --- /dev/null +++ b/readme-external.txt @@ -0,0 +1 @@ +Files in the src/external and include/external directories are not part of ZEngine, but may be used by ZEngine to interface with external libraries. Such files are only modified to be compatible with ZEngine and marked where such modifcations occur. \ No newline at end of file diff --git a/src/ZE_Error.cpp b/src/ZE_Error.cpp new file mode 100644 index 0000000..edc7793 --- /dev/null +++ b/src/ZE_Error.cpp @@ -0,0 +1,53 @@ +/******************************************************************************* + This file is Part of the ZEngine Library for SDL Game Development. + Copyright (C) 2002 ConceptOfZero.net + + Licensed under the BSD License, see licensing.txt. + + The maintainer of this library is James Turk (james@conceptofzero.net) + and the home of this Library is http://www.conceptofzero.net/ +*******************************************************************************/ + +/*! +\par File Header: +File: ZE_Error.cpp
+Description: Implementation source file for ZEngine error logging utility functions.
+Author(s): James Turk
+$Id: ZE_Error.cpp,v 1.1 2002/11/21 05:41:12 cozman Exp $
+ + \file ZE_Error.cpp + \brief Source file for error logging utilities. + + Error logging utilities for ZEngine and programs making use of ZEngine. +**/ + +#include "ZE_Error.h" + +namespace ZE +{ + +string _GetError(int line, string file, string str) +{ + return FormatStr("%s (Line %d)\n Message Was: %s \n",file.c_str(),line,str.c_str()); +} + +void _LogError(int line, string file, string str) +{ + string errstr = _GetError(line,file,str); +#ifdef DEBUG_STREAM + fprintf(stderr,errstr.c_str()); //this line writes the actual debug info +#endif +} + +string FormatStr(const char *fmtstr, ...) +{ + char buf[512]; + va_list args; + + va_start(args,fmtstr); + vsprintf(buf, fmtstr, args); + va_end(args); + return buf; +} + +} diff --git a/src/ZE_ZConfigFile.cpp b/src/ZE_ZConfigFile.cpp new file mode 100644 index 0000000..022a672 --- /dev/null +++ b/src/ZE_ZConfigFile.cpp @@ -0,0 +1,326 @@ +/******************************************************************************* + This file is Part of the ZEngine Library for SDL Game Development. + Copyright (C) 2002 ConceptOfZero.net + + Licensed under the BSD License, see licensing.txt. + + The maintainer of this library is James Turk (james@conceptofzero.net) + and the home of this Library is http://www.conceptofzero.net/ +*******************************************************************************/ + +/*! +\par File Header: +File: ZE_ZConfigFile.cpp
+Description: Implementation source file for ZConfigFile, the ZEngine INI-Style Config File.
+Author(s): James Turk
+$Id: ZE_ZConfigFile.cpp,v 1.1 2002/11/21 05:41:12 cozman Exp $
+ + \file ZE_ZConfigFile.cpp + \brief Source file for ZConfigFile. + + Implementation of ZConfigFile, the ZEngine INI-Style Config File. +**/ + +#include "ZE_ZConfigFile.h" + +namespace ZE +{ + +string ZConfigFile::CleanString(string str) +{ + string tmpStr; + bool inQuotes = false; + + //cycle through, only copy spaces and if a character is uppercase, convert it to lowercase + for(string::size_type i = 0; i < str.length(); i++) + { + if(!isspace(str[i]) || inQuotes) + { + if(str[i] == '\"') + inQuotes = !inQuotes; + if(isupper(str[i]) && !inQuotes) + str[i] = static_cast(tolower(str[i])); + tmpStr += str[i]; + } + } + return tmpStr; +} + +bool ZConfigFile::Exists(string sec) +{ + list::iterator secIter; + + sec = CleanString(sec); + + for(secIter = mFileLayout.begin(); secIter != mFileLayout.end(); secIter++) + { + if(CleanString((*secIter).section) == sec) + return true; + } + return false; +} + +bool ZConfigFile::Exists(string sec, string var) +{ + list::iterator secIter; + list::iterator varIter; + + sec = CleanString(sec); + var = CleanString(var); + + for(secIter = mFileLayout.begin(); secIter != mFileLayout.end(); secIter++) + { + if(CleanString((*secIter).section) == sec) + { + for(varIter = (*secIter).varList.begin(); varIter != (*secIter).varList.end(); varIter++) + { + if(CleanString((*varIter).var) == var) + return true; + } + } + } + return false; +} + +void ZConfigFile::SetVariable(string sec, string var, string val) +{ + list::iterator secIter; + list::iterator varIter; + + if(Exists(CleanString(sec))) + { + sec = CleanString(sec); + for(secIter = mFileLayout.begin(); secIter != mFileLayout.end(); secIter++) + { + if(CleanString((*secIter).section) == sec) //if this is the section + { + if(Exists(sec,var)) + { + var = CleanString(var); + for(varIter = (*secIter).varList.begin(); varIter != (*secIter).varList.end(); varIter++) + { + if(CleanString((*varIter).var) == var) //if this is the variable + { + (*varIter).val = val; + break; //break from this loop + } + } + break; //done in the for loop, time to go + } + else + { + ZCF_Variable tempVar; + tempVar.var = var; + (*secIter).varList.push_back(tempVar); + SetVariable(sec,var,val); + } + } + } + } + else + { + ZCF_Section tempSec; + tempSec.section = sec; + mFileLayout.push_back(tempSec); + SetVariable(sec,var,val); + } +} + +string ZConfigFile::GetVariable(string sec, string var, string defVal) +{ + list::iterator secIter; + list::iterator varIter; + + sec = CleanString(sec); + var = CleanString(var); + + if(Exists(sec)) + { + for(secIter = mFileLayout.begin(); secIter != mFileLayout.end(); secIter++) + { + if(CleanString((*secIter).section) == sec) //if this is the section + { + if(Exists(sec,var)) + { + for(varIter = (*secIter).varList.begin(); varIter != (*secIter).varList.end(); varIter++) + { + if(CleanString((*varIter).var) == var) //if this is the variable + return (*varIter).val; //return now + } + break; //done in the for loop, time to go + } + else + { + return defVal; + break; + } + } + } + } + + return defVal; //if it gets to the end just return the default +} + +ZConfigFile::ZConfigFile() {} + +ZConfigFile::ZConfigFile(string mFilename) +{ + Process(mFilename); +} + +ZConfigFile::~ZConfigFile() +{ + Close(); +} + +void ZConfigFile::Process(string filename) +{ + mFilename = filename; + + ifstream cfile(mFilename.c_str()); + string section, str, var, tmp; + + mFileLayout.clear(); + + while(!cfile.eof() && cfile.is_open()) + { + getline(cfile,str); //read in a line + tmp = CleanString(str); //get a clean version + + //if string is bracketed it is a section, if it begins in a letter it is a variable + if(tmp[0] == '[' && tmp[tmp.length()-1] == ']') + section = str; + else if(isalpha(tmp[0])) + { + var = str.substr(0,str.find('=')); //split the string at the equals sign + SetVariable(section,var,str.substr(str.find('=')+1,str.length()-var.length()-1)); + } + } + cfile.close(); +} + +int ZConfigFile::GetInt(string section, string var, int defVal) +{ + string val; + char tmp[20]; + + section = CleanString(section); + var = CleanString(var); + + section = '[' + section + ']'; + + sprintf(tmp,"%d",defVal); + val = GetVariable(section,var,tmp); + + if(!atoi(val.c_str()) && val[0] !='0') //if it is zero but doesn't start with a zero + return defVal; + else + return atoi(val.c_str()); +} + +bool ZConfigFile::GetBool(string section, string var, bool defVal) +{ + string val,tmp; + + section = CleanString(section); + var = CleanString(var); + + section = '[' + section + ']'; + + tmp = defVal ? "true" : "false"; + val = CleanString(GetVariable(section,var,tmp)); + + if(val == "true" || val == "1") + return true; + else if(val == "false" || val == "0") + return false; + else + return defVal; +} + +string ZConfigFile::GetString(string section, string var, string defVal) +{ + string val; + + section = CleanString(section); + var = CleanString(var); + + section = '[' + section + ']'; + + val = CleanString(GetVariable(section,var,defVal)); + if(val == CleanString(defVal)) + val = defVal; + + + if(val[0] == '\"' && val[val.length()-1] == '\"') + return val.substr(1,val.length()-2); //chop off quotes + else + return val; +} + +void ZConfigFile::SetInt(string section, string var, int val) +{ + char buf[20]; + sprintf(buf,"%d",val); + + section = '[' + section + ']'; + SetVariable(section,var,buf); +} + +void ZConfigFile::SetBool(string section, string var, bool val) +{ + string tmp = val ? "true" : "false"; + + section = '[' + section + ']'; + SetVariable(section,var,tmp); +} + +void ZConfigFile::SetString(string section, string var, string val) +{ + section = '[' + section + ']'; + val = "\"" + val + "\""; + SetVariable(section,var,val); +} + +void ZConfigFile::Flush() +{ + list::iterator secIter; + list::iterator varIter; + string secName; + + //in case the filename is already cleared somehow + if(mFilename.length()) + { + ofstream cfile(mFilename.c_str(), ios::out|ios::trunc); + + if(cfile) + { + //iteration through sections + for(secIter = mFileLayout.begin(); secIter != mFileLayout.end(); secIter++) + { + //ensure that section is valid + secName = CleanString((*secIter).section); + if(secName.length() && secName[0] == '[' && secName[secName.length()-1] == ']') + { + cfile << (*secIter).section << endl; //write out raw section title + + //for each variable in section, write out variable=value + for(varIter = (*secIter).varList.begin(); varIter != (*secIter).varList.end(); varIter++) + { + if(CleanString((*varIter).var).length()) //ensures that variable is valid + cfile << (*varIter).var << '=' << (*varIter).val << endl; + } + } + } + cfile.close(); + } + } +} + +void ZConfigFile::Close() +{ + Flush(); + mFilename = ""; +} + +} diff --git a/src/ZE_ZEngine.cpp b/src/ZE_ZEngine.cpp new file mode 100644 index 0000000..234bcee --- /dev/null +++ b/src/ZE_ZEngine.cpp @@ -0,0 +1,535 @@ +/******************************************************************************* + This file is Part of the ZEngine Library for SDL Game Development. + Copyright (C) 2002 ConceptOfZero.net + + Licensed under the BSD License, see licensing.txt. + + The maintainer of this library is James Turk (james@conceptofzero.net) + and the home of this Library is http://www.conceptofzero.net/ +*******************************************************************************/ + +/*! +\par File Header: +File: ZE_ZEngine.cpp
+Description: Implementation source file for ZEngine library main singleton class.
+Author(s): James Turk
+$Id: ZE_ZEngine.cpp,v 1.1 2002/11/21 05:41:12 cozman Exp $
+ + \file ZE_ZEngine.cpp + \brief Central source file for ZEngine. + + Actual implementation of ZEngine singleton class at heart of ZEngine. +**/ + +#include "ZE_ZEngine.h" + +namespace ZE +{ + +ZEngine *ZEngine::sInstance=NULL; + +ZEngine::ZEngine() +{ + mWidth = 640; + mHeight = 480; + mBPP = 16; + mFullscreen = true; + +#ifdef USE_SDL_MIXER + mRate = 22050; + mStereo = false; +#endif + + mScreen = NULL; + + mActive = mQuit = false; + mKeyPressed = NULL; + mMouseX = mMouseY = 0; + mMouseB = 0; + + mUnpauseOnActive = mPaused = false; + mLastPause = mPausedTime = mLastTime = 0; + mSecPerFrame = 0.0; +} + +ZEngine* ZEngine::GetInstance() +{ + if(!sInstance) + sInstance = new ZEngine; + + return sInstance; +} + +void ZEngine::ReleaseInstance() +{ + if(sInstance) + { + sInstance->CloseWindow(); + delete sInstance; + } + sInstance = NULL; +} + +string ZEngine::GetVersion() +{ + return VERSION; +} + +void ZEngine::SetupDisplay(int width, int height, int bpp, bool fullscreen) +{ + mWidth = width; + mHeight = height; + mBPP = bpp; + mFullscreen = fullscreen; +} + +#ifdef USE_SDL_MIXER +void ZEngine::SetupSound(int rate, bool stereo) +{ + mRate = rate; + mStereo = stereo; +} +#endif + +void ZEngine::CreateWindow(string title, string icon) +{ + Uint32 flags = SDL_DOUBLEBUF|SDL_HWPALETTE; + ImageData iconImg; + SDL_VideoInfo *videoInfo; + + if(SDL_Init(SDL_INIT_VIDEO|SDL_INIT_TIMER|SDL_INIT_AUDIO) < 0) + { + LogError(FormatStr("SDL could not be Initialized: %s", SDL_GetError())); + //CloseWindow(); + } + +#ifdef USE_SDL_MIXER + Mix_OpenAudio(mRate, AUDIO_S16SYS, mStereo?2:1, 4096); //Open Audio Stream (Stereo?2:1 is conditional for number of channels) +#endif + + videoInfo = const_cast(SDL_GetVideoInfo()); + + //check capabilities and use what we can// + if(videoInfo->hw_available) + flags |= SDL_HWSURFACE; + else + flags |= SDL_SWSURFACE; + if(videoInfo->blit_hw) + flags |= SDL_HWACCEL; + + //Window Manager settings// + if(!icon.length()) + SDL_WM_SetCaption(title.c_str(),NULL); + else + { + SDL_WM_SetCaption(title.c_str(),icon.c_str()); + iconImg = LoadImage(icon); + SDL_WM_SetIcon(iconImg.image,NULL); + FreeImage(iconImg); + } + + //create SDL screen// + if(mFullscreen) + flags |= SDL_FULLSCREEN; + mScreen = SDL_SetVideoMode(mWidth, mHeight, mBPP, flags); + + if(!mScreen) + { + LogError(FormatStr("Unable to set video mode %dx%d (%dBpp): %s",mWidth,mHeight,mBPP,SDL_GetError())); + CloseWindow(); + } + mKeyPressed = SDL_GetKeyState(NULL); + +#ifdef USE_SDL_TTF + TTF_Init(); +#endif + + mLastTime = mPausedTime = SDL_GetTicks(); + mActive = true; +} + +void ZEngine::CloseWindow() +{ +#ifdef USE_SDL_TTF + TTF_Quit(); +#endif + +#ifdef USE_SDL_MIXER + Mix_CloseAudio(); +#endif + +#ifdef USE_PHYSFS + PHYSFS_deinit(); +#endif + + SDL_Quit(); +} + +SDL_Surface *ZEngine::GetDisplay() +{ + return mScreen; +} + +void ZEngine::UpdateScreen() +{ + SDL_Flip(mScreen); + + mSecPerFrame = (GetTime()-mLastTime)/1000.0; + mLastTime = GetTime(); +} + +Uint32 ZEngine::MapColor(Uint8 r, Uint8 g, Uint8 b, Uint8 a) +{ + return SDL_MapRGBA(mScreen->format,r,g,b,a); +} + +void ZEngine::Clear(Uint32 color, SDL_Rect *rect) +{ + SDL_FillRect(mScreen,rect,color); +} + +void ZEngine::Sleep(Uint32 milliseconds) +{ + SDL_Delay(milliseconds); +} + +Uint32 ZEngine::GetTime() +{ + if(mPaused) + return SDL_GetTicks() - (mPausedTime + (SDL_GetTicks() - mLastPause)); + else + return SDL_GetTicks() - mPausedTime; +} + +void ZEngine::PauseTimer() +{ + if(!mPaused) + { + mLastPause = SDL_GetTicks(); + mPaused = true; + } +} + +void ZEngine::UnpauseTimer() +{ + if(mPaused) + { + mPausedTime += (SDL_GetTicks() - mLastPause); + mPaused = false; + } +} + +double ZEngine::GetFrameTime() +{ + return mSecPerFrame; +} + +bool ZEngine::IsPaused() +{ + return mPaused; +} + +bool ZEngine::IsActive() +{ + return mActive; +} + +void ZEngine::RequestQuit() +{ + mQuit = true; //simply request a quit, nothing more +} + +bool ZEngine::QuitRequested() +{ + return mQuit; +} + +bool ZEngine::KeyIsPressed(SDLKey key) +{ + return mKeyPressed[key] == 1; +} + +void ZEngine::HideCursor() +{ + SDL_ShowCursor(SDL_DISABLE); +} + +void ZEngine::ShowCursor() +{ + SDL_ShowCursor(SDL_ENABLE); +} + +int ZEngine::GetMouseX() +{ + return mMouseX; +} + +int ZEngine::GetMouseY() +{ + return mMouseY; +} + +bool ZEngine::LButtonPressed() +{ + return (mMouseB & SDL_BUTTON_LMASK) > 0; +} + +bool ZEngine::RButtonPressed() +{ + return (mMouseB & SDL_BUTTON_RMASK) > 0; +} + +bool ZEngine::MouseInRect(SDL_Rect *rect) +{ + return (mMouseX >= rect->x && mMouseX <= rect->x+rect->w && + mMouseY >= rect->y && mMouseY <= rect->y+rect->h); +} + +void ZEngine::CheckEvents() +{ + SDL_Event event; + + while(SDL_PollEvent(&event)) + { + switch(event.type) + { + case SDL_VIDEOEXPOSE: + case SDL_ACTIVEEVENT: + if(event.active.state & SDL_APPACTIVE || event.active.state & SDL_APPINPUTFOCUS) + { + if( (event.type == SDL_ACTIVEEVENT && event.active.gain == 1) || event.type == SDL_VIDEOEXPOSE) + { + mActive = true; + if(mUnpauseOnActive) + UnpauseTimer(); + } + else + { + mActive = mUnpauseOnActive = false; + if(!mPaused) + { + mUnpauseOnActive = true; + PauseTimer(); + } + else + mUnpauseOnActive = false; + } + } + break; + case SDL_QUIT: + mQuit = true; + break; + default: + break; + } + } + + mKeyPressed = SDL_GetKeyState(NULL); //recommended but not needed (says Sam) + + if(mKeyPressed[SDLK_F4] && (mKeyPressed[SDLK_LALT] || mKeyPressed[SDLK_RALT])) + mQuit = true; + + mMouseB = SDL_GetMouseState(&mMouseX,&mMouseY); +} + +#ifdef USE_PHYSFS + +void ZEngine::InitPhysFS(string argv) +{ + string::size_type pos; + PHYSFS_init(argv.c_str()); + + pos = argv.rfind(PHYSFS_getDirSeparator()); + if(pos != string::npos) + AddPhysFSDir(argv.substr(0,pos)); +} + +void ZEngine::AddPhysFSDir(string dir) +{ + PHYSFS_addToSearchPath(dir.c_str(),0); +} + +#endif //USE_PHYSFS + +ImageData ZEngine::LoadImage(string filename) +{ + ImageData img; + +//using physfs// +#ifdef USE_PHYSFS + SDL_RWops *rw; + rw = PHYSFSRWOPS_openRead(filename.c_str()); + if(!rw) + LogError(FormatStr("PhysFS RWops failed: %s",SDL_GetError())); +#ifdef USE_SDL_IMAGE + img.image = IMG_Load_RW(rw,0); +#else + img.image = SDL_LoadBMP_RW(rw,0); +#endif //USE_SDL_IMAGE + SDL_FreeRW(rw); +//end using physfs// + +//Just SDL// +#else +#ifdef USE_SDL_IMAGE + img.image = IMG_Load(filename.c_str()); +#else + img.image = SDL_LoadBMP(filename.c_str()); +#endif //USE_SDL_IMAGE +#endif //USE_PHYSFS + + if(!img.image) + { + img.filename = FormatStr("LoadImage could not load %s.",filename.c_str()); + LogError(img.filename); + } + else + img.filename = filename; + + return img; +} + +void ZEngine::FreeImage(ImageData &image) +{ + if(image.image) + { + SDL_FreeSurface(image.image); + image.image = NULL; + image.filename = "free"; + } +} + +#ifdef USE_SDL_MIXER + +SoundData ZEngine::LoadSound(string filename) +{ + SoundData snd; + +#ifdef USE_PHYSFS + SDL_RWops *rw; + rw = PHYSFSRWOPS_openRead(filename.c_str()); + snd.sound = Mix_LoadWAV_RW(rw,0); + SDL_FreeRW(rw); +#else + snd.sound = Mix_LoadWAV(filename.c_str()); +#endif //USE_PHYSFS + + if(!snd.sound) + { + snd.filename = FormatStr("LoadSound could not load %s.",filename.c_str()); + LogError(snd.filename); + } + else + snd.filename = filename; + + return snd; +} + +void ZEngine::FreeSound(SoundData &sound) +{ + if(sound.sound) + { + Mix_FreeChunk(sound.sound); + sound.sound = NULL; + sound.filename = "free"; + } +} + +MusicData ZEngine::LoadMusic(string filename) +{ + MusicData mus; + +//Currently SDL_Mixer doesn't support Music from a RW +//#ifdef USE_PHYSFS +// SDL_RWops *rw; +// rw = PHYSFSRWOPS_openRead(filename.c_str()); +// mus.music = Mix_LoadMUS_RW(filename.c_str(),0); +// SDL_FreeRW(rw); +//#else + mus.music = Mix_LoadMUS(filename.c_str()); +//#endif //USE_PHYSFS + + if(!mus.music) + { + mus.filename = FormatStr("LoadMusic could not load %s.",filename.c_str()); + LogError(mus.filename); + } + else + mus.filename = filename; + + return mus; +} + +void ZEngine::FreeMusic(MusicData &music) +{ + if(music.music) + { + Mix_FreeMusic(music.music); + music.music = NULL; + music.filename = "free"; + } +} + +#endif + +#ifdef USE_SDL_TTF + +FontData ZEngine::LoadFont(string filename, int size) +{ + FontData fnt; + +//Currently SDL_ttf doesn't support Fonts from a RW +//#ifdef USE_PHYSFS +// SDL_RWops *rw; +// rw = PHYSFSRWOPS_openRead(filename.c_str()); +// fnt.font = TTF_OpenFontRW(rw,0); +// SDL_FreeRW(rw); +//#else + fnt.font = TTF_OpenFont(filename.c_str(),size); +//#endif //USE_PHYSFS + + if(!fnt.font) + { + fnt.filename = FormatStr("LoadFont could not load %s.",filename.c_str()); + LogError(fnt.filename); + } + else + fnt.filename = filename; + + return fnt; +} + +void ZEngine::FreeFont(FontData &font) +{ + if(font.font) + { + TTF_CloseFont(font.font); + font.font = NULL; + font.filename = "free"; + } +} + + +#endif + +int ZEngine::GetWidth() +{ + return mWidth; +} + +int ZEngine::GetHeight() +{ + return mHeight; +} + +int ZEngine::GetBPP() +{ + return mBPP; +} + +bool ZEngine::IsFullscreen() +{ + return mFullscreen; +} + +} diff --git a/src/ZE_ZFont.cpp b/src/ZE_ZFont.cpp new file mode 100644 index 0000000..69057a9 --- /dev/null +++ b/src/ZE_ZFont.cpp @@ -0,0 +1,203 @@ +/******************************************************************************* + This file is Part of the ZEngine Library for SDL Game Development. + Copyright (C) 2002 ConceptOfZero.net + + Licensed under the BSD License, see licensing.txt. + + The maintainer of this library is James Turk (james@conceptofzero.net) + and the home of this Library is http://www.conceptofzero.net/ +*******************************************************************************/ + +/*! +\par File Header: +File: ZE_ZFont.cpp
+Description: Implementation source file for core ZEngine Font Object.
+Author(s): James Turk
+$Id: ZE_ZFont.cpp,v 1.1 2002/11/21 05:41:13 cozman Exp $
+ + \file ZE_ZFont.cpp + \brief Source file for ZFont. + + Implementation of ZFont, the basic Font class for ZEngine. +**/ + +#include "ZE_ZFont.h" + +#ifdef USE_SDL_TTF + +namespace ZE +{ + + +ZFont::ZFont() +{ + rColor.r = rColor.g = rColor.b = rColor.unused = 255; + rBGColor.r = rBGColor.g = rBGColor.b = rBGColor.unused = 0; +} + +ZFont::ZFont(string filename, int size) +{ + rColor.r = rColor.g = rColor.b = rColor.unused = 255; + rBGColor.r = rBGColor.g = rBGColor.b = rBGColor.unused = 0; + Open(filename,size); +} + +ZFont::~ZFont() +{ + Release(); +} + +void ZFont::Open(string filename, int size) +{ + Release(); + rFont = rEngine->LoadFont(filename,size); +} + +void ZFont::Release() +{ + rEngine->FreeFont(rFont); +} + +void ZFont::DrawText(string text, ZImage &image) +{ + image.Attach(TTF_RenderText_Solid(rFont.font, text.c_str(), rColor)); +} + +void ZFont::DrawShadedText(string text, ZImage &image) +{ + image.Attach(TTF_RenderText_Shaded(rFont.font, text.c_str(), rColor, rBGColor)); +} + +void ZFont::SetColor(Uint8 r, Uint8 g, Uint8 b) +{ + rColor.r = r; + rColor.g = g; + rColor.b = b; +} + +void ZFont::SetBGColor(Uint8 r, Uint8 g, Uint8 b) +{ + rBGColor.r = r; + rBGColor.g = g; + rBGColor.b = b; +} + +void ZFont::SetStyle(bool Bold, bool Italic, bool Underline) +{ + int flags=0; + + if(Bold) + flags |= TTF_STYLE_BOLD; + if(Italic) + flags |= TTF_STYLE_ITALIC; + if(Underline) + flags |= TTF_STYLE_UNDERLINE; + if(!flags) + flags = TTF_STYLE_NORMAL; + + if(rFont.font) + TTF_SetFontStyle(rFont.font,flags); + else + LogError(FormatStr("ZFont not initialized in ZFont::SetStyle(), filename: %s.",rFont.filename.c_str())); +} + +void ZFont::Resize(int size) +{ + Open(rFont.filename,size); +} + +bool ZFont::IsLoaded() +{ + return rFont.font != NULL; +} + +bool ZFont::IsBold() +{ + if(rFont.font) + return (TTF_GetFontStyle(rFont.font) & TTF_STYLE_BOLD) > 0; + else + { + LogError(FormatStr("ZFont not initialized in ZFont::IsBold(), filename: %s.",rFont.filename.c_str())); + return false; + } +} + +bool ZFont::IsItalic() +{ + if(rFont.font) + return (TTF_GetFontStyle(rFont.font) & TTF_STYLE_ITALIC) > 0; + else + { + LogError(FormatStr("ZFont not initialized in ZFont::IsItalic(), filename: %s.",rFont.filename.c_str())); + return false; + } +} + +bool ZFont::IsUnderlined() +{ + if(rFont.font) + return (TTF_GetFontStyle(rFont.font) & TTF_STYLE_UNDERLINE) > 0; + else + { + LogError(FormatStr("ZFont not initialized in ZFont::IsUnderlined(), filename: %s.",rFont.filename.c_str())); + return false; + } +} + +int ZFont::GetHeight() +{ + if(rFont.font) + return TTF_FontHeight(rFont.font); + else + { + LogError(FormatStr("ZFont not initialized in ZFont::GetHeight(), filename: %s.",rFont.filename.c_str())); + return 0; + } +} + +int ZFont::GetLineSkip() +{ + if(rFont.font) + return TTF_FontLineSkip(rFont.font); + else + { + LogError(FormatStr("ZFont not initialized in ZFont::GetLineSkip(), filename: %s.",rFont.filename.c_str())); + return 0; + } +} + +int ZFont::GetStringWidth(string text) +{ + int w,h; + + if(rFont.font) + { + TTF_SizeText(rFont.font,text.c_str(),&w,&h); + return w; + } + else + { + LogError(FormatStr("ZFont not initialized in ZFont::GetStringWidth(%s), filename: %s.",text.c_str(),rFont.filename.c_str())); + return 0; + } +} + +int ZFont::GetStringHeight(string text) +{ + int w,h; + + if(rFont.font) + { + TTF_SizeText(rFont.font,text.c_str(),&w,&h); + return h; + } + else + { + LogError(FormatStr("ZFont not initialized in ZFont::GetStringHeight(%s), filename: %s.",text.c_str(),rFont.filename.c_str())); + return 0; + } +} + +} + +#endif //USE_SDL_TTF diff --git a/src/ZE_ZImage.cpp b/src/ZE_ZImage.cpp new file mode 100644 index 0000000..241b459 --- /dev/null +++ b/src/ZE_ZImage.cpp @@ -0,0 +1,214 @@ +/******************************************************************************* + This file is Part of the ZEngine Library for SDL Game Development. + Copyright (C) 2002 ConceptOfZero.net + + Licensed under the BSD License, see licensing.txt. + + The maintainer of this library is James Turk (james@conceptofzero.net) + and the home of this Library is http://www.conceptofzero.net/ +*******************************************************************************/ + +/*! +\par File Header: +File: ZE_ZImage.cpp
+Description: Implementation source file for core ZEngine Image Object.
+Author(s): James Turk
+$Id: ZE_ZImage.cpp,v 1.1 2002/11/21 05:41:13 cozman Exp $
+ + \file ZE_ZImage.cpp + \brief Source file for ZImage. + + Implementation of ZImage, the basic Image class for ZEngine. +**/ + +#include "ZE_ZImage.h" + +namespace ZE +{ + +ZImage::ZImage() +{ +} + +ZImage::ZImage(string filename) +{ + Open(filename); +} + +ZImage::ZImage(SDL_Surface *surface) +{ + Attach(surface); +} + +ZImage::ZImage(SDL_Surface *img, Sint16 x, Sint16 y, Sint16 w, Sint16 h) +{ + OpenFromImage(img,x,y,w,h); +} + +ZImage::~ZImage() +{ + Release(); +} + +void ZImage::Open(string filename) +{ + Release(); + rImage = rEngine->LoadImage(filename); +} + +void ZImage::OpenFromImage(SDL_Surface *img, Sint16 x, Sint16 y, Sint16 w, Sint16 h) +{ + Uint32 flags; + SDL_Surface *screen = rEngine->GetDisplay(); + SDL_Rect rect; + SDL_VideoInfo *videoInfo; + + Release(); + rImage.filename = "cut from image"; + + //either set hardware or software surface// + videoInfo = const_cast(SDL_GetVideoInfo()); + + if(videoInfo->hw_available) + flags = SDL_HWSURFACE; + else + flags = SDL_SWSURFACE; + + rect.x = x; + rect.y = y; + rect.w = w; + rect.h = h; + + if(!img) + LogError("Invalid Parameter to ZImage::OpenFromImage: img==NULL"); + + rImage.image = SDL_CreateRGBSurface(flags, rect.w, rect.h, rEngine->GetBPP(), + screen->format->Rmask, screen->format->Gmask, screen->format->Bmask, screen->format->Amask); + + if(!rImage.image) + LogError(FormatStr("SDL_CreateRGBSurface failed in ZImage::OpenFromImage: %s",SDL_GetError())); + + SDL_BlitSurface(img,&rect,rImage.image,NULL); +} + +void ZImage::Attach(SDL_Surface *surface) +{ + Release(); + rImage.filename = "attached"; + rImage.image = surface; +} + +void ZImage::Release() +{ + rEngine->FreeImage(rImage); +} + +void ZImage::SetAlpha(Uint8 alpha) +{ + SDL_Surface *temp=NULL; + + if(rImage.image) + { + if(SDL_SetAlpha(rImage.image, SDL_RLEACCEL|SDL_SRCALPHA, alpha) < 0) + LogError("Invalid Call to SDL_SetAlpha."); + else + { + //surface conversion// + temp = rImage.image; + rImage.image = SDL_DisplayFormat(temp); + if(rImage.image) + { + SDL_FreeSurface(temp); + temp = NULL; + } + else //can't convert (add error warning here?) + { + LogError("Alpha surface conversion failed."); + rImage.image = temp; + } + } + } + else + LogError("ZImage not initialized in ZImage::SetAlpha."); +} + +void ZImage::SetColorKey(Uint32 color) +{ + SDL_Surface *temp=NULL; + + if(rImage.image) + { + if(SDL_SetColorKey(rImage.image, SDL_RLEACCEL|SDL_SRCCOLORKEY, color) < 0) + LogError("Invalid Call to SDL_SetColorKey."); + else + { + //surface conversion// + temp = rImage.image; + rImage.image = SDL_DisplayFormat(temp); + if(rImage.image) + { + SDL_FreeSurface(temp); + temp = NULL; + } + else //can't convert (add error warning here?) + { + LogError("Surface conversion failed."); + rImage.image = temp; + } + } + } + else + LogError("ZImage not initialized in ZImage::SetColorKey."); +} + +void ZImage::Draw(Sint16 x, Sint16 y) +{ + SDL_Rect rect; + + rect.x = x; + rect.y = y; + + if(rImage.image) + SDL_BlitSurface(rImage.image,NULL,rEngine->GetDisplay(),&rect); + else + LogError("ZImage not initialized in ZImage::Draw."); +} + +bool ZImage::IsLoaded() +{ + return rImage.image != NULL; +} + +SDL_Surface *ZImage::GetImage() +{ + return rImage.image; +} + +int ZImage::GetWidth() +{ + if(rImage.image) + return rImage.image->w; + else + { + LogError("ZImage not initialized in ZImage::GetWidth."); + return 0; + } +} + +int ZImage::GetHeight() +{ + if(rImage.image) + return rImage.image->h; + else + { + LogError("ZImage not initialized in ZImage::GetHeight."); + return 0; + } +} + +string ZImage::GetFilename() +{ + return rImage.filename.c_str(); +} + +} diff --git a/src/ZE_ZMusic.cpp b/src/ZE_ZMusic.cpp new file mode 100644 index 0000000..6eb2746 --- /dev/null +++ b/src/ZE_ZMusic.cpp @@ -0,0 +1,160 @@ +/******************************************************************************* + This file is Part of the ZEngine Library for SDL Game Development. + Copyright (C) 2002 ConceptOfZero.net + + Licensed under the BSD License, see licensing.txt. + + The maintainer of this library is James Turk (james@conceptofzero.net) + and the home of this Library is http://www.conceptofzero.net/ +*******************************************************************************/ + +/*! +\par File Header: +File: ZE_ZMusic.cpp
+Description: Implementation source file for core ZEngine Music Object.
+Author(s): James Turk
+$Id: ZE_ZMusic.cpp,v 1.1 2002/11/21 05:41:13 cozman Exp $
+ + \file ZE_ZMusic.cpp + \brief Source file for ZMusic. + + Implementation of ZMusic, the basic Music class for ZEngine. +**/ + +#include "ZE_ZMusic.h" + +#ifdef USE_SDL_MIXER + +namespace ZE +{ + +const int ZMusic::LoopInfinite = -1; + +ZMusic::ZMusic() +{ +} + +ZMusic::ZMusic(string filename) +{ + Open(filename); +} + +ZMusic::~ZMusic() +{ + Release(); +} + +void ZMusic::Open(string filename) +{ + Release(); + rMusic = rEngine->LoadMusic(filename); +} + +void ZMusic::Release() +{ + Mix_HaltMusic(); + rEngine->FreeMusic(rMusic); +} + +void ZMusic::Play(int loopNum, int fadeTime) +{ + if(Mix_PlayingMusic()) //stop currently playing music + Mix_HaltMusic(); + + if(rMusic.music) + { + if(fadeTime) + Mix_FadeInMusic(rMusic.music, loopNum, fadeTime); + else + Mix_PlayMusic(rMusic.music, loopNum); + } + else + LogError(FormatStr("ZMusic not initialized in ZMusic::Play(%d,%d), filename: %s.",loopNum,fadeTime,rMusic.filename.c_str())); +} + +void ZMusic::Pause() +{ + if(rMusic.music) + Mix_PauseMusic(); + else + LogError(FormatStr("ZMusic not initialized in ZMusic::Pause(), filename: %s.",rMusic.filename.c_str())); +} + +void ZMusic::Unpause() +{ + if(rMusic.music) + Mix_ResumeMusic(); + else + LogError(FormatStr("ZMusic not initialized in ZMusic::Unpause(), filename: %s.",rMusic.filename.c_str())); +} + +void ZMusic::Rewind() +{ + if(rMusic.music) + Mix_RewindMusic(); + else + LogError(FormatStr("ZMusic not initialized in ZMusic::Rewind(), filename: %s.",rMusic.filename.c_str())); +} + +void ZMusic::Stop(int fadeTime) +{ + if(rMusic.music) + { + if(fadeTime) + Mix_FadeOutMusic(fadeTime); + else + Mix_HaltMusic(); + } + else + LogError(FormatStr("ZMusic not initialized in ZMusic::Stop(%d), filename: %s.",fadeTime,rMusic.filename.c_str())); +} + +void ZMusic::SetVolume(int volume) +{ + if(rMusic.music) + Mix_VolumeMusic(volume); + else + LogError(FormatStr("ZMusic not initialized in ZMusic::SetVolume(%d), filename: %s.",volume,rMusic.filename.c_str())); +} + +bool ZMusic::IsLoaded() +{ + return rMusic.music != NULL; +} + +bool ZMusic::IsPlaying() +{ + if(rMusic.music) + return Mix_PlayingMusic() > 0; + else + { + LogError(FormatStr("ZMusic not initialized in ZMusic::IsPlaying(), filename: %s.",rMusic.filename.c_str())); + return false; + } +} + +bool ZMusic::IsPaused() +{ + if(rMusic.music) + return Mix_PausedMusic() > 0; + else + { + LogError(FormatStr("ZMusic not initialized in ZMusic::IsPaused(), filename: %s.",rMusic.filename.c_str())); + return false; + } +} + +int ZMusic::GetVolume() +{ + if(rMusic.music) + return Mix_VolumeMusic(-1); + else + { + LogError(FormatStr("ZMusic not initialized in ZMusic::GetVolume(), filename: %s.",rMusic.filename.c_str())); + return false; + } +} + +} + +#endif diff --git a/src/ZE_ZRect.cpp b/src/ZE_ZRect.cpp new file mode 100644 index 0000000..1771062 --- /dev/null +++ b/src/ZE_ZRect.cpp @@ -0,0 +1,201 @@ +/******************************************************************************* + This file is Part of the ZEngine Library for SDL Game Development. + Copyright (C) 2002 ConceptOfZero.net + + Licensed under the BSD License, see licensing.txt. + + The maintainer of this library is James Turk (james@conceptofzero.net) + and the home of this Library is http://www.conceptofzero.net/ +*******************************************************************************/ + +/*! +\par File Header: +File: ZE_ZRect.cpp
+Description: Implementation source file for core ZEngine Rectangle Object.
+Author(s): James Turk
+$Id: ZE_ZRect.cpp,v 1.1 2002/11/21 05:41:13 cozman Exp $
+ + \file ZE_ZRect.cpp + \brief Source file for ZRect. + + Implementation of ZRect, the Rectangle class for ZEngine. +**/ + +#include "ZE_ZRect.h" + +namespace ZE +{ + +ZRect::ZRect() : + mX(0),mY(0),mWidth(0),mHeight(0) +{ +} + +ZRect::ZRect(int x, int y, int width, int height) : + mX(x),mY(y),mWidth(width),mHeight(height) +{ +} + +ZRect::ZRect(const ZRect &rhs) : + mX(rhs.X()),mY(rhs.Y()),mWidth(rhs.Width()),mHeight(rhs.Height()) +{ +} + +const ZRect& ZRect::operator=(const ZRect &rhs) +{ + if(this != &rhs) + { + mX = rhs.X(); + mY = rhs.Y(); + mWidth = rhs.Width(); + mHeight = rhs.Height(); + } + return *this; +} + +bool ZRect::operator<(const ZRect &rhs) const +{ + //< is the one that is closer to top corner (as a whole)// + + if(mY < rhs.Y()) //check Ys + return true; + else if(mY > rhs.Y()) + return false; + else + { + if(mX < rhs.X()) //check Xs + return true; + else if(mX > rhs.X()) + return false; + else + { + if(mHeight < rhs.Height()) //check heights + return true; + else if(mHeight > rhs.Height()) + return false; + else + { + if(mWidth < rhs.Width()) //check widths + return true; + else if(mWidth > rhs.Width()) + return false; + else + return false; //nothing left to check they are == + } + } + } +} + +void ZRect::Move(int x, int y) +{ + mX = x; + mY = y; +} + +void ZRect::MoveRel(int xMove, int yMove) +{ + mX += xMove; + mY += yMove; +} + +void ZRect::Resize(int width, int height) +{ + mWidth = width; + mHeight = height; +} + +void ZRect::ResizeRel(int widthChange, int heightChange) +{ + mWidth += widthChange; + mHeight += heightChange; +} + +bool ZRect::Intersects(const ZRect &rect) const +{ + return !(mX > rect.Right() || rect.Left() > mX+mWidth || + mY > rect.Bottom() || rect.Top() > mY+mHeight); +} + +bool ZRect::Contains(int x, int y) const +{ + return x > mX && x < mX+mWidth && y > mY && y < mY+mHeight; +} + +bool ZRect::Contains(const ZRect &rect) const +{ + //contains all 4 points + return Contains(rect.Left(),rect.Top()) && Contains(rect.Right(),rect.Top()) && + Contains(rect.Left(),rect.Bottom()) && Contains(rect.Right(),rect.Bottom()); +} + +ZRect ZRect::Intersection(const ZRect &rect) const +{ + int tempX=0,tempY=0,tempW=0,tempH=0; + + if(Intersects(rect)) + { + tempX = mX > rect.X() ? mX : rect.X(); + tempY = mY > rect.Y() ? mY : rect.Y(); + tempW = mX+mWidth < rect.Right() ? mX+mWidth : rect.Right(); + tempH = mY+mHeight < rect.Bottom() ? mY+mHeight : rect.Bottom(); + + tempW -= tempX; //adjust width and height + tempH -= tempY; + } + + return ZRect(tempX,tempY,tempW,tempH); +} + +SDL_Rect ZRect::SDLrect() const +{ + SDL_Rect ret; + + ret.x = static_cast(mX); + ret.y = static_cast(mY); + ret.w = static_cast(mWidth); + ret.h = static_cast(mHeight); + + return ret; +} + +int ZRect::X() const +{ + return mX; +} + +int ZRect::Y() const +{ + return mY; +} + +int ZRect::Left() const +{ + return mX; +} + +int ZRect::Right() const +{ + return mX+mWidth; +} + +int ZRect::Top() const +{ + return mY; +} + +int ZRect::Bottom() const +{ + return mY+mHeight; +} + +int ZRect::Width() const +{ + return mWidth; +} + +int ZRect::Height() const +{ + return mHeight; +} + +} //namespace ZE diff --git a/src/ZE_ZSound.cpp b/src/ZE_ZSound.cpp new file mode 100644 index 0000000..9b11c0b --- /dev/null +++ b/src/ZE_ZSound.cpp @@ -0,0 +1,156 @@ +/******************************************************************************* + This file is Part of the ZEngine Library for SDL Game Development. + Copyright (C) 2002 ConceptOfZero.net + + Licensed under the BSD License, see licensing.txt. + + The maintainer of this library is James Turk (james@conceptofzero.net) + and the home of this Library is http://www.conceptofzero.net/ +*******************************************************************************/ + +/*! +\par File Header: +File: ZE_ZSound.cpp
+Description: Implementation source file for core ZEngine Sound Object.
+Author(s): James Turk
+$Id: ZE_ZSound.cpp,v 1.1 2002/11/21 05:41:13 cozman Exp $
+ + \file ZE_ZSound.cpp + \brief Source file for ZSound. + + Implementation of ZSound, the basic Sound class for ZEngine. +**/ + +#include "ZE_ZSound.h" + +#ifdef USE_SDL_MIXER + +namespace ZE +{ + +const int ZSound::LoopInfinite = -1; + +ZSound::ZSound() +{ + rChannelID = -1; //request channel ID +} + +ZSound::ZSound(string filename) +{ + rChannelID = -1; //request channel ID + Open(filename); +} + +ZSound::~ZSound() +{ + Release(); +} + +void ZSound::Open(string filename) +{ + Release(); + rSound = rEngine->LoadSound(filename); +} + +void ZSound::Release() +{ + if(rChannelID >= 0) + Mix_HaltChannel(rChannelID); + rEngine->FreeSound(rSound); +} + +void ZSound::Play(int loopNum, int fadeTime) +{ + if(rChannelID >= 0 && Mix_Playing(rChannelID)) //stop currently playing sound + Mix_HaltChannel(rChannelID); + + if(rSound.sound) + { + if(fadeTime) + rChannelID = Mix_FadeInChannel(rChannelID, rSound.sound, loopNum, fadeTime); + else + rChannelID = Mix_PlayChannel(rChannelID, rSound.sound, loopNum); + } + else if(!rSound.sound) + LogError(FormatStr("ZSound not initialized in ZSound::Play(%d,%d), filename: %s.",loopNum,fadeTime,rSound.filename.c_str())); +} + +void ZSound::Pause() +{ + if(rSound.sound && rChannelID >= 0) + Mix_Pause(rChannelID); + else if(!rSound.sound) + LogError(FormatStr("ZSound not initialized in ZSound::Pause(), filename: %s.",rSound.filename.c_str())); +} + +void ZSound::Unpause() +{ + if(rSound.sound && rChannelID >= 0) + Mix_Resume(rChannelID); + else if(!rSound.sound) + LogError(FormatStr("ZSound not initialized in ZSound::Unpause(), filename: %s.",rSound.filename.c_str())); +} + +void ZSound::Stop(int fadeTime) +{ + if(rSound.sound && rChannelID >= 0) + { + if(fadeTime) + Mix_FadeOutChannel(rChannelID,fadeTime); + else + Mix_HaltChannel(rChannelID); + } + else if(!rSound.sound) + LogError(FormatStr("ZSound not initialized in ZSound::Stop(%d), filename: %s.",fadeTime,rSound.filename.c_str())); +} + +void ZSound::SetVolume(int volume) +{ + if(rSound.sound) + Mix_VolumeChunk(rSound.sound,volume); + else + LogError(FormatStr("ZSound not initialized in ZSound::SetVolume(%d), filename: %s.",volume,rSound.filename.c_str())); +} + +bool ZSound::IsLoaded() +{ + return rSound.sound != NULL; +} + +bool ZSound::IsPlaying() +{ + if(rSound.sound && rChannelID >= 0) + return Mix_Playing(rChannelID) > 0; + else + { + if(rChannelID >= 0) + LogError(FormatStr("ZSound not initialized in ZSound::IsPlaying(), filename: %s.",rSound.filename.c_str())); + return false; + } +} + +bool ZSound::IsPaused() +{ + if(rSound.sound && rChannelID >= 0) + return Mix_Paused(rChannelID) > 0; + else + { + LogError(FormatStr("ZSound not initialized in ZSound::IsPaused(), filename: %s.",rSound.filename.c_str())); + return false; + } +} + +int ZSound::GetVolume() +{ + if(rSound.sound) + return Mix_VolumeChunk(rSound.sound,-1); + else + { + LogError(FormatStr("ZSound not initialized in ZSound::GetVolume(), filename: %s.",rSound.filename.c_str())); + return false; + } +} + +} + +#endif diff --git a/src/ZE_ZTimer.cpp b/src/ZE_ZTimer.cpp new file mode 100644 index 0000000..944f24c --- /dev/null +++ b/src/ZE_ZTimer.cpp @@ -0,0 +1,81 @@ +/******************************************************************************* + This file is Part of the ZEngine Library for SDL Game Development. + Copyright (C) 2002 ConceptOfZero.net + + Licensed under the BSD License, see licensing.txt. + + The maintainer of this library is James Turk (james@conceptofzero.net) + and the home of this Library is http://www.conceptofzero.net/ +*******************************************************************************/ + +/*! +\par File Header: +File: ZE_ZTimer.cpp
+Description: Implementation source file for core ZEngine Timer Object.
+Author(s): James Turk
+$Id: ZE_ZTimer.cpp,v 1.1 2002/11/21 05:41:13 cozman Exp $
+ + \file ZE_ZTimer.cpp + \brief Source file for ZTimer. + + Implementation of ZTimer, the basic Timer class for ZEngine. +**/ + +#include "ZE_ZTimer.h" + +namespace ZE +{ + +Uint32 ZTimer::GetParentTime() +{ + if(rUseZEngine) + return rEngine->GetTime(); + else + return SDL_GetTicks(); +} + +ZTimer::ZTimer(bool useZEngine) +{ + rUseZEngine = useZEngine; + rPaused = false; + Reset(); +} + +void ZTimer::Reset() +{ + rLastPause = rPausedTime = GetParentTime(); + rPaused = false; +} + +void ZTimer::Pause() +{ + if(!rPaused) + { + rLastPause = GetParentTime(); + rPaused = true; + } +} + +void ZTimer::Unpause() +{ + if(rPaused) + { + rPausedTime += (GetParentTime()-rLastPause); + rPaused = false; + } +} + +Uint32 ZTimer::GetTime() +{ + if(rPaused) + return GetParentTime() - (rPausedTime + (GetParentTime() - rLastPause)); + else + return GetParentTime() - rPausedTime; +} + +bool ZTimer::IsPaused() +{ + return rPaused; +} + +} diff --git a/src/external/physfsrwops.cpp b/src/external/physfsrwops.cpp new file mode 100644 index 0000000..26615a5 --- /dev/null +++ b/src/external/physfsrwops.cpp @@ -0,0 +1,194 @@ +/* + * This code provides a glue layer between PhysicsFS and Simple Directmedia + * Layer's (SDL) RWops i/o abstraction. + * + * License: this code is public domain. I make no warranty that it is useful, + * correct, harmless, or environmentally safe. + * + * This particular file may be used however you like, including copying it + * verbatim into a closed-source project, exploiting it commercially, and + * removing any trace of my name from the source (although I hope you won't + * do that). I welcome enhancements and corrections to this file, but I do + * not require you to send me patches if you make changes. + * + * Unless otherwise stated, the rest of PhysicsFS falls under the GNU Lesser + * General Public License: http://www.gnu.org/licenses/lgpl.txt + * + * SDL falls under the LGPL, too. You can get SDL at http://www.libsdl.org/ + * + * This file was written by Ryan C. Gordon. (icculus@clutteredmind.org). + */ + +#include "ZE_ZEngine.h" + +#ifdef USE_PHYSFS //PHYSFS check added by James for ZEngine + +static int physfsrwops_seek(SDL_RWops *rw, int offset, int whence) +{ + PHYSFS_file *handle = (PHYSFS_file *) rw->hidden.unknown.data1; + int pos = 0; + + if (whence == SEEK_SET) + { + pos = offset; + } /* if */ + + else if (whence == SEEK_CUR) + { + PHYSFS_sint64 current = PHYSFS_tell(handle); + if (current == -1) + { + SDL_SetError("Can't find position in file: %s", + PHYSFS_getLastError()); + return(-1); + } /* if */ + + pos = (int) current; + if ( ((PHYSFS_sint64) pos) != current ) + { + SDL_SetError("Can't fit current file position in an int!"); + return(-1); + } /* if */ + + if (offset == 0) /* this is a "tell" call. We're done. */ + return(pos); + + pos += offset; + } /* else if */ + + else if (whence == SEEK_END) + { + PHYSFS_sint64 len = PHYSFS_fileLength(handle); + if (len == -1) + { + SDL_SetError("Can't find end of file: %s", PHYSFS_getLastError()); + return(-1); + } /* if */ + + pos = (int) len; + if ( ((PHYSFS_sint64) pos) != len ) + { + SDL_SetError("Can't fit end-of-file position in an int!"); + return(-1); + } /* if */ + + pos += offset; + } /* else if */ + + else + { + SDL_SetError("Invalid 'whence' parameter."); + return(-1); + } /* else */ + + if ( pos < 0 ) + { + SDL_SetError("Attempt to seek past start of file."); + return(-1); + } /* if */ + + if (!PHYSFS_seek(handle, (PHYSFS_uint64) pos)) + { + SDL_SetError("PhysicsFS error: %s", PHYSFS_getLastError()); + return(-1); + } /* if */ + + return(pos); +} /* physfsrwops_seek */ + + +static int physfsrwops_read(SDL_RWops *rw, void *ptr, int size, int maxnum) +{ + PHYSFS_file *handle = (PHYSFS_file *) rw->hidden.unknown.data1; + PHYSFS_sint64 rc = PHYSFS_read(handle, ptr, size, maxnum); + if (rc != maxnum) + { + if (!PHYSFS_eof(handle)) /* not EOF? Must be an error. */ + SDL_SetError("PhysicsFS error: %s", PHYSFS_getLastError()); + } /* if */ + + return((int) rc); +} /* physfsrwops_read */ + + +static int physfsrwops_write(SDL_RWops *rw, const void *ptr, int size, int num) +{ + PHYSFS_file *handle = (PHYSFS_file *) rw->hidden.unknown.data1; + PHYSFS_sint64 rc = PHYSFS_write(handle, ptr, size, num); + if (rc != num) + SDL_SetError("PhysicsFS error: %s", PHYSFS_getLastError()); + + return((int) rc); +} /* physfsrwops_write */ + + +static int physfsrwops_close(SDL_RWops *rw) +{ + PHYSFS_file *handle = (PHYSFS_file *) rw->hidden.unknown.data1; + if (!PHYSFS_close(handle)) + { + SDL_SetError("PhysicsFS error: %s", PHYSFS_getLastError()); + return(-1); + } /* if */ + + SDL_FreeRW(rw); + return(0); +} /* physfsrwops_close */ + + +static SDL_RWops *create_rwops(PHYSFS_file *handle) +{ + SDL_RWops *retval = NULL; + + if (handle == NULL) + SDL_SetError("PhysicsFS error: %s", PHYSFS_getLastError()); + else + { + retval = SDL_AllocRW(); + if (retval != NULL) + { + retval->seek = physfsrwops_seek; + retval->read = physfsrwops_read; + retval->write = physfsrwops_write; + retval->close = physfsrwops_close; + retval->hidden.unknown.data1 = handle; + } /* if */ + } /* else */ + + return(retval); +} /* create_rwops */ + + +SDL_RWops *PHYSFSRWOPS_makeRWops(PHYSFS_file *handle) +{ + SDL_RWops *retval = NULL; + if (handle == NULL) + SDL_SetError("NULL pointer passed to PHYSFSRWOPS_makeRWops()."); + else + retval = create_rwops(handle); + + return(retval); +} /* PHYSFSRWOPS_makeRWops */ + + +SDL_RWops *PHYSFSRWOPS_openRead(const char *fname) +{ + return(create_rwops(PHYSFS_openRead(fname))); +} /* PHYSFSRWOPS_openRead */ + + +SDL_RWops *PHYSFSRWOPS_openWrite(const char *fname) +{ + return(create_rwops(PHYSFS_openWrite(fname))); +} /* PHYSFSRWOPS_openWrite */ + + +SDL_RWops *PHYSFSRWOPS_openAppend(const char *fname) +{ + return(create_rwops(PHYSFS_openAppend(fname))); +} /* PHYSFSRWOPS_openAppend */ + + +/* end of physfsrwops.c ... */ + +#endif //USE_PHYSFS diff --git a/tab2space.py b/tab2space.py new file mode 100755 index 0000000..b0ce84f --- /dev/null +++ b/tab2space.py @@ -0,0 +1,43 @@ +#!/usr/bin/python + + +#Python script used to convert tabs to spaces. +import os,re + +def ProcessFile(filename): + linenum = 0 + print filename, + lines = open(filename,'r').readlines() + f = open(filename,'w') + for line in lines: + linenum+=1 + f.write(line.expandtabs(4)) + if len(line) > 80: + print linenum,'[',len(line),']', + f.close() + print 'Done!' + +def FileType(filename): + try: + return filename.split('.')[1] + except: + return '' + +def ProcessDir(dir): + entries = os.listdir(dir) + for entry in entries: + if os.path.isdir(os.path.join(dir,entry)): + ProcessDir(os.path.join(dir,entry)) + else: + type = FileType(entry) + if(type == 'cpp' or type == 'h' or type == 'txt'): + ProcessFile(os.path.join(dir,entry)) + + +def main(): + dir = os.getcwd() + ProcessDir(dir) + +main() + + diff --git a/test/ZFontTest.cpp b/test/ZFontTest.cpp new file mode 100644 index 0000000..60be1aa --- /dev/null +++ b/test/ZFontTest.cpp @@ -0,0 +1,87 @@ +/******************************************************************************* + This file is Part of the ZEngine Library for SDL Game Development. + Copyright (C) 2002 ConceptOfZero.net + + Licensed under the BSD License, see licensing.txt. + + The maintainer of this library is James Turk (jturk@conceptofzero.net) + and the home of this Library is http://www.conceptofzero.net/ +*******************************************************************************/ + +#include +#include +using namespace std; +using namespace ZE; + +void Initialize() +{ + ZEngine *engine = ZEngine::GetInstance(); + ZConfigFile cfg("tests.zcf"); + int w,h,bpp; + bool fs; + string title; + + w = cfg.GetInt("ZFontTest","width",800); + h = cfg.GetInt("ZFontTest","height",600); + bpp = cfg.GetInt("ZFontTest","bpp",32); + fs = cfg.GetBool("ZFontTest","fullscreen",false); + title = cfg.GetString("ZFontTest","title","ZFont Test"); + + engine->SetupDisplay(w,h,bpp,fs); + engine->CreateWindow(title); +} + +void Test() +{ + ZEngine *engine = ZEngine::GetInstance(); + + //Open and Setup all the Fonts and Create Images// + ZImage text[5]; + ZFont almonte("data/almontew.ttf",48), axaxax("data/axaxax.ttf",32), betsy("data/betsy.ttf",64); + almonte.SetColor(255,0,0); + almonte.DrawText("This is the font test.",text[0]); + axaxax.SetColor(0,255,255); + axaxax.SetStyle(true,false,false); + axaxax.DrawText("Fonts free from: ",text[1]); + axaxax.SetStyle(false,true,true); + axaxax.DrawText("http://larabiefonts.com/",text[2]); + almonte.SetBGColor(0,0,128); + almonte.SetColor(0,0,255); + almonte.SetStyle(false,true,false); + almonte.DrawShadedText("Shaded, italic, bold and underlined tested. ",text[3]); + betsy.SetColor(255,255,255); + betsy.DrawText("Font test successful.",text[4]); + + do + { + //In the active loop, check events first// + engine->CheckEvents(); + if(engine->KeyIsPressed(SDLK_s)) + { + //code to toggle screen// + engine->SetupDisplay(engine->GetWidth(),engine->GetHeight(),engine->GetBPP(),!engine->IsFullscreen()); + engine->CreateWindow("ZImage Test"); + } + if(engine->KeyIsPressed(SDLK_ESCAPE)) + engine->RequestQuit(); + + engine->Clear(); //clear screen + //draw the images// + for(int i=0; i <= 4; i++) + text[i].Draw(10*i,50*i); + engine->UpdateScreen(); //update the screen + + } while(!engine->QuitRequested()); //quit only when engine has encountered a quit request +} + +int main(int argc, char *argv[]) +{ + ZEngine *engine = ZEngine::GetInstance(); + + Initialize(); + //engine->InitPhysFS(argv[0]); //remove this line if PhysFS is not available + Test(); + + ZEngine::ReleaseInstance(); //release engine instance + return 0; +} diff --git a/test/ZImageTest.cpp b/test/ZImageTest.cpp new file mode 100644 index 0000000..892fd3e --- /dev/null +++ b/test/ZImageTest.cpp @@ -0,0 +1,87 @@ +/******************************************************************************* + This file is Part of the ZEngine Library for SDL Game Development. + Copyright (C) 2002 ConceptOfZero.net + + Licensed under the BSD License, see licensing.txt. + + The maintainer of this library is James Turk (jturk@conceptofzero.net) + and the home of this Library is http://www.conceptofzero.net/ +*******************************************************************************/ + +#include +#include +using namespace std; +using namespace ZE; + +void Initialize() +{ + ZEngine *engine = ZEngine::GetInstance(); + ZConfigFile cfg("tests.zcf"); + int w,h,bpp; + bool fs; + string title; + + w = cfg.GetInt("ZImageTest","width",800); + h = cfg.GetInt("ZImageTest","height",600); + bpp = cfg.GetInt("ZImageTest","bpp",32); + fs = cfg.GetBool("ZImageTest","fullscreen",false); + title = cfg.GetString("ZImageTest","title","ZImage Test"); + + engine->SetupDisplay(w,h,bpp,fs); + engine->CreateWindow(title); +} + +void Test() +{ + ZEngine *engine = ZEngine::GetInstance(); + + //Open and Setup all the Images// + SDL_Surface *temp; + ZImage image1, image2("data/test01.bmp"), image3(image2.GetImage(),20,20,20,20), textImage; + ZFont font("data/almontew.ttf",30); + + temp = SDL_LoadBMP("data/test02.bmp"); //this is a separate surface + image1.Attach(temp); //this attaches the surface into itself + temp = NULL; //and temp will now be controlled and freed by image1 + image1.SetColorKey(engine->MapColor(255,0,255)); + image2.SetAlpha(75); + image2.SetColorKey(engine->MapColor(255,0,255)); + font.SetColor(0,255,0); + font.SetBGColor(0,0,255); + font.DrawShadedText("ZImage Test.",textImage); + + do + { + //In the active loop, check events first// + engine->CheckEvents(); + if(engine->KeyIsPressed(SDLK_s)) + { + //code to toggle screen// + engine->SetupDisplay(engine->GetWidth(),engine->GetHeight(),engine->GetBPP(),!engine->IsFullscreen()); + engine->CreateWindow("ZImage Test"); + } + if(engine->KeyIsPressed(SDLK_ESCAPE)) + engine->RequestQuit(); + + engine->Clear(); //clear screen + //draw the images// + image1.Draw(0,0); + image2.Draw(100,0); + image3.Draw(200,0); + textImage.Draw(0,100); + engine->UpdateScreen(); //update the screen + + } while(!engine->QuitRequested()); //quit only when engine has encountered a quit request +} + +int main(int argc, char **argv) +{ + ZEngine *engine = ZEngine::GetInstance(); + + Initialize(); + //engine->InitPhysFS(argv[0]); //remove this line if PhysFS is not available + Test(); + + ZEngine::ReleaseInstance(); //release engine instance + return 0; +} diff --git a/test/ZMouseTest.cpp b/test/ZMouseTest.cpp new file mode 100644 index 0000000..907539c --- /dev/null +++ b/test/ZMouseTest.cpp @@ -0,0 +1,97 @@ +/******************************************************************************* + This file is Part of the ZEngine Library for SDL Game Development. + Copyright (C) 2002 ConceptOfZero.net + + Licensed under the BSD License, see licensing.txt. + + The maintainer of this library is James Turk (jturk@conceptofzero.net) + and the home of this Library is http://www.conceptofzero.net/ +*******************************************************************************/ + +#include +#include +using namespace std; +using namespace ZE; + +void Initialize() +{ + ZEngine *engine = ZEngine::GetInstance(); + ZConfigFile cfg("tests.zcf"); + int w,h,bpp; + bool fs; + string title; + + w = cfg.GetInt("ZMouseTest","width",800); + h = cfg.GetInt("ZMouseTest","height",600); + bpp = cfg.GetInt("ZMouseTest","bpp",32); + fs = cfg.GetBool("ZMouseTest","fullscreen",false); + title = cfg.GetString("ZMouseTest","title","ZMouse Test"); + + engine->SetupDisplay(w,h,bpp,fs); + engine->CreateWindow(title); +} + +void Test() +{ + ZEngine *engine = ZEngine::GetInstance(); + + //Open and Setup all the Images// + ZImage text[3], cursor("data/cursor.bmp"); + ZFont font("data/almontew.ttf",30); + SDL_Rect textRect; + + engine->HideCursor(); + cursor.SetColorKey(engine->MapColor(255,0,255)); + + font.SetColor(0,255,0); + font.SetBGColor(0,0,255); + font.DrawText("Mouse Test",text[0]); + font.DrawShadedText("Mouse Test",text[1]); + textRect.x = textRect.y = 100; + textRect.w = font.GetStringWidth("Mouse Test"); + textRect.h = font.GetStringHeight("Mouse Test"); + + do + { + //In the active loop, check events first// + engine->CheckEvents(); + if(engine->KeyIsPressed(SDLK_s)) + { + //code to toggle screen// + engine->SetupDisplay(engine->GetWidth(),engine->GetHeight(),engine->GetBPP(),!engine->IsFullscreen()); + engine->CreateWindow("ZEngine Mouse Test"); + } + if(engine->KeyIsPressed(SDLK_ESCAPE)) + engine->RequestQuit(); + + //show where mouse is (clicked or not)// + if(engine->RButtonPressed()) + font.DrawText(FormatStr("Right button clicked at %d,%d",engine->GetMouseX(),engine->GetMouseY()),text[2]); + else if(engine->LButtonPressed()) + font.DrawText(FormatStr("Left button clicked at %d,%d",engine->GetMouseX(),engine->GetMouseY()),text[2]); + else + font.DrawText(FormatStr("Mouse at %d,%d",engine->GetMouseX(),engine->GetMouseY()),text[2]); + + + engine->Clear(); //clear screen + //draw the images// + text[engine->MouseInRect(&textRect)].Draw(100,100); + text[2].Draw(0,0); + cursor.Draw(engine->GetMouseX()-8,engine->GetMouseY()-8); + + engine->UpdateScreen(); //update the screen + + } while(!engine->QuitRequested()); //quit only when engine has encountered a quit request +} + +int main(int argc, char *argv[]) +{ + ZEngine *engine = ZEngine::GetInstance(); + + Initialize(); + //engine->InitPhysFS(argv[0]); //remove this line if PhysFS is not available + Test(); + + ZEngine::ReleaseInstance(); //release engine instance + return 0; +} diff --git a/test/ZMusicTest.cpp b/test/ZMusicTest.cpp new file mode 100644 index 0000000..c932ed6 --- /dev/null +++ b/test/ZMusicTest.cpp @@ -0,0 +1,111 @@ +/******************************************************************************* + This file is Part of the ZEngine Library for SDL Game Development. + Copyright (C) 2002 ConceptOfZero.net + + Licensed under the BSD License, see licensing.txt. + + The maintainer of this library is James Turk (jturk@conceptofzero.net) + and the home of this Library is http://www.conceptofzero.net/ +*******************************************************************************/ + +#include +#include +using namespace std; +using namespace ZE; + +void Initialize() +{ + ZEngine *engine = ZEngine::GetInstance(); + ZConfigFile cfg("tests.zcf"); + int w,h,bpp; + bool fs; + string title; + + w = cfg.GetInt("ZMusicTest","width",800); + h = cfg.GetInt("ZMusicTest","height",600); + bpp = cfg.GetInt("ZMusicTest","bpp",32); + fs = cfg.GetBool("ZMusicTest","fullscreen",false); + title = cfg.GetString("ZMusicTest","title","ZMusic Test"); + + engine->SetupDisplay(w,h,bpp,fs); + engine->CreateWindow(title); +} + +void Test() +{ + ZEngine *engine = ZEngine::GetInstance(); + + ZMusic song("data/music.ogg"); + ZFont font("data/almontew.ttf",48); + ZImage text[4]; + + if(!song.IsLoaded()) //this executes if there is no music.ogg file + { + engine->SetupDisplay(800,70,32,false); + engine->CreateWindow("ZMusic Test"); + font.DrawText("Music.ogg does not exist, please read music.txt.",text[0]); + text[0].Draw(0,0); + engine->UpdateScreen(); + do + { + engine->CheckEvents(); + } while(!engine->QuitRequested()); + } + else //this is the actual example + { + font.DrawText("(P)ause\t(U)npause\t(R)ewind",text[0]); + font.DrawText("(F)ade Out\t(H)alt\t",text[1]); + font.DrawText("Space - Play\t Up/Down - Control Volume",text[2]); + + song.Play(); + do + { + //In the active loop, check events first// + engine->CheckEvents(); + if(engine->KeyIsPressed(SDLK_s)) + { + //code to toggle screen// + engine->SetupDisplay(engine->GetWidth(),engine->GetHeight(),engine->GetBPP(),!engine->IsFullscreen()); + engine->CreateWindow("ZMusic Test"); + } + if(engine->KeyIsPressed(SDLK_ESCAPE)) + engine->RequestQuit(); + if(engine->KeyIsPressed(SDLK_r)) + song.Rewind(); + if(engine->KeyIsPressed(SDLK_p)) + song.Pause(); + if(engine->KeyIsPressed(SDLK_u)) + song.Unpause(); + if(engine->KeyIsPressed(SDLK_f)) + song.Stop(5000); + if(engine->KeyIsPressed(SDLK_h)) + song.Stop(); + if(engine->KeyIsPressed(SDLK_SPACE)) + song.Play(); + if(engine->KeyIsPressed(SDLK_UP)) + song.SetVolume(song.GetVolume()+1); + if(engine->KeyIsPressed(SDLK_DOWN)) + song.SetVolume(song.GetVolume()-1); + + + font.DrawText(FormatStr("Volume: %d",song.GetVolume()),text[3]); + + engine->Clear(); //clear screen + for(int i=0; i < 4; i++) + text[i].Draw(0,i*50); + engine->UpdateScreen(); //update the screen + } while(!engine->QuitRequested()); //quit only when engine has encountered a quit request + } +} + +int main(int argc, char *argv[]) +{ + ZEngine *engine = ZEngine::GetInstance(); + + Initialize(); + //engine->InitPhysFS(argv[0]); //remove this line if PhysFS is not available + Test(); + + ZEngine::ReleaseInstance(); //release engine instance + return 0; +} diff --git a/test/ZRectTest.cpp b/test/ZRectTest.cpp new file mode 100644 index 0000000..90042fd --- /dev/null +++ b/test/ZRectTest.cpp @@ -0,0 +1,90 @@ +/******************************************************************************* + This file is Part of the ZEngine Library for SDL Game Development. + Copyright (C) 2002 ConceptOfZero.net + + Licensed under the BSD License, see licensing.txt. + + The maintainer of this library is James Turk (jturk@conceptofzero.net) + and the home of this Library is http://www.conceptofzero.net/ +*******************************************************************************/ + +#include +#include +using namespace std; +using namespace ZE; + +void Initialize() +{ + ZEngine *engine = ZEngine::GetInstance(); + ZConfigFile cfg("tests.zcf"); + int w,h,bpp; + bool fs; + string title; + + w = cfg.GetInt("ZRectTest","Width",800); + h = cfg.GetInt("ZRectTest","height",600); + bpp = cfg.GetInt("ZRectTest","bpp",32); + fs = cfg.GetBool("ZRectTest","fullscreen",false); + title = cfg.GetString("ZRectTest","title","ZRect Test"); + + engine->SetupDisplay(w,h,bpp,fs); + engine->CreateWindow(title); +} + +void Test() +{ + ZEngine *engine = ZEngine::GetInstance(); + ZRect moveRect(0,0,25,25),stillRect(100,100,100,100); + + do + { + //In the active loop, check events first// + engine->CheckEvents(); + if(engine->KeyIsPressed(SDLK_s)) + { + //code to toggle screen// + engine->SetupDisplay(engine->GetWidth(),engine->GetHeight(),engine->GetBPP(),!engine->IsFullscreen()); + engine->CreateWindow("ZRect Test"); + } + if(engine->KeyIsPressed(SDLK_ESCAPE)) + engine->RequestQuit(); + //movement// + if(engine->KeyIsPressed(SDLK_LEFT)) + moveRect.MoveRel(-3,0); + if(engine->KeyIsPressed(SDLK_RIGHT)) + moveRect.MoveRel(3,0); + if(engine->KeyIsPressed(SDLK_UP)) + moveRect.MoveRel(0,-3); + if(engine->KeyIsPressed(SDLK_DOWN)) + moveRect.MoveRel(0,3); + if(engine->KeyIsPressed(SDLK_EQUALS)) + { + moveRect.MoveRel(-1,-1); + moveRect.ResizeRel(2,2); + } + if(engine->KeyIsPressed(SDLK_MINUS)) + { + moveRect.MoveRel(1,1); + moveRect.ResizeRel(-2,-2); + } + + engine->Clear(); + engine->Clear(engine->MapColor(255,0,0,128),&moveRect.SDLrect()); + engine->Clear(engine->MapColor(0,0,255),&stillRect.SDLrect()); + engine->Clear(engine->MapColor(0,255,0),&moveRect.Intersection(stillRect).SDLrect()); + engine->UpdateScreen(); + + } while(!engine->QuitRequested()); +} + +int main(int argc, char *argv[]) +{ + ZEngine *engine = ZEngine::GetInstance(); + + Initialize(); + //engine->InitPhysFS(argv[0]); //remove this line if PhysFS is not available + Test(); + + ZEngine::ReleaseInstance(); //release engine instance + return 0; +} diff --git a/test/ZSoundTest.cpp b/test/ZSoundTest.cpp new file mode 100644 index 0000000..1f3a3c9 --- /dev/null +++ b/test/ZSoundTest.cpp @@ -0,0 +1,110 @@ +/******************************************************************************* + This file is Part of the ZEngine Library for SDL Game Development. + Copyright (C) 2002 ConceptOfZero.net + + Licensed under the BSD License, see licensing.txt. + + The maintainer of this library is James Turk (jturk@conceptofzero.net) + and the home of this Library is http://www.conceptofzero.net/ +*******************************************************************************/ + +#include +#include +using namespace std; +using namespace ZE; + +void Initialize() +{ + ZEngine *engine = ZEngine::GetInstance(); + ZConfigFile cfg("tests.zcf"); + int w,h,bpp; + bool fs; + string title; + + w = cfg.GetInt("ZSoundTest","width",800); + h = cfg.GetInt("ZSoundTest","height",600); + bpp = cfg.GetInt("ZSoundTest","bpp",32); + fs = cfg.GetBool("ZSoundTest","fullscreen",false); + title = cfg.GetString("ZSoundTest","title","ZSound Test"); + + engine->SetupDisplay(w,h,bpp,fs); + engine->CreateWindow(title); +} + +void Test() +{ + ZEngine *engine = ZEngine::GetInstance(); + + string name[5] = { "monkey", "rooster", "kick", "carcrash", "whip" }; + ZSound sample[5]; + ZFont font("data/almontew.ttf",48); + ZImage text[6]; + int sampleNum = 0; + + for(int i=0; i < 5; i++) + sample[i].Open(FormatStr("data/%s.wav",name[i].c_str())); + + font.DrawText("(P)ause\t(U)npause",text[0]); + font.DrawText("(F)ade Out\t(H)alt\t",text[1]); + font.DrawText("Space - Play\t Up/Down - Control Volume",text[2]); + font.DrawText("1-5 Change Sample Being Controled",text[3]); + do + { + //In the active loop, check events first// + engine->CheckEvents(); + if(engine->KeyIsPressed(SDLK_s)) + { + //code to toggle screen// + engine->SetupDisplay(engine->GetWidth(),engine->GetHeight(),engine->GetBPP(),!engine->IsFullscreen()); + engine->CreateWindow("ZSound Test"); + } + if(engine->KeyIsPressed(SDLK_ESCAPE)) + engine->RequestQuit(); + if(engine->KeyIsPressed(SDLK_1)) + sampleNum = 0; + if(engine->KeyIsPressed(SDLK_2)) + sampleNum = 1; + if(engine->KeyIsPressed(SDLK_3)) + sampleNum = 2; + if(engine->KeyIsPressed(SDLK_4)) + sampleNum = 3; + if(engine->KeyIsPressed(SDLK_5)) + sampleNum = 4; + if(engine->KeyIsPressed(SDLK_p)) + sample[sampleNum].Pause(); + if(engine->KeyIsPressed(SDLK_u)) + sample[sampleNum].Unpause(); + if(engine->KeyIsPressed(SDLK_f)) + sample[sampleNum].Stop(5000); + if(engine->KeyIsPressed(SDLK_h)) + sample[sampleNum].Stop(); + if(engine->KeyIsPressed(SDLK_SPACE)) + sample[sampleNum].Play(); + if(engine->KeyIsPressed(SDLK_UP)) + sample[sampleNum].SetVolume(sample[sampleNum].GetVolume()+1); + if(engine->KeyIsPressed(SDLK_DOWN)) + sample[sampleNum].SetVolume(sample[sampleNum].GetVolume()-1); + + + font.DrawText(FormatStr("Volume: %d",sample[sampleNum].GetVolume()),text[4]); + font.DrawText(FormatStr("Sample: %s",name[sampleNum].c_str()),text[5]); + + engine->Clear(); //clear screen + for(int i=0; i < 6; i++) + text[i].Draw(0,i*50); + engine->UpdateScreen(); //update the screen + + } while(!engine->QuitRequested()); //quit only when engine has encountered a quit request +} + +int main(int argc, char *argv[]) +{ + ZEngine *engine = ZEngine::GetInstance(); + + Initialize(); + //engine->InitPhysFS(argv[0]); //remove this line if PhysFS is not available + Test(); + + ZEngine::ReleaseInstance(); //release engine instance + return 0; +} diff --git a/test/ZTimerTest.cpp b/test/ZTimerTest.cpp new file mode 100644 index 0000000..59e5a2a --- /dev/null +++ b/test/ZTimerTest.cpp @@ -0,0 +1,127 @@ +/******************************************************************************* + This file is Part of the ZEngine Library for SDL Game Development. + Copyright (C) 2002 ConceptOfZero.net + + Licensed under the BSD License, see licensing.txt. + + The maintainer of this library is James Turk (jturk@conceptofzero.net) + and the home of this Library is http://www.conceptofzero.net/ +*******************************************************************************/ + +#include +#include +using namespace std; +using namespace ZE; + +void Initialize() +{ + ZEngine *engine = ZEngine::GetInstance(); + ZConfigFile cfg("tests.zcf"); + int w,h,bpp; + bool fs; + string title; + + w = cfg.GetInt("ZTimerTest","width",800); + h = cfg.GetInt("ZTimerTest","height",600); + bpp = cfg.GetInt("ZTimerTest","bpp",32); + fs = cfg.GetBool("ZTimerTest","fullscreen",false); + title = cfg.GetString("ZTimerTest","title","ZTimer Test"); + + engine->SetupDisplay(w,h,bpp,fs); + engine->CreateWindow(title); +} + +void Test() +{ + ZEngine *engine = ZEngine::GetInstance(); + + string TimerName[3] = {"ZEngine Timer", "ZEngine Hooked Timer", "SDL Hooked Timer"}; + int curTimer = 0; + + //Open and Setup Font and Create Images and Timers// + ZImage text[5]; + ZFont font("data/almontew.ttf",48); + ZTimer TimerOne, TimerTwo(false); //Timer Two is on the SDL Timer. + + //do this only once// + font.DrawText("(T)oggle | (P)ause | (U)npause",text[4]); + + do + { + //In the active loop, check events first// + engine->CheckEvents(); + if(engine->KeyIsPressed(SDLK_s)) + { + //code to toggle screen// + engine->SetupDisplay(engine->GetWidth(),engine->GetHeight(),engine->GetBPP(),!engine->IsFullscreen()); + engine->CreateWindow("ZImage Test"); + } + if(engine->KeyIsPressed(SDLK_ESCAPE)) + engine->RequestQuit(); + //pause current timer// + if(engine->KeyIsPressed(SDLK_p)) + { + switch(curTimer) + { + case 0: + engine->PauseTimer(); + break; + case 1: + TimerOne.Pause(); + break; + case 2: + TimerTwo.Pause(); + break; + } + } + //unpause current timer// + if(engine->KeyIsPressed(SDLK_u)) + { + switch(curTimer) + { + case 0: + engine->UnpauseTimer(); + break; + case 1: + TimerOne.Unpause(); + break; + case 2: + TimerTwo.Unpause(); + break; + } + } + //switch// + if(engine->KeyIsPressed(SDLK_t)) + { + if(++curTimer > 2) + curTimer = 0; + engine->Sleep(200); + } + + //Render all the fonts// + font.DrawText(FormatStr("Current Timer: %s",TimerName[curTimer].c_str()),text[0]); + font.DrawText(FormatStr("%s Time: %d",TimerName[0].c_str(),engine->GetTime()),text[1]); + font.DrawText(FormatStr("%s Time: %d",TimerName[1].c_str(),TimerOne.GetTime()),text[2]); + font.DrawText(FormatStr("%s Time: %d",TimerName[2].c_str(),TimerTwo.GetTime()),text[3]); + + engine->Clear(); //clear screen + + for(int i=0; i <= 4; i++) + text[i].Draw(0,i*50); + + engine->UpdateScreen(); //update the screen + + } while(!engine->QuitRequested()); //quit only when engine has encountered a quit request +} + +int main(int argc, char *argv[]) +{ + ZEngine *engine = ZEngine::GetInstance(); + + Initialize(); + //engine->InitPhysFS(argv[0]); //remove this line if PhysFS is not available + Test(); + + ZEngine::ReleaseInstance(); //release engine instance + return 0; +} diff --git a/test/bin/data/almontew.ttf b/test/bin/data/almontew.ttf new file mode 100644 index 0000000000000000000000000000000000000000..a3fa930b1e51c62011d7f9766a062de9fff4d97c GIT binary patch literal 165024 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�(CBi&ZCD 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 literal 0 HcmV?d00001 diff --git a/test/bin/data/axaxax.ttf b/test/bin/data/axaxax.ttf new file mode 100644 index 0000000000000000000000000000000000000000..602ceaefdcf9dfaf504ced17faea5f25f0994aad GIT binary patch literal 41596 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 M6@@rYna%k7zZr&e=Kufz literal 0 HcmV?d00001 diff --git a/test/bin/data/betsy.txt b/test/bin/data/betsy.txt new file mode 100644 index 0000000..7d43419 --- /dev/null +++ b/test/bin/data/betsy.txt @@ -0,0 +1,63 @@ +BETSY.TTF + +Here's how you can access the control keys in Betsy Flanagan + +Hold 'ALT' type a 4 digit number on your number pad and voila! + +0161 blank key +0162 blank key +0163 blank key +0164 blank key +0165 Alt +0166 Ctrl +0167 Shift with arrow +0168 Shift +0169 Enter with arrow +0170 Enter +0171 Space +0172 F1 +0173 F2 +0174 F3 +0175 F4 +0176 F5 +0177 F6 +0178 F7 +0179 F8 +0180 F9 +0181 F10 +0182 F11 +0183 F12 +0184 Esc Wide +0185 Esc +0186 Tab +0187 Caps +0188 Caps Lock +0189 Num Lock +0190 Print Screen +0191 Scroll Lock +0192 Pause +0193 Ins +0194 Del +0195 Home +0196 End +0197 Page Up +0198 Page Down +0199 left arrow +0200 up arrow +0201 right arrow +0202 down arrow +0203 Bksp +0204 Back +0205 Space +0206 Spacebar +0207 Windows Key +0208 Properties Key + +Ray Larabie +Larabie Fonts + +rlarabie@hotmail.com +http://www.larabiefonts.com +http://come.to/larabiefonts +http://www.goldenapplecomics.com/larabiefonts +http://www.swnakarmy.net/larabiefonts \ No newline at end of file diff --git a/test/bin/data/carcrash.wav b/test/bin/data/carcrash.wav new file mode 100644 index 0000000000000000000000000000000000000000..5d69e506ad010e3454ea2859d433fe6d370de0d8 GIT binary patch literal 23778 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 literal 0 HcmV?d00001 diff --git a/test/bin/data/monkey.wav b/test/bin/data/monkey.wav new file mode 100644 index 0000000000000000000000000000000000000000..08b6efdbf46af715866535658fc02745a77cda3e GIT binary patch literal 110098 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 literal 0 HcmV?d00001 diff --git a/test/bin/data/rooster.wav b/test/bin/data/rooster.wav new file mode 100644 index 0000000000000000000000000000000000000000..727baf9ca3a152580ae3c1fa371b2f8c5337d8f7 GIT binary patch literal 14050 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 P5sfBO-o(Gk|Mvd_Eq-|? literal 0 HcmV?d00001 diff --git a/test/bin/data/test01.bmp b/test/bin/data/test01.bmp new file mode 100644 index 0000000000000000000000000000000000000000..1cecf14e0b291ece54309095f068ca8cf769fb0a GIT binary patch literal 12342 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 literal 0 HcmV?d00001 diff --git a/test/bin/music.txt b/test/bin/music.txt new file mode 100644 index 0000000..37b8f22 --- /dev/null +++ b/test/bin/music.txt @@ -0,0 +1 @@ +To use the music example program it is necessary to obtain an ogg vorbis file (see http://www.kahvi.org/ for tons of options) and make sure that it is at test/bin/data/music.ogg \ No newline at end of file diff --git a/test/bin/readme.txt b/test/bin/readme.txt new file mode 100644 index 0000000..56b3eb7 --- /dev/null +++ b/test/bin/readme.txt @@ -0,0 +1,14 @@ +These are the test programs for ZEngine, all have the basic controls: +S - Switch Fullscreen/Windowed. +ALT-F4 or ESC- Quit Program + +The ZEngine Config File (tests.zcf) file may be manually edited using a text editor to change certain settings. + +ZMouseTest - Test ZEngine Mouse Capabilities. +ZImageTest - Test ZImage by drawing several images and a string to the screen. +ZFontTest - Test ZFont by outputting text in different formats. +ZTimerTest - Test ZTimer with three different timers. +ZMusicTest - Test ZMusic by playing a song, and allowing settings to be adjusted. + >NOTE: Requires adding an ogg file named music.ogg in data directory. +ZSoundTest - Test ZSound using various sound effects. +ZRectTest - Test Rectangles, and related collision. \ No newline at end of file diff --git a/test/bin/tests.zcf b/test/bin/tests.zcf new file mode 100644 index 0000000..bae3f5f --- /dev/null +++ b/test/bin/tests.zcf @@ -0,0 +1,5 @@ +[ZRectTest] + Width = 1000 + Height = 400 + Fullscreen = FALSE + Title = "If we are out of grapes, who will sell us Apple Juice?" diff --git a/thanks.txt b/thanks.txt new file mode 100644 index 0000000..476afd1 --- /dev/null +++ b/thanks.txt @@ -0,0 +1,17 @@ +The following must be thanked for ZEngine: + +Sam Lantinga and the SDL Crew - Creating and Maintaining such a great library and helping on the mailing list. + http://libsdl.org +Dimitri van Heesch and Everyone Associated with Doxygen - Providing such a great Documentation Tool. + http://doxygen.org +Everybody Associated with ConceptOfZero.net - Keeping Me Working on ZEngine. + http://conceptofzero.net +People on the Opensource.org Mailing list - Helping me figure out what license to use. + http://opensource.org +The people at the Kahvi Collective - Providing tons of free Ogg music. + http://www.kahvi.org/ +Sourceforge.net - Providing hosting for the project and CVS. + http://sourceforge.net + + +Also see the test/bin/Readme.txt file for credits on the data used in the demos. \ No newline at end of file diff --git a/todo.txt b/todo.txt new file mode 100644 index 0000000..7fc5d34 --- /dev/null +++ b/todo.txt @@ -0,0 +1,9 @@ +ZEngine Todo List + +-Proofread, update, clarify documentation. +-Add Support for PhysicsFS with SDL_ttf and SDL_mixer music. (Waiting on other libraries.) +-Write simple games using the library as examples +-Possibly add 3D extensions (Xenicor?) +-Add common game objects, particle system, basic sprites, etc. +-Add rotation-zooming support (SDL_rotozoom?) +-Look into scripting options and networking options. \ No newline at end of file diff --git a/vc7/ZEngine.sln b/vc7/ZEngine.sln new file mode 100644 index 0000000..5347e86 --- /dev/null +++ b/vc7/ZEngine.sln @@ -0,0 +1,72 @@ +Microsoft Visual Studio Solution File, Format Version 7.00 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ZEngine", "ZEngine.vcproj", "{65AA7404-28C1-4B15-979E-4D3A14092CC1}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ZImageTest", "ZImageTest.vcproj", "{7DA4211A-D6BD-4F3E-8FC6-AA47DC8EBC66}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ZFontTest", "ZFontTest.vcproj", "{999F6F58-3518-4F66-AEDD-FAD808DA2878}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ZTimerTest", "ZTimerTest.vcproj", "{18BBFFEC-92F0-40C7-BDF9-2C2D5CA62673}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ZMusicTest", "ZMusicTest.vcproj", "{C658B38D-B4E7-434D-8431-88BAD8CF0781}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ZSoundTest", "ZSoundTest.vcproj", "{1CE76EE8-27D4-41AE-9229-5B09922EBFE9}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ZMouseTest", "ZMouseTest.vcproj", "{68E3AB20-1BC1-4852-9A91-33DADFCED7CA}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ZRectTest", "ZRectTest.vcproj", "{37D500C5-E6C4-4E56-BFAA-33F1303B147C}" +EndProject +Global + GlobalSection(SolutionConfiguration) = preSolution + ConfigName.0 = Debug + ConfigName.1 = Release + EndGlobalSection + GlobalSection(ProjectDependencies) = postSolution + {7DA4211A-D6BD-4F3E-8FC6-AA47DC8EBC66}.0 = {65AA7404-28C1-4B15-979E-4D3A14092CC1} + {999F6F58-3518-4F66-AEDD-FAD808DA2878}.0 = {65AA7404-28C1-4B15-979E-4D3A14092CC1} + {18BBFFEC-92F0-40C7-BDF9-2C2D5CA62673}.0 = {65AA7404-28C1-4B15-979E-4D3A14092CC1} + {C658B38D-B4E7-434D-8431-88BAD8CF0781}.0 = {65AA7404-28C1-4B15-979E-4D3A14092CC1} + {1CE76EE8-27D4-41AE-9229-5B09922EBFE9}.0 = {65AA7404-28C1-4B15-979E-4D3A14092CC1} + {68E3AB20-1BC1-4852-9A91-33DADFCED7CA}.0 = {65AA7404-28C1-4B15-979E-4D3A14092CC1} + {37D500C5-E6C4-4E56-BFAA-33F1303B147C}.0 = {65AA7404-28C1-4B15-979E-4D3A14092CC1} + EndGlobalSection + GlobalSection(ProjectConfiguration) = postSolution + {65AA7404-28C1-4B15-979E-4D3A14092CC1}.Debug.ActiveCfg = Debug|Win32 + {65AA7404-28C1-4B15-979E-4D3A14092CC1}.Debug.Build.0 = Debug|Win32 + {65AA7404-28C1-4B15-979E-4D3A14092CC1}.Release.ActiveCfg = Release|Win32 + {65AA7404-28C1-4B15-979E-4D3A14092CC1}.Release.Build.0 = Release|Win32 + {7DA4211A-D6BD-4F3E-8FC6-AA47DC8EBC66}.Debug.ActiveCfg = Debug|Win32 + {7DA4211A-D6BD-4F3E-8FC6-AA47DC8EBC66}.Debug.Build.0 = Debug|Win32 + {7DA4211A-D6BD-4F3E-8FC6-AA47DC8EBC66}.Release.ActiveCfg = Release|Win32 + {7DA4211A-D6BD-4F3E-8FC6-AA47DC8EBC66}.Release.Build.0 = Release|Win32 + {999F6F58-3518-4F66-AEDD-FAD808DA2878}.Debug.ActiveCfg = Debug|Win32 + {999F6F58-3518-4F66-AEDD-FAD808DA2878}.Debug.Build.0 = Debug|Win32 + {999F6F58-3518-4F66-AEDD-FAD808DA2878}.Release.ActiveCfg = Release|Win32 + {999F6F58-3518-4F66-AEDD-FAD808DA2878}.Release.Build.0 = Release|Win32 + {18BBFFEC-92F0-40C7-BDF9-2C2D5CA62673}.Debug.ActiveCfg = Debug|Win32 + {18BBFFEC-92F0-40C7-BDF9-2C2D5CA62673}.Debug.Build.0 = Debug|Win32 + {18BBFFEC-92F0-40C7-BDF9-2C2D5CA62673}.Release.ActiveCfg = Release|Win32 + {18BBFFEC-92F0-40C7-BDF9-2C2D5CA62673}.Release.Build.0 = Release|Win32 + {C658B38D-B4E7-434D-8431-88BAD8CF0781}.Debug.ActiveCfg = Debug|Win32 + {C658B38D-B4E7-434D-8431-88BAD8CF0781}.Debug.Build.0 = Debug|Win32 + {C658B38D-B4E7-434D-8431-88BAD8CF0781}.Release.ActiveCfg = Release|Win32 + {C658B38D-B4E7-434D-8431-88BAD8CF0781}.Release.Build.0 = Release|Win32 + {1CE76EE8-27D4-41AE-9229-5B09922EBFE9}.Debug.ActiveCfg = Debug|Win32 + {1CE76EE8-27D4-41AE-9229-5B09922EBFE9}.Debug.Build.0 = Debug|Win32 + {1CE76EE8-27D4-41AE-9229-5B09922EBFE9}.Release.ActiveCfg = Release|Win32 + {1CE76EE8-27D4-41AE-9229-5B09922EBFE9}.Release.Build.0 = Release|Win32 + {68E3AB20-1BC1-4852-9A91-33DADFCED7CA}.Debug.ActiveCfg = Debug|Win32 + {68E3AB20-1BC1-4852-9A91-33DADFCED7CA}.Debug.Build.0 = Debug|Win32 + {68E3AB20-1BC1-4852-9A91-33DADFCED7CA}.Release.ActiveCfg = Release|Win32 + {68E3AB20-1BC1-4852-9A91-33DADFCED7CA}.Release.Build.0 = Release|Win32 + {37D500C5-E6C4-4E56-BFAA-33F1303B147C}.Debug.ActiveCfg = Debug|Win32 + {37D500C5-E6C4-4E56-BFAA-33F1303B147C}.Debug.Build.0 = Debug|Win32 + {37D500C5-E6C4-4E56-BFAA-33F1303B147C}.Release.ActiveCfg = Release|Win32 + {37D500C5-E6C4-4E56-BFAA-33F1303B147C}.Release.Build.0 = Release|Win32 + {110FE3E0-9B08-420A-BAF8-06FF3E77EEA1}.Debug.ActiveCfg = Debug|Win32 + {110FE3E0-9B08-420A-BAF8-06FF3E77EEA1}.Release.ActiveCfg = Release|Win32 + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + EndGlobalSection + GlobalSection(ExtensibilityAddIns) = postSolution + EndGlobalSection +EndGlobal diff --git a/vc7/ZEngine.vcproj b/vc7/ZEngine.vcproj new file mode 100644 index 0000000..2a478c7 --- /dev/null +++ b/vc7/ZEngine.vcproj @@ -0,0 +1,211 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/vc7/ZFontTest.vcproj b/vc7/ZFontTest.vcproj new file mode 100644 index 0000000..315812f --- /dev/null +++ b/vc7/ZFontTest.vcproj @@ -0,0 +1,123 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/vc7/ZImageTest.vcproj b/vc7/ZImageTest.vcproj new file mode 100644 index 0000000..276b041 --- /dev/null +++ b/vc7/ZImageTest.vcproj @@ -0,0 +1,123 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/vc7/ZMouseTest.vcproj b/vc7/ZMouseTest.vcproj new file mode 100644 index 0000000..3acc306 --- /dev/null +++ b/vc7/ZMouseTest.vcproj @@ -0,0 +1,122 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/vc7/ZMusicTest.vcproj b/vc7/ZMusicTest.vcproj new file mode 100644 index 0000000..17bb9c0 --- /dev/null +++ b/vc7/ZMusicTest.vcproj @@ -0,0 +1,122 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/vc7/ZRectTest.vcproj b/vc7/ZRectTest.vcproj new file mode 100644 index 0000000..b853313 --- /dev/null +++ b/vc7/ZRectTest.vcproj @@ -0,0 +1,122 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/vc7/ZSoundTest.vcproj b/vc7/ZSoundTest.vcproj new file mode 100644 index 0000000..3812375 --- /dev/null +++ b/vc7/ZSoundTest.vcproj @@ -0,0 +1,122 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/vc7/ZTimerTest.vcproj b/vc7/ZTimerTest.vcproj new file mode 100644 index 0000000..752b717 --- /dev/null +++ b/vc7/ZTimerTest.vcproj @@ -0,0 +1,122 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +