【猎奇+篇:控制法】
前方大量声明,注意
要控制火力嘛……不然会鬼畜不是吗?所以这里就能利用上前面说的读取键盘状态了
这里可以分为几类触发机制,以下用F键作为例子
0.特别说明
务必加上p.whoAmI==Main.myPlayer的判定,如果你不想自己按键时全图玩家都开始放弹幕,想象一下全图按键会发生什么
1.单发
原理是记录上一帧的F键状态,如果两个状态不同,代表按下(弹起)了F,键,就可以放弹幕了
具体:
using System;
using TAPI;
using Microsoft.Xna.Framework;
namespace TAPI.【MOD名称】{
public class 【道具名称】:ModItem{
public 【道具名称】(ModBase modbase,Item i):base(modbase,i){}
bool oldF=false;
public override void Effects(Player p){
if(p.whoAmI==Main.myPlayer&&!oldF&&Main.keyState.IsKeyDown(Microsoft.Xna.Framework.Input.Keys.F)){
//这里面就是写前面发射子弹代码的地方
}
oldF=Main.keyState.IsKeyDown(Microsoft.Xna.Framework.Input.Keys.F;
}
}
}
这种触发方式的频率是取决于按键速度的,也就是按得越快射♂得越快,理论射速峰值为30发每秒
2.连发
原理是添加一个计时变量,至于具体怎么计时就看个人喜好了,这里提供一种解决方案:
using System;
using TAPI;
using Microsoft.Xna.Framework;
namespace TAPI.【MOD名称】{
public class 【道具名称】:ModItem{
public 【道具名称】(ModBase modbase,Item i):base(modbase,i){}
int timer=0;
public override void Effects(Player p){
if(timer>0)timer--;
else{
if(p.whoAmI==Main.myPlayer&&Main.keyState.IsKeyDown(Microsoft.Xna.Framework.Input.Keys.F)){
timer=10;
//这里面就是写前面发射子弹代码的地方
}
}
}
}
}
按住F就可以连射了~示例为每秒触发6次的写法
3.自动
这里就略复杂了点,需要具有想象力以及数学功底,当然还有对于弹幕的热爱=w=
简单地来一个施放旋转镰刀的脚本吧~
using System;
using TAPI;
using Microsoft.Xna.Framework;
namespace TAPI.ctx{
public class ctxbullet : ModItem{
int timer = 0;
float r = 0;
float rv = 0;
float ra = 0.001f;
bool barrage = false;
public ctxbullet(ModBase modbase, Item i) : base(modbase, i) { }
public override void Effects(Player p){
rv += ra;
if (rv > 3) rv -= (float)Math.PI * 2f;
r += rv;
if (r > 3) r -= (float)Math.PI * 2f;
timer++;
if (timer > 3) timer -= 3;
if (barrage){
if (p.statMana < 3 || p.whoAmI != Main.myPlayer){
barrage = false;
goto outOfMana;
}
else p.statMana -= 3;
if (timer % 3 == 0){
Vector2 pc = p.position + new Vector2(p.width, p.height) / 2;
Vector2 v = new Vector2((float)Math.Cos(r), (float)Math.Sin(r));
Projectile.NewProjectile(pc.X, pc.Y, v.X * 20f, v.Y * 20f, 274, 100, 0, p.whoAmI);
Projectile.NewProjectile(pc.X, pc.Y, -v.X * 20f, -v.Y * 20f, 274, 100, 0, p.whoAmI);
}
}
outOfMana:
if (Main.keyState.IsKeyDown(Microsoft.Xna.Framework.Input.Keys.F)) barrage = !barrage;
}
}
}
因为需要美观,就多定义了几个角度增速,角度加速度,角度急动度,角度痉挛度神马的……
效果图:
(所以说弹幕可以培养数学和想象力=w=)
当然,自动类弹幕的形式是非常多的,从上文简单的喷环环,到折返射、西行寺无余涅盘、梦想天生、原子崩坏、金刚枪破,等等……只要看懂弹幕的组成,tAPI就能写出来!
嘛……作为饰品部分的教程基本已经结束了,从道具json的创建一直到在cs里声明和操作变量,基本现在已经可以复原所有原版饰品的效果了,玩家们也能首夜裸装站撸机械三王了