Advertisement
4karsh

Asteroids! for Codeskulptor

Jun 5th, 2013
1,347
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 23.19 KB | None | 0 0
  1. # program template for Spaceship
  2. import simplegui
  3. import math
  4. import random
  5.  
  6. # UI Globals
  7. WIDTH = 800
  8. HEIGHT = 600
  9.  
  10. # GAME ATTRIBUTES
  11. ANGULAR_VEL = 2.5 # Angular velocity of spaceship (rotation)
  12. ACCEL = 9.81 # approx. 3px/s^2 in the direction of thrust
  13. FRICTION = ACCEL/(ACCEL**math.exp(1)) # exponential decrease in forward momentum
  14. # Acceleration adds or subtracts a constant from velocity every tick.
  15. # Friction is modeled as a decaying exponential, is a multiple of the previous velocity value
  16. # vel[t] = vel[0] * (1 - FRICTION)
  17. MISSILE_VEL = 600
  18.  
  19.  
  20. # Image and Art Assets
  21. # --------------------
  22. class ImageInfo:
  23. def __init__(self, center, size, radius = 0, lifespan = None, animated = False):
  24. self.center = center
  25. self.size = size
  26. self.radius = radius
  27. if lifespan:
  28. self.lifespan = lifespan
  29. else:
  30. self.lifespan = float('inf')
  31. self.animated = animated
  32.  
  33. def get_center(self):
  34. return self.center
  35.  
  36. def get_size(self):
  37. return self.size
  38.  
  39. def get_radius(self):
  40. return self.radius
  41.  
  42. def get_lifespan(self):
  43. return self.lifespan
  44.  
  45. def get_animated(self):
  46. return self.animated
  47.  
  48.  
  49. # art assets created by Kim Lathrop, may be freely re-used in non-commercial projects, please credit Kim
  50.  
  51. # debris images - debris1_brown.png, debris2_brown.png, debris3_brown.png, debris4_brown.png
  52. # debris1_blue.png, debris2_blue.png, debris3_blue.png, debris4_blue.png, debris_blend.png
  53. debris_info = ImageInfo([320, 240], [640, 480])
  54. debris_image = simplegui.load_image("http://commondatastorage.googleapis.com/codeskulptor-assets/lathrop/debris2_brown.png")
  55.  
  56. # nebula images - nebula_brown.png, nebula_blue.png
  57. nebula_info = ImageInfo([400, 300], [800, 600])
  58. nebula_image = simplegui.load_image("http://commondatastorage.googleapis.com/codeskulptor-assets/lathrop/nebula_brown.png")
  59.  
  60. # splash image
  61. splash_info = ImageInfo([200, 150], [400, 300])
  62. splash_image = simplegui.load_image("http://commondatastorage.googleapis.com/codeskulptor-assets/lathrop/splash.png")
  63.  
  64. # ship image
  65. ship_info = ImageInfo([45, 45], [90, 90], 35/2)
  66. ship_image = simplegui.load_image("http://commondatastorage.googleapis.com/codeskulptor-assets/lathrop/double_ship.png")
  67.  
  68. # missile image - shot1.png, shot2.png, shot3.png
  69. missile_info = ImageInfo([5,5], [10, 10], 3, 40)
  70. missile_image = simplegui.load_image("http://commondatastorage.googleapis.com/codeskulptor-assets/lathrop/shot1.png")
  71.  
  72. # asteroid images - asteroid_blue.png, asteroid_brown.png, asteroid_blend.png
  73. asteroid_info = ImageInfo([45, 45], [90, 90], 35)
  74. asteroid_image = simplegui.load_image("http://commondatastorage.googleapis.com/codeskulptor-assets/lathrop/asteroid_blue.png")
  75.  
  76. # animated explosion - explosion_orange.png, explosion_blue.png, explosion_blue2.png, explosion_alpha.png
  77. explosion_info = ImageInfo([64, 64], [128, 128], asteroid_info.get_radius(), 24, True)
  78. explosion_image = simplegui.load_image("http://commondatastorage.googleapis.com/codeskulptor-assets/lathrop/explosion_orange.png")
  79.  
  80. # sound assets purchased from sounddogs.com, please do not redistribute
  81. soundtrack = simplegui.load_sound("http://commondatastorage.googleapis.com/codeskulptor-assets/sounddogs/soundtrack.mp3")
  82. soundtrack.set_volume(0.5)
  83. missile_sound = simplegui.load_sound("https://dl.dropboxusercontent.com/s/qt9qyjm86iipiya/missle1.mp3?token_hash=AAGTyTkv1LIebte9VLCnsbHWiAppUaetj_42QarR7Xkukg&dl=1")
  84. missile_sound.set_volume(0.5)
  85. ship_thrust_sound = simplegui.load_sound("https://dl.dropboxusercontent.com/s/v3fm1fsnetmwiyt/exhaust.mp3?token_hash=AAEcKwgXlNGfQBuhrG9fehDWtGtJbjtG3-PqZvqN9P7qDg&dl=1")
  86. ship_thrust_sound.set_volume(0.5)
  87. explosion_sound = simplegui.load_sound("https://dl.dropboxusercontent.com/s/63k5jci8izxdwk5/explosion4.mp3?token_hash=AAEDpL5hUbsbhTGCKzWpqwG2sioAhVo7TUqYFc78Qf7TiA&dl=1")
  88. explosion_sound.set_volume(.35)
  89.  
  90. # Helper functions to handle transformations
  91. def deg_to_rad(ang):
  92. return (ang/180 * math.pi)
  93.  
  94. def angle_to_vector(ang):
  95. return [math.cos(ang), math.sin(ang)]
  96.  
  97. def dist(p, q):
  98. return math.sqrt((p[0] - q[0]) ** 2 + (p[1] - q[1]) ** 2)
  99.  
  100. def rot_vector(vector, ang):
  101. # Used to rotate points in the xy-Cartesian plane counter-clockwise through an angle
  102. rot_mat = [[math.cos(ang), -math.sin(ang)], [math.sin(ang), math.cos(ang)]]
  103. rot_x = rot_mat[0][0] * vector[0] + rot_mat[0][1] * vector[1]
  104. rot_y = rot_mat[1][0] * vector[0] + rot_mat[1][1] * vector[1]
  105. return [rot_x, rot_y]
  106.  
  107.  
  108. # GAME Classes
  109. # -------------
  110.  
  111. # Ship class
  112. class Ship:
  113. def __init__(self, pos, vel, angle, image, info):
  114. # codeskulptor has no assert, but explicit assignment will ensure
  115. # that code will crash if pos is not a tuple/list
  116. self.pos = [pos[0],pos[1]]
  117. self.vel = [vel[0],vel[1]] # x, y speeds. No direction information
  118. self.thrust = False
  119. self.angle = angle
  120. self.angle_vel = 0
  121. self.alive = True
  122. # image
  123. self.image = image
  124. self.image_center = info.get_center()
  125. self.image_size = info.get_size()
  126. self.radius = info.get_radius()
  127.  
  128. def get_radius(self):
  129. return self.radius
  130.  
  131. def get_pos(self):
  132. return self.pos
  133.  
  134. def get_orientation(self):
  135. ''' forward vector (direction of orientation) '''
  136. return angle_to_vector(self.angle)
  137.  
  138. def get_missile_spawn_point(self):
  139. ''' Spawn missiles at the tip of the spaceship '''
  140. direction = self.get_orientation()
  141. return [self.pos[0] + self.radius*direction[0], self.pos[1] + self.radius*direction[1]]
  142.  
  143. def get_life_status(self):
  144. return self.alive
  145.  
  146. def set_life_status(self, status):
  147. self.alive = status
  148. if status:
  149. self.pos = [WIDTH/2, HEIGHT/2]
  150. else:
  151. self.pos[0] *= -1
  152. self.pos[1] *= -1
  153. self.vel = [0, 0]
  154. ship_thrust_sound.rewind()
  155.  
  156. def set_thruster(self, thruster_state):
  157. self.thrust = thruster_state
  158.  
  159. def update_angle_vel(self, angle_vel):
  160. self.angle_vel = deg_to_rad(angle_vel)
  161.  
  162. def _update_pos_(self):
  163. self.pos[0] = (self.pos[0] + self.vel[0]/60) % WIDTH
  164. self.pos[1] = (self.pos[1] + self.vel[1]/60) % HEIGHT
  165.  
  166. def _update_vel_(self):
  167. # apply friction
  168. self.vel[0] *= (1 - FRICTION)
  169. self.vel[1] *= (1 - FRICTION)
  170. if self.thrust:
  171. ship_thrust_sound.play()
  172. direction = angle_to_vector(self.angle) # forward vector (direction of thrust)
  173. self.vel = [self.vel[0] + direction[0] * ACCEL, self.vel[1] + direction[1] * ACCEL]
  174. else:
  175. ship_thrust_sound.rewind()
  176.  
  177. def update(self):
  178. # update orientation
  179. self.angle += self.angle_vel
  180. # update position
  181. self._update_pos_()
  182. # update velocity
  183. self._update_vel_()
  184.  
  185. def shoot(self):
  186. direction = angle_to_vector(self.angle) # forward vector (direction of orientation)
  187. # missiles spawn at the tip of the spaceship
  188. missile_pos = self.get_missile_spawn_point()
  189. missile_vel = [MISSILE_VEL * direction[0], MISSILE_VEL * direction[1]]
  190. # scale the direction by spaceship velocity, to launch missiles
  191. # along the direction of spaceship's orientation
  192. if self.thrust:
  193. missile_vel[0] += self.vel[0] + ACCEL
  194. missile_vel[1] += self.vel[1] + ACCEL
  195. missiles.append(Sprite(missile_pos, missile_vel, 0, 0, missile_image, missile_info, missile_sound))
  196.  
  197. def draw(self, canvas, draw_size=0.5):
  198. draw_size = [self.image_size[0] * draw_size, self.image_size[1] * draw_size]
  199. if self.thrust:
  200. # draw ship with flames
  201. image_pos = self.image_center
  202. image_pos = [image_pos[0] + ship_info.get_size()[0], image_pos[1]]
  203. canvas.draw_image(self.image, image_pos, self.image_size, self.pos, draw_size, self.angle)
  204. else:
  205. canvas.draw_image(self.image, self.image_center, self.image_size, self.pos, draw_size, self.angle)
  206.  
  207. # Sprite class
  208. class Sprite:
  209. def __init__(self, pos, vel, ang, ang_vel, image, info, sound = None):
  210. self.pos = [pos[0],pos[1]]
  211. self.vel = [vel[0],vel[1]]
  212. self.angle = ang
  213. self.angle_vel = deg_to_rad(ang_vel)
  214. self.image = image
  215. self.image_center = info.get_center()
  216. self.image_size = info.get_size()
  217. self.radius = info.get_radius()
  218. self.lifespan = info.get_lifespan()
  219. self.animated = info.get_animated()
  220. self.age = 0
  221. if sound:
  222. sound.rewind()
  223. sound.play()
  224.  
  225. def get_radius(self):
  226. return self.radius
  227.  
  228. def get_pos(self):
  229. return self.pos
  230.  
  231. def get_vel(self):
  232. return self.vel
  233.  
  234. def get_angle(self):
  235. return self.angle
  236.  
  237. def get_angle_vel(self):
  238. return self.angle_vel
  239.  
  240. def get_lifespan(self):
  241. return self.lifespan
  242.  
  243. def get_age(self):
  244. return self.age
  245.  
  246. def collide(self, other):
  247. return dist(self.get_pos(), other.get_pos()) <= (self.get_radius() + other.get_radius())
  248.  
  249. def draw(self, canvas):
  250. canvas.draw_image(self.image, self.image_center, self.image_size, self.pos, [self.radius*2]*2, self.angle)
  251.  
  252. # change attributes of sprite that will cause the same image to be drawn differently
  253. def update(self):
  254. ''' Return True to indicate sprite's lifespan is over, and the sprite is to be removed
  255. False otherwise
  256. '''
  257. # rotate sprite
  258. self.angle += self.angle_vel
  259. # move sprite in space
  260. self.pos[0] = (self.pos[0] + self.vel[0]/60) % WIDTH
  261. self.pos[1] = (self.pos[1] + self.vel[1]/60) % HEIGHT
  262. # update duration for dynamic (limited duration) sprites
  263. if self.lifespan < float('inf') and self.age < self.lifespan:
  264. self.age += 1
  265. if self.animated:
  266. self.image_center[0] += self.image_size[0]
  267. return False
  268. elif self.age >= self.lifespan:
  269. return True
  270.  
  271.  
  272. # Helpers to handle game logic
  273. # ----------------------------
  274.  
  275. # Spawn 5 rocks in random positions
  276. def rock_spawner():
  277. global rocks, level
  278. initial_speed = 50
  279. level_speed = initial_speed * math.sqrt(level)
  280.  
  281. def rand_sgn():
  282. return random.randrange(-1, 2, 2)
  283.  
  284. def rand_speed():
  285. return rand_sgn() * random.random()* level_speed
  286.  
  287. for i in range(5 + (level // 5)):
  288. while True:
  289. pos = [random.randrange(0, WIDTH), random.randrange(0, HEIGHT)]
  290. safe_zone = 2 * asteroid_info.get_size()[0]
  291. if dist(pos, [WIDTH/2, HEIGHT/2]) >= safe_zone:
  292. break
  293.  
  294. vel = [rand_speed(), rand_speed()]
  295. ang_vel = rand_sgn() * random.random() * math.pi * 2
  296. rocks.append(Sprite(pos, vel, 0, ang_vel, asteroid_image, asteroid_info))
  297.  
  298. # Spawn 2 child rocks if parent rock is large enough
  299. def child_rock_spawner(rock):
  300. threshold = 20 # child rock size limit, increasing this will yield smaller child rocks
  301. child_sz_inc = threshold/2 # child size = parent size minus increment, each generation of rocks will be smaller
  302. if rock.get_radius() > asteroid_info.get_radius() - threshold:
  303. child_info = ImageInfo([45, 45], [90, 90], int(rock.get_radius() - child_sz_inc))
  304.  
  305. rocks.append(Sprite(rock.get_pos(),\
  306. rot_vector(rock.get_vel(), deg_to_rad(45)),\
  307. 0, rock.get_angle_vel(), asteroid_image, child_info))
  308. rocks.append(Sprite(rock.get_pos(),\
  309. rot_vector(rock.get_vel(), deg_to_rad(-45)),\
  310. 0, rock.get_angle_vel(), asteroid_image, child_info))
  311.  
  312. # Process sprites
  313. def process_spriteGroup(spriteList, canvas):
  314. ''' Update and Draw sprites '''
  315. for sprite in spriteList[:]:
  316. # if dynamic sprite's lifespan has expired, remove it from list
  317. if sprite.update():
  318. spriteList.remove(sprite)
  319. else:
  320. sprite.draw(canvas)
  321.  
  322. # Detect and handle collisions. Collisions result in explosions
  323. def group_collide(spriteList, other_obj):
  324. ''' Checks if given object collides with any member of spriteList
  325. If collision is detected:
  326. - colliding object removed from list
  327. - explosion occurs at the location of other obj
  328. Returns True
  329. '''
  330. for sprite in spriteList:
  331. if sprite.collide(other_obj):
  332. explosion_info = ImageInfo([64, 64], [128, 128], (sprite.get_radius() + other_obj.get_radius())*2, 24, True)
  333. explosions.append(Sprite(other_obj.get_pos(), [0, 0], 0, 0,\
  334. explosion_image, explosion_info, explosion_sound))
  335. spriteList.remove(sprite)
  336. return True
  337. else:
  338. return False # either no collisions, or spriteList was empty
  339.  
  340. # Detect collisions, create explosions
  341. def group_group_collide(spList1, spList2):
  342. destroyed_sprites = []
  343. for sp2_obj in spList2[:]:
  344. # Object from list2 collides with someting in list1
  345. if group_collide(spList1, sp2_obj):
  346. destroyed_sprites.append(sp2_obj)
  347. spList2.remove(sp2_obj)
  348. else:
  349. # return list of sprites that were destroyed,
  350. # useful for calculating scores
  351. return destroyed_sprites
  352.  
  353. # Update score
  354. def update_score(rock):
  355. ''' multiply scores by level and inverse the size of rock, smaller rocks more points '''
  356. global score, level, lives
  357. if level % 5 == 0:
  358. lives += 1 # grant additional life per 5 levels survived
  359. score += level * (5 + (asteroid_info.get_radius() - rock.get_radius()))
  360.  
  361. # Keyboard controls for Space ship
  362. def ship_controls():
  363. # Thruster
  364. my_ship.set_thruster(keyboard['up'])
  365. # missiles
  366. if keyboard['space'] and len (missiles) < 3:
  367. if len(missiles) == 0:
  368. my_ship.shoot()
  369. # space missiles so the sprites don't overlap
  370. elif dist(my_ship.get_missile_spawn_point(), missiles[-1].get_pos()) >= 25:
  371. my_ship.shoot()
  372. # Angle
  373. if keyboard['left'] and not keyboard['right']:
  374. my_ship.update_angle_vel(-ANGULAR_VEL)
  375. elif keyboard['right'] and not keyboard['left']:
  376. my_ship.update_angle_vel(ANGULAR_VEL)
  377. else:
  378. my_ship.update_angle_vel(0.0)
  379.  
  380. # Check is level has been cleared
  381. def is_level_clear():
  382. # check if level cleared
  383. return len(rocks) <= 0
  384.  
  385. # Check if rendering of dynamic animated sprites has finished
  386. def finished_rendering():
  387. return len(missiles) <= 0 and len(explosions) <= 0
  388.  
  389. # Play background music
  390. def play_backgroundMusic():
  391. soundtrack.play()
  392. if time % 180*60 == 0:
  393. soundtrack.rewind()
  394.  
  395.  
  396. # DRAWING
  397. # --------
  398.  
  399. # Draw Intro Splash
  400. def draw_intro_splash(canvas):
  401. # order of drawing important because splash needs to be in background
  402. canvas.draw_image(splash_image, splash_info.get_center(), splash_info.get_size(),\
  403. [WIDTH / 2, HEIGHT / 2], splash_info.get_size())
  404. tx_controls = []
  405. tx_controls.append('UP : Thrust')
  406. tx_controls.append('<- -> : Rotate')
  407. tx_controls.append('SPACE : Missile')
  408. msg_pos = []
  409. for i in range(len(tx_controls)):
  410. txSize = frame.get_canvas_textwidth(tx_controls[i], 24)
  411. canvas.draw_text(tx_controls[i], (WIDTH/2 - txSize/2, HEIGHT/2 + 85 + (i*24)), 20, "White", "monospace")
  412.  
  413. # Game Ove Message
  414. def draw_game_over(canvas):
  415. msg = "GAME OVER"
  416. txSize = frame.get_canvas_textwidth(msg, 50)
  417. canvas.draw_text(msg, (WIDTH/2 - txSize/2, HEIGHT/2 - 85), 50, "White")
  418.  
  419. # Draw static elements
  420. def draw_static_background(canvas):
  421. # animiate background
  422. center = debris_info.get_center()
  423. size = debris_info.get_size()
  424. wtime = (time / 4) % center[0]
  425. # static nebula background
  426. canvas.draw_image(nebula_image, nebula_info.get_center(), nebula_info.get_size(), [WIDTH / 2, HEIGHT / 2], [WIDTH, HEIGHT])
  427. # slowly moving background debris
  428. canvas.draw_image(debris_image, [center[0] - wtime, center[1]], [size[0] - 2 * wtime, size[1]],
  429. [WIDTH / 2 + 1.25 * wtime, HEIGHT / 2], [WIDTH - 2.5 * wtime, HEIGHT])
  430. # wrap around debris image
  431. canvas.draw_image(debris_image, [size[0] - wtime, center[1]], [2 * wtime, size[1]],
  432. [1.25 * wtime, HEIGHT / 2], [2.5 * wtime, HEIGHT])
  433.  
  434. # draw/update lives and score
  435. str_lives = "Lives: " + str(lives)
  436. canvas.draw_text(str_lives, (50, 50), 30, "White")
  437.  
  438. str_score = "Score: " + str(score)
  439. canvas.draw_text(str_score, (50, 80), 20, "White")
  440.  
  441. def draw(canvas):
  442. global my_ship, rocks, missiles, explosions
  443. global time, level, lives, score # values
  444. global start_game, level_clear # flags
  445. # Static elements
  446. draw_static_background(canvas)
  447.  
  448. # Show Intro splash and Game Over message
  449. if not start_game:
  450. """ Show splash screen until mouse click to Start Game """
  451. draw_intro_splash(canvas)
  452. # Game Over Message
  453. if lives <= 0:
  454. draw_game_over(canvas)
  455.  
  456. # Game has been started
  457. else:
  458. time += 1
  459. play_backgroundMusic()
  460. # Lives > 0 and Level Not Cleared
  461. if not level_clear:
  462. # Ship has not been destroyed
  463. if my_ship.get_life_status():
  464. ship_controls() # handle user inputs to ship
  465. my_ship.update() # update position, vel in game
  466. my_ship.draw(canvas) # draw ship
  467.  
  468. # Update and Draw Sprites
  469. process_spriteGroup(rocks, canvas)
  470. process_spriteGroup(missiles, canvas)
  471. process_spriteGroup(explosions, canvas)
  472.  
  473. # Handle collisions
  474. # Missile-Rock collision
  475. destroyed_rocks = group_group_collide(missiles, rocks)
  476. for rock in destroyed_rocks:
  477. # Update score based on size of rock and level
  478. update_score(rock)
  479. # if rocks are big enough, spawn child rocks
  480. child_rock_spawner(rock)
  481. # Rock-ship collision
  482. if group_collide(rocks, my_ship):
  483. my_ship.set_life_status(False) # Ship has been destroyed
  484. lives -= 1
  485. score -= 5 * level
  486. spawn_timer.start()
  487.  
  488. # Check is level has been cleared
  489. if is_level_clear():
  490. level += 1
  491. level_clear = True
  492. my_ship.set_life_status(False)
  493. level_timer.start()
  494.  
  495. # Level cleared, load next level
  496. if level_clear:
  497. # Level load message
  498. msg = "Level " + str(level)
  499. txSize = frame.get_canvas_textwidth(msg, 50)
  500. canvas.draw_text(msg, (WIDTH/2 - txSize/2, HEIGHT/2), 50, "White")
  501.  
  502. # No lives left, game over
  503. elif lives <= 0 and finished_rendering():
  504. start_game = False
  505. soundtrack.rewind()
  506.  
  507.  
  508. # Timer handlers
  509. # ---------------
  510. # Wait 2s...then Spawn a spaceship
  511. def spawn_ship():
  512. ship_loc = [WIDTH/2, HEIGHT/2]
  513. for rock in rocks:
  514. if dist(rock.get_pos(), ship_loc) >= (rock.get_radius() + ship_info.get_radius()):
  515. continue
  516. else:
  517. break
  518. else:
  519. my_ship.set_life_status(True)
  520. if spawn_timer.is_running():
  521. spawn_timer.stop()
  522.  
  523. # Wait 3s...then load next level
  524. def load_level():
  525. global level_clear
  526. if level_timer.is_running():
  527. level_timer.stop()
  528. init_level()
  529. rock_spawner()
  530. spawn_ship()
  531.  
  532. # INPUT Handlers
  533. # --------------
  534. # Start Game on Mouse Click
  535. def splash_startGame(pos):
  536. global start_game
  537. if not start_game:
  538. init_game()
  539. rock_spawner()
  540. start_game = True
  541.  
  542. # Keyboard Handler
  543. def keydown(key):
  544. global keyboard
  545. if key == simplegui.KEY_MAP['up']:
  546. keyboard['up'] = True
  547. # -> (right arrow) key pressed, increment angular velocity
  548. if key == simplegui.KEY_MAP['right']:
  549. keyboard['right'] = True
  550. # <- (left arrow) key pressed, decrement angular velocity
  551. if key == simplegui.KEY_MAP['left']:
  552. keyboard['left'] = True
  553. if key == simplegui.KEY_MAP['space']:
  554. keyboard['space'] = True
  555.  
  556. def keyup(key):
  557. global keyboard
  558. if key == simplegui.KEY_MAP['up']:
  559. keyboard['up'] = False
  560. # -> (right arrow) key released, decrement angular velocity
  561. if key == simplegui.KEY_MAP['right']:
  562. keyboard['right'] = False
  563. # <- (left arrow) key released, increment angular velocity
  564. if key == simplegui.KEY_MAP['left']:
  565. keyboard['left'] = False
  566. if key == simplegui.KEY_MAP['space']:
  567. keyboard['space'] = False
  568.  
  569. # Initialize/ Reset Game State Variables
  570.  
  571. def init_level():
  572. ''' Variables that must be reset per level '''
  573. global level_clear, rocks, missiles, explosions, keyboard
  574. # Control
  575. keyboard = {'up' : False,
  576. 'right' : False,
  577. 'left' : False,
  578. 'space' : False,
  579. }
  580. # Flags
  581. level_clear = False
  582. # Reset Animations
  583. rocks = []
  584. missiles = []
  585. explosions = []
  586.  
  587. def init_game():
  588. ''' Declare globals, and initialize values '''
  589. global score, lives, time, level
  590. global keyboard, my_ship, rocks, missiles, explosions
  591. global level_clear, start_game
  592.  
  593. # Game states
  594. score = 0
  595. lives = 3
  596. time = 0.5
  597. level = 1
  598. # Control
  599. keyboard = {'up' : False,
  600. 'right' : False,
  601. 'left' : False,
  602. 'space' : False,
  603. }
  604. # Game Objects
  605. my_ship = Ship([WIDTH / 2, HEIGHT / 2], [0, 0], deg_to_rad(270), ship_image, ship_info)
  606. rocks = []
  607. missiles = []
  608. explosions = []
  609. # Flags
  610. level_clear = start_game = False
  611.  
  612. init_game() # Initialize and Load Game
  613.  
  614.  
  615. # Initialize frame
  616. frame = simplegui.create_frame("Asteroids", WIDTH, HEIGHT, 0)
  617.  
  618. # Register handlers
  619. frame.set_draw_handler(draw)
  620. # Input Handlers
  621. frame.set_mouseclick_handler(splash_startGame)
  622. frame.set_keydown_handler(keydown)
  623. frame.set_keyup_handler(keyup)
  624.  
  625. # Timers
  626. spawn_timer = simplegui.create_timer(2000.0, spawn_ship)
  627. level_timer = simplegui.create_timer(2000.0, load_level)
  628.  
  629. # Get things rolling
  630. frame.start()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement