首页 > 解决方案 > 如何向四个方向(0°、90°、180°、270°)发射四颗子弹?

问题描述

我正在关注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°,或者看起来是这样。

控制台输出

控制台输出

标签: gmlgame-maker-studio-2

解决方案


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

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


推荐阅读