class Player(pygame.sprite.Sprite): def __init__(self,posx,posy,imgindex): pygame.sprite.Sprite.__init__(self) global playerimagePath self.posx = posx self.posy = 600 - posy self.pos = vec(posx,posy) self.velocity = vec(8,0) self.gravity = vec(0,1) self.step = 8 self.spritesheet = SpriteSheet(playerimagePath) self.image = self.spritesheet.get_image(imgindex) self.image.set_colorkey((247,247,247)) self.rect = self.image.get_rect() self.rect.center = (posx,posy) self.move_f = False self.move_b = False self.move_u = False self.grounded = False def update(self,spritegroup,coin_sprites): pygame.sprite.spritecollide(self,coin_sprites,True) self.gravity.y = 1 hits = pygame.sprite.spritecollide(self,spritegroup,False) if hits and self.velocity.y>=0: self.pos.y = hits[0].rect.top + 1 self.velocity.y = 0 self.gravity.y = 0 if self.move_u: self.move_u = False else: self.gravity.y = 1 self.velocity.y += self.gravity.y self.pos.y += self.velocity.y + 0.5*self.gravity.y self.rect.midbottom = self.pos def move(self,dx,moveindex): if not self.move_u: if dx == 1: self.image = self.spritesheet.get_image(moveindex) self.pos.x += dx*self.velocity.x else: self.image = self.spritesheet.get_image(moveindex) self.image = pygame.transform.flip(self.image,True,False) self.pos.x += dx*self.velocity.x else: self.pos.x += dx*self.velocity.x def player_jump(self): if self.move_u: self.velocity.y += self.gravity.y self.pos.y += self.velocity.y + 0.5 * self.gravity.y
def __init__(self, scene, x, y): super().__init__(scene, x, y) self.groups = scene.all_sprites, scene.items, scene.keys # Animation self.animation_index = 0 self.last_update = pygame.time.get_ticks() self.update_delay = KEY_IDLE_DELAY self.animation = [] sprite_sheet = SpriteSheet(KEY_SPRITESHEET) self.image = sprite_sheet.get_image(0, 0, 32, 32) # Append sprites to animation array for x in range(0, 65, 32): self.animation.append(sprite_sheet.get_image(x, 0, 32, 32))
def __init__(self, scene, x, y, orientation, moves): super().__init__(scene, x, y, orientation, moves) self.groups = scene.all_sprites, scene.enemies pygame.sprite.Sprite.__init__(self, self.groups) self.health = 2 sprite_sheet = SpriteSheet(GHOST_SPRITE_SHEET) self.image = sprite_sheet.get_image(0, 0, 32, 32) self.walking_up = [] self.walking_down = [] self.walking_left = [] self.walking_right = [] # Append sprites to walking arrays for x in range(0, 33, 32): self.walking_right.append(sprite_sheet.get_image(x, 0, 32, 32)) self.walking_left.append(sprite_sheet.get_image(x, 32, 32, 32)) self.walking_down.append(sprite_sheet.get_image(x, 64, 32, 32)) self.walking_up.append(sprite_sheet.get_image(x, 96, 32, 32)) self.damage_up = [] self.damage_down = [] self.damage_left = [] self.damage_right = [] # Append sprites to damage arrays for x in range(64, 128, 32): self.damage_right.append(sprite_sheet.get_image(x, 0, 32, 32)) self.damage_left.append(sprite_sheet.get_image(x, 32, 32, 32)) self.damage_down.append(sprite_sheet.get_image(x, 64, 32, 32)) self.damage_up.append(sprite_sheet.get_image(x, 96, 32, 32))
class Inventory(GameObject): def __init__(self, scene, x, y): super().__init__(scene, x, y) self.groups = scene.all_sprites, scene.hud pygame.sprite.Sprite.__init__(self, self.groups) self.sprite_sheet = SpriteSheet(INVENTORY_SPRITESHEET) self.image = self.sprite_sheet.get_image(0, 0, 32, 32) self.item_list = [] def update(self): if len(self.item_list) > 0: if type(self.item_list[0]) == Key: self.image = self.sprite_sheet.get_image(0, 32, 32, 32) else: self.image = self.sprite_sheet.get_image(0, 0, 32, 32) self.rect.x = self.x * TILESIZE self.rect.y = self.y * TILESIZE
def draw_mc_hp(surface, destination, x, y, perc_hp): # draw hearts in mc fov, updates in quarter incriments if perc_hp < 0: perc_hp = 0 sprite_sheet = SpriteSheet(mc_hud_gfx) full_image = sprite_sheet.get_image(63, 0, 16, 16) three_quarters_image = sprite_sheet.get_image(79, 0, 16, 16) half_image = sprite_sheet.get_image(95, 0, 16, 16) quarter_image = sprite_sheet.get_image(111, 0, 16, 16) empty_image = sprite_sheet.get_image(127, 0, 16, 16) if perc_hp == 1.0: image = full_image elif perc_hp > .75: image = three_quarters_image elif perc_hp > .50: image = half_image elif perc_hp > .25: image = quarter_image else: image = empty_image surface.blit(image, [x, y])
def draw_mc_level(surface, destination, x, y, level): # draws numbers represeting the level, currently capped at 9 # displays a 0 for anything above 9 sprite_sheet = SpriteSheet(mc_hud_gfx) images = [ sprite_sheet.get_image(80, 224, 16, 16), sprite_sheet.get_image(96, 224, 16, 16), sprite_sheet.get_image(112, 224, 16, 16), sprite_sheet.get_image(128, 224, 16, 16), sprite_sheet.get_image(80, 240, 16, 16), sprite_sheet.get_image(96, 240, 16, 16), sprite_sheet.get_image(112, 240, 16, 16), sprite_sheet.get_image(128, 240, 16, 16), sprite_sheet.get_image(80, 256, 16, 16), sprite_sheet.get_image(96, 256, 16, 16), ] if level <= 9: image = images[level - 1] else: image = images[:-1] surface.blit(image, [x, y])
def __init__(self, scene, x, y, orientation, moves): super().__init__(scene, x, y) self.groups = scene.all_sprites, scene.enemies pygame.sprite.Sprite.__init__(self, self.groups) self.orientation = orientation self.moves = moves self.interactable = False self.collidable = False self.move_counter = 0 self.move_counter_increment = 1 self.reverse = False self.health = 1 self.hit = False self.hit_detected = False self.attacking = False self.attack_detected = False if len(moves) > 0: self.direction = None # Animation self.animation_index = 0 self.update_delay = ENEMY_SPEED self.attack_delay = ENEMY_ATTACK_DELAY self.last_update = pygame.time.get_ticks() self.last_idle_update = pygame.time.get_ticks() self.hit_delay = HIT_DELAY sprite_sheet = SpriteSheet(BAT_SPRITE_SHEET) self.image = sprite_sheet.get_image(0, 0, 32, 32) self.walking_up = [] self.walking_down = [] self.walking_left = [] self.walking_right = [] # Append sprites to walking arrays for x in range(0, 33, 32): self.walking_right.append(sprite_sheet.get_image(x, 0, 32, 32)) self.walking_left.append(sprite_sheet.get_image(x, 32, 32, 32)) self.walking_down.append(sprite_sheet.get_image(x, 64, 32, 32)) self.walking_up.append(sprite_sheet.get_image(x, 96, 32, 32)) self.damage_up = [] self.damage_down = [] self.damage_left = [] self.damage_right = [] # Append sprites to damage arrays for x in range(64, 128, 32): self.damage_right.append(sprite_sheet.get_image(x, 0, 32, 32)) self.damage_left.append(sprite_sheet.get_image(x, 32, 32, 32)) self.damage_down.append(sprite_sheet.get_image(x, 64, 32, 32)) self.damage_up.append(sprite_sheet.get_image(x, 96, 32, 32))
self.last_shot = now bullet = BulletEnemy(self.rect.centerx, self.rect.bottom, player.x, player.y) sprites.add(bullet) bulletsEnemy.add(bullet) def new_enemy(): enemy = Enemy() sprites.add(enemy) enemies.add(enemy) ss = SpriteSheet('Lightning.png') player_imgs = [] player_imgs.append(ss.get_image(0, 0, 30, 30)) player_imgs.append(ss.get_image(32, 0, 30, 30)) player_imgs.append(ss.get_image(64, 0, 30, 30)) player_imgs.append(ss.get_image(96, 0, 30, 30)) ss1 = SpriteSheet('UFO.png') enemy_imgs = [] enemy_imgs.append(ss1.get_image(0, 0, 30, 30)) enemy_imgs.append(ss1.get_image(32, 0, 30, 30)) enemy_imgs.append(ss1.get_image(64, 0, 30, 30)) enemy_imgs.append(ss1.get_image(96, 0, 30, 30)) player = Player() for i in range(4): new_enemy() PlayerSprite.add(player)
self.speedx = random.randrange(-3, 3) def update(self): """should spawn right in front of the player""" self.rect.y += self.speedy self.rect.x += self.speedx if self.rect.bottom < 0: self.kill() class Missile(pygame.sprite.Sprite): def __init__(self, x, y): pygame.sprite.Sprite.__init__(self) self.image = missile_img self.image.set_colorkey(Commons.BLACK) self.rect = self.image.get_rect() self.rect.bottom = y self.rect.centerx = x self.speedy = -5 def update(self): """should spawn right in front of the player""" self.rect.y += self.speedy if self.rect.bottom < 0: self.kill() ss = SpriteSheet('Bullet_Collection.png') bullet_img = ss.get_image(398, 255, 20, 20) bullet_enemy_img = ss.get_image(320, 268, 18, 18)
from sprites import SpriteSheet from sprites import power_ups class Pow(pygame.sprite.Sprite): def __init__(self, center): pygame.sprite.Sprite.__init__(self) self.type = random.choice(['upgrade', 'extra_live']) self.image = powerup_imgs[self.type] self.image.set_colorkey(Commons.BLACK) self.image = pygame.transform.scale(self.image, (30, 30)) self.rect = self.image.get_rect() self.rect.center = center self.speedy = 1 def update(self): """should spawn right in front of the player""" self.rect.y += self.speedy ## kill the sprite after it moves over the top border if self.rect.top > Commons.HEIGHT: self.kill() ss = SpriteSheet('Power_Ups.png') extra_live = ss.get_image(525, 30, 130, 130) upgrade = ss.get_image(792, 33, 120, 120) powerup_imgs = {} powerup_imgs['upgrade'] = upgrade powerup_imgs['extra_live'] = extra_live
def draw_hud_bg(surface, destination, x, y): # draw the bg image for the rest of the hud sprite_sheet = SpriteSheet(mc_hud_gfx) image = sprite_sheet.get_image(0, 226, 16, 16) surface.blit(image, [x, y]) image = sprite_sheet.get_image(0, 242, 16, 16) surface.blit(image, [x, y + 32]) image = sprite_sheet.get_image(0, 258, 16, 16) surface.blit(image, [x, y + 64]) image = sprite_sheet.get_image(0, 274, 16, 16) surface.blit(image, [x, y + 96]) image = sprite_sheet.get_image(16, 226, 16, 16) surface.blit(image, [x + 32, y]) image = sprite_sheet.get_image(16, 242, 16, 16) surface.blit(image, [x + 32, y + 32]) image = sprite_sheet.get_image(16, 258, 16, 16) surface.blit(image, [x + 32, y + 64]) image = sprite_sheet.get_image(16, 274, 16, 16) surface.blit(image, [x + 32, y + 96]) image = sprite_sheet.get_image(32, 258, 16, 16) surface.blit(image, [x + 64, y + 64]) image = sprite_sheet.get_image(48, 258, 16, 16) surface.blit(image, [x + 96, y + 64]) image = sprite_sheet.get_image(64, 258, 16, 16) surface.blit(image, [x + 128, y + 64])
def draw_iframes(surface, destination, x, y, who): # draw invincibility buff when invincible sprite_sheet = SpriteSheet(mc_hud_gfx) image = sprite_sheet.get_image(229, 54, 5, 5) if who.invincible == True: surface.blit(image, [x, y])