Advertisement
XxDLCENERGYxX

Sivagnanam M

Jun 20th, 2018
178
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 5.31 KB | None | 0 0
  1. import pygame, sys, math
  2.  
  3.  
  4. Width, Height = 640, 480
  5. centerX, centerY = Width//2, Height//2
  6.  
  7. pygame.init()
  8. screen = pygame.display.set_mode((Width,Height))
  9. pygame.display.set_caption('Sivagnanam M')
  10. clock = pygame.time.Clock()
  11.  
  12.  
  13. verts = (-.5,-.5,-.5),(.5,-.5,-.5),(.5,.5,-.5),(-.5,.5,-.5),(-.5,-.5,.5),(.5,-.5,.5),(.5,.5,.5),(-.5,.5,.5)
  14. lines = (0,1),(1,2),(2,3),(3,0),(4,5),(5,6),(6,7),(7,4),(0,4),(1,5),(2,6),(3,7)
  15.  
  16.  
  17. Sivagnanam_M = ((1,0),(0,1),(2,3),(2,0),(0,2),(1,3),(3,0),(4,0),(3,3),(4,4),(4,5),(3,6),(2,6),(1,6),(0,6),
  18.                (-1,6),(8,0),(8,2),(7,2),(8,3),(8,4),(8,5),(8,6),(7,6),(9,6),(12,2),(12,3),(12,4),(16,2),
  19.                (16,3),(16,4),(13,5),(15,5),(14,6),(18,5),(19,4),(20,4),(21,4),(19,6),(20,6),(21,6),(22,6),
  20.                (22,5),(22,4),(22,3),(21,2),(20,2),(19,2),(24,3),(24,4),(24,5),(25,6),(26,6),(27,6),(28,6),
  21.                (28,7),(27,8),(26,8),(25,8),(28,5),(28,4),(28,3),(27,2),(28,2),(26,2),(25,2),(30,6),(30,5),
  22.                (30,4),(30,3),(30,2),(31,2),(32,2),(33,2),(34,3),(34,4),(34,5),(34,6),(36,5),(37,6),(38,6),
  23.                (39,6),(40,6),(40,5),(40,4),(39,4),(38,4),(37,4),(40,3),(39,2),(38,2),(37,2),(42,6),(42,5),
  24.                (42,4),(42,3),(42,2),(43,2),(44,2),(45,2),(46,3),(46,4),(46,5),(46,6),(48,5),(49,6),(50,6),
  25.                (51,6),(52,6),(52,5),(52,4),(51,4),(50,4),(49,4),(52,3),(51,2),(50,2),(49,2),(54,6),(54,5),
  26.                (54,4),(54,3),(54,2),(55,2),(56,2),(57,2),(58,3),(58,4),(58,5),(58,6),(56,3),(56,4),(56,5),
  27.                (56,6),(66,6),(66,5),(66,4),(66,3),(66,2),(66,1),(66,0),(67,1),(68,2),(69,1),(70,0),(70,1),
  28.                (70,2),(70,3),(70,4),(70,5),(70,6))
  29.  
  30.  
  31. def quit_game(): pygame.quit(); sys.exit()
  32.  
  33. def clear_mouse(): pygame.event.get(); pygame.mouse.get_rel()
  34. def lock_mouse(): pygame.mouse.set_visible(0); pygame.event.set_grab(1); clear_mouse(); cam.motion = True
  35. def unlock_mouse(): pygame.mouse.set_visible(1); pygame.event.set_grab(0); cam.motion = False
  36. def toggle_mouse(): unlock_mouse() if cam.motion else lock_mouse()
  37.  
  38. def rotate(pos,rad): x,y=pos; s,c = math.sin(rad),math.cos(rad); return x*c-y*s,y*c+x*s
  39.  
  40. def fade(t): return t*t*t*(t*(t*6-15)+10) # convert a float from being rigid an linear...
  41.  
  42. def loop(n): return n%1 if n%2<1 else 1-n%1 # convert a float to loop 0 to 1 smoothly, flows up and down...
  43.  
  44.  
  45. class Camera:
  46.  
  47.     motion = False
  48.  
  49.     def __init__(self,pos=(0,0,0),rot=(0,0)):
  50.         self.pos = list(pos)
  51.         self.rot = list(rot)
  52.  
  53.     def mouse(self,rel):
  54.         if not self.motion: return
  55.         dX,dY = rel[0]/200,rel[1]/200
  56.         self.rot[0]+=dY
  57.         self.rot[1]+=dX
  58.  
  59.         if self.rot[0]>math.pi/2: self.rot[0] = math.pi/2
  60.         elif self.rot[0]<-math.pi/2: self.rot[0] = -math.pi/2
  61.  
  62.     def update(self, dt, keys):
  63.  
  64.         speed = dt*10
  65.  
  66.         if keys[pygame.K_LSHIFT]: self.pos[1]+=speed
  67.         if keys[pygame.K_SPACE]:  self.pos[1]-=speed
  68.  
  69.         s,c = math.sin(self.rot[1])*speed, math.cos(self.rot[1])*speed
  70.  
  71.         if keys[pygame.K_w]: self.pos[0] += s; self.pos[2] += c
  72.         if keys[pygame.K_s]: self.pos[0] -= s; self.pos[2] -= c
  73.  
  74.         if keys[pygame.K_a]: self.pos[0] -= c; self.pos[2] += s
  75.         if keys[pygame.K_d]: self.pos[0] += c; self.pos[2] -= s
  76.  
  77.  
  78. def event_loop():
  79.     global elevate
  80.     for event in pygame.event.get():
  81.         if event.type == pygame.QUIT: quit_game()
  82.         elif event.type == pygame.MOUSEMOTION: cam.mouse(event.rel)
  83.         elif event.type == pygame.KEYDOWN:
  84.             if event.key == pygame.K_ESCAPE: quit_game()
  85.             elif event.key == pygame.K_q: toggle_mouse()
  86.             elif event.key == pygame.K_e: elevate = not elevate
  87.  
  88.  
  89. def convert(p,shift):
  90.     x,y,z = p
  91.  
  92.     if elevate:
  93.         c = loop(time*0.2)
  94.         scale = 0.7+fade(c*2.2)*0.3
  95.         y*=scale
  96.     else:
  97.         c = loop(time*0.4)
  98.         scale = 0.25+(math.cos(c*5)+1)*0.5*0.75
  99.         x*=scale; y*=scale; z*=scale
  100.  
  101.  
  102.     x-=cam.pos[0]-shift[0]
  103.     y-=cam.pos[1]-shift[1]
  104.     z-=cam.pos[2]-shift[2]
  105.  
  106.     x,z = rotate((x,z),cam.rot[1])
  107.     y,z = rotate((y,z),cam.rot[0])
  108.  
  109.     exposed = z>0
  110.  
  111.     f = 200/z if exposed else -200**2/z
  112.     pos = centerX+int(x*f),centerY+int(y*f)
  113.  
  114.     return pos,exposed
  115.  
  116.  
  117. def render_lines(shift=(0,0,0)):
  118.  
  119.     c = loop(time*0.6)*256
  120.  
  121.     for edge in lines:
  122.         p0,e0 = convert(verts[edge[0]],shift)
  123.         p1,e1 = convert(verts[edge[1]],shift)
  124.         if e0 or e1:
  125.             try: pygame.draw.aaline(screen,(c,128,0),p0,p1)
  126.             except: pass
  127.  
  128.  
  129.  
  130. def show_message(size,pos,color,text):
  131.     screen.blit(pygame.font.SysFont('',size).render(text,2,color),pos)
  132.  
  133.  
  134.  
  135.  
  136. cam = Camera((35, 0, -27.5), (0.3, 0.0))
  137.  
  138. lock_mouse()
  139.  
  140. time = 0
  141.  
  142. elevate = False
  143.  
  144. while True:
  145.  
  146.     dt = clock.tick()/1000
  147.     time+=dt
  148.  
  149.     screen.fill((32,44,53))
  150.  
  151.     for x,y in Sivagnanam_M: render_lines((x,y,0))
  152.     pygame.draw.circle(screen, (128,178,255), (centerX,centerY), 2)
  153.  
  154.     show_message(30, (10,10), (100,60,210), 'POS: (%.1f, %.1f, %.1f)'%tuple(cam.pos))
  155.     show_message(30, (10,50), (192,32,255), 'ROT: (%.1f, %.1f)'%tuple(cam.rot))
  156.     show_message(24, (10,Height-40), (60,70,210), 'Sivagnanam M v1.0')
  157.     show_message(24, (Width-100,Height-40), (60,70,210), 'Esc: Quit')
  158.  
  159.     pygame.display.flip()
  160.  
  161.  
  162.     event_loop()
  163.  
  164.     keys = pygame.key.get_pressed()
  165.     cam.update(dt,keys)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement