2014-02-18 16:36:04 k73电玩之家 作者:小新
6.3.效果图:
BURN BABY,BURN!
嗯……本期教程就此结束,下期将是:【猎奇篇:读取操作】,如何用饰品给予玩家可控的额外火力,尽请期待~
附思考题:
如何做出十动然拒徽章的效果?(排除危险NPC和proj到安全距离以外)(neta自拥着转)
提示:
①proj对应的组是Main.projectile,proj的类型是Projectile
②proj和NPC一样有位置和宽高数据,位置可以被任意操作
③敌对NPC特征是friendly逻辑值为假,敌对proj特征是hostile逻辑值为真
【猎奇篇:读取操作】
前言:
其实这一篇严格地说并不是为增强火力而存在的;换句话说,它不只是为增强火力存在的。
只要读取了电脑前玩家的操作,加上自定的一些代码,玩家就可以做到扩展整个人物的功能,就像K键召唤所有BOSS,F键瞬移,等等……
下面是正题:
1.读取玩家行动
读取玩家行动,其实只需熟记表示玩家状态的几个逻辑值,就能对玩家相应的行动做到加强或改变;平时需要用的基本就是这几条了:
controlLeft;控制向左
controlRight;控制向右
controlUp;控制向上
controlDown;控制向下
controlJump;控制跳
controlHook;控制钩子
例:如何做一个让玩家移动速度加快的饰品?
大体思路就是读取玩家按下的方向键,并相应地适当改变玩家速度,如下:
if (p.controlLeft)
{
if (p.velocity.X > 0) p.velocity.X *= 0.95f;
else if (p.velocity.X > -30) p.velocity.X -= p.velocity.Y == 0 ? 0.5f : 1f;
}
if (p.controlRight)
{
if (p.velocity.X < 0) p.velocity.X *= 0.95f;
else if (p.velocity.X < 30) p.velocity.X += p.velocity.Y == 0 ? 0.5f : 1f;
}
if (p.controlUp)
{
p.controlJump = true;
if (p.velocity.Y > 0) p.velocity.Y *= 0.95f;
else if (p.velocity.Y > -30) p.velocity.Y -= 1f;
}
以上的作用是:玩家控制向左时就增加向左速度,玩家控制向右就增加向右速度;将控制向上和控制跳跃绑定,控制向上就增加向上的速度
2.读取鼠标状态
游戏中自带显示鼠标状态的逻辑值,Main.mouseLeft和Main.mouseRight分别表示鼠标左键和右键是否按下;相应的还有Main.mouseLeftRelease和Main.mouseRightRelease表示左右键是否未按下,可以理解为两者相反
思考题:如何制作按下鼠标右键就回血的饰品?运用前面的教程,题目较为简单,这里就不写示例了
3.读取键盘状态
Main.keyState.IsKeyDown(Microsoft.Xna.Framework.Input.Keys.【按键代号】)
这个语句用来读取键盘状态,如果当前按下了指定【按键代号】的键就等于真;反之,假。一般来说,提取字母键的状态只需把按键代号写成相应大写字母;F1-F12也是直接写大写F加数字就可以了
【猎奇+篇:辅助火力】
提示:这一篇将会有大量的英语和数学成分,不过LZ相信你们会比上学期英语倒10的LZ看得更明白的~
当然最开始还是喜闻乐见地分条讲解代码:
1.Projectile.NewProjectile(坐标X,坐标Y,速度X,速度Y,种类,伤害,击退,所属玩家,ai0,ai1)
字面意思,用来在世界里生成一个proj,中心对准给定的坐标,速度为给定速度,种类、伤害、击退等等都是可以指定的,所属玩家一般写Main.myPlayer或者p.whoAmI(当自己被编号为p时)至于那个ai0和ai1,目前还不需要它们,在写的时候可以纯粹省略这两项,或者填0
这句话可以说是附加火力的核心,没有它一切都是免谈,想象一下,对准怪物按下鼠标,想让火球飞过去就飞火球,想飞激光就飞激光……
桥豆麻袋!电脑怎么知道你想让那个proj飞到哪里去?下面是一些有关确定速度方向的讲解:
①三角函数天才,或者平面向量万年挂科,请前往条目2
②平面向量学霸或者痛恨三角函数,请前往条目3
1.1.先确定自己和鼠标的位置吧~
Vector2 pc=p.position+new Vector2(p.width,p.height)/2;
Vector2 mc=Main.screenPosition+new Vector2(Main.mouseX,Main.mouseY);
2.Math.Atan2(对边,斜边)
两个向量作差,得到了什么?向量?错!是直角三角形!
float r=(float)Math.Atan2(mc.Y-pc.Y,mc.X-pc.X);
(这个函数是反正切,又不是反正切,因为它的对边和斜边随便哪个取0都是可以输出结果的;而且它的值域是2π,也就是一圈!)
接下来,Vector2 v=new Vector2((float)Math.Cos(r),(float)Math.Sin(r));
这就是单位长度,方向从玩家中心指向鼠标的速度向量
3.Vector2.Distance(向量1,向量2)
这个语句是用来求两个向量距离的,同样的效果也可以用求向量长度的语句((向量1-向量2).Length())来实现
Q:没事求向量长度干啥?
A:向量除以长度等于单位向量
也就是:Vector2 v=(mc-pc)/Vector2.Distance(mc,pc);
一发♂入魂的单位向量~
下面就可以组装起来了:
Vector2 pc=p.position+new Vector2(p.width,p.height)/2;
Vector2 mc=Main.screenPosition+new Vector2(Main.mouseX,Main.mouseY);
Vector2 v=(mc-pc)/Vector2.Distance(mc,pc);
Projectile.NewProjectile(pc.X,pc.Y,v.X*6,v.Y*6,255,50,0,p.whoAmI);
示例中为使用单位向量法,速度大小为6,伤害为50,无击退的磁球激光
直接写进去?不不不那样会鬼畜的,激光还好,如果写的是雷♂管之类的和谐物品的话,想象一下每秒60个雷♂管不受控制地射出去的景象……