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:
Scripts:
1) Vá até o script [VS] Sprite_Character, localize o "def init_sprites" e, dentro dele, adicione:
2) Ainda no [VS] Sprite_Character do Cliente, localize o "def update_paperdolls" e substitua por:
3) Vá até o script [RM] Game_CharacterBase do Cliente, e abaixo da linha 28, adicione:
Agora localize o "def init_public_members", abaixo de "@direction = 2", adicione:
Ainda no mesmo script, localize o "def set_direction(d)", e, acima de "@direction = d if !@direction_fix && d != 0", adicione:
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:
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.
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]
[X]
- 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)