def __init__(self, sprite, columns, rows, image, projectile_animation=[]): self.sprite = sprite self.columns = columns self.rows = rows self.draw_projectile = True self.image = image self.frame = sprite_sheet.SpriteSheet(sprite, columns, rows) self.projectile_animation = projectile_animation self.count = -1
class Mob(Abstract): def __init__(self, walk_left, walk_right, (x, y), image, columns, rows, end, hitbox): Abstract.__init__(self, walk_left, walk_right, (x, y), image, columns, rows) self.end = end self.hitbox = hitbox self.frame = sprite_sheet.SpriteSheet(image, columns, rows, True) self.path = [x, self.end] self.walk_count = 0 self.velocity = 3 self.health = 10 self.X = x self.Y = y
class Player(Abstract): def __init__(self, walk_left, walk_right, idle, (x, y), width, force, velocity, image, columns, rows, hitbox, scale2x): Abstract.__init__(self, walk_left, walk_right, (x, y), image, columns, rows) self.width = width self.idle = idle self.force = force self.velocity = velocity self.left = False self.right = False self.walk_count = 0 self.is_jumping = False self.jump_count = 10 self.hitbox = hitbox self.frame = sprite_sheet.SpriteSheet(image, columns, rows, scale2x) self.health = 10 self.X = self.x self.Y = self.y
def load_sprites(self, sprite_file): # load character animation frames self.character_sheet = \ sprite_sheet.SpriteSheet(sprite_file) self.move_right_frames = self.character_sheet.load_strip( pygame.Rect((0, 0), self.size), 8, -1) self.frame_count = len(self.move_right_frames) self.move_left_frames = [ pygame.transform.flip(sprite, True, False) for sprite in self.move_right_frames ] self.standing_left_frame = self.move_left_frames[self.STANDING_FRAME] self.standing_right_frame = self.move_right_frames[self.STANDING_FRAME] self.move_vertical_left_frames = [self.standing_left_frame]\ * self.frame_count self.move_vertical_right_frames = [self.standing_right_frame]\ * self.frame_count
def start(self): pygame.mixer.pre_init(44100, -16, 2, 2048) pygame.mixer.init() pygame.init() pygame.font.init() myfont = pygame.font.SysFont('Comic Sans MS', 30) character_selection_text = myfont.render('Choose your character:', True, (0, 0, 0)) projectile_selection_text = myfont.render('Choose your projectile:', True, (0, 0, 0)) SCREEN_WIDTH = 350 SCREEN_HEIGHT = 420 bg = pygame.image.load('images/background/background_submenu.jpg') saitama = pygame.Rect(102, 140, 66, 96) goku = pygame.Rect(180, 150, 62, 69) arrow = pygame.Rect(50, 365, 117, 20) fire_ball = pygame.Rect(192, 363, 54, 20) saitama_image = ss.SpriteSheet('images/sprites/Saitama.png', 3, 4) goku_image = ss.SpriteSheet('images/sprites/Goku.png', 18, 6) arrow_image = ss.SpriteSheet('images/sprites/arrow.png', 3, 1) fire_image = ss.SpriteSheet('images/sprites/fire_ball.png', 8, 8) pygame.display.set_caption('Character selection') screen = pygame.display.set_mode((SCREEN_WIDTH, SCREEN_HEIGHT)) run = True while run: for event in pygame.event.get(): if event.type == pygame.QUIT: exit() mpos = pygame.mouse.get_pos() screen.blit(bg, (0, 0)) screen.blit(character_selection_text, (40, 75)) saitama_image.draw(screen, 1, (80, 130)) if pygame.mouse.get_pressed()[0] and saitama.collidepoint( pygame.mouse.get_pos()): self.character_index = 0 goku_image.draw(screen, 27, (160, 130)) if pygame.mouse.get_pressed()[0] and goku.collidepoint( pygame.mouse.get_pos()): self.character_index = 1 screen.blit(projectile_selection_text, (40, 270)) arrow_image.draw(screen, 1, (50, 360)) if pygame.mouse.get_pressed()[0] and arrow.collidepoint( pygame.mouse.get_pos()): self.projectile_index = 0 fire_image.draw(screen, 1, (190, 343)) if pygame.mouse.get_pressed()[0] and fire_ball.collidepoint( pygame.mouse.get_pos()): self.projectile_index = 1 if self.character_index == 0: pygame.draw.rect(screen, (0, 0, 0), saitama, 2) elif self.character_index == 1: pygame.draw.rect(screen, (0, 0, 0), goku, 2) if self.projectile_index == 0: pygame.draw.rect(screen, (0, 0, 0), arrow, 2) elif self.projectile_index == 1: pygame.draw.rect(screen, (0, 0, 0), fire_ball, 2) pygame.display.update() if self.projectile_index != -1 and self.character_index != -1: run = False
def __init__(self, world, name, sprite_file, size, run_speed=2): self.world = world # link back to the world game state self.name = name # for debugging only, right now # load character animation frames self.character_sheet = \ sprite_sheet.SpriteSheet('assets/' + sprite_file) self.run_right_frames = self.character_sheet.load_strip( pygame.Rect(0, 0, size[X], size[Y]), 8, -1) # self.run_right_frames = self.character_sheet.load_block_of_8(0, 0, -1) self.run_left_frames = [ pygame.transform.flip(sprite, True, False) for sprite in self.run_right_frames ] self.jump_right_frames = self.character_sheet.load_block_of_8( 0, 152, -1) self.jump_left_frames = [ pygame.transform.flip(sprite, True, False) for sprite in self.jump_right_frames ] self.die_right_frames = self.character_sheet.load_block_of_8( 144, 0, -1) self.die_left_frames = [ pygame.transform.flip(sprite, True, False) for sprite in self.die_right_frames ] self.moving = False self.flying = False self.take_off = False self.state = STANDING self.facing_right = True self.momentum = [0.0, 0.0] # location is the rectangle used to draw the sprite # position is a float version of the x,y pixel coords # used to provide smooth movement self.position = [0.0, 0.0] self.location = pygame.Rect(0, 0, size[X], size[Y]) # TODO different collider heights for different characters self.collider = pygame.Rect(0, 0, size[X], size[Y]) self.ground_proximity = \ pygame.Rect(0, 0, size[X], size[Y]) self.frame_number = 0 self.frame_count = len(self.run_right_frames) self.jumping = False self.run_speed = run_speed self.speaking = False self.speech = None self.speech_bubble_fg = (0, 0, 0) self.speech_bubble_bg = (0, 0, 0) self.speech_bubble_size = [0, 0] self.text = [] self.text_size = [0, 0] self.jets = [] # the particle streams that appear when flying # create 2 jets, 1 for each leg # the origin coordinates are just zero, # since they will be set each frame for j in range(2): self.jets.append( Jet( self.world, # link back to the game world (0, 0), # dummy start position (0, 1), # initial velocity vector )) self.wobble = [] # random drift when hovering rx = 4 ry = 2 for i in range(32): x = i / 2 - 8 #rx * math.cos(i*2*math.pi/32) y = ry * math.sin(i * 2 * math.pi / 32) - ry - 2 self.wobble.append((x, y)) for i in range(31, -1, -1): x = i / 2 - 8 #rx * math.cos(i*2*math.pi/32) y = -ry * math.sin(i * 2 * math.pi / 32) - ry - 2 self.wobble.append((0, 0)) #self.wobble.append((x, y)) self.wobble_counter = 0 self.take_off_animation = [] # take off animation sequence for i in range(32): self.take_off_animation.append((0, 0))
def __init__(self): pg.init() self._running = True self.clock = pg.time.Clock() self.width, self.height = WINDOW_WIDTH, WINDOW_HEIGHT self.size = (self.width, self.height) self._display_surf = pg.display.set_mode(self.size) self.spriter = sprite_sheet.SpriteSheet( os.path.join("resources", "sprites-edited.png")) try: with open(os.path.join("resources", "highscore"), 'r') as f: self.highscore = int(f.readline()) except: self.highscore = 0 self.background = pg.Surface(BACKGROUND_SPRITE_SIZE) self.background.blit( self.spriter.image_at( pg.Rect(BACKGROUND_SPRITE_LOCATION, BACKGROUND_SPRITE_SIZE)), (0, 0)) self.background = pg.transform.scale(self.background, (WINDOW_WIDTH, WINDOW_HEIGHT)) foreground = pg.transform.scale( self.spriter.image_at( pg.Rect(FOREGROUND_SPRITE_LOCATION, FOREGROUND_SPRITE_SIZE)), FOREGROUND_FINAL_SIZE) doubledForeground = pg.Surface( (2 * WINDOW_WIDTH, int(WINDOW_HEIGHT / 4))) doubledForeground.blit(foreground, (0, 0)) doubledForeground.blit(foreground, (WINDOW_WIDTH, 0)) self.foreground_group = pg.sprite.Group( Foreground(doubledForeground, (2 * WINDOW_WIDTH, int(WINDOW_HEIGHT / 4)))) bird_rects_initial = [ pg.Rect(BIRD_SPRITE_LOCATION_1, BIRD_SPRITE_SIZE), pg.Rect(BIRD_SPRITE_LOCATION_2, BIRD_SPRITE_SIZE), pg.Rect(BIRD_SPRITE_LOCATION_3, BIRD_SPRITE_SIZE) ] bird_images = [ pg.transform.scale(image, BIRD_FULL_SIZE) for image in self.spriter.images_at(bird_rects_initial, colorkey=-1) ] self.bird = Bird(bird_images, self) self.bird_group = pg.sprite.Group(self.bird) self.pipe_group = pg.sprite.Group() self.up_pipe_image = pg.transform.scale( self.spriter.image_at(pg.Rect(83, 324, 28, 160), -1), PIPE_SIZE) self.down_pipe_image = pg.transform.scale( self.spriter.image_at(pg.Rect(55, 324, 28, 160), -1), PIPE_SIZE) self.score_images = [] self.score_images.append( pg.transform.scale( self.spriter.image_at( pg.Rect(494, 60, NUMBER_SPRITE_WIDTH, NUMBER_SPRITE_HEIGHT), -1), NUMBER_FINAL_SIZE)) self.score_images.append( pg.transform.scale( self.spriter.image_at(pg.Rect(135, 455, 9, 18), -1), (30, 60))) self.score_images.append( pg.transform.scale( self.spriter.image_at( pg.Rect(290, 160, NUMBER_SPRITE_WIDTH, NUMBER_SPRITE_HEIGHT), -1), NUMBER_FINAL_SIZE)) self.score_images.append( pg.transform.scale( self.spriter.image_at( pg.Rect(304, 160, NUMBER_SPRITE_WIDTH, NUMBER_SPRITE_HEIGHT), -1), NUMBER_FINAL_SIZE)) self.score_images.append( pg.transform.scale( self.spriter.image_at( pg.Rect(318, 160, NUMBER_SPRITE_WIDTH, NUMBER_SPRITE_HEIGHT), -1), NUMBER_FINAL_SIZE)) self.score_images.append( pg.transform.scale( self.spriter.image_at( pg.Rect(332, 160, NUMBER_SPRITE_WIDTH, NUMBER_SPRITE_HEIGHT), -1), NUMBER_FINAL_SIZE)) self.score_images.append( pg.transform.scale( self.spriter.image_at( pg.Rect(290, 184, NUMBER_SPRITE_WIDTH, NUMBER_SPRITE_HEIGHT), -1), NUMBER_FINAL_SIZE)) self.score_images.append( pg.transform.scale( self.spriter.image_at( pg.Rect(304, 184, NUMBER_SPRITE_WIDTH, NUMBER_SPRITE_HEIGHT), -1), NUMBER_FINAL_SIZE)) self.score_images.append( pg.transform.scale( self.spriter.image_at( pg.Rect(318, 184, NUMBER_SPRITE_WIDTH, NUMBER_SPRITE_HEIGHT), -1), NUMBER_FINAL_SIZE)) self.score_images.append( pg.transform.scale( self.spriter.image_at( pg.Rect(332, 184, NUMBER_SPRITE_WIDTH, NUMBER_SPRITE_HEIGHT), -1), NUMBER_FINAL_SIZE)) self.score_images_small = [] for number in self.score_images: self.score_images_small.append( pg.transform.scale(number, NUMBER_FINAL_SIZE_SMALL)) self.gameover_text = pg.transform.scale( self.spriter.image_at(pg.Rect(395, 58, 96, 30), -1), GAMEOVER_TEXT_SIZE) self.final_score_area = pg.transform.chop( pg.transform.scale( self.spriter.image_at(pg.Rect(2, 258, 114, 60), -1), (228, 120)), pg.Rect(24, 0, 138, 0)) self.new_sprite = pg.transform.scale( self.spriter.image_at(pg.Rect(110, 500, 18, 12), -1), (30, 19)) self.get_ready = pg.transform.scale( self.spriter.image_at(pg.Rect(292, 58, 96, 30), -1), GAMEOVER_TEXT_SIZE) self.restart()