Minecraft - Raspberry Pi 専用版 (2013/02/15)

MinecraftRaspberry Pi 専用版 が公開されました。 Minecraft は立方体のブロックでできた3次元の世界で、ブロックを設置したり削除したりして色々なものを作って生活するゲームです。Google で 「Minecraft」を画像検索すると多くの(とんでもない)スクリーンショットが公開されています。Minecraft の Raspberry Pi 専用版 は無料ですが、有料版と異なり、資源の制限がない、敵がいないなど、ゲーム性はあまりありません。一方、Python や Java でプログラムを作成して立方体でできた3次元世界をコントロールできるようになっています。 Raspberry Piを使ってプログラミングに興味を持ってもらおうといった意味があるようです。

Minecraft - Pi Editionのダウンロード

ここでは 2013-02-09-wheezy-raspbian をインストールした4GBのSDカードのユーザIDが jun のホームディレクトリに展開する事にします。Minecraft - Pi Edition は https://s3.amazonaws.com/assets.minecraft.net/pi/minecraft-pi-0.1.1.tar.gz からダウンロードできます。ホームディレクトリにminecraftというディレクトリを作成して、そこにダウンロードして展開することにします。

jun@raspberrypi ~ $ mkdir minecraft
jun@raspberrypi ~ $ cd minecraft
$ curl -o minecraft-pi-0.1.1.tar.gz https://s3.amazonaws.com/assets.minecraft.net/pi/minecraft-pi-0.1.1.tar.gz
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100 1425k  100 1425k    0     0   336k      0  0:00:04  0:00:04 --:--:--  351k

jun@raspberrypi ~/minecraft $ ls -l
total 1428
-rw-r--r-- 1 jun jun 1459472 Feb 14 20:21 minecraft-pi-0.1.1.tar.gz

jun@raspberrypi ~/minecraft $ tar zxf minecraft-pi-0.1.1.tar.gz 
jun@raspberrypi ~/minecraft $ ls -l
total 1432
drwxr-xr-x 4 jun jun    4096 Feb 11 19:52 mcpi
-rw-r--r-- 1 jun jun 1459472 Feb 14 20:21 minecraft-pi-0.1.1.tar.gz

展開したファイルの内容を確認します。mcpi フォルダに移動してファイルの一覧を確認します。minecraft-pi というサイズの大きなファイルが Minecraft - Pi Edition の実行ファイルです。

jun@raspberrypi ~/minecraft $ cd mcpi
jun@raspberrypi ~/minecraft/mcpi $ ls -l
total 1204
drwxr-xr-x 5 jun jun    4096 Feb 14 20:22 api
-rw-r--r-- 1 jun jun     488 Dec 21 02:10 CONTROLS.txt
drwxr-xr-x 4 jun jun    4096 Feb 14 20:22 data
-rw-r--r-- 1 jun jun     208 Feb 11 19:07 HOW_TO_RUN.txt
-rw-r--r-- 1 jun jun     319 Feb 11 20:01 LICENSE.txt
-rwxr-xr-x 1 jun jun 1206760 Feb 11 19:49 minecraft-pi
-rw-r--r-- 1 jun jun      13 Feb 11 19:04 VERSION.txt

Minecraft の起動

もし XWindows が起動していなかったら "startx" コマンドで起動しておきます。デスクトップの左下のアイコンをクリックしてメニューを表示し、アクセサリのなかから LXTerminal をクリックして起動します。Raspbianのデフォルトの ユーザ pi 以外のユーザの場合は video グループに属している必要があります。以下のコマンドのようにユーザを video グループに入れて、ログインし直します。

jun@raspberrypi ~/minecraft/mcpi $ sudo usermod -G video jun

Minecraft - Pi Edition を実行します。

$ ./minecraft-pi

操作方法

Minecraft は マウス と キーボード を両方使う必要があります。

キー操作

キー動作
W 前進
A 左移動
S 後退
D 右移動
スペース ジャンプ、ダブルタップで飛行の開始/終了、押し続けるとより高く飛ぶ
シフト下降、押し続けると低く移動
E 一覧を開く
1-8 アイテム一覧から使うものを選択
ESC メニューの表示/非表示
TAB マウスを解放
ENTER メニューの選択

マウス操作

上下左右移動 見る方向(進行方向)の指定
左ボタン ブロックを除く
右ボタン ブロックをブロックを置く、ブロックを剣でたたく
ホイール アイテム一覧から使うものを選択

Pythonから操作してみる

Minecraft の Raspberry Pi 専用版 の特徴である Python を使ったプログラミングを試してみます。今回展開したディレクトリ ~/minecraft の下の mcpi/api/python/mcpi 以下に Python のモジュールがあります。これらのモジュールを使って、Pythonから実行中の Minecraft を操作する事が出来ます。

まずは mcpi/api/python まで移動して対話的にPythonを操作してみましょう。

jun@raspberrypi ~ $ cd minecraft/mcpi/api/python/

jun@raspberrypi ~/minecraft/mcpi/api/python $ python
Python 2.7.3 (default, Jan 13 2013, 11:20:46) 
[GCC 4.6.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import mcpi.minecraft as mcpi
>>> mc = mcpi.Minecraft.create()
>>> mc.camera.setFollow()
>>> mc.camera.setNormal()
>>> mc.getPlayerEntityIds()
[1]
>>> mc.player.getPos() 
Vec3(26.3,18.0,85.7152)
>>> mc.player.getTilePos()
Vec3(26,18,85)
>>> mc.player.setTilePos(26,38,85)
>>> mc.player.getTilePos()
Vec3(26,38,85)
>>> mc.player.getPos() 
Vec3(26.5,38.0,85.5)
>>> mc.player.setTilePos(0,0,0)
>>> mc.getHeight(0, 0)
2
>>> mc.player.setTilePos(0,2,0)
>>> mc.setBlocks(-3, 2, -3, 3, 22, 3, 45)

Minecraft の画面がpythonのメソッドを実行する度に変化します。操作した内容についてコメントを追加しました。

ディレクトリを移動します。 
jun@raspberrypi ~ $ cd minecraft/mcpi/api/python/

pythonを起動します 
jun@raspberrypi ~/minecraft/mcpi/api/python $ python
Python 2.7.3 (default, Jan 13 2013, 11:20:46) 
[GCC 4.6.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.

mcpi ディレクトリの minecraft モジュールをインポートして mcpi として参照します。 
>>> import mcpi.minecraft as mcpi

Minecraftクラスのオブジェクトを作成して変数 mc に代入します。これでMinecraftに接続されます。
>>> mc = mcpi.Minecraft.create()

カメラを自キャラの上空から見下ろす視点に設定します。
>>> mc.camera.setFollow()

カメラを自キャラの前方を見る通常モードに戻します。
>>> mc.camera.setNormal()

自キャラのIDを取得します。
>>> mc.getPlayerEntityIds()
[1]

自キャラの位置を取得します。
>>> mc.player.getPos() 
Vec3(26.3,18.0,85.7152)

自キャラの位置を整数値で取得します。
>>> mc.player.getTilePos()
Vec3(26,18,85)

自キャラを指定位置まで移動します。
>>> mc.player.setTilePos(26,38,85)

自キャラの位置を整数値で取得します。
>>> mc.player.getTilePos()
Vec3(26,38,85)

自キャラの位置を取得します。
>>> mc.player.getPos() 
Vec3(26.5,38.0,85.5)

自キャラの位置を原点まで移動します。
>>> mc.player.setTilePos(0,0,0)

原点の(地表の)高さを取得します。
>>> mc.getHeight(0, 0)
2

地表の高さに移動します。
>>> mc.player.setTilePos(0,2,0)

原点付近に赤いレンガの塔を建てます。
>>> mc.setBlocks(-3, 2, -3, 3, 22, 3, 45)

以上のような内容を Python のスクリプトとして記述しておいて実行することができます。既に空中にデジタルクロックを作成したり、アイデア勝負が始まっています。

コマンド

使用できるコマンドを示します。まだ調査中です。

カメラ

自キャラ

World

Events

ブロックの種類

setBlock で指定するブロックの種類を指定する番号です。

番号 ブロックの種類
0AIR
1STONE
2GRASS
3DIRT
4COBBLESTONE
5WOOD_PLANKS
6SAPLING
7BEDROCK
8WATER_FLOWING
9WATER_STATIONARY
10LAVA_FLOWING
11LAVA_STATIONARY
12SAND
13GRAVEL
14GOLD_ORE
15IRON_ORE
16COAL_ORE
17WOOD
18LEAVES
20GLASS
21LAPIS_LAZULI_ORE
22LAPIS_LAZULI_BLOCK
24SANDSTONE
26BED
30COBWEB
31GRASS_TALL
35WOOL
37FLOWER_YELLOW
38FLOWER_CYAN
39MUSHROOM_BROWN
40MUSHROOM_RED
41GOLD_BLOCK
42IRON_BLOCK
43STONE_SLAB_DOUBLE
44STONE_SLAB
45BRICK_BLOCK
46TNT
47BOOKSHELF
48MOSS_STONE
49OBSIDIAN
50TORCH
51FIRE
53STAIRS_WOOD
54CHEST
56DIAMOND_ORE
57DIAMOND_BLOCK
58CRAFTING_TABLE
60FARMLAND
61FURNACE_INACTIVE
62FURNACE_ACTIVE
64DOOR_WOOD
65LADDER
67STAIRS_COBBLESTONE
71DOOR_IRON
73REDSTONE_ORE
78SNOW
79ICE
80SNOW_BLOCK
81CACTUS
82CLAY
83SUGAR_CANE
85FENCE
89GLOWSTONE_BLOCK
95BEDROCK_INVISIBLE
98STONE_BRICK
102GLASS_PANE
103MELON
107FENCE_GATE
246GLOWING_OBSIDIAN
247NETHER_REACTOR_CORE

おまけ : 2013-02-09-wheezy-raspbian のインストール

例によって MacBook Pro17 の MacOSX 10.8.2 でインストール作業した記録です。 MacOS X ではデバイス名の指定方法が異なるだけで、Linuxと同じく dd コマンドを使ってSDカードに ディスクイメージを書き込みます。以下の例は、私のMacBookでの例です。適宜読み替えてください。

dd コマンドのデバイスの指定を間違えると最悪ハードディスクがすべて消えるなどの悲惨な結果が待っています。十分に注意して行なってください。

$ uname -rsv
Darwin 12.2.0 Darwin Kernel Version 12.2.0: Sat Aug 25 00:48:52 PDT 2012;
 root:xnu-2050.18.24~1/RELEASE_X86_64

ダウンロードしたディスクイメージは以下のサイズです。

$ ls -lt 2013-02-09-wheezy-raspbian.zip
-rw-r--r--@ 1 jun  staff  493587826  2  9 21:52 2013-02-09-wheezy-raspbian.zip

イメージのハッシュ(SHA-1)が 配布サイトに記載されている値 b4375dc9d140e6e48e0406f96dead3601fac6c81 であることを確認しました。

$ shasum 2013-02-09-wheezy-raspbian.zip
b4375dc9d140e6e48e0406f96dead3601fac6c81  2013-02-09-wheezy-raspbian.zip

いつものようにMacBook Pro17 にUSB接続のカードリーダを接続して、SDカードをアンマウント(デバイス名は df コマンドで確認してください)。

$ diskutil unmount /dev/disk1s1
Volume (null) on disk1s1 unmounted

4GBのclass 4 SDカード のパーティションを確認。

$ sudo fdisk /dev/disk1
Password:
Disk: /dev/disk1  geometry: 960/128/63 [7744512 sectors]
Signature: 0xAA55
         Starting       Ending
 #: id  cyl  hd sec -  cyl  hd sec [     start -       size]
------------------------------------------------------------------------
 1: 0B    1   2   3 -  960  48  48 [      8192 -    7736320] Win95 FAT-32
 2: 00    0   0   0 -    0   0   0 [         0 -          0] unused      
 3: 00    0   0   0 -    0   0   0 [         0 -          0] unused      
 4: 00    0   0   0 -    0   0   0 [         0 -          0] unused      

zipファイルを展開します。

$ unzip 2013-02-09-wheezy-raspbian.zip
Archive:  2013-02-09-wheezy-raspbian.zip
  inflating: 2013-02-09-wheezy-raspbian.img

$ ls -lt 2013-02-09-wheezy-raspbian.*
-rw-r--r--@ 1 jun  staff   493587826  2  9 21:52 2013-02-09-wheezy-raspbian.zip
-rw-r--r--@ 1 jun  staff  1939865600  2  9 12:44 2013-02-09-wheezy-raspbian.img

4GB class4 のSDカードに書き込みます。2.2GHzのi7のMacで8.6分程度かかりました。いつもの 16GBのclass 10 microSDカード では 2 分弱(17738696 bytes/sec)なので、かなり遅く感じました。

$ sudo time dd bs=1m if=2013-02-09-wheezy-raspbian.img of=/dev/rdisk1

1850+0 records in
1850+0 records out
1939865600 bytes transferred in 516.251084 secs (3757601 bytes/sec)
      516.28 real         0.00 user         1.71 sys

Macでは書き込みが終わると自動的にマウントされるので、ブート領域のファイルを確認します。

$ cd /Volumes/Untitled
$ ls -lt
total 37920
-rwxrwxrwx  1 jun  staff      137  2  9 03:42 issue.txt
-rwxrwxrwx  1 jun  staff      142  2  9 01:27 cmdline.txt
-rwxrwxrwx  1 jun  staff     1180  2  9 01:27 config.txt
-rwxrwxrwx  1 jun  staff    17764  2  9 00:21 bootcode.bin
-rwxrwxrwx  1 jun  staff     5898  2  9 00:21 fixup.dat
-rwxrwxrwx  1 jun  staff     2260  2  9 00:21 fixup_cd.dat
-rwxrwxrwx  1 jun  staff     8687  2  9 00:21 fixup_x.dat
-rwxrwxrwx  1 jun  staff  2802568  2  9 00:21 kernel.img
-rwxrwxrwx  1 jun  staff  9609792  2  9 00:21 kernel_emergency.img
-rwxrwxrwx  1 jun  staff  2694676  2  9 00:21 start.elf
-rwxrwxrwx  1 jun  staff   569240  2  9 00:21 start_cd.elf
-rwxrwxrwx  1 jun  staff  3631684  2  9 00:21 start_x.elf

前回 (2012-12-16-wheezy-raspbian) と比べると start_x.elf が増えています。コーデックを追加したバージョンのようです。

新しいイメージで起動

インストールしたSDカードをRaspberry Piにセットして、再起動。dmesg を眺めるとカーネルのバージョンが新しくなっていました。

2013-02-09-wheezy-raspbian

[    0.000000] Booting Linux on physical CPU 0
[    0.000000] Initializing cgroup subsys cpu
[    0.000000] Linux version 3.6.11+ (dc4@dc4-arm-01) (gcc version 4.7.2 20120731 (prerelease) 
(crosstool-NG linaro-1.13.1+bzr2458 - Linaro GCC 2012.08) ) #371 PREEMPT Thu Feb 7 16:31:35 GMT 2013

2012-12-16-wheezy-raspbian

[    0.000000] Initializing cgroup subsys cpu
[    0.000000] Linux version 3.2.27+ (dc4@dc4-arm-01) (gcc version 4.7.2 20120731 (prerelease)
(crosstool-NG linaro-1.13.1+bzr2458 - Linaro GCC 2012.08) ) #250 PREEMPT Thu Oct 18 19:03:02 BST 2012

前回のメモも参考にして下さい。


「LuaJITでお手軽3D」に続く...