アプリ版:「スタンプのみでお礼する」機能のリリースについて

昨日、sassakun様にご回答いただいたように、
ムービークリップでFLASHを作り直させて頂きました。

基本的には無事に動いたのですが、
問題点が2点ありますので、もしよろしければ教えて下さい。

1つ目は、
ボタンでMCを読み込むにつれて、swfファイルの動きが大変遅くなってしまうという現象です。

不要になったMC(階層が一つ下になった時点/最上位階層でなくなった時点)を
をremoviMovieClip()で消滅させたいと思い、
各ムービークリップの45フレーム目に
(45フレームまでがフェードイン/アウトで重ねたい部分なので)
そのMC以外を指定してアクションスクリプトを記入したのですが、
消えませんでした。

記入したアクションスクリプトは、
mc0の45フレーム目に
mc1.removeMovieClip();
mc2.removeMovieClip();

mc1の45フレーム目に
mc0.removeMovieClip();
mc2.removeMovieClip();

mc2の45フレーム目に
mc0.removeMovieClip();
mc1.removeMovieClip();
です。

2つ目は、
Fumio Nonaka.com様の3D_Boxをmc2にコピーしたのですが、
立方体が表示されなくなってしまいました。

これについては全くわからないのですが、
深度に関係があるのでしょうか?

<利用させて頂いているアクションスクリプトの掲載URL>
http://www.fumiononaka.com/Sample/3D_Box/3D_Box. …
下段のSource to download (約192KB/Flash 8形式): 3D_Box.zip

以上、2点の解決方法を教えて頂けないでしょうか?
よろしくお願いします。

A 回答 (2件)

読み込む??? 全くもって謎です。


前回のご質問&回答&補足では,
何かを読み込むということには全く関係していませんよ。

「ページの切り替えのフェードイン/フェードアウトについて」
http://oshiete1.goo.ne.jp/qa3063798.html
 ↑教えて!goo  ↓OKWave (同じです)
http://okwave.jp/qa3063798.html


また,
Flash で何かの構造物を読み込むというのは,
一般的には loadMovie で外部SWF や JPEG などを読み込むことだと思います。
そしてまた,
その読み込んだものを消すのは普通,removeMovieClipではなくて,unloadMovieです。

Flashドキュメンテーション
loadMovie (MovieClip.loadMovie メソッド)
http://livedocs.adobe.com/flash/8_jp/main/000024 …
unloadMovie (MovieClip.unloadMovie メソッド)
http://livedocs.adobe.com/flash/8_jp/main/000025 …



さらに,
removeMovieClip で消せるのは,深度0 以上のムービークリップです。

Flashゲーム講座&ASサンプル集【深度について】#Z_01
http://hakuhin.hp.infoseek.co.jp/main/as/z.html# …
 ~引用~
> 通常Flashで作るときに配置するMCインスタンスの深度は、
> -16325 あたりで自動的に割り振られて設定されています。
> … 略 …
> 例1)MCインスタンス a を削除。
> (深度が0より低いMCは消せない)
> _root.a.removeMovieClip();
>
> 例2)MCインスタンス a の中にある
> MCインスタンス b を削除。
> (深度が0より低いMCは消せない)
> _root.a.b.removeMovieClip();

そして,さらに,
仮に消せたとしても ムービークリップ ごと消えてしまいますよ。
つまり,消したらまた作成しないと再び現れてくれません。
その辺は大丈夫なのでしょうか。
寝耳に水のような,まったく状況がわからない謎なご質問だと思います。



> 記入したアクションスクリプトは、
> mc0の45フレーム目に
> mc1.removeMovieClip();
> mc2.removeMovieClip();

以上で説明したように,
「mc1 や mc2 などは消しても良い」という条件で,
なおかつ,
「mc1 や mc2 などは深度0以上で消せる」という条件付きで回答すると,
ターゲットパスが間違っています。

mc0 の中に mc1.removeMovieClip(); と書いたら,
mc0 の中の mc1 が消えます。
mc0 の中には mc1 など元から存在しませんね。
mc1 が存在するのはメインムービーのタイムラインである _root です。

したがって,書くべきスクリプトは,

_root.mc1.removeMovieClip();
_root.mc2.removeMovieClip();

というように絶対パスを使うか,

this._parent.mc1.removeMovieClip();
this._parent.mc2.removeMovieClip();

というように相対パスを使う必要があります。

「ターゲットパス」
http://homepage3.nifty.com/ginga-b/MX/targetpath …
 ~引用~
> バグの多くが、ターゲットパスの指定ミスでしょう。


その他
深度0未満のムービークリップを強引に削除する方法です。

fladdict.net blog 無理矢理にマイナス深度のMCを消去
http://www.fladdict.net/blog-jp/archives/2005/04 …

mtFlash removeMovieClipで完全にMCを消去する方法
http://www.publicroots.com/fmt/archives/000067.h …



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

> 2つ目は、
> Fumio Nonaka.com様の3D_Boxをmc2にコピーしたのですが、
> 立方体が表示されなくなってしまいました。

3D_Boxをmc2にコピーするという意味がよくわかりませんが。
そもそも 3D_Box はステージ上に構造物は全く何も必要なくて,
ライブラリの中にビットマップ画像があって,
それをスクリプトでステージ上に呼びだしているだけですよ。
そこまではよろしいでしょうか。

したがって,
mc2にコピーするのはスクリプトだけです。
そして,ライブラリの中には,
image0 ~ image5 という "識別子の付いたビットマップ画像" を用意しておく必要があります。
3D_Box のライブラリの中にあるビットマップ画像を右クリックして,
「リンケージ」を選択すれば,
識別子に image0 などが書かれてあるのがわかると思います。
ついでに
 □ActionScriptに書き出し
 □最初のフレームに書き出し
にもチェックが入っていることもわかりますが,
このチェックも入れておかなければその画像は表示されません。

こういう状況を作れば,
mc2 の中でも 3D_Box はちゃんと出てきて動きます。

普通は,ムービークリップの中に何かを移すと,
ターゲットパスが変わるのでうまく動かなくなることが多いです。
しかし,さすが巨匠 野中氏 だと思います。
3D_Box は,そういうことも想定してあるようで,
全て this など相対パスで書かれていますから,
ムービークリップ の中にスクリプトを移動させても何の問題も起きないように考えられているようです。

ムービークリップの中に入れると,
ステージの左上だった基準座標がムービークリップの基準点に変わるので表示される座標は変わりますよ。
でも座標が変わるからこそ,
ムービークリップに入れると ActionScript を使わなくても表示座標を変えられたり便利に使えるのです。
どうやらその辺は想定内のことのようです。詰めは甘くないです。
3D_Box のスクリプト全てがわかるわけではありませんが,
その辺のことはわかります。



~~~~~~~~~~~~~~~~~~~~
~~~~~~~~~~~~~~~~~~~~

前回の,
#1の補足に書かれていらっしゃったことに対する回答を,
実はテキストエディタで書いてしまっていました。
もうすでに解決済みでいらっしゃるかもしれませんが,
書いたファイルを削除するのも何だなと思いましたので,
ついでにその回答を以下に貼り付けておきます。
解決済みであれば無視してください。


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

> ”画面キャプチャを利用しフレームの
> 切り替え時にクロスフェードさせる。”
> というページを発見しました。

なるほどー。
そういう方法もできますね。
私はそのページの方法自体すら考え付きませんでした。



> ”ScreenEffect.crossFade( 20 );
> //切り替えに要する時間を20とする。”を
> ボタンX、ボタンY、ボタンZに貼り付けてハブリッシュしても
> フレーム1、フレーム31、フレーム61に貼り付けて
> ハブリッシュしても
> クロスフェードできませんでした。

そうですか?
こちらでもやってみましたが無事できましたよ。
例えば具体的には,
フレームラベルA にジャンプさせるボタンに,

----------------------------
on (release) {
ScreenEffect.crossFade(20);
gotoAndPlay("A");
}
----------------------------

のようなことを書いたということですよね。
こう書けばできます。

なぜクロスフェードできないのかわかりません。
こちらでもうまく行かなければ,
解決する方法を模索することもできますが,
うまく行ってしまうので,解決方法を模索することもできません。

注意する点は,
パブリッシュ設定で Flash タブを選択して,

  バージョン(V):[Flash Player 8   v]
 ActionScriptの
  バージョン(A):[ActionScript 2.0 v]

にすることですが,
デフォルトでは普通そうなっていると思うので,
注意する点というほどのものでもありません。
何にも考えなければ勝手にそうなっています。



> ダウンロードした(本家の)FLAファイルでも
> ScreenEffect.crossFade( 20 );
> の20の部分を50にしたら
> クロスフェードになりませんでした。

それはクロスフェードにならないと思いますよ(なってもわからない)。

その 20 や 50 は,引数として
外部AS で定義してある ScreenEffectクラス の crossFade() 内に送られます。
そして,
野を越え山を越え,三項演算で無記入時のエラー処理選別をされて,
結局,

 cover.onEnterFrame = function(){
  this._alpha -= this.tick;
   … 略 …
 }

の this.tick に代入されます。
つまり ScreenEffect.crossFade(20); と書いた場合は,

 cover.onEnterFrame = function(){
  this._alpha -= 20;
   … 略 …
 }

ScreenEffect.crossFade(50); を書いた場合は,

 cover.onEnterFrame = function(){
  this._alpha -= 50;
   … 略 …
 }

が実行されます。

1フレーム進時間ごとに,アルファが 20 ずつ下がれば,
5フレームで アルファ が 0 になりますから,
フェードアウトに見えることは見えます。
1フレーム進時間ごとに,アルファが 50 ずつ下がれば,
2フレームで アルファ が 0 になってしまいますから,
フェードアウトには見えず,ほぼ一瞬で前の画像が消えてしまいます。

前の画像をフェードアウトさせる時間を長くしたい場合は,
数値を下げてください。

ですから,

> //切り替えに要する時間を20とする。

と書かれてある日本語が変なのです。
あえて同様の主観的な日本語で書きなおすなら,

 //切り替える速さを20とする。

とする方が適切なものに近いと思います。
※当たり前のことですが,
  ActionScript より日本語の方がずっと難しいですね。

この回答への補足

お返事有難うございます。

まず初めに、前回の#1の補足への回答有難うございました。
//切り替えに要する時間を20とする。
の部分を勘違いして、数値を増やしてばっかりしていました。


次に、3D_Boxは
my_mc._x = Stage.width = 200;
my_mc._y = Stage.height = 0;
と指定したら、表示されました。
単純なことに気がつくのが遅くて申し訳ないです。


前回の「ページの切り替えのフェードイン/フェードアウトについて」なのですが、
まず現状を説明します。

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
_rootの
1行目の1フレーム目にローディングバー
1行目の2フレーム目に教えて頂いたアクションスクリプトとstop();

2行目の1フレーム目にキーフレームのみ(空欄)
2行目の2フレーム目にmc0

3行目の1フレーム目にキーフレームのみ(空欄)
3行目の2フレーム目にmc1

4行目の1フレーム目にキーフレームのみ(空欄)
4行目の2フレーム目にmc2
を配置および記入した状態になっております。(実際はmc10までありますが、mc0~mc3までと同じ配置の仕方です。)

・各mcには背景を付けていない状態です。(透明といえばいいのでしょうか?/ドキュメントの背景は白です。)

・各mcの1フレーム目と最終フレームにはstop();を書いています。

・mc0にあるボタンBは(説明頂いた色でいうと、緑色のボタンです。)
mc1を表示させたいので、
------------
// 緑色のボタン クリックで
on (release) {
// mc1(緑MC)のアルファを 0 にする
_root.mc1._alpha = 0;
// mc1(緑MC)の深度を _root.dps に変更
_root.mc1.swapDepths(_root.dps);
// mc1(緑MC)のフレームを2に戻してplay ← 変更
_root.mc1.gotoAndPlay(2);        ← 変更
// _root.dps の値に 1 を加算する
_root.dps++;
}
------------
を書きました。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

mc0の最後に、写真が自動で切り替わるムービークリップを配置(表示)させています。

この時、ボタンBでmc1に移動すると、

mc1の下に、mc0の写真が自動で切り替わるムービークリップが表示され動いています。

(見えるのは、mc1の一番下の行に背景をいれれば見えなくはなるので構わないです。)

このように、下で動いているmcが重なり合い、そして重なり合ったmcが動くことで

>swfファイルの動きが大変遅くなってしまうという現象です。

が起きていると思い、

>不要になったMC(階層が一つ下になった時点/最上位階層でなくなった時点)をremoviMovieClip()で消滅させたい

と質問させて頂きました。


以下の2つの方法か、それ以外にもいい方法があれば是非教えて頂きたいです。

・removeMovieClipを使って消去して、ボタンを押したときにまた読み込む
 unloadMovieを使って消去して、ボタンを押したときにまた読み込む

(例えば、mc0→mc1に行ったとき、45フレーム目でmc1以外のmcを消去し、mc1に配置しているボタンで、ボタンに対応するmcを読み込むみたいな感じです。)
 ※_root.mc0.removeMovieClip();みたいに_rootをでちゃんと指定したのですが、なぜかremoveMovieClipでは消去できませんでした。unloadMovieではちゃんと消去できました。

・_rootの1行目アクションに、下の階層に行ったmcは、フェードイン/アウトが終わったら、そのmcの1フレームに移動
 ※各mcの1フレーム目にはstop();だけが入っていますので、ここでストップさせれば消去しなくても動きが遅くなるようなことはないと思うのでこの案を提案しました。


是非ともよろしくお願いします。


使用環境 WindowsXP SP2 , Flash PRO 8

補足日時:2007/06/09 04:06
    • good
    • 0

#1です。



何も問題が起こらなければ
これがベストではないかと思いますよ↓。

> ※各mcの1フレーム目にはstop();だけが入っていますので、
> ここでストップさせれば消去しなくても動きが遅くなるような
> ことはないと思うのでこの案を提案しました。


その他も考えてみましたが,
loadMovie(外部ファイルを読み込む) するためには,
全面的に Flash の作り直しになってしまいますから面倒ですね。
また,ファイル管理なども大変になります。

attachMovie(ライブラリから呼び出す) すると,
ムービークリップを作る際の基準点を attachMovie をすることを前提としてうまく細工しておくか,
表示させる座標をなんとか補正する計算処理をさせなければならなくなります。

それに両方とも説明がするのに膨大な字数が必要になる気がします。

やはり,
書かれていらっしゃる「各mcの1フレーム目にはstop();…」が良い方法だと思います。
loadMovie や attachMovie に関しては別の機会にでも簡単な実験をしながら作成してみられるのも良いかもしれません,


◎loadMovie についての参考URL

「MovieClip.loadMovieで外部ファイルを読込む - Flash テクニカルノート」
http://www.fumiononaka.com/TechNotes/Flash/FN030 …
 ~引用~
> 1. MovieClip.loadMovieメソッド
> 外部ムービーファイルを読込むには、MovieClip.loadMovie
> メソッドを使います。Flash MXからは、SWFムービー以外に、
> JEPGファイルも読込めるようになりました。

 ~↓上記内容に私が勝手に補足と追加↓~
 Flash 8 からは、SWFムービー JEPGファイル以外に、
 PNGファイル、GIFファイルも読込めるようになりました。
 しかし、これらは JPEG とは少し違います。
 上記にありますように、
 Flash MX からJPEG が読み込めるようになりましたが
 正確にはそうではなくて,Flash Player 6 からJPEG が読
 み込めるようになりました。
 従って Flash 5や4 で JPEG をロードするアクション
 を書いても,再生される Player が 6 以上であれば、
 JPEG がロード&表示されます。
 つまり JPEG がロード可能になったのは、
 Flash Player のバージョンアップのみが原因です。
 したがって,例えばFlash Player 4 用 SWF を
 パブリッシュしても JPEG は表示可能です。
 一方、
 PNGファイル、GIFファイルは Flash Player 8 以上の
 SWF にパブリッシュしないと表示されません。
 PNGファイル、GIFファイルのロード&表示には、
 Flash Player のバージョンアップのみではなく、
 SWF ファイルのバージョンアップも必要です。


◎attachMovie についての参考URL

「リンケージとは?」
http://www.1art.jp/flash/le/lessona/lessona.htm
「ヤッチマイナシコー!【跡地】 第4回 attachMovie」
http://nashiko3.blog12.fc2.com/blog-entry-270.html
その他 Google検索 「attachMovie Flash」
http://www.google.co.jp/search?hl=ja&q=attachMov …
    • good
    • 0
この回答へのお礼

おはようございます。
回答して頂き有難うございます。

> ※各mcの1フレーム目にはstop();だけが入っていますので、
> ここでストップさせれば消去しなくても動きが遅くなるような
> ことはないと思うのでこの案を提案しました。

をするために記入するアクションスクリプトを教えて頂けないでしょうか?
昨日からずっと色々試しているのですが全然できないので、お願いします。

お礼日時:2007/06/09 10:31

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