火曜日, 11月 27, 2007

メニューを作るときに

Taifrogです。


最近例のホロデッキを改造中で、こもりつつ、遊びつつ、そして飲み会で酔っ払いつつ過ごしてます。


スクリプトに取り組んでる中で、ホロデッキに登録された部屋の数が多くなった場合に、llDialogで表示するメニューが1個で足りなくって、次へボタンが必要になるような状態というのを実は今まで考えてなかったということに気づきました(遅・・・)。 まあ、他の機能にばっかり目がいってたというのが正解なのですが。。。


1回のダイアログに表示できる数にも限界があるので、ページ分けしないといけないわけです。

で、そのあたりを色々考えてるうちに関数にしてみたので、特に冒険ネタもみつからなかったので、公開してみます。



1~27のリストを、この関数を使ってダイアログ表示してみたもの。 これは1ページ目。
全部で12個表示になるようにして、1個だけ次へボタン(>>)にしてあります。



これは2ページ目。 こちらも全部で12個表示のまま、うち2個を前へ、次へボタンに。

3ページ目は前へボタンだけ。






******************************
integer ONEPAGE = 12;   // 1ページ当りのボタン数
integer pagemax; // 必要なダイアログ数


/////////////////////////////////////////////////////////
//// GetPageMenu : 指定ページのボタンリストを取得する関数
//// 引数 pagenum 指定ページ
//// maxlist 全ボタンリスト
//// 戻り値    指定したページのボタンリスト
/////////////////////////////////////////////////////////
list GetPageMenu(integer pagenum, list maxlist)
{
list pagelist;
integer startp;
integer endp;
integer p;
integer maxnum = llGetListLength(maxlist);

//// 必要なページ(ダイアログ)数を計算
if(pagemax == 0) {
if( maxnum == 1 ) pagemax = 1;
else if( maxnum > 1 ) {
pagemax = llCeil(((float)maxnum - 1.0)/((float)ONEPAGE - 2.0));
if(maxnum == ((ONEPAGE * (pagemax-1)) - ((pagemax - 2) * 2))) pagemax = pagemax - 1;
}
}

//// 指定したページの最初に表示するボタン番号
startp = (ONEPAGE - 2) * (pagenum - 1) + 2;

//// 指定したページの最後に表示するボタン番号
if(startp > maxnum) return (list)[];
else if(maxnum >= startp && maxnum <= (startp + ONEPAGE - 2)) endp = maxnum;
else if(maxnum > (startp + ONEPAGE - 2)) endp = startp + ONEPAGE - 3;

//// ボタンリストを生成
pagelist = llList2List(maxlist, startp-1, endp-1);
if(pagenum == 1) pagelist = llListInsertList(pagelist, llList2List(maxlist, 0, 0), 0);
else pagelist = llListInsertList(pagelist, (list)"<<", 0); // 前へボタン追加
if(pagenum < pagelist =" llListInsertList(pagelist,">>", 2); // 次へボタン追加

return pagelist;
}
******************************



たまにはこういうの書いてもいいでしょ。

0 件のコメント: