顯示具有 minecraft 標籤的文章。 顯示所有文章
顯示具有 minecraft 標籤的文章。 顯示所有文章

2019年8月3日 星期六

Minecraft 火車站相關系統的設計

小弟玩 Minecraft 一段時間,其實一直想蓋一個大型火車站,然後連續兩次因為伺服器更新所以蓋不完XDD,不過在蓋火車站的期間,還是累積了一些火車站相關系統的設計,蓋不完還是可以介紹一下:
1. 快速向上電扶梯
2. 驗票閘門
3. 平面停開車系統
4. 礦車減速系統

快速向上電扶梯:


快速向上電扶梯其實跟火車站沒什麼關係,但就…火車站常有的東西,這版是用一組向上活塞跟向前活塞交錯推進做成,小心控制紅石信號的延遲就能把人快速的往上推。
當然其實好像沒什麼必要啦…畢竟在 Minecraft 裡面把樓梯又快又不浪費體力,而且電扶梯一堆活塞運作起來其實很吵…。

驗票閘門:

第一版:
第二版:

驗票閘門是腦洞大開做出來的,基本概念是像真的驗票閘門一樣,讓使用者必須投入指定的物品閘門才會開啟,通過之後閘門關上,不小心一口氣就設計了兩個版本:
第一種是投票之後就會開閘門
第二種使用者要從另一個 dropper 裡面取票閘門才會開,更像真實的驗票機

這部分用文字跟圖片說也說不清楚,也許最簡單的還是看影片。

系統的核心如下圖,第二個漏斗裡的東西是裝滿的,這樣使用者只能投入特定的東西(車票);比較器比較投入漏斗跟參考漏斗物品數量是否相同,就能感知<使用者是不是投入車票>這件事,利用這個信號控制漏斗下的另一個漏斗,就能夠控制每次只通過一個物品。

因為我們要求的是投入物品的漏斗,放入物品之後發出的訊號要跟參考值一樣,查一下 wiki,投入物品的漏斗的物品數量要是 22 個,參考漏斗則是 23 個,放入東西之後訊號強度會升到 2,讓比較器打開。

後來就只是基本電路的操作,把物品通過的訊號截出來設定 SR latch,過閘門的踏板重設 SR latch,藉此控制閘門活塞的動作 現在的 SR latch 除了可以用標準的 2x4 雙火把之外,也可以用雙漏斗的 SR latch 設計,如下圖所示,兩者都是 SR latch。

差別在於兩個漏斗的版本,兩個控制信號必須是 1,設定的時候短暫變為 0 來釋放漏斗內的東西;火把設計則是反過來。

平面停開車系統:


這個是很以前設計的東西,因為以前在 Minecart 上是完全不能移動的,所以一定要有一個發車的系統,最一般的就是用凹洞或凸起構成的斜面,加速鐵軌就會朝下加速,不然在平面上加速鐵軌就算有電也不會加速。
這個平面的系統利用活塞,在車子開過去之後把停車位置的背面從鐵軌換成方塊,這樣加速鐵軌就能在平面上讓車子啟動,中間要注意的只有活塞進推的時序問題;不過說起來只是為了改善使用者體驗,不然簡單斜坡就有一樣的效果了。

礦車減速系統:

當初採用減速系統是在火車站的入口,讓使用者能選擇要進站或過站不停。
其實這部是很早以前也是從 Youtube 看到的,但後來完全找不到,幸好當時有先複製一份到測試 server 裡,現在才能蓋出來。
這個系統真的是非常巧妙,利用了比較器來計時,還有將脈衝保持在一個迴圈中來讓鐵軌進到減速模式,整個就是我自己做不出來的設計(yay,所以大家還是看影片吧

目前火車站大概是有這些設計,不過話說回來現在好像也沒什麼時間可以蓋火車站了(yay。

2017年6月12日 星期一

Minecraft 計時器教學影片

最近突然想來錄影一下,很久之前蓋好的 Minecraft 時鐘的解說,來講解裡面核心元件計時器的設計。
那時是第一次在這裡發 minecraft 文:使用差動雙投擲計時器應用於時鐘製作之研製

首先在錄影程式上就遇到問題了,本來我用的是 Google Hangout 來錄影,錄了兩部 word 的教學影片;但在 Minecraft 或遊戲這樣高 frame rate 的應用上就不行了,lag 到天荒地老QQ,試了另外兩款 Kazam 跟 gtk-recordmydesktop ,同樣都無法解決錄影 lag 的問題。
最後選用的錄影程式是 obs-studio,最大的賣點是開源,無論 windows 或 Linux 下都能流暢使用,我是使用 Archlinux 包好的package obs-studio,當然要的話也可以從 source 自己編:
https://github.com/jp9000/obs-studio

另外不知道是不是 Minecraft 的問題,在Windows 下用”錄影視窗”錄 minecraft 的內容,都會錄不到影像,一定要用全螢幕去錄;Linux 上就沒這個問題。

成品如下:中、英文各錄一版,不過我好奇沒有宣傳的話,真的有人會看英文版嗎OwO

中文版解說:


英文版解說:

2016年11月26日 星期六

minecraft 創作:莒光樓

小弟是2198T 的退伍金門兵,當兵時放島休,自然會到金門島上四處走走,覺得莒光樓是個不錯的建築題材,退伍後花了一點時間在minecraft 裡面蓋了一座,斷斷續續的蓋,工期大概6個月。
在陰間沒相機,只能畫畫草圖,幸好google 找圖片就有很多人拍的相片可以看,庭園的部分用google 地圖也有實景可以「鍵盤旅遊」,很多細節都是這樣補齊的。

外觀好像沒什麼好說的,照著照片依比例選用磚塊、雕紋磚塊、玻璃等打造,室內擺設除了關鍵位子的盆景可以放之外,其他大部分都只有掛畫,都快變畫廊了。


二樓外部裝飾,同樣用Banner 掛在spruce fence來實作,缺點是超級浪費染料,染料也不像方塊挖一挖就有了,用掉一堆骨粉跟打一堆草,紅染料需求大產量又小,打草打到OOXX
後來才想到伺服器上其實有人蓋了鐵人農場,紅花都用不完_(:з」∠)_
其他部分:
藍旗 + (白染料 + 磚塊)+ (紅染料456)
藍旗 + (白染料 + 磚塊)+ (紅染料456)+ (白染料123)+(黃染料789)+(白染料468)

莒光樓的匾的部分,寫字真的就無法了:
白旗 + (藍染料741/963)+(藍染料123)+ (紅染料456)
藍旗 + (紅染料456)+(白染料258369)+(藍染料123)

屋頂的藍色後來發現是海中prismarine 的顏色最像,其他部分就用spruce 跟dark oak 來打造。

遠眺福建省……嗯……算了當我沒說,只會看到巨大農場……

天花板大概是最麻煩的東西了,原本的天花板是雕梁畫棟五彩繽紛,如照片所示,這在Minecraft 裡面根本做不到,只能用各種色彩的羊毛意思意思一下;只能說這中華民國美學你敢嘴?像素太低了沒辦法啦(yay

庭園的部分,沒什麼就是一直種樹,超級花時間;在實際莒光樓,沒人會去坐,不知道幹什麼的樓梯,都靠這個幫我算圓形怎麼蓋
http://donatstudios.com/PixelCircleGenerator
圍牆的部分就選用End Stone Brick ,顏色跟質料都很像:


花園蓋得比需期得還要大了一點,原本估計的正方形 72x72,後來蓋到快110x110,大超多owo,幸好server 上有安裝自己寫的fastbuild (自肥一下),在整地、填土跟挖建材上省了很多時間。
https://github.com/yodalee/FastBuild

來張全景:


建築物蓋完用shader 來一張是一定要的:
正面:
後面:
 

這個建案大概就到這邊了,還有很多細節部分無法盡善盡美Orz
金門其實是個漂亮的小島(只要不是當兵的話),歡迎大家去金門旅遊,小小建案希望大家喜歡owo

2016年5月23日 星期一

一樁因為版本升級引發的慘案

Minecraft升上1.9板已經有一段時間了,因為1.9版加入了戰鬥功能,玩家能在左手跟右手上放置不同的物品,也因此造成了一些悲劇。

故事是這樣子的,之前寫的Minecraft plugin fastbuild,放置方塊時可以大量放置的功能
http://yodalee.blogspot.tw/2014/02/minecraft-plugin-fastbuild.html
設計上我是先取得玩家手上的物品,一個ItemStack 的物件。
計算所能放置的數量,從ItemStack 減去放置的數量,再call API將玩家手上的物品設為ItemStack。

問題出在現在Minecraft 1.9允許有兩隻手,如果將物品放在左手,則放置會將右手設為ItemStack,若右手空手就變成憑空複製物品。

解決方式是判斷玩家在放置物品是從左手放還是右手放,在設定手上物品時設定為玩家使用的那隻手,新的API 針對兩種手有不用的設定function,用新的API 解掉即可。
不過在修掉之前,server 上已經有人用這樣的複製功能弄了一大堆鑽石磚,還在我家旁蓋了一座鑽石塔,根本嘲諷點滿了XD (不過這座塔因為衝到旁邊的建案,應該會被我都更掉)


總之,當主程式和API 的不斷更新的時候,自己寫的程式是也要時時跟上最新,否則不知不覺中就會噴出bugs 來。

當然這樣的升級也不是不好,之前每個block 的型態是用 int 來表示,要比對型態就要自己去查每個物品的編號,新版的API 已經將所有物品用Enum 再包一層,使用真實名字來代表物品,撰寫時不再需要自己查編號值,相對來說好寫得多。

2016年4月20日 星期三

Minecraft 可堆疊式物品儲存系統

Minecraft 因為遊戲時間一久,玩家通常會累積大量物品,另外如果利用生怪磚建造農場,或者之前出現過的巨大化農場,大量物品儲存系統算是相當重要。

簡單的儲存系統要利用漏斗和箱子即可,如下圖所示的垂直儲存系統設計:


這樣的設計在擴展性方便較差,要更多箱子就要往下延伸,通常在建築物裡面要打掉樓板比較不適合。

水平的儲存系統可利用長條漏斗,連接到一般箱子和陷阱箱子交錯放置的箱子列中,如下圖所示:



上面兩種設計共有問題在於:漏斗中都會殘留儲存的物品,很難確定現在究竟儲存了多少東西,另外,漏斗就是要傳送物品的,東西就應該要放在箱子裡面怎麼能殘留在漏斗中呢?

本文展示一種新型的儲存系統設計,能避免物品殘留在漏斗中:

基本架構如下,儲存同樣是用箱子列和側面的進貨漏斗,不一樣的是進貨漏斗上加上一層控制漏斗,最上面才是物品傳送鏈。

透過比較器感測進貨漏斗那是否有物品,一但有物品將會將控制漏斗關閉,使控制漏斗不會再進貨, 儲存箱滿了,漏斗中頂多殘留一個物品,確保物品都儲存在箱子中。

以下為建造說明影片:

2016年3月21日 星期一

Minecraft 農場

花了一些時間打造的Minecraft 糧食作物農場總算完工了。

三層樓建築都是同樣的構造,分別種wheat、potato跟carrot,每分地大小為9x9,中間留一格水濕潤土地用,每單位可種植80格地,一層樓共16 單位,可種植1280格,等於是收割一次就飽了XD。

萬頃良田,十分壯觀:


天花板設有dispenser放水收割,利用H tree (學以致用的概念X)同步所有的放水時間,這樣設計缺點就是全部同時放水很消耗運算能力,不過lag只有一瞬間所以還好。
放水 H tree design:



同時內部設有箱子跟漏斗,把東西送到外面的可堆疊儲存空間,不然一次收割東西太多了身上放不下:
可堆疊儲存空間,這個有機會再專文介紹好了


外牆主體是以2x2 的bricks 立柱跟大樑,外層用玻璃牆,讓太陽光透進來…比較有農場的感覺,雖然我覺得現實中真有農場長這樣裡面植物大概早就死光了。
前面收集室的部分則是白羊毛為底,主結構參考Odakyu Shinjuku 的百貨外牆XD



蓋完這棟…我覺得我短時間不想再蓋其他大型建案了正好 Minecraft 1.9 也出了
短時間fastbuild plugin 不能用,就先來嘗鮮1.9 的新功能吧

2015年12月14日 星期一

安裝Minecraft Shader

這次放假回家,試著在Minecraft 上面安裝Shader,這裡記一下過程與結果。

試了之後發現,原本要裝GLSL Shader MOD 現在都不用了,1.8 的Optfine 已經把Shader 選項整合進去,只要安裝Optifine 即可開啟Shader 選項
http://minecraftsix.com/optifine-hd-mod/
而且Optfine 的安裝也變簡單了,直接執行載下來的jar 檔就能安裝完成,跟以前手動把jar 檔拆開,把檔案複製進去,刪掉Meta-inf一堆步驟,不小心還會爆開要刪掉重裝的過程根本天壤之別。

裝完optfine再來就可以去載Shader 來玩了,這邊有三個shader可以載,列表打開也有一排shader任君選擇,不過我覺得看多了其實大同小異,通常還是用Sonic Ether's Unbelievable Shaders medium
http://minecraftsix.com/glsl-shaders-mod/
不過Shader 開了,為求效果通常把亮暗對比調得很高,這其實很妨礙建築跟探險,所以只限於拍照用。

另外是一個插曲,一開始裝好的時候,不管是哪個shader,打開畫面都會一片漆黑,下面出現類似:
Invalid program: final
Cannot create FrameBuffer
之類的錯誤,後來發現我沒用Optirun開,使用的顯卡是Intel 的HD Graphics 4000,可能是程式不相容不然就是顯卡不夠力,總之顯示不出來;後來用了Optirun 用筆電的nVidia GT 640M才一切正常,這是顯示結果:

世界變得好漂亮lol。

話說回來,這根本是在虐待顯示卡,用Ultra 的shader fps 都會降到 24左右,移動時畫面看得出頓點,用medium才能回到50 fps,而且以下個人意見:打minecraft 最好玩的還是徒手打造理想世界的那股衝勁,還有完成它的成就感,shader充其量只是裝飾的工具,真正強大的顯示卡,其實是你我的想像力呀。

2014年2月23日 星期日

Minecraft plugin fastbuild 2

這篇接續上一篇 最近花了一點時間,把fastbuild plugin本來預定的功能寫完了。

至於為什麼會相隔這麼久(16天),因為作者平常都在打東方有很多事情要忙,加上Java實在不是作者熟悉的語言,以致進度緩慢。
這次主要寫的是break的部分,原始碼比place 的listener多了一倍,因為break還涉及手中工具的耐久度設定、是否要掉下東西等,功能更複雜。
廢話不多說,來看看怎麼設計。

Event Handler

首先我們要聲請監聽票的event是BlockBreakEvent,這個event會在block被破壞的時候呼叫。 這個event會包含資訊有:玩家,被破壞的方塊。
為了要做到fastbuild的功能,我另外監看了PlayerInteractEvent,可以從這個事件中取得,玩家是碰到方塊的哪一個面。
因為plugin只能做到event based,因此這個plugin還是有一點限制,我們不能讓使用者邊敲方塊,後面一整排的方塊都開始出現裂痕,只能處理BlockBreakEvent(方塊已經爆了),再把後面的方塊設成空氣。這樣會產生一個問題:如果使用者用鏟子爆了泥土,可是後面是石頭,這樣不就可以用鏟子當超強挖礦工具?
所以這裡我們限制會一起挖的,只能是同樣類型的block。
for (int i = 0; i < n-1; i++) {
  nextBlock = block.getRelative(face);
  //currently only deal with same type block
  if (nextBlock.getType() == originType) {
    Collection drops = getDrops(tool, nextBlock);
    nextBlock.setType(Material.AIR);
    if (!isCreative) {
      // drops
      createDrops(nextBlock, drops);
      // durability
      if(!reduceDurability(tool,player)) {
        break;
      }
    }
  } else {
    break;
  }

Durability:

這部分參考[2][3],透過ItemStack的setDurability()跟getDurability()去設值,要注意的是durability值愈高表示工具愈爛,並且可以用ItemStack.getType().getMaxDurability(),來確定工具壞了,以免工具只能挖一格,卻把20格都挖掉了。

Enchantment:

我們處理的enchantment有unbreaking跟silk touch,分別影響durability跟drop items。 minecraft裡物品的item max durability值是恆定的,unbreaking只是在增加durability時加上一個機率,有一定的機不扣durability,在這裡我們複製這個設定。 可以透過ItemStack.getEnchantmentLevel(Enchantment ench); 來取得enchantment的值,非0表示有enchantment。

drops:

這裡我們呼叫 block.getDrops(ItemStack) 來產生drop items內容,用這個的好處是,它會自動判斷工具的等級高低,像用木鎬挖鐵礦,這個事件就會回傳空的內容。不過它不會處理工具有Silk touch的狀況,因些有Silk touch的時候要自己把原本的方塊傳回去。
最後再利用World.dropItemNaturally(Location, ItemStack)產生drop items即可。

Demo:

這個是用gtk-recordMyDesktop錄的,聲音好像比畫面還要慢一點,我也不知道問題在哪lol。

原始碼:

本程式公開所有原始碼,遇到bugs歡迎修改後丟pull request https://github.com/lc85301/FastBuild

參考資料:

1. Bukkit API Overview,要寫plugin不看這個不行www
http://jd.bukkit.org/
2. Minecraft Wiki enchantment:
http://minecraft.gamepedia.com/Enchanting
3. Minecraft Wiki tools
http://minecraft.gamepedia.com/Tools

2014年2月8日 星期六

Minecraft plugin fastbuild

最近想要寫一個快速整地用跟建設用的minecraft bukkit plugin,畢竟在進行大建築物的建設時,常常要剷平一整個山丘,或者要鋪一整片地板,很費工夫而且很慢,按著shift後退加滑鼠右鍵也很累。
用worldedit的確可以達成同樣的目標,可是那又太容易了。這個fastbuild的目標,就是一個威力中等的plugin,不像worldedit這麼有破壞力,保留建築材料自己取得的挑戰,又比用鐵鏟跟專注狂點右鍵更快一些,可以把精力用在建築物的設計上。
總結來說,worldedit是要讓creative mode更creative mode;fastbuild則是要讓survival mode 更creative mode一點。
雖然已經有人寫過了類似的東西,在參考資料[1],但它是mod,也沒有繼續更新,大體上我的目標和它是一樣的。

本plugin的spec如下:

1. 使用某個鍵或指令,目前設定是setn int,讀入使用者打入的數字。
2. 之後破壞方塊和放置方塊時,可以一次破壞/放置該數字的方塊。
3.破壞/放置方塊時的方向,視破壞/放置方塊哪個面而定,破壞上面,就是向下破壞n格;放置上面,就是向上放置n格。
4. 破壞方塊時,該數字目前先定在64,輸入超過數字會自動設在64。
5. 破壞方塊時,若n格內有空氣方塊,則破壞會穿過該格空氣。
6. 破壞方塊時,工具也會進行n次耐久減損判定,所以工具也要帶夠。
7. 破壞方塊時,若用鏟子挖土,但n格內可能有岩石,這要視bukkit怎麼設計。
8. 放置方塊時,該數字同樣先定在64,或者是放置時該stack所持有的方塊數量。
9. 放置方塊時,若遇到其他方塊擋路,則只放到擋路方塊為止。
10. 若以向上跳後向下放置方塊,一次放3個以上的方塊,可能會有窒息的風險或無法放置,這裡不處理。
11. 不支援復原,蓋錯了就要自己打掉,拆錯了自己建回去,科科科。

實際設計: 

開發minecraft,想到java;提到java,想到Sun;說到Sun,想到eclipse(誤)。 主要參考minecraft bukkit server的文件[2],步驟很詳細沒遇上太多問題。
package name: io.github.yodalee.FastBuild

照tutorial 的步驟,創建FastBuild class,用FastBuildSetnCmd接受setn command,用hashedMap記錄每一個玩家目前設定的值。
Event Handler是主要要寫的地方,這裡就要參閱bukkit API的文件,我們這裡要處理的,大部分是在org.bukkit.event.block之下,像放置block的org.bukkit.event.block.BlockPlaceEvent,我們就是要處理這個事件。

@EventHandler
public void onPlace(BlockPlaceEvent event){
}
這樣就可以處理這個事件,看看要幹什麼。
例如BlockPlaceEvent這個class裡面有一個setCancelled的function,用來設定這個event要不要被bukkit處理,如果我們這樣寫
@EventHandler
public void onPlace(BlockPlaceEvent event){
 event.setCancelled(true);
}
那這個server就再也不能蓋東西了ww。 或者可以玩一點更勁爆的
@EventHandler
public void onPlace(BlockPlaceEvent event) {
  Player player = event.getPlayer();
  Block block = event.getBlockPlaced();
  if (block.getType() == Material.DIAMOND_BLOCK) {
    player.getWorld().strikeLightning(player.getLocation());
  } 
}
算是某種禁奢條款,只要放置鑽石方塊想炫富就會被雷劈XD。

回到正題,我們要做的,其實就是從這個place Event裡,取出玩家放置的位子、方位,然後用for loop 重複呼叫placeBlockEvent即可。 目前bukkit好像無法呼叫「在某地放置方塊」的function,因此先用setType來實作,直接取代方塊。
Player player = event.getPlayer();
Block block = event.getBlockPlaced();
Block againstBlock = event.getBlockAgainst();
BlockFace face = againstBlock.getFace(block);
Block nextBlock = null;
ItemStack stackInHand = event.getItemInHand();
int stackAmount = stackInHand.getAmount();
int n,i;

//get n
if (plugin.playerN.containsKey(player)) {
  n = plugin.playerN.get(player);
} else {
  n = 1;
}
n = Math.min(n, stackAmount);

stackInHand.setAmount(stackInHand.getAmount() -1);
//build
if (face != null) {
  for ( i = 0 ; i < n-1 ; i++) {
    nextBlock = block.getRelative(face);
    if (checkReplaceable(nextBlock)) {
      nextBlock.setType(stackInHand.getType());
      block = nextBlock;
    } else {
      break;
    }
  }
}

// reduce itemStack in hand
if (player.getGameMode() != GameMode.CREATIVE) {
  stackInHand.setAmount(stackInHand.getAmount() - n);
  player.setItemInHand(stackInHand);
}
Build大體上的實作就是這樣,其實不算太難。 Break的部分,因為牽扯到手中工具耐久的問題,也許下次再來寫=w=。

Demo:


原始碼:

本程式公開所有原始碼,歡迎修改後丟pull request,這樣我也不用想break方塊怎麼寫了()
https://github.com/lc85301/FastBuild

參考資料:

1. minecraft mod fastbuild
http://www.youtube.com/watch?v=yT5zaBC9O_U
2. bukkit Plugin Tutorial
http://wiki.bukkit.org/Portal:Developers
3. YAML definition
http://wiki.bukkit.org/Plugin_YAML
4. Bukkit API Overview,喔這妖受好用的
http://jd.bukkit.org/

2014年1月21日 星期二

實作:minecraft 豬人農場

直接進正題,總之看了youtube的設計:
http://www.youtube.com/watch?v=sEqKe10H6jo
就決定也來蓋一個。

不過因為用venture mode很難抓ghast,就只好用裝trapdoor或sign的方式,讓豬人自己走下來;而豬人的出生頻率和傳送門block的數量正比,因此門自然是愈大愈好;和影片中的口字型設計相比,田字的設計可以讓傳送門/黑曜岩的比例更高,因此選用田字型的設計;高跟寬設定為3x3,這個高度為67格高,加上摔落距離20格高,差不多接近minecraft時間流動的極限,因此設定為田字型3x3的設計,有點像建一個魔術方塊的框。

第一步是採集所需要的黑曜岩,所需要的量為:
垂直:21*3*16=1008
水平:21*4*3*8=2016
總合:3024單位黑曜岩,正好有一枝efficient V+unbreaking III的鑽石鎬,就好好的利用它,一口氣挖掉一整個岩漿峽谷,結果如下圖,放一個木塊是本來岩漿池的高度,直接倒水後整塊挖掉,都要挖到基岩了:

其他資源用量:

  • gravel: 5552單位,反正gravel沒用處,就把我家的gravel全用在這,沒想到還不夠(我家只有3400多個),還跟兩位朋友調了不少貨。
  • stoneslab: 5446 單位,這個其實不用,只是我覺得在下面一直滴水很討厭,就全部用一層stoneslab+一層gravel。
  • Trapdoor: 2765 單位,雖然說用sign比起來比較省木頭,不過trapdoor蓋起來比較快,木頭也不是什麼珍貴材料,就用trapdoor了。
  • Cobblestone: 1092 單位,主要是摔落塔跟底座。
  • Stonebrick: 563單位,這個是蓋四根支持柱,不是跟原PO一樣這麼求物理合理性的話可以不理這項。
  • Netherbrick: 292單位,用在黑曜岩間的填充跟走路的部分,純粹色調比較像。
  • Ladder: 582單位。
  • Fence: 450單位,防凍架使用。
其他還有一些漏斗,repeater,比較器做分類器,南瓜燈等,就不列上來了。

接著附幾張工程照片:
雪人掉落部分,這地方設計跟影片內相同:

建設中,因為我沒放很多光源,到了晚上就會變相撲競技場,被打到場外的話就會……:
平面部分建設完成,可以看到有些地方會積雪,這也是開始建設後才發現:
因此加設防凍架,以防水結冰:
黑曜岩矩陣:
trapdoor鋪設完成:
點火:
放水,上述平面的坡度,除了最底層是八格寬外,上面四層都是七格寬,只要最上一個放水,整個廣場都會有水流(廣場大小:73x73):
測試一下,效果十分顯著,如果積了太多,可以用splash of healing,可以瞬殺一群。
最後是一張全景照:

謝謝大家收看。

2013年11月16日 星期六

使用振盪器改善投擲器鏈之鎖死問題

個人很常玩minecraft大概不用提,最近在建造分類工廠時,遇到「將物品向上傳送」的設計問題,因為一般的漏斗只能水平傳送或是向下傳送,如果不想要讓玩家自己把物品拿到高處,就要有自動化的機制才行。
幸好在1.5版之後,新加入大量紅石元件,讓許多過去無法達成的自動化得以實現,本文設計一個利用振盪器驅動投擲器鏈,進而改善過去投擲器鏈常遇到的鎖死問題,分述如下:

1. 過去向上運送法之介紹:
2. 改善投擲器鏈之設計:
3. 設計展示:
4. 參考資料:

1. 過去向上運送法之介紹:
過去常見的minecraft傳送物品向上有五種方法:向上水流運送、活塞運送、鐵路運送、投擲器鏈和玻璃傳送管。
向上水流最大的問題是運送效率不佳,速度最慢還有可能會卡住,同時需要相當大的建造面積。活塞運送也有相同的問題,向上提升一格就要再將物品移動到另一格,也容易掉物品[1]。
玻璃管傳送法見[2],是利用minecraft 的bug feature,物品被由下向上擠壓時會向上移動尋找空間,藉此運送物品,最上方再以漏斗承接運送的物品,事實上不用玻璃亦可達到相同的效果,使用玻璃純粹是可以看到在運送什麼;在長距離傳送上,玻璃傳送管效益最高,使用極少量的紅石電路即可,但物品跑到傳送器外,未免讓人心理發毛,一不小心物品可能會落到管外而遺失。
相較上述三種方式,鐵路運送和投擲器鏈不會將物品轉為實體,可靠性相對較高。
鐵路運送[3]相當有效率,要送高只要多蓋鐵軌即可,只有起迄點需要紅石電路設計,但使用方式是利用箱子一次運送一箱的物品,個人比較不喜歡。
投擲器鏈相對可實現連續、可靠的運送,在過去已有幾件相關設計[4]-[5],這些設計都使用比較器偵測投擲器內的物品,經過回送驅動投擲器向上傳送;這樣的設計有個最大的問題,當投擲器內的東西超過一個時,投擲器發射後裡面還有物品,比較器將不會再更新,使得投擲器錄陷入鎖死,需要以人工手動移除多餘的物品才能再次運作。
特別是一般自動化運送物品都會用漏斗將物品打入投擲器中,而漏斗的運作速率是每秒2.5個(4個redstone ticks),這速率高於驅動投擲器向上的速率;因此兩個設計中都在漏斗旁放上一個紅石作為控制,一但投擲器有東西就停止漏斗的運作,無奈只要這個機制出小差錯,還是要人工介入移除多餘物品。

2. 改善投擲器鏈之設計:
為了改善這個問題,本設計使用主動振盪器來驅動投擲器向上,雖然需要多一點的面積,不過這個機制保證投擲器會運作到整條投擲器鏈都沒有東西為止,主要分為三個部分:偵測器,Or gate,振盪器:

偵測器:
左右兩邊交互放置比較器偵測投擲器鏈內的內容,由於比較器輸出強驅動訊號,因此只有圖中紅色block上會放置紅石,上一層的比較器可透過白色方塊傳遞給下層紅色block,如圖所示:

Or gate : 上一層的紅色block訊號,會經過兩次not,送給下一層的訊號;加入repeater的目的,是要防止自身紅色block的強訊號覆寫下一層not過的訊號,否則當整條鏈中只有紅色block該層投擲器有東西時,振盪器也不會驅動。

振盪器: 將訊號集中起來,驅動比較器制成的高頻振盪器,透過半板向上送給每一個投擲器,即完成本設計。

本設計缺點有,一、振盪器的傳送距離為15格,大約只能送12層的高度,可以在上層設置另一個振盪器來解決這個問題,但會佔掉一些樓板面積;或者不求速度的話,可以用比較慢一點的振盪器,就可以用「block-紅石火把」的組合將訊號向上傳送,如圖所示;不過若是超高層傳送,玻璃管傳送法會是比較有效率的做法。二、運作起來相當吵,這個是真的沒得解。


3. 設計展示: 在底部送入物品,都會送到頂部的箱子中,兩段式的版本也可以運作正常,前述的噪音問題在兩段式版上會更明顯,因為這裡用的是比較器振盪源,比較器只有1 ticks的延遲讓投擲器的運作快過漏斗的運作,一開啟就會聽到投擲器時停時開的嗒嗒聲,其實相當煩人。

4. 參考資料:
[1]. water
https://www.youtube.com/watch?v=z1rAiPsCj5Q
[2]. glass tube item lifter:
https://www.youtube.com/watch?v=DtcSljfkMIw
[3] railway item transport:
https://www.youtube.com/watch?v=PLtqJ5gsO9E
[4]. dropper chain:
https://www.youtube.com/watch?v=7OJUHyJfrQE
[5]. dropper chain:
https://www.youtube.com/watch?v=_xu7e97_Qdo

2013年5月25日 星期六

使用差動雙投擲計時器應用於時鐘製作之研製

minecraft是一款我認為設計得相當好的遊戲,透過簡單方塊的堆積,讓你組出任何你想要的內容;而紅石又是其中最有變化的物件,可以模擬出許多數位電路的行為,老實說基本的邏輯設計課程應該可以用minecraft當作輔助教材(XD)。

minecraft升級到1.5之後,多了很多新的紅石元件,其中包括可以測定日光強度的日光sensor,讓我們有機會在minecraft當中,實現時鐘的功能。
之前已經有相當多相關的設計,包括直接用sensor輸出信號接在redstone lamp(1),及用長線分離出各時段的信號(2)等。
因為sensor輸出信號在白天呈現山形,第一種時鐘,共有上午和下午時會呈現相同的時間、計時非線性、晚上也只能顯示為晚上而非確切時間等問題;第二種則需要相當大的空間和電路,在一般server不用creative mode難以實現。
這裡我們就要設計的是,能夠線性計時,利用daylight sensor來校正,同時體積儘量小的設計。

最終設計的minecraft時鐘共有兩個主要部分,分別為:差動雙投擲計時器、雙比較器實現計數器(counter).本文將分為以下幾個部分:
1. minecraft 時間及sensor介紹:
2. 差動雙投擲計時器之設計:
3. 雙比較器實現計數器之設計:
4. 設計展示:
5. 相關設計:

1. minecraft 時間及sensor介紹:

minecraft一天有現實的20分鐘,共分為24000個基本時間單位ticks,ticks設為0時相當於每日早上6點。sensor的部分,固定每天22500ticks到13500ticks會發出信號,其他時間則不發射,信號強度依日光強度有所不同。
詳細資料請參考:(3)minecraft wiki daylight sensor。

2. 差動雙投擲計時器之設計:

過去minecraft上常難以實現長時間的delayer,可行的辦法包括用rail+detect rail、dispensor+蜘蛛網、鐵路+流水回收(4)等、活塞循環(5)等;但一般rail+detect rail需要相當大的面積來達成長delay,一般大小下delay只有約10-20秒,且重登入時不容易reset;dispensor+蜘蛛網、鐵路+流水回收則不夠精確,delay時間的可調長度與可調精度不佳;活塞循環相較之下較為可行,但拉到四角的紅石信號容易造成信號線相當複雜,一般體積也較大。 

本文提出之差動雙投擲計時器,除了能精確計時外,還具有容易reset、停止、可調長度相當廣及所佔體積相當小等好處,主要的參考來源為「SCAMP全自動造山機」(6)。 

雙投擲器將兩個投擲器相對,驅動一個投鄭器即會將內容物送至另一個投擲器內,透過1.5版新增的比較器,偵測投擲器是否內含物品,驅動比較器製成的振盪器(圖左),即可自動將一投擲器(下稱發射端)的物品送到另一側(下稱預備端),調整投擲器內的物品數量和振盪器的頻率,可以調整輸出變化的時間,由於comparator的delay不明,粗估送完的時間方式為,投擲器內的物品數量*(Osc. Delay),實測上兩個repeater調最長,17個物品送完的時間是30秒。
理論上可以在另一邊複製相同的振盪電路,將一側電路的輸出鎖住另一方向的repeater,達到來回振盪的功能,但如下圖,repeater要鎖住的方向不同,這樣的設計會讓電路變得相當大;同時兩邊都是相同的振盪頻率,實用上不容易做到校正的功能。


新架構加入另一套雙投擲計時器,兩計時器互鎖,當A方鎖住B方時(A方的Q值為1),A方輸出和B方預備端是否含物品的信號通過AND閘,驅動高速振盪器,將物品送回發射端。



運作包含五個相位:
1. A方發射端將物品送入預備端,B方預備端高速送物品回發射端。
2. B方預備端送完,高頻振盪器停止。
3. A方發射端送完,B方發射端解鎖,使A方輸出鎖住,並啟動A方預備端高頻振盪器。
4. A方預備端送完,高頻振盪器停止。
5. B方發射端送完,A方發射端解鎖,使B方輸出鎖住,並啟動B方預備端高頻振盪器,回到相位一。

最後則是控制信號的部分,可以透過強制將A/B方鎖住信號設在1來達成開關計時器的功能;但要注意的是,repeater的鎖住是鎖在 0或1,如果鎖在1的話,會使雙投擲器進入來回投擲的不穩定狀態;因此我們要在控制信號的輸入處,加入一個由輸出控制的鎖,以避免上述狀況的發生,詳細如下圖所示。
完成之雙投擲計時器所佔面積為10*8*3,相當compact,理論上的最長delay時間估計為2032秒左右




3. 雙比較器實現計數器之設計:

由於上述差動雙投擲計時器的輸出端,只能隨時間輸出長週期的1/0信號,因此輸出端先接入一個上升/下降緣檢測電路(edge detector),產生短脈衝;再接入計數器計算短脈衝的數量,以達成隨不同時間輸出不同信號的能力。

這裡狀態機的設定參考(7)的設計,功能考量,我們只取其中的down counter跟重設的能力,同樣由雙比較器維持信號強度,每一個脈衝進來,經比較器產生強度一的信號,使狀態強度減小一,達到狀態記錄。
實作上計數器記錄的是計時器發出多少次信號;在這裡我們用來記錄經過多少時間,在日間感測器開始運作之後,到日落的時間為15000ticks=12.5分,晚上感測器則是9000ticks=7.5分,分別需要記錄12, 7個狀態。

為了reset計數器,我們需要特定強度的信號,當然也可以用強度15的信號reset,但這樣會加大計數器的體積;這部分使用箱子+comparator產生,並利用另一個信號為15的信號相減,來產生所需的強度。
以日間計數器需設到強度12的信號,箱子要放345-460個物品。
以日間計數器需設到強度7的信號,箱子要放921-1036個物品。(雞蛋的話請除4)
這個用骨粉來放最容易了。



4. 設計展示:

最終時鐘設計如下圖所示:

中央的日光偵測器為核心,左右各為一套雙投擲計時器,分別在日、夜時工作(左日右夜,不想看到紅石電路請自己拉到地底=w=);計時器Q+輸出經edge detector進到計數器-1端,Q-經edge detector到對方計數器reset端;上方為夜間計數器,七個狀態;下方為日間計數器,12個狀態;有一些些調整是在鎖住sensor信號跟接到計數器的部分,都是為了讓體積更小。

稍微提一下,因為在雙投擲計時器,鎖住控制信號的那一方(Q-),在計時器被鎖住時,其輸出為0,如圖中左邊上半的狀態,因此在停止工作的瞬間,會有一個negative edge pulse,利用negative edge detector偵側這個信號幫另一方重設。
開始計時的時候,Q-端會先變1,然後30秒後換Q+端變1,再30秒Q+變0;因此從Q+端接到計數器減一端的detector同樣是negative edge detector。

這大概是整體時鐘的設計了,每個一紅石燈的信號可以自行拉線到想顯示的方式上;就我所知,這是目前能線性計時,同時體積最小的設計。

5. 參考資料:

(1)Basic Minecraft Clock Using 13w01a "Daylight Sensors"
http://www.youtube.com/watch?v=2x-l0owQGF0
(2)WORKING 12-HOUR CLOCK IN MINECRAFT
http://www.youtube.com/watch?v=1-ylYISMAck
(3)daylight sensor
www.minecraftwiki.net/wiki/Daylight_Sensor
(4)Minecraft clocks (6min)
http://www.youtube.com/watch?v=Rz1Qxbh3_XI
(5)Minecraft : Piston clock for long delay
http://www.youtube.com/watch?v=M19UQ5Y_wzQ
(6)The SCAMP: How it Works, and How to Use It
http://www.youtube.com/watch?v=vBpPKVwIwP4
(7)Decimal Counter with Comparators [Tutorial] Minecraft 1.5
http://www.youtube.com/watch?v=J7mRNZXshCQ