【问题标题】:How do I fire four bullets in four directions (0°, 90°, 180°, 270°)?如何向四个方向(0°、90°、180°、270°)发射四颗子弹?
【发布时间】:2023-03-15 06:35:01
【问题描述】:

我正在关注 FriendlyCosmonaut 的 game tutorial for GameMaker Studio 2,它牺牲了可读性以更好地理解,我并不介意,但我被视频的四个子弹部分卡住了。我就是不明白。

所以它基本上是迭代 i 并将其乘以 90,从而为 lengthdir_x 和 lengthdir_y 函数提供所需的角度,该函数返回所需的组件以在正确的方向上初始化子弹。

在其他情况下(two_bullets、three_bullets)运行良好,但不适用于本教程的four_bullets和star_bullets部分。

我让它看起来工作的唯一方法是迭代 5 次而不是 4 次。它看起来完全符合我的需要,但在我看来它不应该工作。 H2>

这是我认为我有问题的文件 (case powerups.four_bullets & case powerups.star_bullets):

///@description create_bullet
///@arg direction
///@arg speed
///@arg faction
///@arg gun_type*

var _dir = argument[0];
var _spd = argument[1];
var _fac = argument[2];

var _gun_type = -1;
if(argument_count > 3) _gun_type = argument[3];

switch(_gun_type){
    case powerups.two_bullets:
        var _sep = 12;

        var inst = instance_create_layer(
                    x+ lengthdir_x(_sep, _dir+90),
                    y+lengthdir_y(_sep, _dir+90),
                    "Instances", obj_bullet
                    );
        initialize_bullet(_dir, _spd, _fac, inst)
    
        var inst = instance_create_layer(
                    x + lengthdir_x(_sep, _dir-90),
                    y+lengthdir_y(_sep, _dir-90),
                    "Instances", obj_bullet
                    );
        initialize_bullet(_dir, _spd, _fac, inst)
        break;
    
    case powerups.three_bullets:
        var inst = instance_create_layer(
                    x,
                    y,
                    "Instances", obj_bullet
                    );
        initialize_bullet(_dir, _spd, _fac, inst)
    
        var _sep = 12;

        var inst = instance_create_layer(
                    x + lengthdir_x(_sep, _dir+90),
                    y + lengthdir_y(_sep, _dir+90),
                    "Instances", obj_bullet
                    );
        initialize_bullet(_dir, _spd, _fac, inst)
    
        var inst = instance_create_layer(
                    x + lengthdir_x(_sep, _dir-90),
                    y + lengthdir_y(_sep, _dir-90),
                    "Instances", obj_bullet
                    );
        initialize_bullet(_dir, _spd, _fac, inst)
        break;
    
    case powerups.four_bullets:
        var _sep = 7;
        var bullet_angle;

        var i = 0; repeat(4){
            bullet_angle = _dir + (i * 90);

            show_debug_message("bullet_angle:" + string(bullet_angle));
            show_debug_message("_dir:" + string(_dir));
            show_debug_message("i:" + string(i));
        
            var inst = instance_create_layer(
                    x + lengthdir_x(_sep, bullet_angle),
                    y + lengthdir_y(_sep, bullet_angle),
                    "Instances", obj_bullet
                    );
            initialize_bullet(bullet_angle, _spd, _fac, inst)
            i++;
        }
        break;
    
    case powerups.star_bullets:
        var _sep = 7;
        var bullet_angle;

        var i = 0; repeat(8){
            bullet_angle = _dir + (i*45);
            var inst = instance_create_layer(
                    x+ lengthdir_x(_sep, bullet_angle),
                    y+lengthdir_y(_sep, bullet_angle),
                     "Instances", obj_bullet
                    );
            initialize_bullet(bullet_angle, _spd, _fac, inst)
            i++;
        }
        break;
    
    case powerups.laser_bullets:
    
        break;
    default:
        var inst = instance_create_layer(x,y, "Instances", obj_bullet);
        initialize_bullet(_dir, _spd, _fac, inst)
        break;
}

inst.direction = image_angle;

这些图像经过 4 次迭代,而不是 5 次。

子弹飞离飞船原点的屏幕截图。但是应该去 270° 的子弹会变成 0°,或者看起来是这样。

控制台输出

【问题讨论】:

    标签: gml game-maker-studio-2


    【解决方案1】:

    Repeat() 是一个我不熟悉的函数,但它看起来确实有相似之处 虽然作为 for 循环的行为。 我一开始以为它不包括最大数量,但这里似乎不是这样。

    请记住,您可以通过在此代码块中设置断点来调试程序,这样您就可以查看代码的行为方式,并注意是否存在意外行为。它向右侧发射第二颗子弹的原因可能是因为它到达了您的 switch 案例中的 default 语句。

    【讨论】:

    • 是的,我也想过默认语句,但我检查了它并没有达到它。我会继续寻找。谢谢你给我指点!
    【解决方案2】:

    这个脚本中的一切看起来都很好(我什至在我自己的演示 GameMaker 项目中运行了一些)。您提供的调试日志也支持这一点。当您使用repeat(4) 时,它会将正确的值传递给initialize_bullet()。在您的示例中,它是 0、90、180、270(与调试日志中的值相同)。这会让我认为可能会发生一些奇怪的事情,比如在你的脚本内部initialize_bullet()。这是我对什么给您带来问题的最佳猜测。我不知道您的其余代码是什么样的,所以这里有一些我能想到的其他可能的问题来源:

    • obj_bullet(甚至另一个对象)中的某些东西正在修改obj_bullet 的角度。
    • 传递给initialize_bullet()_spd 变量不正确。
    • obj_bullet 的速度以其他方式被修改。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-01-07
      • 2017-05-22
      • 1970-01-01
      • 1970-01-01
      • 2013-04-22
      • 1970-01-01
      • 2015-04-24
      • 1970-01-01
      相关资源
      最近更新 更多