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

5 Respostas   231 Visualizações

0 Membros e 1 Visitante estão vendo este tópico.

sati

  • *
  • Posts: 11
  • Ouros: 0
Tópico criado em: 25/03/2019 às 19:06 - Última modificação por King Gerar em 30/03/2019 às 15:00

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:
Código: [Selecionar]
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:

HammerStrike

  • Veterano
  • *
  • Posts: 333
  • Ouros: 280
  • "Quando vou terminar?quando estiver pronto!"
  • Equipamentos "Manejar espadas está lhe dando calos nas mãos? Uma bela luva pode ser uma boa saída, além de prover um manejo melhor das lâminas." "O norte sempre me surpreende, e este escudo não foi uma exceção. Em uma de minhas viagens lá vi ele, muito bonito e resistente, claro que não poderia deixar de trazer um." "Um dos melhores trabalhos dos povos das terras da noite é esse metal, que na escuridão mais gelada aquece o corpo que protege."
Resposta 1: 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.
1 Bit Estúdio

sati

  • *
  • Posts: 11
  • Ouros: 0
Resposta 2: 25/03/2019 às 20:05 - Última modificação por sati em 25/03/2019 às 20:07

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?

HammerStrike

  • Veterano
  • *
  • Posts: 333
  • Ouros: 280
  • "Quando vou terminar?quando estiver pronto!"
  • Equipamentos "Manejar espadas está lhe dando calos nas mãos? Uma bela luva pode ser uma boa saída, além de prover um manejo melhor das lâminas." "O norte sempre me surpreende, e este escudo não foi uma exceção. Em uma de minhas viagens lá vi ele, muito bonito e resistente, claro que não poderia deixar de trazer um." "Um dos melhores trabalhos dos povos das terras da noite é esse metal, que na escuridão mais gelada aquece o corpo que protege."
Resposta 3: 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.
1 Bit Estúdio

Geraldo de Rívia

  • Mito
  • *
  • Posts: 4452
  • Ouros: 3887
  • O vento está sibilando.
  • Medalhas Vencedor do Protótipo Premiado Participantes do Maps Together 2
Resposta 4: 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.

sati

  • *
  • Posts: 11
  • Ouros: 0
Resposta 5: 30/03/2019 às 14:22 - Última modificação por sati em 30/03/2019 às 14:24

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.

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.