Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import pygame, sys, math
- Width, Height = 640, 480
- centerX, centerY = Width//2, Height//2
- pygame.init()
- screen = pygame.display.set_mode((Width,Height))
- pygame.display.set_caption('Sivagnanam M')
- clock = pygame.time.Clock()
- 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)
- 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)
- 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),
- (-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),
- (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),
- (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),
- (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),
- (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),
- (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),
- (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),
- (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),
- (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),
- (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),
- (70,2),(70,3),(70,4),(70,5),(70,6))
- def quit_game(): pygame.quit(); sys.exit()
- def clear_mouse(): pygame.event.get(); pygame.mouse.get_rel()
- def lock_mouse(): pygame.mouse.set_visible(0); pygame.event.set_grab(1); clear_mouse(); cam.motion = True
- def unlock_mouse(): pygame.mouse.set_visible(1); pygame.event.set_grab(0); cam.motion = False
- def toggle_mouse(): unlock_mouse() if cam.motion else lock_mouse()
- def rotate(pos,rad): x,y=pos; s,c = math.sin(rad),math.cos(rad); return x*c-y*s,y*c+x*s
- def fade(t): return t*t*t*(t*(t*6-15)+10) # convert a float from being rigid an linear...
- 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...
- class Camera:
- motion = False
- def __init__(self,pos=(0,0,0),rot=(0,0)):
- self.pos = list(pos)
- self.rot = list(rot)
- def mouse(self,rel):
- if not self.motion: return
- dX,dY = rel[0]/200,rel[1]/200
- self.rot[0]+=dY
- self.rot[1]+=dX
- if self.rot[0]>math.pi/2: self.rot[0] = math.pi/2
- elif self.rot[0]<-math.pi/2: self.rot[0] = -math.pi/2
- def update(self, dt, keys):
- speed = dt*10
- if keys[pygame.K_LSHIFT]: self.pos[1]+=speed
- if keys[pygame.K_SPACE]: self.pos[1]-=speed
- s,c = math.sin(self.rot[1])*speed, math.cos(self.rot[1])*speed
- if keys[pygame.K_w]: self.pos[0] += s; self.pos[2] += c
- if keys[pygame.K_s]: self.pos[0] -= s; self.pos[2] -= c
- if keys[pygame.K_a]: self.pos[0] -= c; self.pos[2] += s
- if keys[pygame.K_d]: self.pos[0] += c; self.pos[2] -= s
- def event_loop():
- global elevate
- for event in pygame.event.get():
- if event.type == pygame.QUIT: quit_game()
- elif event.type == pygame.MOUSEMOTION: cam.mouse(event.rel)
- elif event.type == pygame.KEYDOWN:
- if event.key == pygame.K_ESCAPE: quit_game()
- elif event.key == pygame.K_q: toggle_mouse()
- elif event.key == pygame.K_e: elevate = not elevate
- def convert(p,shift):
- x,y,z = p
- if elevate:
- c = loop(time*0.2)
- scale = 0.7+fade(c*2.2)*0.3
- y*=scale
- else:
- c = loop(time*0.4)
- scale = 0.25+(math.cos(c*5)+1)*0.5*0.75
- x*=scale; y*=scale; z*=scale
- x-=cam.pos[0]-shift[0]
- y-=cam.pos[1]-shift[1]
- z-=cam.pos[2]-shift[2]
- x,z = rotate((x,z),cam.rot[1])
- y,z = rotate((y,z),cam.rot[0])
- exposed = z>0
- f = 200/z if exposed else -200**2/z
- pos = centerX+int(x*f),centerY+int(y*f)
- return pos,exposed
- def render_lines(shift=(0,0,0)):
- c = loop(time*0.6)*256
- for edge in lines:
- p0,e0 = convert(verts[edge[0]],shift)
- p1,e1 = convert(verts[edge[1]],shift)
- if e0 or e1:
- try: pygame.draw.aaline(screen,(c,128,0),p0,p1)
- except: pass
- def show_message(size,pos,color,text):
- screen.blit(pygame.font.SysFont('',size).render(text,2,color),pos)
- cam = Camera((35, 0, -27.5), (0.3, 0.0))
- lock_mouse()
- time = 0
- elevate = False
- while True:
- dt = clock.tick()/1000
- time+=dt
- screen.fill((32,44,53))
- for x,y in Sivagnanam_M: render_lines((x,y,0))
- pygame.draw.circle(screen, (128,178,255), (centerX,centerY), 2)
- show_message(30, (10,10), (100,60,210), 'POS: (%.1f, %.1f, %.1f)'%tuple(cam.pos))
- show_message(30, (10,50), (192,32,255), 'ROT: (%.1f, %.1f)'%tuple(cam.rot))
- show_message(24, (10,Height-40), (60,70,210), 'Sivagnanam M v1.0')
- show_message(24, (Width-100,Height-40), (60,70,210), 'Esc: Quit')
- pygame.display.flip()
- event_loop()
- keys = pygame.key.get_pressed()
- cam.update(dt,keys)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement