gml - 如何向四个方向(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°,或者看起来是这样。
控制台输出
解决方案
Repeat()
是一个我不熟悉的函数,但它看起来确实具有与 for 循环类似的行为。我首先认为它不包括最大数量,但这里似乎并非如此。
请记住,您可以通过在此代码块中设置断点来调试程序,这样您就可以查看代码的行为方式并注意是否存在意外行为。它向右侧发射第二颗子弹的原因可能是因为它到达了default
您的 switch case 中的语句。
推荐阅读
- algorithm - 与 log(n) 行为混淆
- c# - 访问控制器时发生堆栈溢出
- javascript - 如何从 document.querySelectorAll() 正确循环遍历 NodeList?
- sorting - 猫鼬; 排序,使某个记录首先出现
- python - 几分钟后 SQLAlchemy 会话不断下降
- c# - 将以前的用户猜测添加到属性列表 C# 并从列表中打印属性值
- html - 使 img 和 input 正确排列并在 html 中向右浮动
- java - 如何通过 OrientDB 中的 Graph API(Tinkerpop Blueprints)按边检索顶点?
- node.js - 相关的 Graphql 对象给出未定义
- java - 从 CSV 文件中读取双精度