bingxuan9112

GalaxySniper

May 28th, 2019
254
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 8.23 KB | None | 0 0
  1. from vpython import *
  2. from math import *
  3. #import random
  4. ''' variables '''
  5. charge = 0.5
  6. speedRatio = 9
  7. playerAngle = (pi/2, pi/2)
  8. aimAngle = (0, pi)
  9. followPlayerView = False
  10. aimHint = True
  11. time = 0; dt = 1/240 #240fps owo
  12. score = 0
  13. ''' vpython objects '''
  14. #description = canvas(width = 1000, weight = 800)
  15. planets = []; bullets = []; targets = []; message = []
  16. planets.append(sphere(pos = vector(0, 0, 0), texture = textures.earth))
  17. color.miku = vector(0, 0.784, 0.686)
  18.  
  19. planets.append(sphere(pos = vector(5, 4, 3), color = color.miku))
  20. planets.append(sphere(pos = vector(5, -4, 2), color = color.miku))
  21. planets.append(sphere(pos = vector(-2, 5, -5), color = color.miku))
  22. planets.append(sphere(pos = vector(-5, -3, 3), color = color.miku))
  23. planets.append(sphere(pos = vector(-3, -2, -3), color = color.miku))
  24.  
  25. targets.append(sphere(pos = vector(4, 4, 3), radius = 0.3, color = color.green))
  26. targets.append(sphere(pos = vector(5, -3, 2), radius = 0.3, color = color.green))
  27. targets.append(sphere(pos = vector(-1, 5, -5), radius = 0.3, color = color.green))
  28. targets.append(sphere(pos = vector(-5, -3+0.5**0.5, 3-0.5**0.5), radius = 0.3, color = color.green))
  29. targets.append(sphere(pos = vector(-3+0.5, -2+0.5*(3**0.5), -3), radius = 0.3, color = color.green))
  30.  
  31. targets.append(sphere(pos = vector(6, -4, 2), radius = 0.3, color = color.green))
  32.  
  33. player = cone(color = color.red, pos = vector(0, 1, 0), radius = 0.1, length = 0.5, axis = vector(0, 1, 0))
  34. aim = arrow(color = color.blue, pos = vector(0, 1.3, 0), axis = vector(0.3, 0, 0))
  35.  
  36. predict = sphere(
  37.     radius = 0.08,
  38.     make_trail = True,
  39.     color = vector(1, 1, 0),
  40.     trail_type = 'points',
  41.     interval = 20,
  42.     retain = 100,
  43.     opacity = 0,
  44.     v = vector(0, 0, 0)
  45. )
  46.  
  47. ''' functions '''
  48. def checkVisible(x):
  49.     if not x.visible:
  50.         #del(x)
  51.         return False
  52.     return True
  53. def zeroScene():
  54.     scene.autoscale = False
  55.     scene.center = vector(0, 0, 0)
  56.     scene.forward = vector(0, 0, -1)
  57.     scene.range = 10
  58.     scene.width = 1000
  59.     scene.weight = 800
  60.     scene.up = vector(0, 1, 0)
  61.     #scene.background = color.white
  62. def updatePos():
  63.     global player, aim, aimAngle, playerAngle, charge
  64.     player.pos = vector(
  65.         cos(playerAngle[1])*sin(playerAngle[0]),
  66.         sin(playerAngle[1]),
  67.         cos(playerAngle[1])*cos(playerAngle[0])
  68.     )
  69.     tmp = vector(
  70.         cos(aimAngle[1])*sin(aimAngle[0]),
  71.         sin(aimAngle[1]),
  72.         cos(aimAngle[1])*cos(aimAngle[0])
  73.     )
  74.     aim.axis = (0.32-charge*0.04)*vector(
  75.         tmp.x*cos(playerAngle[0]) - tmp.z*sin(playerAngle[1])*sin(playerAngle[0]) - tmp.y*cos(playerAngle[1])*sin(playerAngle[0]),
  76.         tmp.x*0                   + tmp.z*cos(playerAngle[1])                     - tmp.y*sin(playerAngle[1]),
  77.        -tmp.x*sin(playerAngle[0]) - tmp.z*sin(playerAngle[1])*cos(playerAngle[0]) - tmp.y*cos(playerAngle[1])*cos(playerAngle[0])
  78.     )
  79.     player.axis = player.pos*0.5
  80.     aim.pos = player.pos*1.3
  81.     if followPlayerView:
  82.         u = norm(vector(
  83.             sin(playerAngle[1])*sin(playerAngle[0]),
  84.            -cos(playerAngle[1]),
  85.             sin(playerAngle[1])*cos(playerAngle[0])
  86.         ))
  87.         scene.center = u*3
  88.         scene.forward = u-player.pos*0.5
  89.         scene.range = 4
  90.         scene.up = player.pos
  91.     predict.pos = aim.pos
  92.     predict.clear_trail()
  93.     predict.v = norm(aim.axis)*charge*speedRatio
  94.     if aimHint:
  95.         fps = int(1/dt)
  96.         for t in range(fps*2):
  97.             for p in planets:
  98.                 d = p.pos-predict.pos
  99.                 if mag(d) >= 0.9:
  100.                     predict.v += speedRatio*10/mag2(d)*dt*norm(d) #GMm/d^2
  101.                 else:
  102.                     return
  103.             predict.pos += predict.v*dt
  104. ''' keyboard control '''
  105. def keydownControl(evt):
  106.     global charge, charging, scene, playerAngle, aimAngle, followPlayerView
  107.     aimAction = {
  108.         'w':(0, 1),  #箭頭向上
  109.         's':(0, -1), #向下
  110.         'a':(-1, 0),  #向左
  111.         'd':(1, 0)  #向右
  112.     }
  113.     playerAction = {
  114.         'o':(0, -1),  #玩家向北
  115.         'l':(0, 1), #向南
  116.         'k':(1, 0),  #向西
  117.         ';':(-1, 0)  #向東
  118.     }
  119.     s = evt.key
  120.     if s == ' ': #charge
  121.         if charge < 3:
  122.             charge += 0.1
  123.             updatePos()
  124.     elif s == 'q': #zeroing angle of vision
  125.         zeroScene()
  126.     elif s == 'e':
  127.         if followPlayerView:
  128.             followPlayerView = False
  129.             scene.userzoom = True
  130.             scene.userspin = True
  131.             zeroScene()
  132.             scene.up = vector(0, 1, 0)
  133.         else:
  134.             followPlayerView = True
  135.             scene.userzoom = False
  136.             scene.userspin = False
  137.             scene.up = player.pos
  138.             updatePos()
  139.     else:
  140.         if s in aimAction: #change aiming angle
  141.             dAlpha = aimAction[s][0]*pi/60; dBeta = aimAction[s][1]*pi/60
  142.             tmp = (aimAngle[0] + dAlpha, aimAngle[1] + dBeta)
  143.             if tmp[1] >= 7*pi/12 and tmp[1] <= 16*pi/12:
  144.                 aimAngle = tmp
  145.         if s in playerAction: #change player angle
  146.             dAlpha = playerAction[s][0]*pi/60; dBeta = playerAction[s][1]*pi/60
  147.             playerAngle = (playerAngle[0] + dAlpha, playerAngle[1] + dBeta)
  148.         updatePos()
  149. scene.bind('keydown', keydownControl)
  150. def keyupControl(evt):
  151.     global aim, charge
  152.     if evt.key == ' ' and charge > 0:
  153.         bullets.append(sphere(
  154.             radius = 0.1,
  155.             pos = aim.pos,
  156.             v = norm(aim.axis)*charge*speedRatio,
  157.             color = vector(1, 0.68, 0.9),
  158.             make_trail = True,
  159.             trail_type = 'points',
  160.             interval = 15,
  161.             retain = 25,
  162.             inGround = None
  163.         ))
  164.         aim.axis = norm(aim.axis)*0.3
  165.         charge = 0.5
  166.         updatePos()
  167. scene.bind('keyup', keyupControl)
  168.  
  169. ''' main '''
  170. zeroScene()
  171. updatePos()
  172. while time<300:
  173.     rate(1/dt)
  174.     # gravity effect
  175.     for b in bullets:
  176.         if mag(b.v) <= 10**-3:
  177.             b.visible = False
  178.         if b.inGround == None:
  179.             for p in planets:
  180.                 d = p.pos-b.pos
  181.                 if mag(d) >= 0.9:
  182.                     b.v += speedRatio*10/mag2(d)*dt*norm(d) #GMm/d^2
  183.                 else:
  184.                     b.inGround = p
  185.                     break
  186.             b.pos += b.v*dt
  187.             for t in targets:
  188.                 d = t.pos-b.pos
  189.                 if mag(d) < 0.4:
  190.                     score += 1
  191.                     message.append(text(
  192.                         text = str(score)+'HIT',
  193.                         align = 'center',
  194.                         pos = t.pos,
  195.                         height = 0.5,
  196.                         billboard = True,
  197.                         color = color.magenta,
  198.                         displayTime = 1
  199.                     ))
  200.                     b.clear_trail()
  201.                     b.visible = t.visible = False
  202.         else:
  203.             p = b.inGround
  204.             d = p.pos-b.pos
  205.             if mag(d) >= 0.8:
  206.                 b.v = norm(d)*0.01
  207.                 b.pos += b.v*dt
  208.             else:
  209.                 b.clear_trail()
  210.                 b.visible = False
  211.     for m in message:
  212.         m.displayTime -= dt
  213.         if m.displayTime <= 0:
  214.             m.visible = False
  215.     bullets = list(filter(checkVisible, bullets))
  216.     targets = list(filter(checkVisible, targets))
  217.     message = list(filter(checkVisible, message))
  218.     time += dt
  219.     if len(targets) == 0:
  220.         break
  221. ''' game ends '''
  222. for b in bullets:
  223.     b.clear_trail()
  224.     b.visible = False
  225. for p in planets:
  226.     p.visible = False
  227. for t in targets:
  228.     t.visible = False
  229. for m in message:
  230.     m.visible = False
  231. predict.clear_trail()
  232. player.visible = aim.visible = False
  233. followPlayerView = False
  234. scene.userzoom = True
  235. scene.userspin = True
  236. zeroScene()
  237. scene.unbind('keydown', keydownControl)
  238. scene.unbind('keyup', keyupControl)
  239. if len(targets) == 0:
  240.     text(
  241.         text = 'Game ends!\nYou beated all the targets!',
  242.         align = 'center',
  243.         pos = vector(0, 0, 0),
  244.         color = color.red
  245.     )
  246. else:
  247.     text(
  248.         text = 'Time\'s up!\nYour score is ' + str(score) + ' PTS',
  249.         align = 'center',
  250.         pos = vector(0, 0, 0),
  251.         color = color.red,
  252.     )
Advertisement
Add Comment
Please, Sign In to add comment