0

我正在关注FriendlyCosmonaut的 GameMaker Studio 2 游戏教程,它牺牲了可读性以便更好地理解,我并不介意,但我被困在视频的四个项目符号部分。我只是不明白。

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

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

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

这是我认为我在 (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°,或者看起来是这样。

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

控制台输出

控制台输出

4

2 回答 2

1

Repeat()是一个我不熟悉的函数,但它看起来确实具有与 for 循环类似的行为。我首先认为它不包括最大数量,但这里似乎并非如此。

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

于 2020-06-23T06:41:11.103 回答
1

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

  • obj_bullet(甚至在另一个对象中)的某些东西正在修改 的角度obj_bullet
  • _spd传入的变量initialize_bullet()不正确。
  • 的速度以obj_bullet其他方式修改。
于 2020-10-05T19:34:39.440 回答