示例#1
0
文件: main.py 项目: lupo72/miner2011
    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)
示例#2
0
文件: main.py 项目: lupo72/miner2011
    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)
示例#4
0
    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)