class Game(Menu): # Need draw_text() def __init__(self, start=1): if start: pygame.init() environ['SDL_VIDEO_CENTERED'] = '1' self.scr_size = (800, 600) self.screen = pygame.display.set_mode(self.scr_size) pygame.display.set_caption('Chain Pain - By Jach') while 1: cont = self.load_menu() if cont == 'play': self.load_crap() self.play() break elif cont == 'time': self.high_time() elif cont == 'man': self.instructions() else: exit() def load_menu(self): m = Menu(self.screen) return m.load() def high_time(self): # Display highest time self.screen.fill( (0,0,0) ) # Kill menu best_time = BestTime(self.screen) def instructions(self): self.screen.fill( (0,0,0) ) # Kill menu manual = Man(self.screen) def play(self): self.screen.fill( (0,0,0) ) self.clock = pygame.time.Clock() self.time_passed = 0 self.manlinesses = 2 # Lives self.masters_allowed = 0 # To update self.time_since_whip = 0 self.master_chosen = 0 while 1: self.secs = self.clock.tick(FPS) / 1000.0 self.time_passed += self.secs self.events() self.update_crap() # Updates, no more no less self.draw_crap() # Erases too self.collision_crap() def load_crap(self): # Loads all images, makes objects if applicable, adds any images and # rects to all_sprites{} # Now also loads all sounds at the very top! self.sounds = {'gasp' : self.load_sound('gasp.ogg'),\ 'ugh' : self.load_sound('ugh.ogg'),\ 'ow' : self.load_sound('ow.ogg'),\ 'ahh' : self.load_sound('ahh.ogg'),\ 'cry' : self.load_sound('cry.ogg'),\ 'whip' : self.load_sound('whip.ogg'),\ 'music' : self.load_sound('music1.ogg'),\ 'haha' : self.load_sound('haha.ogg')} self.sounds['music'].play(-1) self.all_sprites = {} self.bg_img = pygame.image.load(\ path.join('data','background.png')).convert_alpha() playerimg=pygame.image.load(path.join('data', 'player.png')).convert_alpha() player_pos = [370,384] # Does not move? self.all_sprites['player'] = [playerimg,player_pos] self.master1 = Master('left', self.screen) self.master2 = Master('right', self.screen) self.all_sprites['master1'] = [self.master1.image, self.master1.rect] self.all_sprites['master2'] = [self.master2.image, self.master2.rect] big_bar = pygame.image.load(path.join('data','big_bar.png')).convert_alpha() big_bar_pos = (400-250, 500) # 500 bottom? 10 top? Edit background for bot self.all_sprites['big_bar'] = [big_bar, big_bar_pos] self.bar = Bar(self.sounds) # Moving bar self.all_sprites['moving_bar'] = [self.bar.image, self.bar.rect] self.timer = Timer() #Clock so player knows how long they've gone self.all_sprites['timer'] = [self.timer.image, self.timer.rect] manliness = pygame.image.load(\ path.join('data','manliness.png')).convert_alpha() manliness1pos = (65, 1) manliness2pos = (100, 1) self.all_sprites['man1'] = [manliness, manliness1pos] self.all_sprites['man2'] = [manliness, manliness2pos] self.blood = Blood(self.screen, player_pos) self.all_sprites['blood'] = [self.blood.image, self.blood.rect] def draw_crap(self): # Erase everything first (yeah yeah optimization later) self.screen.blit(self.bg_img, (0,0) ) for key in sorted(self.all_sprites): self.screen.blit(self.all_sprites[key][0], self.all_sprites[key][1]) # Note: if I need something to blit on top of something else, give # it a z first letter or something. self.master1.chain.redraw_chain() self.master2.chain.redraw_chain() pygame.display.update() def update_crap(self): self.bar.update(self.secs) # Update bar self.all_sprites['moving_bar'][1] = self.bar.rect # Update rect self.timer.update(self.time_passed) # Update clock self.all_sprites['timer'][0] = self.timer.image # update image if not self.masters_allowed and randint(1, 70) == 1: self.masters_allowed = 1 if self.masters_allowed and randint(1,5) == 1: # Rand used to slow down # Masters can update if not self.master_chosen: self.master_chosen = randint(1, 3) if self.master_chosen == 1: self.master1.update() self.all_sprites['master1'][0] = self.master1.image if self.master_chosen == 2: self.master2.update() self.all_sprites['master2'][0] = self.master2.image if self.master_chosen == 3: self.master1.update() self.master2.update() self.all_sprites['master1'][0] = self.master1.image self.all_sprites['master2'][0] = self.master2.image self.clock.tick(FPS) if self.master1.state == 0 and self.master2.state == 0: # Done animating self.masters_allowed = 0 self.master_chosen = 0 self.blood.image = self.blood.blank_image self.all_sprites['blood'][0] = self.blood.image else: # masters can't update, still need to draw chain pass def events(self): for event in pygame.event.get(): if event.type == QUIT: exit() if event.type == KEYDOWN: if event.key == K_ESCAPE: exit() if event.key == K_LEFT: self.bar.push = -1 if event.key == K_RIGHT: self.bar.push = 1 def collision_crap(self): if self.bar.rect.x < 0: # Class bounds it self.manlinesses -= 1 self.sounds['haha'].play() if self.manlinesses == 0: self.gameover() else: self.all_sprites.pop('man2') self.bar = Bar(self.sounds) # Moving bar self.all_sprites['moving_bar'] = [self.bar.image, self.bar.rect] self.bar.v_change = -20 self.all_sprites['player'][0] = pygame.image.load(\ path.join('data','deadplayer.png')).convert_alpha() # Whip on player? if self.master1.state == 3: # Final chain self.bar.v_change = 200 self.sounds['whip'].play() self.bar.play_sound() self.time_since_whip = self.time_passed if self.master2.state == 3: self.bar.v_change = 200 self.sounds['whip'].play() self.bar.play_sound() if self.master1.state == 3 and self.master2.state == 3: self.bar.v_change = 400 if (self.master1.state == 0 or self.master2.state == 0) and \ self.time_passed - self.time_since_whip >= 0.5: self.bar.v_change = 0 if self.master1.state == 2 or self.master2.state == 2: self.blood.render_blood() self.all_sprites['blood'][0] = self.blood.image def load_sound(self, sound): file = pygame.mixer.Sound(path.join('data',sound)) return file def gameover(self): for e in self.sounds.itervalues(): e.stop() self.sounds['cry'].play() self.all_sprites['player'][0] = pygame.image.load(\ path.join('data','superdeadplayer.png')).convert_alpha() self.draw_crap() pygame.display.update() pygame.time.wait(700) # wait half a sec so they can see their death self.screen.fill( (0,0,0) ) # Grab time mins = '%02d' % (self.time_passed / 60) secs = '%02d' % (self.time_passed % 60) font = pygame.font.Font(path.join('data','cour.ttf'), 50) font2 = pygame.font.Font(path.join('data','digib.ttf'), 70) font.set_underline(1) self.draw_text('Final Time', font, (5,0), (255,255,255) ) font.set_underline(0) self.draw_text(mins + ':' + secs, font2, (5, 100), (255,255,255) ) # Check if it was a high score f = open(path.join('data', 'best_time.txt'), 'r') line = f.next().replace('\n', '').split(' ')[1].split(':') beaten = 0 if int(line[0]) * 60 + int(line[1]) < int(self.time_passed): self.draw_text('Congrats!', font,\ (5, 200), (255,255,255)) self.draw_text('You beat the best time!', font, (5,300), (255,255,255)) self.draw_text('Enter your initials:', font, (5,400), (255,255,255)) f.close() beaten = 1 pygame.display.update() if not beaten: while 1: self.clock.tick(10) for event in pygame.event.get(): if event.type == QUIT: exit() if event.type == KEYDOWN: if event.key == K_ESCAPE or event.key == K_RETURN: self.screen.fill( (0,0,0) ) pygame.display.update() self.__init__(0) else: self.enter_initials(mins, secs, font) def enter_initials(self, mins, secs, font): font.set_underline(1) letters = 0 initials = '' pygame.event.clear() while 1: self.clock.tick(10) if letters > 2: break for event in pygame.event.get(): if event.type == QUIT: exit() if event.type == KEYDOWN and letters < 3: letters += 1 self.draw_text(event.unicode.upper(), font,\ (letters * 50, 500), (255,255,255)) initials += event.unicode.upper() f = open(path.join('data', 'best_time.txt'), 'w') f.write(initials + ' ' + mins + ':' + secs) f.close() self.screen.fill( (0,0,0) ) pygame.display.update() self.__init__(0)