basic system done
This commit is contained in:
parent
077916ae87
commit
72d4f28cea
28
HEMD.py
28
HEMD.py
|
@ -6,6 +6,15 @@ class color3:
|
||||||
self.g = g
|
self.g = g
|
||||||
self.b = b
|
self.b = b
|
||||||
|
|
||||||
|
def __maxnum__(self, target, maxn):
|
||||||
|
return "0"*(maxn-len(target))+target
|
||||||
|
|
||||||
|
def __tohex__(self):
|
||||||
|
r = self.__maxnum__(hex(self.r)[2:], 2)
|
||||||
|
g = self.__maxnum__(hex(self.g)[2:], 2)
|
||||||
|
b = self.__maxnum__(hex(self.b)[2:], 2)
|
||||||
|
return "#"+r+g+b
|
||||||
|
|
||||||
def _add(self,v):
|
def _add(self,v):
|
||||||
temp = color3(self.r+v.r, self.g+v.g, self.b+v.b)
|
temp = color3(self.r+v.r, self.g+v.g, self.b+v.b)
|
||||||
temp.r = temp.r%255
|
temp.r = temp.r%255
|
||||||
|
@ -28,28 +37,31 @@ class color3:
|
||||||
return temp
|
return temp
|
||||||
|
|
||||||
def __add__(self, v):
|
def __add__(self, v):
|
||||||
self._add(v)
|
return self._add(v)
|
||||||
|
|
||||||
def __sub__(self, v):
|
def __sub__(self, v):
|
||||||
self._sub(v)
|
return self._sub(v)
|
||||||
|
|
||||||
def __mul__(self, v):
|
def __mul__(self, v):
|
||||||
self._mul(v)
|
return self._mul(v)
|
||||||
|
|
||||||
def __iadd__(self, v):
|
def __iadd__(self, v):
|
||||||
self._add(v)
|
return self._add(v)
|
||||||
|
|
||||||
def __isub__(self, v):
|
def __isub__(self, v):
|
||||||
self._sub(v)
|
return self._sub(v)
|
||||||
|
|
||||||
def __imul__(self, v):
|
def __imul__(self, v):
|
||||||
self._mul(v)
|
return self._mul(v)
|
||||||
|
|
||||||
class vector2:
|
class vector2:
|
||||||
def __init__(self, x=0, y=0):
|
def __init__(self, x=0, y=0):
|
||||||
self.x = x
|
self.x = x
|
||||||
self.y = y
|
self.y = y
|
||||||
|
|
||||||
|
def __copy__(self):
|
||||||
|
return vector2(self.x, self.y)
|
||||||
|
|
||||||
def __round__(self):
|
def __round__(self):
|
||||||
return vector2(round(self.x), round(self.y))
|
return vector2(round(self.x), round(self.y))
|
||||||
|
|
||||||
|
@ -98,7 +110,3 @@ class event:
|
||||||
|
|
||||||
def attach(self, target):
|
def attach(self, target):
|
||||||
self._attached.append(target)
|
self._attached.append(target)
|
||||||
|
|
||||||
class sprite:
|
|
||||||
def __init__(self):
|
|
||||||
pass
|
|
119
hashengine.py
119
hashengine.py
|
@ -1,8 +1,9 @@
|
||||||
import mtTkinter as tk
|
import mtTkinter as tk
|
||||||
from HEMD import color3, vector2, event, enum, NULL, sprite
|
from HEMD import color3, vector2, event, enum, NULL
|
||||||
import random
|
import random
|
||||||
import string
|
import string
|
||||||
import math
|
import math
|
||||||
|
import time
|
||||||
#import itertools
|
#import itertools
|
||||||
#import multiprocessing
|
#import multiprocessing
|
||||||
|
|
||||||
|
@ -17,21 +18,26 @@ class obj:
|
||||||
self.anchored = True
|
self.anchored = True
|
||||||
self.velocity = vector2()
|
self.velocity = vector2()
|
||||||
self.acceleration = vector2()
|
self.acceleration = vector2()
|
||||||
self.sprite = sprite()
|
|
||||||
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 = []
|
||||||
|
|
||||||
class game:
|
class game:
|
||||||
def __init__(self, canvas: tk.Canvas):
|
def __init__(self, canvas: tk.Canvas, pixelsize=3):
|
||||||
self._canvas = canvas
|
self._canvas = canvas
|
||||||
self._height = int(canvas.winfo_reqheight()/3)
|
self._height = int(canvas.winfo_reqheight()/pixelsize)
|
||||||
self._width = int(canvas.winfo_reqwidth()/3)
|
self._width = int(canvas.winfo_reqwidth()/pixelsize)
|
||||||
|
self._pixelsize = pixelsize
|
||||||
self._OAP = {}
|
self._OAP = {}
|
||||||
|
self._PAO = {}
|
||||||
self._objects = {}
|
self._objects = {}
|
||||||
self._visobjects = {}
|
self._visobjects = {}
|
||||||
|
self._camera = obj()
|
||||||
|
self._camera.position = vector2()
|
||||||
|
self._camera.zoom = pixelsize
|
||||||
"""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):
|
||||||
|
@ -41,7 +47,7 @@ class game:
|
||||||
|
|
||||||
temp = multiprocessing.Process()
|
temp = multiprocessing.Process()
|
||||||
temp.start()
|
temp.start()
|
||||||
self._workers.append({"process": temp, ""})""" # scraped idea im keeping it in incase i ever decide to use it
|
self._workers.append({"process": temp, ""})""" # scraped idea, im keeping it in incase i ever decide to use it
|
||||||
|
|
||||||
def genid(self):
|
def genid(self):
|
||||||
out = ""
|
out = ""
|
||||||
|
@ -49,20 +55,33 @@ class game:
|
||||||
out = out + random.choice(list(string.ascii_letters))
|
out = out + random.choice(list(string.ascii_letters))
|
||||||
return out
|
return out
|
||||||
|
|
||||||
|
def v2tuple(self, target: vector2):
|
||||||
|
return (target.x, target.y)
|
||||||
|
|
||||||
|
def tuple2v(self, target: tuple):
|
||||||
|
return vector2(target[0], target[1])
|
||||||
|
|
||||||
def addtooap(self, target: obj):
|
def addtooap(self, target: obj):
|
||||||
if target.position.__round__() in self._OAP:
|
if self.v2tuple(target.position.__round__()) in self._OAP:
|
||||||
self._OAP[target.position.__round__()].append(target)
|
self._OAP[self.v2tuple(target.position.__round__())].append(target)
|
||||||
else:
|
else:
|
||||||
self._OAP[target.position.__round__()] = [target]
|
self._OAP[self.v2tuple(target.position.__round__())] = [target]
|
||||||
|
|
||||||
|
def updateobjinoap(self, target: obj):
|
||||||
|
self.remfromoap(target)
|
||||||
|
self.addtooap(target)
|
||||||
|
|
||||||
def remfromoap(self, target: obj):
|
def remfromoap(self, target: obj):
|
||||||
self._OAP[target.position.__round__()].remove(target)
|
for i in self._OAP:
|
||||||
if len(self._OAP[target.position.__round__()]) == 0:
|
if target in self._OAP[i]:
|
||||||
self._OAP.pop(target.position.__round__())
|
self._OAP[i].remove(target)
|
||||||
|
if len(self._OAP[i]) == 0:
|
||||||
|
self._OAP.pop(i)
|
||||||
|
break
|
||||||
|
|
||||||
def getfromoap(self, target: vector2):
|
def getfromoap(self, target: vector2):
|
||||||
if target.__round__() in self._OAP:
|
if self.v2tuple(target.__round__()) in self._OAP:
|
||||||
return self._OAP[target.__round__()]
|
return self._OAP[self.v2tuple(target.__round__())]
|
||||||
else:
|
else:
|
||||||
return []
|
return []
|
||||||
|
|
||||||
|
@ -70,6 +89,7 @@ class game:
|
||||||
temp = self.genid()
|
temp = self.genid()
|
||||||
if physics: self._objects[temp] = target
|
if physics: self._objects[temp] = target
|
||||||
self._visobjects[temp] = target
|
self._visobjects[temp] = target
|
||||||
|
target.id = temp
|
||||||
self.addtooap(target)
|
self.addtooap(target)
|
||||||
|
|
||||||
def removeobj(self, target: obj):
|
def removeobj(self, target: obj):
|
||||||
|
@ -83,13 +103,76 @@ class game:
|
||||||
def getcolliding(self, target):
|
def getcolliding(self, target):
|
||||||
return self.getfromoap(target.position)
|
return self.getfromoap(target.position)
|
||||||
|
|
||||||
def calcphysobj(self):
|
def handlecollision(self, obj1: obj, obj2: obj):
|
||||||
raise NotImplementedError()
|
#False is blocked
|
||||||
|
#True is not blocked
|
||||||
|
#returns tuple like this (True, True)
|
||||||
|
xblock = False
|
||||||
|
yblock = False
|
||||||
|
obj1pos = obj1.position.__round__()
|
||||||
|
obj2pos = obj2.position.__round__()
|
||||||
|
if obj2.collide == False: return (xblock, yblock)
|
||||||
|
if obj2pos.x > obj1pos.x > obj2pos.x: xblock = True
|
||||||
|
if obj2pos.y > obj1pos.y > obj2pos.y: yblock = True
|
||||||
|
if obj2.anchored == True:
|
||||||
|
obj1.velocity = vector2()
|
||||||
|
else:
|
||||||
|
if xblock: obj1.velocity.x = obj1.velocity.x/2;obj2.velocity.x = obj2.velocity.x/2
|
||||||
|
if yblock: obj1.velocity.y = obj1.velocity.y/2;obj2.velocity.y = obj2.velocity.y/2
|
||||||
|
return (xblock, yblock)
|
||||||
|
|
||||||
|
def calcphysobj(self, target: obj):
|
||||||
|
if target.anchored: target.velocity=vector2();return
|
||||||
|
new = target.position + target.velocity
|
||||||
|
oldvel = target.velocity.__copy__()
|
||||||
|
if target.collide == True:
|
||||||
|
colliding = self.getfromoap(new)
|
||||||
|
if len(colliding) > 0: target.colliding.execute()
|
||||||
|
for i in colliding:
|
||||||
|
if i == target: continue
|
||||||
|
if i in target.ignorecollision or target in i.ignorecollision: continue
|
||||||
|
i.colliding.execute()
|
||||||
|
temp = self.handlecollision(target, i)
|
||||||
|
if temp[0] == False: target.position.x += oldvel.x
|
||||||
|
if temp[1] == False: target.position.y += oldvel.y
|
||||||
|
if len(colliding) == 0: target.position += target.velocity
|
||||||
|
else:
|
||||||
|
target.position += target.velocity
|
||||||
|
target.velocity += target.acceleration
|
||||||
|
self.updateobjinoap(target)
|
||||||
|
|
||||||
|
def render(self):
|
||||||
|
self._canvas.delete(tk.ALL)
|
||||||
|
self._height = int(canvas.winfo_reqheight()/self._camera.zoom)
|
||||||
|
self._width = int(canvas.winfo_reqwidth()/self._camera.zoom)
|
||||||
|
self._pixelsize = self._camera.zoom
|
||||||
|
for y in range(self._camera.position.y, self._height+self._camera.position.y):
|
||||||
|
for x in range(self._camera.position.y, self._width+self._camera.position.y):
|
||||||
|
obj = self.getfromoap(vector2(x, y))
|
||||||
|
if len(obj) == 0: continue
|
||||||
|
obj = obj[0]
|
||||||
|
self._canvas.create_rectangle(x*self._pixelsize, y*self._pixelsize, x*self._pixelsize+self._pixelsize, y*self._pixelsize+self._pixelsize, fill=obj.color.__tohex__(), width=0)
|
||||||
|
|
||||||
|
def updobjs(self):
|
||||||
|
for i in self._objects.values():
|
||||||
|
self.calcphysobj(i)
|
||||||
|
|
||||||
if not "__CMD__" in globals():
|
if not "__CMD__" in globals():
|
||||||
root = tk.Tk()
|
root = tk.Tk()
|
||||||
canvas = tk.Canvas(root)
|
canvas = tk.Canvas(root)
|
||||||
canvas.create_rectangle(50, 50, 53, 53, fill="#ff0000", width=0)
|
|
||||||
canvas.grid()
|
canvas.grid()
|
||||||
temp = game(canvas)
|
temp = game(canvas)
|
||||||
root.mainloop()
|
for i in range(200):
|
||||||
|
tempobj = obj()
|
||||||
|
tempobj.position = vector2(5, i)
|
||||||
|
tempobj.anchored = False
|
||||||
|
tempobj.collide = True
|
||||||
|
temp.addobj(tempobj)
|
||||||
|
while True:
|
||||||
|
temp.updobjs()
|
||||||
|
for i in temp._objects.values():
|
||||||
|
i.color += color3(random.randint(0, 255), random.randint(0, 255), random.randint(0, 255))
|
||||||
|
#i.position = vector2(random.randint(0, temp._width), random.randint(0, temp._height))
|
||||||
|
temp.render()
|
||||||
|
root.update()
|
||||||
|
time.sleep(0.1)
|
2
main.py
2
main.py
|
@ -8,7 +8,7 @@ def loadfile(target):
|
||||||
def execins(ins):
|
def execins(ins):
|
||||||
print(f"\033[A> {ins}\r")
|
print(f"\033[A> {ins}\r")
|
||||||
try:
|
try:
|
||||||
out = eval(ins, globals())
|
out = exec(ins, globals())
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
out = e
|
out = e
|
||||||
if out != None: print(out)
|
if out != None: print(out)
|
||||||
|
|
Binary file not shown.
Before Width: | Height: | Size: 1.9 KiB |
Loading…
Reference in a new issue