Aldeia RPG

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

Suporte ao desenvolvimento de jogos


+4
whitespirits
GallighanMaker
Valentine
iCoke~
8 participantes

    Sistema de Pet

    iCoke~
    iCoke~
    Membro Ativo
    Membro Ativo


    Medalhas : Sistema - Sistema de Pet Trophy12
    Mensagens : 268
    Créditos : 25

    Ficha do personagem
    Nível: 1
    Experiência:
    Sistema - Sistema de Pet Left_bar_bleue0/0Sistema - Sistema de Pet Empty_bar_bleue  (0/0)
    Vida:
    Sistema - Sistema de Pet Left_bar_bleue30/30Sistema - Sistema de Pet Empty_bar_bleue  (30/30)

    Sistema - Sistema de Pet Empty Sistema de Pet

    Mensagem por iCoke~ 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.

    Atenção:
    A quem for usar esse sistema, como o Pet é feito por equipamento, recomendo que crie um slot específico para o Pet. O tutorial para a criação de novos slots de equipamento, criado por LeonM², está disponível no link abaixo:
    https://www.aldeiarpg.com/t14814-vxa-os-como-adicionar-mais-slots-de-equipamento

    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.
    - Caso não seja criado um slot específico para o Pet, um slot de equipamento será "perdido", já que só poderá ser utilizado para essa finalidade.

    Imagens:
    Spoiler:
    Spoiler:

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


    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
            #==========================================================================
            # * Parte que anima o Pet
            #==========================================================================
              if @a < 10
                @a+= 1
              end
              if @a >= 10
                if @pat == 0
                  @pat = 1
                  @b = 1
                elsif @pat == 1
                  @pat += @b
                elsif @pat == 2
                  @pat = 1
                  @b = -1
                end
                @a = 0
              end
              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(d = @character.old_d)
        if @character.actor.equips[@pet_slot_id].atype_id == 7
          pattern = @character.pattern < 3 ? @character.pattern : 1
        else
          pattern = @pat
        end
        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 + (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 || (y - @paperdoll_sprites[id].y).abs > 96
          @paperdoll_sprites[id].x = x
          @paperdoll_sprites[id].y = y
        end
        if !@character.moving?
          if @pat != @character.pattern
            change_pet_dir(@character.direction)
          end
        else
          change_pet_dir
        end
        
        v = 2 #velocidade
        case @character.direction
        #===============================
        # * Movimento para baixo
        #===============================
        when 2
          if @character.map_passable?(@character.x, @character.y-1, @character.direction) && !@character.collide_with_events?(@character.x, @character.y-1)
            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
          else
            if @paperdoll_sprites[id].x < x
              @paperdoll_sprites[id].x = x - 32
            else
              @paperdoll_sprites[id].x = x + 32
            end
            @paperdoll_sprites[id].y = y
          end
          @paperdoll_sprites[id].z = z - 1

        #================================
        # * Movimento para a esquerda
        #================================
        when 4
          if @character.map_passable?(@character.x+1, @character.y, @character.direction) && !@character.collide_with_events?(@character.x+1, @character.y)
            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
          else
            if @paperdoll_sprites[id].y < y
              @paperdoll_sprites[id].y = y - 32
            else
              @paperdoll_sprites[id].y = y + 32
            end
            @paperdoll_sprites[id].x = x
          end
          @paperdoll_sprites[id].z = z - 1
          
        #================================
        # * Movimento para a direita
        #================================
        when 6
          if @character.map_passable?(@character.x-1, @character.y, @character.direction) && !@character.collide_with_events?(@character.x-1, @character.y)
            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
          else
            if @paperdoll_sprites[id].y < y
              @paperdoll_sprites[id].y = y - 32
            else
              @paperdoll_sprites[id].y = y + 32
            end
            @paperdoll_sprites[id].x = x
          end
          @paperdoll_sprites[id].z = z - 1
          
        #================================
        # * Movimento para cima
        #================================
        when 8
          if @character.map_passable?(@character.x, @character.y+1, @character.direction) && !@character.collide_with_events?(@character.x, @character.y+1)
            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
          else
            if @paperdoll_sprites[id].x < x
              @paperdoll_sprites[id].x = x - 32
            else
              @paperdoll_sprites[id].x = x + 32
            end
            @paperdoll_sprites[id].y = y
          end
          @paperdoll_sprites[id].z = z + 10
        end
      end

    3) Vá até o script [RM] Game_CharacterBase do Cliente, e abaixo da linha 28, adicione:
    Código:
    attr_reader   :old_d

    Agora localize o "def init_public_members", abaixo de "@direction = 2", adicione:
    Código:
    @old_d = 2

    Ainda no mesmo script, localize o "def set_direction(d)", e, acima de "@direction = d if !@direction_fix && d != 0", adicione:
    Código:
    @old_d = @direction if @direction != nil


    4) Agora, no database do RPG Maker, vá na aba "Sistema" e no campo "Tipos de armadura" crie/nomeie os tipos 7 e 8 como "Pet Comum" e "Pet Animado", sem as aspas.

    5) No passo 5, definimos que o tipo 7 e 8 de armadura serão os tipos de pet, agora precisamos permitir que todas as classes possam equipar esse tipo de armadura.
    Ainda no database, vá na aba "Classes" e dê dois cliques no campo "Traços". Na janela nova que abriu, vá na aba "Equipamento" selecione a caixa "Tipo de armadura", e escolha a opção "Pet Comum". Faça o mesmo para "Pet Animado". Repita o passo 5 para todas as classes, fazendo Pet Comum e Pet Animado.

    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, no campo "Classificação" definir como "Acessório". E, em "Tipo de Armadura", definir como "Pet Comum" ou "Pet Animado". O pet comum fica parado quando o jogador está parado, sua animação de movimento só acontece quando o jogador anda. Já o pet animado fica executando em looping sua animação de movimento, independente do jogador estar parado ou não.

    Nas notas do equipamento, adicione as seguintes linhas:
    Código:
    Type=8
    Paperdoll=Monster03/0


    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 e passou a ser o do Pet. (Nós definimos que seria o do pet lá em cima, quando definimos a variável @pet_slot_id=8); 
    2 - Em 'Paperdoll=Monster03/0' nós definimos o gráfico do nosso pet, que deve estar dentro da pasta de paperdolls. A parte "Monster03" indica o nome da imagem e o "0" significa o índice do gráfico.

    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;

    [29/06/2021]:
    - Agora você pode criar pets animados ou estáticos (quando parados);
    - Correção de muitos bugs de posição, direção e animação;
     

    Agradecimentos:
    Valentine pelo VXA-OS.


    Última edição por iCoke~ em Ter Jun 29, 2021 3:26 pm, editado 5 vez(es)

    jiraya, dpsdenes, -JohnLennon-, takub088, Gabas Requena e Ioriyagami190 gostam desta mensagem

    Valentine
    Valentine
    Administrador
    Administrador


    Medalhas : Sistema - Sistema de Pet ZgLkiRU
    Mensagens : 5336
    Créditos : 1163

    Sistema - Sistema de Pet Empty Re: Sistema de Pet

    Mensagem por Valentine Seg maio 25, 2020 5:47 pm

    Ótima contribuição.

    + 1 crédito.
    GallighanMaker
    GallighanMaker
    Colaborador
    Colaborador


    Medalhas : Sistema - Sistema de Pet ZgLkiRU
    Mensagens : 985
    Créditos : 102

    Ficha do personagem
    Nível: 1
    Experiência:
    Sistema - Sistema de Pet Left_bar_bleue0/0Sistema - Sistema de Pet Empty_bar_bleue  (0/0)
    Vida:
    Sistema - Sistema de Pet Left_bar_bleue30/30Sistema - Sistema de Pet Empty_bar_bleue  (30/30)

    Sistema - Sistema de Pet Empty Re: Sistema de Pet

    Mensagem por GallighanMaker Ter maio 26, 2020 5:40 pm

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


    _________________
    Sistema - Sistema de Pet 8dVK0ku
    using C# and import Python developer || Expert in Unity Engine IDE. || Sistema - Sistema de Pet 769_heart 2D pixel games.
    avatar
    whitespirits
    Iniciante
    Iniciante


    Medalhas : Sistema - Sistema de Pet 1add79
    Mensagens : 54
    Créditos : 0

    Sistema - Sistema de Pet Empty Re: Sistema de Pet

    Mensagem por whitespirits Sáb 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 : Sistema - Sistema de Pet Trophy12
    Mensagens : 268
    Créditos : 25

    Ficha do personagem
    Nível: 1
    Experiência:
    Sistema - Sistema de Pet Left_bar_bleue0/0Sistema - Sistema de Pet Empty_bar_bleue  (0/0)
    Vida:
    Sistema - Sistema de Pet Left_bar_bleue30/30Sistema - Sistema de Pet Empty_bar_bleue  (30/30)

    Sistema - Sistema de Pet Empty Re: Sistema de Pet

    Mensagem por iCoke~ 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

    iCoke~
    iCoke~
    Membro Ativo
    Membro Ativo


    Medalhas : Sistema - Sistema de Pet Trophy12
    Mensagens : 268
    Créditos : 25

    Ficha do personagem
    Nível: 1
    Experiência:
    Sistema - Sistema de Pet Left_bar_bleue0/0Sistema - Sistema de Pet Empty_bar_bleue  (0/0)
    Vida:
    Sistema - Sistema de Pet Left_bar_bleue30/30Sistema - Sistema de Pet Empty_bar_bleue  (30/30)

    Sistema - Sistema de Pet Empty Re: Sistema de Pet

    Mensagem por iCoke~ Sáb Jan 30, 2021 3:36 pm

    TÓPICO ATUALIZADO:
    - O pet agora colide com eventos ou tilesets não-passáveis.

    Para quem já utilizava a versão antiga, basta substituir o "def move_pet" do [VS] Sprite_Character do Client por:
    Código:
      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
          return if !$game_player.map_passable?($game_player.x, $game_player.y-1, @character.direction)
          return if $game_player.collide_with_events?($game_player.x, $game_player.y-1)
          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
          return if !$game_player.map_passable?($game_player.x+1, $game_player.y, @character.direction)
          return if $game_player.collide_with_events?($game_player.x+1, $game_player.y)
          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
          return if !$game_player.map_passable?($game_player.x-1, $game_player.y, @character.direction)
          return if $game_player.collide_with_events?($game_player.x-1, $game_player.y)
          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
          return if !$game_player.map_passable?($game_player.x, $game_player.y+1, @character.direction)
          return if $game_player.collide_with_events?($game_player.x, $game_player.y+1)
          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

    Valentine gosta desta mensagem

    avatar
    dobby
    Novato
    Novato


    Mensagens : 2
    Créditos : 0

    Sistema - Sistema de Pet Empty Re: Sistema de Pet

    Mensagem por dobby Sex Mar 12, 2021 9:26 pm

    Really cool! Would it be possible to add this on a new equipment slot rather than lose one?
    iCoke~
    iCoke~
    Membro Ativo
    Membro Ativo


    Medalhas : Sistema - Sistema de Pet Trophy12
    Mensagens : 268
    Créditos : 25

    Ficha do personagem
    Nível: 1
    Experiência:
    Sistema - Sistema de Pet Left_bar_bleue0/0Sistema - Sistema de Pet Empty_bar_bleue  (0/0)
    Vida:
    Sistema - Sistema de Pet Left_bar_bleue30/30Sistema - Sistema de Pet Empty_bar_bleue  (30/30)

    Sistema - Sistema de Pet Empty Re: Sistema de Pet

    Mensagem por iCoke~ Seg Abr 05, 2021 12:34 am

    Para aqueles que desejam criar um novo slot de equipamento específico para o Pet, segue o tutorial abaixo criado por LeonM².

    For those who want to add a new equipment slot only for the Pet, check the tutorial in the link below made by LeonM².

    https://www.aldeiarpg.com/t14814-vxa-os-como-adicionar-mais-slots-de-equipamento
    iCoke~
    iCoke~
    Membro Ativo
    Membro Ativo


    Medalhas : Sistema - Sistema de Pet Trophy12
    Mensagens : 268
    Créditos : 25

    Ficha do personagem
    Nível: 1
    Experiência:
    Sistema - Sistema de Pet Left_bar_bleue0/0Sistema - Sistema de Pet Empty_bar_bleue  (0/0)
    Vida:
    Sistema - Sistema de Pet Left_bar_bleue30/30Sistema - Sistema de Pet Empty_bar_bleue  (30/30)

    Sistema - Sistema de Pet Empty Re: Sistema de Pet

    Mensagem por iCoke~ Ter Jun 29, 2021 3:35 pm

    TÓPICO ATUALIZADO:

    [29/06/2021]:
    - Agora você pode criar pets animados ou estáticos. Os animados ficam executando a animação de movimento constantemente, mesmo com o jogador parado. Já os estáticos (pet comum) só executa a animação de movimento quando o jogador se movimenta;
    - Correção de muitos bugs de posição, direção e animação;


    Sugiro que quem utilizava a versão antiga, a substitua por essa.

    Se alguém tiver alguma sugestão de como otimizar o código (sou péssimo nisso), ou de algo a adicionar/modificar no sistema, seria bem legal :) 

    Valentine, Paulo Soreto, racki12 e aeFly gostam desta mensagem

    Paulo Soreto
    Paulo Soreto
    Lenda
    Lenda


    Mensagens : 1980
    Créditos : 367

    Ficha do personagem
    Nível: 1
    Experiência:
    Sistema - Sistema de Pet Left_bar_bleue0/0Sistema - Sistema de Pet Empty_bar_bleue  (0/0)
    Vida:
    Sistema - Sistema de Pet Left_bar_bleue30/30Sistema - Sistema de Pet Empty_bar_bleue  (30/30)

    Sistema - Sistema de Pet Empty Re: Sistema de Pet

    Mensagem por Paulo Soreto Qua Jun 30, 2021 8:25 am

    Incrível o que tu conseguiu fazer explorando recursos ja existentes na engine.

    Conteúdo patrocinado


    Sistema - Sistema de Pet Empty Re: Sistema de Pet

    Mensagem por Conteúdo patrocinado


      Data/hora atual: Sex Abr 26, 2024 1:17 pm