Source code for gloopy.gloopy
from __future__ import division
import logging
import sys
import pyglet
from pyglet.window import key
from .gameitem import GameItem
from .geom.vector import Vector
from .world import World
from .util.log import init_log
from .util.options import Options
from .util.screenshot import screenshot
from .view.render import Render
from .version import RELEASE
log = None
[docs]class Gloopy(object):
'''
.. function:: __init__()
Parses the command-line options, stores results in self.options
'''
[docs] def __init__(self):
global log
init_log()
log = logging.getLogger(__name__)
self.window = None
self.world = None
self.camera = None
self.render = None
self.options = Options(sys.argv)
self.time = None
[docs] def init(self, window=None):
'''
Initialise Gloopy. Must be called before calling :func:`run` to start
the event loop. You may pass in a pyglet.window.Window instance, or
if it is None, we will create a (non-visible) one, using self.options
to determine its parameters.
'''
log.info('v%s' % (RELEASE,))
if window is None:
window = pyglet.window.Window(
fullscreen=self.options.fullscreen,
vsync=self.options.vsync,
visible=False,
resizable=True,
)
self.window = window
self.world = World()
self.camera = GameItem(
position=Vector(0, 0, 10),
look_at=Vector.Origin,
)
self.world.add(self.camera)
self.render = Render(self.world, self.window, self.camera, self.options)
self.render.init()
self.window.on_draw = self.render.draw_window
self.window.on_key_press = self.on_key_press
[docs] def run(self):
'''
Schedules calls to self.update, makes window visible and starts the
event loop by calling pyglet.app.run()
'''
log.info('start')
self.time = 0.0
pyglet.clock.schedule(self.update)
self.window.set_visible()
self.window.invalid = False
try:
pyglet.app.run()
log.info('stop')
except:
log.error('abnormal stop')
raise
finally:
if self.window:
self.window.close()
[docs] def update(self, dt):
'''
Called before every screen refresh,
'''
dt = min(dt, 1 / 30.0)
self.time += dt
self.world.update_all(self.time, dt)
self.window.invalid = True
[docs] def on_key_press(self, symbol, modifiers):
'''
Handle key presses:
========= ==================
escape quit
--------- ------------------
f12 toggle fps display
--------- ------------------
f9 take screenshot
--------- ------------------
alt-enter toggle fullscreen
========= ==================
'''
if symbol == key.ESCAPE:
self.window.dispatch_event('on_close')
elif symbol == key.F12:
self.options.fps = not self.options.fps
elif symbol == key.ENTER and (modifiers & key.MOD_ALT):
log.info('fullscreen: %s' % (not self.window.fullscreen,))
self.window.set_fullscreen(not self.window.fullscreen)
elif symbol == key.F9:
screenshot()