iT邦幫忙

第 11 屆 iThome 鐵人賽

DAY 4
1
Software Development

[Minecraft - 當個創世神] 從玩遊戲到設計遊戲系列 第 4

[Day4] 成為爆破礦工

https://ithelp.ithome.com.tw/upload/images/20190915/20115823aTeS01tVd7.png

在Minecraft世界裡,為了生存下去,會需要採集各種的材料來合成。在官方的首個十分鐘教學,材料需要從河邊、陸地上、甚至是地下挖掘取得。為了要讓我們的挖掘工作快而有效率,今天我們就要讓使用者自帶破壞礦石有爆炸效果 - 我們稱之為 - 爆破礦工

建立爆破事件

,因為今天要做的爆破功能一樣會在打破方塊類別發生時處理,所以我們今天需要的是新增一個方法。

  1. 在BreakBlockEvent內加入新的explode方法,一樣參數是BreakEvent事件
    @SubscribeEvent
    public void explode(BreakEvent event) {
    
    }
    
  2. 由於要爆破的是方塊的周圍,因此在剛剛的explode方法內加入createExplosion方法
     @SubscribeEvent
     public void explode(BreakEvent event) {
         // 爆炸的來源需要實體,這裡指定玩家 (需要import net.minecraft.entity.player.EntityPlayer)
         EntityPlayer player = event.getPlayer();
         // 爆破的威力 (2代表兩個方塊長的爆炸範圍)
         float power = 2;
         // 爆炸是否要損毀方塊
         boolean destroyBlocks = true;
         // 建立爆破
         event.world.createExplosion(
                 // 爆炸來源為玩家
                 player,
                 // 藉由打破方塊事件的位置來建立爆破
                 event.pos.getX(),
                 event.pos.getY(),
                 event.pos.getZ(),
                 power,
                 destroyBlocks
         );
     }
    
  3. 存檔後啟動遊戲,請在任意的位置(不要選在你有放置東西的地方!)打破一個方塊,你應該會看到類似下面爆破的畫面
    注意:我們的sendMessage方法還是有作用,所以訊息還是會產生喔!
    https://ithelp.ithome.com.tw/upload/images/20190910/20115823WHpY31M75K.png
    以及爆炸後的大小
    https://ithelp.ithome.com.tw/upload/images/20190910/20115823KqjKmZNR6s.png

處理不同的打破方塊

到這裡可能你會有個疑問了:我們要做的不是爆破礦工嗎?怎麼感覺好像成了破壞王了?
這邊就是設計模組需要注意的地方 - 需要判斷觸發條件。

  1. 請回到BreakBlockEvent類別,將explode方法先改名為explodeOre
  2. 由於我們只對礦石方塊產生爆炸,所以等等我們需要加入判斷礦石才處理。關於礦石方塊與一般方塊最大的差異,就是礦石方塊中間會有一點一點很像有礦脈在裡面的感覺。
    https://ithelp.ithome.com.tw/upload/images/20190919/20115823qOH8XWH2RP.png
    上圖左邊是鵝卵石 (一般方塊),而右邊是煤礦 (礦石方塊)
  3. 回到程式碼,在方法內判斷打破的是否為礦石,若不是則不做任何處理。程式碼如下
    @SubscribeEvent
    public void explodeOre(BreakEvent event) {
        // 透過事件取得被破壞的方塊,若方塊不為礦石方塊(BlockOre),則不做任何事情(return)
        // 這裡需要import net.minecraft.block.BlockOre
        if (!(event.state.getBlock() instanceof BlockOre)) return;
    
        // 爆炸的來源需要實體,這裡指定玩家 (需要import net.minecraft.entity.player.EntityPlayer)
        EntityPlayer player = event.getPlayer();
        // 爆破的威力 (2代表兩個方塊長的爆炸範圍)
        float power = 2;
        // 爆炸是否要損毀方塊
        boolean destroyBlocks = true;
        // 建立爆破
        event.world.createExplosion(
                // 爆炸來源為玩家
                player,
                // 藉由打破方塊事件的位置來建立爆破
                event.pos.getX(),
                event.pos.getY(),
                event.pos.getZ(),
                power,
                destroyBlocks
        );
    }
    
  4. 存檔後一樣進入遊戲,找尋礦石享受快速挖礦的樂趣吧!
    https://ithelp.ithome.com.tw/upload/images/20190915/20115823mdXIb1Zfds.png

今日額外課題:請試著修改爆炸威力(power)與損毀方塊(destroyBlocks)的參數,看看會發生什麼事吧!


上一篇
[Day3] 讓打方塊動作有敲有回應
下一篇
[Day5] 爆破也可以很有藝術
系列文
[Minecraft - 當個創世神] 從玩遊戲到設計遊戲30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 則留言

0
a31916909
iT邦新手 5 級 ‧ 2020-11-25 21:05:51

我成功啦!
果然爆炸就是藝術!

恭喜成功~
/images/emoticon/emoticon34.gif

我要留言

立即登入留言