iT邦幫忙

2023 iThome 鐵人賽

DAY 19
0
Software Development

成為童年的英雄,Minecraft Java 模組製作系列 第 19

Minecraft Mod 模組製作 [DAY19] 右鍵偵測 神奇桿桿(三)

  • 分享至 

  • xImage
  •  

物品判斷式與弓箭射擊

            if (!HeldItem.isEmpty() && HeldItem.getItem() == Items.LEVER) {
                    player.sendSystemMessage(leverMessage);
                double x = player.getX();
                double y = player.getY()+player.getEyeHeight();
                double z = player.getZ();
                
                for (int i = -1; i <= 1; i++) {
                    for (int j = -1; j <= 1; j++) {
                        Arrow arrow = new Arrow(player.level, x, y, z);
                        arrow.shootFromRotation(player, player.getXRot()+i*5,player.getYRot()+j*5, 1F,5F, 1F);
                        player.level.addFreshEntity(arrow);}
                        }
                     }

我接著講我程式碼的後段,辨識玩家手持物品的與箭矢射出的程式部分

if (!HeldItem.isEmpty() && HeldItem.getItem() == Items.LEVER)

這段程式代表只有當玩家主手"HeldItem"不為空,且手中時有物品為控制桿Lever時,判斷式為真。
在手持控制桿右鍵之後,程式先向玩家發送系統訊息,這是用來確認之前的程式碼沒問題。

double x = player.getX();
double y = player.getY()+player.getEyeHeight();
double z = player.getZ();

這段程式碼用來取得玩家的位置,用double儲存資料,包括玩家的X、Y、Z軸位置,其中Y軸(高度)還要加上玩家的身高,因為玩家的Y軸是以玩家實體底部計算。

for (int i = -1; i <= 1; i++) {
                    for (int j = -1; j <= 1; j++) {
                        Arrow arrow = new Arrow(player.level, x, y, z);
                        arrow.shootFromRotation(player, player.getXRot()+i*5,player.getYRot()+j*5, 1F,5F, 1F);
                        player.level.addFreshEntity(arrow);}
                        }

這裡有兩個迴圈,這是為了讓箭矢在行列上排列成九宮格的形狀(-5,5)(0,5)(5,5)(-5,0)(0,0)(5,0)(-5,-5)(0,-5)(5,-5)。

Arrow arrow = new Arrow(player.level, x, y, z);

先建立一個變數 arrow 他代表Arrow也就是箭矢類別。
player.level 代表箭矢生成所在的世界,player代表玩家,所以player.level會生成在玩家所在的世界。

arrow.shootFromRotation(player, player.getXRot()+i*5,player.getYRot()+j*5, 1F,5F, 1F);

player:這是箭矢發射的來源,也就是玩家。箭矢將從玩家的位置射出。
player.getXRot() + i * 5:這是箭矢的水平旋轉角度(Yaw)。player.getXRot() 取得了玩家的視角水平旋轉角度,然後根據 i 的值進行微調。當 i 為 -1 時,箭矢向左偏轉;當 i 為 1 時,箭矢向右偏轉。* 5 是一個角度的調整值,用於微調箭矢的方向。

player.getYRot() + j * 5:這是箭矢的垂直旋轉角度(Pitch)。同樣,它取得了玩家的視角垂直旋轉角度,並根據 j 的值進行微調。當 j 為 -1 時,箭矢向上仰角;當 j 為 1 時,箭矢向下仰角。同樣,* 5 用於微調角度。

1F:這是箭矢的初始速度。這個值表示箭矢的初始飛行速度,1F 表示一個基本速度。

5F:這是箭矢的最大射程。箭矢將以指定的速度飛行,直到達到這個射程或碰到障礙物為止。

1F:這是箭矢的偏轉值。這個值通常設為 1.0F,表示箭矢的飛行方向不會有太大的隨機偏差。


上一篇
Minecraft Mod 模組製作 [DAY18] 右鍵偵測 神奇桿桿(二)
下一篇
Minecraft Mod 模組製作 [DAY20] 右鍵偵測 神奇桿桿(完) +測試影片
系列文
成為童年的英雄,Minecraft Java 模組製作30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言