LOCKYOUで学ぶ

行き当たりばったりゲーム制作

戻る

前回までの粗筋
大安達は着々とプログラムを組み立てていった
しかしそこに大きな壁が立ちはだかった
なんと、作成したプログラムが動かないのだ!
どうなる!?大安達!
というわけで、折角の作ったプログラムが動かないっていうところで終わったんだけど
右に動かす処理がなんか間違ってんのか
違う、そうじゃない
「フレーム」の問題だよ
フレーム……?
枠だよな?どういう意味だ?
フレームっていうのは、prafla・フラッシュ関係なくゲーム全体に言える共通な概念なんだけど、
紙芝居でいう1枚1枚の紙の「単位」
ゲーム内の時間単位だね
画面の書き換えとか、入力の受け取りとかをフレームごとにやってるんだけど……ふわふわした説明でごめんね。
講座第1回でプロパティを設定したときに
「FPS」 Frames Per Secondの略
ゲームジャンルの一つである方のFPSはFirst-Person Shooter
間違えないように注意
ってあったでしょ?
あれは「1秒間に表示するフレーム」の数のこと
60FPSなら1秒間に60フレーム、0.017秒に1フレームだね
つまり、Flashさんサイドは0.017秒ごとに画面書き換えとか、入力の受け取りとかを行ってることになる
下の図みたいに
基本的 (特定の条件で)フレームに関係なく強制的に描画を更新する関数もあります
にフレームごとのタイミングでボタン入力を受け取ってるよ
で、0.017秒ごとの受け取りを行ってるって言うが 前回のこれがそのコードじゃないのか?
var henji = Key.isDown(39);
if (henji) {
  taiann._x = 100;
}
それはそうなんだけど、そのプログラムは1フレーム目にしか書かれてないんだよね
つまり1フレーム目でしか入力を受け取れないっていうことか
正解<エサクタ> 正確には、入力は受け取るけどそれに応じた処理がなされない
「右入力がされた?あっそ」みたいな感じ

1フレーム目にしかスクリプトが書かれてないから、逆に
永遠 僕が言いたいのは「永遠」
と書いていけば入力を受け取れるよ
こんなんやってられっか
こんなこともあろうかと!
ActionScriptにはこんなものが用意されてるよ
これを使えば上のようにスクリプトを
永遠 僕が言(ry
と書かなくても毎フレーム処理してくれるよ
this.onEnterFrame = function(){
  処理の内容
};
これは……なんだ?
=ってことはonEnterFlameに代入してるってことだろうけど
function(){ }はどういうことだ
thisもよく分からんし
そこらへんはちょっとね~
説明するのがめんどくさいんだよね~
ざっくりいうとthisはこのコードが書き込まれているスプライトのこと
functionって関数のことなんだけど、
「呼び出したらなんか動いてくれる人」を自分で作って、onEnterFlameという特殊な変数に放り込んでるって言う解釈
詳しいことはまたいつかね
難しいことは置いといて、
今は処理の内容のところに例の右を押したら右に動く処理を放り込んでおけばいいよ
こんな感じ
あ、これはtest.asのところに上書きしちゃってね
this.onEnterFrame = function(){
  var henji = Key.isDown(39);
  if (henji) {
    taiann._x = 100;
  }
};
そしてもう一度プレビューを押すと……?
右を押せば移動します
お、右を押せば移動するな
こいつ、動くぞ!
動かないっていう人は、スペルとかチェックしてね
右に動いたはいいが、
押したら右に移動し続けるようにしたい場合はどうすればいいんだ?
そんなときは += を使うといいよ
= は 100にするっていう意味だけど
+= は100を足すって言う意味になるよ
つまりこうすればいいんだな?
100足し続けるのは移動量が多すぎるから2ぐらいとして
this.onEnterFrame = function(){
  var henji = Key.isDown(39);
  if (henji) {
    taiann._x += 2;
  }
};
右を押せばゆっくり移動します
ああ、しっかりと動かせ
左側もいいぞ!
※キーボードの「←」は37
this.onEnterFrame = function(){
  var henji1 = Key.isDown(39);
  var henji2 = Key.isDown(37);
  if (henji1) {
    taiann._x += 2;
  }
  if (henji2) {
    taiann._x -= 2;
  }
};
→の返事と、←の返事の2つを受け取らなければならないため、変数を2つ用意します
左右に移動します
これ、画面の外にはみ出しても大丈夫なのか?
安心しろ!計算上バグることはない!
そのネタはやめろや
というわけで、とりあえずキャラを動かすという目的は達成されたね
次は……よりもっとプログラムっぽくなるね
次回をお楽しみに~
小休止
あ、そうそう(黒バラ風に)
今のうちに話しとかなきゃいけないことが
前回も聞いたな……今回はなんだ?
今回出てきた「onEnterFrame」
これはフレームごとに実行する関数を登録するんだけど……
スプライトに直接書き込む「onClipEvent(onEnterFrame)」って言う方法もある
onClipEvent(onEnterFrame){;
  (毎フレームごとの処理)
}
スプライトに記述するものなので、test.asに書いてもエラーが出ます
こっちでも動くのか
ただ、こっちの方は行き当たりばったりゲーム作成ではしばらく使わない予定だよ
なるべくスクリプトを書く場所は一箇所にまとめたいからね
まあ、こっちに書いたほうがいいってときは普通に書くけど……
あとついでに話しておくとonEnterFrameはFlash(actionscript)特有のものだね
ほかの言語とかは別の方法でフレーム単位の処理をしてるよ
興味があったら調べてみてね
というわけで今回はここまで、またね~