
前回までの粗筋
大安達は着々とプログラムを組み立てていった
しかしそこに大きな壁が立ちはだかった
なんと、作成したプログラムが動かないのだ!
どうなる!?大安達!
大安達は着々とプログラムを組み立てていった
しかしそこに大きな壁が立ちはだかった
なんと、作成したプログラムが動かないのだ!
どうなる!?大安達!

というわけで、折角の作ったプログラムが動かないっていうところで終わったんだけど

右に動かす処理がなんか間違ってんのか

違う、そうじゃない
「フレーム」の問題だよ
「フレーム」の問題だよ

フレーム……?
枠だよな?どういう意味だ?
枠だよな?どういう意味だ?

フレームっていうのは、prafla・フラッシュ関係なくゲーム全体に言える共通な概念なんだけど、
紙芝居でいう1枚1枚の紙の「単位」
ゲーム内の時間単位だね
画面の書き換えとか、入力の受け取りとかをフレームごとにやってるんだけど……ふわふわした説明でごめんね。
紙芝居でいう1枚1枚の紙の「単位」
ゲーム内の時間単位だね
画面の書き換えとか、入力の受け取りとかをフレームごとにやってるんだけど……ふわふわした説明でごめんね。

講座第1回でプロパティを設定したときに
あれは「1秒間に表示するフレーム」の数のこと
60FPSなら1秒間に60フレーム、0.017秒に1フレームだね
「FPS」
Frames Per Secondの略
ゲームジャンルの一つである方のFPSはFirst-Person Shooter
間違えないように注意
ってあったでしょ?
ゲームジャンルの一つである方の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にはこんなものが用意されてるよ
これを使えば上のようにスクリプトを
ActionScriptにはこんなものが用意されてるよ
これを使えば上のようにスクリプトを
永遠
僕が言(ry
と書かなくても毎フレーム処理してくれるよ

this.onEnterFrame = function(){
処理の内容
};

これは……なんだ?
=ってことはonEnterFlameに代入してるってことだろうけど
function(){ }はどういうことだ
thisもよく分からんし
=ってことはonEnterFlameに代入してるってことだろうけど
function(){ }はどういうことだ
thisもよく分からんし

そこらへんはちょっとね~
説明するのがめんどくさいんだよね~
ざっくりいうとthisはこのコードが書き込まれているスプライトのこと
functionって関数のことなんだけど、
「呼び出したらなんか動いてくれる人」を自分で作って、onEnterFlameという特殊な変数に放り込んでるって言う解釈
詳しいことはまたいつかね
説明するのがめんどくさいんだよね~
ざっくりいうとthisはこのコードが書き込まれているスプライトのこと
functionって関数のことなんだけど、
「呼び出したらなんか動いてくれる人」を自分で作って、onEnterFlameという特殊な変数に放り込んでるって言う解釈
詳しいことはまたいつかね

難しいことは置いといて、
今は処理の内容のところに例の右を押したら右に動く処理を放り込んでおけばいいよ
こんな感じ
あ、これはtest.asのところに上書きしちゃってね
今は処理の内容のところに例の右を押したら右に動く処理を放り込んでおけばいいよ
こんな感じ
あ、これはtest.asのところに上書きしちゃってね
this.onEnterFrame = function(){
var henji = Key.isDown(39);
if (henji) {
taiann._x = 100;
}
};

そしてもう一度プレビューを押すと……?

お、右を押せば移動するな

こいつ、動くぞ!
動かないっていう人は、スペルとかチェックしてね
動かないっていう人は、スペルとかチェックしてね

右に動いたはいいが、
押したら右に移動し続けるようにしたい場合はどうすればいいんだ?
押したら右に移動し続けるようにしたい場合はどうすればいいんだ?

そんなときは += を使うといいよ
= は 100にするっていう意味だけど
+= は100を足すって言う意味になるよ
= は 100にするっていう意味だけど
+= は100を足すって言う意味になるよ

つまりこうすればいいんだな?
100足し続けるのは移動量が多すぎるから2ぐらいとして
100足し続けるのは移動量が多すぎるから2ぐらいとして
this.onEnterFrame = function(){
var henji = Key.isDown(39);
if (henji) {
taiann._x += 2;
}
};

ああ、しっかりと動かせ

左側もいいぞ!
※キーボードの「←」は37
※キーボードの「←」は37
this.onEnterFrame = function(){
var henji1 = Key.isDown(39);
var henji2 = Key.isDown(37);
if (henji1) {
taiann._x += 2;
}
if (henji2) {
taiann._x -= 2;
}
};

これ、画面の外にはみ出しても大丈夫なのか?

安心しろ!計算上バグることはない!

そのネタはやめろや

というわけで、とりあえずキャラを動かすという目的は達成されたね
次は……よりもっとプログラムっぽくなるね
次回をお楽しみに~
次は……よりもっとプログラムっぽくなるね
次回をお楽しみに~

あ、そうそう(黒バラ風に)
今のうちに話しとかなきゃいけないことが
今のうちに話しとかなきゃいけないことが

前回も聞いたな……今回はなんだ?

今回出てきた「onEnterFrame」
これはフレームごとに実行する関数を登録するんだけど……
これはフレームごとに実行する関数を登録するんだけど……

スプライトに直接書き込む「onClipEvent(onEnterFrame)」って言う方法もある
onClipEvent(onEnterFrame){;
(毎フレームごとの処理)
}

こっちでも動くのか

ただ、こっちの方は行き当たりばったりゲーム作成ではしばらく使わない予定だよ
なるべくスクリプトを書く場所は一箇所にまとめたいからね
まあ、こっちに書いたほうがいいってときは普通に書くけど……
なるべくスクリプトを書く場所は一箇所にまとめたいからね
まあ、こっちに書いたほうがいいってときは普通に書くけど……

あとついでに話しておくとonEnterFrameはFlash(actionscript)特有のものだね
ほかの言語とかは別の方法でフレーム単位の処理をしてるよ
興味があったら調べてみてね
というわけで今回はここまで、またね~
ほかの言語とかは別の方法でフレーム単位の処理をしてるよ
興味があったら調べてみてね
というわけで今回はここまで、またね~