誕生日にもらった意外なもの

何度も何度も本当にスミマセン。

やりたいこと:
ゲーム内でアイテムをGETすると画面横に用意してある
アイテムボックスにアイテムが表示されボタン化される。
アイテムを入手するまでは非表示で、マウスを
近づけてもカーソルは変化しない。

ご指導受けた内容:
「visible」という命令にてボタンを有効・無効化する手引きを受けました。
他ページで参考文献としてステージから大きく移動させ
一見無いようにするという方法もあると知りました。

つまづいた点:
ご指導頂いた命令では思ったとおりになるのはなったのですが
その時の例えがボタンイベントにて消す・表示するといった方法でした。
それらの特性を利用してフレームで読み込んだ時に消しておいて
アイテムゲットしたら表示すればいいのかと思いましたが
いきなり初っ端からボタンイベント以外で消す方法が分かりませんでした。
エンターフレームとかLOADとか様々試してみましたが
プレビューすると「エラーの神様」が叱ります。;;
恐らく、命令の書き方が間違っているか
ボタンオブジェクトでは無理なのか・・・
その他の方法としてレイヤーを一番TOPに設け
ボタン隠すとかしてみましたが数多いフレームなので
各所にそれを設けるのは頭がこんがらがって無理でした。
(また、アイテム入手の順番は決まってないので
その順番毎にボタン隠すフレームを用意するのも考えただけで死にそうになりました)

ごちゃごちゃと書いてしまいましたが
最初は何も入手してないので全て非表示。
変数を利用してフラグをたて、
入手したなら表示、してないなら非表示のまま
ってな感じでやりたいのですが私のようなバカでも
理解できる方法はあるでしょうか。

ご指導いただけるようでしたら、宜しくお願い致します。

A 回答 (6件)

そうだ(今頃…)!


え~と#4です。

十数MBになるのだったら,EXEの方が良いかもしれません。
プロジェクタとしてEXEファイルにパブリッシュして,ダウンロードゲームとして見てもらう方法もあります。
カッコイイ~! 本物のオリジナルゲームソフトプログラマみたい。

でも,パブリッシュしたEXEファイルは,アイコンやタスクバーがどうみてもFlashで,
オリジナルにプログラムを組んだゲームのようには見えませんよね。
以下はWindowsですが,外見FlashをFlashらしくなく見せる方法です。

Macromediaには悪いですが,EXEをカスタマイズする方法。
いいのかな? こんなことして…

まずアイコンです。

「KH IconMagic98」(フリーウェア)
http://www.khsoft.gr.jp/software/
これは,プログラムファイルのアイコンを簡単に書き換えることのできるソフトウェアです。
Fマークのアイコンを自作のアイコンとチェンジすることができます。

アイコン自体は,「Flash」で32×32のステージを作って絵を書き,
「イメージの書き出し」でビットマップを選択,
保存するときの色深度を8ビットカラーで保存すれば,そのファイルをKH IconMagic98で読み込むことができます。

またアイコン作成専用ソフトを使うと,透明色や色数などもっと細かく指定出来ます。
(例)「Wety's Icon」
http://www.vector.co.jp/magazine/softnews/030507 …

これで,入口であるアイコンは変更できます。
次は中身です。

Flashをパブリッシュする前に,1フレーム目のスクリプトとして,

fscommand("showmenu", false);
もしくは,
Stage.showMenu = false;

と書いておくと,「ファイル」や「表示」などというメニューを消すことができます。

または,さらに,
「Resource Hacker」(URLは説明サイト)
http://www.geocities.jp/donut1817/tabbrowser/res …
を使うと,「バージョン情報」や,「タイトルバー」のタイトルも書き替え可能です。
このソフトをちゃんと使うと元はFlashでパブリッシュしただけという痕跡はほとんど消すことができます。

さらにさらに,
「簡単インストーラ」
http://www.vector.co.jp/soft/dl/win95/prog/se122 …
などを使って,作成したゲームのEXEファイルにインストーラを付けることも可能です。
インストーラにしておくとダブルクリックで
C:\Program Files\irukacyan\game\
みたいなところに,自動でインストールされ,デスクトップやスタートメニューにショートカットを登録することができます。

Flash以外はフリーソフトです。
※各ソフトの詳細使用説明まではできませんので,使用される場合わからないことはヘルプやサイトなどで調べてください。

ついでにHELPファイルも作ります?
「HTML Help Workshop」
http://www.microsoft.com/japan/office/ork/2003/t …
よく見るヘルプを作るソフトです。
HTMLで書いたものをこれでCHMファイルにコンパイルできます。
でも,ハッキリ言ってFlash並にかそれ以上に使うのが難しいです,このソフト。

変なことを書いてしまって,日頃こんなことをして遊んでいるのがバレバレですね(/-\*) ハジュカチ…。
遅くなりましたが,今頃,いらない妙なことをひらめきましたので…
    • good
    • 0
この回答へのお礼

うわわわわわぁあ。

本当に有難う御座います。

完成が近くなるにつれ、どんどん容量がデカくなるのを
心配しながら且つ後戻りできないまま
徐々に作成してました。

これはいいです!
すごい!

ちょっとしたゲームパッケージですよね。
ちゃんとできるかどうかはまだ分かりませんが
目指すところが出来て本当に嬉しい限りです。
こんな初心者に丁寧に教えてくださりありがとうございました。

あたしも、いつしか知識が身に付いたら
是非指導できる立場になってみたいと思います。

本当に有難うございました。

お礼日時:2005/06/08 15:27

#2、3です。

度々すみません。

フラグやアイテムのボタンの名前に規則性がないとのことですので、#3の方法ですと、

 if( ! _root.get_flg1 )
 {
  item1._visible = false;
 }
 else
 {
  item1._visible = true;
 }

こんな感じの if 文をアイテムの数だけ、item_window がステージに登場する度にズラズラと書かなければならなくなります。
これではスクリプトが長くなり、後から見た時に分かりにくいかと思います。
今さら作り直すのも大変かと思われますので、もっと簡単にできる方法をご紹介しましょう。


要するに、

 ・item_window がシーンをまたいでも初期化されない
 ・最初は全てのアイテムボタンを非表示にする

この2点がクリアできればいいわけです。

Flash では、最初からステージにムービークリップを配置しておかなくても、スクリプトで後から動的にムービークリップを追加することができます。
動的に挿入したムービークリップは、シーンが変わっても存在し続けます。
また、挿入した後は普通のムービークリップと同じように、スクリプトで操作できます。


スクリプトで動的に挿入するには、”リンケージ”という設定が必要です。
「ライブラリ」でアイテムウィンドウのムービークリップを選び、右クリック( Mac では control +クリック)でメニューを出します。
この中に「リンケージ」という項目があるので、これを選択してください。「リンケージプロパティ」パネルが開きます。
最初は多くの項目が選択不可になっていますが、「 ActionScript に書き出し」にチェックを入れると編集できるようになります。
これともう1つ、「最初のフレームに書き出し」にもチェックを入れ(デフォルトでは必ず入ります)、「識別子」に何か名前を入力してください。ここで付けた名前は、スクリプトでムービークリップを挿入する際に必要になります。
ここでは仮に”ITEM_AREA”とします。

次に、アイテムウィンドウのムービークリップシンボルに細工をします。
アイテムボタンを配置したレイヤーとは別に、スクリプト専用のレイヤーを用意します。
現状では1フレームで作ってあると思いますが、フレームを追加して2フレームにします。
アイテムボタンのレイヤーはフレーム1だけキーフレームにし、フレーム2はフレーム1と同じ内容を繰り返すフレームにします。
スクリプトのレイヤーには、空のキーフレームを2つ作ります。

フレーム1に、全てのボタンを非表示にするスクリプトを書きます。

 //全てのボタンを非表示にする
 for( i in this )
 {
  this[ i ]._visible = false;
 }

これは、#2でご紹介しましたおまじないです。
フレーム2には stop(); を入れ、タイムラインを止めます。
これで、最初のフレーム1でボタンが非表示になって次のフレームに進み、フレーム2ではタイムラインが止まりますから、普段はフレーム2が表示されることになります。


話はシーンの編集に戻りまして。
メインのタイムラインには、最初にフラグの初期化など、ゲームの情報を初期化しているフレームがあるかと思います。
アイテムウィンドウのインスタンスをステージには配置せず、初期化の処理の中に、アイテムウィンドウを挿入するスクリプトを追加してください。
動的にムービークリップを挿入するスクリプトは、次のようになります。


 //アイテムウィンドウを挿入
 this.attachMovie( "ITEM_AREA" , "item_window" , 0 );

 //位置を決める
 item_window._x = 300;
 item_window._y = 50;


動的にムービークリップを挿入するには、attachMovie という命令(メソッドといいます)を使います。
さて、この this は誰を指しているかといいますと、メインのタイムラインで実行するのですから、this は _root を指しています。
attachMovie で挿入したムービークリップは、このメソッドを実行したムービークリップのものになります。
従って、ここでは _root の持ち物ということになります。

attachMovie に渡している3つのパラメータのうち、2番目(中央)のパラメータがインスタンス名です。
つまり、これで item_window というムービークリップのインスタンスが、_root に新しく追加されたことになるのです。
何も指示しなければ、item_window は _root の X = 0 、Y = 0 (ステージの左上)に配置されます。
そこで、挿入した後で、位置を保持する _x と _y (プロパティといいます)を書き換えて、配置する位置を決めます。
アイテムウィンドウの大きさやゲーム画面の構成から、見栄えのいい位置を指定してください。
ちなみに、ムービークリップやボタンをステージに配置した時、+印(○と重なっている場合もあります)が表示されています。
+印のある位置はそのオブジェクトの中心点で、スクリプトで移動・変形する際の基準点となります。
_x と _y プロパティには、この点の座標が入っています。


attachMovie で挿入したムービークリップは、シーンが変わっても初期化されることなく、ずっとステージに存在しています。
ですから、例えばアイテムを入手した時は

 _root.item_window.item1._visible = true;

とすれば、アイテムボタンを表示できます。
ゲームが終了した時など、アイテムウィンドウが不要になったら、メインのタイムラインで

 this.removeMovieClip();

として、ムービークリップごと削除してください。

----------------------------------------------

ファイルの容量が13Mとは、ちょっと大きすぎですね。
なぜ、そこまで大きくなったのでしょうか?

画像や音を多用すると、確かに容量は増えます。
また、キーフレームが多い場合も、容量は大きくなります。
スクリプトが占める割合はたかが知れているので、この際、スクリプトは別に華麗にまとまっていなくてもいいと思いますが、何にしても、13Mは大きすぎです。
あまり大きすぎるとパブリッシュに時間がかかったり、パブリッシュの途中で失敗することがあります。
また、たとえ自分の環境では問題がなかったとしても、閲覧者のパソコンがスペックの劣るマシンだったとしたら、処理が遅くなったりシステムがフリーズするなど、深刻な障害を引き起こす可能性もあります。


長編のムービーや内容の多いムービーは、swf ファイルを分割して、必要な時に随時 loadMovie などで読み込むのが一般的です。
市販のゲームでも、絵や音・動画などが入るRPGのようなものでは、たいていは途中でロードが入り、いらなくなったデータを捨ててメモリを空け、そこに必要なデータを読み込んでいます。

ゲームを作る時は、思い付きだけではできません。
早く作りたくてはやる気は分かりますけれど、大作であればあるほど、その気持ちを少し抑えて、スクリプトはどんな方向で詰めていくか、どこでどんなデータを読み込むなど、最初にしっかりと計画を立ててから作るものなのです。
プロや複数のメンバーで作る作品だと、仕様書として書類にまとめたりします。まあ、個人ではここまで綿密にやらなくてもいいですけど・・・
今回はとにかく完成を目指すのが第一かと思いますが、次回からは、スクリプトを組む時の”設計”の部分にもこだわってみてください。
    • good
    • 0

遅ればせながらsassakunです。



えーと,
要は#1さん,#2(3)さんの言われているようなことです。

visible = false は何処に書いてもいいわけです。

自分自身のボタンに書いても良いですし,ムービークリップに書いても良いですし,フレームに書いても良い(フレームの場合,読み込む順番の為か,たまにすっぽかされますが。)のです。

ボタンのインスタンス名を仮に「itemA」としましょうか。

-------------------------
on (release) {
itemA._visible = false;
}
-------------------------

とボタンに書いて,
このボタンをクリックすれば,このボタンは消えます。
また,
この「itemA」をボタンではなく,ムービークリップとして作成し,
そのムービークリップに,

-------------------------
onClipEvent (load) {
this._visible = false;
}
-------------------------

と書いても,その「itemA」はロード(画面に登場)したとき,
visible = false の状態で消えたまま登場します。

また,その「itemA」を他のムービークリップから,visible = false にしたいときは,
this._visible = false; ではなくインスタンス名が必要で,ついでにパスもあった方が良くて,

-------------------------
onClipEvent (load) {
_root.itemA._visible = false;
}
-------------------------

となります。
フレームから visible = false にしたい場合は,on○○ は不要で,

-------------------------
_root.itemA._visible = false;
-------------------------

となります。
フレームから「itemA」の操作は,数が多い場合や,読み込まれるタイミングの問題で,たまに効かない場合があるので,ムービークリップからの操作の方が良いと思います。
フラグで操作する場合は,

------------------------
onClipEvent (load) {
if (_root.flag == 1) {
this._visible = true;
}
-----------------------

みたいに書けば,
ちゃんとflagに値が入っていれば,うまく動作するはずです。

というところあたりが#1さんの言われていることだと思います(勝手に思ってすみません)。

#2さんは,さらに先を言われていて,
itemがたくさんある場合は,全部を操作するのは大変手間でしょう。
例えば,

------------------------
onClipEvent (load) {
  _root.itemA._visible = false;
  _root.itemB._visible = false;
  _root.itemC._visible = false;
  _root.itemD._visible = false;
  _root.itemE._visible = false;
  _root.itemF._visible = false;
  … … …
}
-----------------------

みたいにわかり切っていることを繰り返し書かなければならないし,
配置換えをしたいときなどに全てを1つずつ,移動させなければならない。
それは大変なので,itemA,itemB… みたいな名前より,通し番号にして,配列演算子でまとめて管理し,
1つのムービークリップに入れて,一気に操作する方が管理が楽で,ファイル容量も減りますよ。

と言うことをおっしゃっていると思います(これまた勝手に思っています)。

かなり,簡略化し過ぎましたし,勝手に解釈を変えている部分もあるかもしれませんが,
簡単に言うとそういうことだと思います。
といつも簡単に言い過ぎるから,わかったつもりにさせてしまって,
あとで,「わからないエンマ様」や,「エラーの神様」が出てきてしまうのでしょうか?
少し反省…。

>> (13Mという恐ろしい重さになってきたのですが;;)

えーと,SWFファイルがですか?
もしそうだとすると,本当に恐ろしい。

もし,ネット上で,ISDNでも遅いのを使っている場合,数時間表示されないかもしれませんね。
ファイルのダイエットが一番大切ですが,シーンで場面を変えるより,別ファイルでSWFを個々に用意して,それをメインSWFにロードさせる方が良いかもしれません。

とりあえず,作るのが先ですかね。
作ってみて,巨大なSWFファイルになる場合は,SWFを細切れにして,loadMovie();も考えておいた方が良いと思います。
FLAファイルが13Mなだけだと,気にすることはないです。
パブリッシュしたSWFの容量さえ気にしていれば,あとは自分のPCのメモリとの戦いがあるだけです。

とまあ,要らないことを言いに来ました。失礼します。
    • good
    • 0
この回答へのお礼

沢山のご指導ありがとう御座いました。

ようやく、スプリクトも全部書き込め
動作確認も順調な結果がでました。
あとは、SWFのダイエットなのですが・・・・・

実は、私は絵画力とうかデッサンというか
正直「絵」がヘタクソなのです。
でも、FLASHには興味があってムービーやゲームを作りたい。
そこで、仕事の関係上で使用している3Dソフトがありまして
3Dソフトで書いた建物やキャラクターをコマ撮影したbmp画像を総数2,000枚くらい貼っつけてる具合です。
後で知ったのですがjpg画像にしてればもう少し軽くなったようなのですが
シーケンス形式で自動で読み込ませたので今更、名前を一つずつ変更して読み込ませるのはとても大変で・・・・
(しかも、ゲーム内容によってフレームをあちこち移動させたので)

このゲーム、仲間内で閲覧する目的で
注釈として「ADSL以上且つPenIII以上のマシン」推奨ってな感じでやる予定です。
折角なので、色んな人に見て欲しい気もするんですが
お披露目できる程のものでも無さそうなので。。。

けど、目指すは「一般公開!」
少しずつではありますが、スプリクトも覚えてきました。
本当に有難うございます。

お礼日時:2005/05/29 12:42

#2です。


なるほど、シーンが分かれているとは難しいですね。


Flash では、ムービー自身も1つのムービークリップとして扱います。
普通は、_root という名前のムービークリップとして扱います。ActionScript では、ステージにあるインスタンスは、全て _root の子になります。
また、メインのタイムラインで定義されている変数や関数は、特に断りがなければ _root の持ち物になります。

ムービーの編集に便利なようにと、_root にだけはシーンという概念があります。
しかし、これは便宜上分けられているだけで、一続きのムービークリップであることには変わりありません。
ですから、_root が持っている変数や関数ならば、シーンが変わってもなくなることはありません。

ですが、_root の子であるムービークリップが持っている変数や関数となると、話はまた別です。
ステージに配置されているインスタンスは、キーフレームが変わると、たとえ同じシンボルから作られたインスタンスだとしても別のものと見なされ、インスタンスの初期化が行われます。
例えば、#2で説明しましたムービークリップのインスタンス item_window が、シーン1とシーン2の両方で登場するとします。
シーン1と2で同じく”item_window”というインスタンス名を付けていても、この2つは全くの別のものになります。
つまり、シーン1で item_window が持っていた変数や関数・スクリプトで変更した _visible 等の設定などは、シーン2ではクリアされてなくなってしまいます。

----------------------------------------------

シーンをまたいで情報を伝えるには、_root にある変数なら、シーンが変わっても情報がなくならない点を利用してはいかがでしょう。


例えば、ゲットしたアイテムを get_flg1 ~ 10 という、10 個のフラグで管理するとします。
このフラグは _root のタイムラインに用意し、最初の1度だけ、全てのフラグを false または 0 に初期化します。
単純に手に入れたか否かだけなら、true と false で管理した方が、ボタンの表示を切り替える時にも値をそのまま利用できて便利です。
何個手に入れたかを管理したい時は、0 で初期化してください。
最初の1度だけ初期化するには、シーン1のフレーム1に空のキーフレームを作り、フレームアクションで初期化する方法が簡単です。


 //アイテムの種類の総数
 kind_max = 10;

 //アイテム取得フラグの初期化
 for( i = 1 ; i <= kind_max ; i++ )
 {
  this[ "get_flg" + i ] = false;
 }

kind_max という変数では、アイテムが何種類あるかを管理します。
今後、このようなループは何回か出てきます。
種類を変数で管理し、ループでもこの変数を使って処理すると、制作中にアイテムの種類が増えたり減ったりした時でも、kind_max の値を書き換えるだけで変更できます。


実際のゲームはフレーム2からスタートさせます。item_window も、フレーム2から配置してください。
item_window 内のボタンには、item1 ~ 10 というインスタンス名が付いているとします。
load イベントを利用して、最初の1度だけ、get_flg1 ~ 10 の状況に応じてアイテムボタンの表示・非表示を設定します。
ゲームスタート時はアイテムが1つもない( get_flg1 ~ 10 が全て false )ので、全て非表示になります。
item_window に設定するスクリプトは、次のようになります。


 onClipEvent(load)
 {
  //アイテムの取得状況に応じて表示・非表示を切り替える
  for( i = 1 ; i <= _root.kind_max ; i++ )
  {
   this[ "item" + i ]._visible = _root[ "get_flg" + i ];
  }
 }

_visible に入る値は true か false のどちらかです。
get_flg 1 ~ 10 に入る値が true または false の場合は、この値をそのまま _visible の設定として利用できます。
アイテムの取得フラグでアイテムの個数を管理している場合は、get_flg1 ~ 10 の値を直接 _visible に代入しないで、一旦 if 文でフラグの内容を判断し、0 なら非表示・それ以外は表示とした方が、安全なスクリプトになります。


シーン2でも item_window を登場させます。名前は同じでも構いません。
この時の item_window は初期化されており、先ほどの _visible の設定は全て無効になっています。
しかし、アイテムの取得状況は _root に残っていますから、この情報を元に、アイテムボタンの表示状態を復元できます。
方法はシーン1の item_window に設定した時と、全く同じです。同じスクリプトを、シーン2の item_window にも設定してください。
シーン3やシーン4と続いていく場合も、同じ要領で、表示状態を復元できます。

なお、ゲームの途中でシーン1に戻る必要がある場合は、フレーム1ではなくフレーム2に戻るようにしましょう。
フレーム1では get_flg1 ~ 10 を false にしているので、ここに戻るとアイテムが全て消えてしまいます。

アイテムの取得フラグに限らず、ゲームを作る時は、最初の1回だけ初期化すればいい情報と、リプレイの度に初期化しなければならない情報があります。
本当に最初の1回だけ初期化したい場合は、最初のフレームでまとめて情報を初期化し、以降はこのフレームには戻ってこない、といった方法が、一番簡単だと思います。


ところで、get_flg1 ~ 10 の持ち主は _root です。
アイテムをゲットした時や、アイテムボタンをクリックしてアイテムを使用し、持っている個数が0になってなくなった時などは、このフラグを操作することになります。
item_window 内のボタンから見ると、get_flg1 ~ 10 は他人( _root )の持ち物です。操作する時は、ターゲットパスを付けることをお忘れなく。
    • good
    • 0
この回答へのお礼

ありがとうございます。
乏しい脳みそなので全文理解するにはまだ少し時間かかりそうなので
このページをコピーさせて頂きました。

変数の扱い方までご丁寧に使用例まで記載してもらい
感激しています。
(もしこの掲示板以外で活動されているサイトがあるなら是非教えてください。訪問したいです)

けど、残念ながら
雪だるま式で思いついたままのプログラムなので
アイテムの管理している変数は次元配列できる
状態でなくなっちゃってます。
また、ゲットしたフラグを0にしたり1にしたり
規則性もマチマチで;;
教えてもらって「そうか!そうしたら簡単だった」と
後戻りできない自分の愚かさを呪っています・・・

でも本当によい勉強になりました。
頑張って完成させてみせます。
(13Mという恐ろしい重さになってきたのですが;;)

お礼日時:2005/05/27 13:30

こう考えてはいかがでしょう。



まず、アイテムのボタンを並べたムービークリップを1つ、用意します。アイテムボタンには、それぞれインスタンス名を付けておきます。
このムービークリップのインスタンスをステージに配置し、こちらにもインスタンス名を付けます。ここでは仮に、”item_window”とします。

item_window は、ゲームが稼動している間、常に表示させておきます。
タイムラインでいうと、専用のレイヤーを作り、フレーム1にキーフレームを作って item_window を配置し、ゲームが終わるフレームに「フレームの挿入」でフレームを入れて、フレーム1と同じ内容を繰り返させるようにします。
これで、item_window はゲームが続いている間、ずっとステージに存在していることになります。
item_window が持っているアイテムのボタンは、

 _root.item_window.アイテムボタンのインスタンス名._visible

として操作できます。

----------------------------------------------

ムービークリップのインスタンスであれば、ムービークリップがステージに登場した時に1度だけ発生する load イベントを利用して、最初は非表示にしておくことができます。
しかし、ボタンのインスタンスでは load イベントは利用できません。
最初に非表示にするには、もう少し工夫が必要になります。


一番簡単な方法は、アイテムをボタンではなくムービークリップとして作ることです。
各アイテムをムービークリップにして

 onClipEvent(load)
 {
  //最初は非表示にする
  this._visible = false;
 }

(↑各行頭に全角のスペースが入っています。コピーして利用する際は、全て半角のスペースかタブに置き換えてください)

とすれば、最初は非表示になります。
Flash MX からは、ムービークリップでもボタンと同様のイベント( press や rollOver など)が利用できるようになりました。Flash MX か MX 2004 をお使いであれば、ムービークリップにしても、アイテムをクリックすることは可能です。


ところで、アイテムが 10 個も 20 個もあった場合は、その1つ1つに onClipEvent(load) を設定するのは大変ですよね。
多くの対象を効率よくさばく方法は、いろいろあります。
よくある方法は、各アイテムのインスタンス名を固定の名前+通し番号で付け、配列変数のようにして管理するというものです。

ActionScript では、文字列を使って変数やインスタンスを操作できます。
文字列で変数やインスタンスを指定するには、eval 関数か配列演算子 [ ] を利用します。
eval 関数は Flash Player 6 からは条件が付きましたので、[ ] を使う方がオススメです。
例えば

 _root[ "item" ]._visible = true;

とすると、ステージにある”item”というボタンやムービークリップの _visible 属性を操作することができます。
数値が入っている変数と組み合わせて使うこともできます。

 _root[ "item" + item_no ]._visible = true;

とすると、例えば item_no に 5 が入っている時は、

 _root[ "item5" ]._visible = true;

と同じ意味になり、つまり、item5 というボタンやムービークリップを表示状態にすることができます。

仮に、item_window 内に配置したアイテムの各ボタンに、item1 ~ item10 というインスタンス名を付けたとします。
item_window はムービークリップのインスタンスですから、load イベントが利用できます。
更に、アイテムのインスタンス名が固定の名前+通し番号で付いている点を利用すると、for ループを使って

 onClipEvent(load)
 {
  //全てのボタンを非表示にする
  for( i = 1 ; i <= 10 ; i++ )
  {
   this[ "item" + i ]._visible = false;
  }
 }

とすれば、ボタンがいくつあっても、これだけのスクリプトで全てのボタンを非表示にしておくことができます。
この場合はアイテムごとに load イベントを利用する必要はないので、アイテムはボタンのままでも構いません。

----------------------------------------------

アイテムをゲットした時は、item_window 内の各アイテムボタンの _visible 属性を操作すればいいことになります。
操作する時は、ターゲットパスに注意しましょう。
ActionScript は、操作しようとする変数や関数、インスタンスの持ち主にうるさい言語です。
変数や関数・インスタンスを操作する際には、その持ち主をはっきりと指定しなければなりません。この指定のことをターゲットパスといいます。


先の item_window の例で見てみますと。
item_window には、item1 ~ 10 という、10 個のボタンが配置されています。
これらのボタンは全て、item_window の持ち物です。
ターゲットパスは、自分自身の持ち物であれば省略できます。ですから、item_window のタイムラインや onClipEvent の中で使う限りは、

 item1._visible = true;

もしくは自分自身を指す this を使って

 this.item1._visible = true;

として操作できます。


例えばステージにある宝箱のムービークリップをクリックした時、箱が開いて item2 が手に入ったとします。
宝箱のインスタンス名を t_box としますと、これに on アクションを設定した場合、アイテムのボタンである item2 は他人( item_window )の持ち物を操作することになりますから、ターゲットパスが必要になります。
階層構造を図にしてみると、

 _root
  ┗ t_box
  ┗ item_window
    ┗ item1
    ┗ item2
      :

こんな構造になっています。
t_box から見ると item_window は、自分の親(1つ上の階層)にある別の子となります。
従って、ターゲットパスは、親を指す _parent という表現を使って

 _parent.item_window.item2._visible = true;

もしくは _root からの絶対パスで

 _root.item_window.item2._visible = true;

という書き方で操作します。

なお、先述の文字列を使って操作する書き方の場合は、1階層ごとに1組の [ ] を用意します。
例えば _parent.item_window.item2 の場合は

 _parent[ "item_wondow" ][ "item2" ]._visible = true;

となります。

 _parent[ "item_window.item2" ]._visible = true;

では正常に指定できませんので、ご注意ください。
変数を利用して指定する際は

 _parent[ "item_window" ][ "item" + _root.item_no ]._visible = true;

こんな感じになりますね。
変数 item_no が t_box の持ち物ではない場合は、item_no の持ち主を指定するターゲットパスもお忘れなく。


最後に、おまじないを1つご紹介しましょう。
item_window に

 onClipEvent(load)
 {
  //全てのオブジェクトを非表示にする
  for( i in this )
  {
   this[ i ]._visible = false;
  }
 }

というスクリプトを設定してみてください。
ボタンのインスタンス名に関係なく、全てのアイテムが非表示になります。

アイテムのボタンに固定の名前+通し番号で名前を付けると、アイテムの種類も同時に番号で管理できます。
例えば、配列変数で個数などを管理している場合は、

 item[ item_no ] = ・・・

こんな感じで、ビジュアル面の操作と同時に、ゲームを進行させる時の情報としてもアイテムの番号が役に立ちます。
ただし、配列の番号は0から始まることにご注意ください。
アイテムのボタンの番号も0から振っておくと、配列とズレなくて便利です。
ゲームの情報としてアイテムを番号で管理する必要がないのならば、アイテムのボタンに好きな名前を付けて、先のおまじないで非表示にしてもいいかもしれません。


長くなってすみませんでした。
不明な点がありましたら、補足してください。
    • good
    • 0

こんにちは。



ども。上手く行きませんでしたか。

visibleは命令と言うよりパラメーターだと思って下さい。
ですから条件設定さえ間違っていなければ消せるはずです。
常時監視する為のMCを置いておくのが良いかなと思います。つまり2~3フレームで出来た表示されないMCを置いて、そこでステージの状態を監視する訳です。
で、それとは別に変数を格納する場所も作っておく。

条件としては、例えば「item」という変数を用意して、これが空白ならアイテムエリアは非表示。

で、アイテムエリア自体は全体をMCにしておいて中にさらに各アイテムをMCで分けておく。

といった感じでしょうか。

基本的にあなたの考え方で正解ですよ。

エラーの内容と、その部分のスクリプトを見せてもらえますか?

この回答への補足

ありがとうございます。
実はエラーとか書いてたんですけど800文字オーバーしちゃって投稿できませんでした。

エラーはこんなのです
**エラー** シーン = シーン 2, レイヤー = レイヤー 1, フレーム = 1 :行 1:クリップイベントはムービークリップインスタンスでのみ使用可能です。
onClipEvent (load) {

ActionScript エラー数 :1 報告済みエラー :1


で、もしやボタンとして取り扱うのは無理なのかな?と思い
ムービーの中にボタンを入れやってみましたら
LOADで消すことはできました。
しかし、予想したとおり別のシーンに飛ぶと
LOADし直すのかしてアイテムゲットのフラグがたってても
シーンをまたいだ瞬間消えてしまいました;;
シーン毎に変数管理する必要があるのでしょうか・・・
(なかなか一筋でいきませんが、今非常に楽しく悩んでいます)

どうか、末永くご指導お願い致します。

補足日時:2005/05/26 18:39
    • good
    • 0

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


おすすめ情報