ウインドウのリサイズ許可
チケットの「追記/更新」のテストも兼ねて。
現状の DTXMania で使用されている画像は、すべて 3D 化(テクスチャ化)が完了しています。 なので、残るは
現在は、3D で見ても z=0 のとき視野が 640x480 になり (0,0,0) が画面中央にくるよう、カメラと投影行列が固定化されています。
現在は、640x480 での表示を想定してフォントサイズを決定しています。文字列は結局はテクスチャになるわけですから拡大縮小は可能ですが、拡大すると文字が荒くなることは否めません。
…あたりに注意する必要があります。
情報ありがとうございます。
カメラ周りの話はおっしゃっているようなことを実行している部分を起票時点で既に見つけていたのですが じゃあどう直せばいいの勝手のがさっぱり分からず。HAHAHA! DirectXの3D周りは全く知識がないのでこれから勉強してみます。
フォントが荒くなるのは盲点でした。でも対応が面倒そうなので、まずは単純な拡大表示ができないか考えてみます。
よく考えたら、フォントについては問題外でしたね。
ウィンドウのサイズを大きくしたら、フォントだけじゃなく他の画像まですべて荒くなるんですから。
フォントだけスムースなままというのもかえって不気味ですしね。
その後カメラの合焦距離やら画角やらについて勉強して、カメラのビュー変換についてやっていることを理解。 # 1対2対ルート3とか久しぶりに思い出した。
よしそれじゃあウインドウサイズとbackbufferをでかくしてカメラ距離を近づければソレっぽく拡大表示されるはずだよな・・・ とやってみましたが・・・dot by dot表示のまま。うーん、間違ったかな?
・・・出直してきます。もっと勉強せねば。
カメラを動かすことなく、単純に以下のようにすることで、とりあえずウインドウサイズを800x600にすることができました。
1. ウインドウサイズを800x600に設定する
2. BackBufferを640x480に設定する
3. もう一度ウインドウサイズを800x600に設定する
3.がポイントだったようです。
まだ拡大表示の画質が荒すぎだとか、リサイズ操作にはまだ対応してないとか、VSyncWaitの操作とかで640x480に戻っちゃうとか色々課題はありますが、峠は越えたかなと思います。
10/27のコメントのやり方で、起動時だけは640x480外の解像度にできましたが、 その後ウインドウモード→フルスクリーンモード→ウインドウモード、とやると640x480に戻ってしまうことが判明。
同操作時に10/27のコメントのやり方を加えてもダメで、試行錯誤した結果はウインドウサイズが640x480になるか、 ウインドウサイズは800x600だが表示領域が左上の640x480だけになるかのいずれか。
多分deviceをResetせにゃぁならんのでしょうが、SlimDXではさてどうやるのだか。まだまだ調べることは多そうです。
昔の DirectX SDK の Sample に、自由にウィンドウサイズを変えられるモノがあったような…… うーん、思い出せない……
どうしても BackBuffer のサイズと window のサイズを別々に設定できないなぁと思っていたのですが、 結局 SampleFramework が常にこれらを同じにするように設定していました・・・。
SampleFramework から Direct3D9.PresentParameters にパラメータを設定するところで BackBuffer を 640x480 固定にしたところ、今までの苦労がウソのようにあっさり解決しました(笑)
本当は SampleFramework の GraphicsDeviceManager に BackBuffer のサイズ変更I/Fを新設すべきところでしょうけれど、 そこまでは行っておらず。この辺はワイド化を実際に実行する時にでも改めて。
後はアスペクト比固定の変更と、640x480への戻し機能、Config.iniへの最終ウインドウサイズ保持/復元機能の追加ですかね。
お疲れ様です。
順調に活動ランキングも上がってきたやぎさんに、これで安心して DTXMania をお任せできます。
という夢を見ました。(嘘です。本当は久しぶりにすごい悪夢でした。
で、いまさらなのですが、テクスチャ配置の座標系(Viewのグリッド)が 640x480 のままにして物理解像度だけ変えるのがいいよー とコメントしようとしてて、しかしその具体的な方法を思い出せないでいたのですよ。
SampleFramework がからんでいましたか。
というか、あのややこしい GraphicsDeviceManager の解析、お疲れ様です。
SampleFramework の解説は昔の「SlimDX と C# で学ぶ DirectX」のほうに書いてたんですけど、最新版の SlimDX では、SlimDX 開発者が「今回のサンプルは実用にならない」と断言するほどスリム化されてたので、バックアップをとって記事を消してしまったんですよ。
……と、言い訳ばかり残してひとまず退却ー。
順調にランキングが上がってきましたが、まずい傾向なんですよねぇ・・・鬱持ちが一人で黙々とコミットしている現状は。みんなコミットしようぜ!それとプロマネも相変わらず募集中!
バックアップを取って消されていたという記事、実は見たかったのですよ~~(笑)。ぐぐってそこにたどり着いたのに消えてたのでがっくり来ました。
んで、先のコメントに書きました通り、まだちょっとやるべきことは残っています。しかし、一応ウチの環境以外でちゃんと動くか動作確認して欲しいというのがあるので、現状の最低限の機能を搭載したリサイズ機能を後ほどtrunkにコミットします。
すみませんが画面のリサイズがきくか+フルスクリーン/ウインドウ化した後もなおリサイズができるか+その状態でプレイに支障がないか、ご確認いただけると助かります。
うつが本格的に深まれば、もはや VC# を触ることすらどうでもよくなります、とフロムは自戒を込めてつぶやきます。
コミットお疲れ様です。
早速テストしてみました。
んー。ぐにぐに動きますね(笑
ここはやはり縦横比を維持したままスケーリングしたいところですね。
不具合としては、ウィンドウの縦幅を縮めていくと、ある地点からシーン切り替えのホワイトアウトの下部が切れてしまうようです。
今のところ、他に支障は見つかっていません。
ご確認いただきありがとうございました。縮小時にホワイトアウト等が切れる問題は、先ほどrev28で対処しました。ここだけウインドウサイズをチェックしていたのですね・・・。
そろそろ 640 とか480 とかの直接指定が入り乱れてきたので(汗; staticなクラスでも新設するか。
現状の実装での問題点をまとめます。(フォーラム等でいただいた情報より。)
XP絡みの問題について、現時点では、原因ならびに対策が見えておりません。うーん・・・
何とか、以下2つに対応しました。
・XPでのリバウンド問題対応
(XPでだけWindow_ScreenChangedイベントが発生していたためと思われ。対応コードを入れてウチの環境では正常動作することを確認。)
・Config.iniへのリサイズ座標の書き出しと読み出しに対応
以下はまだ未実装です。
・縦横比を維持したままリサイズする機能
・640x480に戻す機能(ちゃんと戻したくなったらConfig.iniを編集してください)
その後の状況です。(まだコミットしてません)
できたこと:
まだできていないこと:
前者向けの対応として、まずresizeイベントに処理をくっつけてみたのですが、どうもうまくいかない。 ぬるぬる動かず、また縦横どちらかだけサイズを変えるような場合にちゃんと動かない。
調べてみると、どちらも結局、Formが持っているWndProcのoverrideが必要っぽいのですが、DTXManiaの場合 WndProcはGameWindowクラスがFormから継承していて、Gameクラスがそのクラスにアクセスしていて、CDTXManiaクラスがGameクラスを継承している。
CDTXManiaクラスはFormを継承していないので、WndProcにはアクセスできず。そのためなんとかGameWindowからCDTXManiaまでWndProcのクチを引っ張り出さないと行けないのですが、なかなかうまくいかないです。んーーー。
正直この機能に時間を掛けすぎているきらいがあるので、このままうまくいかない状況が続くようであれば、(美しくないですが) GameWindowクラスを直接修正してこの機能を入れ込むようにするかもです・・・。
調べてみると、どちらも結局、Formが持っているWndProcのoverrideが必要っぽいのですが、DTXManiaの場合WndProcはGameWindowクラスがFormから継承していて、Gameクラスがそのクラスにアクセスしていて、CDTXManiaクラスが Gameクラスを継承している。
CDTXManiaクラスはFormを継承していないので、WndProcにはアクセスできず。そのためなんとかGameWindowからCDTXManiaまでWndProcのクチを引っ張り出さないと行けないのですが、なかなかうまくいかないです。んーーー。
正直この機能に時間を掛けすぎているきらいがあるので、このままうまくいかない状況が続くようであれば、(美しくないですが) GameWindowクラスを直接修正してこの機能を入れ込むようにするかもです・・・。
そうなんですよねー。
SlimDX wiki の方にも問題点として書いてましたが、GameWindow の WndProc が override できないのです。
Game クラスが private で GameWindow のインスタンスを名指しで保持している時点でアウトですね。
ちなみに SlimDX Group では、この問題に対し、「GameWindow クラスを継承した子クラスを作ればいいんだぜ」と、とりつく島もありません。
それができないから困ってるんでしょうがー。
で、解決方法として、GameWindow クラスを修正することなく、CDTXMania クラス側で WndProc をフックするような実装を行った記憶があります。
具体的な実装方法は、ソース消失とともに忘れました……(涙
まぁ何かしら解決方法があったはずですが、そもそも当初やってた SampleFramework.dll の外部参照をやめてソースレベルでアプリ本体にマージするようにしたのは、この融通の利かないフレームワークを自分で好きに修正できるようにするためなのです。ですので、美しくなくても直接修正していって良いと思います。
SampleFramework.dll も MIT License なので、ソースを修正しても、冒頭のLicenseコメントさえ残しておけば公開義務はありませんしね。
お言葉に甘えて、GameWindow.cs を直にいじらせていただきました(笑)
縦横比を維持したまま、ぬるぬるリサイズできるようになりました。ありがとうございます。
ただ、まだタイトルバーの高さの分、計算を間違えているようですが・・・(汗;;;。 あと一息です。
rev39で、ウインドウの枠の大きさも考慮して計算するよう修正しました。ご確認ください。
個人的には、リサイズ後マウスを放したときの挙動がちょっと気にくわないものの、まあこんなもんかなと思います。
皆さんに試していただいて問題なければクローズします。長かった・・・。
リサイズ機能かなり順調ですね。お疲れ様です。
・システムメニューからの640x480機能確認しました。
・X軸・Y軸のみのリサイズはかならず4:3になるのを確認しました。ぬるぬる
・(ちょっと点滅するけど)斜めのリサイズを確認しました。といいたいところですが・・・!?
XP sp3だとY軸の計算が間違ってるのか、マウスのY移動量に比べてウィンドウのY伸縮量が少ないです。
(例えば一定の点から下にひっぱるとマウスの方が下にくる、ウィンドウはその分伸びてない)
例によってグラボはNVIDIA GeForceです。
連投ごめんなさい。ダブルクリックでフルスクリーン状態も確認しました。
ikanickさん、ご確認いただきありがとうございました。
・・・っていうか、ウインドウ右下を「上下に」ドラッグするだけでおかしくなりますね・・・。 ウチはWin7+チップセット内蔵グラフ(AMD)ですが、多分そちらで起きている現象と同じかと。
先ほどコミットしたバージョンで、何とか納得いく挙動にできました。
他の人が試して問題ないようであれば、今度こそクローズします。
お疲れ様です。
試してみたのですが、ちゃんと動いてますね。ワイドにも対応していてすばらしい(笑。
このチケットがクローズしたら、そのリビジョンでいったんリリースするとしましょうか。
ただ、少々気になる点を2つほど。
なんとかならないでしょうか?(汗
fromさん、ご確認いただきありがとうございます。
すみません。
うちでは XKeymacs で「変換」を「R-Alt」に替えており、
これがウソでした。(汗
正確には、XKeymacs のキーボード配置変更機能は Win7x64 では動作しないようです。
お騒がせしました。
fromさん
了解しました。
それでは、縮小時に画面がついてこない件は「後で」として、全体としては「完了」にします。
ウインドウのリサイズができるようにして欲しい。
できれば、アスペクト比を維持しながらリサイズする機能と、dot by dot相当に戻す(640x480に戻す)機能も欲しい。