トップ 差分 一覧 Farm ソース 検索 ヘルプ PDF RSS ログイン

チュートリアル 10: DSLua 0.6チュートリアル

DSLuaの新バージョンがリリースされるたびに、私はこうやって新しい機能についての説明をしています。
しかし、まだマイクとWi-Fiの説明はしていません。これらの解説はまた後でするつもりです。

DSLua 0.6の起動

DSLua 0.6のCF版は、「緑(cf-green)」「青(cf-blue)」「グレー(cf-gray)」の3つのバージョンがあります。
以下にデバイスごとの対応表を作りました。

デバイス バージョン
GBAMP どれでもOK
MK2/3 グレー
NinjaDS グレー
M3 CF/SD
M3 miniSD
M3SD スリム
SC CF/SD/miniSD
SD Lite
Max Media CF 未対応
EZ4 グレー

Dualis

DualisはDSLuaを起動できないように思えますが、DSLuaのフォーラムでこれを動作させる方法を発見しました。
DSLuaのROMファイルを起動する前に、CPUタブの「Enable IRQ」のチェックを外すだけです。
2つ「Enable IRQ」がありますので、右の方のチェックを外してください。

ファイルが存在しません。

自動スタート

自動スタート機能とは、DSLuaの場バイナリをいじって、起動直後にLuaスクリプトを実行させる機能です。
スクリプトを選択するためにメニューをさまよう必要がなくなります。
GBFS版では、通常のHomebrewのように動くので大変便利です。
CF版なら、「/cf/dslua/ここにプログラムを置く」で自動スタートします。

自動スタートを有効にするには、各バージョンのDSLuaのフォルダにあるautostart.batを実行するだけです。
(CF緑のautostart.batをCF青で使用してはいけません。元からフォルダにあるものを使いましょう)

ただ、実行する前にautostart.batを右クリックし、「編集」をクリックして、2行目に修正を加えましょう。
GBFS版なら「/gbfs/」とし、CF版なら「/cf/dslua/ゲーム名/」とします。
これでDSLua起動時に指定したフォルダの「main.lua」を実行します。

スタイラス機能

2つの新しいスタイラス機能が追加されました。
一つ目はStylus.NewPressで、スタイラスが丁度タッチし始めたときにtrue値を返します。(最終VBlankか、1/60秒で)

もう一つはStylus.Releasedで、一つ目と似ています。
これはタッチスクリーンからスタイラスが離れた際にtrue値を返します。
これらの2つの機能はメニューや選択してタッチするような時にとっても使えます。
チュートリアル 8で書きましたから問題ないですよね。

システム機能

5つの新しい機能が追加されました。
DSLua.SetScreenLight()は片方の画面をオン/オフできます。

一つ目の変数がどちらの画面を操作するか(1か0)で、次の変数がオンにするかオフにするかです。1でオンで2でオフです。
DSLua.SetLedBlink()は電源のLEDを点滅させます。一つ目の変数が1なら点滅を開始し、0なら点滅を止めます。

2つ目の変数が0ならゆっくり点滅し、1なら早く点滅します。
DSLua.SwitchScreens()は上下の画面を入れ替えます。下画面に出力されるものは上画面に出力され、その逆もまた然りです。
DSLua.LidClosed()はDS本体が閉じられたらtrue値を返し、開くとfalse値を返します。

そして、DSLua.SetDSLBrightness()はDSLiteの画面の明るさを背呈します。
1つ変数があり、これで明るさを設定します。0が一番暗くて、3が一番明るいです。1と2はその中間です。

さて、ここに以上5つの機能を全て使用した「Flashlight DS」というソフトのコードを書きます。
画面をタッチすると上下の画面を入れ替え、L/Rで明るさを変えます(DSLiteなら)。
そしてDSを閉じるとLEDが点滅します。

 -- まず両画面に8bit背景をセットします。DSの画面を白くし、テキストを書くためです。
 SCREEN_TOP = 1
 SCREEN_BOTTOM = 0
 BGTop8Bit = Screen.Load8BitBG()
 BGBot8Bit = Screen.Load8BitBG()
 BGBotText = Screen.LoadTextBG()
 Screen.Initialize( SCREEN_TOP, BGTop8Bit )
 Screen.Initialize( SCREEN_BOTTOM, BGBotText, BGBot8Bit )
 BGTop8Bit:SetPaletteColor( 0, 31, 31, 31 )
 BGBot8Bit:SetPaletteColor( 0, 31, 31, 31 )
 BGBotText:SetColor( 9 )
 BGBotText:PrintXY( 10, 11, "Example #1" )
 
 -- この3つの変数でオン/オフを決めます。
 SWITCH_ON = 1
 SWITCH_OFF = 0
 SPEED_SLOW = 0
 
 -- デフォルトは一番明るい設定です。
 screen_brightness = 3
 DSLua.SetDSLBrightness( screen_brightness )
 
 screens_switched = false
 while Pads.Start() == false do
           -- ふたが閉まってるかどうか
           if DSLua.LidClosed() then
                     DSLua.SetLedBlink( SWITCH_ON, SPEED_SLOW )
                     DSLua.SetScreenLight( SCREEN_TOP, SWITCH_OFF )
                     DSLua.SetScreenLight( SCREEN_BOTTOM, SWITCH_OFF )
                     -- 今度はふたが開くまで待つ
                     while DSLua.LidClosed() do
                               Screen.WaitForVBL()
                     end
                     DSLua.SetLedBlink( SWITCH_OFF, SPEED_SLOW )
                     DSLua.SetScreenLight( SCREEN_TOP, SWITCH_ON )
                     DSLua.SetScreenLight( SCREEN_BOTTOM, SWITCH_ON )
           end
 
           if Pads.L() then
                     screen_brightness = screen_brightness - 1
                     if screen_brightness == -1 then screen_brightness = 0 end
                     DSLua.SetDSLBrightness( screen_brightness )
                     -- ボタンを押している間に早く切り替わり過ぎないように、待ってもらいます。
                     while Pads.L() do
                               Screen.WaitForVBL()
                     end
           end
 
           if Pads.R() then
                     screen_brightness = screen_brightness + 1
                     if screen_brightness == 4 then screen_brightness = 3 end
                     DSLua.SetDSLBrightness( screen_brightness )
                     while Pads.R() do
                               Screen.WaitForVBL()
                     end
           end
 
           if Stylus.Down() then
                     if screens_switched then
                               screens_switched = false
                     else
                               screens_switched = true
                     end
                     DSLua.SwitchScreens()
                     while Stylus.Released() == false do end
           end
 end
 
 -- プログラムを終了する前に、画面が入れ替わったままになっていないかを調べます。
 -- でないと次のプログラムで画面が反対になってしまいます。
 if screens_switched then
           DSLua.SwitchScreens()
 end 

タイルとピクセルの取得

最後の2つの新機能は、8BitBackground:GetPixel()TileBackground:GetTile()です。
xyの座標変数を使用します。その座標にどのピクセルかタイルがあるかを返します。