南瓜燈是萬圣節必備的東西,但如果把南瓜和經典視頻游戲俄羅斯方塊結合在一起,會產生什么新東西呢?Pumpktris(南瓜俄羅斯方塊)!國外程序員技術宅Nathan童鞋就 DIY 了一個 Pumpktris,把做好的電路板放在南瓜中,南瓜柄當游戲控制器,完全可以打一把!(看文中視頻)
創意
寫下所有瘋狂、一閃而過的想法,這是我的習慣之一,然后回頭再檢查,而不是當時做判斷,這樣也不會把創意忘掉。在10月份初,我在回想去年的一個創意,制作“南瓜俄羅斯方塊”。我的最初計劃是給南瓜塑形,在南瓜成長的過程中,把南瓜整成俄羅斯方塊游戲中的各種形狀,然后在萬圣節把這些整形后的南瓜拼堆在一起。因為離萬圣節也沒多少周了,想種南瓜,也晚了,所以我想:為什么做一個可以玩俄羅斯方塊的南瓜呢?
我還有一塊沒有用過的LOLShield(譯注:一種 9×14 的 LED 板),我也知道之前有人在這個板子上編寫過俄羅斯方塊游戲。,所以我有了個簡單想法,南瓜上鉆一些洞,放 LED 燈,再做一個控制器,就差不多了。噢,不對,那樣會不會太簡陋了。LED 燈又小,并且都集中在 2×3″ 大的地方。這樣不行!
B 計劃:還是用 LOLshield,但不把LED燈安裝在板子上,我將在外部把它們連接起來,這樣我就能在南瓜上把它們隔的更開了。還好我在這條路上沒有走太遠,就發現方法不對了。因為我發現,在LED燈之間,將會有又電線束,如果板子會搞得太厚,那我焊接和整理板子將會太麻煩了。
所以我打算自己做一個 LED 燈板子,自己重新寫程序。決定已下,我從 Mouser 買了 140 個黃色的 LED 燈,從 Adafruit 買了一對 LED 板子(LED Matrix I2C “backpacks”),這個帶了一個 8*8 的 LED matrix。
焊接時間
第一步就是做 LED matrix,還好我在Hackaday上找到了一篇制作 70 LED 矩陣的文章。雖然我的步驟基本上差不多,但我都會過一遍。如果你要更多的理論知識,去看他們的文章吧。
我切割了 112 段 2.5″ 和 16 段 8″ 的電路線。短線用來連接各個 LED,長線用于連接 LED 到控制器。整一個切割墊,可以輕松、快速、準確地測量出的長度。
下一步,我把7條短線和1條長線焊接到一起了做了 1 條菊花鏈(如下圖)。然后再做 15 條這樣的長線,8*8 矩陣的長線就夠了。
然后制作夾板(jig),和Hackaday上的方式不同,我沒有用硬質板,改用了1/4″的泡沫板。用錐子在上面戳孔了,這比在硬板上用鉆頭要快點。另外用泡沫板的好處是,孔洞可先弄小點,把LED燈塞進去還更穩定哦。
在一排孔洞上安上 LED 燈,每個 LED 的陽極鍍錫后簡短,然后拿一條前面做好的菊花鏈長線,在這排燈上焊接好。在焊接之前,我在菊花鏈的每個連接處包上了半英寸的熱縮管(heat-shrink tubing)。有幾次次我忘了熱縮管,不得不回頭再加。注意:焊接處還燙時,別著急把熱縮管套下去。否則熱縮管就開始收縮,在 LED 連接處就會套不牢了。
把八行LED燈(陽極)都串聯好后,就開始把它們的陰極連起來了。過程一樣,記得熱縮管。搞定后,從泡沫夾板上取下來。
看看!下面就是完工后的 LED 矩陣!
咦?還差什么呢?這是一個8×8的矩陣,想玩俄羅斯方塊,空間還不夠哦。所以我又做了一個8×8的矩陣。
Adafruit 的 LED Matrix Backpack 是要求其 LED 矩陣得正確焊接在板子上,但我是焊接了陰極(female header),如此一來,我可以單獨給每塊8×8 LED 矩陣加電,也可以給整個8×16 LED 大矩陣加電。有人可能會和我說,我應該要在這里或哪里加個電阻什么的,否則我會把芯片弄爆,也許他們是對的,但目前來看工作正常的。
為了把我自己做的 LED 矩陣連接到 I2C Backpack,我切掉了部分原型板,然后焊接了陽極。然后把最后一行一列的8″ 線連接到板子上。
這個能正常運行么?我得編寫代碼來驗證了。
編程時間
I did all coding with the hardware mounted on mybamboo prototyping board. The mini matrices in the I2C backpack sockets fit on the desk much better than the big, floppy matrices I built would have.
所有代碼寫入安裝在我 Bamboo 原型板上的硬件上。
There are seven Tetrominos—yes, that’s what they’re called—in the game. Each has four points, as implied by the “tetra” prefix. A three-dimensional array stores the location of every pixel of every shape, in each of four possible rotations. Storing each rotation is a lot easier (for my brain at least) than calculating it on the fly. As an example, here’s the T shape:
俄羅斯游戲中共有七種形狀(Tetromino),每種形狀都只有四個方塊(點),這也就是為什么會用上 tetra 前綴的原因。用一個三維數組來存儲各種形狀每個點的位置,有四種可能的旋轉角度。存儲每個旋轉角度要比在下降時計算其角度更簡單(至少我是這樣想的)。下面是 T 形狀的例子:
1 2 3 4 5 6 |
|
為了繪制活動塊,程序設置有一個 activePiece 變量(形狀數組的索引)和一個轉動角度變量(形狀轉動角度描述索引),然后設置每個像素對,每個像素對引出兩個偏量:yOffset 和 xOffset,分別指活動塊離屏幕底邊的距離和離屏幕左邊的距離。
It also keeps an array describing the status of each “fixed” piece. With every move of the active piece, whether by gravity or by user control, it checks against that fixed-piece array to see if the requested move can be made without a collision. If the forbidden movement is left, right, or a rotation, it simply doesn’t make the move. If the forbidden movement is vertical it considers the piece to have landed and writes the piece to the array of fixed pieces, then launches a new active piece. Along the way it keeps score, tracks the level, speeds up the drop of the active piece as the game goes on, etc.
還要有一個描述每個“固定塊”狀態的數組。
加工南瓜
這個工程需要一個完美的容器,呃,我說的就是南瓜。南瓜得足夠高,得裝下8英寸高的 LED 矩陣,還得有個長又直的南瓜柄。我開始買了 3 個南瓜,以為都是完美品,回家才知道一瓜不如一瓜。最后總算有個合適的,其他幾個我就用來聯系打孔和練刀工了。
進南瓜里面,我在背面開了一個大口。注意:千萬別從南瓜柄那下刀,南瓜柄還得留著做游戲控制刊。放 LED 燈,從背面比從上面放更容易。
拿一張紙,仿照 8×16 LED 矩陣大小再畫一個矩陣,做好標記。
做好標記后,我用 13/64″ 鉆頭打孔了。
因為圓孔不怎么適合用來做俄羅斯方塊游戲,所以我在每個洞眼旁邊,用 X-Act 刀戳出了方形。
為了把南瓜柄改造成控制桿,我小心翼翼地從根部鋸開了南瓜柄,然后再鉆了一個 1/8″ 大小的孔眼,游戲桿得穿過這個孔。
在南瓜內部,瓜柄下方要整平出一個正方形。把錨釘切短了些(過長會穿透南瓜),然后擰緊。稍后再螺絲把控制桿固定在錨釘上。
控制桿的話,我買了SparkFun的短柄操作桿,把紅球擰下來,換上南瓜柄。我在南瓜柄上鉆了一個孔,給 6mm 的螺栓上膠,然后放進南瓜柄,然后再把南瓜柄擰上操作桿。
然后把 LED 燈塞進南瓜孔洞。中間有個小插曲,從南瓜外邊看著是打了16行的孔,從里面看卻是15行。因為南瓜不夠長,有弧度,導致上上面有兩行洞眼打到一行去了。最上一排就只好直接把 LED 燈強行摁進合適的位置去了。
最后把每塊電路線接好,電源是8節充電電池。
是時候來玩一把南瓜俄羅斯方塊了!!!
除了上面那塊 8×8 的矩陣有時候會有些小故障,其他部分運行的都很好。也許是電源供給問題,但應該是一些間斷的短路,因為這么多電路連接點都在南瓜肉中。操作桿在上面,而顯示屏卻在下方,玩起來也覺得怪怪的。如果我重新做一個的話,我會把控制桿放在另外一個獨立的南瓜上,或者用無線操作桿,或者把控制桿外接線路打扮成南瓜藤。