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

Gerador de Sanguinolência

Iniciado por Raizen, 16/12/2012 às 17:21



Gerador de Sanguinolência


Informações sobre o sistema

Nome: Gerador de Sanguinolência
Autor: Madajuv


  • Incompatibilidade: Nula ¹
  • Lag gerado: Depende ²
  • Customizável: Sim
  • Requer Recursos Extras: Não
[box class=catbg2]
Resumo
[/box][box class=catbg4]  Adiciona um efeito visual simples ao jogo. Quando você quiser, através de um comando, pulam gotas de sangue de um evento ou do personagem, a quantidade e o quanto elas se espalham é definida no comando, elas caem no chão e depois podem ou não sumir de acordo com o que você definir. Na verdade é um simples sistema de partículas voltado para jogos de ação.[/box]


[box class=catbg2]
Descrição Detalhada
[/box]

Script originalmente criado para o mini-jogo Malditos Herois e depois readaptado para ser usável em qualquer projeto, aparecendo na demo do Sistema de Tiro Cristianoforce. Ele basicamente cria um efeito de "espirro" de sangue, que são partículas de tons variados de vermelho que saem de um evento ou do jogador e depois ficam no chão do mapa. Você configura se as partículas somem ou se elas ficam lá até o jogador sair do mapa, se você quiser que elas sumam dá para definir quantos segundos elas ficam no chão.

Para usá-lo copie o código e cole acima do main, e no jogo use o comando de script:
# $scene.sangrar(evento, quantidade, disperção(opicional))
# -> evento = O evento que sangra, se você tive o ID, pode usar:
#    $game_map.events[ID]
# -> quantidade = Número de partículas de sangue
# -> disperção = O quanto o sangue se espalha (1 ou nada é a padrão)

Exemplos:
# Evento de ID 2, 60 partículas com 2 de disperção
# $scene.sangrar($game_map.events[2], 60, 2)
#
# Evento de ID 5, 10 partículas, disperção padrão
# $scene.sangrar($game_map.events[5], 10)
#
# Heroi, 40 partículas, 0.7 de disperção:
# $scene.sangrar($game_player, 10, 0.7)


OBS: O efeito varia de acordo com a direção que o evento está olhando. Disperção aceita valores decimais.




Detalhes da V 1.1:


  • Os comandos para usar o script foram facilitados, cheque o cabeçalho do script.
  • Adicionado o modo de teste, cheque a parte de edição do módulo do script.
  • Cor das partículas personalizadas.
  • Aceleração vertical das partículas personalizado
  • Compatibilidade com o XAS HERO (testado na versão 3.82 apenas), cheque a parte de edição do módulo do script.


[box class=catbg2]
Screenshots
[/box]

Não dá para perceber muito bem o efeito pelas screens, pois é algo que depende muito da animação, mas aí estão elas:
Spoiler
[close]
Spoiler
[close]
Spoiler
[close]

[box class=catbg2]
Código
[/box]
#==================================================================
# Gerador de Sanguinolência v 1.1
# Autor: Madajuv
#==================================================================
# Dá um toque sanguinário ao seu ABS ou sistema por eventos...
#--------------------
# Log
#--------------------
# V 1.0:
# -> Base do sistema
# -> Partículas vermelhas
# -> Disperção horizontal personalizada
# -> Opção de fade out com controle de tempo
# -> Eventos ou personagem
#
# V 1.1:
# -> Tudo da V 1.0
# -> Compatibildade com XAS (Testado somente com o 3.82)
# -> Opção de cor
# -> Controle da aceleração vertical das partículas
# -> Modo de teste
# -> Comandos mais fáceis para usarem o sistema
#
#------------------------------------------------------------------
# INSTRUÇÕES PARA EVENTERS:
#------------------------------------------------------------------
# Para sangrar:
#--------------------
#
# Dentro de um evento, em chamar script use:
#
# Para fazer o próprio evento sangrar:
# sangre_me(quantidade, disperção(opicional), aceleração vertical(opicional), cor(opicional))
#
# Para fazer outros eventos ou o personagem sangrar:
# sangrar(evento, quantidade, disperção(opicional), aceleração vertical(opicional), cor(opicional))
# Onde evento pode ser um número negativo, 0, ou um número positivo:
# 
# Negativo: Quem sangra é o personagem
# Zero: Quem sangra é o evento que fez o comando
# Positivo: Quem sangra é o evento com o ID do número positivo que você passou
#
#--------------------
# Método Alternativo
#--------------------
#
# Dentro de um evento, em mover evento, no comando chamar script use:
#
# sangrar(quantidade, disperção(opicional), aceleração vertical(opicional), cor(opicional))
#
# O evento que sangra é o evento escolhido para realizar o movimento.
#
#--------------------
# Parâmetros
#--------------------
# -> quantidade = Número de partículas de sangue
# -> disperção = O quanto o sangue se espalha horizontalmente (1 é o padrão)
# -> aceleração vertical = a aceleração que o sangue voa para cima
#                          (o padrão é 2.5)
# -> cor = Uma cor base para as partículas, as cores das partículas
#          irão variar em cima dessa cor. (vermelho (150, 0, 0) é o padrão)
#
#--------------------
# Exemplos de uso:
#--------------------
# Evento de ID 2, 60 partículas com 2 de disperção, 
# aceleração vertical padrão e cor padrão:
# sangrar(2, 60, 2)
#
# Evento de ID 5, 10 partículas, disperção padrão
# sangrar(5, 10)
#
# Heroi, 40 partículas, 0.7 de disperção,
# aceleração vertical de 5.9 e cor azul:
# sangrar(-1, 10, 0.7, 5.9, Color.new(0, 0, 150))
# 
#------------------------------------------------------------------
# INSTRUÇÕES PARA SCRIPTERS:
#------------------------------------------------------------------
#
# O comando "direto" para sangrar é:
# $scene.sangrar(evento, quantidade, disperção(opicional), aceleração vertical(opicional), cor(opicional))
# -> evento = O objeto do character que sangra, se você tive o ID, pode usar:
#    $game_map.events[ID]
# -> quantidade = Número de partículas de sangue
# -> disperção = O quanto o sangue se espalha horizontalmente (1 é a padrão)
# -> aceleração vertical = a aceleração que o sangue voa para cima
#                          (o padrão é 2.5)
# -> cor = Uma cor base para as partículas, as cores das partículas
#          irão variar em cima dessa cor. (vermelho (150, 0, 0) é o padrão)
#
# Exemplos:
#
# Evento de ID 2, 60 partículas com 2 de disperção
# $scene.sangrar($game_map.events[2], 60, 2)
#
# Evento de ID 5, 10 partículas, disperção padrão
# $scene.sangrar($game_map.events[5], 10)
#
# Heroi, 40 partículas, 0.7 de disperção:
# $scene.sangrar($game_player, 10, 0.7)
#
#------------------------------------------------------------------
# Agradecimento:
#------------------------------------------------------------------
# Ao Kyo Panda pela ideia e base do código de facilitar os
# comandos para usar o script.
#
# Ao ManiacClown pela ideia de poder personalizar a cor
#
# Ao ShodaimeDarkage pela ideia de controlar a aceleração vertical
#
#==================================================================
# Edite aqui:
#------------------------------------------------------------------
module Mada
  # Dar fade no sangue?
  GS_Fade = true
  # Quantos segundos depois de aparecer na tela?
  GS_temp = 4
  # Você está usando o XAS HERO no seu projeto
  # e quer que o sistema se ative automaticamente
  # quando algum monstro ou o personagem receber dano?
  GS_XAS = false # true = sim / false = não
  # O seu jogo está em fase de testes?
  # Ligar essa opção faz você receber um aviso se você pedir
  # para um evento que não exista sangrar e evita "crash" no jogo.
  GS_Teste_Seg = true
end
#------------------------------------------------------------------
# Fim da edição
#==================================================================


class Particula_Sangue < RPG::Sprite
  def initialize(character, viewport, disp, vel_y, color)
    super(viewport)
    @character = character
    self.x = @character.screen_x
    self.y = @character.screen_y
    self.z = @character.screen_z
    self.z += @character.direction == 8 ? 0 : 10
    @chao = false
    if @character.direction == 4
      @accel_x = disp.to_f*(rand(20))/10
    elsif @character.direction == 6
      @accel_x = disp.to_f*(0 - rand(20))/10
    else
      @accel_x = disp.to_f*(-16 + rand(32))/10
    end
    @cont_y = vel_y*(-10 - rand(20))/10
    @desacel_y = 0.05*@cont_y
    @origem = [@character.real_x, @character.real_y]
    @coord = [0.00, -10.00]
    self.bitmap = desenhar(color.clone)
    self.ox = 1
    self.oy = 1
    if Mada::GS_temp
      @tempo = Mada::GS_temp*40
    end
  end
  
  def desenhar(color)
    color.red = [[color.red + rand(color.red/3), 0].max, 255].min
    color.green = [[color.green + rand(color.green/3), 0].max, 255].min
    color.blue = [[color.blue + rand(color.blue/3), 0].max, 255].min
    bit = Bitmap.new(3, 3)
    3.times do
      bit.set_pixel(rand(3), rand(3), color)
    end
    return bit
  end
  
  def update
    if !@chao
      self.opacity -= 2
      self.angle += 15
      @coord[0] += @accel_x
      @cont_y -= @desacel_y
      @coord[1] += @cont_y
      if @coord[1] > -10.0
        @coord[1] += rand(17) - 8
        @chao = true
      end
    else
      if @tempo != nil
        if @tempo == 0
          self.opacity -= 1
        else
          @tempo -= 1
        end
      end
    end
    self.x = screen_x(@origem[0]) + @coord[0]
    self.y = screen_y(@origem[1]) + @coord[1]
  end

  def screen_x(rx)
    return (rx - $game_map.display_x + 3) / 4 + 16
  end
  
  def screen_y(ry)
    return (ry - $game_map.display_y + 3) / 4 + 32
  end  
end
    
class Spriteset_Map
  alias mad_gs_sm_i initialize
  def initialize
    @particulas_sangue = []
    mad_gs_sm_i
  end
  alias mad_gs_sm_d dispose
  def dispose
    mad_gs_sm_d
    @particulas_sangue.each {|i| i.dispose}
  end
  alias mad_gs_sm_u update
  def update
    mad_gs_sm_u
    for i in 0...@particulas_sangue.size
      @particulas_sangue[i].update
      if @particulas_sangue[i].opacity == 0
        @particulas_sangue[i].dispose
        @particulas_sangue[i] = nil
      end
    end
    @particulas_sangue.compact!
  end
  
  def sangrar(char, qnt, disp, vel_y, color)
    qnt.times do
      @particulas_sangue.push(Particula_Sangue.new(char, @viewport1, disp, vel_y, color))
    end
  end
end

class Scene_Map
  def sangrar(evento, qnt, disp=1, vel_y=2.5, color=Color.new(150, 0, 0))
    @spriteset.sangrar(evento, qnt, disp, vel_y, color)
  end
end

#============================================================================
# Comandos facilitados para o uso do script
#
# Agradecimento ao Kyo Panda pela ideia e pela base do código.
#============================================================================

class Interpreter
  def sangrar(event, quantity, size=1, acel=2.5, color=Color.new(150, 0, 0))
    if event.is_a?(Integer)
      if event < 0
        $scene.sangrar($game_player, quantity, size, acel, color)
      elsif event < 1
        sangre_me(quantity, size, acel, color)
      else
        if Mada::GS_Teste_Seg
          if $game_map.events[event].nil?
            print("O evento que você pediu para sangrar através\n do script \"Gerador de Sanguinolência\" não existe!\n Verifique o evento que chamou este comando.")
            return
          end
        end
        $scene.sangrar($game_map.events[event], quantity, size, acel, color)
      end
    else
      $scene.sangrar(event, quantity, size, acel, color)
    end
  end
  def sangre_me(quantity, size=1, acel=2.5, color=Color.new(150, 0, 0))
    $scene.sangrar($game_map.events[@event_id], quantity, size, acel, color)
  end
end 

class Game_Character
  def sangrar(quantity, size=1, acel=2.5, color=Color.new(150, 0, 0))
    $scene.sangrar(self, quantity, size, acel, color)
  end
end

#===============================================================
# Compatibilidade com o XAS HERO
#===============================================================

if Mada::GS_XAS

class Sprite_Character < RPG::Sprite
  def damage(value, critical, state, item)
    $scene.sangrar(@character, value)
    super(value, critical, state, item)
  end
end

end

#===============================================================



Qualquer problema, dúvida ou o que for, é só postar ;D




¹ Critério avaliado de forma pessoal, baseada em experiência própria com scripts... A informação pode estar errada. Se o script estiver dando erro de compatibilidade tente colocá-lo mais abaixo na lista de scripts, mais próximo do main.
² Caso você use a configuração de que as gotas de sangue sumam com o tempo o script gera menos lag, se você fizer que as gotas são permanentes (somem somente quando sai do mapa) dependendo da quantidade e do computador pode haver um pouco de lag.