Bom, isso pode ser extremamente fácil para uns, porém pode ser muito difícil para
outros, então decidi fazer esse tutoriail básico de como criar uma simples Scene_Status.
Somente para jogos ONLINE.
Obsrvação: Salve uma cópia do projeto antes de começar o tutorial, eu não me responsabilizo caso
haja perda de algum material.
O que vamos fazer?
Vamos criar uma Scene_Status pro seu jogo.
É difícil?
Particularmente não, mas talvez seja um pouco complicado.
Leva muito tempo?
Um pouco, se você entender rápido talvez demore menos.
Abra ou crie um projeto base, de preferência que seja um com base no np master v3.
Com seu projeto aberto, você irá nos scripts (f11), procurará por: [WIN] Window_Status
Nesse script se encontra a hud do seu jogo.
Apague tudo, e depois digite(digitar não é dar ctrl+c e ctrl+v) o seguinte:
Aqui vou fazer uma variável de Cash, só pra implementar o tutorial.
- Código:
class Window_Status < Window_Base
def initialize
super(25,70,350,290)
self.contents = Bitmap.new(width - 32, height - 32)
@dragable = true
@closable = true
self.z = 999999
self.windowskin = RPG::Cache.windowskin("Blank")
self.back_opacity = 200 #opacidade
if User_Edit::DISTRIBUIR_ACTIVE == true # botões para add pts
@str = Button.new(self,85, 90, " + ") {str}
@agi = Button.new(self,85, 110, " + ") {agi}
@dex = Button.new(self,85, 130, " + ") {dex}
@int = Button.new(self,85, 150, " + ") {int}
end
refresh
end
def update # atualizando
super
refresh if something_changed?
end
def on_close
self.visible = false
self.active = false
$fechando_ativar = true
end
super(25,70,350,290): 25 e 70 = localização na tela / 350 e 290, altura e largura
self.windowskin = RPG::Cache.windowskin("Blank"): ws que usaremos
@dragable = true : Pode mecher
@closable = true : Pode feicharAgora criaremos um refresh para os itens da status:
- Código:
def refresh
@actor = $game_party.actors[0] # o char
@old_lvl = @actor.level # lvl
@old_gold = $game_party.item_number(Item_Ouro::Item_Id.to_i) # gold
@old_hp = @actor.hp # hp
@old_sp = @actor.sp # mp
@old_exp = @actor.now_exp # xp
@old_maxhp = @actor.maxhp #max hp
@old_maxsp = @actor.maxsp # max mp
@old_pontos = $distribuir_pontos # pontos
@old_str = @actor.str # str
@old_dex = @actor.dex #dex
@old_int = @actor.int # int
@old_agi = @actor.agi # agi
self.contents.clear # limpa
Fizemos isso, para tipo, quando eu to com essa janela aberta e to lutando contra um monstro, assim que o monstro me ataca eu perco hp, ai vai acontecer o mesmo.
Agora vamos por uma imagem de fundo
- Código:
# Mostra a imagem de fundo
fundo3 = RPG::Cache.picture("IMAGEM")
fundo1 = fundo3.width
fundo2 = fundo3.height
fundo4 = Rect.new(0,0,fundo1,fundo2)
self.contents.blt(0,0,fundo3,fundo4)
Como eu havia dito, irei por o sistema de cash incluso na status, então para o cash usaremos a var 9, agora adicionaremos: Nome, Level, Guild, Cash e Ouro.
Para isso usaremos o seguinte código:
- Código:
# Nome
self.contents.draw_text(x, y, 200, 32, "#{@actor.name}")
# Level
self.contents.draw_text(x, y, 100, 32, "#{@actor.level}")
# Guild
self.contents.draw_text(x, y, 100, 32, $game_party.actors[0].guild)
# Ouro
self.contents.draw_text(x, y, 100, 32, $game_party.item_number(Item_Ouro::Item_Id.to_i).to_s)
# Cash
self.contents.draw_text(x, y, 100, 32, $game_variables[9].to_s,0)
Como podem ver no script, nós declaramos todos os atributos que falei.
Mas o que é uma status sem os atributos principais?
Então vamos adicionar Str, Agi, Int e outros.
Bom, esqueci de falar, que no lugar de X e Y, ficarão as coordenadas dos nomes, ou seja, sua posição.
- Código:
# Str
self.contents.draw_text(x, y, 200, 32, "#{@actor.str}")
# Agi
self.contents.draw_text(x, y, 200, 32, "#{@actor.agi}")
# Def
self.contents.draw_text(x, y, 200, 32, "#{@actor.dex}")
# Int
self.contents.draw_text(x, y, 200, 32, "#{@actor.int}")
- Código:
# Pontos
if $distribuir_pontos < 0
self.contents.draw_text(x, x, 200, 32, "0",0)
else
self.contents.draw_text(x, x, 200, 32, $distribuir_pontos.to_s,0)
end
- Código:
class Window_Status2 < Window_Base
def initialize
super(25,70,350,290)
self.contents = Bitmap.new(width - 32, height - 32)
@dragable = true
@closable = true
self.z = 999999
self.windowskin = RPG::Cache.windowskin("Blank")
self.back_opacity = 200
if User_Edit::DISTRIBUIR_ACTIVE == true
@str = Button.new(self,85, 90, " + ") {str}
@agi = Button.new(self,85, 110, " + ") {agi}
@dex = Button.new(self,85, 130, " + ") {dex}
@int = Button.new(self,85, 150, " + ") {int}
end
refresh
end
def update
super
refresh if something_changed?
end
def on_close
self.visible = false
self.active = false
$fechando_ativar = true
end
def refresh
@actor = $game_party.actors[0]
@old_lvl = @actor.level
@old_gold = $game_party.item_number(Item_Ouro::Item_Id.to_i)
@old_hp = @actor.hp
@old_sp = @actor.sp
@old_exp = @actor.now_exp
@old_maxhp = @actor.maxhp
@old_maxsp = @actor.maxsp
@old_pontos = $distribuir_pontos
@old_str = @actor.str
@old_dex = @actor.dex
@old_int = @actor.int
@old_agi = @actor.agi
self.contents.clear
# Mostra a imagem de fundo
fundo3 = RPG::Cache.picture("FUNDO_MENU")
fundo1 = fundo3.width
fundo2 = fundo3.height
fundo4 = Rect.new(0,0,fundo1,fundo2)
self.contents.blt(0,0,fundo3,fundo4)
# Nome
self.contents.draw_text(60, 5, 200, 32, "#{@actor.name}")
# Level
self.contents.draw_text(170, 128, 100, 32, "#{@actor.level}")
# Guild
self.contents.draw_text(100, 45, 100, 32, $game_party.actors[0].guild)
# Ouro
self.contents.draw_text(170, 148, 100, 32, $game_party.item_number(Item_Ouro::Item_Id.to_i).to_s)
# Cash
self.contents.draw_text(220, 45, 100, 32, $game_variables[9].to_s,0)
# Str
self.contents.draw_text(55, 68, 200, 32, "#{@actor.str}")
# Agi
self.contents.draw_text(55, 88, 200, 32, "#{@actor.agi}")
# Def
self.contents.draw_text(55, 108, 200, 32, "#{@actor.dex}")
# Int
self.contents.draw_text(55, 128, 200, 32, "#{@actor.int}")
# Pontos
if $distribuir_pontos < 0
self.contents.draw_text(75, 148, 200, 32, "0",0)
else
self.contents.draw_text(75, 148, 200, 32, $distribuir_pontos.to_s,0)
end
end
Agora adicionaremos um ponto, como se fosse uma atualização, caso você adicione um ponto em algum atributo, ele já apareça lá mudado.
- Código:
def something_changed?
return true if @old_lvl != @actor.level
return true if @old_gold != $game_party.item_number(Item_Ouro::Item_Id.to_i)
return true if @old_exp != @actor.now_exp
return true if @old_hp != @actor.hp
return true if @old_sp != @actor.sp
return true if @old_maxhp != @actor.maxhp
return true if @old_maxsp != @actor.maxsp
return true if @old_str != @actor.str
return true if @old_dex != @actor.dex
return true if @old_int != @actor.int
return true if @old_agi != @actor.agi
return true if @old_pontos != $distribuir_pontos
return false
end
def str
if $distribuir_pontos >= 1
$distribuir_pontos -= 1
$game_actors[1].str += 1
#$status.refresh
else
#$status.refresh
end
end
def dex
if $distribuir_pontos >= 1
$distribuir_pontos -= 1
$game_actors[1].dex += 1
#$status.refresh
else
#$status.refresh
end
end
def agi
if $distribuir_pontos >= 1
$distribuir_pontos -= 1
$game_actors[1].agi += 1
#$status.refresh
else
#$status.refresh
end
end
def int
if $distribuir_pontos >= 1
$distribuir_pontos -= 1
$game_actors[1].int += 1
#$status.refresh
else
#$status.refresh
end
end
end
Agora novamente acrescentei um outro end no final, mas pra que serve?
Para encerrar a classe. Ou seja fechar o script.
Agora vou deichar alguns códigos adicionais, caso queiram implementar sua hud.
HP
- Código:
# HP\MaxHP
self.contents.draw_text(170, 68, 200, 32, "#{@actor.hp}/#{@actor.maxhp}")
- Código:
# SP\MaxSP
self.contents.draw_text(170, 88, 200, 32, "#{@actor.sp}/#{@actor.maxsp}")
- Código:
# Exp\Pro
self.contents.draw_text(170, 108, 200, 32, "#{@actor.now_exp}/#{@actor.next_exp}")
- Código:
class Window_Status2 < Window_Base
def initialize
super(25,70,350,290)
self.contents = Bitmap.new(width - 32, height - 32)
@dragable = true
@closable = true
self.z = 999999
self.windowskin = RPG::Cache.windowskin("Blank")
self.back_opacity = 200
if User_Edit::DISTRIBUIR_ACTIVE == true
@str = Button.new(self,85, 90, " + ") {str}
@agi = Button.new(self,85, 110, " + ") {agi}
@dex = Button.new(self,85, 130, " + ") {dex}
@int = Button.new(self,85, 150, " + ") {int}
end
refresh
end
def update
super
refresh if something_changed?
end
def on_close
self.visible = false
self.active = false
$fechando_ativar = true
end
def refresh
@actor = $game_party.actors[0]
@old_lvl = @actor.level
@old_gold = $game_party.item_number(Item_Ouro::Item_Id.to_i)
@old_hp = @actor.hp
@old_sp = @actor.sp
@old_exp = @actor.now_exp
@old_maxhp = @actor.maxhp
@old_maxsp = @actor.maxsp
@old_pontos = $distribuir_pontos
@old_str = @actor.str
@old_dex = @actor.dex
@old_int = @actor.int
@old_agi = @actor.agi
self.contents.clear
# Mostra a imagem de fundo
fundo3 = RPG::Cache.picture("FUNDO_MENU")
fundo1 = fundo3.width
fundo2 = fundo3.height
fundo4 = Rect.new(0,0,fundo1,fundo2)
self.contents.blt(0,0,fundo3,fundo4)
# Nome
self.contents.draw_text(60, 5, 200, 32, "#{@actor.name}")
# Level
self.contents.draw_text(170, 128, 100, 32, "#{@actor.level}")
# Guild
self.contents.draw_text(100, 45, 100, 32, $game_party.actors[0].guild)
# Ouro
self.contents.draw_text(170, 148, 100, 32, $game_party.item_number(Item_Ouro::Item_Id.to_i).to_s)
# Cash
self.contents.draw_text(220, 45, 100, 32, $game_variables[9].to_s,0)
# Str
self.contents.draw_text(55, 68, 200, 32, "#{@actor.str}")
# Agi
self.contents.draw_text(55, 88, 200, 32, "#{@actor.agi}")
# Def
self.contents.draw_text(55, 108, 200, 32, "#{@actor.dex}")
# Int
self.contents.draw_text(55, 128, 200, 32, "#{@actor.int}")
# Pontos
if $distribuir_pontos < 0
self.contents.draw_text(75, 148, 200, 32, "0",0)
else
self.contents.draw_text(75, 148, 200, 32, $distribuir_pontos.to_s,0)
end
end
def something_changed?
return true if @old_lvl != @actor.level
return true if @old_gold != $game_party.item_number(Item_Ouro::Item_Id.to_i)
return true if @old_exp != @actor.now_exp
return true if @old_hp != @actor.hp
return true if @old_sp != @actor.sp
return true if @old_maxhp != @actor.maxhp
return true if @old_maxsp != @actor.maxsp
return true if @old_str != @actor.str
return true if @old_dex != @actor.dex
return true if @old_int != @actor.int
return true if @old_agi != @actor.agi
return true if @old_pontos != $distribuir_pontos
return false
end
def str
if $distribuir_pontos >= 1
$distribuir_pontos -= 1
$game_actors[1].str += 1
#$status.refresh
else
#$status.refresh
end
end
def dex
if $distribuir_pontos >= 1
$distribuir_pontos -= 1
$game_actors[1].dex += 1
#$status.refresh
else
#$status.refresh
end
end
def agi
if $distribuir_pontos >= 1
$distribuir_pontos -= 1
$game_actors[1].agi += 1
#$status.refresh
else
#$status.refresh
end
end
def int
if $distribuir_pontos >= 1
$distribuir_pontos -= 1
$game_actors[1].int += 1
#$status.refresh
else
#$status.refresh
end
end
end