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

Colisão de ABS Por Evento

Iniciado por HammerStrike, 12/10/2017 às 16:34

12/10/2017 às 16:34 Última edição: 14/10/2017 às 11:19 por Corvo
Olá, estou tentando criar um sistema de batalha simples por evento, mas existe um problema. Eu criei as condições tanto para o inimigo quanto para o jogador tomarem o dano, só que as duas ações acontecem ao mesmo tempo (Ataque do jogador e ataque do monstro). Como eu posso fazer um sistema em que se o jogador atacar mais rápido ele não sofrera o dano?

Quem puder me dar uma dica ficaria agradecido.

EDIT: 18:22

Vou aproveitar o post e vou deixar aqui outra duvida. Eu consegui um código para fazer um sistema de game estilo 'beat em up' mas ele está entrando em conflito com o sistema de multi frames (Estou usando 8 frames de animação de char) queria resolver esse problema pra poder criar um game de ação.

Script de Direção Fixa
Spoiler

class Sprite_Character < Sprite_Base 
  #-------------------------------------------------------------------------- 
  # * Update Transfer Origin Rectangle 
  #-------------------------------------------------------------------------- 
  def update_src_rect   
    # Only face left/right unless on a ladder or direction_fix   
    if @character.ladder? || @character.direction_fix || [4,6].include?(@character.direction)     
      @sprite_direction = @character.direction   
    elsif @old_direction       
      @sprite_direction = @old_direction   
    elsif !@sprite_direction     
      @sprite_direction = [4,6][rand(2)]   
    end   
    @old_direction = @sprite_direction if [4,6].include?(@sprite_direction)   
    if @tile_id == 0     
      index = @character.character_index     
      pattern = @character.pattern < 8 ? @character.pattern : 8     
      sx = (index % 4 * 3 + pattern) * @cw     
      sy = (index / 4 * 4 + (@sprite_direction - 2) / 2) * @ch     
      self.src_rect.set(sx, sy, @cw, @ch)   
    end 
  end
end
[close]

Script de Multi Frames do Galv's
Spoiler

#------------------------------------------------------------------------------#
#  Galv's Character Animations
#------------------------------------------------------------------------------#
#  For: RPGMAKER VX ACE
#  Version 1.7
#------------------------------------------------------------------------------#
#  2013-01-07 - Version 1.7 - Slight tweaks
#  2012-10-06 - Version 1.6 - Updated alias names for compatibility
#  2012-10-06 - Version 1.5 - Added dash speed option. Fixed some code
#  2012-09-21 - Version 1.4 - Optimised the code significantly (to my ability)
#                           - Some bug fixes
#  2012-09-21 - Version 1.3 - Added ability to repeat common event
#                           - Added follower animations
#  2012-09-20 - Version 1.2 - fixed compatibility with Galv's Region Effects
#  2012-09-20 - Version 1.1 - added idle common event, removed unnecessary code
#  2012-09-20 - Version 1.0 - release
#------------------------------------------------------------------------------#
#  Designed to give actors additional animations such as:
#  - Idle
#  - Walking
#  - Dashing
#  - Custom (run a common event if you've been idle for a period of time)
#
#  INSTRUCTIONS:
#  1. Copy this script below materials and above main
#  2. Create your charset files with extensions (see setup options)
#   by default these are:
#        - "Actor1.png" for idle
#        - "Actor1_walk.png" for walking
#        - "Actor1_dash.png" for dashing
#  Make sure the actor's sprites are in the same position in each charset.
#  (you can have 8 actors in each spritesheet)
#
#------------------------------------------------------------------------------#
#
#  KNOWN ISSUES:
#  - Move Route Change graphic commands only work when the switch is on.
#    Then if you turn it off again, the graphic changes back to the original.
#    Use "Set Actor Graphic" event command to change instead.
#
#------------------------------------------------------------------------------# 
#  !!!!! WARNING - I am a learning scripter. Use this at your own risk!!!!!!
#------------------------------------------------------------------------------#

($imported ||= {})["Chara_Anims"] = true
module Chara_Anims
   
#------------------------------------------------------------------------------# 
#  SETUP OPTIONS
#------------------------------------------------------------------------------#

  WALK_EXTENSION = "_walk"    # appends to end of file names to determine
                              # the walking charsets.

  DASH_EXTENSION = "_dash"    # appends to end of dashing charset filename
                              # Make it the same as walk extension to disable
  DASH_SPEED = 1.2            # 1 is RMVX default dash speed.
   

  PAUSE = 5                   # frames before idle animation starts
                              # (60 frames per second). I was planning something
                              # with this but you shouldn't change it for now.

  ANIM_SWITCH = 99             # ID of a switch to disable this effect.
                              # Turn switch ON in order to use change graphic
                              # move route commands. Turn off to restore anims.
   
  STEP_ANIMATION = true       # If "Stepping" is on or off by default.
                              # Can be true or false.

  COMMON_EVENT = 1            # Common event ID that plays after a certain time
  COMMON_EVENT_TIME = 200     # Frames idle before common event called.
  REPEAT_EVENT = false        # Repeat this common event if player remains idle?
                              # (restarts the common event time) true or false.
#------------------------------------------------------------------------------# 
#  END SETUP OPTIONS
#------------------------------------------------------------------------------#

                                   
end # Chara_Anims


class Sprite_Character < Sprite_Base
  alias galv_charanim_initialize initialize
  def initialize(viewport, character = nil)
    @idletime = 0
    galv_charanim_initialize(viewport, character)
  end

  alias galv_charanim_update update
  def update
    galv_charanim_update
    return if $game_switches[Chara_Anims::ANIM_SWITCH]
    return move_anim if $game_player.moving?
    @idletime += 1
    idle_anim if @idletime == Chara_Anims::PAUSE
    idle_event if @idletime == Chara_Anims::COMMON_EVENT_TIME
  end

  def idle_anim
    $game_player.step_anime = Chara_Anims::STEP_ANIMATION
    $game_party.battle_members.each { |m|
      default = m.character_name.chomp(Chara_Anims::DASH_EXTENSION)
      m.set_g(default.chomp(Chara_Anims::WALK_EXTENSION))
    }
    $game_player.refresh
    @idletime += 1
  end

  def move_anim
    $game_party.battle_members.each { |m|
      if $game_player.dash?
        if !m.character_name.include?(Chara_Anims::DASH_EXTENSION)
          m.set_g(m.character_name.chomp(Chara_Anims::WALK_EXTENSION) + Chara_Anims::DASH_EXTENSION)
        end
      else
        if !m.character_name.include?(Chara_Anims::WALK_EXTENSION)
          m.set_g(m.character_name.chomp(Chara_Anims::DASH_EXTENSION) + Chara_Anims::WALK_EXTENSION)
        end
      end
    }
    $game_player.refresh
    @idletime = 0
  end

  def idle_event
    $game_temp.reserve_common_event(Chara_Anims::COMMON_EVENT)
    @idletime = 0 if Chara_Anims::REPEAT_EVENT
  end
end # Sprite_Character < Sprite_Base


class Game_CharacterBase
  alias galv_charanim_init_public_members init_public_members
  def init_public_members
    galv_charanim_init_public_members
    @step_anime = Chara_Anims::STEP_ANIMATION
  end
   
  alias galv_charanim_real_move_speed real_move_speed
  def real_move_speed
    galv_charanim_real_move_speed
    @move_speed + (dash? ? Chara_Anims::DASH_SPEED : 0)
  end
end # Game_CharacterBase


class Game_Actor < Game_Battler
  def set_g(character_name)
    @character_name = character_name
  end
end # Game_Actor < Game_Battler


class Game_Player < Game_Character
  attr_accessor :step_anime
end # class Game_Player < Game_Character
[close]
Hammer Strike

Se eu entendi bem, o que você quer é o seguinte: quando o jogador ataca mais rapidamente que o inimigo, o ataque que o inimigo estaria preparando/usando é cancelado, certo? Se for este o caso, ligue um switch toda vez que o herói for atacar, lembrando-se de desligá-lo ao final do ataque. Use o mesmo em uma condição no ataque do inimigo para verificar se o jogador atacou primeiro. É possível que cause alguns bugs dependendo das mecânicas de ataque que você criou, principalmente se executadas à distância. Qualquer coisa, poste imagens da programação dos eventos que veremos o que podemos fazer.

Citação de: Corvo online 12/10/2017 às 16:39
Se eu entendi bem, o que você quer é o seguinte: quando o jogador ataca mais rapidamente que o inimigo, o ataque que o inimigo estaria preparando/usando é cancelado, certo? Se for este o caso, ligue um switch toda vez que o herói for atacar, lembrando-se de desligá-lo ao final do ataque. Use o mesmo em uma condição no ataque do inimigo para verificar se o jogador atacou primeiro. É possível que cause alguns bugs dependendo das mecânicas de ataque que você criou, principalmente se executadas à distância. Qualquer coisa, poste imagens da programação dos eventos que veremos o que podemos fazer.

Funcionou Corvo, a dica que tu deu foi boa, não está 100% ainda mas da pra jogar.
Vou aproveitar o post e vou deixar aqui outra duvida. Eu consegui um código para fazer um sistema de game estilo 'beat em up' mas ele está entrando em conflito com o sistema de multi frames (Estou usando 8 frames de animação de char) queria resolver esse problema pra poder criar um game de ação.

Script de Direção Fixa
Spoiler

class Sprite_Character < Sprite_Base 
  #-------------------------------------------------------------------------- 
  # * Update Transfer Origin Rectangle 
  #-------------------------------------------------------------------------- 
  def update_src_rect   
    # Only face left/right unless on a ladder or direction_fix   
    if @character.ladder? || @character.direction_fix || [4,6].include?(@character.direction)     
      @sprite_direction = @character.direction   
    elsif @old_direction       
      @sprite_direction = @old_direction   
    elsif !@sprite_direction     
      @sprite_direction = [4,6][rand(2)]   
    end   
    @old_direction = @sprite_direction if [4,6].include?(@sprite_direction)   
    if @tile_id == 0     
      index = @character.character_index     
      pattern = @character.pattern < 8 ? @character.pattern : 8     
      sx = (index % 4 * 3 + pattern) * @cw     
      sy = (index / 4 * 4 + (@sprite_direction - 2) / 2) * @ch     
      self.src_rect.set(sx, sy, @cw, @ch)   
    end 
  end
end
[close]

Script de Multi Frames do Galv's
Spoiler

#------------------------------------------------------------------------------#
#  Galv's Character Animations
#------------------------------------------------------------------------------#
#  For: RPGMAKER VX ACE
#  Version 1.7
#------------------------------------------------------------------------------#
#  2013-01-07 - Version 1.7 - Slight tweaks
#  2012-10-06 - Version 1.6 - Updated alias names for compatibility
#  2012-10-06 - Version 1.5 - Added dash speed option. Fixed some code
#  2012-09-21 - Version 1.4 - Optimised the code significantly (to my ability)
#                           - Some bug fixes
#  2012-09-21 - Version 1.3 - Added ability to repeat common event
#                           - Added follower animations
#  2012-09-20 - Version 1.2 - fixed compatibility with Galv's Region Effects
#  2012-09-20 - Version 1.1 - added idle common event, removed unnecessary code
#  2012-09-20 - Version 1.0 - release
#------------------------------------------------------------------------------#
#  Designed to give actors additional animations such as:
#  - Idle
#  - Walking
#  - Dashing
#  - Custom (run a common event if you've been idle for a period of time)
#
#  INSTRUCTIONS:
#  1. Copy this script below materials and above main
#  2. Create your charset files with extensions (see setup options)
#   by default these are:
#        - "Actor1.png" for idle
#        - "Actor1_walk.png" for walking
#        - "Actor1_dash.png" for dashing
#  Make sure the actor's sprites are in the same position in each charset.
#  (you can have 8 actors in each spritesheet)
#
#------------------------------------------------------------------------------#
#
#  KNOWN ISSUES:
#  - Move Route Change graphic commands only work when the switch is on.
#    Then if you turn it off again, the graphic changes back to the original.
#    Use "Set Actor Graphic" event command to change instead.
#
#------------------------------------------------------------------------------# 
#  !!!!! WARNING - I am a learning scripter. Use this at your own risk!!!!!!
#------------------------------------------------------------------------------#

($imported ||= {})["Chara_Anims"] = true
module Chara_Anims
   
#------------------------------------------------------------------------------# 
#  SETUP OPTIONS
#------------------------------------------------------------------------------#

  WALK_EXTENSION = "_walk"    # appends to end of file names to determine
                              # the walking charsets.

  DASH_EXTENSION = "_dash"    # appends to end of dashing charset filename
                              # Make it the same as walk extension to disable
  DASH_SPEED = 1.2            # 1 is RMVX default dash speed.
   

  PAUSE = 5                   # frames before idle animation starts
                              # (60 frames per second). I was planning something
                              # with this but you shouldn't change it for now.

  ANIM_SWITCH = 99             # ID of a switch to disable this effect.
                              # Turn switch ON in order to use change graphic
                              # move route commands. Turn off to restore anims.
   
  STEP_ANIMATION = true       # If "Stepping" is on or off by default.
                              # Can be true or false.

  COMMON_EVENT = 1            # Common event ID that plays after a certain time
  COMMON_EVENT_TIME = 200     # Frames idle before common event called.
  REPEAT_EVENT = false        # Repeat this common event if player remains idle?
                              # (restarts the common event time) true or false.
#------------------------------------------------------------------------------# 
#  END SETUP OPTIONS
#------------------------------------------------------------------------------#

                                   
end # Chara_Anims


class Sprite_Character < Sprite_Base
  alias galv_charanim_initialize initialize
  def initialize(viewport, character = nil)
    @idletime = 0
    galv_charanim_initialize(viewport, character)
  end

  alias galv_charanim_update update
  def update
    galv_charanim_update
    return if $game_switches[Chara_Anims::ANIM_SWITCH]
    return move_anim if $game_player.moving?
    @idletime += 1
    idle_anim if @idletime == Chara_Anims::PAUSE
    idle_event if @idletime == Chara_Anims::COMMON_EVENT_TIME
  end

  def idle_anim
    $game_player.step_anime = Chara_Anims::STEP_ANIMATION
    $game_party.battle_members.each { |m|
      default = m.character_name.chomp(Chara_Anims::DASH_EXTENSION)
      m.set_g(default.chomp(Chara_Anims::WALK_EXTENSION))
    }
    $game_player.refresh
    @idletime += 1
  end

  def move_anim
    $game_party.battle_members.each { |m|
      if $game_player.dash?
        if !m.character_name.include?(Chara_Anims::DASH_EXTENSION)
          m.set_g(m.character_name.chomp(Chara_Anims::WALK_EXTENSION) + Chara_Anims::DASH_EXTENSION)
        end
      else
        if !m.character_name.include?(Chara_Anims::WALK_EXTENSION)
          m.set_g(m.character_name.chomp(Chara_Anims::DASH_EXTENSION) + Chara_Anims::WALK_EXTENSION)
        end
      end
    }
    $game_player.refresh
    @idletime = 0
  end

  def idle_event
    $game_temp.reserve_common_event(Chara_Anims::COMMON_EVENT)
    @idletime = 0 if Chara_Anims::REPEAT_EVENT
  end
end # Sprite_Character < Sprite_Base


class Game_CharacterBase
  alias galv_charanim_init_public_members init_public_members
  def init_public_members
    galv_charanim_init_public_members
    @step_anime = Chara_Anims::STEP_ANIMATION
  end
   
  alias galv_charanim_real_move_speed real_move_speed
  def real_move_speed
    galv_charanim_real_move_speed
    @move_speed + (dash? ? Chara_Anims::DASH_SPEED : 0)
  end
end # Game_CharacterBase


class Game_Actor < Game_Battler
  def set_g(character_name)
    @character_name = character_name
  end
end # Game_Actor < Game_Battler


class Game_Player < Game_Character
  attr_accessor :step_anime
end # class Game_Player < Game_Character
[close]
Hammer Strike

12/10/2017 às 18:31 #3 Última edição: 12/10/2017 às 18:40 por Corvo
Se funciona já é um avanço. Agora, a segunda dúvida se encaixaria em outra área, mas já que estamos aqui vamos lá. Qual erro aparece? (Estou sem o Ace no momento para testar, mas caso queira espere até mais tarde eu baixo ele aqui.) Se é incompatibilidade entre os scripts, eu escolheria o mais essencial de ambos para manter e removeria o outro. Por exemplo: desculpe a sinceridade, mas eu acho esse script de Direção Fixa relativamente inútil. Se você quer que os personagens se movam apenas horizontalmente bastaria bloquear a passabilidade dos tiles e/ou configurar os gráficos para terem apenas duas direções.

12/10/2017 às 18:42 #4 Última edição: 12/10/2017 às 18:46 por Corvo
Citação de: Corvo online 12/10/2017 às 18:31
Se funciona já é um avanço. Agora, a segunda dúvida se encaixaria em outra área, mas já que estamos aqui vamos lá. Qual erro aparece? (Estou sem o Ace no momento para testar, mas caso queira espere até mais tarde eu baixo ele aqui.) Se é incompatibilidade entre os scripts, eu escolheria o mais essencial de ambos para manter e removeria o outro. Por exemplo: desculpe a sinceridade, mas eu acho esse script de Direção Fixa relativamente inútil. Se você quer que os personagens se movam apenas horizontalmente bastaria bloquear a passabilidade dos tiles e/ou configurar os gráficos para terem apenas duas direções.

O que acontece é que o script de direção fixa buga o multiframes, ele ao invés de rodar os 8 frames ele fica nos 3 que é o padrão do VX Ace. Eu já deixar os charsets com as imagens como você falou, apenas para os lados mas no game ele n fica certinho, as vezes quando você está virado pra direita e coloca pra cima automaticamente ele se volta pra esquerda por conta de ter mudado o gráfico de virado pra cima pra um gráfico de char de lado. Apenas por isso tava atrás desse sistema de direção fixa. Fico no aguardo Corvo.
Hammer Strike

Então, pelo que vi você não vai conseguir fazer os dois scripts funcionarem visto que eles trabalham da mesma forma. Enquanto o de direção fixa trava o gráfico nos primeiros - teoricamente únicos - frames de determinada direção, o outro cria mais e força o gráfico a mudar.

Eu sugiro que esqueça esse script de direção fixa, é uma coisa que tu faz em cinco minutos por eventos ou apenas pela passabilidade mesmo. Ou migre pra outra engine que seja melhor para reproduzir um jogo nesse estilo.