中文字幕亚洲欧美日韩在线不卡,亚洲欧美日产综合在线网性色,思思久久精品6一本打道,综合视频中文字幕

    <sub id="dxmnt"><ol id="dxmnt"></ol></sub>

      1. 《泰拉瑞亞》飾品制作方法

        更新時(shí)間:2022-03-27 06:52:25作者:佚名

        《泰拉瑞亞》飾品制作方法

        【基礎(chǔ)篇:飾品創(chuàng)建】

        一個(gè)mod道具需要有json文件和png文件嘛~

        png就不多說了,圖片,不要找太大的就行了,反例請(qǐng)參見ctx的just a simple boss里的BOSS召喚物——骷髏下巴,因?yàn)橹苯佑昧索俭t下巴的圖,太大,撿起來放在物品欄的時(shí)候縮得不成樣子

        當(dāng)然還有一點(diǎn):背景色必須是透明,比如:《泰拉瑞亞》飾品制作方法

        下面是json的寫法:以剛寫的ctxmove作范例:

        {

          "code": "ctxmove",——名字,要和json的文件名一致

          "displayName": "CTXs Movement",——顯示名稱,最好區(qū)分大小寫以顯得很正式

          "size": [28,14],——尺寸,兩個(gè)數(shù)字分別對(duì)應(yīng)png圖像的長(zhǎng)和寬

          "value": [0,0,0,0],——價(jià)值,四個(gè)數(shù)字分別對(duì)應(yīng)鉑、金、銀、銅幣的數(shù)量(注意這里是買入價(jià)值,賣出時(shí)會(huì)有折扣,使用打折卡買入也會(huì)有折扣)

          "rare": 9,——稀有度,⑨就是最稀有的天藍(lán)了好像

          "toolTip": "I hate json.",——第一行道具說明(想加第二行就是toolTip2)

          "accessory":true,——這句是重點(diǎn),它決定了這個(gè)道具可以被塞進(jìn)飾品欄

          "recipes": [——合成表

          {

            "items": ["0 Wood"],——用0個(gè)木頭

            "creates": 1——合成1個(gè)飾品

          }

          ]——這里的recipe明顯不合格好吧!連tile也沒有——嘛,這不是重點(diǎn)

        }

        此外,還可以加一些附加的語句,比如"wings":12,讓玩家佩戴后獲得蒸汽朋克翅膀,"lifeRegen":增加回血速度,"defense":加防御,好像也就這些了。

        【進(jìn)階篇:cs創(chuàng)建】

        寫一個(gè)和png以及json相同名字的cs文件

        首先,在里面寫:

        using System;

        using TAPI;

        using Microsoft.Xna.Framework.Graphics;

        namespace TAPI.【MOD名稱】{

          public class 【道具名稱】:ModItem{

            public 【道具名稱】(ModBase modbase,Item i):base(modbase,i){}

            public override void Effects(Player p){

              //等會(huì)就是在這里插入飾品信息滴~

            }

          }

        }

        那些【mod名稱】和【道具名稱】需要換成什么,就看實(shí)際情況和個(gè)人喜好了……順便:【道具名稱】也要和文件名一樣

        然后嘞……這個(gè)Effects究竟能干什么?答案:幾乎所有!一個(gè)玩家能干的事!

        看見后面括號(hào)里那個(gè)Player p了么?這代表接下來Effects里發(fā)生的一切事情,都將施予那個(gè)代號(hào)為p的玩家——也就是帶上這個(gè)飾品的玩家~(當(dāng)然那個(gè)p改成player,ctx,lzw神馬的都行,只是切記要和后面保持一致)

        至于Effects究竟能干啥嘛……先來幾個(gè)基本的吧:

        首先是對(duì)玩家身上的數(shù)據(jù)進(jìn)行操作

        寫p.statLifeMax=500;就是玩家佩戴時(shí)生命最大值將瞬間飆到500

        p.statManaMax=200;同理,玩家最大魔法值飆到200

        p.statManaMax2=+200;這個(gè)就像一般的法師飾品一樣暫時(shí)增加了玩家的最大魔法,卸掉飾品就會(huì)還原(而前兩個(gè)不會(huì))

        p.wings = 12;給玩家戴上蒸汽朋克翅膀

        p.statDefense+=233;玩家防御增加233

        p.lifeRegen+=233;玩家回血速度增加233(再注:這里的回血速度最大也只能增加到每秒一點(diǎn),是TR原版回血機(jī)制的問題)

        當(dāng)然,還有很多……

        更多相關(guān)資訊請(qǐng)關(guān)注:泰拉瑞亞terraria專題

        【娛樂篇:鬼畜cs】

        接上篇,繼續(xù)往Effects里加條條——

        p.statDefense+=2333333333;神馬的就不用我說了吧~改數(shù)字而已,大家自便,不要讓自己失去游戲樂趣就可以了

        首先是更加神奇的回血:

        p.statLife++;

        這條代碼能讓玩家每幀都回復(fù)一點(diǎn)血,相當(dāng)于每秒60點(diǎn),而且這個(gè)回血和玩家自動(dòng)回血以及幽靈套、吸血飛刀、HP藥水之類的完全無關(guān),相當(dāng)于是每秒免費(fèi)送的60血~

        同理,寫p.statMana++;就是每幀回復(fù)1藍(lán),每秒額外60藍(lán)

        另外,如果想看到效果的話可以再加一句p.HealEffect(1);或者p.ManaEffect(1);,分別是回血和回藍(lán)1的效果,當(dāng)然括號(hào)里的數(shù)字隨意填,填幾就跳幾的綠/藍(lán)數(shù)字(最好和寫的回血/回藍(lán)數(shù)字相同,不然會(huì)有困擾)

        ——什么?還是太弱了?你手殘所以每秒60血根本不夠?

        p.longInvince = true;

        p.lavaImmune = true;

        p.fireWalk = true;

        p.noFallDmg = true;

        四句分別是延長(zhǎng)無敵時(shí)間(神圣十字效果),免疫巖漿(黑曜石藥水效果),免疫熱磚塊(黑曜石頭顱效果)以及免疫掉落傷害(馬掌效果)

        ——什么?你還想站擼霜月?

        記得我說過Effects可以對(duì)玩家數(shù)據(jù)任意操控吧~

        我們可以簡(jiǎn)單地做一個(gè)內(nèi)置鎖血鎖藍(lán)的效果:

        p.statLife=p.statLifeMax;和p.statMana=p.p.statManaMax2;

        原理:每幀都讀一下玩家當(dāng)前最大血/藍(lán)是多少,再賦給剩余的血/藍(lán)

        夠鬼畜了吧~現(xiàn)在只要沒有喵殺你的攻擊,對(duì)你來說都是浮云了

        ——什么?你還要白天去同時(shí)站擼骷髏王、地牢守護(hù)者和機(jī)械骷髏王?

        【喪病篇:鬼畜cs進(jìn)階】

        這一篇教程就是一些更華麗的效果了……

        首先是上期遺留的問題:如何站擼白天吳克?答案就是……誒有人敲門?我的快遞到了,去收一下……

        ……剛才送快遞的LZW小哥告訴我,不能把這個(gè)說出來,不然會(huì)(ta)極(hui)大(zai)地(jin)影(wan)響(lai)游(gang)戲(le)平(wo)衡,所以就只能給一點(diǎn)提示了:給玩家強(qiáng)行上無敵~

        子提示①:無敵和免疫的意思很接近

        子提示②:TR的變量基本是用英文命名的

        子提示③:無敵也需要時(shí)間限定

        那么,就這樣吧,作為一個(gè)思考題,接下來是——

        1.時(shí)裝

        想穿烏龜套又懶得收集龜甲?萬能的Effects滿足你!

        p.head=99;

        p.body=65;

        p.legs=54;

        想穿幽靈套又不想下地牢?萬能的Effects滿足你!

        p.head=101;

        p.body=66;

        p.legs=55;

        其它時(shí)裝同理,不過實(shí)際使用時(shí)優(yōu)先級(jí)是時(shí)裝欄高于下面的飾品高于上面的飾品高于裝備欄,請(qǐng)務(wù)必注意

        2.套裝效果

        想反傷又嫌烏龜套好難看而且不想穿時(shí)裝?還是萬能的Effects滿足你!

        p.thorns = true;

        p.turtleThorns = true;

        想吸血而且覺得幽靈套太丑?依然是是萬能的Effects滿足你!

        p.ghostHeal=true;

        什么?嫌幽靈套吸血太慢了?那就再來一句:

        p.lifeSteal=233f;——瞬間還原至舊版幽靈套的吸血頻率我會(huì)說?

        3.視覺特效

        還是那句話,Effects是萬能的。

        想在身上點(diǎn)上火?

        for (int i=0;i<9;i++){

          int m = Dust.NewDust(p.position, p.width, p.height, 6);

          Main.dust[m].noGravity = true;

          Main.dust[m].position += p.velocity * Main.rand.Next(-50, 51) * 0.01f;

        }

        上面這段效果大概就是在身上放上火焰的粒子特效,并且會(huì)依據(jù)玩家的速度而延伸成一條火鏈;至于每一句都是起的什么作用——字面意思,不懂英文的請(qǐng)自行g(shù)oogle翻譯,不懂英文又秀優(yōu)越秀愛國(guó)的請(qǐng)右上角

        想讓自己身上冒星星?

        Gore.NewGore(p.position+new Vector2(Main.rand.Next(p.width),Main.rand.Next(p.height)), p.velocity,Main.rand.Next(16,18));

        上面這句就是在玩家身上隨機(jī)的地方冒16號(hào)或者17號(hào)gore,也就是星星

        【DEBUG-查錯(cuò)階段】

        首先是同時(shí)掛上蒸汽朋克翅膀、火焰粒子以及星星gore的照片一張

        《泰拉瑞亞》飾品制作方法

        這里需要注意一點(diǎn):cs開頭的using應(yīng)該是using Microsoft.Xna.Framework;

        也就是說,模板應(yīng)該是如下:

        using System;

        using TAPI;

        using Microsoft.Xna.Framework;

        namespace TAPI.【MOD名稱】{

          public class 【道具名稱】:ModItem{

            public 【道具名稱】(ModBase modbase,Item i):base(modbase,i){}

            public override void Effects(Player p){

              //等會(huì)就是在這里插入飾品信息滴~

           ?。?/p>

          }

        }

        這篇主要講述的是運(yùn)用TR原版的一些方法組來答到寓守于攻、不戰(zhàn)而退敵的效果

        首先……先介紹一些需要用到的代碼

        1.Rectangle(組詞法:rect是“四”,angle是“角”,四個(gè)墻角即為矩形~)

        要想快速而方便地判定范圍,首先要在TR里表示一個(gè)矩形(Rectangle)。

        TR里聲明一個(gè)矩形的方法是使用new方法組,也就是new Rectangle(坐標(biāo)X,坐標(biāo)Y,寬,高)

        舉例:new Rectangle(100,200,300,400)表示的是如下圖的矩形:

        《泰拉瑞亞》飾品制作方法

        左上頂點(diǎn)坐標(biāo)(100,200),長(zhǎng)300寬400,右下頂點(diǎn)坐標(biāo)(100+300,200+400),表示的是一個(gè)范圍(嗯沒錯(cuò)那個(gè)就是66ccff)

        注:矩形的坐標(biāo)和長(zhǎng)寬必須是整數(shù),在使用到玩家或npc坐標(biāo)的地方請(qǐng)?jiān)谇懊婕觽€(gè)(int),表示取整

        2.Rectangle.Intersects(Rectangle r1,Rectangle r2)

        intersects方法組,隸屬于xna特有的數(shù)學(xué)系(重申一遍前面cs格式的.Graphics一定要?jiǎng)h掉?。?,用來判定兩個(gè)矩形是否相交,輸出邏輯值(真或假)

        p.s.判定是否在范圍內(nèi)時(shí)好像比直接計(jì)算距離略快一點(diǎn),缺點(diǎn)就是判定是方的不好看

        ……嘛,戰(zhàn)斗時(shí)誰還管好不好看呢?

        3.foreach(類型 代號(hào) in 組)

        就像這個(gè)語句的名字一樣,它可以把某個(gè)組里的所有東西都拉出來給一個(gè)代號(hào),比如foreach(NPC n in Main.npc)就是檢索游戲中所有NPC并給每個(gè)NPC起個(gè)名字:n;接下來這個(gè)n將要受到什么代碼的操(rou)作(lin),就完全是個(gè)人喜好的問題了

        4.NPC.AddBuff(int BUFF類型,int BUFF持續(xù)時(shí)間)

        是時(shí)候讓那些可惡的怪物們嘗嘗FFF團(tuán)的怒火了!有了這個(gè)方法組,給NPC隨意加debuff將不是夢(mèng)想!

        ·BUFF類型就是想要加的BUFF的編號(hào),比如燃燒是24,詛咒燃燒是39,霜火燃燒是44,等等

        ·BUFF持續(xù)時(shí)間是按幀算的,60幀=1秒(0處理落率),如果這里寫60就是一秒,寫3600是一分鐘,寫23333333就是約4.50102874天,依據(jù)自己需求來決定時(shí)間吧

        5.if(條件)

        直譯:如果滿足條件就執(zhí)行后面的內(nèi)容,條件應(yīng)為邏輯值

        5.2.else

        “否則”是“如果”的好姬友,用于在if的條件不成立時(shí)執(zhí)行后面的語句

        5.2.1.多層判定

        那啥……else后面也能跟if,所以如果多重判定就可以寫成:

        if(條件1){代碼段1}

        else if(條件2){代碼段2}

        else if(條件3){代碼段3}

        else……

        ……

        ……else{都不滿足時(shí)的代碼段}

        5.2.邏輯值的運(yùn)算

        如果需要同時(shí)判定多個(gè)條件成立,幾個(gè)條件就套上幾個(gè)if?如果需要多個(gè)條件任一成立,幾個(gè)條件就寫幾個(gè)else,然后在里面寫相同語句?乃們out了!其實(shí)許多條件也是可以合并成一個(gè)條件的

        需要用到的就是邏輯運(yùn)算符:且(&&)、或(||)和非(!)

        且就是數(shù)字7上面那個(gè)符號(hào)打兩遍,或就是右shift上面那個(gè)按鍵+shift打出來的(絕對(duì)值括號(hào)),非就是感嘆號(hào)(全都是半角)

        且和或用于連接兩個(gè)邏輯值,放于兩個(gè)邏輯值之間;非放在一個(gè)邏輯值的前面,用于否定這個(gè)邏輯值(真假顛倒)

        5.2.1.幾個(gè)邏輯運(yùn)算的法則

        1.!!a就是a

        2.!(a&&b)就是(!a)||(!b)

        3.!(a||b)就是(!a)&&(!b)

        例題1:輸出一個(gè)邏輯值M,在a和b同時(shí)不成立的前提下要求滿足以下三點(diǎn)中任意兩點(diǎn)便成立:①b和c任一成立②d和e同時(shí)成立③f成立

        解1:M=(!a)&&(!b)&&(((b||c)&&d&&e)||(f&&d&&e)||((b||c)&&f))

        評(píng)價(jià):簡(jiǎn)單粗♂暴,適用于對(duì)多重括號(hào)很熟練的兄貴們

        解2:int m=0;

        if(b||c)m++;

        if(d&&e)m++;

        if(f)m++;

        M=(!(a||b))&&(m>=2)

        評(píng)價(jià):略運(yùn)用了化簡(jiǎn)的技巧,適用于懶♂的兄貴們

        6.反擊時(shí)刻!

        現(xiàn)在讓我們把這四條組成一個(gè)給附近300像素以內(nèi)NPC上霜火debuff的效果吧~

        6.1.思路(伸手黨可以跳過這一段直接復(fù)制后方的成品,感興趣的還是看一下吧~)

        先遍歷所有NPC記作n:foreach(NPC n in Main.npc)

        操♂作開始,首先是確定范圍:

        NPC所在的矩形是new Rectangle((int)n.position.X,(int)n.position.Y,n.width,n.height)

        玩家上下左右300像素的矩形是new Rectangle((int)p.position.X-300,(int)p.position.Y-300,p.width+600,p.height+600)

        接下來是判定相交同時(shí)確保n還活著,而且是敵對(duì)NPC:

        if(n.active&&!n.friendly&&new Rectangle((int)n.position.X,(int)n.position.Y,n.width,n.height).Intersects(new Rectangle((int)p.position.X-300,(int)p.position.Y-300,p.width+600,p.height+600)))

        最后嘛……嘗嘗來自北國(guó)的FFF團(tuán)精神吧!

        n.AddBuff(44,300);

        6.2.成品代碼:

        foreach(NPC n in Main.npc){

          if(n.active&&!n.friendly&&new Rectangle((int)n.position.X,(int)n.position.Y,n.width,n.height).Intersects(new Rectangle((int)p.position.X-300,(int)p.position.Y-300,p.width+600,p.height+600))){

            n.AddBuff(44,300);

          }

        }

        6.3.效果圖:

        《泰拉瑞亞》飾品制作方法

        BURN BABY,BURN!

        嗯……本期教程就此結(jié)束,下期將是:【獵奇篇:讀取操作】,如何用飾品給予玩家可控的額外火力,盡請(qǐng)期待~

        附思考題:

        如何做出十動(dòng)然拒徽章的效果?(排除危險(xiǎn)NPC和proj到安全距離以外)(neta自擁著轉(zhuǎn))

        提示:

        ①proj對(duì)應(yīng)的組是Main.projectile,proj的類型是Projectile

        ②proj和NPC一樣有位置和寬高數(shù)據(jù),位置可以被任意操作

        ③敵對(duì)NPC特征是friendly邏輯值為假,敵對(duì)proj特征是hostile邏輯值為真

        【獵奇篇:讀取操作】

        前言:

        其實(shí)這一篇嚴(yán)格地說并不是為增強(qiáng)火力而存在的;換句話說,它不只是為增強(qiáng)火力存在的。

        只要讀取了電腦前玩家的操作,加上自定的一些代碼,玩家就可以做到擴(kuò)展整個(gè)人物的功能,就像K鍵召喚所有BOSS,F(xiàn)鍵瞬移,等等……

        下面是正題:

        1.讀取玩家行動(dòng)

        讀取玩家行動(dòng),其實(shí)只需熟記表示玩家狀態(tài)的幾個(gè)邏輯值,就能對(duì)玩家相應(yīng)的行動(dòng)做到加強(qiáng)或改變;平時(shí)需要用的基本就是這幾條了:

        controlLeft;控制向左

        controlRight;控制向右

        controlUp;控制向上

        controlDown;控制向下

        controlJump;控制跳

        controlHook;控制鉤子

        例:如何做一個(gè)讓玩家移動(dòng)速度加快的飾品?

        大體思路就是讀取玩家按下的方向鍵,并相應(yīng)地適當(dāng)改變玩家速度,如下:

        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;

        }

        以上的作用是:玩家控制向左時(shí)就增加向左速度,玩家控制向右就增加向右速度;將控制向上和控制跳躍綁定,控制向上就增加向上的速度

        2.讀取鼠標(biāo)狀態(tài)

        游戲中自帶顯示鼠標(biāo)狀態(tài)的邏輯值,Main.mouseLeft和Main.mouseRight分別表示鼠標(biāo)左鍵和右鍵是否按下;相應(yīng)的還有Main.mouseLeftRelease和Main.mouseRightRelease表示左右鍵是否未按下,可以理解為兩者相反

        思考題:如何制作按下鼠標(biāo)右鍵就回血的飾品?運(yùn)用前面的教程,題目較為簡(jiǎn)單,這里就不寫示例了

        3.讀取鍵盤狀態(tài)

        Main.keyState.IsKeyDown(Microsoft.Xna.Framework.Input.Keys.【按鍵代號(hào)】)

        這個(gè)語句用來讀取鍵盤狀態(tài),如果當(dāng)前按下了指定【按鍵代號(hào)】的鍵就等于真;反之,假。一般來說,提取字母鍵的狀態(tài)只需把按鍵代號(hào)寫成相應(yīng)大寫字母;F1-F12也是直接寫大寫F加數(shù)字就可以了

        【獵奇+篇:輔助火力】

        提示:這一篇將會(huì)有大量的英語和數(shù)學(xué)成分,不過LZ相信你們會(huì)比上學(xué)期英語倒10的LZ看得更明白的~

        當(dāng)然最開始還是喜聞樂見地分條講解代碼:

        1.Projectile.NewProjectile(坐標(biāo)X,坐標(biāo)Y,速度X,速度Y,種類,傷害,擊退,所屬玩家,ai0,ai1)

        字面意思,用來在世界里生成一個(gè)proj,中心對(duì)準(zhǔn)給定的坐標(biāo),速度為給定速度,種類、傷害、擊退等等都是可以指定的,所屬玩家一般寫Main.myPlayer或者p.whoAmI(當(dāng)自己被編號(hào)為p時(shí))至于那個(gè)ai0和ai1,目前還不需要它們,在寫的時(shí)候可以純粹省略這兩項(xiàng),或者填0

        這句話可以說是附加火力的核心,沒有它一切都是免談,想象一下,對(duì)準(zhǔn)怪物按下鼠標(biāo),想讓火球飛過去就飛火球,想飛激光就飛激光……

        橋豆麻袋!電腦怎么知道你想讓那個(gè)proj飛到哪里去?下面是一些有關(guān)確定速度方向的講解:

        ①三角函數(shù)天才,或者平面向量萬年掛科,請(qǐng)前往條目2

        ②平面向量學(xué)霸或者痛恨三角函數(shù),請(qǐng)前往條目3

        1.1.先確定自己和鼠標(biāo)的位置吧~

        Vector2 pc=p.position+new Vector2(p.width,p.height)/2;

        Vector2 mc=Main.screenPosition+new Vector2(Main.mouseX,Main.mouseY);

        2.Math.Atan2(對(duì)邊,斜邊)

        兩個(gè)向量作差,得到了什么?向量?錯(cuò)!是直角三角形!

        float r=(float)Math.Atan2(mc.Y-pc.Y,mc.X-pc.X);

        (這個(gè)函數(shù)是反正切,又不是反正切,因?yàn)樗膶?duì)邊和斜邊隨便哪個(gè)取0都是可以輸出結(jié)果的;而且它的值域是2π,也就是一圈!)

        接下來,Vector2 v=new Vector2((float)Math.Cos(r),(float)Math.Sin(r));

        這就是單位長(zhǎng)度,方向從玩家中心指向鼠標(biāo)的速度向量

        3.Vector2.Distance(向量1,向量2)

        這個(gè)語句是用來求兩個(gè)向量距離的,同樣的效果也可以用求向量長(zhǎng)度的語句((向量1-向量2).Length())來實(shí)現(xiàn)

        Q:沒事求向量長(zhǎng)度干啥?

        A:向量除以長(zhǎng)度等于單位向量

        也就是:Vector2 v=(mc-pc)/Vector2.Distance(mc,pc);

        一發(fā)♂入魂的單位向量~

        下面就可以組裝起來了:

        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,無擊退的磁球激光

        直接寫進(jìn)去?不不不那樣會(huì)鬼畜的,激光還好,如果寫的是雷♂管之類的和諧物品的話,想象一下每秒60個(gè)雷♂管不受控制地射出去的景象……

        【獵奇+篇:控制法】

        前方大量聲明,注意

        要控制火力嘛……不然會(huì)鬼畜不是嗎?所以這里就能利用上前面說的讀取鍵盤狀態(tài)了

        這里可以分為幾類觸發(fā)機(jī)制,以下用F鍵作為例子

        0.特別說明

        務(wù)必加上p.whoAmI==Main.myPlayer的判定,如果你不想自己按鍵時(shí)全圖玩家都開始放彈幕,想象一下全圖按鍵會(huì)發(fā)生什么

        1.單發(fā)

        原理是記錄上一幀的F鍵狀態(tài),如果兩個(gè)狀態(tài)不同,代表按下(彈起)了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)){

                //這里面就是寫前面發(fā)射子彈代碼的地方

              }

              oldF=Main.keyState.IsKeyDown(Microsoft.Xna.Framework.Input.Keys.F;

           ?。?/p>

          }

        }

        這種觸發(fā)方式的頻率是取決于按鍵速度的,也就是按得越快射♂得越快,理論射速峰值為30發(fā)每秒

        2.連發(fā)

        原理是添加一個(gè)計(jì)時(shí)變量,至于具體怎么計(jì)時(shí)就看個(gè)人喜好了,這里提供一種解決方案:

        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ā)射子彈代碼的地方

                }

              }

           ?。?/p>

          }

        }

        按住F就可以連射了~示例為每秒觸發(fā)6次的寫法

        3.自動(dòng)

        這里就略復(fù)雜了點(diǎn),需要具有想象力以及數(shù)學(xué)功底,當(dāng)然還有對(duì)于彈幕的熱愛=w=

        簡(jiǎn)單地來一個(gè)施放旋轉(zhuǎn)鐮刀的腳本吧~

        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;

          }

         }

        }

        因?yàn)樾枰烙^,就多定義了幾個(gè)角度增速,角度加速度,角度急動(dòng)度,角度痙攣度神馬的……

        效果圖:

        《泰拉瑞亞》飾品制作方法

        (所以說彈幕可以培養(yǎng)數(shù)學(xué)和想象力=w=)

        當(dāng)然,自動(dòng)類彈幕的形式是非常多的,從上文簡(jiǎn)單的噴環(huán)環(huán),到折返射、西行寺無余涅盤、夢(mèng)想天生、原子崩壞、金剛槍破,等等……只要看懂彈幕的組成,tAPI就能寫出來!

        嘛……作為飾品部分的教程基本已經(jīng)結(jié)束了,從道具json的創(chuàng)建一直到在cs里聲明和操作變量,基本現(xiàn)在已經(jīng)可以復(fù)原所有原版飾品的效果了,玩家們也能首夜裸裝站擼機(jī)械三王了

        更多相關(guān)資訊請(qǐng)關(guān)注:泰拉瑞亞terraria專題