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


2 participantes

    Criando uma Scene_Status (básica)

    Hatsuki Morturo
    Hatsuki Morturo
    Experiente
    Experiente


    Mensagens : 401
    Créditos : 50

    Criando uma Scene_Status (básica) Empty Criando uma Scene_Status (básica)

    Mensagem por Hatsuki Morturo Seg Ago 15, 2011 2:51 pm

    Criando uma Scene_Status (básica) 9KoKC
    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.
    Criando uma Scene_Status (básica) DCZdu

    Criando uma Scene_Status (básica) QyGbo
    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.
    Criando uma Scene_Status (básica) DCZdu

    Criando uma Scene_Status (básica) GS62u
    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}")
    [center]Agora adicionaremos os pontos, ou seja, faremos com que os pontos apareçam na status.
    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
    [center]Nosso scrip ficou assim:
    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
    [center]Vocês notaram que adicionei um segundo end, no final, esse end, fecha a refresh.
    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}")
    MP
    Código:
        # SP\MaxSP
        self.contents.draw_text(170, 88, 200, 32, "#{@actor.sp}/#{@actor.maxsp}")
    Exp
    Código:
        # Exp\Pro
        self.contents.draw_text(170, 108, 200, 32, "#{@actor.now_exp}/#{@actor.next_exp}")
    É só isso gente... Bom, o nosso script deve ter ficado desse modo:
    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
    Nota: O Script está 100% funcional, testei aqui em casa antes de postar.


    _________________
    Criando uma Scene_Status (básica) Asd10

    Criando uma Scene_Status (básica) Fabar10
    Gabriel Lenz
    Gabriel Lenz
    Desenvolvedor
    Desenvolvedor


    Mensagens : 660
    Créditos : 20

    Criando uma Scene_Status (básica) Empty Re: Criando uma Scene_Status (básica)

    Mensagem por Gabriel Lenz Seg Ago 15, 2011 6:28 pm

    Muito bom,
    +1 Crédito.
    Vou testar aqui já dou Edit.
    @Edit: Funcionou. :)
    Tem como postar uma imagem(fundo) de base ?
    Hatsuki Morturo
    Hatsuki Morturo
    Experiente
    Experiente


    Mensagens : 401
    Créditos : 50

    Criando uma Scene_Status (básica) Empty Re: Criando uma Scene_Status (básica)

    Mensagem por Hatsuki Morturo Seg Ago 15, 2011 6:42 pm

    Depois vou postar, é porque to fora de casa...
    Meu celular não tem ps cs5.


    _________________
    Criando uma Scene_Status (básica) Asd10

    Criando uma Scene_Status (básica) Fabar10
    Gabriel Lenz
    Gabriel Lenz
    Desenvolvedor
    Desenvolvedor


    Mensagens : 660
    Créditos : 20

    Criando uma Scene_Status (básica) Empty Re: Criando uma Scene_Status (básica)

    Mensagem por Gabriel Lenz Seg Ago 15, 2011 6:46 pm

    Você fez o tutorial pelo celular ? o.O
    Hatsuki Morturo
    Hatsuki Morturo
    Experiente
    Experiente


    Mensagens : 401
    Créditos : 50

    Criando uma Scene_Status (básica) Empty Re: Criando uma Scene_Status (básica)

    Mensagem por Hatsuki Morturo Seg Ago 15, 2011 7:14 pm

    Não não, eu fiz em casa dai eu sai, ai to mechendo pelo cel.


    _________________
    Criando uma Scene_Status (básica) Asd10

    Criando uma Scene_Status (básica) Fabar10
    Gabriel Lenz
    Gabriel Lenz
    Desenvolvedor
    Desenvolvedor


    Mensagens : 660
    Créditos : 20

    Criando uma Scene_Status (básica) Empty Re: Criando uma Scene_Status (básica)

    Mensagem por Gabriel Lenz Ter Ago 16, 2011 6:37 pm

    Ei Hatsuki, pode postar uma imagem Base ?
    Hatsuki Morturo
    Hatsuki Morturo
    Experiente
    Experiente


    Mensagens : 401
    Créditos : 50

    Criando uma Scene_Status (básica) Empty Re: Criando uma Scene_Status (básica)

    Mensagem por Hatsuki Morturo Qua Ago 17, 2011 12:28 pm

    Cara, agora que olhei com mais atenção, não precisa de imagem, é só alterar essa linha:
    Código:
    self.windowskin = RPG::Cache.windowskin("Blank")
    Substitua-a por esta:
    Código:
    self.windowskin = RPG::Cache.windowskin("WindskinA")


    _________________
    Criando uma Scene_Status (básica) Asd10

    Criando uma Scene_Status (básica) Fabar10
    Gabriel Lenz
    Gabriel Lenz
    Desenvolvedor
    Desenvolvedor


    Mensagens : 660
    Créditos : 20

    Criando uma Scene_Status (básica) Empty Re: Criando uma Scene_Status (básica)

    Mensagem por Gabriel Lenz Qua Ago 17, 2011 6:19 pm

    Mas tipo, como a pessoa vai saber, o que é o que ?
    Spoiler:
    Hatsuki Morturo
    Hatsuki Morturo
    Experiente
    Experiente


    Mensagens : 401
    Créditos : 50

    Criando uma Scene_Status (básica) Empty Re: Criando uma Scene_Status (básica)

    Mensagem por Hatsuki Morturo Qua Ago 17, 2011 6:30 pm

    Código:
        # 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
    Cara eu ensinei como criar uma Scene_Login, não é preciso eu ensinar como colocar um nome... Mas mesmo assim, para colocar o nome, basta adicionar o seguinte código:
    Código:
    self.contents.draw_text(170, 148, 100, 32, "Palavra")
    Dai você ajusta a posição junto a do iten, e sobre os itens, basta olhar seu nome, tipo o primeiro iten, é o nome, o segundo é a guild, é só olhar no script que mostra tudo.


    _________________
    Criando uma Scene_Status (básica) Asd10

    Criando uma Scene_Status (básica) Fabar10

    Conteúdo patrocinado


    Criando uma Scene_Status (básica) Empty Re: Criando uma Scene_Status (básica)

    Mensagem por Conteúdo patrocinado


      Data/hora atual: Dom maio 19, 2024 4:23 pm