Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import os, pygame, random
- from pygame.locals import *
- # game constants
- SCORE = 0
- MAX_STARS = 45
- screen_height = 640
- screen_width = 700
- SCREENRECT = Rect(0, 0, screen_height, screen_width)
- main_dir = os.path.split(os.path.abspath(__file__))[0]
- random.seed()
- def imgcolorkey(image, colorkey):
- if colorkey is not None:
- if colorkey is -1:
- colorkey = image.get_at((0, 0))
- image.set_colorkey(colorkey, RLEACCEL)
- return image
- def load_image(filename, colorkey = None):
- filename = os.path.join('images', filename)
- image = pygame.image.load(filename).convert()
- return imgcolorkey(image, colorkey)
- class dummysound:
- def play(self): pass
- def load_sound(file):
- if not pygame.mixer: return dummysound()
- file = os.path.join(main_dir, 'data', file)
- try:
- sound = pygame.mixer.Sound(file)
- return sound
- except pygame.error:
- print ('Warning, unable to load, %s' % file)
- return dummysound()
- class SpriteSheet:
- def __init__(self, filename):
- self.sheet = load_image(filename)
- def imgat(self, rect, colorkey = None):
- rect = Rect(rect)
- image = pygame.Surface(rect.size).convert()
- image.blit(self.sheet, (0, 0), rect)
- return imgcolorkey(image, colorkey)
- def imgsat(self, rects, colorkey = None):
- imgs = []
- for rect in rects:
- imgs.append(self.imgat(rect, colorkey))
- return imgs
- # each type of game object gets an init and an
- # update function. the update function is called
- # once per frame, and it is when each object should
- # change its current position and state
- class PlayerShip(pygame.sprite.Sprite):
- guns = [(65, 15)] #Co-ordinates of where the guns are. Used gimp to find co-ordinates
- reloadtime = 10 #How fast the bullets fly
- def __init__(self):
- pygame.sprite.Sprite.__init__(self, self.containers)
- self.rect = self.image.get_rect()
- self.justfired = 0
- self.reloadtimer = 0
- def update(self):
- self.rect.center = pygame.mouse.get_pos()
- self.rect = self.rect.clamp(SCREENRECT)
- if self.reloadtimer > 0:
- self.reloadtimer = self.reloadtimer -1
- firing = pygame.mouse.get_pressed()[0]
- if firing and (not self.justfired or self.reloadtimer == 0):
- self.reloadtimer = self.reloadtime
- for gun in self.guns:
- Shot((self.rect.left + gun[0], self.rect.top + gun[1]))
- self.justfired = firing
- class AlienDrone(pygame.sprite.Sprite):
- # Keep a master copy of the spikeyfish images so that they only need to
- # be loaded once pygame.image.load(os.path.join("images","aliendrone.png")).convert()
- # pygame.rect.Rect((screen_width, (random.randrange(0,screen_height))), self.image.get_size())
- def __init__(self):
- pygame.sprite.Sprite.__init__(self, self.containers)
- self.image = pygame.image.load(os.path.join("images","aliendrone.png")).convert()
- self.rect = pygame.rect.Rect((screen_width, (random.randrange(0,screen_height))), self.image.get_size())
- self.dx = -10
- def update(self):
- self.rect.centerx += self.dx
- if self.rect.right < 0:
- self.kill()
- class Explosion(pygame.sprite.Sprite):
- defaultlife = 12
- animcycle = 3
- images = []
- def __init__(self, actor):
- pygame.sprite.Sprite.__init__(self, self.containers)
- self.image = self.images[0]
- self.rect = self.image.get_rect(center=actor.rect.center)
- self.life = self.defaultlife
- def update(self):
- self.life = self.life - 1
- self.image = self.images[self.life/self.animcycle%2]
- if self.life <= 0: self.kill()
- class Shot(pygame.sprite.Sprite):
- speed = 20
- def __init__(self, pos):
- pygame.sprite.Sprite.__init__(self, self.containers)
- self.rect = self.image.get_rect()
- self.rect.center = pos
- def update(self):
- self.rect.move_ip(self.speed, 0 )
- if self.rect.x > screen_width:
- self.kill()
- class Score(pygame.sprite.Sprite):
- def __init__(self):
- pygame.sprite.Sprite.__init__(self)
- self.font = pygame.font.Font(None, 20)
- self.font.set_italic(1)
- self.color = Color('white')
- self.lastscore = -1
- self.update()
- self.rect = self.image.get_rect().move(470, 450)
- def update(self):
- if SCORE != self.lastscore:
- self.lastscore = SCORE
- msg = "Total Score: %d" % SCORE
- self.image = self.font.render(msg, 0, self.color)
- stars = []
- aliens = []
- for i in range(MAX_STARS):
- star = [random.randrange(0,screen_height-1), random.randrange(0,screen_width-1), random.randrange(1,16)]
- stars.append(star)
- def main():
- pygame.init()
- if pygame.mixer and not pygame.mixer.get_init():
- print ('Warning, no sound')
- pygame.mixer = None
- # set the display mode
- winstyle = 0
- bestdepth = pygame.display.mode_ok(SCREENRECT.size, winstyle, 32)
- screen = pygame.display.set_mode(SCREENRECT.size, winstyle, bestdepth)
- pygame.mouse.set_visible(False)
- # load images, assign to sprite classes
- # (do this before the classes are used, after screen setup)
- spritesheet = SpriteSheet('tyrian.shp.000000.png')
- Shot.image = spritesheet.imgat((0, 0, 13, 13), -1)
- PlayerShip.image = pygame.image.load(os.path.join("images","fighter.png")).convert()
- img = load_image('enemyexplosion.png')
- Explosion.images = [img, pygame.transform.flip(img, 1, 1)]
- # decorate the game window
- pygame.display.set_caption('Prototype Demo')
- # initialize game groups
- shots = pygame.sprite.Group()
- aliendrone = pygame.sprite.Group()
- all = pygame.sprite.RenderUpdates()
- #load the sound effects
- shoot_sound = load_sound('laser9.wav')
- if pygame.mixer:
- music = os.path.join(main_dir, 'data', 'choral1.wav')
- pygame.mixer.music.load(music)
- pygame.mixer.music.play(-1)
- # assign default groups to each sprite class
- PlayerShip.containers = all
- Shot.containers = shots, all
- AlienDrone.containers = aliendrone, all
- Explosion.containers = all
- #Create Some Starting Values
- global score
- clock = pygame.time.Clock()
- #initialize our starting sprites
- global SCORE
- if pygame.font:
- all.add(Score())
- clock = pygame.time.Clock()
- playerShip = PlayerShip()
- drone = AlienDrone()
- while 1:
- numberAlien = 5
- # get input
- for event in pygame.event.get():
- if event.type == QUIT or (event.type == KEYDOWN and event.key == K_ESCAPE):
- return
- if event.type == MOUSEBUTTONDOWN:
- shoot_sound.play()
- # update all the sprites
- all.update()
- # Detect collisions
- for alien in pygame.sprite.spritecollide(playerShip, aliendrone, 1):
- #boom_sound.play()
- #Explosion(aliendrone)
- #Explosion(playerShip)
- playerShip.kill()
- for alien in pygame.sprite.groupcollide(shots, aliendrone, 1, 1).keys():
- #boom_sound.play()
- #Explosion(aliendrone)
- SCORE = SCORE + 1
- #draw the scene
- screen.fill((0, 0, 0))
- all.draw(screen)
- for star in stars:
- star[0] -= star[2]
- if star[0] < 0:
- star[0] = screen_height
- screen.set_at((star[0], star[1]), (255,255,255))
- pygame.display.flip()
- aliendrone.add(AlienDrone())
- clock.tick(30)
- if pygame.mixer:
- pygame.mixer.music.fadeout(1000)
- pygame.time.wait(1000)
- pygame.quit()
- if __name__ == '__main__': main()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement