YouTube とニコニコ動画で投稿中の動画シリーズで、動画に収まりきらなかったこぼれ話や詳細解説を掲載しています。
動画はこちらから
目次
- 1 作成したプログラム
- 2 詳細解説
- 2.1 用語集
- 2.2 コマンド
- 2.3 プログラム関連
- 2.3.1 --(コメント)
- 2.3.2 local(ローカル変数の宣言)
- 2.3.3 function文
- 2.3.4 return文
- 2.3.5 if文
- 2.3.6 while文
- 2.3.7 %(剰余演算子)
- 2.3.8 preipheral.find(ty [, filter])
- 2.3.9 monitor.setCursorPos(x, y)
- 2.3.10 monitor.write(text)
- 2.3.11 monitor.clear
- 2.3.12 monitor.setTextScale(scale)
- 2.3.13 monitor.setTextColor(color)
- 2.3.14 monitor.setBackgroundColor(color)
- 2.3.15 os.time([locate])
- 2.3.16 os.sleep([time])
- 2.3.17 math.floor(x)
- 2.3.18 string.format(formatstring, ...)
- 2.3.19 :(メゾットアクセス)
- 3 編集後記
作成したプログラム
clock.lua
簡単なデジタル時計のプログラム。
pastebin get gb5gBLWD clock.lua
でゲーム内からダウンロードできる。
コメント付き版
-- 周辺機器のモニターを取得する
local monitor = peripheral.find('monitor')
-- hh:MM 形式の時刻を返す
function getFormattedTime()
-- os.time() はデフォルトでゲーム内時刻を、
-- 00:00 からの経過時間[h]で 0.0 以上 24.0 未満で返す
local now = os.time()
-- now を切り捨てて、時間をもとめる
local hour = math.floor(now)
-- now を 60 倍して、00:00 からの経過時間[min]をもとめ、
-- 60 で割ったあまりを求めることで分を計算
local minute = math.floor(now * 60) % 60
-- local second = math.floor(now * 60 * 60) % 60
-- format メゾットは % と d の中にオプションを指定することができる
-- 02 は 2 桁になるようにゼロ埋めすることを示す
return ("%02d:%02d"):format(hour, minute)
end
-- 晴れの日の時ベッドが使える時刻なら true を返す
function canSleep()
local now = os.time()
-- Minecraft の内部時刻[tick]に変換
local tick = math.floor(((now + (24 - 6)) % 24) * 1000)
-- 晴れの日は 12542[tick] から 13459[tick] まで寝ることが出来る
return 12542 <= tick and tick < 23460
end
function setup()
monitor.setTextScale(1)
end
-- モニターの背景色と文字色を指定する
function setColor()
if canSleep() then
-- 寝られるときは黒字に白
monitor.setTextColor(colors.white)
monitor.setBackgroundColor(colors.black)
else
-- 寝られないときは白地に黒
monitor.setTextColor(colors.black)
monitor.setBackgroundColor(colors.white)
end
end
function update()
setColor()
monitor.clear() -- モニターをリセット
monitor.setCursorPos(2, 3) -- 中央ぞろえ風
monitor.write(getFormattedTime()) -- 時刻を記入
end
setup()
while true do -- 無限ループ
update()
os.sleep() -- 0.05 秒 (=1tick) 休む
end
Lua補足
動画では省略したが、これではワールドから出るたびに停止してしまうので、startup.lua
に以下のコードを記載しておくとよい。
shell.run("clock")
Lua詳細解説
動画に登場した要素を詳しく解説します。
用語集
動画内に出てきた専門用語やアイテムなどの解説です。
モニター
デフォルトで 7×5 文字表示できる、周辺機器の一つ。カラー表示には上位版が必要。
表示機能のほかに、右クリックを検知する機能を持っているため、タッチパネルとしても活躍する。
コマンド
動画内で使用した、CC のコンピューターなどで実行可能なコマンドの解説です。
worm コマンド
ヘビゲームが遊べる。それだけ。
プログラム関連
実際に CC でプログラミングするときに必要な知識です。基本的にプログラミング経験者向けの情報になります。
--
(コメント)
--
以降(行末まで)はコメント扱いとなり、処理に影響しない。
local
(ローカル変数の宣言)
Lua の変数はデフォルトでグローバルのため、ローカル変数の定義にはlocal
句が必要である。代入を同時に行わないときは、nil
(null や None や undefined のようなもの)がセットされる。
local 変数名
local 変数名 = 初期値
function
文
関数を定義する。
function 関数名(引数)
内容
end
return
文
戻り値(返り値)を返す。function
ブロックの中で使用する。
if
文
条件式の真偽によって実行する命令を分岐する。elseif
文によって条件を増やしたり、else
文によってすべての条件が偽であった時の動作も指定できる。
if 条件式 then
真のときのみ実行する内容
end
if 条件式1 then
ブロック1
elseif 条件式2 then
ブロック2
elseif 条件式3 then
ブロック3
else
ブロック4
end
while
文
条件が真の間、do
~end
を繰り返す。
while 条件 do
繰り返す内容
end
%
(剰余演算子)
余りを求める演算子。
preipheral.find(ty [, filter])
指定したタイプ(ty
)の周辺機器のメゾットをラップしたテーブルを返す。filter
に関数を与えることで、より詳細な肢体ができる。以降、モニターをラップしたテーブルをmonitor
とする。
monitor.setCursorPos(x, y)
monitor.write
の書き初め位置を指定する。
monitor.write(text)
text
をカーソル位置に記入し、カーソルをその末尾に移動する。print
のような改行は行われない。
monitor.clear
モニターの表示内容を現在の背景色でリセットする。
monitor.setTextScale(scale)
0.5
~5.0
の間で、文字サイズを指定する。0.5
刻み。
monitor.setTextColor(color)
文字色を指定する。色の指定方法は colors を参照。通常版では白黒表示しかできないことに注意。
monitor.setBackgroundColor(color)
背景色を指定する。同上。
os.time([locate])
デフォルトでゲーム内時刻を0.0
以上24.0
未満で返す。
os.sleep([time])
time
で指定した秒数だけ処理を中断する。time
は0.05
の倍数に切り上げられ、未指定の場合は0.05
として扱う。
math.floor(x)
床関数やガウス関数と呼ばれる関数。x
を超えない最大の整数を返す。
string.format(formatstring, ...)
フォーマット文字列を処理する。今回のプログラム中では、:
(コロン)を使ってメゾット風に使っている。
:
(メゾットアクセス)
これだけで記事が一本書けるレベルなので省略。簡単に言うと、a:b()
はa.b(a)
のシンタックスシュガー1。
編集後記
これ以来、やたらと雨が降って使いどきを失いかけています。雨用の表示も制作したい。
- ほかの構文と等価だが、煩雑な記載を省略するための簡略化された構文のこと。 ↩︎