「ほっ」と。キャンペーン
カテゴリ:Flash/ActionScript( 9 )
(Flash Lite)テキストの横スクロール方法
Flash Lite 1.1 で右から左にスクロールするテキスト(IEの MARQUEE タグみたいなもの)を作ってみました。(内容は今まで小ネタで出してきたものも含んでます)
これが結構苦労したんですよね。。。

イメージとしてはケータイで au Style やトップページ表示したときにカーソルがボタンオーバーした時だけ背景色とテキスト色変えてスクロールさすというものです。

ターゲットパスの構成としては _root → Button → MovieClip → ダイナミックテキスト てな感じにしてます。

なお、ボタンにインスタンス名が使えない Flash Lite 1.1 では一つのムービークリップを複数のインスタンスで共有化することができないので、表示する個数分用意します。(ボタンも同じ)

・ムービークリップ側
まず、ムービークリップ側の実装です。
1フレーム目にダイナミックテキストを配置します。
このダイナミックテキストの変数名を txt_linkScroll とします。

そして、1フレーム目のアクションを下記のように記述。
//ダイナミックテキストに表示する文字列代入
txt_linkScroll = _root.strLink0 ;
 
//フラグが立っている時だけスクロールする。フラグがtrueになるのはカーソルオーバー時のみ
if ( _root.linkScrollFlg0 == true ){
//画面内に収まるなら何もしない
if ( mblength( txt_linkScroll ) <= 14 ){
stop();
}
//1文字何ピクセル? 文字列の末尾が画面左端に来た時にまた右端に戻すためのタイミング調整に必要
//ダイナミックテキストは16ptのデバイスフォント
//scrlCntはフラグ。フォーカス当たってからの初回のスクロールか、2位回目以降のスクロールか
if (scrlCnt < 1 ){
charPx = 17;
}else{
charPx = 30;
}
 
//スクロール量
scrollpx = 3;

//何回目か
iCnt++ ;

//文字列長のピクセル分スクロールしたっぽいなら位置リセット。
if ( iCnt * scrollpx > mblength( txt_linkScroll ) * charPx ){
iCnt = -8 ;
setProperty( "" , _x , 240 ); //ムービークリップの位置を左端に。
scrlCnt = 1;
}

//左へスクロール
setProperty( "" , _x, getProperty( "" , _x) - scrollpx);

 
}else{
scrlCnt = 0;
}
 
2フレーム目にはenterFrameイベントの代用として1フレーム目にループするようにします。
 
//enterFrame イベントの代用
gotoAndPlay(1);


・ボタン側
↑で作ったムービークリップをボタンに配置します。
今回カーソルオーバー時に背景に色付けて、文字色を白にしたいので、アップとオーバーは別のキーフレームにします。
オーバーのフレームで配置したムービークリップを選択し、プロパティから「カラー」で「着色」を選択し、文字色を決めます。
背景色は別レイヤーを作り、短径ツールで適当に作ります。


・シーン側(呼び方あってるんかな? 要はルートのムービークリップのことです)
シーンにボタンを配置し、ボタンアクションに下記のようにスクリプト書きます。
要はスクロールさすかどうかのフラグの状態を決めてるだけです。
//フォーカス受け取った時
on(rollOver) {
//スクロール開始
_root.linkScrollFlg0 = true;
}
 
//フォーカス抜けた時
on(rollOut){
//スクロール停止
_root.linkScrollFlg0 = false;
}
 
//ボタン押下時
on(press){
getURL( _root.strLink0Url );
}


あと、1フレーム目のアクションスクリプトにフラグ関係の変数を定義しときます。
_focusrect = false ;//ボタンフォーカスを消す
_root.strLink0 = "スクロールテストテキストスクロールテストテキスト";
_root.strLink0Url = "http://jehupc.exblog.jp";
//スクロールリンクテキストのスクロールするか否かのフラグ定義(5つボタン要した場合ね)
for ( i = 0 ; i<5; i++){
eval("_root.linkScrollFlg" add i ) = false;
}


基本的にはこれで横スクロールテキストは完成するんですが、一つ問題が。。
それはムービークリップ自体をx方向に移動させてるため、横方向いっぱいになってしまうということです。つまり、スクロールエリアは Y:20px~200px までということができないのです。

かなり悩んだあげく強硬手段でこの問題を解決することにしました。
それは、背景絵を用意し、スクロールエリアとするところだけ切り抜いて、スクロールボタンよりも上のレイヤーに配置するというものです。
これだと、スクロールエリアをはみでることはありませんが、作るのとメンテが入った時が厄介です。

無理やりな手段使ってますが、一応こんな感じで実装させてみました。
[PR]
by jehoshaphat | 2009-09-03 22:26 | Flash/ActionScript | Trackback | Comments(0)
(Flash Lite)ボタン押下時のイベントハンドラにやられた

Flash Lite 1.1 の話。
ボタンを幾つか用意して、あるボタンを押すと任意のURLを開くっていう極々一般的なことをしようと思ってます。

で、ネットでケータイ用のイベントハンドラ探して、ボタンのインスタンスに書いたのは下記のようなコードです。
//ボタン1のイベントハンドラ
on(keyPress "<Enter>") {
getURL( "http://jehupc.exblog.jp/" );
}
//ボタン2のイベントハンドラ
on(keyPress "<Enter>") {
getURL( "http://www.google.com" );
}

これで実行すると、ボタン2を押下しても、ボタン1のイベントが走ってしまうのです。


で、かなり悩んだ挙句見つけたのが、サンデープログラマーのメモ: keyPress"ボタン番号"についてです。

ここで、on(keyPress"ボタン番号"){}はそのボタンにフォーカスがなくてもボタンを押せば反応するという記述が。。。

試しに、Device Cetral でswf起動してどこのボタンにもフォーカスが当たってない状態で決定ボタン押下するとボタン1のイベントハンドラが動いてます。

ここでピンときて、各ボタンインスタンスに書いてた on(keyPress"ボタン番号"){} を全てのけて、代わりに on(press){} を書くと案の定、要件どおりに動きました。
普通の Flash と同じようにあるボタンで決定キー押下した時の処理は on(press){} で書いてやればよかったんですね。

で、on(keyPress"ボタン番号"){} はフォーカスない時に制御するもんだから、基本的に1つだけ実装するということもわかりました。

最初に on(keyPress"ボタン番号"){} を書いてしまったが故にこの問題解決するのに相当時間がかかってしまいました。。。
(なので on(keyPress"ボタン番号"){} の方法でメニューとか実装しようとすると、1つのボタンだけ on(keyPress"ボタン番号"){} 実装し、後のメニューボタンは今どのボタンにフォーカスがあるっていうのをグローバル変数とかに入れて、on(keyPress"ボタン番号"){}実行時に if や switch で振り分けるという作りにしないと行けないということです。)

後、これも不思議な仕様ですが、on(keyPress"ボタン番号"){} 書いてると、on(press){} は動かないんですね。。。


参考:
Adobe:ボタンイベントの処理
[PR]
by jehoshaphat | 2009-09-01 23:37 | Flash/ActionScript | Trackback | Comments(0)
(Flash Lite)ボタンでマウスオーバー時にダイナミックテキストの色を変更したい
今回の要件は、Flash Lite 1.1 でボタンのマウスオーバー時にボタン内にあるダイナミックテキストの表示色を変更したいというものです。
さらに、ダイナミックテキストは変数を使って任意のタイミングで変更できるようにします。

ダイナミックテキストの文字列は変数で簡単に変更できますが、色とかその他のプロパティは難しいみたいですね。

いろいろ方法はあると思うんですが、3流PGが採用したのは下記の方法です。

1.ムービークリップを作成し、その中にダイナミックテキストを配置(変数を指定しておく)。
2.クリップの1フレーム目にダイナミックテキストを変更する処理を入れる。(例: txt=_root.tst01; とか)
3.↑で作成したムービークリップをボタンのアップとオーバー、ダウンフレームに配置。
4.オーバーフレームで、配置したムービークリップを選択し、プロパティから「カラー」で「着色」を選択し、色を決める。

動的にカラーを変更することはできませんが、あらかじめオーバー時はこの色にするってきまってる場合は使えます。


他にもカラー毎にムービークリップを作成し、同じ変数名にして、それらを違うフレームに配置し gotoAndStop でアクセスするという方法がOKWave:ActionScript(携帯)についてに書かれてました。
[PR]
by jehoshaphat | 2009-09-01 23:35 | Flash/ActionScript | Trackback | Comments(0)
(Flash Lite)onClipEvent(enterFrame)がない
普通、Flash でフレーム毎に処理したい時は下記のように enterFrame イベントを使います。
onClipEvent(enterFrame){
//フレーム毎の処理
}


しかし、Flash Lite 1.1 では enterFrame イベントがサポートされてません。
んじゃ、どやってフレーム毎の処理すりゃええんじゃということになりますが、下記のようにフレームをループさせればいいようです。

1フレーム目に、ムービークリップおいて、フレーム毎に処理する ActionScript を書く。
2フレーム目に、gotoAndPlay(1); で1フレーム目に戻るようにする。

これでループとなるので、onClipEvent (enterFrame) とほとんど同じ事が実現可能となります。

参考:
教えて!goo:Flash Lite1.1ではonClipEvent(enterFrame)が使えません。ではどうすれば?
1ka2ka.com:Flash Lite 1.1 の基本が分かる8つのポイント
[PR]
by jehoshaphat | 2009-09-01 18:07 | Flash/ActionScript | Trackback | Comments(0)
(Flash Lite)動的メニューを作るために外部ファイル読み込もうとしたけど。。。
Flah Lite 1.1の話。
今回動的なメニューを作ろうと思い、メニューに表示する文字列を定義したテキストファイルを用意し、それを最初に読み込んでダイナミックテキスト変数に代入ってことを考えました。

で、外部テキストファイルの読み込みは loadVariables() 関数で出来るっぽいです。
コードはこんな感じです。
loadVariables("linkString.txt", _root);


テキストファイルの中身はこんな感じです。
strLink0=メニュー1の文字列&strLink1=メニュー2の文字列&strLink2=メニュー3の文字列

で、ちゃんと読めたかどうかを確認するためのコード。(Flash Lite 1.1では配列をサポートしてないので、変数名末尾に数値を加えて仮想配列とするといいらしいです。参考:配列 Array 代用)
for ( i = 0 ; i<3; i++){
trace( eval("strLink" add i ) );
}

最初に読み込ませたいためこれらのコードを _root のムービークリップの1フレーム目に書いて動かしてみたんですが、全然読み込まれている気配がありません。
で、いろいろ調べてるとほとんどの機種の携帯ではキーイベントが無いと loadVariables() が走らないようにしてるようです。
これは、swf再生しただけでユーザーが自動的に携帯情報などを取得されないようするための仕様のようですが、非常にうっとしいです。

今回は初期表示のメニュー内容を動的に変えたいのに、ユーザーのキー操作が無いとダメだったら意味ないですね。
ということで、結局swf内部にテキスト埋め込むことしかできないという結論に至りました。
(auのトップページとか Flash Lite でニュースのヘッドライン表示してるんですが、どうやって動的に変えてるんでしょうね。。。非常に疑問です。)

参考:
Adobe Flash Liteリファレンス: loadVariables():
TUNK(タンク):【FlashLite1.1】Flash Lite 1.1における外部データ読み込み

FLASHで遊ぼう!: Lite1.1:3.外部のテキストファイルを読み込む:

KDDI au: Flashコンテンツ > 技術情報
[PR]
by jehoshaphat | 2009-09-01 18:06 | Flash/ActionScript | Trackback | Comments(0)
(Flash Lite)クリップアクションが使えない
Flash Lite 1.1 でボタンを配置して、オーバーフレームにとあるムービークリップを置いて、そのムービークリップに対してムービークリップアクションを書いてみたんですが、全然動いてる風に見えません。

で、調べてみると、「Flash4のActionScriptでは,クリップアクションが使用できないため,...」というのを見つけました。
Flash4 ベースの Flash Lite 1.1 ではクリップアクションが記述できないんですね。
ムービークリップ内のフレームアクションに書いてもいいんですが、そうするとインスタンス毎に違う処理をさせたい時にシンボルをインスタンス数分作らないと行けないので、部品の共通化ができなくなるんですよね。。。
まぁ仕方ないか。。。
[PR]
by jehoshaphat | 2009-08-31 17:02 | Flash/ActionScript | Trackback | Comments(0)
(Flash Lite)インスタンス名使えないから各オブジェクト状態変更はフレームで。。。
今回したいこと:ボタンにマウスオーバーしたら、そのボタンに対応したバナーや説明を表示したい。

インスタンス名が使えたら、on(rollOver){} イベントハンドラで、特定のインスタンスの中のオブジェクトを変更させてやろうと思ったんですが、それが難しいみたいなんで、タイムラインのフレームにそれぞれバナー表示したフレームや説明用吹き出しを表示したフレームを定義して、マウスオーバーしたらそのフレームに飛ばすようにしました。

要は、あるイベント後の状態を全てフレームで表現さすということです。
あんまりきれいなやり方じゃないんで好きではないですが、Flash Lite 1.1 の仕様が厳しいため、仕方ない。。

参考にしたは、 ケータイFlash ラボ!!:ランダムで画像を変える方法です。
ここでは、各フレームにランダムに表示したい画像を置いて、乱数の結果をもとにそのフレームに飛ばすというものみたいです。
[PR]
by jehoshaphat | 2009-08-26 04:33 | Flash/ActionScript | Trackback | Comments(0)
(Flash Lite)1.1ではインスタンス名がつけれない?

ボタンのシンボルを作成し、その中にダイナミックテキストを配置して、1フレーム目でそれぞれのボタンインスタンス内のダイナミックテキストを変更させることで、一つのシンボルで、複数のボタンを作ろうと思ってたんですが、Flash Liste 1.1 はどうやらインスタンス名が指定できないようです。

かといって、シンボル内のダイナミックテキストに割り当てた変数を使って、文字列を代入すると、そのシンボルから生成されたボタン全てが同じ文字列が入ってしまいます。

仕方ないので、ボタン毎にシンボルをつくことにしました。
部品の汎用化という点からは反しますが、仕方ないです。。
なんか、いい方法無いでしょうかね。。。

追記(2009/8/31):
どうやらムービークリップにはインスタンス名を付けることができ、それを使ってクリップ内のオブジェクトにアクセスできるようです。
例えば mc というインスタンス名のムービークリップがあって、その中に txt という変数名を持つダイナミックテキストがあった場合、 _root.mc.txt に文字列を代入することで、ダイナミックテキストの文字列を変更できるようです。

ただ、ボタンにインスタンス名はつけれないので、ボタン内のアップやオーバーフレームにムービークリップ配置して、インスタンス名つけてもボタン内ではムービークリップインスタンス名はサポートされないみたいですね。
ボタン内にインスタンス名付きで配置したムービークリップのフレームアクションに下記のスクリプトを書いてみました。
trace( getProperty("" , _name) );

出力されたのは instance8 というもので、設定したインスタンス名は返ってきませんでした。
後、ターゲットパスも下記スクリプトで取ってみましたが、やはりボタンとその中のムービークリップということでこちらで設定した名前は返ってこないっぽいです。
trace( getProperty("" , _target) );
 
出力の結果:/instance6/instance8

つまり、ボタンの中に入ったムービークリップを含むオブジェクトは外のスクリプトから操作不能ということです。
[PR]
by jehoshaphat | 2009-08-26 04:32 | Flash/ActionScript | Trackback | Comments(0)
(Flash Lite)フォーカスの黄色枠を除ける
なぜかケータイ向けのwebで Flash Lite 1.1 でのテスト開発が始まりました。
数年ぶりの Flash で悪戦苦闘中です。

で、本題ですが、ボタンにロールオーバーすると、黄色の枠がついてしまいます。
こんな感じです。
e0091163_4303848.jpg


で、ケータイFlash ラボ!!:携帯向けFlashの作り方 フォーカス(ボタン枠)を外すには?に枠を除けるためのコードがありました。
_focusrect = false ;

この ActionScript を1フレーム目に入れるといいようです。
[PR]
by jehoshaphat | 2009-08-26 04:30 | Flash/ActionScript | Trackback | Comments(2)