Minecraft - Raspberry Pi 専用版 (2013/02/15)
Minecraft の Raspberry 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 のスクリプトとして記述しておいて実行することができます。既に空中にデジタルクロックを作成したり、アイデア勝負が始まっています。
コマンド
使用できるコマンドを示します。まだ調査中です。
カメラ
- mc.camera.setNormal([entityId])
- mc.camera.setFixed()
- mc.camera.setFollow([entityId])
- mc.camera.setPos(x, y, z)
自キャラ
- mc.player.getPos() => Vec3
- mc.player.setPos(xf, yf, zf)
- mc.player.getTilePos() => x, y, z
- mc.player.setTilePos(x, y, z)
World
- mc.getBlock(x,y,z) --> blockTypeId
- mc.getBlockWithData(*args):
- mc.getBlocks(*args):
- mc.setBlock(x, y, z, blockTypeId)
- mc.setBlock(x, y, z, blockTypeId, blockData)
- mc.setBlocks(x1, y1, z1, x2, y2, z2, blockTypeId)
- mc.setBlocks(x1, y1, z1, x2, y2, z2, blockTypeId, blockData)
- mc.getHeight(x, z) --> Integer
- mc.getPlayerEntityIds() -- >id:int
- mc.saveCheckpoint()
- mc.restoreCheckpoint()
- mc.postToChat(msg)
- mc.setting(setting, status)
Events
- mc.events.clearAll()
- mc.events.pollBlockHits()
ブロックの種類
setBlock で指定するブロックの種類を指定する番号です。
番号 | ブロックの種類 |
---|---|
0 | AIR |
1 | STONE |
2 | GRASS |
3 | DIRT |
4 | COBBLESTONE |
5 | WOOD_PLANKS |
6 | SAPLING |
7 | BEDROCK |
8 | WATER_FLOWING |
9 | WATER_STATIONARY |
10 | LAVA_FLOWING |
11 | LAVA_STATIONARY |
12 | SAND |
13 | GRAVEL |
14 | GOLD_ORE |
15 | IRON_ORE |
16 | COAL_ORE |
17 | WOOD |
18 | LEAVES |
20 | GLASS |
21 | LAPIS_LAZULI_ORE |
22 | LAPIS_LAZULI_BLOCK |
24 | SANDSTONE |
26 | BED |
30 | COBWEB |
31 | GRASS_TALL |
35 | WOOL |
37 | FLOWER_YELLOW |
38 | FLOWER_CYAN |
39 | MUSHROOM_BROWN |
40 | MUSHROOM_RED |
41 | GOLD_BLOCK |
42 | IRON_BLOCK |
43 | STONE_SLAB_DOUBLE |
44 | STONE_SLAB |
45 | BRICK_BLOCK |
46 | TNT |
47 | BOOKSHELF |
48 | MOSS_STONE |
49 | OBSIDIAN |
50 | TORCH |
51 | FIRE |
53 | STAIRS_WOOD |
54 | CHEST |
56 | DIAMOND_ORE |
57 | DIAMOND_BLOCK |
58 | CRAFTING_TABLE |
60 | FARMLAND |
61 | FURNACE_INACTIVE |
62 | FURNACE_ACTIVE |
64 | DOOR_WOOD |
65 | LADDER |
67 | STAIRS_COBBLESTONE |
71 | DOOR_IRON |
73 | REDSTONE_ORE |
78 | SNOW |
79 | ICE |
80 | SNOW_BLOCK |
81 | CACTUS |
82 | CLAY |
83 | SUGAR_CANE |
85 | FENCE |
89 | GLOWSTONE_BLOCK |
95 | BEDROCK_INVISIBLE |
98 | STONE_BRICK |
102 | GLASS_PANE |
103 | MELON |
107 | FENCE_GATE |
246 | GLOWING_OBSIDIAN |
247 | NETHER_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
前回のメモも参考にして下さい。