jsuarez/tools/RenderTest.py (150 lines of code) (raw):
from pdb import set_trace as T
import pygame
from pygame.surface import Surface
import numpy as np
import time
from enum import Enum
class Neon(Enum):
def rgb(h):
h = h.lstrip('#')
return tuple(int(h[i:i+2], 16) for i in (0, 2, 4))
RED = rgb('#ff0000')
ORANGE = rgb('#ff8000')
YELLOW = rgb('#ffff00')
GREEN = rgb('#00ff00')
MINT = rgb('#00ff80')
CYAN = rgb('#00ffff')
BLUE = rgb('#0000ff')
PURPLE = rgb('#8000ff')
MAGENTA = rgb('#ff00ff')
WHITE = rgb('#ffffff')
GRAY = rgb('#666666')
BLACK = rgb('#000000')
BLOOD = rgb('#bb0000')
BROWN = rgb('#7a3402')
GOLD = rgb('#eec600') #238 198
SILVER = rgb('#b8b8b8')
FUCHSIA = rgb('#ff0080')
SPRING = rgb('#80ff80')
SKY = rgb('#0080ff')
TERM = rgb('#41ff00')
def rand12():
ind = np.random.randint(0, 12)
return (
Neon.RED, Neon.ORANGE, Neon.YELLOW,
Neon.GREEN, Neon.MINT, Neon.CYAN,
Neon.BLUE, Neon.PURPLE, Neon.MAGENTA,
Neon.FUCHSIA, Neon.SPRING, Neon.SKY)[ind].value
class Container:
def __init__(self, size, border=0, reset=False, key=None):
self.W, self.H = size
self.canvas = Surface((self.W, self.H))
if key is not None:
self.canvas.set_colorkey(key)
self.border = border
self.left, self.right = self.border, self.W-self.border
self.top, self.bottom = self.border, self.H-self.border
def renderBorder(self):
for coords in [
(0, 0, self.W, self.top),
(0, 0, self.left, self.H),
(0, self.bottom, self.W, self.H),
(self.right, 0, self.W, self.H)
]:
pygame.draw.rect(self.canvas, Color.RED, coords)
def reset(self):
self.canvas.fill((Color.BLACK))
if self.border > 0:
self.renderBorder()
def fill(self, color):
self.canvas.fill((color))
def blit(self, container, pos, area=None, flags=0):
w, h = pos
pos = (w+self.border, h+self.border)
if type(container) == Surface:
self.canvas.blit(container, pos, area=area, special_flags=flags)
else:
self.canvas.blit(container.canvas, pos, area=area, special_flags=flags)
if self.border > 0:
self.renderBorder()
def rect(self, color, coords, lw=0):
pygame.draw.rect(self.canvas, color, coords, lw)
def line(self, color, start, end, lw=1):
pygame.draw.line(self.canvas, color, start, end, lw)
def fromTiled(tiles, tileSz):
R, C, three = tiles.shape
ret = np.zeros((R, C), dtype=object)
for r in range(R):
for c in range(C):
ret[r, c] = Surface((tileSz, tileSz))
ret[r, c].fill(tiles[r, c, :])
return ret
def makeMap(tiles, tileSz):
R, C = tiles.shape
surf = Surface((int(R*tileSz), int(C*tileSz)))
for r in range(R):
for c in range(C):
surf.blit(tiles[r, c], (int(r*tileSz), int(c*tileSz)))
return surf
def surfToIso(surf):
ret = pygame.transform.rotate(surf, 45)
W, H = ret.get_width(), ret.get_height()
ret = pygame.transform.scale(ret, (W, H//2))
return ret
def rotate(x, y, theta):
pt = np.array([[x], [y]])
mat = np.array([
[np.cos(theta), -np.sin(theta)],
[np.sin(theta), np.cos(theta)]])
ret = np.dot(mat, pt)
return ret.ravel()
def degrees(rad):
return 180 * rad / 3.14159265
def rad(degrees):
return 3.14159265 * degrees / 180.0
def pointToIso(point, tW, tH, W, H):
x, y = point
x, y = x-W//2, y+H//2
x, y = rotate(x, y, rad(-45))
#x, y = x+(W//2*np.sqrt(2)), y-(H//2*np.sqrt(2))
y = y / 2
return x, y
def makeMap(tiles, tileSz):
R, C = tiles.shape
surf = Surface((int(R*tileSz), int(C*tileSz)))
for r in range(R):
for c in range(C):
#tile = surfToIso(tiles[r, c])
tile = tiles[r, c]
rr, cc = int(r*tileSz), int(c*tileSz)
#cc, rr = pointToIso((cc, rr), tileSz)
surf.blit(tile, (rr, cc))
return surf
class Application:
def __init__(self):
self.W, self.H, self.side = 512, 512, 256
self.appSize = (self.W+self.side, self.H+self.side)
pygame.init()
pygame.display.set_caption('Projekt: Godsword')
self.canvas = pygame.display.set_mode(self.appSize, pygame.HWSURFACE|pygame.DOUBLEBUF|pygame.RESIZABLE)
#self.fonts = RenderUtils.Fonts('resource/dragonslapper.ttf')
'''
self.buf = Container(self.appSize)
sz = 16
tiles = np.array([[Neon.rand12() for i in range(sz)] for j in range(sz)])
tileSz = 32
tiles = fromTiled(tiles, tileSz)
surf = makeMap(tiles, tileSz)
#self.canvas.blit(surf, (0, 0))
surf = surfToIso(surf)
p1, p2 = (0, 0), (tileSz, tileSz)
p1 = pointToIso(p1, tileSz, tileSz, self.W, self.H)
p2 = pointToIso(p2, tileSz, tileSz, self.W, self.H)
#rect = (*p1, *p2)
self.canvas.blit(surf, (0, 0))
pygame.draw.line(self.canvas, (255, 255, 255), p1, p2)
'''
while True:
self.render()
def render(self):
start = time.time()
#self.canvas.blit(self.buf.canvas, (0,0))
pygame.event.get()
#pygame.draw.rect(self.canvas, (255,0,0), (0, 0, 50, 50))
pygame.display.flip()
#pygame.display.update((0, 0, 50, 50))
print(1/(time.time()-start))
app = Application()