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:
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) Ainda no [VS] Sprite_Character, localize o "def refresh_paperdoll" e substitua-o por:
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:
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:
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.
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]
[X]
- Um slot de equipamentos 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
$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
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)