プロが教えるわが家の防犯対策術!

*質問*
現在、ActionScriptを基本的な勉強から初めているのですが、
どうしても分からないところがあり戸惑っております。
皆さんお助言をどうぞお願い致します。

x座標:0.0、y座標:536.5から減速をしながら平行に移動し、
x座標が650以上になったら、x座標:35、y座標:25に向かい、
後方斜め上に移動するという動きを、作っていたのですが、
なかなかうまくいきません。
Scriptは下記の通りに記載致しました。

============================

onLoad = function(){
maru1.Gox = 700;
maru1.Goy = 25;
flg = false;
}

maru1.onEnterFrame = function(){
this._x += (maru1.Gox - this._x)/10;
if(this._x >= 650){
maru1.Gox = 35;
flg = true;
}
if(flg = ture){
this._y += (maru1.Goy - this._y)/10;
}
}

============================

初歩的な質問で大変申し訳ございませんが、
助言をどうぞよろしくお願い致します。

“環境”Mac OS 10.4、Flash8

A 回答 (3件)

最小変更で行くと,


次のようになると思います。

-----------------------------
maru1.Gox = 700;
maru1.Goy = 25;
flg = false;
maru1.onEnterFrame = function() {
this._x += (maru1.Gox-this._x)/10;
if (this._x>=650) {
maru1.Gox = 35;
flg = true;
}
if (flg == true) {
this._y += (maru1.Goy-this._y)/10;
}
};
--------------------------

単に if(flg = ture) が致命傷なだけだと思います。
「=」 は代入演算子です。
flg が true であるかどうかを判定させるのですから,
「==」 の等価演算子を使う必要があります。
また,
「ture」が綴り間違いで,「true」ですね。

また,if( ){ } は,( ) 内が true であるか false であるかを判定し,
( )内が true であれば,続く中カッコ { } 内のステートメントを実行します。
したがって,
if (flg == true) { ~ } と書くのではなく,
if (flg) { ~ } と書くのが一般的です。

if (flg == true) と書くと,
「もし flg の値が true であるという条件が true であると…」
という回りくどい判定文となります。
ちなみに,
if (flg == false) { ~ } を書きたい場合は,
if (!flg) { ~ } となります。
「!」 は論理否定 (NOT) 演算子 です。


あと最初の,onLoad = function() という無意味なものを取りました。
    • good
    • 0
この回答へのお礼

>>sassakunさん
早速のご回答誠にありがとうございます。
本当に分かりやすいご説明で、trueとfalseの部分の、疑問も解けました!!
早速、ご指定いただいた、箇所を修正致しましたところ、問題は改善されました。

もしよろしければもう一点、質問をさせていたいてもよろしいでしょうか。
onLoad = function()の部分についてなのですが、今回のような場合であれば、
maru1.Gox = 700;
maru1.Goy = 25;
flg = false;
などを定義する場合、onLoad = function()が必要だと間違った解釈をしていたのですが、
実際にonLoad = function()を使用するのはどういったときなのでしょうか?

文章がお粗末な上に、曖昧な質問で申し訳ありまん。
助言を頂ければ幸いです。
どうぞよろしくお願い致します。

お礼日時:2007/06/24 10:34

#1&2です。



onLoad = function について気になったので少し調べてみました。
調べても今ひとつわからないというのが正直なところですが。

しかし,フレームに,
ムービークリップ.onLoad = function(){ }
を定義するのはやはり通常間違いであるようですよ。
私は,このご質問を見るまで見たことがなかったです。
当然,使ったこともありませんでした。

フレームに書くのではなく,
ActionScript 2.0クラス定義ファイル になら書く場合があるとからしいです。


MovieClip.onLoadイベントハンドラメソッド
http://www.fumiononaka.com/TechNotes/Flash/FN050 …
 ~引用~
> MovieClipインスタンスを配置したタイムラインに、
> このイベントハンドラメソッドを定義して動作する場合は、
> かなり限定されます。
> 実際上は、タイムラインに定義することはまれで、
> またその定義も適切とはいえない場合が少なくないでしょう。
 ---中略---
> メインタイムラインの第1フレームで_level0(_root)に設定した
> MovieClip.onLoadイベントハンドラメソッドは、呼出されるようです。
> しかし、ブラウザで確認すると、
> MozillaベースのブラウザやSafariでは呼出されないという
> 報告がされています(Flash Player 7)。


その他,
検索してみると,ほんの少しだけのページがヒットしますね。
また,ほんの少しのページのほとんどが,「いつ使う?」とか「使えない!」とかいう論議や論理の場所ばかりのように思えます。

Google検索「MovieClip.onLoad」
http://www.google.co.jp/search?hl=ja&q=MovieClip …


まあ,めったにない場合に使用することがあるらしいです。
そのめったにない場合には私は遭遇したことがありません。
というか,
そのめったにない場合というのも,あえてそういう状況を作り出して実験したり論議のネタにしているとしか思えないページばかりが見つかりますね。

通常は使わないのが普通だと思います。
    • good
    • 0
この回答へのお礼

お礼が遅くなってすみません。
本当に詳しい助言をありがとうございます。
今回、頂いたアドバイス、資料をもとに、
再度、作成に取り組んだところ、以前よりもスムーズかつ着実に作成することができております。
これからもさらに勉強を重ね頑張っていきたいと思います!!

また、様々な疑問にぶつかることがあるとは思いますが、
是非助言を頂ければ幸いです。

本当にありがとうございました。

お礼日時:2007/06/30 09:40

#1です。



> 実際にonLoad = function()を使用するのは
> どういったときなのでしょうか?

どういうときも使わないでしょう。
ご質問で書かれていらっしゃる onLoad = function() は,
ターゲットパスを略した形ですが,省略さずに書くと this が入ります。
(つまり勝手にthisが補完されて動作します。)

----------------------------
this.onLoad = function () {
maru1.Gox = 700;
maru1.Goy = 25;
flg = false;
};
----------------------------

この this は,
そのスクリプトを書いたタイムラインの階層を示します。
_root に書いたスクリプトでしたら _root.onLoad という意味になります。
意味不明でしょう。
_root がロードされたとき { } 内を実行。
意味がわかりません。
ですから,普通は使わないと思います。


おそらく,
元々は,フレームに書いたスクリプトではなく,ムービークリップに書いたスクリプトで,
そのムービークリップに書いたスクリプトをフレームに並行移植させたからそんな変な書き方になったのではないでしょうか?

この場合の onLoad や onEnterFrame は,
元々はムービークリップの onClipEventイベントハンドラ が,
Flash MX以降,フレームにも使えるようになったというもの(イベントハンドラメソッド)です。
ですから,MX以降 すごく柔軟にプログラミングできるようになったのです。

ムービークリップのイベントハンドラ
http://homepage3.nifty.com/ginga-b/MX/mc_eventha …
> イベントハンドラメソッド
> イベントハンドラメソッドは、FlashMXで導入された、
> これからの主役となるイベントハンドラです。
> フレームアクションにも記述できるため、
> シンボル共通のハンドラを記述することができます。



フレームに書いたスクリプトを消して,
ムービークリップ maru1 を選択して,
maru1 自体に次のように書くのなら意味がわかります。

-----------------------------
onClipEvent (load) {
Gox = 700;
Goy = 25;
flg = false;
}
onClipEvent (enterFrame) {
this._x += (Gox-this._x)/10;
if (this._x>=650) {
Gox = 35;
flg = true;
}
if (flg == true) {
this._y += (Goy-this._y)/10;
}
}
-----------------------------

同じように動作しますよ↑。


// このムービークリップが表示されたとき
onClipEvent (load) {
// 変数 Gox と Goy を設定
Gox = 700;
Goy = 25;
// フラグを false にしておく
flg = false;
}

そして,この後に,
onClipEvent (enterFrame) { ~ }
で1フレーム進む時間ごとに毎回 { ~ } が実行される。

これだと,変でも何でもありませんし,意味もわかります。


これを,
そのまま上の階層のフレームに移植しようとすれば,

 onClipEvent (load) { ~ }
   ↓変更↓
 onLoad = function () { ~ }

 onClipEvent (enterFrame) { ~ }
   ↓変更↓
 maru1.onEnterFrame = function(){ ~ }

に変更してしまいたくなる気持ちもわからなくもありません。

onLoad = function () { ~ }
は一応使えますが,一応使えるだけで,意味はないと(私は)思います。
 
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!