class Player(pygame.sprite.Sprite): def __init__(self): pygame.sprite.Sprite.__init__(self) self.image = Spritesheet('spritesheet.png').parse_sprite('chick.png') self.rect = self.image.get_rect() self.LEFT_KEY, self.RIGHT_KEY, self.FACING_LEFT = False, False, False self.is_jumping, self.on_ground = False, False self.gravity, self.friction = .35, -.12 self.position, self.velocity = pygame.math.Vector2( 0, 0), pygame.math.Vector2(0, 0) self.acceleration = pygame.math.Vector2(0, self.gravity) def draw(self, display): display.blit(self.image, (self.rect.x, self.rect.y)) def update(self, dt): self.horizontal_movement(dt) self.vertical_movement(dt) def horizontal_movement(self, dt): self.acceleration.x = 0 if self.LEFT_KEY: self.acceleration.x -= .3 elif self.RIGHT_KEY: self.acceleration.x += .3 self.acceleration.x += self.velocity.x * self.friction self.velocity.x += self.acceleration.x * dt self.limit_velocity(4) self.position.x += self.velocity.x * dt + (self.acceleration.x * .5) * (dt * dt) self.rect.x = self.position.x def vertical_movement(self, dt): self.velocity.y += self.acceleration.y * dt if self.velocity.y > 7: self.velocity.y = 7 self.position.y += self.velocity.y * dt + (self.acceleration.y * .5) * (dt * dt) if self.position.y > 128: self.on_ground = True self.velocity.y = 0 self.position.y = 128 self.rect.bottom = self.position.y def limit_velocity(self, max_vel): min(-max_vel, max(self.velocity.x, max_vel)) if abs(self.velocity.x) < .01: self.velocity.x = 0 def jump(self): if self.on_ground: self.is_jumping = True self.velocity.y -= 8 self.on_ground = False
class Alien_2(Sprite): #a class to represent a single alien in the fleet def __init__(self, ai_settings, screen): #initialize the alien and set its starting position super(Alien_2, self).__init__() self.screen = screen self.ai_settings = ai_settings self.image = Spritesheet('images/spritesheet.png') self.images = [] self.index = 0 self.images.append( self.image.image_at((64, 0, 64, 64), colorkey=(0, 0, 0, 1))) self.images.append( self.image.image_at((128, 0, 64, 64), colorkey=(0, 0, 0, 1))) self.score = 20 self.image = self.images[self.index] #load the alien image and set its rect attribute self.rect = self.image.get_rect() #start each new alien near the top left of the screen self.rect.x = self.rect.width self.rect.y = self.rect.height #store the alien's exact position self.x = float(self.rect.x) def blitme(self): self.screen.blit(self.image, self.rect) def check_edges(self): #return true if alien is at edge of screen screen_rect = self.screen.get_rect() if self.rect.right >= screen_rect.right: return True elif self.rect.left <= 0: return True def update(self): #move the alien right or left self.x += (self.ai_settings.alien_speed_factor * self.ai_settings.fleet_direction) self.rect.x = self.x self.index += .02 if self.index >= len(self.images): self.index = 0 self.image = self.images[math.floor(self.index)]
class Player(pygame.sprite.Sprite): def __init__(self): pygame.sprite.Sprite.__init__(self) self.LEFT_KEY, self.RIGHT_KEY, self.FACING_LEFT = False, False, False self.is_jumping, self.on_ground = False, False self.gravity, self.friction = .35, -.12 self.image = Spritesheet('spritesheet.png').parse_sprite('chick.png') self.rect = self.image.get_rect() self.position, self.velocity = pygame.math.Vector2( 0, 0), pygame.math.Vector2(0, 0) self.acceleration = pygame.math.Vector2(0, self.gravity) def draw(self, display): display.blit(self.image, (self.rect.x, self.rect.y)) def update(self, dt, tiles): self.horizontal_movement(dt) self.checkCollisionsx(tiles) self.vertical_movement(dt) self.checkCollisionsy(tiles) def horizontal_movement(self, dt): self.acceleration.x = 0 if self.LEFT_KEY: self.acceleration.x -= .3 elif self.RIGHT_KEY: self.acceleration.x += .3 self.acceleration.x += self.velocity.x * self.friction self.velocity.x += self.acceleration.x * dt self.limit_velocity(4) self.position.x += self.velocity.x * dt + (self.acceleration.x * .5) * (dt * dt) self.rect.x = self.position.x def vertical_movement(self, dt): self.velocity.y += self.acceleration.y * dt if self.velocity.y > 7: self.velocity.y = 7 self.position.y += self.velocity.y * dt + (self.acceleration.y * .5) * (dt * dt) self.rect.bottom = self.position.y def limit_velocity(self, max_vel): self.velocity.x = max(-max_vel, min(self.velocity.x, max_vel)) if abs(self.velocity.x) < .01: self.velocity.x = 0 def jump(self): if self.on_ground: self.is_jumping = True self.velocity.y -= 8 self.on_ground = False def get_hits(self, tiles): hits = [] for tile in tiles: if self.rect.colliderect(tile): hits.append(tile) return hits def checkCollisionsx(self, tiles): collisions = self.get_hits(tiles) for tile in collisions: if self.velocity.x > 0: # Hit tile moving right self.position.x = tile.rect.left - self.rect.w self.rect.x = self.position.x elif self.velocity.x < 0: # Hit tile moving left self.position.x = tile.rect.right self.rect.x = self.position.x def checkCollisionsy(self, tiles): self.on_ground = False self.rect.bottom += 1 collisions = self.get_hits(tiles) for tile in collisions: if self.velocity.y > 0: # Hit tile from the top self.on_ground = True self.is_jumping = False self.velocity.y = 0 self.position.y = tile.rect.top self.rect.bottom = self.position.y elif self.velocity.y < 0: # Hit tile from the bottom self.velocity.y = 0 self.position.y = tile.rect.bottom + self.rect.h self.rect.bottom = self.position.y