【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?

XMLからデータを取得し、タイトルをリスト表示(5件)し、
タイトルにロールオーバーでタイトルのテキストが左に流れていく。
テキストが流れきったら、右から流れ始める。
ロールアウトでテキストは初期の場所に戻る。

以上のようなflashを作成しようとしているのですが、
悩んでいる部分があります。

テキストが流れきったかどうかの判定は、テキストのMCのX座標の位置に
よって判断しています。
テキストの長さは長いものもあれば、短いものもあります。
あらかじめ、テキストエリアの幅を長いものに合わせておくと、
テキストが流れきった後、右からまた流れ始める際に短いテキストだと
流れ始めるまで間が空いてしまいます。
テキストが流れきったら、テキストの長短に関わらず、
すぐに右から流れ始めるようにしたいのですが、良い方法などありますでしょうか。
よろしくお願いします。

環境は以下です。
FLASH CS3
ActionScript2.0

A 回答 (2件)

#1です。



#1で回答したスクリプトは,"単なる一例" ですよ。

本題は
 テキストフィールドをオートサイズにしておけば
 テキストフィールドの幅を検知できるのでそれを使えば良いでしょう。
ということだけです。
また,
 テキストフィールドをオートサイズにしておけば
 それを包むムービークリップの幅でも検知できますよ。
と付け足しているだけです。


> ロールオーバーした場合のみ流れて、
> ロールアウトすると初期状態の場所に戻るという動きの実現は、
> 現状教えていただいたところから、簡単に実現可能でしょうか。
> 申し訳ありませんが、御回答いただければ幸いです。

まず,
ロールオーバーするもの(ボタンやムービークリップ)が必要ではないでしょうか?
というかロールオーバーするものはすでに用意されているはずです。
テキストフィールドが動くのですから,
テキストフィールドにロールオーバーしたりロールアウトしたときに何か動作させるわけではないでしょう?
もしそういうことをしていたら,
テキストフィールドが逃げてロールオーバーしにくいです。

ですから
テキストフィールド以外の何かロールオーバーするものにロールオーバーしたとき,
例えば,何かの変数(フラグ)を true とかにして,
そのフラグが true の時だけ,

// 1フレーム進む時間ごとに随時実行
this.onEnterFrame = function() {
};

内が実行されるようにすればできます。
こんな形↓。

// 1フレーム進む時間ごとに随時実行
this.onEnterFrame = function() {
  // 何かのフラグがtrueの時だけ ○○ を実行
    if(何かのフラグ){
      ○○
    }
};

そして
その何かからロールアウトしたとき,
テキストフィールドのx座標を 0 か何かにすれば良いと思います。



この上で書いたも,はたとえばの一例です。

ロールオーバーしたときに,

 // 1フレーム進む時間ごとに随時実行
 this.onEnterFrame = function() {};

自体を定義して,
ロールアウトしたときに,

 delete this.onEnterFrame;

などをしてもかまわないと思います。


それに,
this.onEnterFrame で動かすこと自体も単なる例です。
たとえばモーショントゥイーンで動かしても良いわけです。
モーショントゥイーンで動かして,

 // ★ もしテキストフィールドの右端座標が 0 以下であれば
 if (_txt._x<=0-_txt._width) {
   // ★ テキストフィールドを右に移動
   _txt._x = Stage.width;
 }

ではなくて,

 // ★ もしテキストフィールドの右端座標が 0 以下であれば
 if (_txt._x<=0-_txt._width) {
   // ★ 最初のフレームに戻す
   this.gotoAndPlay(1);
 }

のようにしても良いわけです。


関係ある場所は ★ を付けた部分で,
その他は一度動かさないと現実的実体の説明ができないので,
ActionScript のみで説明しただけです。

※ココでは自分のサイトなどにリンクできません。
  つまり「こうすればいい」などのデータを提示できないのです。
  ActionScriptだけで説明しているのは,
  サンプルを作成できないココでの苦肉の伝達方法です。
    • good
    • 0

テキストフィールドの横幅は,


TextField._width で取得できます。
また,
テキストフィールドの大きさは中に表示される文字列によって可変にする設定も可能です。

可変にしておけば,
テキストが流れきったかどうかの判定は,
TextField._x <= 目標座標-TextField._width
などで判定できます。

    [<---TextField._width--->]←目標座標
    ↑
 TextField._x

新規ドキュメントを作成して,
Flash のパブリッシュ設定を ActionScript2.0 に設定して,
次のスクリプトをフレーム1にコピペし「制御」→「ムービープレビュー」すると,
上で説明したものの一例サンプルが自動で作成できます。

---------------------------------------
// テキストフィールド ttl_txt を 深度 0 の適当な場所に作成
var _txt:TextField = this.createTextField("ttl_txt", 0, 0, 20, 0, 0);

// ★テキストフィールドのサイズを可変に設定する
_txt.autoSize = true;

// タイトルを作成代入する関数 makeTitle の定義
function makeTitle():Void {
var rnd:Number = Math.floor(Math.random()*75)+5;
_txt.text = "";
for (var i:Number = 0; i<=rnd; i++) {
_txt.text += String(Math.floor(Math.random()*10));
}
}

// makeTitle の初回実行
makeTitle();

// 1フレーム進む時間ごとに随時実行
this.onEnterFrame = function() {
// ★例えばテキストフィールを10pxずつ左に移動
_txt._x -= 10;
// ★ もしテキストフィールドの右端座標が 0 以下であれば
if (_txt._x<=0-_txt._width) {
// ★ テキストフィールドを右に移動
_txt._x = Stage.width;
// makeTitle の実行
makeTitle();
}
};
------------------------------------------

関係がある部分には ★ を付けました。


ちなみに,
ムービークリップの幅も MovieClip._width で取得できます。
テキストフィールド入りMovieClipを使用するのでしたら,
MovieClip._width で同様にしても良いと思います。

この回答への補足

御回答ありがとうございます。
実現できました。
実は、もう1点お聞きしたいことがあるのですが。

現状テキストは流れ続けているわけですが、
初期状態は、テキストが静止した状態で表示されていて、
ロールオーバーした場合のみ流れて、
ロールアウトすると初期状態の場所に戻るという動きの実現は、
現状教えていただいたところから、簡単に実現可能でしょうか。
申し訳ありませんが、御回答いただければ幸いです。

補足日時:2008/07/06 17:09
    • good
    • 0

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


おすすめ情報