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/
764 名前:名前は開発中のものです。 mailto:sage [2009/03/08(日) 01:07:09 ID:PVP1w5NP] >>758 .r==x r==x /三/.|/三/ | (三(/(三(/_/ l ̄¨'| ̄ ̄¨| l;::::::::|:::::::::::::l l;::::::::|:::::::::::::l l;::::::::|:::::::::::::l l;::::::::|:::::::::::::l l;::::::::|:::::::::::::l l;{==}!::{==}:::l r|:::::::::::::::::::::::| _ノ  ̄`ー--、,;;l~ヽ ,∠==、ヽ `i'ー- . l / ヽ| 「`'ー、`ー、 .ノ l ミ| / `ー、ヽ /j R|イ ー-ァ、. Y゙ { [`ュハハハr''~] ̄ ___ノ ソースうpお願いします!!!!!!!!!!
765 名前:名前は開発中のものです。 mailto:sage [2009/03/08(日) 02:05:16 ID:Os5GQobq] >>764 今PC故障中で携帯から書き込んでるので、一週間後位になるけど…… 龍神録プログラミングの館に似たような内容の講座があったので、 それを参考にした方が早いかも? 自分のソースと比べた所、アルゴリズムは大差なかったし
766 名前:名前は開発中のものです。 mailto:sage [2009/03/08(日) 03:07:46 ID:PA5CtbPk] >>760 >>762 それだわ。 メインループの外だったよ。
767 名前:名前は開発中のものです。 mailto:sage [2009/03/08(日) 07:29:17 ID:CGpW+st2] >>763 そうなの? 憂鬱本かなにかにコンストラクタで複雑な処理はやめたほうがいいって 書いてあったから信じてたよ。
768 名前:名前は開発中のものです。 mailto:sage [2009/03/08(日) 11:20:16 ID:lUOcnlf/] 使うほうが失敗したときに面倒でしょ、コンストラクタだと
769 名前:名前は開発中のものです。 mailto:sage [2009/03/08(日) 11:49:19 ID:8uH2yrBU] 例外処理を全面的に取り入れてるならコンストラクタで失敗してもおk 失敗したら絶対に例外を投げること そうでなければダメ
770 名前:名前は開発中のものです。 mailto:sage [2009/03/08(日) 13:15:29 ID:sz9LKWkI] >>767 言語仕様的にはまったく問題ない >768が言ってるように、 その本には別の理由でやめたほうがいいって言ってるんだと思うよ ただし、staticなインスタンスは例外で この場合、mainが呼ばれる前のスタートアップルーチンで インスタンスが生成されるのでコンストラクタでは 初期化以外のことをやるとまずい
771 名前:名前は開発中のものです。 mailto:sage [2009/03/08(日) 15:28:40 ID:Os5GQobq] 東方の新作が発表される度に自作のゲームとシステムが被っててヘコむ……
772 名前:名前は開発中のものです。 mailto:sage [2009/03/08(日) 15:35:38 ID:26PtmX+G] >771 それを気にしてたら、世の中作品なんて生まれない。 大丈夫、何ら問題ない。思う存分やれ。キミは盗作じゃない。 ……自分のやりたいことを、他の人が作ったのでそれで満足しちゃったなら知らんw (こっちもよくある話だけどな!)
773 名前:名前は開発中のものです。 mailto:sage [2009/03/08(日) 17:25:05 ID:tah76f/h] 弾幕シューは東方だけじゃないしね
774 名前:761 mailto:sage [2009/03/08(日) 18:12:09 ID:pjH2xL1q] >>770 俺も>>767 のように憂鬱本で読んで信じてきたんだけど、後学のために教えて欲しい。 まず憂鬱本にはこんな風に書いてある。 ・コンストラクタやデストラクタはあまり難しい処理をするのは考え物。 1・返り値を持つことが出来ない。 2・インスタンスが完全な状態ではない。 3・外部変数としてクラスインスタンスがある場合、コンストラクタやデストラクタはmain()の走る前、後になる。 >>770 さんが言っているのは3の場合で、この本によると 「ポインタとして宣言しておきmain()が走った後でその中でnewする」 という解決策が書いてある。 で、問題の2にははっきりと 「コンストラクタ、デストラクタが走っているときは、インスタンスは完全な状態ではない」 と書いてあり、 「実は内部的にはそのインスタンスの使用するメモリの取得/解放とそれに伴う複雑な作業も行っている」 「インスタンス自体がまだ生成途中であり、内部的にはまだ不安定な状態」 と書いてあります。 問題点は、 「このような状態で他のクラスのインスタンスのメンバ関数を読んだりすると巡り巡ってまだ生成途中の自分自身のメンバ関数が呼ばれるかもしれないから」 との事です。 C#なんかではコンストラクタでのメソッドの呼び出しなども保障されてますが、C++では言語使用的には保障されていない、と解釈したのですがここらへんどうなんでしょうか?
775 名前:名前は開発中のものです。 mailto:sage [2009/03/08(日) 19:09:05 ID:CrTNgcou] この際、本家DXライブラリにDXライブラリ3Dを機能統合してしまっても良いんじゃないか? 今どき2Dだけじゃなぁ
776 名前:名前は開発中のものです。 mailto:sage [2009/03/08(日) 19:25:34 ID:tHlNETTL] >>775 いや、意味が分らん。 碌にDirectXすら使えない人間が3Dに手をだしてどうしたいんだ? むしろ、本家は本家であの程度でまとまってるからこそ良いライブラリだろ。 もっと色々とやりたかったら海外の3Dライブラリをあさればいい。高機能の多いぞ。 (まぁ、普通に日本語対応がメンドイけど。)
777 名前:名前は開発中のものです。 mailto:sage [2009/03/08(日) 19:52:53 ID:CrTNgcou] っていうか、DXライブラリ3Dの開発を継続してほしいJEXさん
778 名前:名前は開発中のものです。 mailto:sage [2009/03/08(日) 23:53:47 ID:Os5GQobq] >>772 ,773 弾幕毎に名前付けてるから、気を付けないとまんまになっちゃうんだよね もう開き直っちゃおうかな……
779 名前:名前は開発中のものです。 mailto:sage [2009/03/09(月) 00:24:37 ID:y+3gsDNg] どうせやるなら「白い弾幕くん」くらい自由度上げてみたらどうだ
780 名前:名前は開発中のものです。 mailto:sage [2009/03/09(月) 05:38:20 ID:xYWyf4vJ] 縦弾幕だったらどうやったって東方っぽいって言われるのがオチだから、 変なこと気にせず好きにやっちゃえYO!
781 名前:名前は開発中のものです。 mailto:sage [2009/03/09(月) 13:06:42 ID:Ge4atQjd] 東方のオマージュである、と明記しちゃえば変な因縁はつけられなくなると思う
782 名前:名前は開発中のものです。 mailto:sage [2009/03/09(月) 13:28:18 ID:1MIteGpr] 自分で考えて実装した者に対して なんという屈辱を。
783 名前:名前は開発中のものです。 mailto:sage [2009/03/09(月) 14:58:21 ID:Yq7DJGmB] パクってないんなら堂々としてればいいじゃない ここで愚痴る前にちゃっちゃと完成させて もう東方に先を越されないようにすればいいじゃない
784 名前:名前は開発中のものです。 mailto:sage [2009/03/09(月) 15:06:44 ID:mr6tRDyA] 先を越されたから愚痴ってるんだと思うがのw
785 名前:名前は開発中のものです。 [2009/03/09(月) 15:12:00 ID:anLE8kz6] 新しいの出るごとに被るというと 低速移動時に敵を貫通するとかボム使うとパワーが減るとかその辺りか?
786 名前:名前は開発中のものです。 mailto:sage [2009/03/09(月) 15:54:45 ID:z4EGzSSU] 別に愚痴のつもりじゃありませんでした こうやって悩むのもゲーム制作の楽しさの一つなので…… 気分を害されたのならすいません >>785 点レートアイテムとか、特殊アイテムを取るとボーナス敵が出る点が……
787 名前:名前は開発中のものです。 mailto:sage [2009/03/09(月) 17:01:47 ID:GzA1DnX1] どんなシューティングでもお前。。。
788 名前:名前は開発中のものです。 mailto:sage [2009/03/09(月) 18:04:17 ID:dWRPooR0] Q.○○のパクリですか? A1.はい、参考にしました。 →盗作イクナイ! 俺の好きな○○を汚すな! ○○の公式サイトのBBSに通報(?)書き込み A2.いいえ、オリジナルです。似ているのは偶然でしょう。 →嘘を言うな、正直に言えよ A3.いいえ、○○ではなく△△のパクりです。 →そんなん知らねーよ! △△も○○のパクりだな! 実際にあるから困る。
789 名前:名前は開発中のものです。 mailto:sage [2009/03/09(月) 18:28:11 ID:aHHsyNV0] 結論:気にせず作れ 作ることにも価値がある
790 名前:名前は開発中のものです。 mailto:sage [2009/03/09(月) 18:40:02 ID:6kYj4gTE] >>788 どっちかと言うと、この手の奴で、実際にパックたりしてなかったら、 何も答えないのがベスト。ただただ、事務的返しで流すべし。 あと、>>786 みたいのは 東方以前からあるのばっかじゃねぇかよwww それこそ、ファミコン全盛の時代(のアーケード)から・・・・ 「今更それを先を越されたとかwww」 と言われるのが落ちじゃね?
791 名前:名前は開発中のものです。 mailto:sage [2009/03/09(月) 18:51:35 ID:z4EGzSSU] んー、今更だけど自分で気にしすぎだった気がしてきた 前作が東方をリスペクトしたものだったので、今回も素直に断り書きを入れてみます
792 名前:名前は開発中のものです。 mailto:sage [2009/03/09(月) 19:02:29 ID:dWRPooR0] パロディにまで昇華させてしまうという手もあるな。
793 名前:名前は開発中のものです。 mailto:sage [2009/03/09(月) 21:33:00 ID:Zw6a9bk0] siv.creation.googlepages.com/home 知ってるとは思うがこれにはずっと期待してる
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だったのか。 あと非公開関数になっただけで使う事はできるんですね。 てっきり使用すらできなくなったものだとばかり思ってました。。。 とりあえずはこれで出来そうなので、デコード処理の要望の方は見送ろうかと思います。 お二方とも、ありがとうございました。