読者です 読者をやめる 読者になる 読者になる

ゆとりーなの日記

日記的な事を書いて行くと思はれる

DirectX

デスクトップアプリでDirect3D11+Direct2Dの初期化󠄁まとめ

MSDNだとストアアプリの解說が多くて紛󠄁らはしいが色々見て見た感じだと最終󠄁的にこんな感じにすれば良ささう。Windows7でも動くやうにDirect3D11.1を使󠄁つた(が8.1でしか動作確認󠄁してゐないので動くかは知らない)。 // 窓を作る HWND MakeWindow(int width…

COM風の繼承にC++の常識は通󠄁用しない

C++を打つ者󠄁にとつては「"インターフェースクラス"の"デストラクタ"を"virtual"にする」事は日本語で云ふ「"私は"の"は"は"わ"ではなく"は"と書く」くらゐの常識であるが、DirectX等でお馴染みのCOMではこの常識は通󠄁用しない。 例へばXAudio2なんかではボ…

闇鍋勉強会で発表してきました

というわけで3/31(土)に某八王子の方で開催された闇鍋勉強会で怪しい発表をしてきました。内容はDLLインジェクションやらAPIフックやらとなってます。発表時にコードの中で抜けてた部分があったりしたので若干の修正があったりしますが取り敢えずスライドを…

_com_ptr_tとかいうのがあった

COMを扱うときのスマートポインタとしてはCComPtrが個人的には勝手に有名だと思っていたのですが、VC++のExpressにはいない子なので使えない子とか思っていたら_com_ptr_tなるものがあることが判明しました。こんな感じに使えるようです。型の宣言が元と違っ…

D3DVECTORn系の話

Boost.Geometryには浮動小数点数での比較で悲劇が起きないように浮動小数点数かどうかで処理を分岐させるequalsという便利函数が用意されているみたいです。これは便利だなと思ってたんですが、よく考えるとDirectX御用達のベクトルクラスであるD3EDXCECTORn…

描画を別スレッドで行う罠

メッセージループと描画のスレッドは分けるべしという説があったりするわけですが、DirectX9を使う場合においては描画スレッドをメッセージループと違うスレッドにすると、デバイスロストの扱いが面倒になるんですね。というのもIDirect3DDevice9::Reset()っ…

IXAudio2VoiceCallbackをどう扱うか

XAudio2でボイスのコールバックを扱うにはIXAudio2VoiceCallbackを継承して全メソッドをオーバーライドした俺俺コールバックを作るって事になってますが、このIXAudio2VoiceCallbackには仮想デストラクタが実はなかったりします。 というわけで、IXAudio2Voi…

頂点バッファの構造体にBoost.Fusionを使う

頂点バッファとかに使う頂点の構造体の記述をBoost.Fusionを使って楽しようという企画です。 べた書きすればよくないかという話もありますが、 // 頂点と基本色だけ struct diffuse_vertex { float x, y, z; std::uint32_t color; }; // 頂点とライティング…

フォグを切りたいならこれでいいんじゃなイカ?

こっそり書いておきます。こっそりです。 取り敢えず適当にフォグをかけるサンプル"test_fog.exe"を作ります。 #include <memory> #include <Windows.h> #include <d3d9.h> #include <d3dx9.h> namespace std { template <> struct default_delete<IDirect3D9> { void operator ()(const LPDIRECT3D9 ptr) con</idirect3d9></d3dx9.h></d3d9.h></windows.h></memory>…

いらんかった

昨日の話ですが、どう考えてもマップにする必要がなかったみたいなので全部ベクトルで書き換えました。ベクトルにしたのでremove_ifが使える様になった関係上空のベクトルを作る必要もなくなっていい感じです。 #include <cstdint> #include <type_traits> #include <boost/mpl/vector.hpp> #include <boost/mpl/at.hpp> #in</boost/mpl/at.hpp></boost/mpl/vector.hpp></type_traits></cstdint>…

FVFを型で自動計算

DirectXで使うFVFを型で計算してしまおうという無謀な計画が実ったのでメモしておきます。 まず、tagとして次のような空の構造体を定義しておきます。雰囲気イテレータとかで使うあれを真似してみました。 struct dimension2_drawable_tag {}; // D3DFVF_XYZ…

COMったちゃん

DirectXはCOMったちゃんなので、大抵はIUnknownを継承している訳です。よって解放にはRelseaseを使うことになる訳です。これをstd::unique_ptrで扱いうにはカスタムデリータを書いてやるわけですが、特殊化の方向で行くと痛い目にあうみたいです。 namespace…

win32やDirectX由来の型を外に出すことにたいする抵抗

現在制作中のゲーム製作用ライブラリですが、DirectXベースで開発しているのでどうしてもwin32やDirectX由来の型を使用させることを強要してしまうのが現状です。座標とかにはD3DXVECTOR3を使わせたりとある値を指定するときにDWORDを使わせたり・・・。 D3D…

ちょっとした確認に日記を使う人って

class hoge { public: boost::intrusive_ptr<IDirect3DDevice9> device() const {return device_;} private: boost::intrusive_ptr<IDirect3DDevice9> device_; }; というのがあったとき、 void hoge1() { const hoge h; h.device()->メソッド呼び出し; h.device()->メソッド呼び出し; h.device()</idirect3ddevice9></idirect3ddevice9>…

脳が一旦C++モードに入ると他の事がつい疎かになる

graphic::begin_scene、graphic::end_sceneの呼び出しはRAII的なサムシングにした方がC++っぽいのではという話です。途中で例外とかが飛んでもちゃんとgraphic::end_sceneは呼びたいですからね。 namespace { class scoped_render : private boost::noncopya…

親切って裏目ることもあるよね。

そうです。C++には人生のいろはが集約されているのです。前回ゲームメインループの審議をしたので今回は描画に関する審議です。ゲームメインループはrun関数に関数オブジェクトを渡す形式を採用したとして話を進めます。 Direct3D9を使う場合は、描画を行う…

コラム?2D図形なんでも描画

今のところ当口座に於いて図形描画にインターフェイスは次のようになっています。 class DrawObject : private boost::noncopyable { public: void drawBox(float left, float top, float right, float bottom, std::uint32_t &color); private: const boost…

文字列メモ

文字列の描画は今迄はID3DXFont使ってたんですがGetGlyphOutline関数使ってテクスチャに文字列書き込んだ方が速い説が出てきました。しかもテクスチャに文字列書き込むと、拡大縮小、回転、3Dっぽい描画等の処理が図形や画像ファイルを描画するときと同じよ…

第8回〜oggファイルの読み込みとストリーミング再生〜

前回WAVEファイルを鳴らせるようになりましたが、WAVEファイルをBGMとして使う場合サイズが大きくて残念なことになります。そこで圧縮された音声形式で且つライセンス的にも同人ゲームで使いやすそうなoggをBGMとして使いたいと思うのは自然な流れです。そこ…

第7回〜WAVEファイルの読み込みと再生〜

折角XAudio2を初期化しても音声をならせなきゃ意味がありません。さっそくWAVEファイルを読み込んで再生する作業に入ります。 XAudio2で音声を再生する場合、波形データを保存した配列が必要になります。そこでまずはstd::vectorにWAVEデータから波形データ…

第6回〜XAudio2の初期化〜

誰が何と言おうとゲームはBGMが9割なので、音声を鳴らすためにXAudio2の初期化を行います。何故にDirectSoundでないの?と思う人もいるかもしれませんが、Microsoft的にはもうXAudio2を使ってDirectSoundは使うなな空気を出しているのでおとなしく従がっと…

第5回〜画像を描画する〜

流石にそろそろ画像ファイルを描画したいでしょということで今回は画像の描画です。 と、実装に入る前にちょっと準備を。boost先生は便利ですがコンパイル時間が長いのが不便です。あと、何故かインクルード順番によってはエラーが出る組み合わせがあるみた…

第4回〜文字列を描画する〜

四角形を書いたら文字も書きたくなるのが人情です。文字が画面に書ければデバッグ等もしやすくなりますし。 今回はID3DXFont*を使って実装します。他にも実装方法はありますが、私的にはこいつが一番手軽に文字列を書ける気がするのでこいつを使います。この…

第3回〜四角形を描画する〜

前回描画までの準備が整いましたが、今回からいよいよ画面に何かを描画していくことにします。取り敢えずは基本となる四角形を描画していくことにします。 というわけで色々な図形を描画するクラスを作ります。 // drawobject.h #pragma once #include <boost/noncopyable.hpp> #inc</boost/noncopyable.hpp>…

第2回〜Direct3Dの初期化〜

なんだかんだ言ってもゲームの中心はグラフィックと言われているのが現状です。早速ウィンドウに何かを描画できるようにするために今回はDirect3Dの初期化を行います。あと、今回から、"d3d9.lib"のリンクが必要になります。 DirectXのバージョンは、XPを省…

C++とwin32とDirectXとBoostとLuaで作る弾幕シューテイング講座

はじめることにしました。これに合わせてソースコードが見やすくなるようにブログデザインを変えてみました。 私はアマチュアプログラマであり全て独学でやってきたので間違ったことや非効率なコードを書いてしまうことが大いに予想されます。なにかあればコ…

boostは簡単なサンプルはあるけど実用的な使用例が少ないねって言われたので簡単なサンプルをあげてみる

DirectXでテクスチャを管理する際キャッシュするとすれば、まあ画像ファイル名をキーにしてマップ管理するのが普通だと思うのですが、この管理ルーチンを書くのは地味に面倒です。そこでこれらを自動でやってくれるboost.flyweightの出番と言うわけです。 bo…

ゲームに使う浮動小数

所謂floatとdoubleどっちが速いか論争です。大分前に書こうと思って放置してたネタです。私の記憶が正しければ放置したまままだ書いてなかったはずです。 よく言われるのが、最近はfloatよりdoubleの方が速いし精度も良いからdouble一択という話です。これは…

仮想関数テーブルを元に戻す輩がおった

昨日COMメソッドの一部をフックする手法を紹介しましたが、あれと同じ原理でIDirect3DDevice::EndSceneをフックすると、途中でフックが切れる的な現象に見舞われてしまいました。どうやら何者かがせっかく書き換えた仮想関数テーブルを元に戻してしまうらし…

COMフック再び

新たなCOMフックの手法を試したところ成功したのでメモメモ。 目的のメソッドだけCOMフック 以前COMフックの手法をこのブログでも取り上げましたが、あれだとフックしたいメソッドは数個しかないのに、別にそのままの挙動で良いものまできちんと書かないとい…

月例の時間と場所誰か教えて!

KDVの月例です。明日だということしか分かっていません。分からなかったら家でひきこもってます。まあメーリス登録してないので分からないのは残当なんですが。 ゲームライブラリでの画像のキャッシュってどんな形がいいのだろうか 流石に上の内容だけなのは…

早速対応

非想天則のver1.10パッチが出ましたね。なんか色々新しい要素が追加されたりバグ修正が行われたりと盛りだくさんの修正パッチらしいですが、我々世紀末勢にはそんなことどうでもいんです。一番気になるのは色んな値が保存されているアドレスの変動についてな…

XAudioの時代

最近MSDNなんかではDirectSoundよりもXAudio使った方がいいよ的な空気を出していましたが、サンプルをいじったのをコンパイルして実行してもなんかエラーで落ちるので今までは華麗にスルーしていました。去年の初めのころの話です。当時はどういうわけか解説…

久々の以下略

ようやく時間が取れたので前回のフラグの回収作業に入ります。まあDirectXを使っているゲームに好きな絵を表示させることが出来るであろう技術のやり方です。当店では東方非想天則に七星ゲージを表示させることに成功しております。 手順1 APIフック 今回は…