Exemplo n.º 1
0
 def __init__(self, x, y):
     sprite.Sprite.__init__(self)
     load_souces()
     self.image = None
     self.xvel = MOVE_SPEED
     self.yvel = MOVE_SPEED
     self.rect = Rect(x, y, 30, 10)
     self.state = 'stop'
     # Направление для определения анимации покоя
     self.direction = LEFT
     # TODO: Бинарная матрица
     self.anim_left = Animation(LEFT_SPRITES)
     self.anim_right = Animation(RIGHT_SPRITES)
     self.anim_up = Animation(UP_SPRITES)
     self.anim_down = Animation(DOWN_SPRITES)
     self.anim_stop_left = Animation(LEFT_STOP_SPRITES)
     self.anim_stop_right = Animation(RIGHT_STOP_SPRITES)
     self.left = self.right = self.up = self.down = False
Exemplo n.º 2
0
class Player(sprite.Sprite):
    def __init__(self, x, y):
        sprite.Sprite.__init__(self)
        load_souces()
        self.image = None
        self.inventory = []
        self.xvel = MOVE_SPEED
        self.yvel = MOVE_SPEED
        self.rect = Rect(x, y, 30, 10)
        self.state = 'stop'
        self.fixme = 1
        # Направление для определения анимации покоя
        self.direction = LEFT
        # TODO: Бинарная матрица
        self.anim_left = Animation(LEFT_SPRITES)
        self.anim_right = Animation(RIGHT_SPRITES)
        self.anim_up = Animation(UP_SPRITES)
        self.anim_down = Animation(DOWN_SPRITES)
        self.anim_stop_left = Animation(LEFT_STOP_SPRITES)
        self.anim_stop_right = Animation(RIGHT_STOP_SPRITES)
        self.left = self.right = self.up = self.down = False

    def event(self, e):
        if e.type == KEYDOWN and e.key == K_LEFT:
            self.left = True
        if e.type == KEYDOWN and e.key == K_RIGHT:
            self.right = True
        if e.type == KEYDOWN and e.key == K_UP:
            self.up = True
        if e.type == KEYDOWN and e.key == K_DOWN:
            self.down = True

        if e.type == KEYUP and e.key == K_RIGHT:
            self.right = False
        if e.type == KEYUP and e.key == K_LEFT:
            self.left = False
        if e.type == KEYUP and e.key == K_UP:
            self.up = False
        if e.type == KEYUP and e.key == K_DOWN:
            self.down = False

    def update(self, dt, objects, camera_change):
        """
        Обновление состояния объекта. dt - сколько миллисекунд прошло с прошлого вызова данного метода
        """

        if self.left:
            self.xvel = -MOVE_SPEED  # Лево = x- n
            self.state = 'move'
            self.direction = LEFT

        if self.right:
            self.xvel = MOVE_SPEED   # Право = x + n
            self.state = 'move'
            self.direction = RIGHT

        if self.up:
            self.yvel = -MOVE_SPEED
            self.state = 'move'

        if self.down:
            self.yvel = MOVE_SPEED
            self.state = 'move'

        if not(self.left or self.right or self.up or self.down):       # стоим, когда нет указаний идти
            self.xvel = 0
            self.yvel = 0
            self.state = 'stop'

        # self.rect.y += self.yvel
        # self.rect.x += self.xvel
        # self.collision(0, self.yvel, objects)
        self.collision(self.xvel, self.yvel, objects)
        camera_change = (-self.xvel, -self.yvel)
        print(camera_change)

        # # Анимация
        for anim in [self.anim_right, self.anim_left, self.anim_up,
                     self.anim_down, self.anim_stop_left, self.anim_stop_right]:
            anim.update(dt)

        if self.left:
            self.image = self.anim_left.get_sprite()
        if self.right:
            self.image = self.anim_right.get_sprite()
        if self.up:
            self.image = self.anim_up.get_sprite()
        if self.down:
            self.image = self.anim_down.get_sprite()

        if self.state == 'stop' and self.direction == LEFT:
            self.image = self.anim_stop_left.get_sprite()
        if self.state == 'stop' and self.direction == RIGHT:
            self.image = self.anim_stop_right.get_sprite()
        return camera_change

    def render(self, screen):
        x = self.rect.x - self.image.get_rect().width / 7
        y = self.rect.y - self.image.get_rect().height + self.rect.height
        screen.blit(self.image, (x, y))

    def collision(self, xvel, yvel, objects):
        for o in objects:
            if self.rect.colliderect(o["object"].rect):       # если есть пересечение платформы с игроком
                print(1)
                if xvel < 0:                       # если движется вправо
                    self.rect.left = o["object"].rect.right  # то не движется вправо
                    # o["object"].rect.left = self.rect.right
                    self.xvel = 0

                if xvel > 0:                       # если движется влево
                    self.rect.right = o["object"].rect.left  # то не движется влево
                    # o["object"].rect.right = self.rect.left
                    self.xvel = 0

                if yvel > 0:
                    self.rect.bottom = o["object"].rect.top
                    # o["object"].rect.top = self.rect.bottom
                    self.yvel = 0

                if yvel < 0:
                    self.rect.top = o["object"].rect.bottom
                    # o["object"].rect.bottom = self.rect.top
                    self.yvel = 0

    def area_collision(self, objects):
        for o in objects:
            if self.rect.colliderect(o["object"].area):
                print(o)
                return True, o
        return False, None