base system finished
This commit is contained in:
parent
fdd3775da6
commit
dd85d592e1
74
audiosys.py
74
audiosys.py
|
@ -1,7 +1,75 @@
|
||||||
import simpleaudio
|
import simpleaudio as sa
|
||||||
class sound:
|
import wave
|
||||||
|
import base64
|
||||||
|
import os
|
||||||
|
|
||||||
|
# channels OK
|
||||||
|
# bytes per sample OK
|
||||||
|
# sample rate OK
|
||||||
|
|
||||||
|
class handler:
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
raise NotImplementedError()
|
self.storage = {}
|
||||||
|
|
||||||
|
def loadfromstring(self, target):
|
||||||
|
# decode frames from b64
|
||||||
|
frames = base64.b64decode(target[1])
|
||||||
|
# rebuild tuple
|
||||||
|
temp = (frames, target[2], target[3], target[4])
|
||||||
|
self.storage[target[0]] = temp
|
||||||
|
|
||||||
|
def loadsound(self, target):
|
||||||
|
if target == None: return
|
||||||
|
with wave.open(target, 'r') as fd:
|
||||||
|
frames = fd.readframes(-1)
|
||||||
|
channels = fd.getnchannels()
|
||||||
|
bytespersample = fd.getsampwidth()
|
||||||
|
frequency = fd.getframerate()
|
||||||
|
self.storage[os.path.basename(target.split(".")[0])] = (frames, channels, bytespersample, frequency)
|
||||||
|
# frames, channels, bytespersample, frequency
|
||||||
|
return os.path.basename(target.split(".")[0])
|
||||||
|
|
||||||
|
def getsound(self, target):
|
||||||
|
if not target in self.storage: raise ValueError(f"Sound {target} not loaded!")
|
||||||
|
else: return sound(self.storage[target])
|
||||||
|
|
||||||
|
def tostring(self, target):
|
||||||
|
if not target in self.storage: raise ValueError(f"Sound {target} not loaded!")
|
||||||
|
data = self.storage[target]
|
||||||
|
# encode frames to b64
|
||||||
|
frames = str(base64.b64encode(data[0]), "ascii", "ignore")
|
||||||
|
# rebuild tuple
|
||||||
|
out = (target, frames, data[1], data[2], data[3])
|
||||||
|
# name, frames, channels, bytespersample, frequency
|
||||||
|
return out
|
||||||
|
|
||||||
|
class sound:
|
||||||
|
def __init__(self, data):
|
||||||
|
self.frames = data[0]
|
||||||
|
self.channels = data[1]
|
||||||
|
self.bps = data[2]
|
||||||
|
self.freq = data[3]
|
||||||
|
self._playing = False
|
||||||
|
self._soundobj = None
|
||||||
|
|
||||||
|
def play(self):
|
||||||
|
if self._playing == True and self._soundobj.is_playing(): return
|
||||||
|
self._soundobj = sa.play_buffer(self.frames, self.channels, self.bps, self.freq)
|
||||||
|
self._playing = True
|
||||||
|
|
||||||
|
def stop(self):
|
||||||
|
if self._playing == False: return
|
||||||
|
self._soundobj.stop()
|
||||||
|
self._playing = False
|
||||||
|
|
||||||
|
def wait(self):
|
||||||
|
if self._playing == False: return
|
||||||
|
self._soundobj.wait_done()
|
||||||
|
self._playing = False
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
temp = handler()
|
||||||
|
print(temp.loadsound("sounds/joyride.wav"))
|
||||||
|
tsound = temp.getsound("joyride")
|
||||||
|
tsound.play()
|
||||||
|
tsound.wait()
|
110
hashengine.py
110
hashengine.py
|
@ -1,10 +1,13 @@
|
||||||
import mtTkinter as tk
|
import mtTkinter as tk
|
||||||
from HEMD import color3, vector2, event, enum, NULL
|
from HEMD import color3, vector2, event, NULL
|
||||||
|
import audiosys
|
||||||
|
from loadbar import loadbar
|
||||||
import random
|
import random
|
||||||
import string
|
import string
|
||||||
import math
|
import math
|
||||||
import time
|
import time
|
||||||
import threading
|
import threading
|
||||||
|
import pickle
|
||||||
#import itertools
|
#import itertools
|
||||||
#import multiprocessing
|
#import multiprocessing
|
||||||
|
|
||||||
|
@ -22,10 +25,20 @@ class obj:
|
||||||
self.id = NULL()
|
self.id = NULL()
|
||||||
self.color = color3()
|
self.color = color3()
|
||||||
self.colliding = event()
|
self.colliding = event()
|
||||||
self.parent = NULL()
|
self._parent = NULL()
|
||||||
self.children = []
|
self.children = []
|
||||||
self.ignorecollision = []
|
self.ignorecollision = []
|
||||||
|
|
||||||
|
@property
|
||||||
|
def parent(self):
|
||||||
|
return self._parent
|
||||||
|
|
||||||
|
@parent.setter
|
||||||
|
def parent(self, value):
|
||||||
|
self._parent.children.remove(self)
|
||||||
|
self._parent = value
|
||||||
|
self._parent.children.append(self)
|
||||||
|
|
||||||
class game:
|
class game:
|
||||||
def __init__(self, canvas: tk.Canvas, pixelsize=3):
|
def __init__(self, canvas: tk.Canvas, pixelsize=3):
|
||||||
self._canvas = canvas
|
self._canvas = canvas
|
||||||
|
@ -39,6 +52,10 @@ class game:
|
||||||
self._camera.position = vector2()
|
self._camera.position = vector2()
|
||||||
self._camera.zoom = pixelsize
|
self._camera.zoom = pixelsize
|
||||||
self._OAPUPDATING = False
|
self._OAPUPDATING = False
|
||||||
|
self._handler = audiosys.handler()
|
||||||
|
self._threads = []
|
||||||
|
self._root = obj()
|
||||||
|
self._scripts = []
|
||||||
"""self._workers = []
|
"""self._workers = []
|
||||||
self._processes = 2 # total number of processes.
|
self._processes = 2 # total number of processes.
|
||||||
for i in range(self._processes):
|
for i in range(self._processes):
|
||||||
|
@ -92,6 +109,8 @@ class game:
|
||||||
if physics: self._objects[temp] = target
|
if physics: self._objects[temp] = target
|
||||||
self._visobjects[temp] = target
|
self._visobjects[temp] = target
|
||||||
target.id = temp
|
target.id = temp
|
||||||
|
target._parent = self._root
|
||||||
|
self._root.children.append(target)
|
||||||
self.addtooap(target)
|
self.addtooap(target)
|
||||||
|
|
||||||
def removeobj(self, target: obj):
|
def removeobj(self, target: obj):
|
||||||
|
@ -171,20 +190,83 @@ class game:
|
||||||
self.calcphysobj(i)
|
self.calcphysobj(i)
|
||||||
return time.time()-start
|
return time.time()-start
|
||||||
|
|
||||||
|
def savegame(self):
|
||||||
|
print("pickling root...")
|
||||||
|
outobjects = pickle.dumps(self._root)
|
||||||
|
print("copying scripts...")
|
||||||
|
outscripts = []
|
||||||
|
TLB = loadbar(20, len(self._scripts))
|
||||||
|
for i in self._scripts:
|
||||||
|
outscripts.append(i)
|
||||||
|
TLB.current += 1
|
||||||
|
TLB.render()
|
||||||
|
print("encoding sounds...")
|
||||||
|
outsounds = []
|
||||||
|
TLB = loadbar(20, len(self._handler.storage))
|
||||||
|
for i in self._handler.storage:
|
||||||
|
outsounds.append(self._handler.tostring(i))
|
||||||
|
TLB.current += 1
|
||||||
|
TLB.render()
|
||||||
|
return {"obj": outobjects, "scripts": outscripts, "sounds": outsounds}
|
||||||
|
|
||||||
|
def readdobj(self, target, TLB):
|
||||||
|
TLB.repeat += len(target)
|
||||||
|
TLB.steps = TLB.repeat/TLB.length
|
||||||
|
for i in target.copy():
|
||||||
|
self.addobj(i, True, i.id)
|
||||||
|
if len(i.children) > 0: self.readdobj(i.children, TLB)
|
||||||
|
TLB.current += 1
|
||||||
|
TLB.render()
|
||||||
|
|
||||||
|
def loadgame(self, target):
|
||||||
|
print("loading objects...")
|
||||||
|
self._root = pickle.loads(target["obj"])
|
||||||
|
print("loading scripts...")
|
||||||
|
self._scripts = []
|
||||||
|
TLB = loadbar(20, len(target["scripts"]))
|
||||||
|
for i in target["scripts"]:
|
||||||
|
self._scripts.append(i)
|
||||||
|
TLB.current += 1
|
||||||
|
TLB.render()
|
||||||
|
print()
|
||||||
|
print("loading sounds...")
|
||||||
|
self._handler.storage = {}
|
||||||
|
TLB = loadbar(20, len(target["sounds"]))
|
||||||
|
for i in target["sounds"]:
|
||||||
|
self._handler.loadfromstring(i)
|
||||||
|
TLB.current += 1
|
||||||
|
TLB.render()
|
||||||
|
print("readding objects...")
|
||||||
|
self._OAP = {}
|
||||||
|
self._objects = {}
|
||||||
|
self._visobjects = {}
|
||||||
|
TLB = loadbar(20, 0)
|
||||||
|
self.readdobj(self._root.children, TLB)
|
||||||
|
|
||||||
if not "__CMD__" in globals():
|
if not "__CMD__" in globals():
|
||||||
|
from PIL import Image
|
||||||
|
from tkinter import filedialog
|
||||||
root = tk.Tk()
|
root = tk.Tk()
|
||||||
canvas = tk.Canvas(root)
|
canvas = tk.Canvas(root)
|
||||||
canvas.grid()
|
canvas.grid()
|
||||||
temp = game(canvas)
|
temp = game(canvas)
|
||||||
for i in range(10):
|
tempimg = Image.open(filedialog.askopenfilename())
|
||||||
tempobj = obj()
|
tempimg = tempimg.resize((temp._width, temp._height))
|
||||||
tempobj.position = vector2(5, i)
|
for y in range(temp._height):
|
||||||
tempobj.anchored = False
|
for x in range(temp._width):
|
||||||
tempobj.velocity.x = 1
|
tempobj = obj()
|
||||||
tempobj.collide = True
|
tempobj.position = vector2(x, y)
|
||||||
temp.addobj(tempobj)
|
tempcolor = tempimg.getpixel((x, y))
|
||||||
while True:
|
tempobj.color = color3(tempcolor[0], tempcolor[1], tempcolor[2])
|
||||||
took = temp.updobjs()
|
temp.addobj(tempobj)
|
||||||
temp.render()
|
print(f"{y}/{temp._height}", end="\r", flush=True)
|
||||||
root.update()
|
tempstate = temp.savegame()
|
||||||
time.sleep(0.1-took)
|
print("resetting...")
|
||||||
|
temp.__init__(canvas)
|
||||||
|
input("press enter to reload state")
|
||||||
|
print("loading...")
|
||||||
|
temp.loadgame(tempstate)
|
||||||
|
temp.render()
|
||||||
|
root.update()
|
||||||
|
print()
|
||||||
|
input("press enter to exit.")
|
9
loadbar.py
Normal file
9
loadbar.py
Normal file
|
@ -0,0 +1,9 @@
|
||||||
|
class loadbar:
|
||||||
|
def __init__(self, length=10, full=10):
|
||||||
|
self.steps = full/length
|
||||||
|
self.length = length
|
||||||
|
self.repeat = full
|
||||||
|
self.current = 0
|
||||||
|
|
||||||
|
def render(self):
|
||||||
|
print("["+("#"*int(self.current/self.steps))+(" "*(self.length-int(self.current/self.steps)))+"]"+f" {self.current}/{self.repeat}", end="\r", flush=True)
|
BIN
sounds/intro.wav
Normal file
BIN
sounds/intro.wav
Normal file
Binary file not shown.
BIN
sounds/joyride.wav
Normal file
BIN
sounds/joyride.wav
Normal file
Binary file not shown.
Loading…
Reference in a new issue