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

チュートリアル 6: ファンクション(Functions)

チュートリアル 1から機能(ファンクション)を使ってきています。
ファンクションはプログラムを通じて1行の記述で「呼び出す」ことができるコードの塊です。
頻繁に使用するコードを一つのファンクションとしておけばとても便利です。
ファンクションを作成する際は以下のようにします。

 function waitForStylus()
           while Stylus.Down() == false do
                     -- 何もしない。ただ待つのみ。
           end
 end 

これはとてもシンプルなファンクションです。
これはプログラムを一時停止し、スタイラスのタッチがあるまで待機するファンクションです。
ただし、上のコードをプログラムに突っ込んで起動しても、動いていないように思えるでしょう。
なぜなら、あなたはただファンクションを作っただけで、使えていないからです。使用するには以下のようにします。

 waitForStylus()

これだけです。
上で書いたファンクションを一度プログラムに書いておけば、あとはこの一行を書くだけでプログラムはスタイラスのタッチがあるまで待機します。
waitForStylus()を書けば、waitForStylus()ファンクションの中に記述したコードを実行します。
文字列の後に括弧があれば、それがファンクションだとDSluaに伝えることができます。

しかし、括弧はそれがファンクションであることを示すだけではありません。
特定のファンクションでは、引数(arguments)と呼ばれる変数を持たせることができます。

これもはじめのチュートリアルから既に使用していますね。
PrintXY( 4, 6, "Hello" )には3つの引数があります。
X座標の値と、Y座標の値と、その位置に表示させる文字"Hello"です。
引数を利用したファンクションの作成方法は以下の通りです。

 function square( a_number )
           BGTopText:PrintXY( 1, 1, a_number * a_number )
 end
 
 blah = 7
 square( blah ) -- This will output 49
 DSLua.WaitForAnyKey()
 square( 4 ) -- This will output 16
 DSLua.WaitForAnyKey()
 square( 7 + 1 ) -- This will output 64
 DSLua.WaitForAnyKey() 

まず、square()というファンクションを作成しました。
これは数字を取得して、その数を二乗して出力します。
このファンクションを3回、全て異なる方法で呼び出しました。

引数を利用してファンクションを呼び出した時、DSLuaはその引数の値を記憶し、それをファンクションの引数に保存してファンクションへ渡します。
引数とはここでは「a_number」にあたります。

しかし、これはあまり良いファンクションではありません。
他の言語でファンションを使用したことのある方ならなぜだか分かるでしょう。
このファンクションは引数の中の数字を2乗します。

もしプログラマが出力したくない場合は?数字の2乗を式やその他でしたい場合は?他の色で出力したい場合は?
We aren't giving him very much control of what happens to the square of the number here.

One way would be to put inside the function, squarednumber = a_number * a_number, since variables are global by default.
(Global means that variables that are made inside functions can be used in the rest of the program, and that variables used in the rest of the program can be used inside functions.) But the best way to do this with functions is to return the squared number. return will cause the function to act like a variable when it's called. You can see that here:

 function square( a_number )
           return a_number * a_number
 end
 
 x = 100
 
 square_of_8 = square( 8 )
 square_of_x = square( x )
 BGTopText:PrintXY( 1, 1, square_of_8 )
 BGTopText:PrintXY( 1, 2, square_of_x )
 BGTopText:PrintXY( 1, 3, square( square_of_x ) )
 BGTopText:PrintXY( 1, 4, square( square( square( square( 2 ) ) ) ) )

Sorry for confusing you on that last one. It's calling itself over and overagain, getting the square of 2, then the square of the square of 2, then the square of the square of the square of the 2........

Anyway, the last thing about functions in this tutorial is local variables. Local is the opposite of of global. When local variables are created inside a function, they are erased when the function ends. This will help prevent errors. For example, you could be using the variables x and y for the position of your character in your game, but also use it in a function that assigns x and y values. This could happen, if you forgot about the x and y variables in the rest of your program. The solution is to use local variables. This is very easy to do. Just add the word local before you assign your variable. For example, local x = 6.

The last thing I have to say about functions is that you should use them a lot. Even if you just use a block of code once, sometimes your program can be easier to read and make changes to when you have functions. But this is especially true with functions that are used everywhere in a program. What if you had to make a change to each block of code that was the same? With functions you just have to change the function.