#============================================================================== # • Opacity Menu #============================================================================== # Autor: Dax # Versão: 1.0 # Site: www.dax-soft.weebly.com # Requerimento: N/A #============================================================================== # • Descrição: #------------------------------------------------------------------------------ # Um menu que não requer imagens e que tem um efeito opaco. #============================================================================== #============================================================================== # • Módulo de configuração. #============================================================================== module ColiseuSM extend self #---------------------------------------------------------------------------- # • Configurações: #---------------------------------------------------------------------------- def [](setting_key) case setting_key # Velocidade do slide when :slide then 8 # Deixe em números pares; # Configuração das cores when :color then [ "db4242", # Cor primária ativa do status do personagem. "dad7d7", # Cor primária desativa do status do personagem. "f69a9a", # Cor secundária ativa do status do personagem. "f3f3f3", # Cor secundária desativa do status do personagem. "000000", # Cor da barra que ficará o hp e o mp. "737373", # Cor do círculo das opções. ] # Configuração das cores das barras. when :bar_color then [ "eeba7c", # HP, "7cacee", # MP ] # Define logo abaixo os ícones das opções e a descrição das opções; when :item then [ [192, "Abre o inventário de itens."], [232, "Opção para ver as habilidades dos heróis."], [270, "Opção para ver os equipamentos dos heróis."], [233, "Opção para ver a condição dos heróis."], [230, "Opção para salvar o progresso do jogo."], [121, "Opção para sair do jogo."] ] # Define logo abaixo a configuração da fonte. when :font then { name: "Arial", size: 20, bold: false, italic: false, shadow: true, outline: false, color: Color.new(255, 255, 255), out_color: Color.new(0, 0, 0), } end end end #============================================================================== # • Complementos retirados do Dax Core. #============================================================================== # Integer class Integer #---------------------------------------------------------------------------- # * Transformar o valor em porcentagem : Útil para fazer barras como por exemplo # barras de HP. # a : Valor atual. # b : Valor máximo. #---------------------------------------------------------------------------- def to_p(a, b) self * a / b end end # Cores em hexadécimal module ColorBasic def self.hex(value) Color.new(*value.scan(/../).map { |color| color.to_i(16)}) end end # Opacidade na cor. class Color def opacity(alpha=96) self.set(self.red, self.green, self.blue, alpha) end end # Opacity module Opacity extend self @key ||= {} #---------------------------------------------------------------------------- # • Efeito de opacidade + e -. #---------------------------------------------------------------------------- def sprite_opacity(sprite, speed, max, min, hash=nil) hash = hash.nil? ? sprite.__id__ : hash unless @key[hash] sprite.opacity += speed unless sprite.opacity >= max @key[hash] = sprite.opacity >= max else sprite.opacity -= speed unless sprite.opacity <= min @key[hash] = false if sprite.opacity <= min end end end # Add-ons Sprite class Sprite #---------------------------------------------------------------------------- # • Slide pela direita. # * speed : Velocidade | point : Ponto da coordenada X que irá chegar. #---------------------------------------------------------------------------- def slide_right(speed, point) self.x += speed unless self.x >= point end end # add-on Bitmap. class Bitmap #---------------------------------------------------------------------------- # • draw_icon(icon_index, x, y, enabled) # icon_index : ID do ícone. # x : Coordenadas X. # y : Coordenadas Y. # enabled : Habilitar flag, translucido quando false #---------------------------------------------------------------------------- #---------------------------------------------------------------------------- def draw_icon(icon_index, x, y, enabled = true) icon_index = icon_index.nil? ? 0 : icon_index bitmap = Cache.system("Iconset") rect = Rect.new(icon_index % 16 * 24, icon_index / 16 * 24, 24, 24) self.blt(x, y, bitmap, rect, enabled ? 255 : 128) end #-------------------------------------------------------------------------- # • Desenho do gráfico de rosto # face_name : nome do gráfico de face # face_index : índice do gráfico de face # x : coordenada X # y : coordenada Y # enabled : habilitar flag, translucido quando false #-------------------------------------------------------------------------- def draw_face(face_name, face_index, x, y, enabled = true) bitmap = Cache.face(face_name) rect = Rect.new(face_index % 4 * 96, face_index / 4 * 96, 96, 96) self.blt(x, y, bitmap, rect, enabled ? 255 : 128) end #-------------------------------------------------------------------------- # • Desenho do gráfico de face do herói # actor : herói # x : coordenada X # y : coordenada Y # enabled : habilitar flag, translucido quando false #-------------------------------------------------------------------------- def draw_actor_face(actor, x, y, enabled = true) draw_face(actor.face_name, actor.face_index, x, y, enabled) end #---------------------------------------------------------------------------- # • Para o menu.. #---------------------------------------------------------------------------- def fill_status_menu(id, active=false) b = [] actor = $game_party.members[id] (0...128).each { |i| self.gradient_fill_rect(self.rect, ColorBasic.hex(ColiseuSM[:color][active ? 0 : 1]).opacity(i), ColorBasic.hex(ColiseuSM[:color][active ? 2 : 3]).opacity(i-255), 1) } ["name", "size", "bold", "italic", "shadow", "outline", "color"].each { |i| eval("self.font.#{i} = ColiseuSM[:font][:#{i}]")} self.draw_text(0, 10, self.width, 20, actor.name, 1) self.draw_text(0, 30, self.width, 20, actor.class.name, 1) self.draw_actor_face(actor, (self.width - 96)/2, 60) [170, 200].each_with_index { |y,i| self.fill_rect((self.width-96)/2, y, 96, 20, ColorBasic.hex(ColiseuSM[:color][4]).opacity(186)) b[i] = Bitmap.new(96, 20) b[i].fill_rect(1, 1, b[i].width-2, b[i].height-2, ColorBasic.hex(ColiseuSM[:bar_color][i])) eval("self.blt((self.width-96)/2, y, b[i], Rect.new(0,0, b[i].width.to_p(actor.#{["hp", "mp"][i]}, actor.m#{["hp", "mp"][i]}), b[i].height)) self.draw_text((self.width-96)/2, y+1, 96, 20, actor.#{["hp", "mp"][i]}.to_s + '/' + actor.m#{["hp", "mp"][i]}.to_s, 1)") } end #---------------------------------------------------------------------------- # • Desenhar um círuclo preenchido. #---------------------------------------------------------------------------- def fill_circle(x, y, r, c) rr = r*r for i in 0...r adj = Math.sqrt(rr - (i*i)).ceil xd = x - adj wd = 2 * adj self.fill_rect(xd, y-i, wd, 1, c) self.fill_rect(xd, y+i, wd, 1, c) end end end #============================================================================== # • Descrição das opções do menu. #============================================================================== class Sprite_Desc_Option_Menu < Sprite attr_accessor :text def initialize text super(nil) self.bitmap = Bitmap.new(544, 20) self.y = Graphics.height - 21 ["name", "size", "bold", "italic", "shadow", "outline", "color"].each { |i| eval("self.bitmap.font.#{i} = ColiseuSM[:font][:#{i}]")} self.bitmap.draw_text(self.bitmap.rect, @text, 1) self.z = 500 end #---------------------------------------------------------------------------- # • Renovação dos objetos. #---------------------------------------------------------------------------- def dispose self.bitmap.dispose super end #---------------------------------------------------------------------------- # • Atualização dos objetos. #---------------------------------------------------------------------------- def update self.bitmap.clear super Opacity.sprite_opacity(self, 2, 255, 128) ["name", "size", "bold", "italic", "shadow", "outline", "color"].each { |i| eval("self.bitmap.font.#{i} = ColiseuSM[:font][:#{i}]")} self.bitmap.draw_text(self.bitmap.rect, @text, 1) end end #============================================================================== # • Status dos do personagens do menu.... #============================================================================== class Sprite_Status_Menu < Sprite #---------------------------------------------------------------------------- # • Variáveis... #---------------------------------------------------------------------------- attr_accessor :active #---------------------------------------------------------------------------- # • Inicialização dos objetos. #---------------------------------------------------------------------------- def initialize(actor_id) super(nil) self.bitmap = Bitmap.new(112, Graphics.height) @old_active = @active = false self.bitmap.fill_status_menu(actor_id, @active) @id = actor_id end #---------------------------------------------------------------------------- # • Renovação dos objetos. #---------------------------------------------------------------------------- def dispose self.bitmap.dispose super end #---------------------------------------------------------------------------- # • Atualização dos objetos. #---------------------------------------------------------------------------- def update super self.slide_right(ColiseuSM[:slide], @id == 0 ? 45 : (112 * @id) + 45) unless @old_active == @active self.bitmap.clear self.bitmap.fill_status_menu(@id, @active) @old_active = @active end end end #============================================================================== # • Sprite_Circle_Icon_Menu #============================================================================== class Sprite_Circle_Icon_Menu < Sprite #---------------------------------------------------------------------------- # • Variáveis... #---------------------------------------------------------------------------- attr_accessor :active #---------------------------------------------------------------------------- # • Inicialização dos objetos. #---------------------------------------------------------------------------- def initialize(x, y, icon_id) super(nil) self.x, self.y, self.z = x - 32, y - 32, 250 @y = self.y @active = false self.bitmap = Bitmap.new(128, 128) self.bitmap.fill_circle(32, 32, 32, ColorBasic.hex(ColiseuSM[:color][5]).opacity(224)) self.bitmap.draw_icon(icon_id, 20, 20) end #---------------------------------------------------------------------------- # • Renovação dos objetos. #---------------------------------------------------------------------------- def dispose self.bitmap.dispose super end #---------------------------------------------------------------------------- # • Atualização dos objetos. #---------------------------------------------------------------------------- def update super unless @active self.opacity = 255 self.y = @y else Opacity.sprite_opacity(self, 3, 255, 128) self.y = @y - 16 end end end #============================================================================== # • Scene Menu #============================================================================== Object.send(:remove_const, :Scene_Menu) class Scene_Menu < Scene_Base #---------------------------------------------------------------------------- # • Inicialização dos objetos. #---------------------------------------------------------------------------- def start super @s = [] @i = [] @index = 0 @sindex = 0 @background_sprite = Sprite.new @background_sprite.bitmap = SceneManager.background_bitmap @background_sprite.color.set(16, 16, 16, 128) $game_party.members.size.times { |i| @s[i] = Sprite_Status_Menu.new(i) unless i > 3 } ColiseuSM[:item].size.times { |i| @i[i] = Sprite_Circle_Icon_Menu.new(96 + (70 * i), Graphics.height - 64, ColiseuSM[:item][i][0]) } @text = Sprite_Desc_Option_Menu.new(ColiseuSM[:item][@index][1]) @status = false end #---------------------------------------------------------------------------- # • Renovação dos objetos. #---------------------------------------------------------------------------- def terminate super @s.each(&:dispose) @i.each(&:dispose) @text.dispose end #---------------------------------------------------------------------------- # • Atualização dos objetos. #---------------------------------------------------------------------------- def update super return_scene if Input.trigger?(:B) and !@status @s.each(&:update) @i.each(&:update) @text.update @text.text = ColiseuSM[:item][@index][1] Sound.play_cursor if Input.trigger?(:RIGHT) or Input.trigger?(:LEFT) unless @status @s.each{|i|i.active=false} @index = @index >= 5 ? 0 : @index.next if Input.trigger?(:RIGHT) @index = @index <= 0 ? 5 : @index - 1 if Input.trigger?(:LEFT) @i[@index].active = true @i.size.times { |o| next if @index == o @i[o].active = false } case @index when 0 then SceneManager.call(Scene_Item) if Input.trigger?(:C) when 1..3 then @status = Input.trigger?(:C) when 4 then SceneManager.call(Scene_Save) if Input.trigger?(:C) when 5 then SceneManager.call(Scene_End) if Input.trigger?(:C) end else @status = false if Input.trigger?(:B) @sindex = @sindex >= @s.size-1 ? 0 : @sindex.next if Input.trigger?(:RIGHT) @sindex = @sindex <= 0 ? @s.size-1 : @sindex - 1 if Input.trigger?(:LEFT) @s[@sindex].active = true @s.size.times { |o| next if @sindex == o @s[o].active = false } $game_party.menu_actor = $game_party.members[@sindex] SceneManager.call(Scene_Equip) if @index == 1 and Input.trigger?(:C) SceneManager.call(Scene_Skill) if @index == 2 and Input.trigger?(:C) SceneManager.call(Scene_Status) if @index == 3 and Input.trigger?(:C) end end end