forked from bedohswe/p3he
Compare commits
No commits in common. "43b2d31980336e6978809445f379520dd217fe47" and "799165b2256417dfb2bf6321a747c362db918785" have entirely different histories.
43b2d31980
...
799165b225
40
alert.py
40
alert.py
@ -1,40 +0,0 @@
|
|||||||
import pygame
|
|
||||||
import pygame.freetype
|
|
||||||
import threading
|
|
||||||
from time import sleep
|
|
||||||
|
|
||||||
class Alert():
|
|
||||||
def __init__(self, text, display):
|
|
||||||
self.text = text
|
|
||||||
|
|
||||||
font = pygame.freetype.Font(None, 24)
|
|
||||||
font_fg = (255, 255, 255)
|
|
||||||
font_bg = (255, 255, 255, 120)
|
|
||||||
|
|
||||||
text_image = font.render(text, font_fg)[0]
|
|
||||||
|
|
||||||
self.background = pygame.Surface((text_image.get_width() + 12, text_image.get_height() + 12), pygame.SRCALPHA)
|
|
||||||
self.background.fill(font_bg)
|
|
||||||
|
|
||||||
self.rect = self.background.get_rect()
|
|
||||||
text_rect = text_image.get_rect(center = self.rect.center)
|
|
||||||
|
|
||||||
self.background.blit(text_image, text_rect)
|
|
||||||
|
|
||||||
self.rect.topleft = (display.get_width() / 2 - self.background.get_width() / 2, display.get_height() - self.background.get_height() - 8)
|
|
||||||
|
|
||||||
def draw(self, surface):
|
|
||||||
surface.blit(self.background, self.rect)
|
|
||||||
|
|
||||||
def start_hide_thread(self, alerts, delay):
|
|
||||||
def hide_delay(delay):
|
|
||||||
sleep(delay)
|
|
||||||
|
|
||||||
try:
|
|
||||||
alerts.pop(alerts.index(self))
|
|
||||||
except ValueError:
|
|
||||||
pass
|
|
||||||
|
|
||||||
p = threading.Thread(target=hide_delay, args=(delay,))
|
|
||||||
p.daemon = True
|
|
||||||
p.start()
|
|
@ -3,6 +3,6 @@ from cmath import exp
|
|||||||
I = complex(0,1)
|
I = complex(0,1)
|
||||||
WHITE = (255,255,255)
|
WHITE = (255,255,255)
|
||||||
BLACK = (0,0,0)
|
BLACK = (0,0,0)
|
||||||
OFFSET = 0.0078125
|
OFFSET = 0.015625
|
||||||
ROT = cNorm(exp(deg2rad(2)*I))
|
ROT = cNorm(exp(deg2rad(2)*I))
|
||||||
IROT = 1/ROT
|
IROT = 1/ROT
|
||||||
|
17
draw.py
17
draw.py
@ -4,8 +4,8 @@ from gyro import *
|
|||||||
from lines import *
|
from lines import *
|
||||||
|
|
||||||
class DrawnSegment:
|
class DrawnSegment:
|
||||||
def __init__(self,dist,color):
|
def __init__(self,height,color):
|
||||||
self.dist = dist
|
self.height = height
|
||||||
self.color = color
|
self.color = color
|
||||||
|
|
||||||
def draw(level,gPlayer,fov,res):
|
def draw(level,gPlayer,fov,res):
|
||||||
@ -13,7 +13,7 @@ def draw(level,gPlayer,fov,res):
|
|||||||
irot = exp(fov/res*I)
|
irot = exp(fov/res*I)
|
||||||
iprot = gPlayer.cRot
|
iprot = gPlayer.cRot
|
||||||
for i in range(res):
|
for i in range(res):
|
||||||
m = None
|
m = DrawnSegment(0,BLACK)
|
||||||
rot = irot**(i-(res/2)) * iprot
|
rot = irot**(i-(res/2)) * iprot
|
||||||
for j in level:
|
for j in level:
|
||||||
try: # Function "LineIntersection" faults from time to time
|
try: # Function "LineIntersection" faults from time to time
|
||||||
@ -23,13 +23,10 @@ def draw(level,gPlayer,fov,res):
|
|||||||
if cDot(rot,MobiusAdd(cInt,-gPlayer.cPos)) > 0:
|
if cDot(rot,MobiusAdd(cInt,-gPlayer.cPos)) > 0:
|
||||||
continue
|
continue
|
||||||
rDist = MobiusDist(cInt,gPlayer.cPos)*1.1
|
rDist = MobiusDist(cInt,gPlayer.cPos)*1.1
|
||||||
if j.isFinite and not cBetween(j.pointA,j.pointB,cInt):
|
if not (j.isFinite and cBetween(j.pointA,j.pointB,cInt)):
|
||||||
continue
|
continue
|
||||||
if m is None:
|
if (1 - m.height) > rDist:
|
||||||
m = DrawnSegment(rDist,j.color)
|
m = DrawnSegment(1-rDist,j.color)
|
||||||
continue
|
drawn.append(m)
|
||||||
if m.dist > rDist:
|
|
||||||
m = DrawnSegment(rDist,j.color)
|
|
||||||
drawn.append(m if m is not None else DrawnSegment(0, BLACK))
|
|
||||||
return drawn
|
return drawn
|
||||||
|
|
||||||
|
@ -18,8 +18,8 @@ def parse_level_from_string(string):
|
|||||||
|
|
||||||
level.append(
|
level.append(
|
||||||
Segment(
|
Segment(
|
||||||
raw_segment[0] == "True",
|
bool(raw_segment[0]),
|
||||||
complex(raw_segment[1]),
|
float(raw_segment[1]),
|
||||||
complex(raw_segment[2]),
|
complex(raw_segment[2]),
|
||||||
tuple(map(int, raw_segment[3][1:len(raw_segment[3])-1].split(', ')))
|
tuple(map(int, raw_segment[3][1:len(raw_segment[3])-1].split(', ')))
|
||||||
)
|
)
|
||||||
@ -43,11 +43,9 @@ def save_level(level):
|
|||||||
level_save = save_level_to_string(level)
|
level_save = save_level_to_string(level)
|
||||||
|
|
||||||
unix_timestamp = int(time())
|
unix_timestamp = int(time())
|
||||||
filename = f'{unix_timestamp}.p3hel'
|
save = open(f"./levels/{unix_timestamp}.p3hel", "w")
|
||||||
save = open(f"./levels/{filename}", "w")
|
|
||||||
save.write(level_save)
|
save.write(level_save)
|
||||||
save.close()
|
save.close()
|
||||||
return filename
|
|
||||||
|
|
||||||
def open_level(path):
|
def open_level(path):
|
||||||
save = open(path, "r")
|
save = open(path, "r")
|
||||||
|
2
lines.py
2
lines.py
@ -13,7 +13,7 @@ def cLineIntersection(cA0, cA1, cB0, cB1):
|
|||||||
|
|
||||||
@jit
|
@jit
|
||||||
def Between(rA,rB,rN):
|
def Between(rA,rB,rN):
|
||||||
return (rA <= rN and rN <= rB) or (rB <= rN and rN <= rA)
|
return (rA < rN and rN < rB) or (rB < rN and rN < rA)
|
||||||
|
|
||||||
@jit
|
@jit
|
||||||
def cBetween(cA,cB,cN):
|
def cBetween(cA,cB,cN):
|
||||||
|
44
main.py
44
main.py
@ -3,17 +3,15 @@ from numba import jit
|
|||||||
|
|
||||||
from math import copysign, pi, acos
|
from math import copysign, pi, acos
|
||||||
from time import time
|
from time import time
|
||||||
import sys
|
|
||||||
|
|
||||||
import pygame
|
import pygame
|
||||||
import pygame.freetype
|
import pygame.freetype
|
||||||
|
|
||||||
from levels import Segment, open_level, parse_level_from_string
|
from levels import Segment
|
||||||
from gyro import *
|
from gyro import *
|
||||||
from levels import *
|
from levels import *
|
||||||
from constants import *
|
from constants import *
|
||||||
from draw import draw
|
from draw import draw
|
||||||
from alert import Alert
|
|
||||||
|
|
||||||
bCap = True
|
bCap = True
|
||||||
|
|
||||||
@ -22,6 +20,14 @@ gOrigin = GyroVector(0,1)
|
|||||||
SKY = (127,127,255)
|
SKY = (127,127,255)
|
||||||
GROUND = (102, 51, 0)
|
GROUND = (102, 51, 0)
|
||||||
|
|
||||||
|
level = [
|
||||||
|
Segment(True,.6,I*.6,(255,0,0)),
|
||||||
|
Segment(True,.6,-I*.6,(0,255,0)),
|
||||||
|
Segment(True,-.6,-I*.6,(0,0,255)),
|
||||||
|
Segment(True,-.6,I*.6,(255,255,0))
|
||||||
|
]
|
||||||
|
|
||||||
|
|
||||||
def renderDebugInfo(gPlayer, clock, fontSize = 18):
|
def renderDebugInfo(gPlayer, clock, fontSize = 18):
|
||||||
font = pygame.freetype.Font(None, fontSize)
|
font = pygame.freetype.Font(None, fontSize)
|
||||||
font_fg = (255, 255, 255)
|
font_fg = (255, 255, 255)
|
||||||
@ -33,9 +39,7 @@ def renderDebugInfo(gPlayer, clock, fontSize = 18):
|
|||||||
|
|
||||||
return fps_surf, cPos_surf, cRot_surf
|
return fps_surf, cPos_surf, cRot_surf
|
||||||
|
|
||||||
def nonzerocap(n):
|
|
||||||
if n <= 0: return 1
|
|
||||||
return n
|
|
||||||
|
|
||||||
def mainLoop():
|
def mainLoop():
|
||||||
gPlayer = GyroVector(0,1)
|
gPlayer = GyroVector(0,1)
|
||||||
@ -44,20 +48,6 @@ def mainLoop():
|
|||||||
fontSize = 18
|
fontSize = 18
|
||||||
debugInfo = True
|
debugInfo = True
|
||||||
wall_buffer = []
|
wall_buffer = []
|
||||||
alerts = []
|
|
||||||
|
|
||||||
def alert_append(alert, delay):
|
|
||||||
if len(alerts) >= 1:
|
|
||||||
alerts.pop()
|
|
||||||
|
|
||||||
alerts.append(alert)
|
|
||||||
alert.start_hide_thread(alerts, delay)
|
|
||||||
|
|
||||||
try:
|
|
||||||
leveltoparse = open_level(sys.argv[1])
|
|
||||||
except IndexError:
|
|
||||||
leveltoparse = open_level("maps/squareroom.p3hel")
|
|
||||||
level = parse_level_from_string(leveltoparse)
|
|
||||||
|
|
||||||
while True:
|
while True:
|
||||||
for event in pygame.event.get():
|
for event in pygame.event.get():
|
||||||
@ -79,10 +69,11 @@ def mainLoop():
|
|||||||
else:
|
else:
|
||||||
wall_buffer.append(gPlayer.cPos)
|
wall_buffer.append(gPlayer.cPos)
|
||||||
if event.key == pygame.K_F5:
|
if event.key == pygame.K_F5:
|
||||||
filename = save_level(level)
|
save_level(level)
|
||||||
alert = Alert(f"File saved as {filename}", display)
|
if event.key == pygame.K_F9:
|
||||||
|
# TODO: @bedohswe make open file dialog
|
||||||
alert_append(alert, 5)
|
# open_level(path)
|
||||||
|
pass
|
||||||
|
|
||||||
keys = pygame.key.get_pressed()
|
keys = pygame.key.get_pressed()
|
||||||
if keys[pygame.K_d]:
|
if keys[pygame.K_d]:
|
||||||
@ -104,7 +95,7 @@ def mainLoop():
|
|||||||
pygame.draw.rect(display,GROUND, (0,360,1280,360))
|
pygame.draw.rect(display,GROUND, (0,360,1280,360))
|
||||||
n = 0
|
n = 0
|
||||||
for i in drawn:
|
for i in drawn:
|
||||||
pygame.draw.rect(display,i.color, (n,int((nonzerocap(i.dist)) * 360),8,int((1 -nonzerocap(i.dist)) * 1280)))
|
pygame.draw.rect(display,i.color, (n,int((1 - cap(i.height)) * 360),8,int(cap(i.height) * 1280)))
|
||||||
n += 4
|
n += 4
|
||||||
gPlayer.normalize()
|
gPlayer.normalize()
|
||||||
if debugInfo:
|
if debugInfo:
|
||||||
@ -121,9 +112,6 @@ def mainLoop():
|
|||||||
c = complex(Poincare2Klein(gPlayer.cPos))
|
c = complex(Poincare2Klein(gPlayer.cPos))
|
||||||
pygame.draw.rect(display, WHITE, (c.real * 100 + 95, (c.imag * 100 + 195), 10, 10))
|
pygame.draw.rect(display, WHITE, (c.real * 100 + 95, (c.imag * 100 + 195), 10, 10))
|
||||||
|
|
||||||
for alert in alerts:
|
|
||||||
alert.draw(display)
|
|
||||||
|
|
||||||
pygame.display.update()
|
pygame.display.update()
|
||||||
if bCap:
|
if bCap:
|
||||||
clock.tick(60)
|
clock.tick(60)
|
||||||
|
@ -1 +0,0 @@
|
|||||||
False/1/0/(255, 0, 0 |False/1j/0/(0, 255, 0
|
|
@ -1 +0,0 @@
|
|||||||
True/0/0/(0, 0, 0
|
|
@ -1 +0,0 @@
|
|||||||
True/0.6/0.6j/(255, 0, 0)|True/0.6/-0.6j/(0, 255, 0)|True/-0.6/-0.6j/(0, 0, 255)|True/-0.6/0.6j/(255, 255, 0)
|
|
Loading…
Reference in New Issue
Block a user