游戏攻略

《泰拉瑞亚》饰品制作方法

法海 2014-02-18 互联网
基础篇泰拉瑞亚是一款非常经典的沙盒游戏在这款游戏中玩家可以刷怪打装备,同时还需要建立自己的基地,保证NPC的安全,最近有玩家放出了饰品的制作方法,下面是详细解析。饰品制作方法:基础篇:饰品创建一个mod道具需要有json文件和png文件嘛~png就不多说了,图片,不要找太大的就行了,反例请参见ctx的just a simple boss里的BOSS召唤物——骷髅下巴,因为直接用了骷髅下巴的图,太大,捡起来放在物品栏的时候缩 ...

四、碾压篇

当然最开始还是喜闻乐见地分条讲解代码:

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个雷♂管不受控制地射出去的景象……

【猎奇+篇:控制法】

前方大量声明,注意

要控制火力嘛……不然会鬼畜不是吗?所以这里就能利用上前面说的读取键盘状态了

这里可以分为几类触发机制,以下用F键作为例子

特别说明:

务必加上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;

}

}

}

因为需要美观,就多定义了几个角度增速,角度加速度,角度急动度,角度痉挛度神马的……

效果图:

《泰拉瑞亚》饰品制作方法

当然,自动类弹幕的形式是非常多的,从上文简单的喷环环,到折返射、西行寺无余涅盘、梦想天生、原子崩坏、金刚枪破,等等,只要看懂弹幕的组成,tAPI就能写出来!

作为饰品部分的教程基本已经结束了,从道具json的创建一直到在cs里声明和操作变量,基本现在已经可以复原所有原版饰品的效果了,玩家们也能首夜裸装站 机械三王了

游戏介绍Introduction

最新专区
本周热门