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

Stack level too deep (systemstackerror) no rpg maker vx ace

Iniciado por sati, 25/03/2019 às 19:06

25/03/2019 às 19:06 Última edição: 30/03/2019 às 15:00 por King Gerar
Por favor me ajudem! Eu estou quebrando a minha cabeça com esse erro, eu estava aprendendo mais a programar com as aulas do Khas e apareceu esse problema e não sei como resolver! Já revisei várias e várias vezes e não estou encontrando o erro!

O script é este:
module ABS_Config
  Default_Animation = 1
  Opacity_Burn = 10
  Enemy_Recover = 60
  Attack_Key = :Y
  Player_Recover = 40
end

class Game_Map
  attr_accessor :enemies
  attr_accessor :damage_sprites
  alias abs_setup setup 
  def setup(map_id)
    @enemies.nil? ? @enemies = [] : @enemies.clear
    abs_setup(map_id)
  end
end

class ABS_Enemy
  include ABS_Config
  attr_accessor :hp
  attr_accessor :attack
  attr_accessor :defense
  attr_reader :name
  attr_reader :animation
  def initialize(id)
    enemy = Game_Enemy.new(0,id)
    @name = enemy.name
    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_Event < Game_Character
  attr_reader :enemy
  alias abs_setup_page_settings setup_page_settings
  alias abs_initialize initialize
  alias abs_update update
  alias abs_start start
  
  def initialize(map_id, event)
    @enemy = nil
    @recover = 0
    abs_initialize(map_id, event)
  end
  def setup_page_settings
    abs_setup_page_settings
    check_enemy
  end
  def check_enemy
    unless @enemy.nil?
      @enemy = nil
      $game_map.enemies.delete(self) if $game_map.enemies.include?(self)
    end
    return if @list.nil?
    for command in @list
      next unless command.code == 108 or command.code == 408
      if command.parameters[0].include?("cmd:enemy=")
        id = command.parameters[0].sub("cmd:enemy=","")
        @enemy = ABS_Enemy.new(id.to_i)
        @trigger = 2
        $game_map.enemies.push(self)
        print "#{@enemy.name} criado!\n"
      end
    end
  end
  def damage_enemy(value)
    jump(0,0)
    value -= @enemy.defense
    value = 0 if value < 0
    $game_map.damage_sprites.push(Damage_Sprite.new(self,value))
    @enemy.hp -= value
    if @enemy.hp <= 0
      $game_map.enemies.delete(self)
      RPG::SE.new("Collapse1", 80).play
    end
  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 -= ABS_Config::Opacity_Burn 
    else
      @character_name = ""
      @opacity = 255
      @priority_type = 0
      @trigger = 0
      @enemy = nil
    end
  end
  def start
    @enemy.nil? ? abs_start : attack
  end
  def attack
    return if @enemy.hp <= 0 or @recover > 0 
    @recover = ABS_Config::Enemy_Recover
    $game_player.animation_id = @enemy.animation
    $game_player.damage_hero(@enemy.attack)
  end
end

class Game_Player < Game_Character
  alias abs_initialize initialize
  alias abs_update update
  def initialize
    @recover = 0
    @kill_player = false
    abs_initialize 
  end
  def update
    @recover -= 1 if @recover > 0
    update_attack if @recover > 0 and Input.trigger?(ABS_Config::Attack_Key) 
    update_kill if @kill_player
    abs_update
  end
  def update_attack
    return if @kill_player
    for enemy in $game_map.enemies
      ax = @x - enemy.x
      ay = @y - enemy.y
      case @direction
      when 2 
        attack_enemy(enemy) if ax == 0 and ay == -1
      when 4 
        attack_enemy(enemy) if ay == 0 and ax == 1
      when 6 
        attack_enemy(enemy) if ay == 0 and ax == -1
      when 8 
        attack_enemy(enemy) if ax == 0 and ay == 1
      end
    end
  end
  def attack_enemy(event)
    hero = $game_party.members[0]
    event.damage_enemy(hero.atk)
    event.animation_id = hero.weapons[0].animation_id
    @recover = ABS_Config::Player_Recover
  end
  def damage_hero(value)
    return if @kill_player
    jump(0,0)
    hero = $game_party.members[0]
    value -= hero.def
    value = 0 if value < 0
    $game_map.damage_sprites.push(Damage_Sprite.new(self,value))
    if value > hero.hp
      hero.hp = 1
      @kill_player = true
      RPG::SE.new("Collapse1",80).play
    else
      hero.hp -= value
    end
  end
  def update_kill
        if @opacity > 0
      @opacity -= ABS_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 = []
    abs initialize
  end
  def update
    abs_update
    trash = []
    for sprite in $game_map.damage_sprites
      sprite.update
      trash.push(sprite) if sprite.disposed?
    end
    for item in trash
      $game_map.damage_sprites.delete(item)
    end
    trash.clear
  end
  def dispose
    abs_dispose
    for sprite in $game_map.damage_sprites
      sprite.bitmap.dispose
      sprite.dispose
    end
    $game_map.damage_sprites.clear
  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.x = target.screen_x
    self.y = target.screen_y - 40
    self.z = 999
    @timer = 20
  end
  def update
    self.x = target.screen_x
    self.y = target.screen_y - 40
    if @timer > 0
      @timer -= 1
      self.zoom_x += 0.01
      self.zoom_y += 0.01
    else
      self.opacity > 0 ? self.opacity -= 15 : dispose
    end
  end
  def dispose
    self.bitmap.dispose
    super
  end
end


Por favor me ajudem!!  :T.T: :T.T:

Movi o tópico para área certa (Suporte).

Esse erro aconteceu comigo algumas vezes e a causa geralmente era a mesma. Pode ter script repetido ou trechos do código repetido, da uma olhada ai pra ver se é isso.
Hammer Strike

Citação de: HammerStrike online 25/03/2019 às 19:45
Movi o tópico para área certa (Suporte).

Esse erro aconteceu comigo algumas vezes e a causa geralmente era a mesma. Pode ter script repetido ou trechos do código repetido, da uma olhada ai pra ver se é isso.

Obrigada por mover o tópico, e, sim, já pesquisei várias vezes sobre esse tema e oque mais acontece é a repetição, mas ainda não entendo direito o problema, por que os scripts parecem estar nos lugares certos e mesmo assim dá erro. Você pode me dizer como conseguiu achar o problema e arruma-lo?

Quando da erro geralmente quando tu abre a tela de script e ele vai estar na linha do erro. Outra opção é criar um novo Projeto e ir copiando script por script e ir testando a cada script novo pra saber qual deles está dando erro.
Hammer Strike

Na minha experiência com esse erro, ele ocorre quando você chama uma terceira cena (Scene) sem disposar/destruir uma primeira. Tipo, você está na cena de título e chama a cena do mapa, até aí ok afinal é até o que o comando novo jogo faz. Porém, ao chamar o menu você estará chamando a cena de menu e nesse momento a cena de título já têm de estar disposada/destruída.
Creio que isso é uma ferramenta de segurança para que não sejam chamadas cenas demais, pois assim elas ficariam se acumulando, tomando RAM e processamento da máquina, até por fim travar ou crashar. Não tenho certeza, mas acho que isso já aconteceu comigo com loops também, quando chamei muitos um dentro do outro.

Geralmente eu identifico onde ele está rapidamente em meus códigos, comumente por eu esquecer de colocar algo, agora para um leigo encontrar a causa... não sei como aconselhar senão a reconstrução do código, claro, testando constantemente, para que na hora de encontrá-lo, saiba onde está e possa avaliar o que está causando-o.

Citação de: HammerStrike online 25/03/2019 às 20:39
Quando da erro geralmente quando tu abre a tela de script e ele vai estar na linha do erro. Outra opção é criar um novo Projeto e ir copiando script por script e ir testando a cada script novo pra saber qual deles está dando erro.

Citação de: King Gerar online 25/03/2019 às 22:07
Na minha experiência com esse erro, ele ocorre quando você chama uma terceira cena (Scene) sem disposar/destruir uma primeira. Tipo, você está na cena de título e chama a cena do mapa, até aí ok afinal é até o que o comando novo jogo faz. Porém, ao chamar o menu você estará chamando a cena de menu e nesse momento a cena de título já têm de estar disposada/destruída.
Creio que isso é uma ferramenta de segurança para que não sejam chamadas cenas demais, pois assim elas ficariam se acumulando, tomando RAM e processamento da máquina, até por fim travar ou crashar. Não tenho certeza, mas acho que isso já aconteceu comigo com loops também, quando chamei muitos um dentro do outro.

Geralmente eu identifico onde ele está rapidamente em meus códigos, comumente por eu esquecer de colocar algo, agora para um leigo encontrar a causa... não sei como aconselhar senão a reconstrução do código, claro, testando constantemente, para que na hora de encontrá-lo, saiba onde está e possa avaliar o que está causando-o.

Eu fiz o que vocês me falaram, e deu certo! Eu encontrei o meu erro e foi um erro bobo. Estava dando no "for sprite in $game_map.damage_sprites", por que eu estava repetindo duas vezes, mas o erro não era ele realmente, era o "abs initialize" eu tinha esquecido de... colocar... o "_"... Mesmo assim obrigada pela ajuda! Se não fosse vocês eu ainda estaria quebrando a cabeça.