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

Aumentar tamanho da target do evento (Sistema ABS)

Iniciado por andrewzoka, 06/07/2017 às 19:16

06/07/2017 às 19:16 Última edição: 06/07/2017 às 20:05 por andrewzoka
Uma imagem pra explicar melhor! OBS: é para sistema ABS. Abaixo temos dois eventos: Um tamanho normal e um com zoom (daqueles scripts que aumenta o tamanho da sprite).
A parte branca, é o desenho da sprite ao todo, já o ponto azul, é onde eu  vou conseguir acertar, causando então dano ao inimigo. Isso porque no sistema normal da engine o personagem anda frames por frames (quadrado por quadrado). Na outra, temos o ponto branco aumentado (com zoom) e o ponto azul que é onde se eu acertar o inimigo ele toma hit. Quando usamos script de zoom, o ponto azul fica do mesmo tamanho, dificultando então eu acertar o inimgo usando o sistema ABS, tenho que estar exatamente na linha como se o evento estivesse pequeno. Se eu fosse usar por exemplo, sistema de caminhar pixel por pixel, nem se fala! Aí sim seria praticamente impossível de acerta-lo. Enfim minha dúvida! Tem como aumentar o tamanho da "target" (acho que é isso que chamamos aquele ponto azul ali) digamos assim, proporcional ao tamanho do desenho da sprite, para que então eu consiga acertar o inimigo independente do tamanho do desenho? Se sim, será de GRANDE ajuda pra mim em um projeto que estou iniciando!


Harus Game is coming.
https://www.indiexpo.net/pt/games/harus
© 2020 copyright.

Deixe me ver se entendi: você está usando algum ABS que cria essa "mira", por onde você ataca o inimigo. Também está usando um script para dar um zoom no mapa, mas ele está ignorando essa "mira". é isso? Daria para coloca umas imagens in game e especificar quais são ambos os sistemas?

06/07/2017 às 19:47 #2 Última edição: 06/07/2017 às 19:53 por andrewzoka
O nome do sistema ABS é o Weapon System RE-like. Não sei lhe dizer bem se ele "ignora" essa mira, acho que não é bem ignorar a mira, ele somente mantém aquela mira daquele tamanho. Na imagem in game abaixo ilustra mais ou menos como quero dizer.

Nas linhas amarelas a mira não funciona. A mira só funciona se alinhado a vermelha. Esse é o evento do inimigo já com tamanho duplicado com zoom.

IMAGEM in game:
Spoiler
[close]

Weapon System RE-like:

RE Weapons HUD (codigo)
Spoiler
#==============================================================================
# Resident Evil Like Weapons System
#==============================================================================
#------------------------------------------------------------------------------
# Créditos: Leon-S.K --- ou --- Andre Luiz Marques Torres Micheletti
#==============================================================================

#------------------------------------------------------------------------------
# HUD
#------------------------------------------------------------------------------
module Hud_Config
  
  #------------------------------------------------------------------------------
  # CONFIGURAÇÕES GERAIS
  #------------------------------------------------------------------------------
  Switch = 2        # Id da Switch que ativa\desativa a HUD
  Show_Key = :Z     # Tecla que mostra\esconde a HUD
  #------------------------------------------------------------------------------
  # Fim das Configurações
  #------------------------------------------------------------------------------
end
#==============================================================================
  
  #------------------------------------------------------------------------------
  # AREA NAO EDITAVEl!
  #------------------------------------------------------------------------------

class Hud < Window_Base
  
  attr_accessor :hp
  attr_accessor :mp
  attr_accessor :ammo
  
  def initialize
    super(0,0,250,300)
    self.contents = Bitmap.new(width - 32, height - 32)
    self.opacity = 0
    @hp = $game_party.members[0].hp
    @maxhp = $game_party.members[0].mhp
    if $game_player.equipped_weapon != nil
      @ammo = $game_player.equipped_weapon.bullets
      @mags =  $game_party.item_number($game_player.equipped_weapon.magazine)
    end
    self.z = 999
    self.contents.font.color = Color.new(229,191,0)
    refresh
  end
  
  def refresh
    @hp = $game_party.members[0].hp
    @maxhp = $game_party.members[0].mhp
    if $game_player.equipped_weapon != nil
      @ammo = $game_player.equipped_weapon.bullets
      @mags =  $game_party.item_number($game_player.equipped_weapon.magazine)
    end
    @wb = 149 * @hp / @maxhp
    self.contents.clear
    #self.contents.fill_rect(0,8,151,11,Color.new(255,216,0))
    #self.contents.fill_rect(1,9,149,9,Color.new(0,0,0))
    #self.contents.gradient_fill_rect(1,9,@wb,9,Color.new(205,101,0),Color.new(0,89,0))
    #self.contents.draw_text(0,8,151,21,"HP",1)
    if $game_player.equipped_weapon != nil
      self.contents.draw_text(0,61,81,20,@ammo.to_s) #61 é o numero 0 cima e baixo | 
      draw_icon(967, 25, 62) #25 é bala lados 61 bala cima e baixo
      self.contents.draw_text(100,43,123,60,@mags.to_s) if not @mags.nil? #43 e o 60 é o numero 10 cima e baixo | 100 é o 10 lados
      draw_icon($game_player.equipped_weapon.iconset_id, 130, 60) #130 é a mochila lados | 60 cima e baixo
    end
  end
  
  def dispose
    super
  end
end

class Scene_Map < Scene_Base
  
  include Hud_Config
  attr_accessor :hud
    
  alias hud_start start
  def start
    hud_start
    if $game_switches[Switch] == true
      @hud = Hud.new
    end
  end
  
  alias hud_update update
  def update
    hud_update
    if $game_switches[Switch] == true
      @hud.nil? ? @hud = Hud.new : refresh_hud
    else
      if not @hud.nil?; @hud.dispose; @hud = nil; end
    end
  end
  
  def refresh_hud
    @hud.refresh if $game_party.members[0].hp != @hud.hp or $game_party.members[0].mp != @hud.mp or @hud.ammo != $game_player.equipped_weapon.bullets
    if Input.trigger?(Show_Key)
      @hud.visible ? @hud.visible = false : @hud.visible = true
    end
  end
  
  alias hud_terminate terminate
  def terminate
    @hud.dispose if @hud != nil
    hud_terminate
  end
end
[close]

RE Weapons Room (código)

Spoiler
#==============================================================================
# Resident Evil Like Weapons System
#==============================================================================
#------------------------------------------------------------------------------
# Créditos: Leon-S.K --- ou --- Andre Luiz Marques Torres Micheletti
#==============================================================================

#------------------------------------------------------------------------------
# ARMAS A SEREM USADAS PELO SCRIPT
#------------------------------------------------------------------------------
module Weapons_To_Be_Used
#------------------------------------------------------------------------------.
# Para criar uma arma, copie: Armas[id] = [a, b, c, d, e, f] e mude:
# ID = Id da arma no database; a = id do item para ser o cartucho da arma
# b = maximo de balas em um cartucho; c = tempo de espera para o proximo tiro
# d = som de tiro, reload e no_ammo; e = nome do grafico quando esta segurando a arma
# f = index do grafico quando esta segurando a arma
Armas = {}
Armas[67] = [23, 1, 30, "estilingueshot", "$Estilingue", 0]
Armas[55] = [22, 12, 30, "pistol", "$Pistola", 0]
Armas[62] = [17, 15, 60, "pistol", "$Pistola", 0]
Armas[63] = [18, 7, 80, "shot", "$ShotGun", 0]
Armas[64] = [19, 50, 4, "smg", "$smg", 0]
Armas[65] = [20, 9, 60, "wes", "duncan_weapon", 0]
Armas[66] = [21, 1, 90, "rocket", "duncan_weapon", 0]
#----------------------------------------------------------------------------
#~ Você pode ainda criar armas com efeito de area (explosivos)
#~ Colocando no comentario da arma => "area"
#~  
#~ Você pode ainda criar armas com efeito de perfuração (sniper)
#~ Colocando no comentario da arma => "pierce x"
#~ Onde x é a qnt de inimigos que ela pode atravessar
#----------------------------------------------------------------------------
end
#==============================================================================
  
  #------------------------------------------------------------------------------
  # AREA NAO EDITAVEl!
  #------------------------------------------------------------------------------

  class Scene_Map < Scene_Base
  
  include Weapons_To_Be_Used
  alias my_start start
  def start
    my_start
    create_global_weapons(Armas) if $weapons.nil?
  end
  
  def create_global_weapons(armas)
    $weapons = []
    armas.each { |arma|
      p1 = $data_weapons[arma[0]]
      p2 = $data_items[arma[1][0]]
      p3 = arma[1][1]
      p4 = arma[1][2]
      p5 = arma[1][3]
      p6 = arma[1][4]
      p7 = arma[1][5]
      $weapons.push(Abs_Weapon.new(p1, p2, p3, p4, p5, p6, p7))
    }
  end
end

#----------------------------------------------------------------------------------#
class Abs_Weapon
  
  attr_accessor :recover
  attr_accessor :magazine
  attr_accessor :bullets
  attr_accessor :max
  attr_accessor :weapon
  attr_accessor :iconset_id
  attr_accessor :name
  attr_accessor :wav_name
  attr_accessor :vis_equip
  attr_reader   :area
  attr_reader   :pierce
  attr_reader   :pierce_num
  
  def initialize(weapon, magazine, max, recover, wav_name, char_name, index)
    @weapon, @magazine, @max, @recover, @wav_name = weapon, magazine, max, recover, wav_name
    @bullets = 0; @iconset_id = @magazine.icon_index; @name = @weapon.name
    @vis_equip = [char_name, index]
    @pierce = false; @area = false
    if @weapon.note.include?("area")
      @area = true
    else
      @area = false
    end
    if @weapon.note.include?("pierce=")
      return if @weapon.note.include?("area")
      number = @weapon.note.sub("pierce=","")
      @pierce_num = number.to_i
      @pierce = true
      if @pierce_num == nil
        @pierce_num = Module_Of_Config::Pierce_Enemies
      end
    else
      @pierce = false
    end
  end
end

#----------------------------------------------------------------------------------#
class Game_Actor < Game_Battler
  
  alias initialize_just_for_make_vars initialize
  alias my_def change_equip
  
  def initialize(actor_id)
    initialize_just_for_make_vars(actor_id)
    @real_vis_character_index = @character_index
    @real_vis_character_name = @character_name
  end
  
  def change_equip(slot_id, item)
    if slot_id == 0
      for weapon in $weapons
        break if item == nil
        if weapon.weapon.id  == item.id
          $game_player.equipped_weapon = weapon
          $game_player.equipped_weapon.bullets = 0 if $game_player.equipped_weapon.bullets.nil?
          $game_player.set_graphic(weapon.vis_equip[0], weapon.vis_equip[1])
          break
        else
          p = $game_player
          p.equipped_weapon = nil
          p.set_graphic(@real_vis_character_name, @real_vis_character_index)
        end
      end
      if item == nil
        $game_player.equipped_weapon = nil
        p = $game_player
        p.set_graphic(@real_vis_character_name, @real_vis_character_index)
      end
      my_def(slot_id, item)
    else
      my_def(slot_id, item)
    end
  end
end
[close]

RE Weapon System Main (código)

Spoiler
#==============================================================================
# Resident Evil Like Weapons System
#==============================================================================
#------------------------------------------------------------------------------
# Créditos: Leon-S.K --- ou --- AndreMaker --- ou --- 4ndreMTM
#------------------------------------------------------------------------------
#
# Para Criar um inimigo, coloque o comentario em um evento:
#    - enemy_id=  E coloque o ID do inimigo na database
# Para adicionar um comando quando o inimigo morrer, coloque o comentario
#   Die Erase           - Ira apagar o inimigo
#   Die Switch Local X  - Ira ativar a switch local x
#   Die Switch X        - Ira ativar a switch
#
#  Você pode criar um objeto, colocando um comentario no evento
#       - object command
#
#    E SUBSTITUA command por :
#       Self X    - Ativa a switch local x
#       Switch X  - Ativa a swich X
#       Start     - Executa tudo após o comentario
#
#    Exemplo:
#       - Object Self A
#
#    Outro Exemplo:
#       - Object Switch 20
#
# Para o Inimigo no database, coloque nos comentarios
#          animation_id= id da animação
#  Para definir uma animação de ataque
#
#     Você ainda pode criar uma arma com dano em area ou que atravessa mais
#   de um inimigo. 
#           
#           Para fazer-lo coloque no comentario da arma:
#
#      Adicione "area" para criar uma arma com efeito de area(explosao)
#      Adicione "pierce x" e troque x para quantos inimigos quiser atravessar
#
#  Para colocar as armas no script, visite "weapons place"
#------------------------------------------------------------------------------
#==============================================================================

 
module Module_Of_Config
  
  #------------------------------------------------------------------------------
  # CONFIGURAÇÕES GERAIS
  #------------------------------------------------------------------------------
  
  Default_Animation = 1 # Animação padrao de tiro (quando a arma nao tiver)
  Opacity_Burn = 10     # A velocidade que a opacidade diminui quando morto
  Enemy_Recover = 60    # Recover do inimigo (padrao = 60)
  Attack_Key = :X       # Tecla de Tiro
  Reload_Key = :Y       # Tecla de Reload
  Pierce_Enemies = 1    # Quantos inimigos a bala pode atravessar (padrao 1)
  Move_Type_Custom = false   # true se quiser que o inimigo ande conforme abaixo
  Move_Type_Near = 3     # A velocidade do inimigo quando perto (max 5)
  Move_Type_Far = 3      # A velocidade do inimigo quando longe (max 5) 
  Die_SE = "zombie damage"    # SE tocado quando o inimigo Morre
  Player_Die_SE = "die_abyss"    # SE tocado quando o player morre
  Show_Damage_Sprites = true    # Mostrar valor do dano no alvo
  Shot_Animation_Enabled = true    # Animação de tiro no player (padrao = false)
  Shot_Animation = 114                # Animação padrao de tiro no player
  
#----------------------------------------------------------------------------------#

end

  #------------------------------------------------------------------------------
  # AREA NAO EDITAVEL - APENAS SE SABE OQUE ESTA FAZENDO =D
  #------------------------------------------------------------------------------
  
class Game_Map
  attr_accessor :enemies
  attr_accessor :damage_sprites
  attr_accessor :item_windows
  attr_accessor :explosion_chars
  alias abs_setup setup
  def setup(map_id)
    @enemies.nil? ? @enemies = [] : @enemies.clear
    @item_windows.nil? ? @item_windows = [] : @item_windows.clear
    abs_setup(map_id)
  end
  def window(type)
    @item_windows.push(type)
  end
end
#----------------------------------------------------------------------------------#
class Game_Event < Game_Character
  include Module_Of_Config
  attr_reader :enemy
  alias abs_setup_page_settings setup_page_settings
  alias abs_initialize initialize
  alias abs_update update
  alias abs_start start
  alias abs_movement update_self_movement
  alias abs_erase_enemy erase
  def initialize(map_id, event)
    @enemy = nil
    @recover = 0; @timer = 0
    abs_initialize(map_id, event)
  end
  def setup_page_settings
    abs_setup_page_settings
    check_enemy
  end
  def update_self_movement
    if @enemy != nil and Move_Type_Custom == true
      if near_the_player?
        @move_type = Move_Type_Near
        abs_movement
      else
        @move_type = Move_Type_Far
        abs_movement
      end
    else
      abs_movement
    end
  end
  def check_enemy
    if !@enemy.nil?
      @enemy = nil
      $game_map.enemies.delete(self)
    elsif !@object.nil?
      @object = nil
      $game_map.enemies.delete(self)
    end
    return if @list.nil?
    @list.each do |command|
      next if not command.code == 108 or command.code == 408
      if @enemy.nil?
        if command.parameters[0].downcase.include?("enemy_id=")
          id = command.parameters[0].sub("enemy_id=","")
          @enemy = ABS_Enemy.new(id.to_i)
          @trigger = 2
          $game_map.enemies.push(self)
          print "Enemy #{@enemy.enemy.name} criado \n"
        elsif command.parameters[0].downcase.include?("object")
          die_com = command.parameters[0].downcase.sub("object ", ""); die_com.downcase!
          if die_com.include?("self ")
            switch = die_com.downcase.sub('self ','')
            switch.downcase!
            switch = check_switch_string(switch)
          elsif die_com.include?("switch ") and !die_com.include?('local')
            switch = die_com.downcase.sub('switch ','')
            switch = switch.to_i
          elsif die_com.include?('Start')
            switch = true
          else
            switch = true
          end
          @object = ABS_Object.new(switch)
          $game_map.enemies.push(self)
          print "Objeto criado com switch #{@object.switch} \n"
        end
      else
        if command.parameters[0].downcase.include?("die")
          cmd = command.parameters[0].downcase
          if cmd == "die erase"
            @enemy.die = 0
          elsif cmd.include?("die switch local")
            @enemy.die = 1
            maqoe = cmd.sub("die switch local ",'')
            @enemy.switch = check_switch_string(maqoe)
          elsif cmd.include?("die switch")
            @enemy.die = 2
            maqoe = cmd.sub("die switch ", '')
            @enemy.switch = maqoe.to_i
          else
            @enemy.die = 0
          end
          print "Enemy #{@enemy.enemy.name} die command is #{@enemy.die} \n"
        else
          next
        end
      end
    end
  end
  def check_switch_string(string)
    if string.include?('a')
      return "A"
    elsif string.include?('b')
      return "B"
    elsif string.include?('c')
      return "C"
    elsif string.include?('d')
      return "D"
    end
    return nil
  end
  def start_object
    print "Object Started! \n"
    if @object.switch.is_a?(String)
      key = [$game_map.map_id, self.id, @object.switch]
      $game_self_switches[key] ? $game_self_switches[key] = false : $game_self_switches[key] = true
      print "Switch Local #{@object.switch} == #{$game_self_switches[key]} \n"
    elsif @object.switch.is_a?(TrueClass)
      @object = nil
      $game_map.enemies.delete(self)
      self.start
    else
      $game_switches[@object.switch] ? $game_switches[@object.switch] = false : $game_switches[@object.switch] = true
    end
  end
  def erase
    @character_name = ''
    @priority_type = 1
    moveto(0,0)
    abs_erase_enemy
  end
  def damage_enemy(value)
    if !@object.nil?
      start_object
      return
    end
    value -= @enemy.defense
    value == 0 if value < 0
    last_speed = @move_speed
    last_freq = @move_frequency
    @move_speed = 5
    @move_frequency = 5
    jump(0,0)
    $game_map.damage_sprites.push(Damage_Sprite.new(self, value)) if Show_Damage_Sprites == true
    @enemy.hp -= value
    if @enemy.hp <= 0
      $game_map.enemies.delete(self)
      RPG::SE.new(Die_SE, 80).play
      Audio.se_play('Audio/Se/zombie damage', 90, 100)
      expp = @enemy.enemy.exp
    end
    @move_speed = last_speed
    @move_frequency = last_freq
  end
  def update
    if @enemy != nil
      @recover -= 1 if @recover > 0
      update_kill if @enemy.hp <= 0
    end
    abs_update
  end
  def update_kill
    if @opacity > 0
      @opacity -= Module_Of_Config::Opacity_Burn
    else
      case @enemy.die
      when 0
        print "Erased enemy #{@enemy.enemy.name}\n"
        self.erase
        @enemy = nil
      when 1
        key = [$game_map.map_id, self.id, @enemy.switch]
        if $game_self_switches[key] == true
          $game_self_switches[key] = false
        else
          $game_self_switches[key] = true
        end
        @opacity = 255
      when 2
        $game_switches[@enemy.switch] ? $game_switches[@enemy.switch] = false : $game_switches[@enemy.switch] = true
        @opacity = 255
      end
      @enemy = nil if !@enemy.nil?
    end
  end
  def start
    if @object.nil?; abs_start; else; abs_start if !@object.switch.is_a?(TrueClass); end
    if @enemy.nil?
      abs_start
    else
      ax = @x - $game_player.x
      ay = @y - $game_player.y
      turn_toward_player if check_really_near and !moving?
      case @direction
      when 2
        attack if ax == 0 and ay == -1
      when 4
        attack if ay == 0 and ax == 1
      when 6 
        attack if ay == 0 and ax == -1
      when 8
        attack if ax == 0 and ay == 1
      end
    end
  end
  def check_really_near
    sx = distance_x_from($game_player.x).abs
    sy = distance_y_from($game_player.y).abs
    return true if sx + sy < 3
  end
  def attack
    return if @enemy.hp == 0 or @recover > 0
    @recover = Module_Of_Config::Enemy_Recover
    $game_player.animation_id = @enemy.animation
    value = @enemy.attack
    r = rand(20)
    factor = r - 10
    value += factor
    $game_player.damage_hero(value)
  end
end
#----------------------------------------------------------------------------------#
class ABS_Object
  attr_accessor :switch
  def initialize(die_com)
    @switch = die_com
  end
end
#----------------------------------------------------------------------------------#
class ABS_Enemy
  include Module_Of_Config
  attr_accessor :enemy
  attr_accessor :hp
  attr_accessor :attack
  attr_accessor :defense
  attr_accessor :die
  attr_accessor :switch
  attr_reader :name
  attr_reader :animation
  def initialize(id)
    @enemy = Game_Enemy.new(0, id)
    @name = @enemy.name
    @die = 0, @switch = nil
    note = @enemy.enemy.note
    if note.include?("animation=")
      aid = note.sub("animation=","")
      @animation = aid.to_i
    else
      @animation = Default_Animation
    end
    @hp = enemy.mhp
    @attack = enemy.atk
    @defense = enemy.def
  end
end
#----------------------------------------------------------------------------------#
class Game_Player < Game_Character
  include Module_Of_Config
  attr_accessor :kill_player
  attr_accessor :equipped_weapon
  attr_accessor :real_vis_character_name
  attr_accessor :real_vis_character_index
  attr_accessor :bullets_hash
  alias abs_initialize initialize
  alias abs_update update
  alias abs_movable movable?
  def initialize
    @recover = 0
    @kill_player = false; @need_check = false
    @real_vis_character_name = @character_name
    @real_vis_character_index = @character_index
    abs_initialize
  end
  def update
    @recover -= 1 if @recover > 0
    re_check_equipped_weapon if @equipped_weapon == nil and @need_check == true
    if not @equipped_weapon == nil
      @need_check = true if not @need_check = true
      if Input.press?(Attack_Key) and @recover == 0
        if not @equipped_weapon.bullets == 0
          @equipped_weapon.area == true ? update_attack(true) : update_attack
          return
        else
          Audio.se_play("Audio/SE/#{@equipped_weapon.wav_name}_no_ammo", 100, 130)
          @recover = @equipped_weapon.recover
        end
      end
      if Input.trigger?(Reload_Key)
        if @equipped_weapon.bullets == 0
          reload(@equipped_weapon)
        else
          Audio.se_play("Audio/Se/weaponfail", 80, 100)
        end
      end
    end
    update_kill if @kill_player
    abs_update
  end
  def re_check_equipped_weapon
    @need_check = false
    $weapons.each { |weapon|
      if $game_party.members[0].equips.include?(weapon.weapon)
        @equipped_weapon = weapon
        return
      else
        @equipped_weapon = nil
      end }
  end
  def reload(weapon)
    $game_party.items.each { |item|
      if item.id == weapon.magazine.id
        $game_party.lose_item(weapon.magazine,1)
        @equipped_weapon.bullets += @equipped_weapon.max
        Audio.se_play("Audio/Se/#{weapon.wav_name}_reload", 100, 100)
        @recover = @equipped_weapon.recover
        return
      end
    }
    Audio.se_play("Audio/Se/weaponfail", 85, 100)
    @recover = @equipped_weapon.recover
  end
  def movable?
    $game_map.explosion_chars.compact!
    return false if !$game_map.explosion_chars.empty?
    abs_movable
  end
  def update_attack(bazooca = false)
    $game_map.enemies.compact!
    return if @kill_player
    return if $game_party.members[0].weapons[0] == nil
    return if $game_map.enemies.size == 0
    re_check_equipped_weapon if @equipped_weapon == nil
    return if @equipped_weapon.nil? or @equipped_weapon.class != Abs_Weapon
    Audio.se_stop
    Audio.se_play("Audio/Se/#{@equipped_weapon.wav_name}", 100, 100)
    @equipped_weapon.bullets -= 1
    @recover = @equipped_weapon.recover
    range_x = {'pos' => [], 'neg' => []}
    range_y = {'pos' => [], 'neg' => []}
    for i in 1..8
      if map_passable?(@x - i, @y, 4) or $game_map.counter?(@x - i, @y)
        range_x['pos'].push(i)
      else
        break; next
      end
    end
    for i in 1..8
      if map_passable?(@x + i, @y, 6) or $game_map.counter?(@x + i, @y)
        range_x['neg'].push(i * (-1))
      else
        break; next
      end
    end
    for i in 1..8
      if map_passable?(@x, @y - i, 8) or $game_map.counter?(@x, @y - i)
        range_y['pos'].push(i)
      else
        break; next
      end
    end
    for i in 1..8
      if map_passable?(@x, @y + i, 2) or $game_map.counter?(@x, @y + i)
        range_y['neg'].push(i * (-1))
      else
        break; next
      end
    end
    @new_enemies = []
    $game_map.enemies.each do |enemy|
      ax = @x - enemy.x
      ay = @y - enemy.y
      case @direction
      when 2
        if not ax != 0
          if ay == -1
            @new_enemies[0] = enemy
          elsif ay == - 2
            @new_enemies[1] = enemy
          elsif ay == - 3
            @new_enemies[2] = enemy
          elsif ay == - 4
            @new_enemies[3] = enemy
          elsif ay == - 5
            @new_enemies[4] = enemy
          elsif ay == - 6
            @new_enemies[5] = enemy
          elsif ay == - 7
            @new_enemies[6] = enemy
          elsif ax == - 8
            @new_enemies[7] = enemy
          end
        end
      when 4
        if not ay != 0
          if ax == 1
            @new_enemies[0] = enemy
          elsif ax == 2
            @new_enemies[1] = enemy
          elsif ax == 3
            @new_enemies[2] = enemy
          elsif ax == 4
            @new_enemies[3] = enemy
          elsif ax == 5
            @new_enemies[4] = enemy
          elsif ax == 6
            @new_enemies[5] = enemy
          elsif ax == 7
            @new_enemies[6] = enemy
          elsif ax == 8
            @new_enemies[7] = enemy
          end
        end
      when 6
        if not ay != 0
          if ax == -1
            @new_enemies[0] = enemy
          elsif ax == - 2
            @new_enemies[1] = enemy
          elsif ax == - 3
            @new_enemies[2] = enemy
          elsif ax == - 4
            @new_enemies[3] = enemy
          elsif ax == - 5
            @new_enemies[4] = enemy
          elsif ax == - 6
            @new_enemies[5] = enemy
          elsif ax == - 7
            @new_enemies[6] = enemy
          elsif ax == - 8
            @new_enemies[7] = enemy
          end
        end
      when 8
        if not ax != 0
          if ay == 1
            @new_enemies[0] = enemy
          elsif ay == 2
            @new_enemies[1] = enemy
          elsif ay == 3
            @new_enemies[2] = enemy
          elsif ay == 4
            @new_enemies[3] = enemy
          elsif ay == 5
            @new_enemies[4] = enemy
          elsif ay == 6
            @new_enemies[5] = enemy
          elsif ay == 7
            @new_enemies[6] = enemy
          elsif ay == 8
            @new_enemies[7] = enemy
          end
        end
      end
    end
    @new_enemies.compact!; a = 0
    @new_enemies.each do |enemy|
      if @equipped_weapon.pierce == true
        break if a >= Pierce_Enemies + @equipped_weapon.pierce_num
      else
        break if a >= Pierce_Enemies
      end
      next if not enemy.is_a?(Game_Event)
      ax = @x - enemy.x
      ay = @y - enemy.y
      case @direction
      when 2
        if ax == 0
          if range_y['neg'].include?(ay)
            bazooca ? damage_area(enemy) : attack_enemy(enemy)
            a += 1
            next
          else
            @equipped_weapon.area ? miss_area(range_x, range_y) : miss; break
          end
        else
          @equipped_weapon.area ? miss_area(range_x, range_y) : miss; break
        end
      when 4
        if ay == 0
          if range_x['pos'].include?(ax)
            bazooca ? damage_area(enemy) : attack_enemy(enemy)
            a += 1
            next
          else
            @equipped_weapon.area ? miss_area(range_x, range_y) : miss; break
          end
        else
          @equipped_weapon.area ? miss_area(range_x, range_y) : miss; break
        end
      when 6 
        if ay == 0 
          if range_x['neg'].include?(ax)
            bazooca ? damage_area(enemy) : attack_enemy(enemy)
            a += 1
            next
          else
            @equipped_weapon.area ? miss_area(range_x, range_y) : miss; break
          end
        else
          @equipped_weapon.area ? miss_area(range_x, range_y) : miss; break
        end
      when 8
        if ax == 0
          if range_y['pos'].include?(ay)
            bazooca ? damage_area(enemy) : attack_enemy(enemy)
            a += 1
            next
          else
            @equipped_weapon.area ? miss_area(range_x, range_y) : miss; break
          end
        else
          @equipped_weapon.area ? miss_area(range_x, range_y) : miss; break
        end
      end
    end
    @new_enemies.clear
    if a == 0
      @equipped_weapon.area ? miss_area(range_x, range_y) : miss
    end
  end
  def miss_area(area_x, area_y)
    @recover = @equipped_weapon.recover
    now = @equipped_weapon.weapon.animation_id
    anim_id = now
    anim_n = $data_animations[now].frames.size * 3
    area_x['pos'].sort!; area_x['neg'].sort!
    area_y['pos'].sort!; area_y['neg'].sort!
    area_x['pos'].compact!; area_x['neg'].compact!
    area_y['pos'].compact!; area_y['neg'].compact!
    xis, yis = @x, @y
    gm = $game_party.members[0]
    pre_feito = gm.atk - gm.def
    pre_feito = 0 if pre_feito <= 0
    if not area_x['pos'].empty? or area_x['neg'].empty? or area_y['pos'].empty? or area_y['neg'].empty?
      case @direction
      when 2
        if area_y['neg'][0].nil?; damage_hero(pre_feito); @animation_id = now; return; end
        xis = @x; yis -= area_y['neg'][0]
      when 4
        a = area_x['pos'].size
        if area_x['pos'][a - 1].nil?; damage_hero(pre_feito); @animation_id = now; return; end
        yis = @y; xis -= area_x['pos'][a - 1]
      when 6
        if area_x['neg'][0].nil?; damage_hero(pre_feito); @animation_id = now; return; end
        yis = @y; xis -= area_x['neg'][0]
      when 8
        a = area_y['pos'].size
        if area_y['pos'][a - 1].nil?; damage_hero(pre_feito); @animation_id = now; return; end
        xis = @x; yis -= area_y['pos'][a - 1]
      end
    else
      return
    end
    xis = 0 if xis.nil?
    yis = 0 if yis.nil?
    $game_map.explosion_chars.push(Explosion_Character.new(xis, yis, anim_id, anim_n))
  end
  def remove_bullets(qnt)
    if @equipped_weapon.bullets - qnt < 0
      @equipped_weapons.bullets = 0
    else
      @equipped_weapon.bullets -= qnt
    end
  end
  def damage_area(enemy)
    Audio.se_stop
    Audio.se_play("Audio/Se/#{@equipped_weapon.wav_name}", 100, 100)
    shot_anim if Shot_Animation_Enabled
    if not @equipped_weapon.weapon.animation_id == nil
      enemy.animation_id = @equipped_weapon.weapon.animation_id
    else
      enemy.animation_id = Default_Animation
    end
    xis, yis = enemy.x, enemy.y
    area = {'X' => [], 'Y' => []}
    area['X'].push(xis + 1)
    area['X'].push(xis - 1)
    area['Y'].push(yis + 1)
    area['Y'].push(yis - 1)
    area['X'].push(xis)
    area['Y'].push(yis)
    area['X'].sort!; area['Y'].sort!
    $game_map.enemies.compact!
    a = $game_map.enemies.compact; a.delete(enemy)
    attack_enemy(enemy, true)
    for enemi in a
      if area['X'].include?(enemi.x) and area['Y'].include?(enemi.y)
        attack_enemy(enemi, true)
      end
    end
    Audio.se_play("Audio/Se/explosion1", 100, 100)
  end
  def miss
    hero = $game_party.members[0]
    @recover = @equipped_weapon.recover
    shot_anim if Shot_Animation_Enabled
  end
  def shot_anim
    return if Shot_Animation_Enabled == false
    return if Shot_Animation == nil or Shot_Animation.class != Fixnum
    @animation_id = Shot_Animation
  end
  def attack_enemy(event, bazooca = false)
    hero = $game_party.members[0]
    r = rand(10)
    rand = r - 5
    event.damage_enemy(hero.atk + rand)
    shot_anim if Shot_Animation_Enabled
    if not @equipped_weapon.weapon.animation_id == nil
      event.animation_id = @equipped_weapon.weapon.animation_id if bazooca != true
    else
      event.animation_id = Default_Animation if bazooca != true
    end
    @recover = @equipped_weapon.recover
  end
  def get_bullets(weapon)
    if not weapon.bullets == weapon.max 
      $game_party.lose_item(weapon.magazine, 1)
      weapon.bullets += weapon.max
    else
      return
    end
  end
  def damage_hero(value)
    return if @kill_player
    jump(0,0)
    hero = $game_party.members[0]
    value = 0 if value < 0
    $game_map.damage_sprites.push(Damage_Sprite.new(self, value)) if Show_Damage_Sprites == true
    if not value > hero.hp
      hero.hp -= value
    else
      hero.hp = 1
      @kill_player = true
      RPG::SE.new(Player_Die_SE, 80).play
    end
  end
  def update_kill
    if @opacity > 0
      @opacity -= Module_Of_Config::Opacity_Burn
    else
      SceneManager.goto(Scene_Gameover)
    end
  end
end
#----------------------------------------------------------------------------------#
class Spriteset_Map
  alias abs_initialize initialize
  alias abs_update update
  alias abs_dispose dispose
  def initialize
    $game_map.damage_sprites = []
    $game_map.item_windows = []
    $game_map.explosion_chars = []
    @spritees = {}
    abs_initialize
  end
  def update
    abs_update
    trash = []
    trash2 = []
    $game_map.damage_sprites.each do |sprite|
      sprite.update
      trash.push(sprite )if sprite.disposed?
    end
    if !$game_map.item_windows.empty?
      if $game_map.item_windows[0].is_a?(Pop)
        $game_map.item_windows[0].update
        trash2.push($game_map.item_windows[0]) if $game_map.item_windows[0].disposed?
      end
    end
    trash2.each { |item| $game_map.item_windows.delete(item) }
    $game_map.item_windows.compact!
    trash.each { |item| $game_map.damage_sprites.delete(item) }
    trash2.clear; trash.clear
    for char in $game_map.explosion_chars
      char.update
      char.my_sprite = Sprite_Character.new(@viewport1, char) if char.my_sprite.nil?
      trash.push(char) if char.disposed?
    end
    trash.each { |item| $game_map.explosion_chars.delete(item) }
  end
  def dispose
    abs_dispose
    $game_map.damage_sprites.each do |sprite|
      sprite.bitmap.dispose
      sprite.dispose
    end
    $game_map.damage_sprites.clear
    $game_map.item_windows.each do |window|
      window.dispose
    end
    $game_map.item_windows.clear
    $game_map.explosion_chars.each { |char| char.dispose }
    $game_map.explosion_chars.clear
  end
end
#----------------------------------------------------------------------------------#
class Game_Party < Game_Unit
  alias metodo_aliasado_com_sucesso gain_item
  def gain_item(item, amount, include_equip = false)
    times = $game_map.item_windows.size
    $game_map.window(Pop.new(item))#, 150 * times))
    metodo_aliasado_com_sucesso(item, amount, include_equip = false)
  end
end
#----------------------------------------------------------------------------------#
class Damage_Sprite < Sprite
  def initialize(target, value)
    super(nil)
    @target = target
    self.bitmap = Bitmap.new(100,20)
    self.bitmap.draw_text(0,0,100,20,value,1)
    self.ox = 50
    self.z = 999
    self.x = target.screen_x
    self.y = target.screen_y - 40
    @timer = 50
  end
  def update
    if @timer > 0
      @timer -= 1
      self.y -= 1 if not self.y < @target.screen_y - 60
    else
      if self.opacity > 0
        self.opacity -= 15
        self.y -= 2
      else
        dispose
      end
    end
  end
  def dispose
    self.bitmap.dispose
    super
  end
end
#----------------------------------------------------------------------------------#
class Reward_Sprite < Sprite
  def initialize(target, value)
    super(nil)
    @target = target
    self.bitmap = Bitmap.new(100,20)
    self.bitmap.font.color = Color.new(72,0,255)
    self.bitmap.draw_text(0,0,100,20,value,1)
    self.ox = 50
    self.z = 999
    self.x = target.screen_x - 5
    self.y = target.screen_y - 40
    @timer = 50
  end
  def update
    if @timer > 0
      @timer -= 1
      self.zoom_x += 0.008
      self.zoom_y += 0.008
      self.y -= 1 if not self.y < @target.screen_y - 60
    else
      if self.opacity > 0
        self.opacity -= 15
        self.y -= 2
      else
        dispose
      end
    end
  end
  def dispose
    self.bitmap.dispose
    super
  end
end
#----------------------------------------------------------------------------------#
class Window_Ammo < Window_Base
  def initialize
    super(0,0,120,52)
    self.contents = Bitmap.new(width - 32, height - 32)
    if not $game_player.equipped_weapon == nil
      self.contents.draw_text(2,0,120,20,"Ammo:" + $game_player.equipped_weapon.bullets.to_s)
    end
  end
  def dispose
    super
  end
end
#----------------------------------------------------------------------------------#
class Pop < Window_Base
  def initialize(item)
    if not item.nil?
      super(0,355,175,60)
      self.contents = Bitmap.new(width - 32, height - 32)
      self.contents.draw_text(30,5,120,20, item.name)
      draw_icon(item.icon_index, 5, 5)
      @timer = 70
      self.opacity = 0; self.visible = false
    else
      dispose if not self.disposed?
    end
  end
  def update
    return if self.disposed?
    self.opacity = 255 if self.opacity != 255
    self.visible = true if self.visible == false
    @timer > 0 ? @timer -= 1 : dispose
  end
  def dispose
    super
  end
end
#----------------------------------------------------------------------------------#
module DataManager
  def self.make_save_contents
    contents = {}
    contents[:system]        = $game_system
    contents[:timer]         = $game_timer
    contents[:message]       = $game_message
    contents[:switches]      = $game_switches
    contents[:variables]     = $game_variables
    contents[:self_switches] = $game_self_switches
    contents[:actors]        = $game_actors
    contents[:party]         = $game_party
    contents[:troop]         = $game_troop
    contents[:map]           = $game_map
    contents[:player]        = $game_player
    if $weapons != nil
      $weapons.compact!
      contents[:weapons]     = $weapons
    end
    contents
  end
  def self.extract_save_contents(contents)
    $game_system        = contents[:system]
    $game_timer         = contents[:timer]
    $game_message       = contents[:message]
    $game_switches      = contents[:switches]
    $game_variables     = contents[:variables]
    $game_self_switches = contents[:self_switches]
    $game_actors        = contents[:actors]
    $game_party         = contents[:party]
    $game_troop         = contents[:troop]
    $game_map           = contents[:map]
    $game_player        = contents[:player]
    $weapons            = contents[:weapons] if contents.has_key?(:weapons)
    $weapons.compact!
  end
end
#----------------------------------------------------------------------------------#
class Explosion_Character < Game_Character
  attr_accessor :my_sprite
  def initialize(xis, yis, anim_id, anim_frames = 20)
    super()
    @identification = rand(200)
    moveto(xis, yis)
    @animation_id = anim_id
    @timer = anim_frames
    @timer = 20 if @timer <= 0
    @disposed = false
    update
  end
  def update
    @my_sprite.update if @my_sprite.class == Sprite_Character
    return if self.disposed?
    super
    if @timer > 0
      @timer -= 1
      @disposed = false
    else
      dispose
    end    
  end
  def dispose
    @my_sprite.dispose if @my_sprite.class == Sprite_Character
    @timer = 0
    @disposed = true
  end
  def disposed?; @disposed; end
end
#-----##-----##-----##-----##-----##-----##-----##-----##-----##-----##-----#
# FIM ## FIM ## FIM ## FIM ## FIM ## FIM ## FIM ## FIM ## FIM ## FIM ## FIM #
#-----##-----##-----##-----##-----##-----##-----##-----##-----##-----##-----#
[close]

O sistema de zoom é o Character Sprite Zooming.

EDIT: O link do sistema de zoom é esse: http://himeworks.com/2014/12/character-sprite-zooming/

Harus Game is coming.
https://www.indiexpo.net/pt/games/harus
© 2020 copyright.

06/07/2017 às 19:57 #3 Última edição: 06/07/2017 às 20:00 por Corvo
Ah, esse sistema. Você está falando do próprio projétil quando atira? Se sim, o sistema não reconhece objetos/inimigos pelo tamanho do sprite, mas pelo tile onde ele se encontra. Por exemplo, mesmo que o seu gráfico ocupe três tiles, somente aquele onde o evento se encontra é relevante, geralmente o central ou central-inferior.

Você pode tentar o seguinte: na pasta Graphics do seu projeto deve haver uma pasta denominada Particles. Lá dentro, estas duas imagens são os "tiros":


Você pode redimensioná-las para testar, mas tenho quase certeza de que não vai adiantar muito. Enfim, se eu entendi direito você precisa é de um ABS com colisão por píxels que, infelizmente, não conheço. :( Uma alternativa seria criar pontos de colisão em torno do inimigo, mas prepare-se para um bom trampo.

É.. não deu muito certo hahaha, mas obrigado de qualquer forma. Vou usar sprite pequeno mesmo.

Harus Game is coming.
https://www.indiexpo.net/pt/games/harus
© 2020 copyright.