跳至正文

魔法导弹类武器

如果你处于1.4版本以上,请将下文中的projectile/item均换成Projecttile/Item(大小写)

这一期是魔法导弹(吟唱类武器的一种)

可控磁球

吟唱武器


如果武器在鼠标按住的时候一直持续某个效果,我们就称这种武器是吟唱攻击的。我们需要用到一个属性

// 新属性item.channel,表示这个物品是否是吟唱施法
item.channel = true;

如果使用了channel属性要记得把autoReuse这个属性设为false,可以设为true但是没必要。这样可以防止吟唱武器自动使用

跟踪/吟唱弹幕


item.channel这个属性会让玩家在使用物品后进入channel状态,可以用player.channel来检测

基本的逻辑就是: player.channel 是true时(就是玩家正在持续使用物品),就让磁球进入攻击状态,否则消失

现在有一个问题,玩家使用物品唱过item.animationTime就会消失,所以我们想让物品动画一直持续到吟唱结束,代码如下(AI重写函数):

// 如果玩家仍然在控制弹幕
if (Main.player[projectile.owner].channel)
{
    // 获取弹幕持有者
    Player player = Main.player[projectile.owner];
    // 从玩家到达鼠标位置的单位向量
    Vector2 unit = Vector2.Normalize(Main.MouseWorld - player.Center);
    // 随机角度
    float rotaion = unit.ToRotation();
    // 调整玩家转向以及手持物品的转动方向
    player.direction = Main.MouseWorld.X < player.Center.X ? -1 : 1;
    player.itemRotation = (float)Math.Atan2(rotaion.ToRotationVector2().Y * player.direction,
        rotaion.ToRotationVector2().X * player.direction);
    // 玩家保持物品使用动画
    player.itemTime = 2;
    player.itemAnimation = 2;
    // 从弹幕到达鼠标位置的单位向量
    Vector2 unit2 = Vector2.Normalize(Main.MouseWorld - projectile.Center);
    // 让弹幕缓慢朝鼠标方向移动
    projectile.velocity = unit2 * 5;
}
else
{
    // 如果玩家放弃吟唱就慢慢消失
    if (projectile.timeLeft > 30)
        projectile.timeLeft = 30;
    // 返回函数这样就不会执行下面的攻击代码
    return;
}

只需要修改 projectile.velocity = unit2 * 5;这一句话就可以让弹幕以不同的速度接近鼠标,但是现在又有一个问题,当弹幕接近鼠标的时候:

它就会抖动(剧烈搏动),修改方式就是当磁球跟鼠标距离低于某个阈值的时候将磁球位置固定到鼠标的位置就好了

// 让弹幕缓慢朝鼠标方向移动
if(Vector2.Distance(projectile.Center, Main.MouseWorld) < 5)
{
    projectile.velocity *= 0;
    projectile.Center = Main.MouseWorld;
}
else
{
    projectile.velocity = unit2 * 5;
}

发表回复