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個雷♂管不受控制地射出去的景象……
來源:遊俠網