前回は弾の基本的な性能を弄る事が出来ましたので、今回はより踏み込んだ部分を弄りたいと思います。
しかし、より踏み込んだ部分を弄るということは、当たり前ですがより踏み込んだ知識が必要になってきます。今までは出来るだけプログラミングの知識がなくても弄れる部分を中心に解説してきましたが、中級編からは何とか頑張ってみてください。
※注意※
これ以降の説明は、プログラミングの知識がある人にはツッコミどころ満載かもしれませんが、その辺りはご了承ください。
~変数とは その1~
変数というのは、wikipediaとかプログラミング入門サイトとかで調べると細かい説明があるとは思いますが、まあザックリ簡単に言えば「数値を代入したり、代入した数値を参照したり出来るもの」と思ってください(数値以外も入りますが、キャラ製作で数値以外を入れる事はほぼ無いです。)
多分実際に見た方が早いですね。例えば
a = 2
b = 5
これで変数aには2が、変数bには5が入りました。
※このイコール(=)は数学での使い方とは違い、左辺(変数aや変数b)に右辺(2や5)を代入する(入れる)という意味です。
さらに
c = a + b
とすると、変数cには変数a+変数b、つまり2+5で7が代入されます。
このように、変数に数値を代入したり、代入されている数値を使って(参照して)計算したりすることが可能です。
よく使う演算子(+とか-とかのこと)
加算 |
+ |
減算 |
- |
乗算 |
* |
除算 |
/ |
剰余 |
% |
累乗 |
^ |
a = 6
b = 2 とすると
a+b => 8
a-b => 4
a*b => 12
a/b => 3
a%b => 0
a^b => 36
~変数とは その2~
その1では変数の代入、参照を説明しました。次に、変数を扱う上で便利な「自己代入」の説明をします。例えば
a = 2
として、変数aに2を代入したとします。では、今2が代入されている変数aに、1を加算したい場合はどうすればいいでしょうか。
a = a + 1
こうです。見慣れない書き方で何じゃこりゃ!?と思ったかもしれませんが、その1の※部分を見返してみてください。
このイコールは、左辺に右辺を代入する、という意味です。つまり、左辺(変数a)に右辺(a+1、つまり2+1)を代入しているわけですね。
このように、変数を用いた計算を、自身へ代入する事を「自己代入」と言います。こんな表記慣れないなーと思っている方、そのうち慣れます。
※他のプログラミング言語を触った事がある方へ。
luaにはa += 1みたいな自己代入演算子は無いみたいです。
~関数とは その1~
来ました、関数。一番聞かれるのに一番説明に困るやつです。
関数とは、ある値を渡すと、渡された数値を使って自動で処理を行い、その結果を返してくれるものだと思ってください。色々説明してもアレなので、とにかく関数の定義(関数を作る、という意味)と、関数の呼び出しを書きます。
以下の関数は「二つの数値を渡すと、それらを足し合わせた数値を返してくれる関数」です。
~関数の定義~
function sum (x,y)
z = x + y
return z
end,
~関数の呼び出し~
a = sum(1,2)
これで変数aに3が代入されます。
帰らないで下さい、少しだけ説明させてください。
- sum(1,2)とすることで、sum関数に「1と2」を渡す
- sum関数の「xとy」に、渡された「1と2」が入る
- sum関数の中でx+yを計算して、変数zに代入する
- return zで計算結果を返す
- a = sum(1,2)とすることで、関数が返した計算結果を変数aに代入する
何となく流れは掴めたでしょうか?
ちなみに、関数の定義のしかたには2種類ありまして、
定義のしかた1
function 関数名 (引数1,引数2,~)
処理内容
end,
定義のしかた2
関数名 = function(引数1,引数2,~)
処理内容
end,
こんな感じです。
実は東方流星群のluaだと後者が使われていることが殆どです。
じゃあ最初から後者を教えてくれよ!ってなりますよね。
私もそう思います(書いてる途中で気が付いた)。
~関数とは その2~
さて、関数について少し理解は深まりましたでしょうか?
では次は実際にluaを見て、どんな関数があるのか見てみましょう。では100_marisa.luaを開いてください。
さて、blt1を……と言いたいのですが、3連弾はやや難しいパターンなので、単純な単発弾を見ましょう。blt2の部分までスクロールしてください。
local blt2 = {
id = CharaID,
hit_range = 8,
add_vec_x = 0,
add_vec_y = 20,
bomb_range= 32,
atk = 280,
delay = 130,
~以下略~
はい。数値を見ると分かるかもしれませんが、blt2は魔理沙の弾2(星型の単発威力弾)です。
では、blt2からスクロールするとShotという関数があるので、探してみてください。引数は長いので一部省略しています。
Shot = function(引数略)
C_CreateBullet(引数略)
C_PlaySoundSE(self.se[1],0,0)
return true
end,
さて、復習のお時間です。この部分の流れを考えてみましょう。
- ここには書いてありませんが、どこかでShotを呼び出して、Shot関数に引数を渡す
- Shot関数の引数に、渡された引数が入る
- Shot関数の中で、「C_CreateBullet」、「C_PlaySoundSE」などを処理する
- return trueでtrueを返す
イメージとしてはこんな感じでしょうか。一つずつ説明していきましょう。
まず、その1でやった「sum関数」を思い出しましょう。
sum関数は「渡された2つの引数を足し合わせて、それを返す関数」でした。ではShot関数はそもそも何のためにあるのでしょうか。
Shot関数は、「弾を発射する時に呼び出される関数」です。つまり、スペースキーを押してパワーゲージを止めて、キャラクターが発射ポーズを取った後に呼び出されます。
ここで再びsum関数を思い出します。sum関数は「渡された2つの引数を足し合わせる」為にある関数でした。つまり、sum関数は「足し合わせる2つの数値」が引数として渡されます。
では、「弾を発射する為」にあるShot関数には、どんな引数が渡されているのでしょうか。
- 弾の発射位置
- 弾の発射速度
- 弾の発射角度
- 誰が発射する弾か
などです。引数一覧が長いので省略しましたが、あの中には弾を発射する時に必要そうな引数が渡されています。
次に、Shot関数の中にある、「C_CreateBullet」、「C_PlaySoundSE」などを説明します。
C_CreateBullet、字面で分かるかもしれません。BulletをCreate!するんです。そう、「弾を作成する」APIです。
C_PlaySoundSEは覚えていますでしょうか。実は
初級編の最後に少し出てきました。「効果音を鳴らす」APIです。
ほらきた、APIなんていう単語さらっと出しました。ここに来てまた分かりにくい単語出てきてほしくないですよね。
でも、要するにこれ「C_CreateBullet」、「C_PlaySoundSE」という関数を呼び出してるだけなんです。
関数には、ユーザーが気軽に呼び出していい関数と、ユーザーに気軽に呼び出してほしくない関数があります。
その中で、気軽に呼び出していい関数をまとめたものを「API」だと私は認識していますと言います。
※プログラミング経験者の方、本当に申し訳ありません。
つまり、「弾を作成する」関数や、「効果音を鳴らす」関数なんかは、好きに呼び出していい関数なんです。そういった関数を「API」と呼んで一つにまとめてあるわけですね。
では話を戻しましょう。
Shot = function(引数略)
C_CreateBullet(引数略)
C_PlaySoundSE(self.se[1],0,0)
return true
end,
Shot関数の中には「弾を作成する」APIと「効果音を鳴らす」APIが入っています。つまり、弾を撃って音が鳴るわけですね。では最後の「return true」とは何でしょうか。
return ○○は「○○を返す」という意味でしたね。呼び出し元にtrueを返しているわけです。
いやだからtrueって何?ってなりますよね。「true」と「false」、聞いた事ありますか?
「true」は真、「false」は偽。凄ーーーーーーく簡単に言えばOKかNGかです。
実はShotという関数は、trueを返さない限り何度も何度も呼び出されます。試しに「return true」の部分を「return false」と書き換えて弾2を撃ってみてください。
ぐあああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああ!!!!!!
というわけで、Shot関数はtrueを返さないと呼び出され続ける事が分かったかと思います。return trueに戻しておきましょう。
中級編はここまでとします。まだまだ説明が出来ていない部分もありますが、1ページに詰め込んでも読むのが大変なので次回は
中級編その2とします。ここまでお付き合いいただきありがとうございました。
最終更新:2020年03月23日 16:50