Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #!/usr/bin/env python
- import math
- import os
- import time
- import sys
- import random
- try:
- import pygame
- from pygame.locals import *
- except:
- print "You require pygame."
- raw_input("Press Enter to exit.")
- sys.exit()
- def Quit():
- sys.exit()
- def NormalizeAngle(angle):
- angle %= 360
- return angle
- def AngleBetween(pos2, pos1):
- x1, y1 = pos1
- x2, y2 = pos2
- deltaY = y2 - y1
- deltaX = x2 - x1
- radian = math.atan2(deltaY, deltaX)
- angle = (radian*(180/math.pi))
- return NormalizeAngle(angle)
- def MoveByAngle(angle, speed, pos):
- radian = angle * (math.pi/180)
- x, y = pos
- x, y = (x + (math.cos(radian) * speed)), (y + (math.sin(radian) * speed))
- newpos = (x, y)
- return newpos
- def OutOfBounds(pos):
- x,y = pos
- if ((y < -64) or (y > play_area_dim[1]+64)):
- return True
- if ((x < -64) or (x > play_area_dim[0]+64)):
- return True
- return False
- class imageSurfaces:
- def __init__(self):
- self.images = {}
- self.bullets = {}
- for filename in os.listdir('img'):
- if (filename.split(".")[-1] == 'png'):
- if (filename.split(".")[0].split("_")[-1] == "bullet"):
- if (filename.split(".")[0].split("_")[-2]+"_bullet" in list_of_bullets_to_rotate):
- self.bullets[filename.split(".")[0]] = [pygame.image.load(os.path.join('img',filename)), "rotate"]
- else:
- self.bullets[filename.split(".")[0]] = [pygame.image.load(os.path.join('img',filename)), "still"]
- else:
- name = (filename.split("."))[0]
- self.images[name] = pygame.image.load(os.path.join('img',filename))
- def delete_scanned_bullet_dict(self):
- del self.bullets
- class BulletSurfaces:
- def __init__(self):
- self.BulletSurfaceDict = {}
- for key in imageSurfacesObj.bullets.keys():
- if (imageSurfacesObj.bullets[key][-1] == "rotate"):
- self.BulletSurfaceDict[key] = {}
- surf = imageSurfacesObj.bullets[key][0]
- for i in range(0,360):
- yetanothersurf = pygame.transform.rotate(surf, i*-1)
- othersurf = pygame.Surface(yetanothersurf.get_size())
- othersurf.fill(pygame.Color("black"))
- othersurf.blit(yetanothersurf, (0,0))
- othersurf.set_colorkey(pygame.Color('black'), RLEACCEL)
- othersurf.convert_alpha()
- self.BulletSurfaceDict[key][i] = othersurf
- else:
- surf = imageSurfacesObj.bullets[key][0]
- othersurf = pygame.Surface(surf.get_size())
- othersurf.fill(pygame.Color('black'))
- othersurf.blit(surf, (0,0))
- othersurf.set_colorkey(pygame.Color('black'), RLEACCEL)
- othersurf.convert_alpha()
- self.BulletSurfaceDict[key] = othersurf
- imageSurfacesObj.delete_scanned_bullet_dict()
- def give_surface(self, species, angle, color):
- if species in list_of_bullets_to_rotate:
- surface = self.BulletSurfaceDict[species][int(NormalizeAngle(angle))]
- else:
- surface = self.BulletSurfaceDict[species]
- # color the surface here
- return surface
- class Bullet:
- def __init__(self, pos, species, col, angle, angvel, velocity, velmod, behavior):
- angle = NormalizeAngle(angle)
- self.species = species
- self.color = pygame.Color(col)
- self.behavior = behavior
- self.angle = angle
- self.angvel = angvel
- self.velocity = velocity
- self.velmod = velmod
- self.pos = pos
- self.dead = False
- self.count = 0
- 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
- def set_species(self, newspecies):
- self.species = newspecies
- def set_color(self, newcolor):
- self.color = pygame.Color(newcolor)
- def set_angle(self, newangle):
- self.angle = newangle
- def set_angvel(self, newangvel):
- self.angvel = newangvel
- def set_velocity(self, newvelocity):
- self.velocity = newvelocity
- def set_velmod(self, newvelmod):
- self.velmod = newvelmod
- def set_behavior(self, newbehavior):
- self.behavior = newbehavior
- def process_norm(self):
- self.angle += self.angvel
- self.angle = NormalizeAngle(self.angle)
- self.velocity += self.velmod
- self.pos = MoveByAngle(self.angle, self.velocity, self.pos)
- self.check_OOB()
- self.draw_norm()
- def check_OOB(self):
- if self.killoffscreen:
- if OutOfBounds(self.pos):
- self.dead = True
- def draw_norm(self):
- bulsurf = bulletSurfacesObj.give_surface(self.species, self.angle, self.color)
- BulletLayerSurfaceObj.blit(bulsurf, (self.pos[0]-(bulsurf.get_width()/2), self.pos[1]-(bulsurf.get_height()/2)))#, None, BLEND_ADD)
- # Behavior types
- def default(bullet):
- bullet.killable, bullet.killoffscreen = True, True
- bullet.process_norm()
- def simple(bullet):
- bullet.killable, bullet.killoffscreen = True, True
- if not bullet.var1:
- bullet.var1 = True
- newpos = MoveByAngle(bullet.angle, bullet.velocity, bullet.pos)
- bullet.xdiff = bullet.pos[0] - newpos[0]
- bullet.ydiff = bullet.pos[1] - newpos[1]
- if bullet.var1:
- bullet.pos = (bullet.pos[0]-bullet.xdiff, bullet.pos[1]-bullet.ydiff)
- bullet.check_OOB()
- bullet.draw_norm()
- def invincible(bullet):
- bullet.killable, bullet.killoffscreen = False, True
- bullet.process_norm()
- def everlasting(bullet):
- bullet.killable, bullet.killoffscreen = True, False
- bullet.process_norm()
- def immortal(bullet):
- bullet.killable, bullet.killoffscreen = False, False
- bullet.process_norm()
- def killatcenter(bullet):
- bullet.killable, bullet.killoffscreen = True, False
- bullet.process_norm()
- 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))):
- bullet.dead = True
- def timed5seconds(bullet):
- bullet.killable, bullet.killoffscreen = True, False
- bullet.process_norm()
- bullet.count +=1
- if bullet.count > 300:
- bullet.dead = True
- def timed8seconds(bullet):
- bullet.killable, bullet.killoffscreen = True, False
- bullet.process_norm()
- bullet.count +=1
- if bullet.count > 480:
- bullet.dead = True
- def homing(bullet):
- bullet.killable, bullet.killoffscreen = True, True
- bullet.process_norm()
- bullet.angle = AngleBetween(Player.pos, bullet.pos)
- def ripple1(bullet):
- if not bullet.var1:
- bullet.var1 = 1
- bullet.timing = bullet.velmod
- bullet.velmod = 0
- bullet.killable, bullet.killoffscreen = True, True
- bullet.count += 1
- bullet.process_norm()
- if bullet.count >= bullet.timing:
- if (int(bullet.pos[0]), int(bullet.pos[1])) in BulletControlObj.spots_used:
- bullet.behavior = Bullet.default
- else:
- bullet.dead = True
- for i in [-90,90]:
- CreateBullet(bullet.pos, 'rice', 'white', bullet.angle+i, bullet.angvel,bullet.velocity,bullet.timing,Bullet.ripple1,len(BulletControlObj.BulletDict))
- BulletControlObj.spots_used.append((int(bullet.pos[0]), int(bullet.pos[1])))
- class BulletController:
- def __init__(self):
- self.BulletDict = {}
- self.BulletList = []
- def create_bullet(self, pos = (0,0), species = "rice", col = "red", angle = 90, angvel = 0, velocity = 1, velmod = 0, behavior = Bullet.default, id = 0):
- species = str(species)+"_bullet"
- if (id == 0):
- self.BulletList.append(Bullet(pos, species, col, angle, angvel, velocity, velmod, behavior))
- else:
- self.BulletDict[id] = Bullet(pos, species, col, angle, angvel, velocity, velmod, behavior)
- def process_bullets(self):
- BulletLayerSurfaceObj.fill(pygame.Color("black"))
- bullets_to_delete = []
- for bullet in self.BulletList:
- bullet.behavior(bullet)
- # bulsurf = bulletSurfacesObj.give_surface(bullet.species, bullet.angle, bullet.color)
- # BulletLayerSurfaceObj.blit(bulsurf, (bullet.pos[0]-(bulsurf.get_width()/2), bullet.pos[1]-(bulsurf.get_height()/2)))#, None, BLEND_ADD)
- if bullet.dead:
- bullets_to_delete.append(bullet)
- for item in bullets_to_delete:
- self.BulletList.remove(item)
- for key in self.BulletDict.keys():
- self.BulletDict[key].behavior(self.BulletDict[key])
- # bullet = self.BulletDict[key]
- # bulsurf = bulletSurfacesObj.give_surface(bullet.species, bullet.angle, bullet.color)
- # BulletLayerSurfaceObj.blit(bulsurf, (bullet.pos[0]-(bulsurf.get_width()/2), bullet.pos[1]-(bulsurf.get_height()/2)))#, None, BLEND_ADD)
- if self.BulletDict[key].dead:
- del self.BulletDict[key]
- def TotalNumberOfBullets():
- return int(len(BulletControlObj.BulletList) + len(BulletControlObj.BulletDict))
- class fpsCounter():
- def __init__(self):
- self.now = list(time.localtime())[5]
- self.count = 0
- self.FPS = 0
- def __call__(self):
- if not (self.now == list(time.localtime())[5]):
- self.now = list(time.localtime())[5]
- self.FPS = self.count
- self.count = 0
- self.count +=1
- return self.FPS
- class Enemy:
- def __init__(self, sprite, pos, hp, defense, isboss, callback, speed, moving, dest, movetype):
- if dest:
- self.dest = dest
- self.prevpos = pos
- else:
- self.dest = pos
- self.prevpos = pos
- self.sprite = sprite
- self.pos = pos
- self.hp = hp
- self.maxhp = hp
- self.weak = False
- self.defenese = defense
- self.isboss = isboss
- self.behavior = callback
- self.moving = moving
- self.speed = speed
- self.dead = False
- self.weakpoint = ((self.maxhp/100.0)*20)
- 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
- def process_norm(self):
- if self.hp <= 0:
- self.dead = True
- elif (self.hp < self.weakpoint):
- self.weak = True
- if not (self.pos == self.dest):
- self.moving = True
- else:
- self.moving = False
- def move(enemy):
- enemy.pos = MoveByAngle(GetAngleBetween(enemy.pos, enemy.dest), enemy.speed, enemy.pos)
- def debug(self):
- print 'sus'
- class EnemyController:
- def __init__(self):
- self.enemylist = []
- def create_enemy(self, sprite, pos, hp, defense, isboss, callback, speed, moving = 0, dest = False, movetype = Enemy.move):
- self.enemylist.append(Enemy(sprite, pos, hp, defense, isboss, callback, speed, moving, dest, movetype))
- def process_enemies(self):
- enemies_to_delete = []
- for enemy in self.enemylist:
- enemy.behavior(enemy)
- EnemyLayerSurfaceObj.blit(enemy.sprite, (enemy.pos[0]-(enemy.sprite.get_width()/2), enemy.pos[1]-(enemy.sprite.get_height()/2)))
- if enemy.dead:
- enemies_to_delete.append(enemy)
- for enemy in enemies_to_delete:
- self.enemylist.remove(enemy)
- class InputState:
- # Only one instance of this should ever exist.
- def __init__(self):
- self.up = False
- self.down = False
- self.left = False
- self.right = False
- self.a = False
- self.b = False
- self.x = False
- self.y = False
- self.pause = False
- self.esc = False
- self.enter = False
- class PlayerObject:
- # Only one instance of this should ever exist.
- def __init__(self):
- self.pos = player_default_pos
- self.focused = False
- self.shooting = False
- self.dead = False
- self.lives = starting_lives
- self.bombs = new_bomb_stock
- self.up = False
- self.down = False
- self.left = False
- self.right = False
- self.shoot = False
- self.bomb = False
- self.hitbox = 1.5
- self.unfocusedspeed = 5
- self.focusedspeed = 2
- self.bombing = False
- self.boundaries = [ # Boundaries of the play area. Ordered Bottom, Right, Left, Top.
- play_area_dim[1] - 15,
- play_area_dim[0] - 12,
- 0+12,
- 0+15
- ]
- def process_input(self):
- 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
- if self.focused:
- travel_distance = self.focusedspeed
- else:
- travel_distance = self.unfocusedspeed
- if self.down:
- if self.left:
- self.pos = MoveByAngle(135, travel_distance, self.pos)
- elif self.right:
- self.pos = MoveByAngle(45, travel_distance, self.pos)
- else:
- self.pos = MoveByAngle(90, travel_distance, self.pos)
- elif self.up:
- if self.left:
- self.pos = MoveByAngle(225, travel_distance, self.pos)
- elif self.right:
- self.pos = MoveByAngle(315, travel_distance, self.pos)
- else:
- self.pos = MoveByAngle(270, travel_distance, self.pos)
- elif self.left:
- if self.up:
- self.pos = MoveByAngle(225, travel_distance, self.pos)
- elif self.down:
- self.pos = MoveByAngle(135, travel_distance, self.pos)
- else:
- self.pos = MoveByAngle(180, travel_distance, self.pos)
- elif self.right:
- if self.up:
- self.pos = MoveByAngle(315, travel_distance, self.pos)
- elif self.down:
- self.pos = MoveByAngle(45, travel_distance, self.pos)
- else:
- self.pos = MoveByAngle(0, travel_distance, self.pos)
- self.up, self.down, self.left, self.right, self.focused = 0,0,0,0,0
- if (self.pos[0] > self.boundaries[1]):
- self.pos = (self.boundaries[1], self.pos[1])
- elif (self.pos[0] < self.boundaries[2]):
- self.pos = (self.boundaries[2], self.pos[1])
- if (self.pos[1] > self.boundaries[0]):
- self.pos = (self.pos[0], self.boundaries[0])
- elif (self.pos[1] < self.boundaries[3]):
- self.pos = (self.pos[0], self.boundaries[3])
- def loop(self):
- self.process_input()
- class GameLoop:
- def __init__(self):
- self.loop = self.PlayMode
- self.event = self.standard
- def __call__(self):
- self.loop()
- def PlayMode(self):
- fpsCounterObj()
- self.event()
- BulletControlObj.process_bullets()
- Player.loop()
- #print TotalNumberOfBullets(), fpsCounterObj.FPS, Player.pos
- windowSurfaceObj.blit(BulletLayerSurfaceObj, play_area_offset)
- if 1: # If not player.left or player.right
- player_x = (Player.pos[0] - int(imageSurfacesObj.images['player'].get_width()/2)) + play_area_offset[0]
- player_y = (Player.pos[1] - int(imageSurfacesObj.images['player'].get_height()/2)) + play_area_offset[1]
- windowSurfaceObj.blit(imageSurfacesObj.images['player'], (player_x, player_y))
- if 1: #If HUD area isn't different
- pygame.display.update(playAreaSurfaceObj.get_rect(center=center_window))
- else:
- pygame.display.update()
- fpsClock.tick(fps)
- def NoControl(self):
- for event in pygame.event.get():
- if (event.type == QUIT):
- sys.exit()
- def standard(self):
- for event in pygame.event.get():
- if (event.type == QUIT):
- Quit()
- elif (event.type == KEYDOWN):
- if (event.key == K_UP):
- InputStateObj.up = 1
- elif (event.key == K_LEFT):
- InputStateObj.left = 1
- elif (event.key == K_RIGHT):
- InputStateObj.right = 1
- elif (event.key == K_DOWN):
- InputStateObj.down = 1
- elif (event.key == K_LSHIFT):
- InputStateObj.b = 1
- elif (event.type == KEYUP):
- if (event.key == K_UP):
- InputStateObj.up = 0
- elif (event.key == K_LEFT):
- InputStateObj.left = 0
- elif (event.key == K_RIGHT):
- InputStateObj.right = 0
- elif (event.key == K_DOWN):
- InputStateObj.down = 0
- elif (event.key == K_LSHIFT):
- InputStateObj.b = 0
- def GetAngleToPlayer(spot):
- return AngleBetween(Player.pos, spot)
- list_of_bullets_to_rotate = ['rice_bullet', 'card_bullet']
- window_dim = (640, 480)#(1024,768)
- play_area_dim = (384, 448)#(630,736)
- fps = 60
- marigin_percent = 6
- center_window = (window_dim[0]/2,window_dim[1]/2)
- 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)
- center_field = (int(play_area_dim[0]/2),int(play_area_dim[1]/2))
- boss_default_pos = (center_field[0], center_field[1]-(play_area_dim[1]/4))
- player_default_pos = (center_field[0], center_field[1]+int((play_area_dim[1]/100.0)*35))
- access_meter_offset = (int(play_area_offset[0]-((window_dim[0]/100)*marigin_percent)), play_area_offset[1])
- score_meter_x_offset = int((2*play_area_offset[0])+((window_dim[0]/100)*marigin_percent))
- starting_lives = 4
- new_bomb_stock = 3
- pygame.init()
- fpsClock = pygame.time.Clock()
- windowSurfaceObj = pygame.display.set_mode(window_dim)
- playAreaSurfaceObj = pygame.Surface(play_area_dim)
- imageSurfacesObj = imageSurfaces()
- bulletSurfacesObj = BulletSurfaces()
- BulletControlObj = BulletController()
- BulletLayerSurfaceObj = pygame.Surface(play_area_dim)
- BulletLayerSurfaceObj.convert_alpha()
- EnemyControlObj = EnemyController()
- EnemyLayerSurfaceObj = pygame.Surface(play_area_dim)
- EnemyLayerSurfaceObj.convert_alpha()
- windowSurfaceObj.fill(pygame.Color('grey'))
- MainLoop = GameLoop()
- fpsCounterObj = fpsCounter()
- InputStateObj = InputState()
- Player = PlayerObject()
- SpawnEnemy = EnemyControlObj.create_enemy # pos , species, color, angle, angvel, velocity, velmod, behavior, id
- CreateBullet = BulletControlObj.create_bullet # pos , species, color, angle, angvel, velocity, velmod, behavior, id
- pygame.display.update()
- musicpath = os.path.join('music','Strange Oriental Discourse.ogg')
- if os.path.exists(musicpath):
- pygame.mixer.music.load(musicpath)
- #pygame.mixer.music.play()
- soundpath = os.path.join('sound','playerdie.ogg')
- if os.path.exists(soundpath):
- PlayerDieSFX = pygame.mixer.Sound(soundpath)
- #=SCRIPT=#
- if len(sys.argv) > 1:
- try:
- with open(sys.argv[1]) as f:
- exec(f.read())
- except Exception as e:
- print (e)
- else:
- print ('No script given.')
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement