@@ -0,0 +1 @@ | |||
__pycache__/ |
@@ -1 +1,11 @@ | |||
from game.application import Application | |||
import game.gbe | |||
def start(): | |||
t = game.gbe.Time() | |||
t.reset() | |||
d = game.gbe.Display() | |||
d.init() | |||
while t.aliveSeconds < 5.0: | |||
print(t.aliveSeconds) | |||
d.close() |
@@ -1,41 +0,0 @@ | |||
import time | |||
import pygame | |||
from pygame.locals import * | |||
class Application: | |||
def __init__(self, width=640, height=480): | |||
self._running = False | |||
self._init = False | |||
self._resolution = width, height | |||
self.lastFrameTime = 0 | |||
def init(self): | |||
pygame.init() | |||
self._display_surface = pygame.display.set_mode(self._resolution, pygame.HWSURFACE | pygame.DOUBLEBUF) | |||
self._init = True | |||
def on_event(self, event): | |||
if event.type == pygame.QUIT: | |||
self._running = False | |||
def on_cleanup(self): | |||
pygame.quit() | |||
def execute(self): | |||
# We want to automatically exit if app is already running or if app hasn't yet been init. | |||
if self._running or not self._init: | |||
return False | |||
self._running = True | |||
while self._running: | |||
# Calculate delta time since last frame. | |||
currentTime = time.time() | |||
dt = 0 | |||
if self.lastFrameTime != 0: | |||
dt = currentTime - self.lastFrameTime | |||
self.lastFrameTime = currentTime | |||
for event in pygame.event.get(): | |||
self.on_event(event) | |||
self.on_cleanup() |
@@ -0,0 +1,2 @@ | |||
from .core import Time | |||
from .core import Display |
@@ -0,0 +1,78 @@ | |||
''' | |||
Filename core.py | |||
Author: Bryan "ObsidianBlk" Miller | |||
Date Created: 8/1/2018 | |||
Python Version: 3.7 | |||
''' | |||
import time | |||
import pygame | |||
class Time: | |||
def __init__(self): | |||
self._dticks = 0 | |||
self._ldelta = 0 | |||
self._lastTick = 0 | |||
@property | |||
def delta(self): | |||
tick = int(round(time.time() * 1000)) | |||
dt = 0 | |||
if self._lastTick > 0: | |||
dt = tick - self._lastTick | |||
self._lastTick = tick | |||
self._ldelta = dt | |||
self._dticks += dt | |||
return dt | |||
@property | |||
def last_delta(self): | |||
return self._ldelta | |||
@property | |||
def aliveTicks(self): | |||
tick = int(round(time.time() * 1000)) | |||
dt = 0 | |||
if self._lastTick > 0: | |||
dt = tick - self._lastTick | |||
return self._dticks + dt | |||
@property | |||
def aliveSeconds(self): | |||
return self.aliveTicks / 1000.0 | |||
def reset(self): | |||
self.dticks = 0 | |||
self._lastTick = int(round(time.time() * 1000)) | |||
class Display: | |||
def __init__(self, width=640, height=480): | |||
self._init = False | |||
self._resolution = width, height | |||
@property | |||
def surface(self): | |||
return self._display_surface | |||
@property | |||
def width(self): | |||
return self._resolution[0] | |||
@property | |||
def height(self): | |||
return self._resolution[1] | |||
def init(self): | |||
if self._init == False: | |||
self._init = True | |||
pygame.init() | |||
self._display_surface = pygame.display.set_mode(self._resolution, pygame.HWSURFACE | pygame.DOUBLEBUF) | |||
def close(self): | |||
pygame.quit() | |||
@@ -0,0 +1,69 @@ | |||
import weakref | |||
import pygame | |||
def _getWeakRef(fn): | |||
if not hasattr(fn, "__func__"): | |||
return None | |||
if hasattr(fn, "__self__"): | |||
return weakref.WeakMethod(fn) | |||
return weakref.ref(fn) | |||
class EventError(Exception): | |||
pass | |||
class _Events: | |||
def __init__(self): | |||
self._signals = {} | |||
def _ClearUnreferenced(self): | |||
def isempty(r): | |||
return r() is not None | |||
for signal, sigs in self._signals: | |||
self._signals[signal] = filter(isempty, sigs) | |||
def listen(self, signal, fn): | |||
ref = _getWeakRef(fn) | |||
if ref is None or ref() is None: | |||
raise EventError("Expected a function callback.") | |||
if not signal in self._signals: | |||
self._signals[signal] = [] | |||
if not ref in self._signals[signal]: | |||
self._signal[signal].append(ref) | |||
def unlisten(self, signal, fn): | |||
ref = _getWeakRef(fn) | |||
if res is None or ref() is None: | |||
return # Not a function. Nothing to do. | |||
if signal in self._signals: | |||
if ref in self._signals[signal]: | |||
self._signals[signal].remove(ref) | |||
def unlisten_all(self, signal): | |||
if signal in self._signals: | |||
del self._signals[signal] | |||
def emit(self, signal, data): | |||
if signal in self._signals: | |||
for r in self._signals[signal]: | |||
fn = r() | |||
if fn is not None: | |||
fn(signal, data) | |||
self._ClearUnreferenced() | |||
# Create the actual Events instance :) | |||
Events = _Events() | |||
def pollEmitter(): | |||
for event in pygame.event.get(): | |||
#TODO: For each event obtains, convert it for the above Event dispatcher | |||
pass | |||
@@ -3,6 +3,7 @@ import game | |||
if __name__ == "__main__": | |||
app = game.Application() | |||
app.init() | |||
app.execute() | |||
game.start() | |||
#app = game.Application() | |||
#app.init() | |||
#app.execute() |