1 名前:名前は開発中のものです。 mailto:sage [2008/10/25(土) 17:37:53 ID:BCFbbKco] Cを習得した程度のスキルでも、 GUIのゲームを比較的容易に作成する事を可能にする、 「DXライブラリ」に関するスレッドです。 DXライブラリの詳細ついては homepage2.nifty.com/natupaji/DxLib/ を参照して頂きたい。 DXライブラリに関するテクニックなどの情報交換などを行う事で、 多くのDXライブラリユーザのスキルの向上に役立てたら幸いです。 過去スレ:DXライブラリ 総合スレッド pc11.2ch.net/test/read.cgi/gamedev/1197468399/
794 名前:名前は開発中のものです。 mailto:sage [2009/03/09(月) 22:34:04 ID:GzA1DnX1] 押しっぱをできなくするようにしたいけど char a[256] GetHitKeyStateAll(char *a) つかうとうまくできねぇ。。 ポインタをctrcmpやるのはおかしいの? それとも配列に入ってるのがおかしいの? 俺の頭がおかしいの?
795 名前:名前は開発中のものです。 mailto:sage [2009/03/09(月) 23:19:34 ID:2qC8QqlY] >>774 遅レスだがコンストラクタについて幾つか書きます。 さすがに長文書いてコメントが無いのは可哀想だったから。 昔の言語仕様ではコンストラクタではインスタンスの生成途中であるから複雑な処理を書かないようにしていた。これは慣習・慣例の部類の話。 コンパイラの亜種が多くて、C++の仕様外の範疇での動作はどのようになっているのか分からない時代だったからという背景もある。 自分はコンストラクタに初期化処理を噛ませる横着な書き方をしていたときに先輩に指摘された事は、1,2,3以外にも、、、 ・クラス設計者とクラス利用者は同じでない ⇒利用者がstaticで外部変数なインスタンスを生成するかもしれないから、 mainよりも先に呼ばれる処理に複雑な記述を置くべきでない。 つまり、利用者の立場になって明示的に初期化処理を宣言するべき。(手を抜くな) ・戻り値を持たない件に関して、例外処理を使うのは怠惰な手段である。 ⇒try-catchを用いるのは、デバッグの最終手段である。(例外処理はネストできない為) 例外処理は一般的にコンパイラの最適化の阻害となり遅くなる要因となる。(ジャンプテーブルを生成する為) つまり、保持値チェックにはassert使えというお話。 ⇒メモリ確保に失敗する危険性をもっと認識するべき 特定のハードウェアを対象にする場合、大概は独自のメモリアロケーター(dlmalloc等)を実装していることが多く、 new失敗の可能性(インスタンス生成失敗)は大いにある。 とのことでした。 >問題点は、 >「このような状態で他のクラスのインスタンスのメンバ関数を読んだりすると巡り巡ってまだ生成途中の自分自身のメンバ関数が呼ばれるかもしれないから」 >との事です。 これには同意です。 だから「コンストラクタに記述するのはせいぜいメンバ変数に対して初期値の代入ぐらい」に留めている人が大半で自分もそうしています。 いや〜、バグの無いプログラムって難しいですね。
796 名前:名前は開発中のものです。 mailto:sage [2009/03/09(月) 23:31:07 ID:2qC8QqlY] >>794 上手くできないってどういう意味? char m_cKey[2][256]; //キーバッファ とでもして 毎フレーム void GetAllState(){ memcpy(m_cKey[1],m_cKey[0],256); ::GetHitKeyStateAll(m_cKey[0]); } を呼んで、 int GetKeyPress(int KeyCode){return m_cKey[0][KeyCode];}//キーが押されているかどうか int GetKeyDown(int KeyCode){return (m_cKey[0][KeyCode] && !m_cKey[1][KeyCode]);}//キーが押された瞬間 int GetKeyUp(int KeyCode){return (!m_cKey[0][KeyCode] && m_cKey[1][KeyCode]);}//キーが離された瞬間 とでもすればおk 前フレームとの差分で押された瞬間と話された瞬間を検出するべさ
797 名前:名前は開発中のものです。 mailto:sage [2009/03/09(月) 23:31:59 ID:6kYj4gTE] >>794 エスパーじゃないんで、 何をやって何ができないのかすら分らん。 とりあえず、×ctrcmp =>○strcmpだと過程しても検討範囲外。 ポインタの使い方とか、関数の使い方は大丈夫だと仮定してもだ・・・・。 そもそも、そのchar a[]が何を入れるか理解してるかい? そいつらに入るのは、あるキーが押されてるかどうかのon offフラグであって、 押されてるキーがchar型として'o'みたいに入るわけじゃないぞ。 押しっぱなしは、基本的には、 char NowKey[256]; char OldKey[256]; // ....somewhere to initilaize Nowkey[] and OldKey[], to 0. GetHitKeyStateAll( NowKey );//Now get putting on key if( NowKey[ KEY_INPUT_Z ] == 1 ) { if( OldKey[KEY_INPUT_Z] != 1 ) { PutOnFUNCTION(); // only not on putting Z_KEY. OldKey[KEY_INPUT_Z]=1; } //There is No doing on putting Z_KEY. } else { OldKey[KEY_INPUT_Z]= 0 ; //No to put Z_KEY, initialize OldKey[] to 0. } な感じに書く。
798 名前:名前は開発中のものです。 mailto:sage [2009/03/09(月) 23:42:23 ID:YtHLVg0L] 推しっぱをできないようにするなんて int pushOK = 0; とか用意しといて if (a[チェックしたいキー] && pushOK) {押したときの処理} if (!a[チェックしたいキー]) pushOK = 1; とかやればいいじゃない (※厳密な文法に突っ込むのなしね、あと変数名が良くないことにもね)
799 名前:名前は開発中のものです。 mailto:sage [2009/03/09(月) 23:49:28 ID:GzA1DnX1] あぁ。詳しくなくてすまん。ありがとう。 でも、なんとか、動作はしたぜ。
800 名前:名前は開発中のものです。 mailto:sage [2009/03/10(火) 00:11:41 ID:Y5ijcxK4] LoadSoftImage()でPNG-8のパレットが取得も設定もできん…。 パレットはBMPしか有効じゃないんか。 透過色設定とパレット変更を同時にしようと思うと、PNG-8がベストな選択だったんだけど、 さてどうするべか……。
801 名前:名前は開発中のものです。 mailto:sage [2009/03/10(火) 00:43:20 ID:liOB0hIm] どっかの時点でBMPに変換されるんだろうけど その時点じゃまだなんだろうかね。 てかそんな命令あったのか……。
802 名前:名前は開発中のものです。 mailto:sage [2009/03/10(火) 01:39:41 ID:Y5ijcxK4] PNGについてはlibpng使ってるっぽいからなぁ。 パレット変えられないのは困ったぜ。
803 名前:名前は開発中のものです。 mailto:sage [2009/03/10(火) 02:42:45 ID:f5O5uX62] libpngって最近脆弱性が発見されたよね
804 名前:名前は開発中のものです。 mailto:sage [2009/03/10(火) 05:14:32 ID:Y5ijcxK4] パレットアニメーション諦めて、アルファブレンディングで代用できるんかな……。 例えば、パレットアニメーションで void PatteGradation(int red,int green,int blue,float ratio) { int new_red,new_green,new_blue; int* p = m_pPalette; //元のパレット配列[3*256] for (int i=0;i<256;++i) { new_red = *p + (int)((red - *p)*ratio); p++; new_green = *p + (int)((green - *p)*ratio); p++; new_blue = *p + (int)((blue - *p)*ratio); SetPaletteSoftImage(m_nSoftHandle,i,new_red,new_green,new_blue,0); } } という感じで指定の色(red,green,blue)にratioの比(0〜1.0)で近づくエフェクトを考えているんですが、 これと同じ機能をブレンドモードを変更することで代用可です? 上手い演算具合が見つからない。
805 名前:名前は開発中のものです。 mailto:sage [2009/03/10(火) 05:17:44 ID:Y5ijcxK4] あ、一個p++抜けてた。 でも、伝えたいことは伝わったはず。
806 名前:名前は開発中のものです。 mailto:sage [2009/03/10(火) 05:52:02 ID:6T+yw6I/] フェードイン?
807 名前:名前は開発中のものです。 mailto:sage [2009/03/10(火) 06:29:38 ID:Y5ijcxK4] そうですね、指定色へのフェードイン・フェードアウトという感じです。 SetDrawBright()では黒フェードが出来ますが、それの多色化&抜き色対応版です。
808 名前:名前は開発中のものです。 mailto:sage [2009/03/10(火) 09:58:02 ID:1/mzBUbU] 2パターンだけ作って重ねてアルファを変えていくのが効率いいんじゃないかな
809 名前:名前は開発中のものです。 mailto:sage [2009/03/10(火) 11:39:59 ID:xhsEfov4] >>793 ゲームパッドがX-BOX専用コントローラーしか使えないとか論外すぎる。
810 名前:名前は開発中のものです。 mailto:sage [2009/03/10(火) 15:29:37 ID:AMym+srg] >>809 つ www.4gamer.net/games/027/G002741/20090227065/
811 名前:名前は開発中のものです。 mailto:sage [2009/03/10(火) 16:10:09 ID:qoncgAvF] 使う側ならともかく、作って配布する側ならそれは解決にならんでしょ。 まあ自分で対応のパッド追加できると思うけどな。
812 名前:名前は開発中のものです。 mailto:sage [2009/03/10(火) 16:12:21 ID:xhsEfov4] >>810 いや、そういう問題では・・
813 名前:名前は開発中のものです。 mailto:sage [2009/03/10(火) 21:25:09 ID:LXtgug0h] >>809 やっぱり白黒2値のパターンが別途居るようですよね……。 PNG使ってるのに、わざわざマスク画像が必要なのがめんどくさいと敬遠しているんですよ。
814 名前:名前は開発中のものです。 mailto:sage [2009/03/11(水) 00:49:09 ID:SDHRypL0] あれGraphLockって関数がいつのまにか消えたのか、と思って検索したら出た hpcgi2.nifty.com/natupaji/bbs/patio.cgi?mode=view&no=1044 >GraphLock は現在のPC環境に適していないので非公開関数にすることにしました これってどういう意味なの?非対応な環境が多いの?詳しい人教えて 一応コピペ 宣言 int GraphLock( int GrHandle , int *PitchBuf , void **DataPointBuf ) ; 概略 グラフィックメモリ領域のロック 引数 GrHandle : ロックするグラフィックのハンドル(または画面の識別子) PitchBuf : ロックするグラフィックの1ライン辺りのバイト数を保存する変数へのポインタ DataPointBuf :グラフィックデータのあるメモリへのアドレスを保存するポインタへのポインタ 戻り値 0:成功 −1:エラー発生 宣言 int GraphUnLock( int GrHandle ) ; 概略 グラフィックメモリ領域のロック解除 引数 GrHandle : ロックしたグラフィックのハンドル(または画面の識別子) 戻り値 0:成功 −1:エラー発生
815 名前:名前は開発中のものです。 [2009/03/11(水) 12:48:22 ID:4qWzS982] >>814 対応してないとかじゃなくて、単に古くて多用されない技術だからじゃないかと無責任に予想
816 名前:名前は開発中のものです。 mailto:sage [2009/03/11(水) 23:25:34 ID:tpGaQ5tp] 使えたら部分的なぼかしとか波紋とか屈折描画とかできて表現の幅ひろがりまくりんぐなのに・・・
817 名前:名前は開発中のものです。 mailto:sage [2009/03/11(水) 23:28:32 ID:jT1zwAC2] シェーダサポートフラグですね。わかります。
818 名前:名前は開発中のものです。 mailto:sage [2009/03/12(木) 00:06:32 ID:5lgaab4l] >>816 いいなぁそういうの使ってみたい。
819 名前:名前は開発中のものです。 mailto:sage [2009/03/12(木) 14:35:44 ID:hH9qj7K7] 歪みはテクスチャに背景を描画→2Dポリゴンで挑戦中
820 名前:名前は開発中のものです。 mailto:sage [2009/03/12(木) 23:20:03 ID:TV/Jr7F7] >>814 からの流れに関連してるかわからないけど、 ちょっと前に気になった事があるので質問させてください LoadGraph系統以外で作成したグラフィックハンドルから グラフィックデータのメモリを参照し、編集する事ってできないんしょうか? SoftImage系の関数で同じような事はできるみたいだけど、 これは画像ファイルから取得したもののみですよね。。
821 名前:名前は開発中のものです。 mailto:sage [2009/03/13(金) 00:27:53 ID:CMJVUsQ6] >>820 MakeXXXColorSoftImageじゃあかんの?
822 名前:名前は開発中のものです。 mailto:sage [2009/03/13(金) 00:43:55 ID:GbqqCgmR] Easy3D正式版きてるな
823 名前:名前は開発中のものです。 mailto:sage [2009/03/13(金) 01:09:59 ID:H+Qfngp2] >>820 ありがとう、今気付いたんだけど先に用途を書くべきでした。 例えば>>816 の波紋を実現しようと考えた時、 「このエフェクトをかける前までに描画された画面から エフェクトをかけたい矩形のグラフィックを取得して、 これを元にピクセルを書き換える」 という処理を考えてみたんですが、GetPixelは重いようなので、 なら直接メモリを参照できないかと思った次第です。 MakeXXXColorSoftImageで作成するのはソフトグラフィックハンドルなので、 ここを描画先にしたりはできませんよね。。?
824 名前:名前は開発中のものです。 mailto:sage [2009/03/13(金) 01:19:10 ID:H+Qfngp2] >>823 訂正:ソフトグラフィックハンドル->ソフトイメージハンドル あと「描画先」と書いたのは、「DrawGraph等で描画できる描画先」という意味です。 直接グラフィックハンドルをソフトイメージハンドルに変換できる方法があればよいのですが。 そもそもこの考え方自体がアホなんでしょうか。。。
825 名前:名前は開発中のものです。 mailto:sage [2009/03/13(金) 03:43:56 ID:CMJVUsQ6] >>824 画面全体にエフェクトを掛けたりするのに有ると便利だが、ちょっと調べてみたが出来ないっぽいね。 そもそもLoadGraphやMakeGraphはVRAMに転送した時点でPC環境に依った画像フォーマットに変換されちゃうから、 そこからソフトイメージハンドルを生成するとなると、コンバーター(デコーダ相当)が必要になる。 DXライブラリの作者としては手間が掛かるから、要望が無い限り実装を見送っていると予想している。 優しい作者さんなんで、要望送ってみてはどうかな? 現状で対応するとなると、どうしても遅くなるが、 画面サイズと同じ大きさにMakeGraphした裏画面領域をSetDrawScreenして、 一連の画像を転送し、GetPixcelとDrawPixcelするのがベストな選択かねぇ。 SaveDrawScreenを使ってbmp保存して、そこからSoftImageを作るという最終手段もある。(とても遅い)
826 名前:名前は開発中のものです。 mailto:sage [2009/03/13(金) 03:50:25 ID:CMJVUsQ6] >>823 ああ。書いてておもったが、SaveDrawScreenがあるから、デコーダ処理は既に内部には出来てるのか。 作者に要望だすと、すぐに実装してくれると思うよ。
827 名前:名前は開発中のものです。 mailto:sage [2009/03/13(金) 04:00:17 ID:HX55tf54] 解説 グラフィックデータのあるメモリ領域には『ロック』をしなくては アクセスする事が出来ません。 細かい事は抜きにしてとにかくWindows 環境ではメモリの管理が厳重なので malloc関数 などで確保したメモリ 領域のように簡単にはアクセスは出来ないようになっています。だから 『ロック』という作業を行い直接アクセスできるようにします。 グフィック領域に直接アクセスする利点はDrawPixel や GetPixel 関数を使用するよりも処理が速い、等があります。 ロックの説明をはじめる前に注意なのですが、ロックを行った場合は 直接アクセスが終り次第直ちにロックを解除してください。 ロックを している最中にデバッグモードなどのブレークポイントを使ってプロ グラムを止めるとハングアップするので注意してください。 ロックを すると 『GraphUnLock』関数を使用してロックを解除しない限り DrawLineをはじめすべての描画関数が使用不可能になるので注意してください。 では話を元に戻します。 ロックをするにはまずロックをしたいグラフィックハンドル、または DX_SCREEN_FRONT , DX_SCREEN_BACK 識別子を使って画面をロックする 事も出来ます。 ロックが完了すると関数は PitchBuf に指定したポインタにロック したグラフィック領域の1ライン辺りのバイト数と、DataPointBuf で 指定したポインタにロックしたグラフィックへのアドレスが代入されます。 こうしてロックしたグラフィック領域にはめでたく直接アクセスが 出来るようになります。まず希望の座標(点)にアクセスするには 以下の式を用います (グラフィック領域の先頭アドレス) + (X座標値 × (グラフィックのカラービット数 ÷ 8)) + (Y座標値 × 1ライン辺りのバイト数) = 希望の座標のポインタ
828 名前:名前は開発中のものです。 mailto:sage [2009/03/13(金) 04:02:17 ID:HX55tf54] この中の『グラフィック領域の先頭アドレス』と言うのは DataPointBuf から取得できる値、『1ライン辺りのバイト数』は PitchBuf から取得できる値 『グラフィックのカラービット数は』SetGraphMode関数 の 引数 ColorBitNum の値(デフォルトでは16です)となります。 次に1ドット辺りのビット数はカラービット数と比例します、以下に カラービット数と一般のデータ型との比例関係を示します。 8bitカラー char 型と同サイズ 16bitカラー short 型と同サイズ 32bitカラー int 型と同サイズ もし16ビットカラーのグラフィックに1ドット分データのアクセスを するつもりで int 型変数で値を代入した場合は2ドット分描画してしまう ので注意してください。(アドレスの算出のときも同じです) 注 … グラフィックをロックする場合は SetUse3DFlag 関数で3D機能を使わない設定にしてからLoadGraph,MakeGraph等で作られたグラフィックでないとロックは失敗します。 例 128×128のグラフィックデータを作成し、座標( 24 , 11 ) の点に色コード0を代入します。(16ビットカラー) char *GraphData ; short *DrawPoint ; int Pitch , GHandle ; // グラフィックの作成 GHandle = MakeGraph( 128 , 128 ) ; // グラフィックのロック GraphLock( GHandle , &Pitch , &GraphData ) ; // 座標( 24 , 11 )のデータのアドレスを算出 DrawPoint = ( short * )( GraphData + 24 * ( 16 / 8 ) + 11 * Pitch ) ; // 色コード0を代入します *DrawPoint = 0 ; // ロックを解除します GraphUnLock( GHandle ) ;
829 名前:名前は開発中のものです。 mailto:sage [2009/03/13(金) 04:05:06 ID:HX55tf54] サンプル 表画面をロックして直接アクセスで画面にグラデーションを描きます #include "DxLib.h" int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ){ int i , j , k ; int Pitch ; short *DrawPoint , Cr ; char *GraphData ; if( DxLib_Init() == -1 ){return -1;} // 表画面をロックします GraphLock( DX_SCREEN_FRONT , &Pitch , ( void ** )&GraphData ) ; // 画面にグラデーションを描きます for( i = 0 ; i < 480 ; i ++ ) { for( j = 0 ; j < 640 ; j ++ ) { // 色の値を取得 k = 255 * i / 480 ; Cr = ( short )GetColor( k , k , k ) ; // 描画する座標のポインタを計算 DrawPoint = ( short * )( GraphData + j * ( 16 / 8 ) + i * Pitch ) ; // グラフィックデータへの直接アクセスで点を描画 *DrawPoint = Cr ; } } // 表画面のロックを解除(『GraphUnLock』使用) GraphUnLock( DX_SCREEN_FRONT ) ; // キーの入力待ち WaitKey() ; DxLib_End() ; // DXライブラリ使用の終了処理 return 0 ; // ソフトの終了 }
830 名前:名前は開発中のものです。 mailto:sage [2009/03/13(金) 04:17:46 ID:CMJVUsQ6] >>827 ありがとう。 GraphLock/Unlockなかなか便利だねぇ ちょっと使ってみます 作者から非公開関数になった理由が知りたいとこだね
831 名前:名前は開発中のものです。 mailto:sage [2009/03/13(金) 10:15:03 ID:H+Qfngp2] >>825-829 なるほど、そのためのGraphLock/UnLockだったのか。 あと非公開関数になっただけで使う事はできるんですね。 てっきり使用すらできなくなったものだとばかり思ってました。。。 とりあえずはこれで出来そうなので、デコード処理の要望の方は見送ろうかと思います。 お二方とも、ありがとうございました。