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

あるFLASHファイル(例えば、hizuketozikoku.swf)を用意します。(?)の部分にどのような記述をすれば、(?)のフレームアクションによってローカルマシンの常に新しい日付と時刻(*月*日*曜日*時*分*秒)を取得し、また取得した日付と時刻に対応するライブラリのムービークリップを指定する場所に読み込ませる(例えば、1月1日日曜日1時1分1秒の場合は、gatuに1gatu、nitiに1niti、youbiにnitiyoubi、ziに1zi、hunに1hun、byouに1byouを読み込ませる)ことができますか。

使用ソフトは、FLASHMXです。よろしくお願いします。


hizuketozikoku.swf
 シーン1
  レイヤー7 フレーム1 インスタンス名:byou
  レイヤー6 フレーム1 インスタンス名:hun
  レイヤー5 フレーム1 インスタンス名:zi
  レイヤー4 フレーム1 インスタンス名:youbi
  レイヤー3 フレーム1 インスタンス名:niti
  レイヤー2 フレーム1 インスタンス名:gatu
  レイヤー1 フレーム1 フレームアクション(?)

 ライブラリ
  レイヤー1からレイヤー7のムービークリップ(例えば、シンボル1からシンボル7)
  1月から12月のムービークリップ(例えば、1gatuから12gatu)
  1日から31日のムービークリップ(例えば、1nitiから31niti)
  日曜日から月曜日のムービークリップ(例えば、nitiyoubiからgetuyoubi)
  1時から24時のムービークリップ(例えば、1ziから24zi)
  1分から60分のムービークリップ(例えば、1hunから60hun)
  1秒から60秒のムービークリップ(例えば、1byouから60byou)

A 回答 (2件)

#1です。




>> 今回の質問内容の内部オブジェクトが外部ファイル
>> (例えば、1gatu.swfなど)
>> であることのみ異なっていた場合、
>> (?)の部分にどのような記述をすればよろしいですか。

これは単純に,
attachMovie ではなく,loadMovie を使えば行けると思いますよ。


--------------------------------------------
// Dateオブジェクトの作成
myDate = new Date();
// それぞれのムービークリップにそれぞれのSWFを読み込む
_root.gatu.loadMovie(myDate.getMonth()+1+"gatu.swf");
_root.niti.loadMovie(myDate.getDate()+"niti.swf");
_root.youbi.loadMovie(myDate.getDay()+"youbi.swf");
_root.zi.loadMovie(myDate.getHours()+"zi.swf");
_root.hun.loadMovie(myDate.getMinutes()+"hun.swf");
_root.byou.loadMovie(myDate.getSeconds()+"byou.swf");
--------------------------------------------



>> (例えば、1gatu、nigatu、3gatsu、shigatsuなど、
>> 呼び出される方の名前に規則性のない場合の)
>> それぞれに対応するスクリプトを1部(1gatuの場合のみ)
>> よろしくお願いします

大きく分けて2つの方法があると思います。

 1.プログラム中に全てを記述する

これが,まず思いつきますし,
みなさん初心者の頃によくされることだと思います。
また,それを少し進化させて,

 2.ムービークリップの名称データを用意しておいて
  そのデータから表示させるムービークリップの名称を
  取得し引っ張ってくる

という方法が次に来ると思います。



1.プログラム中に全てを記述する

これは, if文 がよく使われますね。

----------------------------------
// Dateオブジェクトの作成
myDate = new Date();

// 月の取得
my_gatu = myDate.getMonth();

// my_gatu の値によって attachMovie する物を変える
if (my_gatu == 0) {
_root.gatu.attachMovie("1gatu", "obj", 0);
} else if (my_gatu == 1) {
_root.gatu.attachMovie("nigatu", "obj", 0);
} else if (my_gatu == 2) {
_root.gatu.attachMovie("3gatu", "obj", 0);
} else if (my_gatu == 3) {
_root.gatu.attachMovie("sigatu", "obj", 0);
} else if (my_gatu == 4) {
_root.gatu.attachMovie("gatu5", "obj", 0);
} else if (my_gatu == 5) {
_root.gatu.attachMovie("6tuki", "obj", 0);
} else if (my_gatu == 6) {
_root.gatu.attachMovie("tuki7", "obj", 0);
} else if (my_gatu == 7) {
_root.gatu.attachMovie("obon", "obj", 0);
} else if (my_gatu == 8) {
_root.gatu.attachMovie("sep", "obj", 0);
} else if (my_gatu == 9) {
_root.gatu.attachMovie("ten", "obj", 0);
} else if (my_gatu == 10) {
_root.gatu.attachMovie("11gatu", "obj", 0);
} else if (my_gatu == 11) {
_root.gatu.attachMovie("Xmas", "obj", 0);
}
----------------------------------

こんな感じです。
名前に規則性があるとたった1行で済むところが,とんでもない行数になります。
「月」だけでも書くのが大変ですし,
attachMovie する対象ムービークリップ名称のデータがプログラムの中に入り込んでいますから,
いちいちプログラムを思い出さなければ,修正ができないので,メンテナンスも大変です。
「月」なら良いですが,「日」なら31までありますから,書く気はしませんね。
また,
 MovieClip.onEnterFrame = function() { }
のようなもので,随時更新型でしたら,
ムービー自体の動きに支障が出てくる可能性がありますよ。
つまり,おそらくフレームレートが下がると思います。


というわけで,
プログラムとデータを分けるという考え方が出てきます。
データは色んな用意のしかたがありますが,
上記のような場合,単にデータの一次元的羅列ですから,
一次配列を用意するのが一般的ではないでしょうか。

---------------------------------------
// 配列 gatuArr の作成
gatuArr = new Array("1gatu", "nigatu", "3gatu", "sigatu", "gatu5", "6tuki", "tuki7", "obon", "sep", "ten", "11gatu", "Xmas");

// Dateオブジェクトの作成
myDate = new Date();

// 月の取得
my_gatu = myDate.getMonth();

// ムービークリップ を attachMovie
_root.gatu.attachMovie(gatuArr[my_gatu], "obj", 0);
---------------------------------------

この方法だと,
初心者の方だけでなく,多くの方が使われると思います。
データ部分とプログラム部分が分かれているので,
データを変更したい場合も,1行目だけを修正すれば良いことになります。
データの用意のしかたは書いていればきりがありませんが,
Flash 内部ではなく,外部テキストに持たせておくのも1つの手です。

また,
 MovieClip.onEnterFrame = function() { }
のようなもので,随時更新型でも,
データの作成部分は1回の実行だけでいいので,

 // Dateオブジェクトの作成
 myDate = new Date();

以降をonEnterFrame = function() { } の { }内に記述すれば良いだけですから
ムービー自体の動きに支障はあまり出ないと思われます。


このデータ部分を用意をさらに省略しようとすれば,
呼び出したり,読み込んだりするデータ自体の名称を規則的な名称にすることです。
つまり,#1で回答したようなスクリプトになります。

というような感じです。

なお,#1 の回答スクリプトはトータル(全て作って)動作検証していますが,
この#2の回答は,理論上なものですから,
部分的にしか動作検証していません。
とんでもない数の SWF を作成して検証したり,
とんでもない行数のスクリプトを書いて検証するのは勘弁してください。
    • good
    • 0
この回答へのお礼

お返事ありがとうございます。
追加質問に関する御回答(NO.2)を拝見しました。
呼び出される方の名前に規則性のない場合のそれぞれに対応するスクリプトについて質問させていただいた時には、教えてくださった
 1.プログラム中に全てを記述する
を考えておりましたので、
 とんでもない数の SWF を作成して検証したり,
 とんでもない行数のスクリプトを書いて検証するのは勘弁してください。
とお書きくださったように、とんでもない数のものになると承知しておりました。
ですので、全てのものについてお願いするのは、御迷惑になる(充分御迷惑でしょうが)と思い、一部(1月だけ)をお願いしたのですが、月全てを教えてくださっただけでなく、その他の方法についても詳しく教えてくださりありがとうございました。
大変お手数をおかけしました。
また質問させていただいたときにはよろしくお願いします。

お礼日時:2006/08/16 15:51

お久しぶりです。



> ローカルマシンの常に新しい日付と時刻(*月*日*曜日*時*分*秒)を取得し、

これは,
普通に,Date オブジェクトを作成し,
その Date オブジェクトから,*月*日*曜日*時*分*秒 の * の部分を取得すれば良いですよね。

「Date クラス」
http://www.1art.jp/flash/le/lesson37/lesson37.htm

注意する点は,
月・日・曜日・時・分・秒 のうち,「日」だけが,1から始まる数で取得されるということです。
曜日に 0 が取得されれば,日曜日です。
月に 0 が取得されれば,1月です(日本人の感覚と1月ずれています)。



> また取得した日付と時刻に対応するライブラリのムービークリップを
> 指定する場所に読み込ませる

ちょっと感覚が違いますね。
ライブラリにあるムービークリップシンボルは,読み込むのではなく,
あらかじめ SWF 内にしのばせておいて(書き出しておいて),
そのムービークリップを呼び出すという感じだと思います。
読み込むだと,外部ファイルになりますよね。
ライブラリのムービークリップは外部ファイルではなく,内部オブジェクトです。


ライブラリのオブジェクト(ムービークリップ)を呼び出すには,
attachMovie メソッドを使います。

attach に対する日本語がうまく見つからないのですが,

---プログレッシブ英和中辞典 第3版 小学館 より---
【attach】
1 [attach A to B]〈A(物)をB(物)に〉くっつける,結びつける,添える(⇔detach)(toの代わりに場所を示してonを用いることもある)
2 《しばしば受身または~-self》〈人・施設などを〉(グループなどに)参加させる,所属させる,(…の)一員とする;〈人を〉(部隊に)(一時的に)配属させる《 to... 》
-------------------------------------------

ということなので,
attachMovie は「ムービークリップを結びつける」とか「ムービークリップ配属させる」という意味になります。
一般的な構文は次の通りです。

 myMovieClip.attachMovie( idName, newName, depth )
   日本語を交えると↓
 myMovieClip.attachMovie( 識別子, 新インスタンス名, 深度 )

attachMovie でライブラリのムービークリップを呼び出すのですが,
その前にムービークリップに idName にあたる名前が要ります。

デフォルトで勝手に付く「シンボル 1」,「シンボル 2」,… などは,
FLA ファイルを作成する上での名前で,SWF で言うオブジェクト名ではありません。
普通の場合もそうですよね。
ステージ上のムービークリップに何か指示する場合は,シンボル名ではなく,インスタンス名で指示します。
だから,この名前を付けるのですが,
ライブラリパネルを表示させて,1月なら1月のムービークリップを選択し,
「右クリック」→「リンケージ」で,「リンケージプロパティ」のダイアログを表示させます。

この「リンケージプロパティ」のダイアログで,
「ActionScript に書き出し」にチェックを入れると,
自動的に「最初のフレームに書き出し」にチェックが入り,
識別子 が入力可能になりますから,この部分で 識別子 を付けます。

この識別子の名前が,
attachMovie で呼び出す時の名前になります。
文字ばかりではわかりにくいと思うので,次のURLでも参考にしてみてください。

「リンケージについて」
http://www.1art.jp/flash/le/lessona/lessona.htm


識別子の付け方ですが,
普通,変数名やインスタンス名には 0~9 までの数字で始まる名前は付けられませんが,
識別子に限っては,数字で始まる名前が付けられるようです。
(実は,このご質問への回答での検証で初めてこのことを知りました。)

 1月ムービークリップなら「1gatu」,
 2月ムービークリップなら「2gatu」,…
 1日ムービークリップなら「1niti」,
 2日ムービークリップなら「2niti」,…

と付けて行ってください。


ただし,

> 日曜日から月曜日のムービークリップ(例えば、nitiyoubiからgetuyoubi)

これは,

 日曜ムービークリップなら「0youbi」,
 月曜ムービークリップなら「1youbi」,…

の方がスクリプト上簡単になるので,
そのように命名してください。


> 1時から24時のムービークリップ(例えば、1ziから24zi)
> 1分から60分のムービークリップ(例えば、1hunから60hun)
> 1秒から60秒のムービークリップ(例えば、1byouから60byou)

この3行は,どうも理解ができませんでした。
24時とか,60分とか,普通は存在しないと思います。

例えば,
7時60分50秒 って何時ですか?
おそらく,そんな変な言い方はせずに,
普通は 8時0分50秒 になると思います。
ですから,上の3行は,

> 0時から23時のムービークリップ(例えば、0ziから23zi)
> 0分から59分のムービークリップ(例えば、0hunから59hun)
> 0秒から59秒のムービークリップ(例えば、0byouから59byou)

ということに勝手に解釈を変えました。
ですから,これらも,

 0時のムービークリップなら「0zi」,
 1時のムービークリップなら「1zi」,…

と付けて行ってください。

そして,やっとスクリプトです。
フレームに,

/////////////////////////////////////////////////////////////
// Dateオブジェクトの作成
myDate = new Date();
// それぞれのムービークリップにそれぞれのライブラリのオブジェクトを表示
_root.gatu.attachMovie(myDate.getMonth()+1+"gatu", "obj", 0);
_root.niti.attachMovie(myDate.getDate()+"niti", "obj", 0);
_root.youbi.attachMovie(myDate.getDay()+"youbi", "obj", 0);
_root.zi.attachMovie(myDate.getHours()+"zi", "obj", 0);
_root.hun.attachMovie(myDate.getMinutes()+"hun", "obj", 0);
_root.byou.attachMovie(myDate.getSeconds()+"byou", "obj", 0);
/////////////////////////////////////////////////////////////

と書けば(コピペすれば),
インスタンス名:byou
インスタンス名:hun
インスタンス名:zi
インスタンス名:youbi
インスタンス名:niti
インスタンス名:gatu
のそれぞれのムービークリップにそれぞれのライブラリのムービークリップが配置されます。

>  レイヤー7 フレーム1 インスタンス名:byou
>  レイヤー6 フレーム1 インスタンス名:hun
>  レイヤー5 フレーム1 インスタンス名:zi
    …  …

と書かれていますが,この,
インスタンス名:byou
インスタンス名:hun
インスタンス名:zi …
は,それぞれのレイヤーに置いてあるムービークリップのインスタンス名だと勝手に解釈しました。
フレームやレイヤーにインスタンス名は付けられませんので。



※補足

 識別子の付け方ですが,
 普通,変数名やインスタンス名には
 0~9 までの数字で始まる名前は付けられませんが,
 識別子に限っては,数字で始まる名前が付けられるようです。

と書きましたが,
数字から始まると,ライブラリを管理するときに,
「リンケージ」名順に表示させると,順番がグチャグチャになりますから,
「1gatu」 などという名称ではなく,
普通の変数名やインスタンス名と同様に,
「gatu1」の方が管理はしやすいと思います。
その場合は,

_root.gatu.attachMovie("gatu"+(myDate.getMonth()+1), "obj", 0);

のようになります。

また,スクリプトを入れ子状にしましたが,
変数を作って,ワンクッション置いて行を分けても良いと思います。

---例---
// Dateオブジェクトの作成
myDate = new Date();
// 月の取得
my_gatu = myDate.getMonth()+1;
// _root.gatu. に ○gatu を attachMovie
_root.gatu.attachMovie(my_gatu +"gatu", "obj", 0);
    • good
    • 0
この回答へのお礼

お返事ありがとうございます。
また、お礼の言葉が遅れまして申し訳ございません。
御回答の方法が希望することです。
 ライブラリにあるムービークリップシンボルは,読み込むのではなく,
 あらかじめ SWF 内にしのばせておいて(書き出しておいて),
 そのムービークリップを呼び出すという感じだと思います。
 読み込むだと,外部ファイルになりますよね。
 ライブラリのムービークリップは外部ファイルではなく,内部オブジェクトです。
ということについては、教えてくださった通りですね。そこで、追加質問させていただきたいのですが、今回の質問内容の内部オブジェクトが外部ファイル(例えば、1gatu.swfなど)であることのみ異なっていた場合、(?)の部分にどのような記述をすればよろしいですか。なお、今回の質問で名前には比較的規則性のあるものを例にしました(私の例が悪かったのです)が、(困難とか管理しにくいとか思われるかもしれませんが)呼び出される方の名前に規則性を持たせることはありません。ですので、(今回の質問の場合、御回答のスクリプトは必然的なものかもしれませんが)まとまったスクリプト(gatuには*+gatuなど)ではなく、(例えば、1gatu、nigatu、3gatsu、shigatsuなど、呼び出される方の名前に規則性のない場合の)それぞれに対応するスクリプトを1部(1gatuの場合のみ)よろしくお願いします(注文が多くて、すみません)。
いつも詳しく教えてくださりありがとうございます。

お礼日時:2006/08/16 00:56

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