def mainloop(self): self.clock = pygame.time.Clock() self.player.rect.center = [self.display.arena[0]/2, self.display.arena[1]/2] controller = Controller() while self.gameRunning: dirty = [] self.clock.tick(FPS) self.framerate = self.clock.get_fps() self.display.paint_background(dirty) self.player.state.set_current_state(self) d = self.display.paint_sprite(self.player) dirty.insert(len(dirty), d) self.steine.update() self.ladders.update() self.barrels.update() self.meanies.update(dirty) self.hud.showinfo(self, dirty) controller.handle_keyboard_input(self.player) self.player.update() pygame.display.update(dirty)
def mainloop(self): self.clock = pygame.time.Clock() self.player.rect.center = [self.display.arena[0]/2, self.display.arena[1]/2] controller = Controller() while self.gameRunning: dirty = [] self.clock.tick(FPS) self.framerate = self.clock.get_fps() self.display.paint_background(dirty) self.player.state.set_current_state() d = self.display.paint_sprite(self.player) dirty.insert(len(dirty), d) self.steine.update() self.ladders.update() self.barrels.update() self.meanies.update(dirty) self.hud.showinfo(self, dirty) controller.handle_keyboard_input(self.player) self.player.update() ## Just for debugging - paint hitareas of charactor ## d = self.draw_hitarea(self.player.feet()) dirty.insert(len(dirty), d) d = self.draw_hitarea(self.player.middle(), (0,0,255)) dirty.insert(len(dirty), d) d = self.draw_hitarea(self.player.head(), (0,255,255)) dirty.insert(len(dirty), d) pygame.display.update(dirty)
class Charactor(LittleSprite, PlayerState): images = {} basename = "Lupo" pose = 0 current_animation_index = 0 update_interval = 200 speed = 3 coords = [] def __init__(self, game = None): self.controller = Controller() self.handle_spritesheet() self.state = PlayerState(game) self.autsch = pygame.mixer.Sound(os.path.join(pfad, "autsch.ogg")) LittleSprite.__init__(self, self.image, game) def set_startpos(self, coords=[]): self.coords = coords self.rect.center = self.coords self.movement = [0,0] def update(self): # print "(update) movement {0}".format(self.movement) self.rect = self.image.get_rect() self.rect.topleft = self.coords if not self.state.alive: # print "player not alive" return self.controller.handle_keyboard_input(self) # print "controller -> update -> movement {0}".format(self.movement) self.state.set_current_state() self.state.set_walk_directions() self.meanie_collision() self.solids_collision() self.move_screen_and_player() if self.movement[0] != 0: self.change_current_animation_index() self.coords = self.rect.topleft dirty_rect = copy.copy(self.rect) dirty_rect = dirty_rect.inflate(16, 16) self.game.display.dirty_rects.append(dirty_rect) del dirty_rect self.game.display.paint_sprite(self) def handle_spritesheet(self): tilewidth = 24 tileheight = 32 spritesheet = "charset-brunnenkletterer-02.png" spritesheet = pygame.image.load(os.path.join(pfad , spritesheet)).convert() colorkey = spritesheet.get_at([0,0]) spritesheet.set_colorkey(colorkey) ix, iy = 0, 0 for x in range(0, spritesheet.get_width(), tilewidth): iy = 0 for y in range(0, spritesheet.get_height(), tileheight): img = spritesheet.subsurface( [x + 5, y + 10, tilewidth - 5, tileheight - 10] ) big = pygame.transform.scale2x(img) self.images[ix, iy] = big iy += 1 ix += 1 ## fix fallen player tile self.images[3,3] = pygame.transform.scale2x(spritesheet.subsurface(70, 110, 26, 18)) ## insert gravestone at unused tile # grabstein = pygame.image.load(os.path.join(pfad, "grabstein.png")) # self.images[0,0] = grabstein self.image = self.images[self.current_animation_index, 2] self.rect = self.image.get_rect() def placeTNT(self): # if not self.state.tntOnScreen: tntCoords = copy.copy(self.rect) tntCoords.centerx -= self.game.display.bgpos[0] tntCoords.centery -= self.game.display.bgpos[1] - self.rect.height / 2 if self.state.facing_right: tntCoords.centerx += 24 tnt = TNT(tntCoords) self.game.props.add(tnt) self.game.allElements.add(tnt) self.state.tntOnScreen = True # print tnt.on_screen def move_screen_and_player(self): vspeed = hspeed = self.speed dir = self.movement player_movable_x = True player_movable_y = True if self.state.falling: vspeed = self.speed * 2 else: vspeed = self.speed if dir[0] != 0 and not self.is_in_horizontal_bounds(): player_movable_x = self.game.display.move_arena_horizontal(dir, hspeed) if dir[1] != 0 and not self.is_in_vertical_bounds() and not self.state.jumping: player_movable_y = self.game.display.move_arena_vertikal(dir, vspeed) elif dir[1] != 0 and not self.is_in_vertical_bounds() and self.state.jumping: player_movable_y = True if player_movable_x or player_movable_y: self.move_player(player_movable_x, player_movable_y) def move_player(self, player_movable_x, player_movable_y): if self.is_in_upper_half(): self.game.display.move_arena_vertikal([0,-1], 1) self.rect.move_ip([0,1]) if player_movable_x: if self.movement[0] > 0 \ and self.rect.left < self.game.display.arena[0] - self.rect.width : self.rect.move_ip(self.movement[0], 0) elif self.movement[0] < 0 \ and self.rect.left > 0 : self.rect.move_ip(self.movement[0], 0) # print "(move_player) {0}" . format(self.movement) # print self.rect.top < self.game.display.arena[1] - self.rect.height, self.movement if player_movable_y: if self.movement[1] > 0 and self.rect.top < self.game.display.arena[1] - self.rect.height: self.rect.move_ip(0, self.movement[1]) elif self.movement[1] < 0 and self.rect.top > 0: self.rect.move_ip(0, self.movement[1]) def feet(self): feet = copy.copy(self) r = copy.copy(self.rect) r.inflate_ip(-24, -40) r.move_ip(0, 24) feet.rect = r return feet def middle(self): middle = copy.copy(self) r = copy.copy(self.rect) r.inflate_ip(-12, -24) r.move_ip( 0, 0) middle.rect = r return middle def head(self): head = copy.copy(self) r = copy.copy(self.rect) r.inflate_ip(-24, -40) r.move_ip( 0, -20) head.rect = r return head def meanie_collision(self): self.mask = pygame.mask.from_surface(self.image) collided_list_body = pygame.sprite.spritecollide( self, self.game.meanies, False, None ) collided_list_feet = pygame.sprite.spritecollide( self.feet(), self.game.meanies, False, None ) if len (collided_list_body) > 0: for meanie in collided_list_body: if meanie in collided_list_feet: if not meanie.state.is_upside_down: meanie.state.change_to_upside_down() meanie.hitpoints -= 1 else: if meanie.hit_time < pygame.time.get_ticks(): meanie.hitpoints -= 1 if meanie.hitpoints <= 0: meanie.kill() else: if not meanie.state.is_upside_down: meanie.mask = pygame.mask.from_surface(meanie.image) collision = pygame.sprite.collide_mask(self, meanie) if collision is not None: # print "!! charactor is hit !!" self.kill() def solids_collision(self): collided_list = pygame.sprite.spritecollide( self.middle(), self.game.solids, False, None ) if len (collided_list) > 0: for barrel in collided_list: if barrel.rect.left <= self.rect.left: self.state.cannot_walk_left() elif barrel.rect.left >= self.rect.left: self.state.cannot_walk_right() def handle_bricklist(self, brick_list): hcoords, vcoords = self.coords for brick in brick_list: vcoords = brick.rect.top - (self.rect.height + 2) if hasattr(brick,'alternate_image'): if brick.state.set_to_cleared() is True: self.game.level.bricks_total -= 1 self.coords = hcoords, vcoords self.rect.topleft = self.coords def change_current_animation_index(self): if self.update_time < pygame.time.get_ticks(): self.update_time = pygame.time.get_ticks() + self.update_interval self.current_animation_index += 1 if self.current_animation_index > 2: self.current_animation_index = 0 self.image = pygame.transform.flip(self.images[self.current_animation_index, self.pose], True, False) def face_left(self): self.pose = FACE_LEFT self.state.facing_right = False self.state.facing_left = True self.change_current_animation_index() def face_right(self): self.pose = FACE_RIGHT self.state.facing_right = True self.state.facing_left = False self.change_current_animation_index() def face_up(self): self.pose = FACE_UP self.change_current_animation_index() def face_down(self): self.pose = 2 self.change_current_animation_index() def kill(self): # print "sprite is dead" # self.image = self.images[0,0] # self.game.display.paint_sprite(self) self.autsch.play() deadman = DeadPlayer(self.coords) self.state.alive = False self.game.allElements.add(deadman) pygame.sprite.Sprite.kill(self) def spawn(self, startpos): # print "respawning player" self.image = self.images[2,2] self.set_startpos(startpos) self.state.alive = True self.update() self.game.destructables.add(self) self.game.allElements.add(self)
def mainloop(self): self.clock = pygame.time.Clock() self.player.rect.center = [self.display.arena[0]/2, self.display.arena[1]/2] controller = Controller() while self.gameRunning: dirty = [] self.clock.tick(FPS) self.framerate = self.clock.get_fps() self.display.paint_background(dirty) self.player.state.set_current_state(self) d = self.display.paint_sprite(self.player) dirty.insert(len(dirty), d) self.steine.update() self.ladders.update() self.barrels.update() self.meanies.update(dirty) self.hud.showinfo(self, dirty) controller.handle_keyboard_input(self.player) # for e in pygame.event.get(): # # if e.type == QUIT: # self.gameRunning = False # pygame.quit() # sys.exit() # elif e.type == KEYDOWN: # # if e.key == K_ESCAPE: # self.gameRunning = False # pygame.quit() # sys.exit() # elif e.key == K_UP and self.player.state.climbing: # self.player.movement[1]= - self.player.speed # # self.player.face_up() # # elif e.key == K_DOWN \ # and not self.player.state.falling \ # and self.player.state.climbing: # # self.player.movement[1]= self.player.speed # # self.player.face_down() # # elif e.key == K_LEFT: # if self.player.state.falling: # self.player.movement[0] = - self.player.speed/2 # else: # self.player.movement[0] = - self.player.speed # # if not self.player.state.can_walk_left: # self.player.movement[0] = 0 # # self.player.face_left() # # elif e.key == K_RIGHT: # if self.player.state.falling: # self.player.movement[0] = self.player.speed/2 # else: # self.player.movement[0] = self.player.speed # # if not self.player.state.can_walk_right: # self.player.movement[0] = 0 # # self.player.face_right() # # elif e.type == KEYUP: # if e.key == K_UP or e.key == K_DOWN: # self.player.movement[1] = 0 # elif e.key == K_LEFT or e.key == K_RIGHT: # self.player.movement[0] = 0 self.player.update() pygame.display.update(dirty)