diff options
Diffstat (limited to 'MAFH2/fortuneengine/fortuneengine/GameEngine.py')
-rw-r--r-- | MAFH2/fortuneengine/fortuneengine/GameEngine.py | 502 |
1 files changed, 0 insertions, 502 deletions
diff --git a/MAFH2/fortuneengine/fortuneengine/GameEngine.py b/MAFH2/fortuneengine/fortuneengine/GameEngine.py deleted file mode 100644 index 48d7d3e..0000000 --- a/MAFH2/fortuneengine/fortuneengine/GameEngine.py +++ /dev/null @@ -1,502 +0,0 @@ -# FortuneEngine is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# FortuneEngine is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with the FortuneEngine. If not, see <http://www.gnu.org/licenses/>. -# -# Author: Justin Lewis <jlew.blackout@gmail.com> - -import pygame -from time import time -from GameEngineConsole import GameEngineConsole -from GameInspect import GameInspect -from DrawableFontObject import DrawableFontObject -from Scene import Scene - - -class GameEngine(object): - """ - The Fortune Engine GameEngine is a main loop wrapper around pygame. - It manages the event and drawing loops allowing the user to just - register for user events and drawing time in the draw loop. - """ - instance = None - - def __init__(self, width=1200, height=900, always_draw=False, - fps_cap=15, version=False, title="FortuneEngine"): - """ - Constructor for the game engine. - - @param width: Window width - @param height: Window height - @param always_draw: Boolean to set the animation mode to always - draw vs draw when set_dirty is called - @param fps_cap: Sets the framerate cap. Set to 0 to disable - the cap. Warning: setting the cap to 0 when - always draw = False will cause cpu 100% when - not driving. - @param version: If true, use new rendering system, false uses - only the draw system - @param title: Window Title - """ - GameEngine.instance = self - pygame.init() - pygame.mouse.set_visible(False) - self.__version = version #true is new, false is old - - # Window Settings - self.width = width - self.height = height - size = width, height - self.screen = pygame.display.set_mode(size) - pygame.display.set_caption(title) - self.__fps = DrawableFontObject("", pygame.font.Font(None, 17)) - self.__fps.setPosition(0, 0) - self.__scene = Scene(self.__fps) - - # Engine Internal Variables - self.__fps_cap = fps_cap - self.__showfps = False - self.__dirty = True - self.__always_draw = always_draw - self.__font = pygame.font.Font(None, 17) - self.__run_event = False - - # Variables to hold game engine elements and callbacks - self.__event_cb = [] - self.__draw_lst = [] - self.__object_hold = {} - - - # Game Timers - self.__active_event_timers = [] - self.__active_event_timers_tick = [] - - # Game Clock - self.clock = pygame.time.Clock() - self.__tick_time = 0 - - # Inspector - self._inspector = GameInspect(self.__object_hold) - - # Time Profiler Timers - self.__draw_time = {} - self.__draw_calls = {} - self.__event_time = {} - self.__event_calls = {} - self.__timer_time = {} - self.__timer_calls = {} - - # Initialize Py Console - self.console = GameEngineConsole(self, (0, 0, width, height / 2)) - - # Disable Mouse Usage - # TODO Allow mouse motion on request - pygame.event.set_blocked(pygame.MOUSEMOTION) - - def set_dirty(self): - """ - Sets the dirty flag to force the engine to draw the next time - it enters the draw flag. - """ - self.__dirty = True - - def get_scene(self): - """ - Returns the scene object - - @return: Returns the scene object held by the game engine - """ - return self.__scene - - def start_event_timer(self, function_cb, time): - """ - Starts a timer that fires a user event into the queue every "time" - milliseconds - - @param function_cb: The function to call when timer fires - @param time: Milliseconds between fires - """ - avail_timer = len(self.__active_event_timers) - - if avail_timer + pygame.USEREVENT < pygame.NUMEVENTS: - if function_cb not in self.__active_event_timers: - self.__timer_time[str(function_cb)] = 0 - self.__timer_calls[str(function_cb)] = 0 - - self.__active_event_timers.append(function_cb) - self.__active_event_timers_tick.append(time) - pygame.time.set_timer(pygame.USEREVENT + avail_timer, time) - else: - print "ERROR TIMER IN LIST" - else: - print "Ran out of timers :(" - self.stop_event_loop() - - def stop_event_timer(self, function_cb): - """ - Stops the timer that has id from firing - - @param function_cb: The function registered with the timer that - should be canceled - """ - try: - timer_id = self.__active_event_timers.index(function_cb) - except ValueError: - return - - pygame.time.set_timer(pygame.USEREVENT + timer_id, 0) - del self.__active_event_timers[timer_id] - del self.__active_event_timers_tick[timer_id] - - # Timers have been removed, now need to clear any events - # already fired and in the queue - pygame.event.clear(pygame.USEREVENT + timer_id) - - def list_event_timers(self): - """ - returns a list of configured timers, if the timers has a time of 0 the - timer is disabled - """ - timer_list = "Event Timers:\n" - i = 0 - for timer_item in self.__active_event_timers: - timer_list += "\t%d: %d\n" % (timer_item, - self.__active_event_timers_tick[i]) - i = i + 1 - - return timer_list - - def list_timer_time(self): - """ - Returns a string representation of the time the game spends - in each timer callback. - """ - mystr = "Timer Times:\n\tName\tCalls\tTotal Time\tAvg" - for key in self.__timer_time: - timer_times = self.__timer_time[key] - timer_calls = self.__timer_calls[key] - if timer_calls == 0: - avg = 0 - else: - avg = timer_times / timer_calls - - mystr = "%s\n\t%s\n\t\t%d\t%f\t%f" % \ - (mystr, key, timer_calls, timer_times, avg) - return mystr - - def start_main_loop(self): - """ - Starts the game loop. - - This function does not return until after the game loop exits - """ - self.__run_event = True - self._event_loop() - - def _draw(self, tick_time): - """ - Draws all elements in draw callback to the screen - - @param tick_time: The amount of time passed since last - draw cycle. (should be produced by - pygamme.clock.tick method) - """ - screen = self.screen - - # If console is active, we want to draw console, pausing - # game drawing (events are still being fired, just no - # draw updates. - if self.__version: - if self.console.active: - self.console.draw() - pygame.display.flip() - else: - for fnc in self.__draw_lst: - start = time() - fnc() - self.__draw_time[str(fnc)] += time() - start - self.__draw_calls[str(fnc)] += 1 - # Print Frame Rate - if self.__showfps: - self.__fps.changeText('FPS: %d' % self.clock.get_fps(), - (255, 255, 255)) - else: - self.__fps.changeText('') - self.__scene.update(tick_time) - pygame.display.update(self.__scene.draw(screen)) - else: - if self.console.active: - self.console.draw() - pygame.display.flip() - else: - for fnc in self.__draw_lst: - start = time() - fnc(screen, tick_time) - self.__draw_time[str(fnc)] += time() - start - self.__draw_calls[str(fnc)] += 1 - # Print Frame Rate - if self.__showfps: - text = self.__font.render('FPS: %d' % \ - self.clock.get_fps(), False, (255, 255, 255), - (159, 182, 205)) - screen.blit(text, (0, 0)) - pygame.display.flip() - - def _event_loop(self): - """ - The main event loop. - """ - while self.__run_event: - - event = pygame.event.poll() - - # Handle Game Quit Message - if event.type == pygame.QUIT: - self.__run_event = False - - # No-Op sent, draw if set to always draw - elif event.type == pygame.NOEVENT: - # Tick even if not drawing - # We want to pause the cpu from getting into a - # 100% usage looping on the poll until something - # becomes dirty - self.__tick_time += self.clock.tick(self.__fps_cap) - if self.__always_draw or self.__dirty: - self.__dirty = False - self._draw(self.__tick_time) - self.__tick_time = 0 - - - # Handle User event Timers - elif event.type >= pygame.USEREVENT and \ - event.type < pygame.NUMEVENTS: - - timer_id = event.type - pygame.USEREVENT - - # Call timer - str_rep = str(self.__active_event_timers[timer_id]) - start = time() - self.__active_event_timers[timer_id]() - self.__timer_time[str_rep] += time() - start - self.__timer_calls[str_rep] += 1 - - # Check if we should activate the console - elif event.type == pygame.KEYDOWN and event.key == pygame.K_w \ - and pygame.key.get_mods() & pygame.KMOD_CTRL: - self.console.set_active() - self.set_dirty() - - # Pass event to console - elif self.console.process_input(event): - self.set_dirty() - - # Pass events to all others - else: - # Make a copy first so that adding events don't get fired - # right away - list_cp = self.__event_cb[:] - - # Reverse list so that newest stuff is on top - # TODO: cache this list - list_cp.reverse() - - for cb in list_cp: - # Fire the event for all in cb and stop - # if the callback returns True - start = time() - retur_val = cb(event) - self.__event_time[str(cb)] += time() - start - self.__event_calls[str(cb)] += 1 - - if retur_val: - break - - def stop_event_loop(self): - """ - Sends a pygame.QUIT event into the event queue which - exits the event loop - """ - pygame.event.post(pygame.event.Event(pygame.QUIT)) - - def add_event_callback(self, cb): - """ - Adds event callback to the event callback stack - - @param cb: Callback to be added to the stack when events are fired. - """ - self.__event_time[str(cb)] = 0 - self.__event_calls[str(cb)] = 0 - self.__event_cb.append(cb) - - def remove_event_callback(self, cb): - """ - Removes an event from the event callback stack - - @param cb: The callback to remove from the event callback stack - @return: Returns true if successful in removing callback - """ - try: - self.__event_cb.remove(cb) - return True - except: - return False - - def list_event_callbacks(self): - """ - Returns a string representation of all events registered with the game - engine - """ - event_callbacks = "Event Listeners:\n" - for eventlst in self.__event_cb: - event_callbacks = "%s\t%s\n" % (event_callbacks, str(eventlst)) - return event_callbacks - - def list_event_time(self): - """ - Returns a string representation of the time the game spends - in each event callback. - """ - mystr = "Event Times:\n\tName\tCalls\tTotal Time\tAvg" - for key in self.__event_time: - event_times = self.__event_time[key] - event_calls = self.__event_calls[key] - if event_calls == 0: - avg = 0 - else: - avg = event_times / event_calls - - mystr = "%s\n\t%s\n\t\t%d\t%f\t%f" % \ - (mystr, key, event_calls, event_times, avg) - return mystr - - def add_draw_callback(self, fnc): - """ - Adds a callback to the draw list. Function will be passed the - game screen it should draw too. - - @param fnc: The function to call when system is drawing - """ - - self.__draw_time[str(fnc)] = 0 - self.__draw_calls[str(fnc)] = 0 - self.__draw_lst.append(fnc) - - def pop_draw_callback(self): - """ - Removes top of draw stack and returns it - - @return: Returns the top callback function that was removed - """ - return self.__draw_lst.pop() - - def clear_draw_callback(self): - """ - Empties draw callback stack - """ - self.__draw_lst = [] - - def remove_draw_callback(self, fnc): - """ - Removes a draw callback from the game engine draw function - - @param fnc: The callback function to remove - @return: Returns true if successful removal of the function - """ - try: - self.__draw_lst.remove(fnc) - return True - except: - return False - - def list_draw_callbacks(self): - """ - Lists all the draw callbacks currently registered with the game engine - """ - - callbacks = "Draw Callbacks:\n" - for eventlst in self.__draw_lst: - callbacks += "\t%s\n" % str(eventlst) - return callbacks - - def list_draw_time(self): - """ - Returns a string representation of the time the game spends - in each drawing callback. - """ - mystr = "Drawing Times:\n\tName\tCalls\tTotal Time\tAvg" - for key in self.__draw_time: - draw_times = self.__draw_time[key] - draw_calls = self.__draw_calls[key] - if draw_calls == 0: - avg = 0 - else: - avg = draw_times / draw_calls - - mystr = "%s\n\t%s\n\t\t%d\t%f\t%f" % \ - (mystr, key, draw_calls, draw_times, avg) - return mystr - - def has_object(self, name): - """ - Returns true if object is stored in game engine - - @param name: Name of the object to check if exists - @return: Returns true if object found - """ - return name in self.__object_hold - - def add_object(self, name, obj): - """ - Adds an object to the game engine datastore - - @param name: The name used to store the object - @param obj: The object to store - """ - self.__object_hold[name] = obj - - def get_object(self, name): - """ - Returns an object from the game engine datastore - - @param name: The name of object to return - @return: Returns the object - """ - return self.__object_hold[name] - - def remove_object(self, name): - """ - Removes an object from the game engine datastore - - @param name: The name of the object to remove - """ - del self.__object_hold[name] - - def list_objects(self): - """ - Returns a sting of registered objects - """ - objlist = "Objects Registered:\n" - for eventlst in self.__object_hold: - objlist += "\t%s\n" % str(eventlst) - return objlist - - def toggle_fps(self): - """ - Toggles fps display - """ - self.__showfps = not self.__showfps - - def art_scale(self, original, expected, width=True): - if width: - return int(self.width / float(expected) * float(original)) - else: - - return int(self.height / float(expected) * float(original)) |