Forest Logo
search
package_2

gui-lcd

By @hakochanjp

Roblox

Mirrored

GuiLcd

Adafruit_GFX 風の API でドット液晶を描画する Roblox 用ライブラリ。 返り値は Frame として扱えるので、ScreenGui / SurfaceGui / BillboardGui のどこにでも置ける。

インストール

Wally:

[dependencies]
GuiLcd = "hakochanjp/gui-lcd@0.4.0"

または利用側 Rojo プロジェクトから相対 $pathsrc/ を参照する。

使い方

local GuiLcd = require(ReplicatedStorage.GuiLcd)

local lcd = GuiLcd.new({ cols = 32, rows = 16 })
lcd.Size = UDim2.fromScale(0.5, 0.25)
lcd.Position = UDim2.fromScale(0.25, 0.1)
lcd.Parent = playerGui.ScreenGui          -- Frame として配置

lcd:ClearDisplay()
lcd:DrawRect(1, 1, 32, 16)                -- 枠
lcd:DrawLine(1, 1, 32, 16)                -- 対角線
lcd:FillRect(4, 4, 6, 6, GuiLcd.INVERSE)  -- 反転
lcd:DrawBitmap(20, 5, { "01110", "10001", "10101", "10001", "01110" })
lcd:Display()                             -- ここで初めて画面に出る

SurfaceGui に貼る場合は利用側で SurfaceGui を作り、その子にする:

local sg = Instance.new("SurfaceGui")
sg.Face = Enum.NormalId.Front
sg.SizingMode = Enum.SurfaceGuiSizingMode.PixelsPerStud
sg.PixelsPerStud = 50
sg.LightInfluence = 0
sg.Parent = part
lcd.Parent = sg

API

生成

GuiLcd.new(config?) — config は全て省略可:

キー既定内容
cols32横ドット数
rows16縦ドット数
onColorfromRGB(80,220,255)点灯色
offColorfromRGB(20,40,48)消灯色
backgroundColorfromRGB(8,12,16)背景色
lockAspecttrueUIAspectRatioConstraint(cols/rows) を付けてドットを正方形に保つ

座標と色

  • 座標は (x, y)1 始まり、左上原点。x: 1〜Width、y: 1〜Height。小数は切り捨て
  • 色は GuiLcd.BLACK(消灯)/ GuiLcd.WHITE(点灯)/ GuiLcd.INVERSE(反転)。省略時は WHITE
  • 画面外への描画は黙って無視される(クリップ)
  • NaN / ±inf の座標は画面外として無視される

描画(バッファに書くだけ。Display() で反映)

メソッド内容
DrawPixel(x, y, color?)1 画素
GetPixel(x, y) -> boolean範囲外は false
DrawLine(x0, y0, x1, y1, color?)両端を含む直線
DrawFastHLine(x, y, w, color?) / DrawFastVLine(x, y, h, color?)水平 / 垂直線
DrawRect(x, y, w, h, color?) / FillRect(x, y, w, h, color?)矩形の枠 / 塗り
DrawBitmap(x, y, pattern, color?)0/1 文字列配列の "1" だけを描く("0" は触らない)
FillScreen(color?) / ClearDisplay()全面塗り / 全消去
ToPattern() -> {string}現在のバッファを 0/1 文字列配列で取得

転送・破棄

  • Display() — バッファと画面の差分だけを反映する
  • Destroy() — Frame を破棄。冪等。以後の描画は error

Frame として

上記以外のキーは全て実 Frame に透過する(Size, Position, Parent, Visible, MouseEnter, FindFirstChild, ...)。

例外: 他の Instance の Parent など「Instance そのもの」が要る場面では lcd.Instance を渡す。lcd は型上 Frame だが実体は table なので、label.Parent = lcd は実行時エラーになる。

読み取り

lcd.Width / lcd.Height / lcd.Instance(いずれも読み取り専用)

静的

  • GuiLcd.validatePattern(pattern) — 矩形の 0/1 文字列配列か検証する純関数
  • GuiLcd.Framebuffer — 描画ロジックのみのクラス(Roblox API 非依存)。GuiLcd.Framebuffer.new(w, h) で単体利用可

文字描画

5×7 ドットフォント(ASCII + 半角カタカナ)を内蔵。全角カタカナ・全角英数は自動で半角に正規化し、「ガ」は「ガ」の 2 セルで描く(JIS X 0201 の LED 表示と同じ)。ひらがな・漢字など未対応の文字は □ で描く。

lcd:SetCursor(1, 1)
lcd:Print("ヨウコソ\nGuiLcd")          -- 改行で次の行へ
lcd:DrawText(10, 9, "ABC", GuiLcd.INVERSE)
local w, h = lcd:GetTextBounds("ヨウコソ")  -- 描画サイズ(px)
lcd:Display()
メソッド内容
SetCursor(x, y) / GetCursor() -> x, yPrint の開始位置
SetTextColor(color)Print の色(既定 WHITE)
SetTextSize(scale)文字の拡大率(既定 1)。1 以上の整数。DrawText / Print / GetTextBounds に適用。DrawBitmap 等のビットマップ系には非適用
Print(text)カーソル位置に描き、カーソルを進める。\n で改行
DrawText(x, y, text, color?) -> nextX指定位置に描く。戻り値は次のセルの x
GetTextBounds(text) -> w, h描画サイズ(px)。スクロールの終端判定などに
SetFont(font)別フォントに差し替え(契約は src/Font5x7.luau 参照)

送りは 6 px(5 + 字間 1)、行送りは 8 px。GuiLcd.Font5x7 でフォントを直接参照できる。

半角カナの字形は HD44780U(A00 CGROM)の実機ビットパターンと同一。そのため実機同様に ウ/ワ(1 ドット差)・ク/タス/ヌ は酷似する。判読性を上げたい場合は SetTextSize(2) とドットのコントラスト確保が有効。

サンプル: 電光掲示板

dev.project.json を Rojo で同期すると、Workspace.DenkoSign の前面に 96×32 の赤 LED 看板が出る。SetTextSize(2) で 10×14 ドット相当の大きな文字を描いている。

rojo serve dev.project.json

Part の Attribute で文面と速度を変えられる: Title(上段固定文)/ Message(下段の流れる文)/ Speed(px/s)。実装は examples/DenkoKeijiban.client.luauSpeed が 0 以下(または数値でない)のときは停止扱いで、Title / Message の変更はその場で反映される。

サンプル: ロボットの顔

同じ dev.project.jsonWorkspace.RobotFaceHead(看板の上)に 32×16 の顔が出る。12 種の表情プリセット(examples/RobotFace/Expressions.luau。旧 RobotFaceLcd から移植)を Interval 秒ごとに巡回し、Part の Attribute Expression に名前(happy / sad_nomouth など)を入れるとその表情で固定する。表情の適用は ClearDisplay()DrawBitmap(1, 1, pattern)Display() の 3 行で、ビットマップ描画の最小例になっている。実装は examples/RobotFace/init.client.luau

どちらのサンプルも StreamingEnabled のプレイスでは Part のストリーミング待ちで Infinite yield possible の警告が出ることがあるが、Part が届き次第そのまま動く。

Adafruit_GFX との対応

GFXGuiLcd差異
drawPixel(x, y, c)DrawPixel(x, y, c?)1-indexed
drawLine / drawFastHLine / drawFastVLineDrawLine / DrawFastHLine / DrawFastVLine
drawRect / fillRectDrawRect / FillRectDrawRect は INVERSE で角を二重反転しない(本家 GFX は二重反転する)
drawBitmap(x, y, bitmap, w, h, c)DrawBitmap(x, y, pattern, c?)ビットマップは 0/1 文字列配列。w/h は pattern から
fillScreen / clearDisplayFillScreen / ClearDisplay
display()Display()
width() / height()Width / Heightフィールド
setCursor / print / getTextBoundsSetCursor / Print / GetTextBounds文字列は UTF-8。drawChar は DrawText に統合
setTextSize(s)SetTextSize(scale)1 以上の整数のみ(floor しない)
drawCircle(未実装)v2 以降

0.1.0 からの移行

0.1.00.2.0
GuiLcd.new(part, config)GuiLcd.new(config) + 利用側で SurfaceGui を作り lcd.Parent = sg
SetPixel(row, col, on)DrawPixel(col, row, on and WHITE or BLACK) + Display()
SetPattern(pattern)ClearDisplay() + DrawBitmap(1, 1, pattern) + Display()
Clear()ClearDisplay() + Display()
Rows / ColsHeight / Width
validatePattern(pattern, rows, cols)validatePattern(pattern)

テスト

rokit install
lune run tests/Font5x7.spec.luau
lune run tests/Expressions.spec.luau  # ロボットの顔サンプルの表情データ       # フォント構造 + 正規化
lune run tests/Framebuffer.spec.luau   # 描画ロジック
bash tests/typecheck/run.sh             # 利用側視点の型検査(luau-lsp)

Package Details

Install command (Click to copy)


Version

0.4.0

License

MIT

check_circle

Safe for commercial use

infoThe package archive does not include its license text; the license is declared in its manifest metadata.

Automated license review — not legal advice.