135 lines
3.9 KiB
Python
135 lines
3.9 KiB
Python
import tkinter as tk
|
|
import string
|
|
import random
|
|
from colorama import Fore, Back, Style
|
|
from colorama import just_fix_windows_console
|
|
just_fix_windows_console()
|
|
|
|
class stdrend:
|
|
def __init__(self, size):
|
|
self._size = size
|
|
self._grid = {}
|
|
self._win = tk.Tk()
|
|
for y in range(size[1]):
|
|
for x in range(size[0]):
|
|
temp = tk.Label(text=" ")
|
|
temp.grid(row=y, column=x)
|
|
self._win.update()
|
|
self._grid[f"{x}:{y}"] = temp
|
|
|
|
def pix(self, x, y, text):
|
|
if f"{x}:{y}" in self._grid:
|
|
self._grid[f"{x}:{y}"].config(text=text)
|
|
self._win.update()
|
|
|
|
class vector2:
|
|
def __init__(self, x=0, y=0):
|
|
self.x = x
|
|
self.y = y
|
|
|
|
def __add__(self, v):
|
|
if not type(v) != vector2: raise ValueError("Must be vector2!")
|
|
return vector2(self.x+v.x, self.y+v.y)
|
|
|
|
def __sub__(self, v):
|
|
if not type(v) != vector2: raise ValueError("Must be vector2!")
|
|
return vector2(self.x-v.x, self.y-v.y)
|
|
|
|
def __mul__(self, v):
|
|
if not type(v) != vector2: raise ValueError("Must be vector2!")
|
|
return vector2(self.x*v.x, self.y*v.y)
|
|
|
|
def __iadd__(self, v):
|
|
if not type(v) != vector2: raise ValueError("Must be vector2!")
|
|
return vector2(self.x+v.x, self.y+v.y)
|
|
|
|
def __isub__(self, v):
|
|
if not type(v) != vector2: raise ValueError("Must be vector2!")
|
|
return vector2(self.x-v.x, self.y-v.y)
|
|
|
|
def __imul__(self, v):
|
|
if not type(v) != vector2: raise ValueError("Must be vector2!")
|
|
return vector2(self.x*v.x, self.y*v.y)
|
|
|
|
class NULL:
|
|
def __init__(self):
|
|
return None
|
|
|
|
class enum:
|
|
def __init__(self, sel):
|
|
self._sel = dict(sel)
|
|
for i in self._sel:
|
|
setattr(self, i, self._sel[i])
|
|
|
|
def getposssel(self):
|
|
return list(self._sel.keys())
|
|
|
|
_fcolors = {"norm": Fore.RESET, "red": Fore.RED, "green": Fore.GREEN, "blue": Fore.BLUE, "white": Fore.WHITE, "cyan": Fore.CYAN, "black": Fore.BLACK, "magenta": Fore.MAGENTA, "yellow": Fore.YELLOW}
|
|
_bcolors = {"norm": Back.RESET, "red": Back.RED, "green": Back.GREEN, "blue": Back.BLUE, "white": Back.WHITE, "cyan": Back.CYAN, "black": Back.BLACK, "magenta": Back.MAGENTA, "yellow": Back.YELLOW}
|
|
|
|
backcolors = enum(_bcolors)
|
|
forecolors = enum(_fcolors)
|
|
cammode = enum({"editable": 0, "follow": 1})
|
|
|
|
class obj:
|
|
def __init__(self):
|
|
self.position = vector2()
|
|
self.char = " "
|
|
self.ID = 0
|
|
self.parent = None
|
|
self.gravity = 0
|
|
self.acceleration = vector2()
|
|
self.velocity = vector2()
|
|
self.friction = 0
|
|
self.collide = True
|
|
self.touch = True
|
|
self.anchored = False
|
|
self.bcolor = backcolors.norm
|
|
self.fcolor = forecolors.norm
|
|
|
|
class camera(obj):
|
|
def __init__(self):
|
|
super().__init__()
|
|
self.mode = cammode.editable
|
|
self.subject = None
|
|
self.collide = False
|
|
self.touch = False
|
|
self.char = " "
|
|
|
|
def update(self):
|
|
if self.mode == cammode.follow and self.subject:
|
|
self.position = self.subject.position
|
|
|
|
class game:
|
|
def __init__(self, size=[20, 20], renderer=stdrend):
|
|
if renderer == None: raise TypeError("Renderer class needed!")
|
|
self._size = size
|
|
self._renderer = renderer(size)
|
|
self._objects = {}
|
|
|
|
def addobj(self, obj):
|
|
id = ""
|
|
for i in range(256):
|
|
id = id + random.choice(list(string.ascii_letters))
|
|
obj.ID = id
|
|
self._objects[id] = obj
|
|
|
|
def removeobj(self, obj):
|
|
self._objects.pop(obj.ID)
|
|
obj.ID = NULL()
|
|
|
|
def removeobjbyid(self, id):
|
|
self._objects.pop(id).ID = NULL()
|
|
|
|
def render(self):
|
|
for i in self._objects:
|
|
|
|
|
|
if __name__ == "__main__":
|
|
testgame = game()
|
|
object = obj()
|
|
testgame.addobj(object)
|
|
print(object.ID)
|
|
|
|
|