UI関連 ボタンを作った様に見せる


以前、MAXにはUIをスクリプト上で作ることは出来ないと言った

http://www.sakaiden.com/?p=4902

理由は明快で
Maxスクリプトの場合は
UIとは事前に宣言されていなければならない
つまり、情報として約束されていないと成り立たない
MayaのMEL場合
UIもオブジェクトなので
UI内にボタンであるオブジェクトが増えるのは当然の話だな

そもそも、UIを作るって事自体が
オブジェクト化されてるって、言っていいのかな?
(んー、独学なので知らん・・・)

まぁ、簡単なはなし、Maxはムリ、MayaOK
ちなみに、SIはその辺り柔軟だからOKだと思う

SIって使用者が少ないだけで
Maya以上にポテンシャルが高いと思うよ

では、本題、
MaxでUIを作るには
ここで、古典的な方法を思いついた

作れないのなら事前に作っておけばいい

正味、ごまかしと言って良いが

見えなければ良い

ので
不便するとすれば、作った数に限界があったり
動作に制限があるところだろうな

と、偉ぶってもたいしたことはしていない
単に作ったUIの位置を移動しているだけだ
子供だまし
これがスクリプトだ

[as3]

/*******************************************************
System J Tools
********************************************************
Name:makeFakeUI
Created By:CaptainHansode
WEB:www.sakaiden.com
E-Mail:sakaiden@live.jp
Max version 2010JP more
*******************************************************/

–スクリプトエディタで開いたらctrl+Eのショートカットで実行してね

(
———————————————————————————————————–
— グローバル周り
———————————————————————————————————–
–ロールアウト用
global makeFakeUI_rol
–Version etc
Local nameAndVersion = “UIをつくる”
Local lastUpDateStr = “2011.10.16”

–ボタンが何個作られているのか?
Local howManyBt = 0;

———————————————————————————————————–
— ロールアウト周り
———————————————————————————————————–
try(cui.FloatDialogBar makeFakeUI_rol)catch()
try(cui.unRegisterDialogBar makeFakeUI_rol)catch()
try(closeRolloutFloater makeFakeUI_rol) catch()
try(destroydialog makeFakeUI_rol)catch()
———————————————————————————————————–
–メニュー
———————————————————————————————————–
–////////////////////////////////////////////////
–メニュー
–////////////////////////////////////////////////
rcMenu hiderMenuBar
(

subMenu “ヘルプ”
(
menuItem helpMi “ヘルプ”
menuItem aboutMi “About”
menuItem emailMi “E-Mail”
)–end

–////////////////////////////////////////////////
–アクション
–////////////////////////////////////////////////
on closeMi  picked do
(
try(cui.unRegisterDialogBar makeFakeUI_rol)catch()
try(closeRolloutFloater makeFakeUI_rol) catch()
try(destroydialog makeFakeUI_rol)catch()
)
on savePoseFileMi picked do makeFakeUI_rol.save_Fn makeFakeUI_rol.faceListActiveX
on loadPoseFileMi picked do makeFakeUI_rol.load_Fn makeFakeUI_rol.faceListActiveX
on helpMi picked do shellLaunch “http://www.sakaiden.com/?page_id=1031” “”
on aboutMi picked do messageBox (makeFakeUI_rol.about_Fn()) title:”About”
on emailMi picked do shellLaunch “mailTo:sakaiden@live.jp” “”

–メニューを開くたびに実行されるアップデート
on hiderMenuBar update do
(
)–end
);–rcMenu end

———————————————————————————————————–
— メイン Rollout
———————————————————————————————————–
rollout makeFakeUI_rol nameAndVersion width:144 height:320;
(

button makeUIBt “ボタンを作成” pos:[8,8] width:88 height:24;
button delUIBt “ボタンを削除” pos:[8,272] width:88 height:24;

–見えないところに大量にボタンを作っておく
button btn01 “Button01” pos:[-50,-50] width:88 height:24
button btn02 “Button02” pos:[-50,-50] width:88 height:24
button btn03 “Button03” pos:[-50,-50] width:88 height:24
button btn04 “Button04” pos:[-50,-50] width:88 height:24
button btn05 “Button05” pos:[-50,-50] width:88 height:24
button btn06 “Button06” pos:[-50,-50] width:88 height:24
button btn07 “Button07” pos:[-50,-50] width:88 height:24
button btn08 “Button08” pos:[-50,-50] width:88 height:24
button btn09 “Button09” pos:[-50,-50] width:88 height:24

———————————————————————————————————–
— アクション
———————————————————————————————————–
–////////////////////////////////////////////////
–編集
–////////////////////////////////////////////////
on makeUIBt pressed do
(
–押すたびに見えないところのボタンを移動する
–作った数が9個を超えているか?
if (howManyBt < 8) then
(
if (howManyBt == 0) do btn01.pos =  [8,makeUIBt.pos[2]+((howManyBt+1)*24)];
if (howManyBt == 1) do btn02.pos =  [8,makeUIBt.pos[2]+((howManyBt+1)*24)];
if (howManyBt == 2) do btn03.pos =  [8,makeUIBt.pos[2]+((howManyBt+1)*24)];
if (howManyBt == 3) do btn04.pos =  [8,makeUIBt.pos[2]+((howManyBt+1)*24)];
if (howManyBt == 4) do btn05.pos =  [8,makeUIBt.pos[2]+((howManyBt+1)*24)];
if (howManyBt == 5) do btn06.pos =  [8,makeUIBt.pos[2]+((howManyBt+1)*24)];
if (howManyBt == 6) do btn07.pos =  [8,makeUIBt.pos[2]+((howManyBt+1)*24)];
if (howManyBt == 7) do btn08.pos =  [8,makeUIBt.pos[2]+((howManyBt+1)*24)];
if (howManyBt == 8) do btn09.pos =  [8,makeUIBt.pos[2]+((howManyBt+1)*24)];

–最後にカウントを増やしておく
howManyBt += 1;

);
);–on end

on delUIBt pressed do
(
if (howManyBt == 1) do btn01.pos =  [-50,-50];
if (howManyBt == 2) do btn02.pos =  [-50,-50];
if (howManyBt == 3) do btn03.pos =  [-50,-50];
if (howManyBt == 4) do btn04.pos =  [-50,-50];
if (howManyBt == 5) do btn05.pos =  [-50,-50];
if (howManyBt == 6) do btn06.pos =  [-50,-50];
if (howManyBt == 7) do btn07.pos =  [-50,-50];
if (howManyBt == 8) do btn08.pos =  [-50,-50];
if (howManyBt == 9) do btn09.pos =  [-50,-50];
if (howManyBt > -1) then
(
howManyBt -= 1
)
);–on end

);–rollout end
createDialog makeFakeUI_rol menu:hiderMenuBar /*bgColor:[0,0,0]*/ style:#(#style_border, #style_titlebar, #style_sysmenu) menu:CanvasMenu;

);–end macroscript

[/as3]

詳しい説明はしなくてもいいと思うけど
howManyの変数で作った数をみたりしている
まぁ、フラグのようなもんだな・・・

結局今回は
単純に、howManyBtというフラグを立てて
その数値に従ってifで動作する用にしてみたが

もっと良い方法があるはずだ

これはもうチョット考えてみたいところだ
ひとまず、ボタンをつくったかのように見せたり
逆に削除するような見せ方はこれで十分ではないだろうか?

ボタンの名所は、もちろん***.caption でプロパティを持っているので
アクセス可能だ

位置に関しても、アル程度ロジック的なスクリプトを組めば
もっと自在な変化を起こせるだろう

本当に、今回はシンプルな手を使ったので
まだまだやりようはあるはずだ

ではではいつも通り
サンプルでもどうぞ


ダウンロード:UIをつくった風にみせる

Leave a comment

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください