スクリプターズカフェ/ログ/ダイアログのボタンを左上から並べる

ページ名:スクリプターズカフェ/ログ/ダイアログのボタンを左上から並べる

Scripters_cafeログ

08/11/22[]

以前書いた並べ替えスクリプトを最適化しようということで、EhterPadを使ってリアルタイムにコラボしながらスクリプトを書き換えてみました。

9/27のコードの「要素数を3の倍数にあわせる」部分に無駄があったのと、要素の並べ替え処理は結局3個単位で行った方が早いことなどから、最終的に以下のようなコードになりました。

list pads = [ " ", " " ];list DialogButtonSort( list src ) { // 要素数を3の倍数にあわせる integer pad = ( 9999999 - llGetListLength( src ) ) % 3; if ( pad-- ) { src += llList2List( pads, 0, pad ); } // 末尾から3つずつ抽出する return llList2List( src, 9, 11 ) + llList2List( src, 6, 8 ) + llList2List( src, 3, 5 ) + llList2List( src, 0, 2 );}

要素数を3の倍数に合わせる部分は、リストの要素数は現実問題として9999999よりも小さいだろうという前提条件で成り立つコードになっています。integerの範囲であれば、もう少し大きな数字にしておいても内部的には全く同じです。

また、実際に不足分の要素を追加する処理では、不足している要素数が1か2の時にだけ要素の追加処理を行っています。



08/09/27[]

LSLからダイアログを表示する場合、表示するボタンをリスト変数で指定しますが、ダイアログにはリストで指定したボタンが左下から右上に向かって並べられます。これは直感的ではないため、左上から右下へ向かって並ぶようにあらかじめボタンのリストを並べ替えれば分かりやすくなります。


1つ目に、オーソドックスにリストの要素を1つずつ並べ替える方法です。

list dialogButtonSort1( list src ) { // 要素数を3の倍数にあわせる integer max = llGetListLength( src ); integer pad = ( -1 * max % 3 + 3 ) % 3; max += pad; while ( --pad >= 0 ) { src += " "; } // 1つずつ並べ替える。 integer i; integer target_index; list ret; for ( i = 0; i < max; ++i ) { target_index = max - 3 * ( 1 + i / 3 ) + i % 3; ret += llList2String( src, target_index ); } return ret;}

初めにリストの要素数が3の倍数になるように調整した後、元のリストの要素を意図した順に並ぶように1つずつ抽出して戻り値用のリストに追加しています。

ただ、要素は必ず3つずつのグループで並べ替えるので、llList2Listを使用して以下のようにまとめて処理すると、ループ回数を減らせます。

list dialogButtonSort2( list src ) { // 要素数を3の倍数にあわせる integer max = llGetListLength( src ); integer pad = ( -1 * max % 3 + 3 ) % 3; max += pad; while ( --pad >= 0 ) { src += " "; } // 末尾から3つずつ抽出する list ret; while ( max > 0 ) { ret += llList2List( src, max - 3, max - 1 ); max -= 3; } return ret;}

※llList2Listは、元のリストから複数の要素をリストとして抽出できます。


ところで、llList2Listはパラメータで指定するインデックスがリストの範囲外であってもエラーとはならず、うまく処理してくれるという仕様を利用すると、上のコードのように真面目にインデックスを計算する必要がなくなります。

例えばllDialogのページにあるサンプルコードでは、単純にllList2Listを固定インデックスで4回呼び出すことで、ほぼ同様の並べ替え処理を行っています。

要素が少ない場合でもllList2Listを4回呼び出すため、関数呼び出しのコストが無駄になりますが、インデックス計算を行っていない点やコードがシンプルになる点で、こちらの方法を好む方もいるかもしれません。


※今のところ要素が高々12個ですし、頻繁に呼び出される処理でもないため、※処理コストの差よりもコードのシンプルさなどを重視してもよいかもしれません。


このページのTinyURL:http://tinyurl.com/SC-DialogButton



特に記載のない限り、コミュニティのコンテンツはCC BY-SAライセンスの下で利用可能です。

シェアボタン: このページをSNSに投稿するのに便利です。


最近更新されたページ

左メニュー

メニュー 用語集&nbsp;- これはどういう意味?用語解説 Q&A&nbsp;- よくある質問、定番解説、公式サポートに関する情報 トラブル・シューティング&nbsp;- トラブル・シューティング情...

顔文字

すでに日本の文字文化の仲間入りしたグラフィックを駆使しない表現手段。これが英語と日本語で違う。基本的に英語の顔文字は横向き。最初、わからなかったのが、この2つ...

銀行業務に関する判断・事例

2008年1月22日より施行される「銀行」に関する判断事例をまとめます。これらは「参考」であり、これによって「判断」をするものではありません。個々に記載されていない背景がある場合もありますので判例とは...

都市伝説&うわさ

目次1 Rumor & urban legend1.1 セカンドライフ全人口のうち3割はボット、半数は未使用のアカウントらしぃ1.2 キャッシュはまめにクリアしたほうがよい?1.3 支払い情報がないと...

身長

意外と知られていないが、AVの身長を計れる。llGetScaleのvectorのzを使う。ただし、靴などは脱いで計ること。SL内では2m前後が普通なようで まじめに計って 160cm程度にしたとある人...

設定

Second Lifeでは、様々な設定を行うことができます。「編集」→「環境設定」か、Ctrl + Pで呼び出せます。特に記載のない限り、コミュニティのコンテンツはCC BY-SAライセンスの下で利用...

複数アカウントの管理

このページの内容は公式 Knowledge Base「Alt Account FAQ」を翻訳、一部補足したものです。内容は予告なく変更される場合があるため契約を行う際は原文を確認するようにお願いします...

英語

RL/SLを問わず、世界標準語(なのか?)。人口比率的に、普通に生活していると英語を話す機会は多い。英語chatの参考に...ねっとげーむのえいかいわ。ちなみにある人の変遷 (ある人は、高卒程度の英語...

略語

日本語ほど省略しまくる言葉もないと思っていたら英語には勝てませんでした...例えば...lollaugh over laud大笑いbrbbe right backすぐもどるhbhurry back早く...

用語集

すごい作りかけです。みなさん、御協力お願いします。SIMSL内で作成される島のこと。LSLLinden Script Languageのこと。これで、オブジェクトやアバターを操作出来る。アバターSL内...

最近の出来事

最新情報です[]パスワードの盗難事件等発生していますいので、パスワードの再確認をお願いします。 --Keiji 2007年6月17日 (日) 16:46 (UTC)特に記載のない限り、コミュニティのコ...

日本人向けSIM

ここでは、日本人向けSIM(日本人利用者が多い、日本人が運営しているSIM)を並べていきます。特に記載のない限り、コミュニティのコンテンツはCC BY-SAライセンスの下で利用可能です。...

換金

日本円 →(US$)→ L$ / L$ →(US$)→日本円といった流れで換金が可能。リンデンラボ公式LindeXのみ。その他の方法Paypal経由でサードパーティを利用。例:ANSHECHUNG.C...

太陽

太陽を動かすことも可能。SLの太陽(及び月)は動くので、明るさも当然変わる。暗くなると見えにくいため、太陽を出して明るくすることもできる。メニューバーから以下の操作でコントロール。World - Fo...

外部サイトリンク

活動の軸が外部にある関連のリンク。ニュース、技術資料、ツール、サービスなど。イン・ワールドで活動している団体の説明 HPなどはこちらではなくイン・ワールド系リンクへ記載してください。目次1 ニュース1...

基本操作

初心者講座 > 基本操作ここでは、基本操作を解説します。画面の見方[]キーボードによる操作[]カメラ操作[]特に記載のない限り、コミュニティのコンテンツはCC BY-SAライセンスの下で利用可能です。...

土地の種類・分類

目次1 土地の種類2 土地の購入2.1 メインランドで土地を購入する場合2.2 プライベート・アイランドで土地を購入する場合2.3 レンタルとは?3 その他注意事項土地の種類[]セカンドライフにおいて...

土地

SL内では土地を売買・賃貸できる自分の(または所属するグループが)土地をもつと、そこを Homeとして設定できる。(CTRL+SHIFT+Hで、すぐに帰れる場所になる)土地のプリム数の範囲内で、家など...

右クリック

パイ・メニューを開いてその人や物に対して何か行う操作。何かしたい/情報を知りたいという時は、右クリックすべし。macな人に「右クリックないんですけど…」と質問されるのは定番。Optだったかを押しながら...