O TEMA DO FÓRUM ESTÁ EM MANUTENÇÃO. FEEDBACKS AQUI: ACESSAR

Minimalistic HUD

Iniciado por M3T, 26/05/2017 às 01:35

Minimalistic HUD
Autor: M3T


Introdução
Esse é mais um script de HUD. Dessa vez, é uma HUD minimalista, só mostra a HP e a MP graficamente (sem quantias), mas a barra de HP tem 2 efeitos interessantes. Um deles é o "mostrador" de diferença, cada vez que você toma dano, a HP que você perdeu fica branca e essa parte branca vai diminuindo até encostar na sua HP. O outro é um divisor, parecido com o presente no Dota 2, que simplesmente divide a barra de HP em uma quantidade configurável.




Instruções de uso
Copie e cole o script na seção de scripts adicionais de seu projeto. Configure à gosto, a configuração está comentada. Não precisa de imagens extras.


Script
#====================================================================#
# Minimalistic HUD - by M3T (18/05/2017)
# v1.0
# Esse script cria uma HUD extremamente simples, com dois efeitos para
# a barra de HP:
# - Quando o personagem toma dano, a diferença fica em branco (por
#   padrão) e vai diminuindo até sumir;
# - Ela é dividida em uma quantidade configurável de HP (por padrão,
#   500), parecido com a barra de HP do Dota 2.
#====================================================================#
# Para habilitar a hud, chame esse script:
#     $game_system.shud = true
# Para desabilitar:
#     $game_system.shud = false
# --------------------------------------------------------------------
# Para desabilitar o botão de ligar/desligar a HUD:
#     $game_system.shud_button = false
# Para habilitá-lo novamente:
#     $game_system.shud_button = true
#====================================================================#

module MHUD_Options
  PARTY_ACTOR   = 0   # ID do herói na party, 0 é o primeiro
  BAR_X         = 10  # posição X na tela
  BAR_Y         = 10  # posição Y na tela
  BAR_WIDTH     = 100 # comprimento das HUD
  BAR_HEIGHT    = 10  # altura da barra de HP
  MPBAR_HEIGHT  = 6   # altura da barra de MP
  HPMP_SPACING  = 2   # espaço entre as duas barras
  DESCEND_RATE  = 1   # taxa de redução do HP (padrão: 1), deve ser nº inteiro
  DIVISION_EACH = 500 # HP de cada divisão
  TOGGLE_BUTTON = Input::L # botão que liga/desliga a HUD
  DEFAULT_SHOW  = true # mostrar a hud por padrão (true = sim, false = não)
  COLOR_BORDER  = Color.new(0,   0,   0,   255) # cor da borda
  COLOR_HP      = Color.new(0,   255, 0,   255) # cor do HP
  COLOR_MP      = Color.new(0,   0,   255, 255) # cor do MP
  COLOR_DIFF    = Color.new(255, 255, 255, 255) # cor da diferença de HP
  COLOR_BACK    = Color.new(160, 160, 160, 255) # cor de fundo
end

class Sprite_SHUD < Sprite
  include MHUD_Options
  def initialize
    @char = $game_party.members[PARTY_ACTOR]
    @maxhp = @char.mhp
    @hp = @char.hp
    @diff_hp_size = 0
    super()
    self.x = BAR_X
    self.y = BAR_Y
    self.z = 100
    self.bitmap = Bitmap.new(BAR_WIDTH+2, BAR_HEIGHT+2+HPMP_SPACING+MPBAR_HEIGHT+2)
    refresh
  end
  
  def refresh
    # atualizar os valores
    @hp = @char.hp
    @maxhp = @char.mhp
    @mp = @char.mp
    @maxmp = @char.mmp
    # limpar o bitmap
    self.bitmap.clear
    # desenhar bordas
    self.bitmap.fill_rect(0, 0, BAR_WIDTH + 2, BAR_HEIGHT + 2, COLOR_BORDER)
    mp_y = BAR_HEIGHT + 2 + HPMP_SPACING
    self.bitmap.fill_rect(0, mp_y, BAR_WIDTH + 2, MPBAR_HEIGHT + 2, COLOR_BORDER)
    # calcular tamanho da nova barra de HP
    new_hp_size = (BAR_WIDTH*@hp.to_f/@maxhp.to_f).round
    # calcular diferença (se houver) da última barra de HP
    if @hp_size && new_hp_size < @hp_size
      @diff_hp_size += (@hp_size||new_hp_size) - new_hp_size
    elsif @diff_hp_size > 0
      if @hp == @maxhp
        @diff_hp_size = 0
      elsif new_hp_size > @hp_size
        @diff_hp_size -= new_hp_size - @hp_size
        @diff_hp_size = 0 if @diff_hp_size < 0
      end
    end
    @hp_size = new_hp_size
    # desenhar HP
    self.bitmap.fill_rect(1, 1, @hp_size, BAR_HEIGHT, COLOR_HP)
    # desenhar divisões
    if @hp > DIVISION_EACH
      # espaço entre cada divisão
      division_rate = (BAR_WIDTH*DIVISION_EACH.to_f/@maxhp.to_f)
      i = 1
      while i * DIVISION_EACH <= @hp
        self.bitmap.fill_rect(1+i*division_rate, 1, 1, BAR_HEIGHT, COLOR_BORDER)
        i+=1
      end
    end
    # desenhar diferença da última HP
    self.bitmap.fill_rect(1+@hp_size, 1, @diff_hp_size, BAR_HEIGHT, COLOR_DIFF)
    remaining = BAR_WIDTH-@hp_size-@diff_hp_size
    # desenhar fundo do HP
    self.bitmap.fill_rect(1+@hp_size+@diff_hp_size, 1, remaining, BAR_HEIGHT, COLOR_BACK)
    # desenhar MP
    mp_size = (BAR_WIDTH*@mp.to_f/@maxmp.to_f).round
    self.bitmap.fill_rect(1, 1+mp_y, mp_size, MPBAR_HEIGHT, COLOR_MP)
    # desenhar fundo do MP
    self.bitmap.fill_rect(1+mp_size, 1+mp_y, BAR_WIDTH-mp_size, MPBAR_HEIGHT, COLOR_BACK)
  end
  
  def update
    super
    @char = $game_party.members[PARTY_ACTOR]
    # refrescar apenas se mudou algum valor fundamental no herói
    refresh if @hp != @char.hp || @maxhp != @char.mhp || @mp != @char.mp || @maxmp != @char.mmp
    # se ainda há uma barra de diferença
    if @diff_hp_size > 0
      # taxa que a barra decresce
      rate = BAR_WIDTH * DESCEND_RATE / 60
      rate = 1 if rate == 0
      @diff_hp_size -= rate
      # certificar-se de que não ficou negativo
      if @diff_hp_size < 0
        size = rate + @diff_hp_size
        @diff_hp_size = 0
      else
        size = rate
      end
      # "remover" parte da barra de diferença
      self.bitmap.fill_rect(1+@hp_size+@diff_hp_size, 1, size, BAR_HEIGHT, COLOR_BACK)
    end
  end
end

class Game_System
  attr_accessor :shud
  attr_accessor :shud_button
  alias spritehp_initialize initialize
  def initialize
    # hud on/off
    @shud = MHUD_Options::DEFAULT_SHOW
    # botão on/off
    @shud_button = true
    spritehp_initialize
  end
end

class Scene_Map
  alias spriteshud_main main
  def main
    # criar HUD se ativada
    @sprite_shud = Sprite_SHUD.new if $game_system.shud
    spriteshud_main
    # deletar HUD se existente
    @sprite_shud.dispose if @sprite_shud != nil
  end
  
  alias spriteshud_update update
  def update
    if $game_system.shud_button && Input.trigger?(MHUD_Options::TOGGLE_BUTTON)
      # ativar/desativar
      $game_system.shud = (!$game_system.shud)
    end
    if !$game_system.shud && @sprite_shud != nil
      # deletar se existente e off
      @sprite_shud.dispose
      @sprite_shud = nil
    end
    if $game_system.shud && @sprite_shud == nil
      # criar se não-existente e on
      @sprite_shud = Sprite_SHUD.new
    end
    # atualizar se existente
    @sprite_shud.update if @sprite_shud != nil
    spriteshud_update
  end
end

Que da hora mano o efeito dessa barrinha e da divisão! perfeito

só não posso testar pq não tenho o Vx.

Mas se algum dia alguém converter pra Mv amaria usar :ded: :lol:





ficou bom cara :clap:
pena q tbm não uso o vx, só o MV =/
: Intel Xeon E3-1225 v3 3.20GHz | Nvidia K2000 2GB GDDR5 | RAM 8GB DDR3 1600GHz | SeaGate Blue 2TB
O Mega Drive Nunca Morrerá em Nossos Corações.

Projeto Leyria RPG para SEGA Mega Drive/Pc