Aldeia RPG

Gostaria de reagir a esta mensagem? Crie uma conta em poucos cliques ou inicie sessão para continuar.

Suporte no desenvolvimento de jogos


    [VXA-OS] Sistema de pet [ATUALIZADO]

    iCoke~
    iCoke~
    Membro Ativo
    Membro Ativo

    Medalhas : [VXA-OS] Sistema de pet [ATUALIZADO] Trophy12
    Mensagens : 254
    Créditos : 23

    Ficha do personagem
    Nível: 1
    Experiência:
    [VXA-OS] Sistema de pet [ATUALIZADO] Left_bar_bleue0/0[VXA-OS] Sistema de pet [ATUALIZADO] Empty_bar_bleue  (0/0)
    Vida:
    [VXA-OS] Sistema de pet [ATUALIZADO] Left_bar_bleue30/30[VXA-OS] Sistema de pet [ATUALIZADO] Empty_bar_bleue  (30/30)

    [VXA-OS] Sistema de pet [ATUALIZADO] Empty [VXA-OS] Sistema de pet [ATUALIZADO]

    Mensagem por iCoke~ em Dom Maio 24, 2020 6:24 pm

    Introdução:
    Fala, galera. Resolvi brincar um pouquinho com o VXA-OS e saiu esse sistema de pet, por meio de uma modificação no sistema de paperdolls. É bem básico, só uma ideia, mas dá pra ser aperfeiçoado tranquilamente. Ultimamente estou meio desmotivado pra mexer com esse tipo de coisa de forma mais aprofundada, então só pra essa ideia não cair no esquecimento, decidi postar aqui.

    Prós:
    - É leve, já que usa o próprio sistema de paperdolls da engine.
    - É de fácil compreensão e implementação.

    Contras:
    [X] O movimento não é muito natural.
    [X] Os gráficos dos pets devem ter as mesmas medidas do gráfico do player.
    - Um slot de equipamentos será "perdido", já que só poderá ser utilizado para essa finalidade.

    Imagens:
    Spoiler:
    [VXA-OS] Sistema de pet [ATUALIZADO] 111
    Spoiler:
    [VXA-OS] Sistema de pet [ATUALIZADO] Ezgif-com-gif-maker-1

    Scripts:
    1) Vá até o script [VS] Sprite_Character, localize o "def init_sprites" e, dentro dele, adicione:
    Código:
    @pet_slot_id = 8
    $old_d = 2


    2) Ainda no [VS] Sprite_Character do Cliente, localize o "def update_paperdolls" e substitua por:
    Código:
     def update_paperdolls
        order_equips.each_with_index do |slot_id, index|
          if @character.actor.equips[slot_id] && @character.actor.equips[slot_id].paperdoll_name
            refresh_paperdoll(slot_id) unless @last_equips[slot_id] == @character.actor.equips[slot_id] && @last_sex == @character.actor.sex
            pattern = @character.pattern < 3 ? @character.pattern : 1
            paperdoll_index = @character.attack_animation? ? @character.character_index : @character.actor.equips[slot_id].paperdoll_index
      
            if slot_id != @pet_slot_id
              sx = (paperdoll_index % 4 * 3 + pattern) * @cw
              sy = (paperdoll_index / 4 * 4 + (@character.direction - 2) / 2) * @ch
              @paperdoll_sprites[slot_id].src_rect.set(sx, sy, @cw, @ch)
              @paperdoll_sprites[slot_id].x = x
              @paperdoll_sprites[slot_id].y = y
              @paperdoll_sprites[slot_id].z = z + index
            else
              move_pet(x, y, z, @pet_slot_id)
            end
            
          else
            dispose_paperdoll(slot_id)
          end
        end
        @last_sex = @character.actor.sex
      end
      
      def change_pet_dir
        pattern = @character.pattern < 3 ? @character.pattern : 1
        paperdoll_index = @character.attack_animation? ? @character.character_index : @character.actor.equips[@pet_slot_id].paperdoll_index
        sign = @character.actor.equips[@pet_slot_id].paperdoll_name[/^[\!\$]./]
        if sign && sign.include?('$')
          cw = @paperdoll_sprites[@pet_slot_id].bitmap.width / 3
          ch = @paperdoll_sprites[@pet_slot_id].bitmap.height / 4
        else
          cw = @paperdoll_sprites[@pet_slot_id].bitmap.width/12
          ch = @paperdoll_sprites[@pet_slot_id].bitmap.height/8
        end
        sx = (paperdoll_index % 4 * 3 + pattern) * cw
        sy = (paperdoll_index / 4 * 4 + ($old_d - 2) / 2) * ch
        @paperdoll_sprites[@pet_slot_id].src_rect.set(sx, sy, cw, ch)
      end
      
      def move_pet(x, y, z, id)
        if (x - @paperdoll_sprites[id].x).abs > 96
          @paperdoll_sprites[id].x = x
          @paperdoll_sprites[id].y = y
        end
        v = 2 #velocidade
        case @character.direction
        #===============================
        # * Movimento para baixo
        #===============================
        when 2
          change_pet_dir
          if @paperdoll_sprites[id].x != x
            if @paperdoll_sprites[id].x > x
              @paperdoll_sprites[id].x -= v
            elsif @paperdoll_sprites[id].x < x
              @paperdoll_sprites[id].x += v
            end
          end
          if @paperdoll_sprites[id].y > y - 32
            @paperdoll_sprites[id].y -= v
          elsif @paperdoll_sprites[id].y <= y - 32
            @paperdoll_sprites[id].y = y - 32
          end
          @paperdoll_sprites[id].z = z - 1
          
        #================================
        # * Movimento para a esquerda
        #================================
        when 4
          change_pet_dir
          if @paperdoll_sprites[id].y != y
            if @paperdoll_sprites[id].y > y
              @paperdoll_sprites[id].y -= v
            elsif @paperdoll_sprites[id].y < y
              @paperdoll_sprites[id].y += v
            end
          end
          if @paperdoll_sprites[id].x < x + 32
            @paperdoll_sprites[id].x += v
          elsif @paperdoll_sprites[id].x >= x + 32
            @paperdoll_sprites[id].x = x + 32
          end
          @paperdoll_sprites[id].z = z - 1
          
        #================================
        # * Movimento para a direita
        #================================
        when 6
          change_pet_dir
          if @paperdoll_sprites[id].y != y
            if @paperdoll_sprites[id].y > y
              @paperdoll_sprites[id].y -= v
            elsif @paperdoll_sprites[id].y < y
              @paperdoll_sprites[id].y += v
            end
          end
          if @paperdoll_sprites[id].x > x - 32
            @paperdoll_sprites[id].x -= v
          elsif @paperdoll_sprites[id].x <= x - 32
            @paperdoll_sprites[id].x = x - 32
          end
          @paperdoll_sprites[id].z = z - 1
        
        #================================
        # * Movimento para cima
        #================================
        when 8
          change_pet_dir
          if @paperdoll_sprites[id].x != x
            if @paperdoll_sprites[id].x < x
              @paperdoll_sprites[id].x += v
            elsif @paperdoll_sprites[id].x > x
              @paperdoll_sprites[id].x -= v
            end
          end
          if @paperdoll_sprites[id].y < y + 32
            @paperdoll_sprites[id].y += v
          elsif @paperdoll_sprites[id].y >= y + 32
            @paperdoll_sprites[id].y = y + 32
          end
          @paperdoll_sprites[id].z = z + 10
        end
      end

    3) Ainda no [VS] Sprite_Character, localize o "def refresh_paperdoll" e substitua-o por:
    Código:
    def refresh_paperdoll(slot_id)
        @last_equips[slot_id] = @character.actor.equips[slot_id]
        bitmap = Cache.paperdoll(@character.actor.equips[slot_id].paperdoll_name, @character.actor.sex)
        @paperdoll_sprites[slot_id] ? @paperdoll_sprites[slot_id].bitmap.clear : create_paperdoll(slot_id, bitmap)
        if bitmap.width != @paperdoll_sprites[slot_id].bitmap.width || bitmap.height != @paperdoll_sprites[slot_id].bitmap.height
          @paperdoll_sprites[slot_id].bitmap.clear
          @paperdoll_sprites[slot_id].bitmap = Bitmap.new(bitmap.width, bitmap.height)
        end
        @paperdoll_sprites[slot_id].bitmap.blt(0, 0, bitmap, bitmap.rect)
        sign = @character.actor.equips[slot_id].paperdoll_name[/^[\!\$]./]
        if sign && sign.include?('$')
          cw = bitmap.width / 3
          ch = bitmap.height / 4
        else
          cw = bitmap.width / 12
          ch = bitmap.height / 8
        end
        @paperdoll_sprites[slot_id].ox = cw / 2
        @paperdoll_sprites[slot_id].oy = ch
      end

    4) Vá até o script [VS] Game_Player do Cliente, localize o "def move_by_input" e, abaixo de "return if !movable? || $game_map.interpreter.running?", cole o seguinte código:
    Código:
    $old_d = @direction


    Explicações:
    À variável @pet_slot_id foi atribuído o valor "8", que corresponde ao slot da bota. Pode ser qualquer outro slot de equipamento, basta mudar o número.

    Criando um pet:
    Basta criar um equipamento no database do rpg maker e, nas notas do equipamento, adicionar as seguintes linhas:
    Código:
    Type=8
    Paperdoll=$Monster03
    O que fizemos aqui? 
    1 - Em Type=8, nós definimos que o equipamento(nesse caso o nosse pet), irá ocupar o slot 8, que era o da bota (mas nós definimos que seria o do pet lá em cima, quando definimos a variável @pet_slot_id=8); 
    2 - Em 'Paperdoll=$Monster03' nós definimos o gráfico do nosso pet, que deve estar dentro da pasta de paperdolls. 

    Changelog:
    [27/12/2020]: 
    - As imagens dos pets não precisam ter obrigatoriamente o mesmo tamanho da imagem do player;
    - Os pets não precisam ter mais o mesmo padrão de tamanho entre eles (você pode ter pets da tamanhos variados);
    - O movimento dos pets está bem mais natural;
     

    Agradecimentos:
    Valentine pelo VXA-OS.


    Última edição por iCoke~ em Dom Dez 27, 2020 2:37 am, editado 1 vez(es)

    dpsdenes gosta desta mensagem

    Valentine
    Valentine
    Administrador
    Administrador

    Medalhas : [VXA-OS] Sistema de pet [ATUALIZADO] ZgLkiRU
    Mensagens : 5200
    Créditos : 1142

    [VXA-OS] Sistema de pet [ATUALIZADO] Empty Re: [VXA-OS] Sistema de pet [ATUALIZADO]

    Mensagem por Valentine em Seg Maio 25, 2020 5:47 pm

    Ótima contribuição.

    + 1 crédito.


    _________________
    [VXA-OS] Sistema de pet [ATUALIZADO] AIymW
    GallighanMaker
    GallighanMaker
    Colaborador
    Colaborador

    Medalhas : [VXA-OS] Sistema de pet [ATUALIZADO] ZgLkiRU
    Mensagens : 966
    Créditos : 98

    Ficha do personagem
    Nível: 1
    Experiência:
    [VXA-OS] Sistema de pet [ATUALIZADO] Left_bar_bleue0/0[VXA-OS] Sistema de pet [ATUALIZADO] Empty_bar_bleue  (0/0)
    Vida:
    [VXA-OS] Sistema de pet [ATUALIZADO] Left_bar_bleue30/30[VXA-OS] Sistema de pet [ATUALIZADO] Empty_bar_bleue  (30/30)

    [VXA-OS] Sistema de pet [ATUALIZADO] Empty Re: [VXA-OS] Sistema de pet [ATUALIZADO]

    Mensagem por GallighanMaker em Ter Maio 26, 2020 5:40 pm

    Muito bom, a galera pede bastante esse sistema, é "simples" mas funcional.


    _________________
    @IndieDB @Steam Concept
    [VXA-OS] Sistema de pet [ATUALIZADO] 41324
    --
    avatar
    whitespirits
    Iniciante
    Iniciante

    Medalhas : [VXA-OS] Sistema de pet [ATUALIZADO] 1add79
    Mensagens : 54
    Créditos : 0

    [VXA-OS] Sistema de pet [ATUALIZADO] Empty Re: [VXA-OS] Sistema de pet [ATUALIZADO]

    Mensagem por whitespirits em Sab Jul 18, 2020 12:29 pm

    você pode atualizar com a versão mais recente que possui uma mudança de direção suave?
    iCoke~
    iCoke~
    Membro Ativo
    Membro Ativo

    Medalhas : [VXA-OS] Sistema de pet [ATUALIZADO] Trophy12
    Mensagens : 254
    Créditos : 23

    Ficha do personagem
    Nível: 1
    Experiência:
    [VXA-OS] Sistema de pet [ATUALIZADO] Left_bar_bleue0/0[VXA-OS] Sistema de pet [ATUALIZADO] Empty_bar_bleue  (0/0)
    Vida:
    [VXA-OS] Sistema de pet [ATUALIZADO] Left_bar_bleue30/30[VXA-OS] Sistema de pet [ATUALIZADO] Empty_bar_bleue  (30/30)

    [VXA-OS] Sistema de pet [ATUALIZADO] Empty Re: [VXA-OS] Sistema de pet [ATUALIZADO]

    Mensagem por iCoke~ em Dom Dez 27, 2020 2:38 am

    TÓPICO ATUALIZADO:
    Changelog:
    - As imagens dos pets não precisam ter obrigatoriamente o mesmo tamanho da imagem do player;
    - Os pets não precisam ter mais o mesmo padrão de tamanho entre eles (você pode ter pets da tamanhos variados);
    - O movimento dos pets está bem mais natural;

    Valentine gosta desta mensagem


    Conteúdo patrocinado

    [VXA-OS] Sistema de pet [ATUALIZADO] Empty Re: [VXA-OS] Sistema de pet [ATUALIZADO]

    Mensagem por Conteúdo patrocinado


      Data/hora atual: Ter Jan 26, 2021 7:04 pm