Advertisement
zephyrtronium

BulletControl.py

Jun 8th, 2012
71
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 16.89 KB | None | 0 0
  1. #!/usr/bin/env python
  2.  
  3. import math
  4. import os
  5. import time
  6. import sys
  7. import random
  8. try:
  9.     import pygame
  10.     from pygame.locals import *
  11. except:
  12.     print "You require pygame."
  13.     raw_input("Press Enter to exit.")
  14.     sys.exit()
  15.  
  16. def Quit():
  17.     sys.exit()
  18.  
  19. def NormalizeAngle(angle):
  20.     angle %= 360
  21.     return angle
  22.  
  23. def AngleBetween(pos2, pos1):
  24.     x1, y1 = pos1
  25.     x2, y2 = pos2
  26.     deltaY = y2 - y1
  27.     deltaX = x2 - x1
  28.     radian = math.atan2(deltaY, deltaX)
  29.     angle = (radian*(180/math.pi))
  30.     return NormalizeAngle(angle)
  31.  
  32. def MoveByAngle(angle, speed, pos):
  33.     radian = angle * (math.pi/180)
  34.     x, y = pos
  35.     x, y = (x + (math.cos(radian) * speed)), (y + (math.sin(radian) * speed))
  36.     newpos = (x, y)
  37.     return newpos
  38.  
  39. def OutOfBounds(pos):
  40.     x,y = pos
  41.     if ((y < -64) or (y > play_area_dim[1]+64)):
  42.         return True
  43.     if ((x < -64) or (x > play_area_dim[0]+64)):
  44.         return True
  45.     return False
  46.  
  47.  
  48. class imageSurfaces:
  49.     def __init__(self):
  50.         self.images = {}
  51.         self.bullets = {}
  52.         for filename in os.listdir('img'):
  53.             if (filename.split(".")[-1] == 'png'):
  54.                 if (filename.split(".")[0].split("_")[-1] == "bullet"):
  55.                     if (filename.split(".")[0].split("_")[-2]+"_bullet" in list_of_bullets_to_rotate):
  56.                         self.bullets[filename.split(".")[0]] = [pygame.image.load(os.path.join('img',filename)), "rotate"]
  57.                     else:
  58.                         self.bullets[filename.split(".")[0]] = [pygame.image.load(os.path.join('img',filename)), "still"]
  59.                 else:
  60.                     name = (filename.split("."))[0]
  61.                     self.images[name] = pygame.image.load(os.path.join('img',filename))
  62.     def delete_scanned_bullet_dict(self):
  63.         del self.bullets
  64.  
  65.  
  66. class BulletSurfaces:
  67.     def __init__(self):
  68.         self.BulletSurfaceDict = {}
  69.         for key in imageSurfacesObj.bullets.keys():
  70.             if (imageSurfacesObj.bullets[key][-1] == "rotate"):
  71.                 self.BulletSurfaceDict[key] = {}
  72.                 surf = imageSurfacesObj.bullets[key][0]
  73.                 for i in range(0,360):
  74.                     yetanothersurf = pygame.transform.rotate(surf, i*-1)
  75.                     othersurf = pygame.Surface(yetanothersurf.get_size())
  76.                     othersurf.fill(pygame.Color("black"))
  77.                     othersurf.blit(yetanothersurf, (0,0))
  78.                     othersurf.set_colorkey(pygame.Color('black'), RLEACCEL)
  79.                     othersurf.convert_alpha()
  80.                     self.BulletSurfaceDict[key][i] = othersurf
  81.             else:
  82.                 surf = imageSurfacesObj.bullets[key][0]
  83.                 othersurf = pygame.Surface(surf.get_size())
  84.                 othersurf.fill(pygame.Color('black'))
  85.                 othersurf.blit(surf, (0,0))
  86.                 othersurf.set_colorkey(pygame.Color('black'), RLEACCEL)
  87.                 othersurf.convert_alpha()
  88.                 self.BulletSurfaceDict[key] = othersurf
  89.         imageSurfacesObj.delete_scanned_bullet_dict()
  90.     def give_surface(self, species, angle, color):
  91.         if species in list_of_bullets_to_rotate:
  92.             surface = self.BulletSurfaceDict[species][int(NormalizeAngle(angle))]
  93.         else:
  94.             surface = self.BulletSurfaceDict[species]
  95.         # color the surface here
  96.         return surface
  97.  
  98.        
  99. class Bullet:
  100.     def __init__(self, pos, species, col, angle, angvel, velocity, velmod, behavior):
  101.         angle = NormalizeAngle(angle)
  102.         self.species = species
  103.         self.color = pygame.Color(col)
  104.         self.behavior = behavior
  105.         self.angle = angle
  106.         self.angvel = angvel
  107.         self.velocity = velocity
  108.         self.velmod = velmod
  109.         self.pos = pos
  110.         self.dead = False
  111.         self.count = 0
  112.         self.var1,self.var2,self.var3,self.var4,self.var5,self.var6,self.var7,self.var8,self.var9,self.var0 = 0,0,0,0,0,0,0,0,0,0
  113.     def set_species(self, newspecies):
  114.         self.species = newspecies
  115.     def set_color(self, newcolor):
  116.         self.color = pygame.Color(newcolor)
  117.     def set_angle(self, newangle):
  118.         self.angle = newangle
  119.     def set_angvel(self, newangvel):
  120.         self.angvel = newangvel
  121.     def set_velocity(self, newvelocity):
  122.         self.velocity = newvelocity
  123.     def set_velmod(self, newvelmod):
  124.         self.velmod = newvelmod
  125.     def set_behavior(self, newbehavior):
  126.         self.behavior = newbehavior
  127.        
  128.     def process_norm(self):
  129.         self.angle += self.angvel
  130.         self.angle = NormalizeAngle(self.angle)
  131.         self.velocity += self.velmod
  132.         self.pos = MoveByAngle(self.angle, self.velocity, self.pos)
  133.         self.check_OOB()
  134.         self.draw_norm()
  135.        
  136.     def check_OOB(self):
  137.         if self.killoffscreen:
  138.             if OutOfBounds(self.pos):
  139.                 self.dead = True
  140.        
  141.     def draw_norm(self):
  142.         bulsurf = bulletSurfacesObj.give_surface(self.species, self.angle, self.color)
  143.         BulletLayerSurfaceObj.blit(bulsurf, (self.pos[0]-(bulsurf.get_width()/2), self.pos[1]-(bulsurf.get_height()/2)))#, None, BLEND_ADD)
  144.        
  145.        
  146.     # Behavior types
  147.    
  148.     def default(bullet):
  149.         bullet.killable, bullet.killoffscreen = True, True
  150.         bullet.process_norm()
  151.     def simple(bullet):
  152.         bullet.killable, bullet.killoffscreen = True, True
  153.         if not bullet.var1:
  154.             bullet.var1 = True
  155.             newpos = MoveByAngle(bullet.angle, bullet.velocity, bullet.pos)
  156.             bullet.xdiff = bullet.pos[0] - newpos[0]
  157.             bullet.ydiff = bullet.pos[1] - newpos[1]
  158.         if bullet.var1:
  159.             bullet.pos = (bullet.pos[0]-bullet.xdiff, bullet.pos[1]-bullet.ydiff)
  160.         bullet.check_OOB()
  161.         bullet.draw_norm()
  162.     def invincible(bullet):
  163.         bullet.killable, bullet.killoffscreen = False, True
  164.         bullet.process_norm()
  165.     def everlasting(bullet):
  166.         bullet.killable, bullet.killoffscreen = True, False
  167.         bullet.process_norm()
  168.     def immortal(bullet):
  169.         bullet.killable, bullet.killoffscreen = False, False
  170.         bullet.process_norm()
  171.     def killatcenter(bullet):
  172.         bullet.killable, bullet.killoffscreen = True, False
  173.         bullet.process_norm()
  174.         if (int(bullet.pos[0]) in range(center_field[0]-2,center_field[0]+2) and (int(bullet.pos[1]) in range(center_field[1]-2,center_field[1]+2))):
  175.             bullet.dead = True
  176.     def timed5seconds(bullet):
  177.         bullet.killable, bullet.killoffscreen = True, False
  178.         bullet.process_norm()
  179.         bullet.count +=1
  180.         if bullet.count > 300:
  181.             bullet.dead = True
  182.     def timed8seconds(bullet):
  183.         bullet.killable, bullet.killoffscreen = True, False
  184.         bullet.process_norm()
  185.         bullet.count +=1
  186.         if bullet.count > 480:
  187.             bullet.dead = True
  188.     def homing(bullet):
  189.         bullet.killable, bullet.killoffscreen = True, True
  190.         bullet.process_norm()
  191.         bullet.angle = AngleBetween(Player.pos, bullet.pos)
  192.     def ripple1(bullet):
  193.         if not bullet.var1:
  194.             bullet.var1 = 1
  195.             bullet.timing = bullet.velmod
  196.             bullet.velmod = 0
  197.         bullet.killable, bullet.killoffscreen = True, True
  198.         bullet.count += 1
  199.         bullet.process_norm()
  200.         if bullet.count >= bullet.timing:
  201.             if (int(bullet.pos[0]), int(bullet.pos[1])) in BulletControlObj.spots_used:
  202.                 bullet.behavior = Bullet.default
  203.             else:
  204.                 bullet.dead = True
  205.                 for i in [-90,90]:
  206.                     CreateBullet(bullet.pos, 'rice', 'white', bullet.angle+i, bullet.angvel,bullet.velocity,bullet.timing,Bullet.ripple1,len(BulletControlObj.BulletDict))
  207.                     BulletControlObj.spots_used.append((int(bullet.pos[0]), int(bullet.pos[1])))
  208.  
  209.  
  210. class BulletController:
  211.     def __init__(self):
  212.         self.BulletDict = {}
  213.         self.BulletList = []
  214.     def create_bullet(self, pos = (0,0), species = "rice", col = "red", angle = 90, angvel = 0, velocity = 1, velmod = 0, behavior = Bullet.default, id = 0):
  215.         species = str(species)+"_bullet"
  216.         if (id == 0):
  217.             self.BulletList.append(Bullet(pos, species, col, angle, angvel, velocity, velmod, behavior))
  218.         else:
  219.             self.BulletDict[id] = Bullet(pos, species, col, angle, angvel, velocity, velmod, behavior)
  220.     def process_bullets(self):
  221.         BulletLayerSurfaceObj.fill(pygame.Color("black"))
  222.         bullets_to_delete = []
  223.         for bullet in self.BulletList:
  224.             bullet.behavior(bullet)
  225.             # bulsurf = bulletSurfacesObj.give_surface(bullet.species, bullet.angle, bullet.color)
  226.             # BulletLayerSurfaceObj.blit(bulsurf, (bullet.pos[0]-(bulsurf.get_width()/2), bullet.pos[1]-(bulsurf.get_height()/2)))#, None, BLEND_ADD)
  227.             if bullet.dead:
  228.                 bullets_to_delete.append(bullet)
  229.         for item in bullets_to_delete:
  230.             self.BulletList.remove(item)
  231.                
  232.         for key in self.BulletDict.keys():
  233.             self.BulletDict[key].behavior(self.BulletDict[key])
  234.             # bullet = self.BulletDict[key]
  235.             # bulsurf = bulletSurfacesObj.give_surface(bullet.species, bullet.angle, bullet.color)
  236.             # BulletLayerSurfaceObj.blit(bulsurf, (bullet.pos[0]-(bulsurf.get_width()/2), bullet.pos[1]-(bulsurf.get_height()/2)))#, None, BLEND_ADD)
  237.             if self.BulletDict[key].dead:
  238.                 del self.BulletDict[key]
  239.  
  240. def TotalNumberOfBullets():
  241.     return int(len(BulletControlObj.BulletList) + len(BulletControlObj.BulletDict))
  242.    
  243. class fpsCounter():
  244.     def __init__(self):
  245.         self.now = list(time.localtime())[5]
  246.         self.count = 0
  247.         self.FPS = 0
  248.     def __call__(self):
  249.         if not (self.now == list(time.localtime())[5]):
  250.             self.now = list(time.localtime())[5]
  251.             self.FPS = self.count
  252.             self.count = 0
  253.         self.count +=1
  254.         return self.FPS
  255.  
  256. class Enemy:
  257.     def __init__(self, sprite, pos, hp, defense, isboss, callback, speed, moving, dest, movetype):
  258.         if dest:
  259.             self.dest = dest
  260.             self.prevpos = pos
  261.         else:
  262.             self.dest = pos
  263.             self.prevpos = pos
  264.         self.sprite = sprite
  265.         self.pos = pos
  266.         self.hp = hp
  267.         self.maxhp = hp
  268.         self.weak = False
  269.         self.defenese = defense
  270.         self.isboss = isboss
  271.         self.behavior = callback
  272.         self.moving = moving
  273.         self.speed = speed
  274.         self.dead = False
  275.         self.weakpoint = ((self.maxhp/100.0)*20)
  276.         self.var1,self.var2,self.var3,self.var4,self.var5,self.var6,self.var7,self.var8,self.var9,self.var0 = 0,0,0,0,0,0,0,0,0,0
  277.     def process_norm(self):
  278.         if self.hp <= 0:
  279.             self.dead = True
  280.         elif (self.hp < self.weakpoint):
  281.             self.weak = True
  282.         if not (self.pos == self.dest):
  283.             self.moving = True
  284.         else:
  285.             self.moving = False
  286.     def move(enemy):
  287.         enemy.pos = MoveByAngle(GetAngleBetween(enemy.pos, enemy.dest), enemy.speed, enemy.pos)
  288.     def debug(self):
  289.         print 'sus'
  290.        
  291.  
  292. class EnemyController:
  293.     def __init__(self):
  294.         self.enemylist = []
  295.     def create_enemy(self, sprite, pos, hp, defense, isboss, callback, speed, moving = 0, dest = False, movetype = Enemy.move):
  296.         self.enemylist.append(Enemy(sprite, pos, hp, defense, isboss, callback, speed, moving, dest, movetype))
  297.     def process_enemies(self):
  298.         enemies_to_delete = []
  299.         for enemy in self.enemylist:
  300.             enemy.behavior(enemy)
  301.            
  302.             EnemyLayerSurfaceObj.blit(enemy.sprite, (enemy.pos[0]-(enemy.sprite.get_width()/2), enemy.pos[1]-(enemy.sprite.get_height()/2)))
  303.            
  304.             if enemy.dead:
  305.                 enemies_to_delete.append(enemy)
  306.         for enemy in enemies_to_delete:
  307.             self.enemylist.remove(enemy)
  308.  
  309. class InputState:
  310.     # Only one instance of this should ever exist.
  311.     def __init__(self):
  312.         self.up = False
  313.         self.down = False
  314.         self.left = False
  315.         self.right = False
  316.         self.a = False
  317.         self.b = False
  318.         self.x = False
  319.         self.y = False
  320.         self.pause = False
  321.         self.esc = False
  322.         self.enter = False
  323.  
  324.  
  325. class PlayerObject:
  326.     # Only one instance of this should ever exist.
  327.     def __init__(self):
  328.         self.pos = player_default_pos
  329.         self.focused = False
  330.         self.shooting = False
  331.         self.dead = False
  332.         self.lives = starting_lives
  333.         self.bombs = new_bomb_stock
  334.         self.up = False
  335.         self.down = False
  336.         self.left = False
  337.         self.right = False
  338.         self.shoot = False
  339.         self.bomb = False
  340.         self.hitbox = 1.5
  341.         self.unfocusedspeed = 5
  342.         self.focusedspeed = 2
  343.         self.bombing = False
  344.         self.boundaries = [ # Boundaries of the play area. Ordered Bottom, Right, Left, Top.
  345.         play_area_dim[1] - 15,
  346.         play_area_dim[0] - 12,
  347.         0+12,
  348.         0+15
  349.         ]
  350.     def process_input(self):
  351.         self.up, self.down, self.left, self.right, self.focused, self.shoot, self.bomb = InputStateObj.up, InputStateObj.down, InputStateObj.left, InputStateObj.right, InputStateObj.b, InputStateObj.a, InputStateObj.x
  352.         if self.focused:
  353.             travel_distance = self.focusedspeed
  354.         else:
  355.             travel_distance = self.unfocusedspeed
  356.         if self.down:
  357.             if self.left:
  358.                 self.pos = MoveByAngle(135, travel_distance, self.pos)
  359.             elif self.right:
  360.                 self.pos = MoveByAngle(45, travel_distance, self.pos)
  361.             else:
  362.                 self.pos = MoveByAngle(90, travel_distance, self.pos)
  363.         elif self.up:
  364.             if self.left:
  365.                 self.pos = MoveByAngle(225, travel_distance, self.pos)
  366.             elif self.right:
  367.                 self.pos = MoveByAngle(315, travel_distance, self.pos)
  368.             else:
  369.                 self.pos = MoveByAngle(270, travel_distance, self.pos)
  370.         elif self.left:
  371.             if self.up:
  372.                 self.pos = MoveByAngle(225, travel_distance, self.pos)
  373.             elif self.down:
  374.                 self.pos = MoveByAngle(135, travel_distance, self.pos)
  375.             else:
  376.                 self.pos = MoveByAngle(180, travel_distance, self.pos)
  377.         elif self.right:
  378.             if self.up:
  379.                 self.pos = MoveByAngle(315, travel_distance, self.pos)
  380.             elif self.down:
  381.                 self.pos = MoveByAngle(45, travel_distance, self.pos)
  382.             else:
  383.                 self.pos = MoveByAngle(0, travel_distance, self.pos)
  384.         self.up, self.down, self.left, self.right, self.focused = 0,0,0,0,0
  385.         if (self.pos[0] > self.boundaries[1]):
  386.             self.pos = (self.boundaries[1], self.pos[1])
  387.         elif (self.pos[0] < self.boundaries[2]):
  388.             self.pos = (self.boundaries[2], self.pos[1])
  389.         if (self.pos[1] > self.boundaries[0]):
  390.             self.pos = (self.pos[0], self.boundaries[0])
  391.         elif (self.pos[1] < self.boundaries[3]):
  392.             self.pos = (self.pos[0], self.boundaries[3])
  393.     def loop(self):
  394.         self.process_input()
  395.        
  396.        
  397.        
  398. class GameLoop:
  399.     def __init__(self):
  400.         self.loop = self.PlayMode
  401.         self.event = self.standard
  402.     def __call__(self):
  403.         self.loop()
  404.     def PlayMode(self):
  405.         fpsCounterObj()
  406.         self.event()
  407.         BulletControlObj.process_bullets()
  408.         Player.loop()
  409.        
  410.         #print TotalNumberOfBullets(), fpsCounterObj.FPS, Player.pos
  411.        
  412.         windowSurfaceObj.blit(BulletLayerSurfaceObj, play_area_offset)
  413.        
  414.         if 1: # If not player.left or player.right
  415.             player_x = (Player.pos[0] - int(imageSurfacesObj.images['player'].get_width()/2)) + play_area_offset[0]
  416.             player_y = (Player.pos[1] - int(imageSurfacesObj.images['player'].get_height()/2)) + play_area_offset[1]
  417.             windowSurfaceObj.blit(imageSurfacesObj.images['player'], (player_x, player_y))
  418.            
  419.         if 1: #If HUD area isn't different
  420.             pygame.display.update(playAreaSurfaceObj.get_rect(center=center_window))
  421.         else:
  422.             pygame.display.update()
  423.         fpsClock.tick(fps)
  424.     def NoControl(self):
  425.         for event in pygame.event.get():
  426.             if (event.type == QUIT):
  427.                 sys.exit()
  428.     def standard(self):
  429.         for event in pygame.event.get():
  430.             if (event.type == QUIT):
  431.                 Quit()
  432.             elif (event.type == KEYDOWN):
  433.                 if (event.key == K_UP):
  434.                     InputStateObj.up = 1
  435.                 elif (event.key == K_LEFT):
  436.                     InputStateObj.left = 1
  437.                 elif (event.key == K_RIGHT):
  438.                     InputStateObj.right = 1
  439.                 elif (event.key == K_DOWN):
  440.                     InputStateObj.down = 1
  441.                 elif (event.key == K_LSHIFT):
  442.                     InputStateObj.b = 1
  443.             elif (event.type == KEYUP):
  444.                 if (event.key == K_UP):
  445.                     InputStateObj.up = 0
  446.                 elif (event.key == K_LEFT):
  447.                     InputStateObj.left = 0
  448.                 elif (event.key == K_RIGHT):
  449.                     InputStateObj.right = 0
  450.                 elif (event.key == K_DOWN):
  451.                     InputStateObj.down = 0
  452.                 elif (event.key == K_LSHIFT):
  453.                     InputStateObj.b = 0
  454.    
  455. def GetAngleToPlayer(spot):
  456.     return AngleBetween(Player.pos, spot)
  457.  
  458. list_of_bullets_to_rotate = ['rice_bullet', 'card_bullet']
  459. window_dim = (640, 480)#(1024,768)
  460. play_area_dim = (384, 448)#(630,736)
  461. fps = 60
  462. marigin_percent = 6
  463.  
  464. center_window = (window_dim[0]/2,window_dim[1]/2)
  465. play_area_offset = (int((window_dim[0]/2)-(play_area_dim[0]/2)),int((window_dim[1]/2)-(play_area_dim[1]/2)))#(window_dim[0]/20, window_dim[1]/30)
  466. center_field = (int(play_area_dim[0]/2),int(play_area_dim[1]/2))
  467. boss_default_pos = (center_field[0], center_field[1]-(play_area_dim[1]/4))
  468. player_default_pos = (center_field[0], center_field[1]+int((play_area_dim[1]/100.0)*35))
  469. access_meter_offset = (int(play_area_offset[0]-((window_dim[0]/100)*marigin_percent)), play_area_offset[1])
  470. score_meter_x_offset = int((2*play_area_offset[0])+((window_dim[0]/100)*marigin_percent))
  471.  
  472. starting_lives = 4
  473. new_bomb_stock = 3
  474.  
  475. pygame.init()
  476. fpsClock = pygame.time.Clock()
  477. windowSurfaceObj = pygame.display.set_mode(window_dim)
  478. playAreaSurfaceObj = pygame.Surface(play_area_dim)
  479. imageSurfacesObj = imageSurfaces()
  480. bulletSurfacesObj = BulletSurfaces()
  481.  
  482. BulletControlObj = BulletController()
  483. BulletLayerSurfaceObj = pygame.Surface(play_area_dim)
  484. BulletLayerSurfaceObj.convert_alpha()
  485.  
  486. EnemyControlObj = EnemyController()
  487. EnemyLayerSurfaceObj = pygame.Surface(play_area_dim)
  488. EnemyLayerSurfaceObj.convert_alpha()
  489.  
  490. windowSurfaceObj.fill(pygame.Color('grey'))
  491.  
  492. MainLoop = GameLoop()
  493. fpsCounterObj = fpsCounter()
  494. InputStateObj = InputState()
  495. Player = PlayerObject()
  496.  
  497. SpawnEnemy = EnemyControlObj.create_enemy # pos , species, color, angle, angvel, velocity, velmod, behavior, id
  498. CreateBullet = BulletControlObj.create_bullet # pos , species, color, angle, angvel, velocity, velmod, behavior, id
  499.  
  500. pygame.display.update()
  501.  
  502. musicpath = os.path.join('music','Strange Oriental Discourse.ogg')
  503. if os.path.exists(musicpath):
  504.     pygame.mixer.music.load(musicpath)
  505.     #pygame.mixer.music.play()
  506.  
  507. soundpath = os.path.join('sound','playerdie.ogg')
  508. if os.path.exists(soundpath):
  509.     PlayerDieSFX = pygame.mixer.Sound(soundpath)
  510.  
  511. #=SCRIPT=#
  512. if len(sys.argv) > 1:
  513.         try:
  514.                 with open(sys.argv[1]) as f:
  515.                        exec(f.read())
  516.         except Exception as e:
  517.                 print (e)
  518. else:
  519.         print ('No script given.')
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement