トップページ > 記事閲覧
SwordBoutのCommonSource
名前:GMO 日時: 2017/03/18 18:13

表題の件質問があります。 CommonSource中のToolLib_SpaceManageについてですが、これは何を目的としたものなのでしょうか。 どのようなことがしたい場合に使うものかを教えて頂けませんでしょうか。
メンテ

Page: 1 |

Re: SwordBoutのCommonSource ( No.1 )
名前:管理人 日時:2017/03/20 01:02

ステージエディタやアニメーションエディタの画面左側に表示されるボタンや情報などの 各項目の範囲を管理するためのライブラリです もともとは DxLibModelViewer.exe 用に作成したものなので、DxLibModelViewer.exe を 例にご説明しますと、DxLibModelViewer.exe はウインドウのサイズを自由に変更することができますが、 ウインドウのサイズに合わせてマテリアルやフレームの情報表示の各項目が占有する領域が変化します 各項目が占める範囲を固定のドット数にせず、ウインドウのサイズに合わせて変化させ、 現在のウインドウサイズの内のフレーム一覧やフレーム内部情報の表示が占めるドット数は どれくらいなのか?などの値を計算するのが ToolLib_SpaceManager というわけです なので、SwordBout のステージエディターやアニメーションエディターはウインドウサイズが 固定なので、あまり ToolLib_SpaceManager を使用する意味がないとは言えます… ( SwordBout のステージエディター・アニメーションエディターでは、各情報表示の座標を  画面の絶対座標で指定せずに、項目の範囲だけ指定すると後は描画すべき座標を  ToolLib_SpaceManager が計算してくれる、程度の使われ方です )
メンテ
Re: SwordBoutのCommonSource ( No.2 )
名前:GMO 日時:2017/03/21 18:24

管理人さん、ご回答ありがとうございます。目的については把握しました。 現在ToolLibの改造を目論んでおり、可変ウィンドウの時のSpaceManagerの動きも把握したく、 アニメーションエディター画面を単純に可変サイズにしましたが・・・当然変化はありませんでした。 なので画面サイズに合わせた表示に必要な手続きを教えてはいただけませんでしょうか。 例えば親ウィンドウの中に子ウィンドウ(またはボタン)一つの単純な画面を想定した場合、 何を呼び出せばいいか等が知りたいです。
メンテ
Re: SwordBoutのCommonSource ( No.3 )
名前:管理人 日時:2017/03/23 01:09

SwordBout の ToolLib_SpaceManager などのエディタ用のプログラムは 解説コメントを入れやすいように DxLibModelViewer.exe のものより 簡略化しているので、もしかしたらその過程で可変サイズ対応用の処理を 削ってしまったのかもしれません 2年前に組んだプログラムなので色々思い出したり確認したりしないと ご返答ができないのですが、今週はもう週末まで作業の時間を確保できそうにないので 作業時間が確保できる週末にご返答をいたします お待たせしてしまいすみません m(_ _;m
メンテ
Re: SwordBoutのCommonSource ( No.4 )
名前:GMO 日時:2017/03/23 19:26

承知しました。お忙しい中すみません。
メンテ
Re: SwordBoutのCommonSource ( No.5 )
名前:管理人 日時:2017/03/26 15:28

お待たせしました、画面サイズに合わせて表示範囲が変更されるように変更する 手順は以下の通りです ( No.3 でお話したような『機能の無効化』はしていませんでした ) 例として『Stage Editor』の『オブジェクト一覧』をクリックすると表示される項目の 『オブジェクト一覧』のリストと『オブジェクトモデル一覧』のリストの表示の縦の範囲を 画面のサイズに合わせて変化するようにする場合は 1.まず StageEditor.cpp の 82行目あたりに以下の記述を追加して SetWindowSizeChangeEnableFlag( TRUE, FALSE ) ;  『ウインドウのサイズは変更できるが、表示はサイズに合わせて拡縮されないようにする』設定を行います 2.StageEditor_Object.cpp の 132行目付近の『オブジェクト一覧』リストの初期化を行っている  以下の関数 ToolWindow_Create 呼び出しの g_OEData.ListTWindow = ToolWindow_Create( g_OEData.TSpaceManage, false, true, false, "オブジェクト一覧", LIST_X, LIST_Y, LIST_W, LIST_H, LIST_W, LIST_H );  第3引数 LockSpace を true から false に変更します g_OEData.ListTWindow = ToolWindow_Create( g_OEData.TSpaceManage, false, false, false, "オブジェクト一覧", LIST_X, LIST_Y, LIST_W, LIST_H, LIST_W, LIST_H );  ( LockSpace を true にすると、画面サイズが変化しても表示範囲は変化させない設定になるので ) 3.StageEditor_Object.cpp の 307行目付近の『オブジェクトモデル一覧』リストの初期化を行っている  以下の関数 ToolWindow_Create 呼び出しの g_OEData.ModelListTWindow = ToolWindow_Create( g_OEData.TSpaceManage, false, true, false, "オブジェクトモデル一覧", MODEL_LIST_X, MODEL_LIST_Y, MODEL_LIST_W, MODEL_LIST_H, MODEL_LIST_W, MODEL_LIST_H );  第3引数 LockSpace も true から false に変更します g_OEData.ModelListTWindow = ToolWindow_Create( g_OEData.TSpaceManage, false, false, false, "オブジェクトモデル一覧", MODEL_LIST_X, MODEL_LIST_Y, MODEL_LIST_W, MODEL_LIST_H, MODEL_LIST_W, MODEL_LIST_H ); 4.StageEditor_Object.cpp の 499行目から始まる関数 StageEditor_Object_Step の冒頭に  以下のコードを追加します // ウインドウのクライアント領域のサイズを取得 int ClientW, ClientH ; GetWindowSize( &ClientW, &ClientH ) ; // スペースマネージャにスペースの縦サイズを設定する ToolSpaceManage_ChangeTotalSpace( g_OEData.TSpaceManage, ClientH ) ; // ボタンを再配置する ToolButton_SetPosition( g_OEData.AddTButton, BUTTONS_X + 4, BUTTONS_Y + 0 ); ToolButton_SetPosition( g_OEData.DelTButton, BUTTONS_X + 89, BUTTONS_Y + 0 ); ToolButton_SetPosition( g_OEData.AngleResetTButton, BUTTONS_X + 162, BUTTONS_Y + 26 ); ToolButton_SetPosition( g_OEData.AngleXPlusTButton, BUTTONS_X + 4, BUTTONS_Y + 26 ); ToolButton_SetPosition( g_OEData.AngleXMinusTButton, BUTTONS_X + 4, BUTTONS_Y + 46 ); ToolButton_SetPosition( g_OEData.AngleYPlusTButton, BUTTONS_X + 56, BUTTONS_Y + 26 ); ToolButton_SetPosition( g_OEData.AngleYMinusTButton, BUTTONS_X + 56, BUTTONS_Y + 46 ); ToolButton_SetPosition( g_OEData.AngleZPlusTButton, BUTTONS_X + 108, BUTTONS_Y + 26 ); ToolButton_SetPosition( g_OEData.AngleZMinusTButton, BUTTONS_X + 108, BUTTONS_Y + 46 ); ToolButton_SetPosition( g_OEData.ScaleResetTButton, BUTTONS_X + 214, BUTTONS_Y + 68 ); ToolButton_SetPosition( g_OEData.ScaleXPlusTButton, BUTTONS_X + 4, BUTTONS_Y + 68 ); ToolButton_SetPosition( g_OEData.ScaleXMinusTButton, BUTTONS_X + 4, BUTTONS_Y + 88 ); ToolButton_SetPosition( g_OEData.ScaleYPlusTButton, BUTTONS_X + 56, BUTTONS_Y + 68 ); ToolButton_SetPosition( g_OEData.ScaleYMinusTButton, BUTTONS_X + 56, BUTTONS_Y + 88 ); ToolButton_SetPosition( g_OEData.ScaleZPlusTButton, BUTTONS_X + 108, BUTTONS_Y + 68 ); ToolButton_SetPosition( g_OEData.ScaleZMinusTButton, BUTTONS_X + 108, BUTTONS_Y + 88 ); ToolButton_SetPosition( g_OEData.ScaleAllPlusTButton, BUTTONS_X + 160, BUTTONS_Y + 68 ); ToolButton_SetPosition( g_OEData.ScaleAllMinusTButton, BUTTONS_X + 160, BUTTONS_Y + 88 ); MoveButton_SetPosition( &g_OEData.MoveButton, MOVE_X, MOVE_Y ) ;  GetWindowSize でメインウインドウのクライアント領域のサイズを取得して、ToolSpaceManager_ChangeTotalSpace で  クライアント領域の縦サイズを設定します  これで『オブジェクト一覧』リストと『オブジェクトモデル一覧』リストは画面サイズに合わせて縦幅と表示位置が  変化するのですが、ボタンは ToolButton_SetPosition で一つ一つ設定してやる必要があるので、  上記のように位置を個別に再設定しています( 位置の記述は ToolButton_Create で指定しているものと同じです )  上記の記述の BUTTONS_Y は #define で (4 + TOOL_SCROLLBAR_WIDTH + g_OEData.ButtonSpace.SpaceStart) と  定義されていて、この内の g_OEData.ButtonSpace.SpaceStart の値が関数 ToolSpaceManage_ChangeTotalSpace の  呼び出しによって変化して、ボタンの表示すべき Y位置を示しています  何故ボタンは個別に指定しなければならないのか、ですが、各スペースの情報は ToolSpaceManage_AddSpace を  使用して追加するのですが、『オブジェクト一覧』リストなどが使用している ToolWindow_Create などのウインドウ機能では  自前で ToolSpaceManage_AddSpace を使用してスペース情報を追加して、ウインドウ処理の内部で SpaceStart の情報を元に  描画位置を決めているので ToolSpaceManage_ChangeTotalSpace を呼ぶたびに位置を設定し直す必要は無いのですが、  ボタンの場合はスペース情報を自前では持っていないので、ボタンの内部処理ではどのスペースに属しているか判断できず、  結果として ToolSpaceManage_ChangeTotalSpace を呼んでスペース情報に変化がある度に外部から位置を再設定してやる  必要があるというわけです  この辺りは ToolButton_Create の引数にスペース情報のハンドルを渡して、どのスペースに属しているかを  ボタン処理内部で判断できるようにして、毎回位置を再設定してやる必要が無いようにするなどの改良の余地がありますが、  当時はそれをしなかったようです…  そして最後の行の MoveButton_SetPosition( &g_OEData.MoveButton, MOVE_X, MOVE_Y ) ;  ですが、この関数は存在しないので StageEditor_MoveButton.h と StageEditor_MoveButton.cpp に記述を追加する  必要があります 5.StageEditor_MoveButton.h の 39行目付近に以下の記述を追加して MoveButton_SetPosition を追加します // 移動ボタン情報の位置を変更する extern void MoveButton_SetPosition( // 移動ボタン情報構造体のアドレス SMoveButtonData *MBData, // 変更後のボタンの座標 int x, int y ); 6.StageEditor_MoveButton.cpp の 80行目付近に以下の記述を追加して MoveButton_SetPosition を追加します // 移動ボタン情報の位置を変更する extern void MoveButton_SetPosition( // 移動ボタン情報構造体のアドレス SMoveButtonData *MBData, // 変更後のボタンの座標 int x, int y ) { ToolButton_SetPosition( MBData->FrontTButton, x + FRONT_X, y + FRONT_Y ); ToolButton_SetPosition( MBData->BackTButton, x + BACK_X, y + BACK_Y ); ToolButton_SetPosition( MBData->LeftTButton, x + LEFT_X, y + LEFT_Y ); ToolButton_SetPosition( MBData->RightTButton, x + RIGHT_X, y + RIGHT_Y ); ToolButton_SetPosition( MBData->UpTButton, x + UP_X, y + UP_Y ); ToolButton_SetPosition( MBData->DownTButton, x + DOWN_X, y + DOWN_Y ); }  先ほどの記述と同じようにボタンの位置を再設定しているだけです  これでウインドウのサイズを変更すると、それに合わせて『オブジェクト一覧』リスト、オブジェクトの位置や  向きを設定するボタン、『オブジェクトモデル一覧』リストの表示範囲や位置が変化するようになります  よろしければお試しください m(_ _)m
メンテ
Re: SwordBoutのCommonSource ( No.6 )
名前:GMO 日時:2017/03/31 22:54

管理人さん 変更手順と解説、ありがとうございます。 こちらで記述通りの変更を行ったところ、画面サイズに応じた変化を確認できました。 念のためお聞きしますが、画面の幅については上記コードではサイズ変更に応じた表示はできない、 もしくはそもそも画面横幅の変更についてはスペースマネージャでは想定していないという理解であっていますでしょうか? (StageEditorの画面幅を左側の一覧等の表示域よりも狭くした場合など)
メンテ
Re: SwordBoutのCommonSource ( No.7 )
名前:管理人 日時:2017/04/02 14:37

> 念のためお聞きしますが、画面の幅については上記コードではサイズ変更に応じた表示はできない、 > もしくはそもそも画面横幅の変更についてはスペースマネージャでは想定していないという理解であっていますでしょうか? > (StageEditorの画面幅を左側の一覧等の表示域よりも狭くした場合など) はい、スペースマネージャは縦の領域管理のみを行います
メンテ
Re: SwordBoutのCommonSource ( No.8 )
名前:GMO(解決) 日時:2017/04/02 17:40

管理人さん、ご回答ありがとうございました。
メンテ

Page: 1 |

題名
名前
コメント
パスワード (記事メンテ時に使用)

   クッキー保存