我是新手,正在使用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");
}
}
评论 (0)