イントレ。
Tag for "ツクールもどき"
TGNさんがハムスターと、ハニーさんが経歴書の内容と、そして愁は睡魔と格闘中の予感な感じの今日この頃。
どうも最近、この時間(午後11時~午前1時)になると急激に眠くなるなぁ…。
さて、昨日の結果に満足できずにDirect3Dの実装に関してあれこれ実験していたワケなんですが、
子ウィンドウをクリッピング出来る事が判明しちゃいました。
2日前の日記がウソでしたねw
その方法はというと、Direct3Dデバイスに関連付けられてるウィンドウのスタイルにWS_CLIPCHILDRENを付け加えるだけ。
このスタイルは、ウィンドウのクライアント領域を描画するときに子ウィンドウの部分をクリッピングして、
子ウィンドウが親ウィンドウの描画によって塗りつぶされないようにするモノなんですよね。
しかし、このスタイルがDirect3Dで通用するとは盲点でした。
フルスクリーンでもちゃんとクリッピングされるし。
あとは、IDirect3DSurface9::GetDC()がアルファチャンネルに対応してくれれば、レイヤードウィンドウの作成が簡単になるのに。
あ、それから今日はDirect3Dを使っても、極力CPUを使わない実験もしてみました。
極力CPUを使わないという表現は微妙で、必要な時だけ描画するようにしただけなんですが。
『Direct3D』=『リアルタイムで画面更新』という概念があるせいか、ゲーム作成ツールなのに、
サンプルソースに右習えで毎フレーム更新していたわけです。
ゲーム上ならともかく、ツール上で毎秒60回もの描画が必要な時って殆ど無いと思うんです。
だったら、必要なときだけ描画するようにしてCPUパワーを使わないようにするのもアリなんじゃないでしょうか?
つーか、開発中はゲーム中と違って長時間にわたって起動される確率が高いわけだし、
何もしていない間もCPUパワーを使っているようじゃ、CPUが燃えるコトも考えられます。
…危険だ、危険すぎる。
などという実験を繰り返すうちに、ラヴ♪Direct3Dという状況に陥ってしまった愁さんでした。
あ、ついでに補足。
私が作ってる『ツクールもどき』はDirect3Dを使って作成しているんですが、
中身は『バリバリの2D、むしろ3Dって何ですか?』ってカンジ。
『2Dなのに3Dボード必須とはどういう了見だ?』と某氏からも言われたんですが、
今時3Dボードがない方が珍しいと思うし、
愁の腐れ3Dボードでもまともに動くレベルで作る予定だし、
ハードウェア使うから描画早いし、
古いマシン引きずってたらキリないし、
なにより開発ラクだし。
それに、まだ完成するか知らないし。
そんなカンジだから変な事考えないで割と気楽に作ってるんだなw
ある意味、Direct3Dを覚える勉強だと割り切る事もできるしね。
というトコロで、今日はこの辺で。
どうも最近、この時間(午後11時~午前1時)になると急激に眠くなるなぁ…。
さて、昨日の結果に満足できずにDirect3Dの実装に関してあれこれ実験していたワケなんですが、
子ウィンドウをクリッピング出来る事が判明しちゃいました。
2日前の日記がウソでしたねw
その方法はというと、Direct3Dデバイスに関連付けられてるウィンドウのスタイルにWS_CLIPCHILDRENを付け加えるだけ。
このスタイルは、ウィンドウのクライアント領域を描画するときに子ウィンドウの部分をクリッピングして、
子ウィンドウが親ウィンドウの描画によって塗りつぶされないようにするモノなんですよね。
しかし、このスタイルがDirect3Dで通用するとは盲点でした。
フルスクリーンでもちゃんとクリッピングされるし。
あとは、IDirect3DSurface9::GetDC()がアルファチャンネルに対応してくれれば、レイヤードウィンドウの作成が簡単になるのに。
あ、それから今日はDirect3Dを使っても、極力CPUを使わない実験もしてみました。
極力CPUを使わないという表現は微妙で、必要な時だけ描画するようにしただけなんですが。
『Direct3D』=『リアルタイムで画面更新』という概念があるせいか、ゲーム作成ツールなのに、
サンプルソースに右習えで毎フレーム更新していたわけです。
ゲーム上ならともかく、ツール上で毎秒60回もの描画が必要な時って殆ど無いと思うんです。
だったら、必要なときだけ描画するようにしてCPUパワーを使わないようにするのもアリなんじゃないでしょうか?
つーか、開発中はゲーム中と違って長時間にわたって起動される確率が高いわけだし、
何もしていない間もCPUパワーを使っているようじゃ、CPUが燃えるコトも考えられます。
…危険だ、危険すぎる。
などという実験を繰り返すうちに、ラヴ♪Direct3Dという状況に陥ってしまった愁さんでした。
あ、ついでに補足。
私が作ってる『ツクールもどき』はDirect3Dを使って作成しているんですが、
中身は『バリバリの2D、むしろ3Dって何ですか?』ってカンジ。
『2Dなのに3Dボード必須とはどういう了見だ?』と某氏からも言われたんですが、
今時3Dボードがない方が珍しいと思うし、
愁の腐れ3Dボードでもまともに動くレベルで作る予定だし、
ハードウェア使うから描画早いし、
古いマシン引きずってたらキリないし、
なにより開発ラクだし。
それに、まだ完成するか知らないし。
そんなカンジだから変な事考えないで割と気楽に作ってるんだなw
ある意味、Direct3Dを覚える勉強だと割り切る事もできるしね。
というトコロで、今日はこの辺で。
というコトで、一段落したと思ったら既に朝7時でビックリの愁です。
それだけ熱中できてるってコトなんでしょうね。
熱中の元であるツクールもどきですが、
昨日から内部構造を変更することの繰り返しなので、機能的にはあまり進化してないんですよね。
それでも、今日の昼頃の段階で一段落ついたのでマウスやキーボードに反応するようにしました。

エディタらしく、マップチップ単位での矩形カーソルを表示させ、
画面端でカーソルキーが押されるとマップをスクロールさせたり、
特定キーで高速スクロールや、マウスによるスクロールを実装。
…スクロールばっか。(笑)
で、今度はマップチップを選択する画面を作ろうと思ったんですが、
後々を考えて画面描画ではなく1つのウィンドウを新しく作るコトにしたんです。
…試行錯誤の始まり始まり。
マップチップを選択させるには当然、マップチップを描画しないとイケないんですが、
画像はDirect3Dが持ってるんで、Direct3Dで描画する事になります。
IDirect3DDevice9::Present()関数にウィンドウハンドル渡せるので、イケると思ったんですが、許可されてるのは子ウィンドウのみ。
子ウィンドウにするとウィンドウモードではクリッピングしてくれないので正常に表示出来ない…。
というコトで、メインのウィンドウにポップアップウィンドウを所有させて、描画する事にする。
…もしかしたら、フルスクリーン使えなくなるかも知れないけど。
となると、新しいウィンドウ用にDirect3Dのデバイスを作成しないといけなくなるワケで、
それを誰にどういう風に所有させればいいか、ベストに管理する方法は?
そんな事で悩んでます。
ウィンドウやメッセージ回りはMFCが担当してくれるのでラクにはなったんですがねぇ。
うーん、どうしよ?
それだけ熱中できてるってコトなんでしょうね。
熱中の元であるツクールもどきですが、
昨日から内部構造を変更することの繰り返しなので、機能的にはあまり進化してないんですよね。
それでも、今日の昼頃の段階で一段落ついたのでマウスやキーボードに反応するようにしました。

エディタらしく、マップチップ単位での矩形カーソルを表示させ、
画面端でカーソルキーが押されるとマップをスクロールさせたり、
特定キーで高速スクロールや、マウスによるスクロールを実装。
…スクロールばっか。(笑)
で、今度はマップチップを選択する画面を作ろうと思ったんですが、
後々を考えて画面描画ではなく1つのウィンドウを新しく作るコトにしたんです。
…試行錯誤の始まり始まり。
マップチップを選択させるには当然、マップチップを描画しないとイケないんですが、
画像はDirect3Dが持ってるんで、Direct3Dで描画する事になります。
IDirect3DDevice9::Present()関数にウィンドウハンドル渡せるので、イケると思ったんですが、許可されてるのは子ウィンドウのみ。
子ウィンドウにするとウィンドウモードではクリッピングしてくれないので正常に表示出来ない…。
というコトで、メインのウィンドウにポップアップウィンドウを所有させて、描画する事にする。
…もしかしたら、フルスクリーン使えなくなるかも知れないけど。
となると、新しいウィンドウ用にDirect3Dのデバイスを作成しないといけなくなるワケで、
それを誰にどういう風に所有させればいいか、ベストに管理する方法は?
そんな事で悩んでます。
ウィンドウやメッセージ回りはMFCが担当してくれるのでラクにはなったんですがねぇ。
うーん、どうしよ?
今日も張り切ってツクールもどきを作成していた愁です。
…が、構造に問題がありそうなので日記を書きながら考えようと思います。
最近こんな日記ばかりだから、頭の上に?が浮かんでいる人が多いかも。
で、今問題になっているのは、マップとキャラの情報の相違。
マップとキャラは別々のクラスで管理しているんですが、
お互いが共通して必要な同一のデータがあるんです。
キーの押下情報とか、現在のマップ座標とかですね。
キーの情報が無いとマップをスクロールすることが出来ないし、
それに併せてキャラがその方向を向くコトも出来ません。
マップ座標が無くても、画面中央固定という仕様なら主人公キャラは表示させるコトは出来ますが、
イベントキャラは表示させることが出来ません。
そこで、基本的な情報は全部マップのクラスに持たせて、キャラクラスをマップクラスに入れるようにしたんです。
イベントキャラも主人公キャラも両方ね。
マップのデータにはキャラの情報も入っているので、こうするしかないかな…と思ったんです。
しかし、そうすることで、キャラクラスがマップクラスに依存するようになってしまったんですよね。
オブジェクトがオブジェクトになってません。
…コレじゃあクラス分けの意味無いやん。
完全に意味がないわけでもないけど…、一言で言うと『美しくない』。
このコード、イケてません。
そこで愁さんは考えました。
ゴロゴロしながら考えました。
3時間ほど友人に拉致られたんですが考えました。
お風呂に1時間ほど入ってたら微妙にノボせたけど考えました。
…気づいたら、SAPの新しいインターフェイスを考えていたのは内緒です。(爆)
バカな頭で考えついたのが、共通する情報を持つクラスを一つをでっちあげ作成して、
その中にマップクラスとキャラクラスを配置する方法。
マップクラスの中にはイベントキャラ用のキャラクラスを配置します。
コレだと情報クラスとキャラクラス・マップクラスは依存関係になっちゃうけど、
今の問題はキャラクラスが依存関係にならないようにすることだから、何とかなるかな。
頭の中だとコレでうまく行きそうなんだけど…どうなるコトやら。
全然関係ないけど、今、SAPの掲載メールが来た。
今度はネットランナー。
…が、構造に問題がありそうなので日記を書きながら考えようと思います。
最近こんな日記ばかりだから、頭の上に?が浮かんでいる人が多いかも。
で、今問題になっているのは、マップとキャラの情報の相違。
マップとキャラは別々のクラスで管理しているんですが、
お互いが共通して必要な同一のデータがあるんです。
キーの押下情報とか、現在のマップ座標とかですね。
キーの情報が無いとマップをスクロールすることが出来ないし、
それに併せてキャラがその方向を向くコトも出来ません。
マップ座標が無くても、画面中央固定という仕様なら主人公キャラは表示させるコトは出来ますが、
イベントキャラは表示させることが出来ません。
そこで、基本的な情報は全部マップのクラスに持たせて、キャラクラスをマップクラスに入れるようにしたんです。
イベントキャラも主人公キャラも両方ね。
マップのデータにはキャラの情報も入っているので、こうするしかないかな…と思ったんです。
しかし、そうすることで、キャラクラスがマップクラスに依存するようになってしまったんですよね。
オブジェクトがオブジェクトになってません。
…コレじゃあクラス分けの意味無いやん。
完全に意味がないわけでもないけど…、一言で言うと『美しくない』。
このコード、イケてません。
そこで愁さんは考えました。
ゴロゴロしながら考えました。
3時間ほど友人に拉致られたんですが考えました。
お風呂に1時間ほど入ってたら微妙にノボせたけど考えました。
…気づいたら、SAPの新しいインターフェイスを考えていたのは内緒です。(爆)
バカな頭で考えついたのが、共通する情報を持つクラスを一つを
その中にマップクラスとキャラクラスを配置する方法。
マップクラスの中にはイベントキャラ用のキャラクラスを配置します。
コレだと情報クラスとキャラクラス・マップクラスは依存関係になっちゃうけど、
今の問題はキャラクラスが依存関係にならないようにすることだから、何とかなるかな。
頭の中だとコレでうまく行きそうなんだけど…どうなるコトやら。
全然関係ないけど、今、SAPの掲載メールが来た。
今度はネットランナー。
今日もツクールもどきを作成していた愁です。
何度か実行させていたら、スレッド回りでメモリリークしていることが判明しました。
しかし、トレースしながらデバッグするとリークしない…理由が謎だ…。
仕方ないので、MFCのCWinApp::OnIdle()をオーバーライドしてシングルスレッドにしてみたら解決。
原因が謎だけど…まぁいっか、解決したし。
で、昨日ボヤいてた通り、マップを管理・描画するクラスを作成。
見た目もスッキリしたけど、もっと嬉しいコトが。

FPSが75も出てるんですよね。
FPSって言うのはFrame Per Second、1秒間に描画できたフレーム数で、
この場合1秒で75回画面を更新できたことになります。
愁さんの環境はディスプレイのリフレッシュレートを75にしてるので、
フルで画面更新できていることになります。
描画時間から計算した論理値だと、145fpsぐらいは出るみたいです。
まだ処理が軽いから出るんだと思うけど、最低でも60fpsを落とさないようにしたいですね…。
余談ですが、改良前は58fpsしか出てませんでした。
何が原因だったんだろう…。(汗)
というコトで今日はこの辺でw
何度か実行させていたら、スレッド回りでメモリリークしていることが判明しました。
しかし、トレースしながらデバッグするとリークしない…理由が謎だ…。
仕方ないので、MFCのCWinApp::OnIdle()をオーバーライドしてシングルスレッドにしてみたら解決。
原因が謎だけど…まぁいっか、解決したし。
で、昨日ボヤいてた通り、マップを管理・描画するクラスを作成。
見た目もスッキリしたけど、もっと嬉しいコトが。

FPSが75も出てるんですよね。
FPSって言うのはFrame Per Second、1秒間に描画できたフレーム数で、
この場合1秒で75回画面を更新できたことになります。
愁さんの環境はディスプレイのリフレッシュレートを75にしてるので、
フルで画面更新できていることになります。
描画時間から計算した論理値だと、145fpsぐらいは出るみたいです。
まだ処理が軽いから出るんだと思うけど、最低でも60fpsを落とさないようにしたいですね…。
余談ですが、改良前は58fpsしか出てませんでした。
何が原因だったんだろう…。(汗)
というコトで今日はこの辺でw
さて、昨日の引き続き作成していたんですが、思わぬトラブルに巻き込まれてしまいました。

縮小しているので分かりづらいかもしれませんが、三角形の描画がヘンです。
色もヘンだし、所々の色がヌケてます。
昨日の三角形はトランスフォーム済みといって、あらかじめジオメトリ計算(?)をしたものだったんですよね。
要は3D座標を2D座標にあらかじめ変換しておいた座標を表示させていたんです。
で、今回はジオメトリ計算をDirect3Dにさせたらこうなったんです。
…原因は何だろうって、数時間悩みました。
そしたらあっさり解決。
Zバッファをクリアしてなかったんですよね。(笑)
トランスフォーム済み座標ならジオメトリ計算する必要ないから、Zバッファ使わないし、
未トランスフォーム済み座標なら、ジオメトリ計算にZバッファを使うからクリアしないと仕方ない。
クリアしてないんですもん、計算結果がヘンにもなりますよねー。(笑)
知識がないとは罪ですね…。
で、適当に用意したマップチップとマップデータを使ってマップ表示。

マップチップになる画像を内部で分割してテクスチャとしてポリゴンに関連付けて描画するだけなんですが、
float計算に誤差があるのか、たまに数ドットズレが発生するので、
とりあえずはスプライトで表示させました。
ここまではいつも通りだけど、マップを管理・描画するクラスを1つ作って中身を綺麗にしてみようかな。
というコトで今日はこの辺で。

縮小しているので分かりづらいかもしれませんが、三角形の描画がヘンです。
色もヘンだし、所々の色がヌケてます。
昨日の三角形はトランスフォーム済みといって、あらかじめジオメトリ計算(?)をしたものだったんですよね。
要は3D座標を2D座標にあらかじめ変換しておいた座標を表示させていたんです。
で、今回はジオメトリ計算をDirect3Dにさせたらこうなったんです。
…原因は何だろうって、数時間悩みました。
そしたらあっさり解決。
Zバッファをクリアしてなかったんですよね。(笑)
トランスフォーム済み座標ならジオメトリ計算する必要ないから、Zバッファ使わないし、
未トランスフォーム済み座標なら、ジオメトリ計算にZバッファを使うからクリアしないと仕方ない。
クリアしてないんですもん、計算結果がヘンにもなりますよねー。(笑)
知識がないとは罪ですね…。
で、適当に用意したマップチップとマップデータを使ってマップ表示。

マップチップになる画像を内部で分割してテクスチャとしてポリゴンに関連付けて描画するだけなんですが、
float計算に誤差があるのか、たまに数ドットズレが発生するので、
とりあえずはスプライトで表示させました。
ここまではいつも通りだけど、マップを管理・描画するクラスを1つ作って中身を綺麗にしてみようかな。
というコトで今日はこの辺で。
Utilities
- タグ
- カレンダー
- 最近の更新
- Adsense