ActionScriptエディタを作りたい!

このQ&Aのポイント
  • ActionScriptエディタを作成中です。「Flash Player de ActionScript」(今閃いた仮称)。
  • テキストエディタでスクリプトを作る事が多いですが、定型句みたいなものをキーボードを叩くのが面倒です。自分で作ってしまおうと思ったのです。
  • ActionScriptのスクリプト内に特定のスクリプトを挿入するための方法はあるのでしょうか。初心者ですのでよろしくおねがいします。
回答を見る
  • ベストアンサー

ActionScriptエディタを作りたい!です…

毎度お世話になっておりますsassakunと申します。 変な回答をすることがありフォローを入れていただきありがとうございます。 Flashカテゴリでの質問は初心者です。 訳あってActionScriptエディタを作成中です。 「Flash Player de ActionScript」(今閃いた仮称)。 大した物ではないです。 テキストエディタでスクリプトを作る事が多々あるのですが,定型句みたいなものをキーボードを叩くのが面倒です。 またifをIFと書いてしまったり書き間違いが多いです。 蛇のアイコンのソフトも知っていますが,あれはFlashより使い勝手が悪い。 それなら自分で作ってしまおうと思ったのです。 TXTという変数名のダイナミックテキストエリアを作成し,あるボタンをクリックすると,そのボタンのスクリプトで  on (release) {   TXT = TXT + "ActionScript(値)"  } みたいなスクリプトで, 変数TXTにどんどんスクリプトを加算していく方法で大体はできました。 大体と言うのは自分がよく使うスクリプトの範囲内という意味です。 でも上のスクリプトだとどうしても文字列の後に,"ActionScript(値)" が付いてしまいます。 そうではなくて,  onClipEvent (load) {  | (←マウスカーソルのつもり)  } のカーソル部分に _root.stop(); などというスクリプトが入れたい場合が多々あります。 タグ挿入型HTMLエディタならぬ,Script挿入型ActionScriptエディタです。 イメージをスクリプトにするなら, on (release) {  TXT1 = TXT の1文字目からカーソルまで;  TXT2 = TXT のカーソルから最終文字まで;  TXT = TXT1 + "ActionScript(値)" + TXT2; } みたいな感じです。 これを実現するActionScript,または方法はあるのでしょうか。 そんなことも知らないのか! などと思われそうな気もしますが,ここでの質問は初心者ですのでよろしくおねがいします。

noname#35109
noname#35109
  • Flash
  • 回答数1
  • ありがとう数4

質問者が選んだベストアンサー

  • ベストアンサー
  • DPE
  • ベストアンサー率85% (666/776)
回答No.1

フォーカスに関する制御を担当する、Selection というクラス( MX 以前ではオブジェクト)があります。 テキストフィールド内にある入力カーソル(点滅している” | ”型のカーソル)の位置は Selection.getCaretIndex メソッドで、表示されている文字列は TextField クラスの text プロパティで取得できます。 text プロパティには文字列が入っているので、文字列でできることは一通り可能です。 取得したカーソルの位置を境に2つに分割し、任意の文字列を挿入してはいかがでしょう。 仮に、ステージに「テキスト入力」にしたテキストフィールドがあるとします。 入力カーソルの位置が変わる可能性があるのは  1) キー入力が行われた時  2) マウスでテキストフィールド内をクリックされた時 ですから、これらのイベントを使って監視します。 1) は Key クラスの onKeyUp 、2) はムービークリップの onMouseUp か Mouse クラスの onMouseUp イベントが利用できます。 どちらの場合も処理は同じなので、関数を1つ作り、これをイベント発生時に呼ぶ関数として登録しておくと便利です。 取得したカーソルの位置は、変数に保存しておきます。 この位置を元にテキストフィールドの内容を分割し、指定の文字列を挿入する関数を作ります。 後は、テキストを挿入する時に、挿入する文字列を引数にしてこの関数を呼ぶだけです。 スクリプトにすると、大体、次のようになります。 このスクリプトは、メインのタイムラインに設定してください。 ステージに、「テキスト入力」にしたテキストフィールド” editor ”があるものとします。 (↓各行頭に全角のスペースが入っています。コピーする際はご注意ください)  //入力カーソル位置を保持  edit_pos = 0;  /////////////////////////////////////////  //入力位置を把握する関数  /////////////////////////////////////////  function Get_InsertPosition()  {   //編集画面にフォーカスがある場合のみ、文字カーソルの位置を取得   if( Selection.getFocus() == "_level0.editor" )   {    edit_pos = Selection.getCaretIndex();   }  }  /////////////////////////////////////////  //指定の文字列を、現在の入力位置に挿入  //引数:挿入する文字列  /////////////////////////////////////////  function Insert_Text( insert_str )  {   var head , tail , org_length , insert_length;   //編集前の文字列と挿入する文字列の長さを取得   org_length = editor.text.length;   insert_length = insert_str.length;   //編集画面のテキストを、現在の入力位置で分割   head = editor.text.substring( 0 , edit_pos );   tail = editor.text.substring( edit_pos , org_length );   //指定の文字を挿入   editor.text = head + insert_str + tail;   //選択範囲を利用して入力カーソルを移動   edit_pos += insert_length;   Selection.setFocus( "editor" );   Selection.setSelection( edit_pos , edit_pos );  }  //キー入力があった時とマウスのボタンが押された時、  //入力カーソルの位置を監視  key_obj = new Object();  Key.addListener( key_obj );  key_obj.onKeyUp = Get_InsertPosition;  mouse_obj = new Object();  Mouse.addListener( mouse_obj );  mouse_obj.onMouseUp = Get_InsertPosition; Get_InsertPosition 関数では、入力カーソルの位置を getCaretIndex で取得し、この位置を変数 edit_pos に保存しています。 この関数は、キーを押して離した時と、マウスのボタンを押して離した時に呼び出されます。 Key クラスや Mouse クラスは、Key.onKeyUp = ・・・というように、クラス(のオブジェクト)に直接イベント発生時の処理を定義することができません。 これらのクラスでイベントを利用する時は、イベントの通知を代理で受け取る”リスナーオブジェクト”が必要です。 リスナーオブジェクトは汎用型である Object 型の変数を作り、これを addListener メソッドで登録します。 これらのイベントが発生するのは、テキストフィールド内でキーボードやマウスを操作した時とは限りません。例えばマウスのボタンは、スクリプトを挿入するボタンをクリックする時にも押されるので、onMouseUp イベントはこの時にも発生します。 ムービー内のボタンをクリックすると、フォーカスが外れて文字入力カーソルは消えますから、getCaretIndex の戻り値は -1 になります。 この状態で文字を挿入しようとすると、テキストフィールドに格納された文字列の分割に失敗し、テキストフィールドの先頭にしか挿入されなくなってしまいます。 そこで、イベント発生時に条件を付け、テキストフィールドが対象の時にキーまたはマウスを操作した場合、つまり、テキストフィールド” editor ”にフォーカスが当たっている時だけ、入力カーソルの位置を保存することにします。 フォーカスが当たっているインスタンスは、Selection クラスの getFocus で取得できます。 trace アクションで見てみると分かりますが、getFocus の戻り値はレベルからの絶対パスです。通常はステージは _level0 ですから、ステージにあるテキストフィールド editor にフォーカスがある時は、” _level0.editor ”という文字列が返されます。 Insert_Text は実際にテキストを挿入する関数です。 例えば” _root.stop(); ”というスクリプトを挿入するボタンでは、これを引数として  on(release)  {   Insert_Text( "_root.stop();\n" );  } というように呼び出してください。 最後の” \n ”は改行のコードで、入れておくと改行も挿入されます。 文字列を引数とするスクリプトは、  Insert_Text( "_root.gotoAndPlay( \"Start\" );\n" ); このように ¥ でつなぐと、" " の部分で切られずに関数に文字列が渡ります。 Insert_Text 関数の中でやっていることは、ご質問文にある  > TXT1 = TXT の1文字目からカーソルまで;  > TXT2 = TXT のカーソルから最終文字まで;  > TXT = TXT1 + "ActionScript(値)" + TXT2; と、全く同じことです。 入力カーソルの位置を境にしてテキストフィールドに入っている文字列を分割し、作業用変数 head に前半部分、tail に後半部分を入れて、引数で渡されてきた文字列を連結しています。 テキストエディタでは普通は、文字を挿入した分だけカーソルもずれて連続的に入力できるものですが、Flash のテキスト入力では、スクリプトで操作して文字を挿入した場合はカーソルが移動しません。 例えば、テキストフィールドの表示が  //サンプル  trace( "サンプル" );  | (↑” | ”は入力カーソルです) だとして、ここに” _root.stop(); ”をスクリプトで挿入すると、  //サンプル  trace( "サンプル" );  |_root.stop(); となり、入力位置は変わらないままです。 ざっと見た限りでは、Selection.getCaretIndex でカーソルの位置の取得はできても、任意の位置にカーソルを移動するメソッドはないようです。 Selection クラスには、指定の範囲を選択状態にする setSelection というメソッドがあります。 字数は配列と同様に0から数えますので、例えば  Selection.setSelection( 0 , 4 ); とすると、フォーカスの当たっているテキストフィールドの最初から5文字までが選択された状態になります。 この時、入力位置を表すカーソルは5文字目(インデックス値では4)の位置に移動しています。 Insert_Text 関数内ではこの特徴を利用して、擬似的にカーソルを進めています。 setSelection は、フォーカスの当たっているテキストフィールドでなければ何も起こりません。 Insert_Text 関数が呼び出されるのは、スクリプトを挿入するボタンをクリックした時などです。 ボタンをクリックした時点で editor はフォーカスを失っていますから、setFocus で再度 editor にフォーカスを与えています。 --------------------------------------------------------- ご承知の上だとは思いますが。 Flash は、本格的なアプリケーションを作ることが目的のソフトではありません。 ActionScript でも、指定された位置に文字を挿入するくらいのことであれば、まあ、一応はできるという程度です。 エディタの機能を付け足していこうとすると、どうしても、弱い部分が目立ってきます。 例えば、テキストフィールドの都合上、文字を挿入する位置によっては挿入した文字が上に送られて見えなくなってしまうことがあり、これはエディタとしては使いにくいです。 テキストフィールドや変数内に作ったスクリプトはただの文字列で、スクリプトとして機能はしません。SharedObject に書き出して保存することはできても、SharedObject の内容を他のムービーに読み込んでも文字列として扱われるだけです。 テキストファイルに書き出せるなら、外部ファイルとして #include で組み込む手もありますが、Flash 単体ではファイル出力は無理です。 編集したものを有効な形式で保存できないのは、エディタとしては致命的な欠陥です。 テキストフィールドの内容をコピーして他の FLA ファイルに貼り付けるくらいなら、最初から「アクション」パネルで編集した方が早くて確実です。 エディタはスクリプトの勉強としては面白い題材ですが、実用レベルのものを作るとなると、Flash ではかえって難関が多く、難しいのではないでしょうか。

noname#35109
質問者

お礼

ありがとうございましたーーーー! 無事動き,9割方理解できました。 イベントを発生させるのに, フレームアクションか,ボタンやムービークリップの onイベントパンドラ しかほとんど使ったことが無かったで勉強になりました。 また,カーソル位置の移動まで配慮したスクリプトを考案してくださって感謝感謝です。 改行コードの挿入位置に関しては,色々な場合があるので,ずっと迷っているのですが, カーソルの後に改行コードがなければ,自動で改行を挿入みたいにしようかなと今は考えています。 さらに色々な条件分岐が必要かもしれません。 これで,日頃使わないスクリプトもどんどん入れたくなってきました。 スクリプトの意味がわからなくても,文字列を挿入すれば良いだけですから,同じ作業で作り続けられます。 現在インターフェイスを少々凝っても,現在ほんの数十KBのSWFファイルです。 フロッピーにでも楽々入って持ち運びにも便利。 Flashプレーヤーすら入れていないPCで使うために,プロジェクタにしたとしても1MB少々。 書いてくださったスクリプトはMXでも使用可能でしたから,MXでプロジェクタにすると1MBは切ります。 これで快適なFlash生活が送れそうです。 あとは,自動フォーマット(インデント)機能とエラーチェック機能を追加すれば完璧! 自動フォーマットは,じっくり考えればできるような気がします。 エラーチェックは例えば, 「スクリプトに全角空白が入っていないか。」とか 「"{" の数と "}" の数は等しいか。」 などできるところからしていけばある程度はできるような気もします。完全には無理でしょうけど。 今のところ,この2つの機能はあってもなくても良いので,後の研究課題とします。  おかげさまで,自分が使う範囲での実用化の目星はつきましたーーー! (そのうちフリーソフトとしてなら出せるかも…。)

noname#35109
質問者

補足

(補足に書いていますが補足ではなく,お礼の第1弾です。) オー! さすがDPEさん。スゴイ…。 これで,また一儲けができる~~! やっぱりFlashはおいしいソフトだ~~!! というのは冗談です。 これを使用することで儲けることはできても,これ自体で儲けるのは,ご指摘通り不可能だと思います。 しかし,そんな方法があるのですね。 ボタンをクリックすると同時にテキストエリアからフォーカスがなくなるので, これは不可能かなと思っていました。 スクリプトを挿入したい部分に,Flashではあまり使わない $ マークでも入れて, ボタンをクリックしたとき,その $ を "スクリプト(文字列)" で置換しようかなどと考えていました。 でもこれでは,すごく使い勝手が悪いです。 >> 編集したものを有効な形式で保存できないのは、 >> エディタとしては致命的な欠陥です。 おっしゃる通りです。 Flashで作るソフトの最大の弱点だと思っています。 でもそれができないところが,逆にFlashの良さですよね。 安心してFlashプレーヤーをインストールできて,安心してサイトが閲覧できる。 >> エディタはスクリプトの勉強としては面白い題材ですが、 >> 実用レベルのものを作るとなると、 >> Flash ではかえって難関が多く、難しいのではないでしょうか。 いえいえ,提示していただいた回答を元に本当に実用に使うつもりですよ。個人的に。 本当に回答してくださって感謝しております。 つまりはライセンスの問題です。 いつでも,どのPCからでもFlashを使える環境にないのです。 で,ふとひらめいたことを紙に書くか,メモ帳などテキストエディタなどに書くのですが, 綴りなどをよく間違えるのです。 で,思いも寄らないところにエラーの根源があったりするので,困っていたわけです。 まだ,回答して頂いたものは実際にしておりません。 ちゃんと理解して,実際にしてから,あらためてちゃんとしたお礼を書きます。 あと,質問で,ダイナミックテキストエリアと書きましたのは間違いで,テキスト入力のテキストフィールドです。失礼しました。

関連するQ&A

  • FlashのActionScriptのエラー

    かなり基本的なことだと思うのですが、煮詰まってるので教えてください。 ActionScriptのチェックを掛けると「on/onClickEventハンドラ内でなくてはいけません」とのエラーがでます。 スクリプトはボタンの中に、 on(click) { with(_parent){ priceTotal_txt.text = Number (price1_txt.text) + Number (price2_txt.text) + Number (price3_txt.text); } }; と記載しています。 まだまだ意味が分からない事が多いので教えてください。

  • ActionScriptとphpの連携について

    ActionScriptとphpの連携について質問があります ActionScriptで受け取った値をphpに送り、その値をphp(htmlに埋め込み)で表示させたいと考えています。 動作としましては、 ・あらかじめテキストボックスに文字列が入力されている ・ボタンをクリックする ・別ウィンドウが出現(getURLでphpファイルを表示)テキストボックスに入力されていた文字列が表示される ・phpのファイルでラジオボタンで項目を選択し送信ボタンを押す ・MySQLに接続、ActionScriptで受け取った値とラジオボタンで受け取った値をまとめてデータベースに保存 というものにしたいです。 ボタンをクリックするまではすべてFlashで実現させています。 Flash→php→Flashという流れで値を表示させる方法はわかるのですが、Flash→phpで表示させることは可能でしょうか もし可能であれば、どのように実現したらよろしいでしょうか 現在はLoadVarsクラスのLoadVars.sendAndLoad()を使っています ActionScriptは2.0です 至らないところもございますが、素早い回答をお願いいたします

    • ベストアンサー
    • Flash
  • ActionScript3.0のスクリプトの書き方

    Flash CS5を使ってWebページへのリンクボタンをつくりました。on (press)状態でリンクさせたいのですが、ActionScript3.0でのスクリプトの書き出し方がわかりません。よろしくお願いします。

  • actionscript

    FLASHを作成してますが、actionscriptでつまずいています。 シーンが1~5まであるFLASHで、 添付の画像のようなものです。 シーン2が 左のメニュー一覧はムービークリップになっていて、 その中にボタンがある状態(入れ子?)です。 ボタンをクリックするとシーン1の先頭に飛ぶようにしたくて on (release) { this._parent._parent.gotoAndStop("シーン 1","1"); } と書きましたがうまくいきません。 詳しい方いましたら教えてください

    • ベストアンサー
    • Flash
  • Flashでボタンをつくっているのですが、actionscriptをつ

    Flashでボタンをつくっているのですが、actionscriptをつかってボタンをクリックさせたいのですが、アクションパネルのところに「現在の選択範囲にアクションを割り当てることはできません。」と表示されてしまいます。 参考書に附属されているflaをみたところ、Actionscript1.0、2.0となっているのですが、作成しているのはActionscript3.0で作っています。 ====== on (release) { /*↑ボタンが押されて離されたら*/ _parent.gotoAndPlay("about"); /*↑「about」ラベルへ移動*/ } ====== このようなscriptをいれたいのですが、うまくいきません。 ムービークリップでボタンを作るまではできました。その後、何かが抜けているのかして上記のようなエラーがでます。 flash初心者のため、どういう風に書いて質問させていただいたらよいのかわからないのですが、参考flaと見比べたときに「シンボル定義」のなかにあるムービークリップがひとつたりませんでした。(このムービークリップは「navigation」というものですのでそれがありません。) 質問するにはあまりにも情報が少ないかもわかりませんが、何卒ご教授いただけると大変助かります。 宜しくお願い致します。

    • ベストアンサー
    • Flash
  • ActionScriptを印刷

    ActionScript 初心者です。 Flash MX2004 を使ってActionScript でプログラムしています。 ActionScript の部分だけをまとめて印刷したいのですが、 便利な方法はありますか? 今は一つずつテキストエディタにコピーペーストしています。 専門家の方お願いします。

  • FlashのActionScriptでjavascript?

    質問するカテゴリーがここであっているのかよくわかりませんが、よろしくお願いします。 Flashの短い動きがあった後、一部をクリックすると新しいウィンドウが開くようになっています。 今回、そのリンク先を変えてくれとの依頼がきました。 そのクリックする部分のActionScriptをみたところ、 on (release){ getUrl("javascript:OpenNewWindow(3)"); } となっていました。 これはジャバスクリプトを読んでいるということなのでしょうか? もしそうなら、そのジャバスクリプト自体にはどうすればたどりつけますか?

    • ベストアンサー
    • Flash
  • javascriptでFLASHのActionScriptを制御できるのでしょうか?

    いつもお世話になっております。 表題の通り、MacromediaのFLASH MXでWebのデザインをしております あるぺーじでアクションスクリプトを利用し サウンドをループさせて再生しております、 (このページをA.htmとします) Aのページにリンク(javascriptのopen.windowで)貼っていて 新しいウィンドウ(B.htm)が開いたら(アクティブになったら)Aのループサウンドを停止させ、Bが閉じられて再びAがアクティブになったらサウンドを再生させることは出来るのでしょうか? 現在のアクションスクリプトは下記の通りです --------フレーム1のアクション------------------- ongaku = new Sound(); ongaku.attachSound("voice"); ongaku,start(0,999); ------------------------------------------------- また、ボタンがクリックされたら停止するようにしていますので そのボタンアクションは以下の通りです ------------ボタンアクション--------------------- on (release) { if (dengen <> "ON"){ dengen = "ON"; ongaku.start(0,999); } else { dengen = "OFF"; ongaku.stop(); } } ------------------------------------------------ ボタンは、ダイナミックテキストの値を参照して サウンドが再生されてたり止まったりするようにしました。 フレームでの再生によるムービーなら javascriptでストップさせたりプレイさせたり出来るのは知っているのですが。 javascriptでactionScriptを制御できるのでしょうか? ご多忙中とは存じますが、宜しくお願いいたします。

  • ActionScript3.0がわからない!

    ActionScript3.0がわからない! FlashCS4でアクションスクリプトを使ってボタンにアクションをつけたいです。 けど今までの方法が使えなくなっているのに愕然としました。 従来では、ボタンを作成しシーン上に配置した後ボタンを選択。右クリックから「アクション」を選択し、 on(release){getURL("http://okwave.jp/")} と書いておけばボタンを押したらリンク先に飛んでくれたのに、3.0ではボタン自体にアクションがつけれなくなっているではありませんか!! この時点で、もうお手上げ状態になっちゃいました。参考書読んでも訳わからんって感じです。どなたか、僕に教えてください。ボタンにアクションを与える方法を!

    • ベストアンサー
    • Flash
  • ActionScript3から過去のActionScript2に移りたいのです

    2ヶ月ぐらい前にFlash CS3で参考書を見ながらActionScript3を始めたのですがソースを見れば大体は理解できるようになりましたが参考書に出てきた所以外の部分だと自分の頭が悪く理解や応用ができずに現在は心が折れてしまいました。 ただ自分の目標としているオリジナルゲームは作りたいのでActionScript3よりも過去のActionScript2の方が簡単だった、という文章をネットで見かけたのと私の求めているようなソースがActionScript2の物が多いという理由で過去のActionScript2の方を覚えようと思いました。 そこで本題なのですが現在「FLASH ActionScriptバイブル」を買おうと思っています。 Wikipediaで調べた所 ActionScript1はFlash 5~Flash MX ActionScript2はFlash MX 2004~Flash 8 上記のようになっていたのです。 私はActionScript2を学びたいのですが「FLASH ActionScriptバイブル」は「Macromedia Flash 5日本語版を最大限に生かすスクリプト言語」と書いているのでActionScript1って事ですよね?。 これはActionScript2を学びたい者には買っても意味がないのでしょうか?(これ以外にもActionScript1の本を買ってもActionScript2を学ぶ私には無駄になりますでしょうか?)。 それとも買っても問題ないのでしょうか?。

    • ベストアンサー
    • Flash

専門家に質問してみよう