Code用の拡張機能を作りました。TJS用とKAG/KAGEX用があります。今のところ以下の機能が使えます。1.シンタックスハイライトtjsのソースコードやタグを色分け表示できます。2.定義へジャンプ・定義をここに表示クラス、関数、変数やマクロの定義などにジャンプできます。この機能を使うにはctagsとctagsxを入れる必要があります。詳しくは説明書を見てください。※colorRectの定義を表示しているところ3.リファレンスパレットクラス名やタグ名からリファレンスを検索できます。4.スニペットforやfunctionなどのスニペットが使えます。吉里吉里の質問をする時は使用している吉里吉里のバージョンを最初に伝えましょう。吉里吉里といっても吉里吉里2安定版/吉里吉里2開発版と吉里吉里Zの各種バージョンで様々な違いがあります。KAG3/KAGEX2/KAGEX3などKAGのバージョンの違いがあります。これらを書かない場合、バージョンを質問し返すのが面倒なためにスルーされる確率が上がります。吉里吉里のバージョン吉里吉里を起動してCtrl+F12を押すと以下のような画面が表示されます。)」が吉里吉里のバージョンになります。自分の吉里吉里の同じ部分をコピーして送れば大体わかります。KAGのバージョンKAGのバージョンは簡単に調べる方法がありません。最後に更新されたのが5年前になるので普通は最新版だと思います。KAGとだけ分かれば十分です。KAGEXの場合は以下の3つのどこからダウンロードしたかでバージョンが変わります。kag3ex3が最新版です。自分がどれを使っているかくらいは覚えておきましょう。直矢KAGEXには既読テキストと未読テキストで色を変える機能がありません。tjsで書き換えるだけで簡単に実現できます。書き換えるのはMessageLayer.tjsの2476行目です。drawTextToLayerでテキストを描画していますが、chColorが色の設定です。ルビがある場合は2497行目でまたdrawTextToLayerを使って描画しています。この2箇所を適当に書き換えればいいです。”;}[/tjs]既読かどうかはkag.getCurrentRead()でわかります。現在のテキストが既読ならtrue、未読ならfalseになります。以下では既読なら色を0xFF0000、未読ならchColorそのままになるように変更しました。直矢アクションの実行の続きです。kag.stopActionkag.stopActionを使うと実行中のアクションを停止できます。引数に渡したオブジェクトを対象としたアクションが全て停止されます。そのオブジェクトのアクションならnowaitのアクションも含めて停止されます。{kag.stopAction(layer);});[/tjs]この例では左クリックされたらkag.stopAction(layer);を呼んでlayerを対象としたアクションを停止しています。アクションが停止されるとアクション終了時の状態になります。この例ではlayerはleft=300の状態になります。kag.stopAllActionskag.stopAllActionsを使うと実行中のアクションを全て停止できます。kag.stopActionのように対象となるオブジェクトを渡す必要はありません。{kag.stopAllActions();});[/tjs]kag.stopActionと違い、kag.stopAllActionsの場合はnowaitのアクションは停止されません。nowaitのアクションも含めて停止したい場合はkag.stopAllActions(true);のように引数にtrueを指定してください。直矢KAGEX拡張例(アクションの実行)の続きです。nowait前回はbeginActionの引数を2つしか使いませんでしたが本当は4つあります。後半の2つは省略可能なので前回は使いませんでした。第1引数はアクションの対象となるオブジェクト、第2引数はアクション定義と説明しました。第3引数には関数を指定します。その関数はアクションが終了した時に呼ばれます。その関数の引数にはアクションの対象となっていたオブジェクトが渡されます。第4引数にはtrueまたはfalseを指定します。trueに指定するとnowaitの動作になります。デフォルトではfalseです。true);[/tjs]この例では終了時にonCompletedが呼ばれるようにしています。その引数targetはアクションの対象なのでlayerになります。System.inform(target.left)ではアクション終了時のレイヤのleft座標が表示されます。beginActionの第4引数にtrueを指定しているのでこのアクションはnowait指定のアクションになります。よってページ送りなどではスキップされません。次回はアクションの停止の方法を説明します。直矢GenericFlipの機能を利用すると環境レイヤに独自の属性を追加できます。特殊な画像やエフェクトなどをtjsで描画したいときに便利です。パーティクルを表示するGFX_Particleなどが用意されています。今回は自前でGenericFlipを作成してみます。今回作成するGenericFlipは、指定された画像をインターバルごとに繰り返し表示するものです。以下がそのスクリプトとその使用例です。layerタグにswitch属性とinterval属性を追加します。interval=1000画像を表示しています。hide画像を消去しました。[/kag]実装の詳細はコメントを参照してください。GenericFlipを作る際の一般的な注意点のみ解説します。GenericFlipとして使うクラスは必ずGenericFlipクラスを継承してください。ここではImageSwitcherGenericFlipクラスをGenericFlipとして使います(10行目)。クラスを定義したら、GenericFlip.Entryを使って登録する必要があります(88行目)。登録内容は辞書で渡します。classには先ほど定義したクラス、typeにはこのクラスを呼び出すのに使う属性、optionsにはそれ以外に使う属性を配列で渡します。ここでは[layer]タグでswitch属性が使われたときに呼び出されるように登録しています。switch以外にinterval属性を使うのでそれも登録します。GenericFlipクラスとして機能させるにはいくつかの関数を実装します。flipRestoreを実装しています。それぞれフリップ開始時、フリップ実行中、フリップ停止時、セーブ時、ロード時に呼ばれます。switch属性が使われるとまずImageSwitcherGenericFlipクラスのオブジェクトが作成され、その後すぐにflipStartが呼び出されます。第1引数には登録属性(ここではswitch属性)の属性値、第2引数にその他の属性が入った辞書が渡されます。その後は停止されるまでずっとflipUpdateが呼び出され続けます。現在の時間が第1引数に渡されるのでそれに合わせてレイヤに描画すればいいです。ここで重要になるのがflipAssign()です。これはGenericFlipクラスにあらかじめ用意されている関数で、引数に渡したレイヤの内容を環境レイヤにコピーしてくれます。自前のレイヤに描画してからflipAssignを使ってコピーするのが定石です。ここでもtargetLayerに画像を読み込み、それをflipAssignでコピーしています。環境レイヤが非表示になったりするとGenericFlipは自動的に停止されます。このときに呼ばれるのがflipStopです。ここでは必ずsuper.flipStop()を呼ばなければなりません。忘れないように注意してください。flipRestoreはセーブ・ロードに対応させるために必要です。flipStoreで現在の状態を保存してflipRestoreで実行を再開できるようにしてください。まとめGenericFlipの実装手順は以下のようになります。flipRestoreを実装する・定義したクラスをGenericFlip.Entryで登録するGenericFlipはtjsを使ってレイヤに描画できます。環境レイヤに機能を追加する形なので、rotateなどの変形やcontrastなどの色調補正、その他のコマンドと組み合わせて使えます。独自のLayerを用意するよりも、可能であればGenericFlipとして描画機能を実装する方が応用がきいて便利だと思います。直矢kag.beginActionを使うとtjsからアクションを実行できます。top=300まで移動させる例です。5000,],]);[/tjs]beginActionの第一引数にはアクションの対象となるオブジェクトを指定します。第二引数にはアクション定義を渡します。アクション定義はenvinit.tjsで定義するものと同じです。topプロパティを500msかけて300まで動かすアクションになっています。アクションについてアクションをtjs的に言うと、特定のプロパティに対して自動的に値を代入していく機能です。以下の例ではプロパティpropを持つtestオブジェクトに対してアクションを実行しており、propには1000msかけて0から1000の値が代入されます。1000*/[/tjs]この例のように、Layerのleftやtopなどだけでなくプロパティであれば何でも対象にできます。上手く使えば色々と応用できると思います。アクションのさらに詳しい使い方は次回に続きます。直矢KAGEXではLayerクラスを拡張したAffineLayerクラスを利用できます。AffineLayerクラスを使うと簡単に回転や拡大縮小した画像を表示できます。以下はAffineLayerに”star.png”を読み込んで表示するだけの例です。Layerと使い方は同じなので、AffineLayerの部分をLayerに変えてもそのまま動きます。次は回転させてみる例です。afyで回転原点を設定できます。その点を中心として回転や拡大縮小などが実行されます。afx,afyは整数で設定することもできますが、あらかじめ定義された定数も使えます。使える定数は以下の様になります。topで画像の位置を設定できます。ory)と同じになります。left,topに指定した座標(回転原点)に回転原点が重なるようになります。ory)を参照してください。その他の変形プロパティrotate以外にも様々なプロパティが用意されています。以下の表に主なものをまとめます。heightなどLayerクラスと同じプロパティや関数なども利用できます。ラスター周期それぞれのプロパティはKAGEXでも同じ属性名のコマンドとして用意されています。ここで改めて機能の説明はしません。前回までkag.addTagについて紹介しましたが、似たような関数にkag.insertTag()があります。kag.addTagとkag.insertTagの違いは登録されたタグの実行される順番です。addTagでは一番最後に登録されますがinsertTagは一番最初に登録されます。triggerでコンダクタの実行を再開kag.trigger("flash_message");}[/tjs]前回のflashMessageとほぼ同じですがaddTagの代わりにinsertTagを使っています。insertTagの場合はタグが先頭に追加されていくので後から登録したものが先に実行されます。msgoffの順に登録しています。タグの機能を呼び出したいだけならkag.addTagで十分です。先に登録したものが先に実行される方がわかりやすいと思います。何か複雑な機能を作る場合にはinsertTagを使うこともありそうなので一応覚えておいた方がいいかもしれません。kag.addTagを使うとコンダクタに次のタグを登録できます。登録するだけなので[s]タグなどでコンダクタが止まっている間はタグは実行されません。以下の例では[msgoff][msgon]タグを登録していますが、コンダクタが停止しているため実行されることはありません。mode=vnコンダクタを停止します。exp=&amp;quot;flashMessage()&amp;quot;@s[/kag][click]タグを使って左クリックされた時にflashMessage()が呼ばれるように設定しています。flashMessage()は[msgoff][msgon]タグを登録する関数です。[msgoff][msgon]を連続的に実行してメッセージレイヤを点滅させようとしていますが、これでは動作しません。[s]タグでコンダクタの動作が停止されており、登録されたタグが実行されないためです。動作させるにはflashMessage()でタグを登録するだけでなくコンダクタの動作を開始しなければなりません。以下が実際に動作するように修正したスクリプトです。クリックするたびにメッセージレイヤが点滅します。mode=vnコンダクタを停止します。name=flash_message[/kag][s]タグの代わりに[waittrig]タグを使っています。このタグもコンダクタの動作を停止しますが、name属性に指定したトリガが発動されるとコンダクタの動作を再開します。この場合は”flash_message”が発動すれば動作を再開します。flashMessage()ではタグを登録してからkag.trigger(“flash_message”);としてトリガを発動します。これによってコンダクタの動作が再開され、登録したタグを順番に実行できます。最初の例と異なり、[msgoff][msgon]タグだけでなく[waittrig]タグも登録していることに注意してください。[s]や[waittrig]などのタグでコンダクタを停止しない場合は当然そのまま実行し続けます。次の行から実行されます。続きを実行したくない場合はしっかり止めるようにしてください。まとめkag.addTagを使うときはコンダクタの動作を意識するようにしてください。注意して使わないと思わぬバグの元になりかねません。WordPress.com.。