iT邦幫忙

第 11 屆 iT 邦幫忙鐵人賽

DAY 13
1

https://ithelp.ithome.com.tw/upload/images/20190928/20115823xDiN3z4TZO.png

上圖這個就是最後的結果加上一點"我自己的裝飾"。如何,有想要自己動手做了嗎?

繼昨天的程式碼,今天的程式碼比較多一點 (嗯...大概有1000行左右),避免整篇文章被滿滿的程式碼充字數,因此我將程式碼放到我個人的GitHub上,有興趣的人可以自行下載。

回到正題,可能有人會問說:為什麼我不考慮用現有的模組,或是自己一個方塊一個方塊做就好?

當然是因為,Minecraft這樣玩才有趣阿!

而且同樣的程式碼稍作調整就可以用來蓋賽車場、巨蛋...等等。只要想做,就一定可以達成!

競技場剖面圖分析

  1. 這次我想要蓋一個"橢圓形"的競技場,來看一下剖面圖:
    https://ithelp.ithome.com.tw/upload/images/20190928/20115823nPYvl5vgEw.png

    圖片的上方是北方,右邊是東方。由於目標是要全程都用"程式碼"來完成整個競技場,如果我們每一個的方塊都用程式碼BlockPos來定義,一來是這個程式碼會變得很不可讀,再來這好像不符合工程師懶人的特質...

    所以,該怎麼做呢?

程式碼設計重點說明

  1. 仔細研究了一下上圖,我們其實可以發現:1/4橢圓的形狀透過上下與左右翻轉,可以完成整個橢圓形。因此在程式碼裡面,我們會用很多類似下面的方式來堆砌我們的建築:

    private static List<BlockPos> quarterWallEdge(BlockPos centerPos, boolean right, boolean down) {
        ArrayList<BlockPos> list = new ArrayList<BlockPos>();
    
        int horizontal = right ? 1 : -1;
        int vertical = down ? 1 : -1;
    
        // the view is from bottom to right-middle
        list.add(new BlockPos(centerPos.getX() + horizontal * i, centerPos.getY(), centerPos.getZ() + vertical * j));
    }
    

    如果我們現在的方向是面向北方的話:
    right用來定義是不是在右半部分
    down用來定義是不是在下半部分
    這兩個布林值就可以定義我們橢圓四個部分,從而組成完整的橢圓。

    當我們現在是右下部分的話,往右邊(X軸)就是正值,往左邊是負值;往下(Y軸)是正值,往上則是負值。定義好XY軸後,垂直上下部分(Z軸)就可以堆我們喜歡的方塊,然後畫好1/4後,一次完成全部。

  2. 在設計競技場的"座位"時,我們會需要透過階梯這種方塊來蓋。因為階梯有各種方向與組合變形,有用過的玩家應該知道使用階梯會有些技巧。但今天我們用的是程式碼,因此像下面的這段程式碼:

    IBlockState blockState = Block.getBlockFromName("sandstone_stairs")
    .getBlockState()
    .getBaseState()
    .withProperty(BlockStairs.HALF, BlockStairs.EnumHalf.TOP)
    .withProperty(BlockStairs.FACING, EnumFacing.EAST);
    

    會建立階梯的底部是朝上 (顛倒的階梯),並且整格面是朝向東方。看起來大概會這樣:
    https://ithelp.ithome.com.tw/upload/images/20190928/20115823geLuTmlwkY.png

    我習慣這樣想:HALF控制階梯地板是朝上還是朝下;FACING控制階梯屁股朝哪裡 (東西南北)

    還是看不懂?沒關係,當你嘗試自己動手做就會了解...

  3. 最後,我希望競技場要有三層,這個時候就體現"寫程式"的好處 - 只要把第一層寫完,往上方向(Y軸)再複製兩層就完成了!

    Colosseum.wallBlocks(player, Colosseum.centerPos, 2);
    Colosseum.wallBlocks(player, Colosseum.centerPos, 7);
    Colosseum.wallBlocks(player, Colosseum.centerPos, 12);
    

    這裡的wallBlocks是建造"橢圓形"一層的結構;三個參數分別代表 (玩家物件、競技場中心點、Y軸Offset高度)

  4. 好了,不負責解說就到這邊,如果有問題請再留言。最後完成圖會長這樣:

https://ithelp.ithome.com.tw/upload/images/20190928/20115823Qe7yinV0PD.png

https://ithelp.ithome.com.tw/upload/images/20190928/20115823U1jA5XDiYA.png

註:本篇文章參考YouTube一位國外Minecraft玩家的競技場作法,我的藝術天分有限沒辦法憑空想像XD


上一篇
[Day12] 羅馬競技場是一鍵造成的 (上)
下一篇
[Day14] 創造獨一無二的方塊
系列文
[Minecraft - 當個創世神] 從玩遊戲到設計遊戲30

尚未有邦友留言

立即登入留言