我是新手,正在使用GameMaker遇到一个问题。我的问题出现在一个有限状态机中,我正在使用这个FSM框架,虽然它很老,但它是简单的东西,我一直在使用它来学习。我的脚本是我的“活动”状态,用于敌人;这些敌人是同一个敌人对象的多个实例。它包含代码(在帖子末尾显示),它做了以下事情:

  • 当状态首次进入时,设置正确的精灵
  • 在随机间隔内向玩家发射子弹
  • 移动(一个脚本处理平移运动,另一个脚本处理旋转)
  • 当被玩家子弹击中时,做一些事情并切换到“击中”状态

所有东西似乎都正常工作,除了子弹发射代码。所有敌人实例都独立移动并对玩家子弹做出反应,如预期,但当它是时候发射子弹时,所有子弹只从一个实例(第一个创建的实例)发射。所有实例都在运行子弹发射代码,但当 instance_create_layer(x, y, "Bullets", obj_enemyBullet) 运行时,使用的起始点始终是第一个实例的 x 和 y 坐标(无论我编写的代码有多么巧妙)。我可以确定所有实例都在运行子弹发射代码,但当 instance_create_layer(x, y, "Bullets", obj_enemyBullet) 运行时,使用的起始点始终是第一个实例的 x 和 y 坐标(无论我编写的代码有多么巧妙)。从我能看得出来,这似乎像是一个运行代码而不是实例的代码的结果,但如果这是我正在做的,我不知道这是什么或者如何纠正它。任何想法都将不胜感激!

function state_enemyActive() {
  // 如果这是一个新状态,设置精灵变量
  if (stateNew) {
    spriteIndexDeck = real(expValue);
    spriteIndexSails = real(expValue);
  }
  // 发射子弹
  if (irandom_range(1, fireRate * game_get_speed(gamespeed_fps)) == 1) {
    instance_create_layer(x, y, "Bullets", obj_enemyBullet);
  }
  // 移动敌人
  scr_moveEnemy();
  scr_rotateEnemy();
  // 如果敌人被玩家子弹击中
  if (place_meeting(x, y, obj_playerBullet)) {
    // 对击中玩家子弹的敌人采取适当行动
    scr_hitEnemy();
    // 切换到“Hit”状态
    fsm_stateSwitch("Hit");
  }
}