やったー新スレだ
あれ?タイトル名普通は「DXライブラリ総合スレッド その2」みたいにするんじゃないの?まあいいか。スレ立て乙
やっと規制解除された! >1乙
5 :
名前は開発中のものです。 :2008/10/25(土) 21:50:29 ID:/GWPXvud
もうすぐ3009年になるのにこのスレそれまでに埋まるんだろうか・・
6 :
名前は開発中のものです。 :2008/10/25(土) 21:51:12 ID:/GWPXvud
あ、ごめん20099ねんだxちゅt
7 :
名前は開発中のものです。 :2008/10/25(土) 21:54:26 ID:/GWPXvud
ちょ・・ごめんなさい。途中で送信してしまいました。昭和2009年の間違いです。
, ヘ /\
/´ ̄`ヽ /: : : \_____/: : : : ヽ、
,. -‐┴─‐- <^ヽ、: : : : : : : : : : : : : : : : : : : : : : }
/: : : : : : : : : : : : : :`.ヽl____: : : : : : : : : : : : : : : : : : /
,. -──「`: : : : : : : : : :ヽ: : : : : : : : :\ `ヽ ̄ ̄ ̄ フ: : : : :/
/: :.,.-ァ: : : |: : : : : : : : : :\: : : : :: : : :ヽ \ /: : : :/
 ̄ ̄/: : : : ヽ: : : . . . . . . . . . . .、 \=--: : : :.i / /: : : : :/
/: : ∧: \: : : : : : : : : : ヽ: :\: : : 〃}/ /: : : : :/ 、
. /: : / . : : :! ヽ: : l\_\/: : : : :\: ヽ彡: : | /: : : : :/ |\
/: : ィ: : : : :.i: : | \!___/ ヽ:: : : : : : :\|:.:.:.:/:! ,': : : : / |: : \
/ / !: : : : :.ト‐|- ヽ \: : : : : l::::__:' :/ i: : : : :{ |: : : :.ヽ
l/ |: : :!: : .l: :| \: : : l´r. Y {: : : : :丶_______.ノ: : : : : :}
l: : :l: : :ト、| 、___,ィ ヽ: :| ゝ ノ '.: : : : : : : : : : : : : : : : : : : : : : /
|: : :ト、: |: :ヽ ___,彡 ´ ̄´ ヽl-‐' \: : : : : : : : : : : : : : : : : : イ
!: :从ヽ!ヽ.ハ=≠' , ///// ///u /  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
V ヽ| }/// r‐'⌒ヽ イ〉、
ヽ、______ー‐‐' ィ´ /:/:7rt‐---、 こ、これは
>>1 乙じゃなくて
ィ幵ノ ./:/:./:.! !: : : : :!`ヽ ポニーテールなんだから
r‐'T¨「 |: | !:.∨:/:./: :| |: : : : .l: : : :\ 変な勘違いしないでよね!
/: : .|: :| !:.!ィ¨¨ヾ、:.:/ !: : : : l: : : : : :.\
個人的な意見を言えば、次スレからは前スレで結構話題になった、
DXライブラリ3DのURLもテンプレに入れた方が良いと思う。
私は結構期待しているし、私以外にも注目している人は多いはず。
というわけで自分なりにテンプレ入れてみる。
また、DXライブラリと互換性を持ったライブラリ、
「DXライブラリ3D」が開発も非公式ながらも行われている。
DXライブラリ3Dを用いることにより、DXライブラリの機能に加え、
3Dの処理を容易に行えることが期待できる。
http://fatalita.sakura.ne.jp/3DLib/
11 :
10 :2008/10/25(土) 22:30:40 ID:Vt8TEo7A
>>9-10 FireFox3なんだけどそのリンク先、マウスにDxMainの透明ソースがくっついてはがれなくてクリックできない。
あ、実はDirectXについて調べててたまたま来ただけなんですが、ちょうど埋まってたので立ててみました。
DXライブラリの歴史は古いっぽいからスレタイの番号抜けちゃったのかなと年を入れて見たんですが、
次スレは2009年になりそうだしかまわないかなと。
僕がやりたかったのはDirectX使うゲームの画面をDirectXで静止画キャプチャなんですが、
DirectXでキャプチャするというHyperSnapでキャプチャしても画面が一瞬ロックしちゃうんであきらめました。
いろんなところにもBitBltより遅くなるって書いてあったし。
どんなゲームでもロックするとは限らないけど、ネトゲのセキュリティ機能が影響してるかもしれない。
廃スペックな人からは「そんなロックかからないよ」って言われたし、スペックでカバーできるっぽいし。
こういったライブラリは自前窓への描画や画面への出力前提だろうから、方向性もちょっと違いましたね。
たまたま来てスレ立てとな!
シルバーガンとかレイストームみたいな奴を手っ取り早く作りたい! ……って時には結構強いよね、3D版。 ポリゴンモデルを用意できるかどうかは別として。
>>12 クリックできないとは?
うちもFirefox3だけど問題ないが
DXライブラリの参考になるサイトも一通りテンプレにいれたらいいのに
DXライブラリで、超単純な当たり判定ってどんなのがある? 画像が重なった瞬間消すだけでもいいんだけど、どうすればいいかよくわからん
DXライブラリで、ってのがよく分からんが、ごく普通の当たり判定じゃダメなのか。 最も単純って言うと、 if ( x1 == x2 && y1 == y2 ) とか?
矩形の当たり判定が基本でしょ
円の当たり判定が一番簡単じゃない? 普通にピタゴラスの定理使えばいいだけ
21 :
18 :2008/10/27(月) 23:28:42 ID:OObvFpvs
ぶっちゃけどれも基本だよな。
円の当たり判定はベクトル使うと異常に綺麗に書けるよね
通過しちゃったやつも当たったと判定しなきゃならんこともあるし
ベクトル使うと当たり判定が菱形にならないか?
26 :
名前は開発中のものです。 :2008/10/28(火) 11:15:02 ID:Ot+vqO8g
>>24 あるあるw 処理時間の関係でどうしてもなるよな。あれが厄介
ニコニコでDXライブラリで検索したら16件ほど出てくるのね
30 :
名前は開発中のものです。 :2008/10/29(水) 04:51:17 ID:HeG9A7jn
31 :
名前は開発中のものです。 :2008/10/29(水) 05:21:45 ID:yue3f1oW
>>30 移動前と後の座標間を結ぶ線を引く。線を引くといっても直進なら2つの座標が直線を表す式になる。
直線1本を座標変換によってX軸と一致すると仮定する。
検査対象のオブジェクトのY座標が全てプラスまたは全てマイナスなら交差していない。
検査対象が1本の直線だとしよう。
直線は2つの座標で表されるので、その座標がプラスとマイナス座標の組み合わせなら交差していることになる。
数学では交点を求めるが、交差のみ検査するなら、Y座標だけ調べればいい。
二つの座標を(x1,y1)と(x2,y2)として、y1×y2がプラスなら交差なし、マイナスなら交差ありになる。
ポリゴンは線の集合なので、ポリゴンを構成する全ての直線についてこの計算をするもよし、
正の座標と負の座標それぞれの数を数えるもよし。
座標変換については高校数学で習うけど、ゆとり教育の今は大学まで進まないと習わないだろうね。
コンピューターグラフィックとかシミュレーションやるなら絶対必要な数学なんだけど、
大学生になってから学び始めても理解できるわけがない。
ようするに日本人は優秀なプログラマにはなれない。
論理飛躍しすぎだろjk
>>31 >Y座標だけ調べればいい。
という意味がわからん・・。
x軸と一致するように回転した線分の定義域x0の範囲を
x01< x0 <x02
としたら、この範囲の中でyの掛け算結果がマイナスになれば交差とわかるけど。
もし交点がこのx0の範囲じゃないところで交差していたらどうするの?
直線と直線の交差ならこれでいけるけど、
使いたいときってほとんど線分と線分じゃない?
34 :
名前は開発中のものです。 :2008/10/29(水) 15:36:57 ID:HeG9A7jn
>>33 横レスすみません。直線と線分って定義上違うんですか?
直線と長方形という意味でしょうか?
>>34 直線の長さは無限大。(線分には端が存在するが、直線には端が存在しない)
だから、二本の直線は必ず交差する
注1 並行である場合を除く
注2 2Dの場合に限定
36 :
名前は開発中のものです。 :2008/10/29(水) 15:45:07 ID:HeG9A7jn
>>35 詳しい説明ありがとうございました。なるほどそういう違いがあるんですね。
38 :
31 :2008/10/31(金) 06:44:39 ID:SBgHi4S/
直線と言ってしまったのは悪かった。
まあ確かに
>>33 の言うとおり、x座標の範囲も見ないと実際は分からないけど、
直線とみなさないとy座標だけでは上にあるとも下にあるとも言えないから。
両方を直線とみなせば並行じゃない場合必ず交差する。
でも、平行じゃない直線が取るx座標、y座標は無限となるでしょ。
y座標のみ見るというのは、点として見ているから交差しない。
僕が言いたかったのは、基本的には数学の計算を利用するけど、交点まで求める必要はないということ。
計算手順としては、座標変換後、それぞれのx座標のみについて基準の線分の範囲内にあるかどうかを見て、
次に
>>31 で説明したようにy座標のみを見れば大体判断できる。
x座標が範囲の内と外をまたぐ線はあいまいだけど、
基準線の交差する側の端点を基準にしてx成分とy成分の比率を見れば交差するかどうかが分かる。
ちなみにこの計算方法はキャノンが特許申請してるが
常識なので却下するべき。
http://www.j-tokkyo.com/2003/G06T/JP2003-085568.shtml
こんなのが特許なら俺のソースは特許500個くらいあるな。
>>31 あんた詳しいな。いろいろと。差し支えなければ職業とか聞きたい。
この休みはゲーム作るか……
ポリゴンもそうだが球の当たり判定でいくのが一番簡単 中心と半径だけで計算できる。
何気なく質問した当たり判定だけどピンキリだって事だな
で、DXライブラリに当たり判定してくれる関数はないの?
3D版にはあるね。 本家の隠し関数の中にあるかどうかまでは知らない。
>44 DXライブラリって、そういう系統の関数は用意しないという設計思想のよーな。
DXライブラリの2Dの方は2Dだし別に衝突判定とか用意しなくていいと思う。 初心者なら四角か球同士の判定を自分で実装することの勉強にもなるし2Dは 高校の数学程度で十分自力で実装可能。 3Dならそれだけで分厚い本があったり研究者がいたりするくらいだから面倒だけど。
3DでもAABBや球の辺り判定なら2Dと変わらないよ 2Dでも面倒なことするなら面倒
3DのAABBは、スキンメッシュだと非常に面倒
50 :
名前は開発中のものです。 :2008/11/07(金) 17:21:25 ID:F7VY1GkH
あー、ブロッコリー食いたくなってきた。スレチガイかもしれませんがあれってどうやって食べるの?
すみません。板間違えてました。野菜板で聞いてみますノシ
ちょwww
DXライブラリのスレは勘違いでいいから賑わって欲しい・・w
WMPの視覚エフェクトをまねたいんだけど リアルタイムの画像処理はDXライブラリじゃ難しい?
>>54 DXライブラリを詳しくわからないのだけど、
DXライブラリってテクスチャつかえますよね?
レンダリングターゲットをテクスチャに設定して
そこに視覚エフェクトを描画。
それを、通常レンダリングターゲットにもどして
そのテクスチャを描画してみては?
視覚エフェクトのアルゴリズムがわかれば可能だと思います。
特定のキー以外を取得したいのですが、 例えばエンターキー以外が押されている場合を取得するのはどうやればいいのでしょうか? if (CheckHitKey(KEY_INPUT_0) == 1) { flgOn = true; } if (CheckHitKey(KEY_INPUT_1) == 1) { flgOn = true; } if (CheckHitKey(KEY_INPUT_2) == 1) { flgOn = true; } .... if (CheckHitKey(KEY_INPUT_RETURN ) == 1) { flgOn = false; } のようにして、一つずつどのキーが押されているかを判定して、 その押されたくないキーの時だけフラグをONにしないと言う方法を考えたのですが、 大量に判定(255個?)しないといけません。 それに書く量も多いです。 何か良い方法はないでしょうか?
>56 普通に考えればそうなるんじゃないかなあ。 タイピングを必要とするソフトなんだろうか。
>>56 KEY_INPUT_○○を全部一つの配列に入れとけばループで処理できる
KEY_INPUT_RETURNが来たときだけ別にすればいい
flgOn = false; if (CheckHitKey(KEY_INPUT_RETURN) == 0) { flgOn = true; } じゃだめなの?
あーごめん、だめだ。 エンター押されてない かつ ほかのキーが押されてる だったね
>>56 CheckHitKeyAll( void )を使って、キーボードの状態を監視しておいて、
何か押されたとき、CheckHitKey(KEY_INPUT_RETURN)で、
エンターが押されているかどうか判別する。
エンターが押されていなければ、エンター以外の何かが押されたことになる。
CheckHitKeyAll(void) だとマウスボタンとゲームパッドも反応するので CheckHitKeyAll(DX_CHECKINPUT_KEY) で。 ……これでもパッドが反応するんでコードチェックしたらバグだった。 DxInput.cpp: >// ジョイパッドのチェック >if( CheckType & DX_CHECKINPUT_KEY ) // DX_CHECKINPUT_PAD のはず 気になるならバグ報告して修正を依頼してください。
みなさんありがとうございます。 一応タイピングのゲームです。 ループ処理をヒントに、 bool flgOn = false; for (int i = 0; i < 256; i++ ) { if (i != KEY_INPUT_RETURN) { if (CheckHitKey(i) == 1) { flgOn = true; } } } という風な処理にしたら、一応望み通りの動きができました。 でもバグ有りそうな予感がします。 CheckHitKeyAllを使えばもう少しスマートに書ける……のかな?
タイピングゲームって言っても、使わないキーはあるだろうから そのあたりを省いた方がいいかも
KEYリテラルはビットフラグを利用してると思うから &を使えばシンプルにすっきり書けるはずだよ。
だれかDXライブラリで作ったすごいゲーム等紹介してください
>>66 がすごいと思うかは知らんが、
公式で紹介されてない所だと夜光蛾4とかDiadraEmptyとか。
同人系は「DXライブラリでここまで作れる」っていう良い例が多いな。
DiadraEmptyすげえな。 個人的にはモノリスフィア。
DXライブラリってDirectXのラッパーなんだから2Dならなんでもいけるだろ
71 :
54 :2008/11/10(月) 00:04:21 ID:fweGd5hJ
>>55 描画先変更できたのかーー!
こいつは便利だ
他にも見落としてる便利な関数あるかもと思って久しぶりに本家リファレンスページ見たら
”ドット単位で画像にアクセスしたい関係”ってのが追加されてて便利すぎフヒヒきゃっほう!!!11
もうひとつ質問です。DrawPolygon3Dかなにかで3D平面を、空気遠近法で表示させたいのですが
似非でもいいのでいい方法ないでしょうか
DrawPolygon3DのZ値を変えれば距離が変わるよ。 本家のリファレンスみたらわかるはず。
>>66 あとはゲームではないが
ウディタ(WOLFRPGエディタ)もそうだ。
74 :
名前は開発中のものです。 :2008/11/11(火) 16:04:15 ID:VHeofJsH
8時から11階から目薬の企画実行移します。場所は↑のとこで。 参加者は今のとこ私の他は3人です。その後焼き鳥でも食べに行きましょう。
最近のグラボは、古いDirectXにマトモに対応しておらず DXライブラリもその煽りを食らってるって聞いたんだけど、どうなん?
そうなの? 9600GT,8800GTS,6600GTの3つ使ってるけどどれも不具合出たこと無いよ。 それよりVistaでたまにおかしなことになる・・。 同じコードで動かしてもXPとVistaじゃ違う挙動することが。 一つ一つのサンプル動かしても全然違わないんだけど、 スゲー大きなプログラムを動かしてみると違いが出てくることがある。 どうしてなんだろ・・。 DX管理人さんはそんなことないって言ってるから 自分のプログラムが悪いだけかもしれんが・・。 みんなそういうこと無い?
>>76 VISTAに最初からはいってるのはDirectX10だからね。それも中途半端な。
MSの中途半端な対応のせいでゲーム開発者はみんな迷惑してる。
DirectX9とか新しいDirectX10とかを入れてみると改善すると思う。
>>76 ビデオドライバ類が関係しているとかないかな
79 :
75 :2008/11/12(水) 18:00:22 ID:IPCAcIHc
グラボじゃなくてVistaってことかもしれん。 自分は持ってないんで確認できないまま適当に書いた、すまん。
80 :
76 :2008/11/12(水) 20:17:02 ID:yL4++M3C
DirectX10の影響はいろいろ聞くね。
今度出るwindows7だっけ?あれはどうなるんだろう・・。
>>75 VistaとXPデュアルブートするといいよ。
作ったゲーム色んな環境で試してみれる
>80 2000 orz
Windows7でMSコケたらDirectX終わってLinux+OpenGLが盛んになる予感
ビスタって結局なんだったんだ・・。 なんかうちの周りだと、PCに詳しくない奴が買ってるOSってイメージがある。 そのまま終わっていくのかビスタ。
諸刃の剣素人には(ry ってやつじゃない?
>>83 ネットできりゃそれでいいってやつが買ってる印象だな
あとはofficeでも使えりゃ困らないしな
レンダリング処理やエンコードとかしても、ビスタは遅くてしかたないよ・・。
>>80 今時デュアルブートって流行らないんじゃない?
VPCとかさ。
今の最新技術は知らんけど、VirtualPC、VMWareは グラフィックボード使ってなくて、CPU依存
デュアルブートって流行ってるからとかでやるもんじゃないだろ
どこから突っ込めばいいのか…
800*600のサイズでウインドウモードにしたいんだが、 SetGraphModeとChangeWindowModeを同時に使うと、 かなりの確率でOSごと落ちるorz
DxLib_Initの後にChangeWindowMode置いたらフリーズしなくなった サーセンwwwフヒヒwwwww
>>93 初期化の前にウィンドウモードにした方が処理が早いよ
初期化(DxLib_Init)の前にSetGraphModeとChangeWindowMode書くと、 うちの環境ではなぜかフリーズするんです
96 :
名前は開発中のものです。 :2008/11/15(土) 19:53:04 ID:MzdFlqka
質問させてください ゲームの速度をどのPCでも一定になるようにするために、 ScreenFlipを使う前と後の時間差を利用してる方法が本にあったのですが、 そもそもScreenFlip一回の時間はどのように決まっているのでしょうか?
リフレッシュレート。 画面のプロパティ→設定→詳細→モニタ で、リフレッシュレートが確認できる。 つってもこれは俺のPC(windows2000)だから他の環境だとちょっと違うかも。
補足。 ScreenFlipがリフレッシュレート通りになるのは デフォルトで垂直同期信号待ちをしてるからであって、 「SetWaitVSyncFlag ScreenFlip関数実行時にCRTの垂直同期信号待ちをするかのフラグセット 」 で、垂直同期信号待ちを切った場合は関係ない。 また、条件は知らないが特定の環境(うちの場合はサブのノートPC)では 垂直同期信号待ち設定にしていても、ScreenFlipで垂直同期信号待ちしてくれない場合が ある事を確認済み。
99 :
名前は開発中のものです。 :2008/11/15(土) 20:27:43 ID:MzdFlqka
>>97-98 返事ありがとう。
リフレッシュレート自体はわかったんですが
後半よくわからなかったのでちょっと調べてみます・・・。
>ScreenFlipを使う前と後の時間差を利用してる方法 ってのがどんなのか判らないけど、 ScreenFlipの垂直同期信号待ちを利用した方法だとすると 前述したようにリフレッシュレートに依存するから 「どのPCでも一定の速度」にはならないよ。 リフレッシュレートを60にしてるPCと70にしてるPCではスピードが違う。 まぁそれを踏まえた上でいちばん簡単で代表的な速度を一定にする方法なんだけどね。 (つまり、リフレッシュレートが60の場合を前提としてゲームを作り、 60以外にしてる人は60にしてからプレイしてください、となるw)
垂直信号同期待ちについて、おおざっぱに説明してみようか。 俺も聞きかじりの知識だが。 最近はテレビにしろディスプレイにしろ、液晶が主流で「薄型」になってるが もしブラウン管(分厚い)のテレビなりディスプレイがあるなら、画面の前で手を振ってみるといい。 残像がぶつ切りに、ストップモーションのように見えるはずだ。 これはどういう事かというと、画面が60分の1秒に一回、点滅してるからそう見えるんだ。 (厳密には60分の1秒に画面半分) つまり、画面が光ってる時に「手の影が見えて」、画面が消えてる時には「見えない」から 手の動きがぶつ切りに見えるわけだ。 そうやって点滅してるのに、ずっと光ってるように見えるのは残像のせい。 もっとも「眼(瞳孔)」の方は反射で動いてるから、画面が光ってる時には瞳孔が小さくなり 画面が消えてる時は瞳孔が大きくなってたりするはず。 だから画面に近づいたり、暗い部屋で画面を見たりすると極端に眼が疲れる。
さて、画面が点滅してる、と言ったが、画面全体がぱっとついたり消えたりしてるわけじゃない。 ブラウン管ってのは、奥から電子ビームを画面に向けて照射して、その部分のみを光らせてるわけだから 実際に光ってるのは1点のみ。(もっとも一度照射されるとしばらくは持続するらしいが) その電子ビームの照準が、画面の左上から始まって、右端まで動き、 一段さがってまた左端から始まって右まで動き、を繰り返し、画面の右下まで進む。 つまり ┏━━━┓ ┃□ぬ□┃ ┃□る□┃ みたいな画面が表示されてると、それは実際は ┃□ぽ□┃ ┗━━━┛ ┏━━━┓ ┃□ぬ□┃ ┃■■■┃ ┃■■■┃ ┗━━━┛ ┏━━━┓ ┃■■■┃ ┃□る□┃ ┃■■■┃ ┗━━━┛ ┏━━━┓ ┃■■■┃ ┃■■■┃ ┃□ぽ□┃ ┗━━━┛ という感じで高速に書き換えられてるという事。
ここでゲームの話になるわけだが、ゲームのキャラクターは画面上をあちこちに動く事になる。 もしこの「動く」のが前述した「画面を書き換えてるタイミング」だったらどうなる? ┏━━━┓ ┃ぬ□□┃ ┃る□□┃ この状態から ┃ぽ□□┃ ┗━━━┛ ┏━━━┓ ┃□□ぬ┃ ┃□□る┃ この状態からにまで移動しようとすると ┃□□ぽ┃ ┗━━━┛ ┏━━━┓ ┃ぬ□□┃ ┃■■■┃ ┃■■■┃ ┗━━━┛ ┏━━━┓ ┃■■■┃ ┃□る□┃ ┃■■■┃ ┗━━━┛ ┏━━━┓ ┃■■■┃ ┃■■■┃という感じになり、 ┃□□ぽ┃ ┗━━━┛ ┏━━━┓ ┃ぬ□□┃ ┃□る□┃ 人間の目にはこう映ってしまう。この現象をティアリングと呼ぶ。 ┃□□ぽ┃ ┗━━━┛
>>100 「ScreenFlipを使う前と後の時間差を利用してる方法」ってのを普通に解釈したらリフレッシュレートに依存せずに一定になるよ。
ScreenFlipの待ち時間に関係なく、1フレーム(1ループ)の差時間から移動距離を割り出せばok。
ただし、ゲーム画面がアクティブでなくても実際に時間は経過してるので、ゲームに戻るとその分進む(進んだ)ことになる。
これを回避するなら、ゲーム内で独自にインクリメントカウントを設置し、そこから移動距離を割り出せばok。
ゲームプログラミング独特の考え方だね。
>>101 ブラウン管テレビは29.97fpsだよ。
このティアリング(ちらつき)をさせないためにはどうすればいいか? これが「垂直同期信号待ち」であって、つまりは ディスプレイが画面全体の書き換えが終わるまで、 次の描画処理をしないで待ってるってわけだ。 これがScreenFlipではデフォルトで行われてる。 だからScreenFlipを使うと速度が一定に保たれる……のだが、 「画面の点滅は60分の1秒」と言ったが前述したが、これが要するにリフレッシュレートの事。 つまりこの速度をPC側で自由に変更できたりする。 リフレッシュレート60の場合はScreenFlipは60分の1秒経つまで待つわけだが、 リフレッシュレート70の場合は70分の1秒しか待ってくれない。 その分ゲーム速度は速くなってしまうわけだ。 (もしプログラム処理自体が重くて、70分の1秒で終わらなかったら 70分の2秒、つまり35分の1秒かかるわけで、逆に遅くなる)
移動距離を割り出すという方法は知ってるし理屈も解るけど、 当たり判定もそれ相応の処理にしなくてはいけないし、 そうなるとリプレイ記録&再生をどうやればいいのかわからなくなる。 そこらへんはどうやってるのかな。 ってこれはDXライブラリと関係ないか。
当たり判定もリプレイ記録も問題ないよ。 でもScreenFlipの待ち時間を基準にするなんて誰もしないと思うから あたかもScreenFlipを使うとスピードがリフレッシュレート依存になるみたいな解説はやめたほうがいいと思うよ。
画面を書き換えたときに時間を取得し、前回取得した時間と比較して、 1ループが17ミリ秒(60FPS)になるまでウェイトをかけてやればいい これが一番簡単で確実
リフレッシュレートが60のときはScreenFlip依存でいいんじゃね それ以外はタイマで
>でもScreenFlipの待ち時間を基準にするなんて誰もしないと思うから いや、俺してたし、してるしw
>>111 その話をしてるのは君だけど、実際にそれを採用してる人はいないって事だよ。
もしかして君は採用もしてるの?
だとしたら自分が長々と説明したデメリットが解消できてないよね。
それを解消したくて質問したいならそれなりの場所でそれなりの質問方法を取ればいいと思うよ。
もしそうじゃないなら誰も採用しない方法を解説されてもややこしくなるだけだから…。
ティアリングが嫌だから切り替え方式にしてるます。 最初はゲーム起動時に測って自動切換えにしてたけど それもやめて結局手動切り替えに……。
切り替えってのはリフレッシュレート依存方法と、タイマでウェイトかける方法の二つね。 移動距離算出方法はやった事ないです。
ティアリングとスピードは関係ないでしょう。
とりあえずDXライブラリを使うならScreenFlip()で垂直同期を待てば良いと思うよ。
スピードの話はまた別の話。
>>113 ゲーム起動時に何を測るの?
それと、切り替える必要性が見えないんだけど・・・?
>>115 >ゲーム起動時に何を測るの?
ScreenFlipを一秒間繰り返して、その回数で判断。
>>98 で書いたけど、垂直同期信号待ちをしてるはずなのに
ScreenFlipで待ってくれない場合があるから、
FPS値が異常に高かったらそうだと判断して
タイマー値によるウェイトかけるようにしてた。
>それと、切り替える必要性が見えないんだけど・・・?
それはどっちを基準にして?
ScreenFlipを基本として考えるなら、リフレッシュレートが変更された場合や
上で書いた垂直同期信号待ちしてくれない環境の時に異状スピードになってしまう。
タイマ値でウェイトかける場合は、やっぱりティアリングが気になるし、
1フレームごとに点滅するエフェクトとかがきちんと点滅しなくなる。
>>116 えっと、だからね、ScreenFlipとティアリングは関係あるけど、
それらとウェイトは関係ないって事だよ。
ゲーム起動時にScreenFlipの待ち時間からリフレッシュレートを判断してるようだけど、
それも結局ScreenFlip基準でタイマー取る方式だよね。
てことは例えば60Hzを基準にウェイトをかけるって事だよね。
だとしたらはじめからリフレッシュレートのウェイトなんかに頼らずに、
マルチメディアタイマーででも1/60sを基準にコードを書けばいいでしょ?
だから起動時に測る必要もないし、リフレッシュレートの変更やVsyncを待たない場合は考慮しなくていいの。
繰り返すけど、タイマーでウェイトかけてもScreenFlipを使うならティアリングはないよ。
何か齟齬がある気がする。 タイマでウェイトかける場合は、ScreenFlipのVsync待ちはOFFにしてあるんだけど、 それでもティアリングは発生しない? んじゃ発生してる俺のプログラムは何か間違ってるのか。 理屈上、1/60sを基準にウェイトかけるようにすれば ゲームスピードは一定になるが、タイミング次第で ティアリングが発生しない状態か、 あるいはティアリングが発生し続ける状態が 維持されるものだと思っていたのだが。
Vsync待ち、かつ、タイマーで制御するんだよ。 これを前提に最初から読み返してみて。
ScreenFlipもやって、1/60secも待って、ってやらないと一定にならないし、ちらつきも解消されないよ。
タイマー待ちを使うんならVsync待ち無しのScreenFlipじゃないと ティアリングは発生しないけど動きが凄いガクつくぞ ADVみたいに動きの少ないゲームならそれでも良いと思うけど、 STGやACTでは見るに耐えない
60Hzに合わせれば60Hzの環境なら結局タイマーでウェイトしないから問題ないよ。
75Hzの環境なら60fpsに制限されるから多少はガクつくけどこれはトレードだね。
ちなみに3Dモノとか海外のゲームはfpsを出来るだけあげて垂直同期しないっていうのが主流みたい。
>>121 みたいにfps制限はするわ垂直同期しないわっていうのは愚の骨頂。
ティアリングするわfps制限されてるわでひどいもんですわ。
>>122 なんでそんなに相手を見下したような態度なの?
>60Hzに合わせれば60Hzの環境なら結局タイマーでウェイトしないから問題ないよ。
それはわかってるよ
だから最初にリフレッシュレート測って垂直同期主体にするかタイマー同期にするか判断するんでしょ?
121はあくまでfpsとリフレッシュレートが一致していない場合の話
>75Hzの環境なら60fpsに制限されるから多少はガクつくけどこれはトレードだね。
ここで122の言うとおり垂直同期とるかとらないかはプレイヤーの好みの問題
オプションで選択できるようにすべきだと思う
>ちなみに3Dモノとか海外のゲームはfpsを出来るだけあげて垂直同期しないっていうのが主流みたい。
そうだね。3Dモノは可変fpsと相性良いよね。
>>121 みたいにfps制限はするわ垂直同期しないわっていうのは愚の骨頂。
垂直同期をとらないことで手軽に入力に対するレイテンシを下げることができるし、
リプレイを取る目的でfpsを固定しなければならない場合もあるんだから、
短絡的に愚の骨頂というのはどうだろう
122的には60fps固定+垂直同期してない東方緋想天は愚の骨頂?
俺はそうは思わないけど・・・
2Dシューティングを過去いくつか作ってきましたが、 リプレイ周りの実装も含めて、やっぱりFPSは60に固定でロジックを組みますよ。 オプションで「Vsync待ちをするかタイマーか」を選択させてます。 124さんもリプレイの話をしているから、そういう前提で言ってるのだと思うのですが。
リプレイって別にFPS固定必要ないような 入力があったキーとその時の経過フレーム数があればいいんだし
おまいら もちつけよ.
なんだ釣りか
DXライブラリで作った横スクロールアクションのソースってどこかに転がってない?
転がってるって・・・ 作者の好意で公開してるソースをそんな言い方するなよ
ニコニコで一時話題になった、しかけが外道なスーパーマリオもどきはソース公開してたと思う
134 :
125 :2008/11/17(月) 22:57:25 ID:pxmPH9a8
>126 たしかにそうですね。 ただ、自分の場合は、FPSを固定すればあとはキー入力さえきちんと記録できていれば リフレッシュレートが違えどもリプレイがずれることがないのでそうしていました。
移動量固定方式か、経過時間による移動量計算方式かで やり方も違ってくるんじゃないかな。
>>133 しょぼんのアクション だっけ?
やっと1−1クリアだと思ったのに愕然とした記憶がある。
DirectXのバージョンを9に移行するらしいね
138 :
名前は開発中のものです。 :2008/11/19(水) 14:54:42 ID:TpPgoKXn
>>133 あれはやばいです
あれはほんとうに・・やばい・・。
この道10年のベテランですらあれを見ると悶絶して悶え死ぬレベル。
あのソースを読んだあの日、私は自分の人生について考えさせられました。
そんなにすばらしいのか
思わず3回DLし直す位のレベル
141 :
名前は開発中のものです。 :2008/11/19(水) 18:41:54 ID:TpPgoKXn
あれは伝説のソースですよ
DLしてみたが・・・凄まじいソースだな
俺のソースも似たようなもんだなw
汚いコード書ける奴って尊敬するわ むしろ逆に頭良いと思う
部屋が汚くても気にしないやつがいるのと同じ
>>146 これはアイテム4つで実装力尽きるw
配列すら使ってないとかやべぇ
でもスレチ
BASIC覚えたての頃、そんな風にGOTO文メインでテキストアドベンチャーゲームを作ったなあ…。 それにしてもその作者はDXライブラリ3Dの作者なの? なんか色々考えさせられるな…。
でもスレチ
自分のスパゲティソースを晒す勇者はおらんのか・・
さらしてどうすんのよw
タイピングゲーム作ってるけど疲れてきたぜ。 ゲーム一本完成させるって難しいな。
完全体になる前にリリースすればいいじゃない(マリー
プログラム歴3ヶ月おれもタイピングゲーム作ってます プログラム練習としても面白いジャンルのような気がします がんばりましょう
>>153 俺知ってるよ
そういうのをあじゃいるって言うんだよね
画面全体をぼかしたいのですが、どうすればいいのでしょうか? SaveDrawScreen()で画面全体を保存した後に、 その画像を加工して表示するという方法を試しましたが、遅くてとても使えませんでした。 ちなみに手順は 保存→加工→保存→表示です。 加工と二回目の保存の処理の間がとても遅かったです。 直接DXライブラリで描画してる画像をぼかせばもっと早くなると思うのですが、 DXライブラリで直接ぼかす方法がさっぱりわからりません。 どういう方法でぼかせれるのでしょうか?
ブレンドモードを上手く使えばどうにかなるんじゃなかろうか。 昔、モーションブラーもどきを自分で作ったが細かいやり方は忘れた。
>156 そのまま画像を描画 ↓ αブレンドを適当に128くらいに指定してxy数ドットずらして描画×数回… こんなのでどう?
159 :
157 :2008/11/25(火) 20:03:29 ID:5UMAw8SP
>>158 ああ、そうそう。
そんな感じでできると思う。たぶん。
ずらし量やブレンド率でぼけ足上手いこと調整してどうにかする。
関数化できたら楽そうだ。
>>157-159 いろいろとありがとうございます。
アドバイスのおかげで、それらしいのはできました。
縦には動かしていないのですが、とりあえずそれっぽい動作はします。
ソースは以下の通りです。
private void GraphOff(int dot,int graphHandle)
{
for (int i = 0; i < 640 / dot; i++)
{
DrawGraph(i * dot - 640, 0, graphHandle, 0);
DrawGraph(640 - i * dot, 0, graphHandle, 0);
}
}
これでまた問題が出たのですが、この処理非常に重いです。
FPS30固定にしているのですがこれをするとFPS10〜15になります。
軽くする良い方法は何かないでしょうか?
640 / dot ←この計算をfor文の前にやって適当な変数に代入しておく
>>160 i < 640/dot
を
i < 160/dot
くらいにまで下げてみる
ぼかすのがゲーム上そんなに大事じゃなかったら
このくらいで妥協するのが一番
163 :
157 :2008/11/26(水) 02:18:18 ID:eTjv2Xnv
>>160 そんなに回数要る?
dotの値がいくら位で何回位描画しているのかとか、コードの意図とかちょっとわからんので
↓とどっちのコードの方が性能良いのかよくわからんけど…
int times = 4;//描画回数:4〜16推奨
int gap = 2;//ギャップ:1〜4推奨。残像拳のような効果を狙うなら大き目に。
SetDrawBlendMode( DX_BLENDMODE_ALPHA , 32 ) ;//描画回数×ブレンド率=128〜256推奨
for (int i = 0; i < times; i++){
DrawGraph( i*gap - times*gap, 0, GHandle, 0);
DrawGraph( times*gap - i*gap, 0, GHandle, 0);
}
>>160 本当に速度が必要で、それなりのクオリティーが欲しいなら
LoadSoftImage関数とLoadSoftImageToMem関数を使うといいかもしれない。
自分は近頃、DXライブラリまったく触ってなかったから、どんなもんか
わからんが、説明を読む限りではこっちの関数で処理して
GraphHandleをつけて、表画させる方が高速みたいだし・・・・・
165 :
名前は開発中のものです。 :2008/11/27(木) 05:33:03 ID:9lHdy+ss
DXライブラリとは直接関係ないのですが、 DXライブラリとかの関数を変な使い方すると、めっちゃ重くなったりして(コンパイルエラーが出るわけではない)、 上手く扱わないとたとえ数百行のプログラムでさえ上手く動かないのに 市販されてる3Dゲームとかだとそれこそ想像もつかない量のプログラム書いてると思うんですが それを全く重くならないように作るというのはまさに神の所業としか思えないんですが・・・ やはり職人的なひとはそれほどすごいってことでしょうか? それとも単にまだ自分が未熟なだけでしょうか? なんか抽象的な質問ですみません。
>>165 普通に使っている分には問題ないと思うけど…
コード量も関係ないし。
メインのループ(秒間30〜60回くらい回しているとこ)の外で1回やれば済む処理を
ループの中で毎回やってたりしてない?
例えばグラフィックハンドルへの画像の読み込みを毎回やっているとか。
DXライブラリもよっぽど変な使い方しない限りめっちゃ重くはならんでしょ。 そりゃまぁPCの性能にもよるけど。 市販されてる3Dゲームとかは、俺はヘボプログラマだからそれこそ神の領域にしか思えないけど 同じ市販ゲームでも、すごいグラフィックなのに軽快なのとか、やったらもっさりして重いのとかあるから そこらへんはプログラマの腕次第でしょ。 凄腕のプログラマは極限まで無駄な処理を省いてるんだと思う。
メモリの1バイトは血の一滴ですね
169 :
名前は開発中のものです。 :2008/11/27(木) 18:56:41 ID:9lHdy+ss
フォントのサイズ変更とかと勝手に予想
>>161-164 ありがとうございます。
回数がご指摘の通り多すぎました。
>>157 のコードと併用して、思っていたぼかしができました。
コードは私の作成したコードと
>>157 のコードを関数化しただけなので省略させていただきます。
フォントのサイズ変更はしゃれにならんほど遅いからな……。 別フォント用意すりゃいいことだが。
173 :
名前は開発中のものです。 :2008/11/28(金) 05:15:28 ID:10isJ4oY
SetWaitVSyncFlag(FALSE); にしたらドラゴンボールの世界になってワロタ
PlayMusic関数で再生位置の指定ってできないの?
175 :
名前は開発中のものです。 :2008/11/29(土) 22:48:46 ID:kaHILOZB
>>101 いますぐ昔の再放送の刑事ドラマやドラマの
事務所シーンを見るんだ!!!
パソコンのディスプレイあるだろアレみるとわかりやすい
>>175 あれ今見るとなんでそう見えるか理解出来るな
タイヤが逆回転して見えるのとかも
177 :
名前は開発中のものです。 :2008/12/01(月) 09:18:57 ID:PQmt2oZj
3Dでゼルダみたいなゲーム作りたいんだけど DXライブラリ(3D)で完璧に作ったのと DirectXで完璧に作ったのだったら動きのサクサクさにどれくらい差が出るのかな? PCの性能は結構良いのでそれは関係なく 個人的にはマリオ64くらいのクオリティーは出したいと思ってるんだけど 始めての大型ゲームなんで全く想像付かない
3Dのゼルダってまんま64とGCのゼルダじゃね?
はい
DirectXで作るって言ったってどうせ自分でラッピングするんだから一緒だと思うぞ
>>177 そのプロセッサ専用のライブラリを熟知してれば
サクサク動くゲームになる
例えばPS2ならEEとかのベクトル計算のためのライブラリの仕様とか
windowsマシンにはそんな計算機能はデフォルトじゃついてないから
どうしてもグラボ依存になる
int WINAPI WinMain(HINSTANCE hI, HINSTANCE hP, LPSTR lpc, int nC){ ChangeWindowMode(TRUE); SetDrawScreen(DX_SCREEN_BACK); while(ProcessMessage() == 0 && CheckHitKey(KEY_INPUT_ESCAPE) == 0){ ClsDrawScreen(); 〜〜 ScreenFlip(); } } ↑こう書いたとき、〜〜 の部分の処理が毎回変わるモノだった場合でも、よほど〜〜の処理が長くならない限り、 ScreenFlip()があることによって、画面に出力される周期は〜〜の処理時間によらない、と考えていいんでしょうか? なんか説明下手ですみません・・・。 たとえば、指数関数的に動く物体を作りたいとして、 〜〜の部分を「毎回n=n+1して、x^nの位置に画像を出力」という内容にしたとした場合、 ループが来るたびにnが増えるからx^nの計算の処理が多少だんだん増えていくと思うのですが、 もしその処理時間も画面出力に影響してしまったら、動きが時間の正確な指数関数にならないと思うのですが、 『ScreenFlip()によって、「処理が終わっても、規定時間δtが来るまでは画面出力しない」という仕組みが加わってるので、 処理時間に影響せず一定時間ごとに画面出力される。 ただし、もちろん 処理時間の方がδtを超えてしまったら、重くなるという別の影響は出てくる。』 というものだと解釈していいのでしょうか? (すみません。アク禁中の代レスなので、返事できないかもしれません。)
どうでもいいがProcessMessage()の場所が俺の好みじゃなかった。 本文は読んでいない。
SetWaitVSyncFlagがFALSEで無い限りは
リフレッシュレートに依存する。
x^nの計算なんか描画処理に比べたらほんの一瞬
そういやCを独学でやってて最初に詰まったのがべき乗計算だったなw
188 :
名前は開発中のものです。 :2008/12/03(水) 05:14:23 ID:Ts8WjI0J
>>153 #include <stdio.h>
#include <windows.h>
void main (){
int cell=0,jinzo18=2,jinzo17=2,tensinhan=25,seimeiryoku=1;
int hikinobasi=0;
cell+=jinzo17;
for(hikinobasi=0;hikinobasi<30;hikinobasi++){printf("おお\n"); SleepEx(200,TRUE);}
printf("天津飯「まずい17号を吸収しやがった・・・チャオズ俺は死ぬかも知れない\n");SleepEx(2000,TRUE);
printf("セル「天津飯!!雑魚が何をするつもりだ!」\n");SleepEx(4000,TRUE);
printf("天津飯「新気功砲!!ハー」\n");SleepEx(200,TRUE);
printf("セル「(゚Д゚)ぬお!\n");SleepEx(200,TRUE);
while(tensinhan>0){
printf("セル「<`Д´>おのれー」\n");SleepEx(200,TRUE);
printf("天津飯「(; ゚Д゚)ハァー!」\n");SleepEx(500,TRUE);
tensinhan-=seimeiryoku;}
printf("天津飯「化け物め・・・・うう・・・・」\n");SleepEx(5000,TRUE);
printf("セル「むううう」\n");SleepEx(1000,TRUE);
printf("セル「こんな雑魚に足止め食らうとは」\n");SleepEx(4000,TRUE);
cell=jinzo17+jinzo18;
for(hikinobasi=0;hikinobasi<100;hikinobasi++){printf("おお\n"); SleepEx(50,TRUE);}
printf("完全体セル「すばらしい力だ 諸君!!」\n");
SleepEx(10000,TRUE);
}
同一内容の文字列を毎フレーム表示する処理があり、 空のサーフェスを作成 → 一旦バックバッファに文字列を描画 → バックバッファから空のサーフェスに文字列の画像を取得 こうして予め文字列を描画しておいたサーフェスから 毎回メイン処理でDrawGraphしているのですが、どうもスッキリしません。 しかもGetDrawScreenGraphの説明にもある通り透過色が使用出来ません。 DXライブラリでは作成したサーフェスに直接描画出来ないのでしょうか? やりたい事は「同じ文字列を毎フレーム描画する処理を軽くしたい」だけなのですが、 文字グラフィックファイルを用意することは出来れば避けたいので、良い方法があったら教えて下さい1
190 :
189 :2008/12/03(水) 05:45:19 ID:ecRDRm37
無駄に長くて分かり難くなってしまいました。 (例えば説明文等の)同一の文字列を毎フレーム描画する処理を軽くしたいが 文字グラフィックファイルを用意する以外で良い方法があったら誰か教えて下さいです。
DrawStringで十分軽いと思う フォントハンドルを毎回読み込んだりしていない?
192 :
189 :2008/12/03(水) 17:18:45 ID:ecRDRm37
>>191 お返事遅くなって申し訳ありません。
当方の環境ではDrawStringでやった場合のFPSが30くらいでDrawGraphにすると60になりました。
DirectX自体、文字描画にGDIを使っているのでビデオカードで処理できるBitBltの方が高速だと思っていました。数年前の知識ですが。。
低スペックでも快適に動くように作りたいので、DrawStringは極力使いたくないです。
193 :
189 :2008/12/03(水) 17:29:14 ID:ecRDRm37
フォントの変更は行っていないので、フォントハンドルは使用していないです。
そんなにたくさんの文字を同時に表示してるのかな? それともPC環境が悪すぎる? 俺普通にDrawString使ってるけど別に遅くなった事ないよ? 普通に60FPS出てる。古いノートパソコンで。 最高でまぁ10行程度の表示しかしてないけど。
195 :
名前は開発中のものです。 :2008/12/03(水) 18:30:58 ID:JlppSG1I
いやそれじゃ全くテストになってないから。 192の知識通り、今も文字列表示は遅いよ。 189の方法が適切だと思うし、他に方法を提示できないのは申し訳ないけど、 少なくとも文字列表示が遅いって前提でレスされると無駄だと思ったので口を出してみた。
196 :
名前は開発中のものです。 :2008/12/03(水) 18:37:18 ID:JlppSG1I
×少なくとも文字列表示が遅いって前提でレスされると無駄だと ○少なくとも文字列表示が遅いって前提を否定するレスは無駄だと
俺の事? 別にテストしたわけじゃなくて、普通に使ってるだけなんだが。 文字列表示が遅いってのが前提なら、そもそもグラフィック表示だって遅いだろ。 グラフィック表示が遅いから他の方法はありますか? って質問があったとしたら まず現在どういう環境でどれだけのグラフィックをどういう方法で表示させてるのか教えろってのは普通の流れだろ? そこをかっとばしてグラフィック表示処理そのものを早くする方法を考えるのは無駄な話だ。
確かに 今与えられた情報だけではなんともいえんな
文字列の長さ、量がまずわからない。 「フォントの変更は行っていない」というのが、フォントの大きさやアンチエイリアス有無の変更は行っているかもしれないとも読める。
200 :
名前は開発中のものです。 :2008/12/04(木) 00:31:01 ID:jlPFeEOB
>>197 文字列表示はグラフィック表示より遅いって常識知らないの?
そこは議論の余地なしだから言ったまで。
それと、テストじゃないなら
>>194 の報告は不適切。
まあ上記の前提を知らなかった故だからしかたないと言えばしかたないが、ややこしくなるのでなかったほうがよかったな。
情報は少ないが、前提を知っているば容易に共感できるし、解決方法を知っている人ならこの情報量でも回答できるかもしれない。
>>197 >文字列表示が遅いってのが前提なら、そもそもグラフィック表示だって遅いだろ。
(;^ω^)
何人か偉そうにレスしてるけど、誰もライブラリのソース見てないのか? DXライブラリは文字を描画する前にテクスチャにキャッシュしてるから 同じ文字なら2回目以降はほぼDrawGraphと同じコストで処理は完了する キャッシュ用のテクスチャは512x512だから画面一杯に異なった文字を 描画するくらいしない限りは文字列描画特有の遅さは発生しないぞ まあ、毎フレームキャッシュに無い文字を描画したら一般に言うところの 「文字列表示が遅い」ってのに当てはまるけど
良スレage みなぎってきた、学校でゲーム作ってくる
>>200 何を言ってるんだ君は。
60FPSで動いてるゲームに、一回のDrawString処理を追加しただけで30FPSにまで落ちたりするか?
普通はしないだろ?
じゃあどういう処理にしてるんだ? っつーレベルの話だぞ?
192が出してる情報はその程度って事。
ソフトウェア描画モードと言う物があるらしいのですが、 どれのことなのでしょうか? 一部のPCだと動かなかったりする時にこれを使えばいいらしいのですが……。 リファレンスを見た限りそれっぽいのがありませんでした。
>>207 ありがとうございます。
SetScreenMemToVramFlag( FALSE );
と、
SetUse3DFlag( FALSE );
を使ったらよさそうなのでこの二つを使ってみようと思います。
>>204 垂直同期を使って処理していれば僅かな処理の遅さでFPSは半分になることがある
そしてGDIは遅い
>>189 はDrawStringを使用せずに同等の文字描画処理をする方法を模索しているであって
デバッグをしてくれと言っているわけじゃないんだから君がムキになるのは頓珍漢な話
俺を含め解決策が分からない初心者が回答することが間違い
俺もよくわからないけど、
>>189 は
>DXライブラリでは作成したサーフェスに直接描画出来ないのでしょうか?
と明確に聞いてるぞ。
それを初心者が関係ない知ったか話をしてるとしか見えない。
「俺は平気だよ?」とか言う話もいらないと思うww
>>202 もヒントになると思うけど多分新しい文字列を頻繁に表示しようとしてるんじゃないかな。
毎フレーム更新される数値を表示するって事も多いと思うし。
ファイナルファンタジーの裏ワザででてくる 数字ゲームとかあれ作ると面白そう
ブラックジャックといいたまへ
>>189 は「同じ文字列」って書いてるじゃないか。
まあ任意のオフスクリーンバッファに描いてそれを転送したい、というのはわかるが
できる機能を追加するかDXライブラリをやめるしかないのでは。
クリックイベントを使いたいのですがどうすればよいのでしょうか? 公式などにクリックイベントのコードがなかったのでここで質問させてください
SetWaitVSyncFlagをFalseにしておいて、16666マイクロミリセカンド待機し描画 ↑で描画すると30フレームあたりまで落ちるんですが、SetWaitVSyncFlagをFalseにしてても同期するってあるんでしょうか? 待機を16200にすると60フレームになるので、同期でひっかかってるんだと思うのですが……
自己解決しました
なんだったのよw
218 :
215 :2008/12/07(日) 18:55:49 ID:OyZdJ9xq
すいません、こちらも自己解決しました……
219 :
名前は開発中のものです。 :2008/12/08(月) 00:25:32 ID:2qR4Oo16
Cの入門書見てる段階なんですが、DXライブラリでのゲーム製作講座を見てみたら、 C言語というより、DXライブラリ言語でのプログラミングという印象を受けました。 DXライブラリを使ってプログラミングする場合は、 Cのほうは入門書を一通り読んだだけの知識でよくて、 あとはDXライブラリの使い方をきちんとやるほうがいいんですよね?
Cも一通りの知識は要るだろうから 平行して勉強しなはれ。
いやいや もろCで作ってるよ printfが絵を表示する関数になるだけ
>>219 「C言語 = printfやscanf、fopen等の標準関数」だと思ってるんならそれは間違いだ
>>219 それでいいと思うよー。
Cの文法なんて覚える事少ないし、入門書片手に取り掛かっちゃえば大丈夫。
今後も、プログラミングで何かを作る時、基本的にDXライブラリのような、外部のライブラリの使い方を覚えるって作業が大半になるよ。
入門書に書いてあるstdio.hのprintfみたいな標準関数を覚えるみたいに。
>>210 >
>>202 もヒントになると思うけど多分新しい文字列を頻繁に表示しようとしてるんじゃないかな。
>毎フレーム更新される数値を表示するって事も多いと思うし。
それこそ仕様を見直せとしか言いようがないようなw
毎フレーム更新する数値や文章ならプレイヤーに全文しっかり読ませるためものじゃないだろうし。
ノベルとかアドベンチャーのサンプルがあるサイト教えてください
公式にあったような気がするが……。
227 :
名前は開発中のものです。 :2008/12/08(月) 20:50:58 ID:vtoynrkC
内部の更新処理(当たり判定,posX += vXなど)のフレームレートを倍にするとか
>>227 int Time; を
LONGLONG Time; に、
Time = GetNowCount(); を
Time = GetNowHiPerformanceCount(); に
while( GetNowCount() - Time < 17) {} を
while (GetNowHiPerformanceCount() - Time < (1000000 / 60)) {} に
書き換えてみたら?
>>224 RPGやアドベンチャーゲームなら
1文字ずつゲーム内Windowに描画され、ゲーム内Windowごと表示非表示を切り替えられるって仕様は普通に有るでしょう
>>226 文字表示ぐらいしかないと思うけど・・・
サンプルゲームみたいなのでなかったっけ? 前はあったはずなんだが。
「DXライブラリサンプルゲームのダウンロード」のページにある 「スクリプトプレーヤー」の事じゃないかな。
スクリプトプレーヤーはソースの意味が分からない いきなりスクリプトのソースみろとか言われてもなにがなにやらって感じ
サンプル見たいって話を聞くたびに 見てもわかるの? という疑問が湧く。 同じ動きをするものを自分で書けるくらいの技量がなければ結局読めない気がする。 他人のソース読むのが超苦手で自分で書いた方が早い俺限定の話だが。
>>235 アルゴリズムは同程度の技量がないと読めないけど、設計はそんなことないよ。
スクリプトプレイヤーのソース見たけどちょっと酷いな。
マジックナンバー、関数長すぎる、グローバル変数使いまくりetc...
たしかにこれ読めとか言われても俺も困る。
自作2Dライブラリ作ってたんだが、画像系の実装が終了したところで
面倒になってきたんでDXライブラリを使うことにした。おまいらよろしく。
>>236 ああ確かに設計は読みたいかも。
うまい人のクラス構成とかはみてみたい。
うまい人のコードは,クラスやメソッドの実装にどんどんステップインしていかなくても 表面だけ見れば理解できるよね
>>228 すいません、内部処理は一定化したかったので・・
>>229 ありがとうございます!
引っかかりが無くなりました。
タイマーの精度の問題だったみたいですね。
>>220 >>221 >>222 >>223 printfなどが関数だということを意識していませんでした。
まさに、C言語=標準関数のつもりで勉強していました。
外部ライブラリを使うのだから、それから提供される関数の使い方を勉強するのは当たり前ですね。
プログラミングに対する疑問が少し解けました。どうもありがとうございました。
画像の、ある部分だけを拡大して描画することは出来ますか? ループ表示する背景の一部分だけを拡大表示したいです。
やった事ないけど、指定領域だけで新しいグラフィックハンドルを作るとかできるはずだから、 それをしてから拡大表示させればいいんじゃないかな。 前提条件として矩形範囲のみって事になるけど。
>>242 なるほど、ありがとうございます。矩形なのでその辺は大丈夫です。
でもアクションゲームみたいに、リアルタイムにバックグラウンドをスクロールさせつつ、
拡大率を変えてバックグラウンド表示するのはその方法ではコストが掛かり過ぎて無理なようですね。
DrawExtendGraphの描画元矩形指定関数があれば一発なのに><
背景をスクロールさせつつ、拡大部分もスクロールさせるのかな。 それじゃ無理だね。 それならいっそ、 背景を普通の大きさで書く → 画面の描画範囲を設定(SetDrawArea) → 背景を拡大して書く ってやってみるのはどうだろう。 背景を二回描くから、やり方によってはコストかかるけど……。
つDrawRectExtendGraph
>>244 そうですそうです、元画像の一部分を拡大表示したいんです。
>>245 おお!ありがとうございます。そんな関数があったんですねw
面倒でも自分でDxLib.hをチェックしないと駄目ですねw
今 トルネコやシレンみたいな2Dダンジョン探索ゲームを 800 x 600 ウィンドウモードで作っているんですが 2Dゲームは 640 x 480 が基本だと聞きました。 800x600だと何か不都合でも起こるんでしょうか?
32x32とか16x16のブロックがぴったり収まらない、とか。?
画面下と右にブロックが半分だけ表示されるのは我慢しようと思います。 800x600だと特定の環境ではちらつきが酷いとかだったら嫌だなぁと思いまして
>>247 処理速度の問題とユーザの環境の問題
ちなみにカラーモードも256色パレットモードが基本だった
しかしそれは過去の話
今はPCのスペックは十分だし、800*600の画面モードの無いPCの方が少ないと思うから問題ないかと
ちょっと便乗 CRT使いなんでわからないんだけど 液晶の場合、画面サイズに合わない画面モードの表示ってどうなるの? 1)全画面に拡大されてぼやける 2)表示分だけ使われて余白は黒塗りになる
初心者で悪いんだが質問。 うまく言えないんだけど player.cpp内でint宣言をして、void player()で増減させる。 そして 「enemy.cpp内」で「player.cppのvoid player()」で増減したint変数を使用して作りたい判定があるんだけど。 こういうのってやっぱり出来ないのかな?
extern
player.cppでグローバル変数としてint宣言して enemy.cppの冒頭にextern宣言すれば判定にも使えるようになるよ
>>254-255 ああそれ忘れてたww
おもいっくそ素材ファイルの読み込みで使ってたのに
ありがと、助かった
-- player.cpp -- int i; void player(){ i += 1; } -- enemy.cpp -- extern int i; void enemy(){ if(i) ・・・ ;}
>>252 即レスサンクス。
じゃあプログラムする側としては
あんまり気にしても意味無いんだ・・
勉強になりますた。
>画面サイズ 最近流行りの低価格ノートPCとかだと、どんな感じなんだろう? 縦600くらい?
if(enemy01_Life < 0){ DeleteGraph( enemy01 ) ; } else if(hitS < hit ){ PlaySoundMem( hit_test , DX_PLAYTYPE_BACK ); shotflag = 0; enemy01_Life -=1; } このコードで、最後のenemy01_Life -=1の判定を一回だけ判定場合ってどうすればいいの? ダメージ判定だけがどうしても残ってしまう
>260 具体的に何がしたいが、何が起こってるのかを示せ。 コードにはコメントを入れろ。第三者には何をやってるか分からない。 んで、だ。 ショットが命中した時、 (1)ショット自体を消す(敵に当たると弾が消える) (2)敵ごとにカウンタを作っておき、「一度当たったら10フレームの間は無敵」とかにする (3)弾ごとに自分がどの敵に命中したかを覚えておき、2度目は命中扱いにならないようにする こんな感じ?
>>261 玉の画像は消えるんだけど、当たり判定だけが「次にショットボタンを押すまで」残るんだ。
何がしたいかは、「玉一つにつき一回だけダメージ判定」をしたい。
ショットコード↓
if( Key & PAD_INPUT_A && shotflag == 0){ //ショットボタンが押されたら
PlaySoundMem( p_shot_se , DX_PLAYTYPE_BACK );//ショット音を鳴らす
shotX = PlayerX ;
shotY = PlayerY ; //プレイヤーの現在位置を取得
shotflag = 1 ; //ショットフラグONにする
}
if( shotflag == 1 ){ //ショットフラグONになったら
shotY -= SHOT_SPEED ;
DrawGraph( shotX+10 , shotY , p_shot_img , TRUE ) ;
if(shotY < SHOT_DELAY){
shotflag = 0 ;
}
}
判定コード↓
GetGraphSize( enemy01 , &SizeX , &SizeY ) ; //グラフィックのサイズを取得
hit = SizeX/2 ; //グラフィックの当たり判定(半径)
hitX = shotX - enemy01X;
hitY = shotY - enemy01Y; //三角形の斜辺を除くXYの長さ
hitS = sqrt(hitX*hitX+hitY*hitY); //斜辺
if(enemy01_Life < 0){ //敵死亡してる時
DeleteGraph( enemy01 ) ;
}
else if(hitS < hit ){ //(ヒット時)
PlaySoundMem( hit_test , DX_PLAYTYPE_BACK );
shotflag = 0;
enemy01_Life -=1;
>>262 判定のコードがifにかかってない
if( shotflag == 1 ){ //ショットフラグONになったら
shotY -= SHOT_SPEED ;
DrawGraph( shotX+10 , shotY , p_shot_img , TRUE ) ;
if(shotY < SHOT_DELAY){
shotflag = 0 ;
}
判定コード↓
GetGraphSize( enemy01 , &SizeX , &SizeY ) ; //グラフィックのサイズを取得
hit = SizeX/2 ; //グラフィックの当たり判定(半径)
hitX = shotX - enemy01X;
hitY = shotY - enemy01Y; //三角形の斜辺を除くXYの長さ
hitS = sqrt(hitX*hitX+hitY*hitY); //斜辺
if(enemy01_Life < 0){ //敵死亡してる時
DeleteGraph( enemy01 ) ;
}
なんか伝わる気がしないから書き方を変えると if(shotflagが真) { //ここに判定のコードも書く }
えっと、つまり
ショットコード内で
if( shotflag == 1 ){ //ショットフラグONになったら
この部分に判定コード(
>>263 のGetGraphSize〜DeleteGraph( enemy01 ) ;)
}
を入れないとダメってこと?
そう shotflagって弾があるかないかのフラグでしょ? 今のままだとshotflagが0の時にも判定される あといろいろ突っ込みどころがあるけど そういう書き方してると確実にスパゲティソースになる
>>266 マジかw
プログラム初心者で全然分からんから適当に組んでる
既にややこしくなってる
動けば結構。 実際に作って慣れればいいのだ。
>>263-264 そのとおりにやってみたけど
やっぱり玉一つで「次にショットボタンが押されるまで」の間に複数回攻撃判定が出ちゃう・・・。
>>267 初心者なら仕方なら、一回スパゲティコード書いて捨てる経験もしてみるといいかもね。
それがいやならオブジェクト指向の簡単な本があるからそれ読んでみるといいよ。
オブジェクト指向とゲームは相性がよい部類。
ためしにオブジェクト指向で書き直してみようかと思ったけど、半分ほど書いた時点で
長くなった上に果たしてこれを理解できるのかという疑問がわいてきたので捨てた^w^)
仕方ならってなんだよOTL 仕方ない、ね
OOとゲームって相性いいかなぁ。 素人の俺がいうのもなんだけどむしろ相性はよくない方だと思うけど、経験が足りないからかな? 一応ゲーム作りはDXライブラリ使ってもOO(OO風ともいう)を意識して書いてるけど、 C++の便利な機能(クラスや継承程度)を使うくらいでこれぞOOって感じでもないなぁ。 C#でちょっとしたツールなんか作るとOOだなぁって感じるけど。
>>272 ツールを作る件はオブジェクト指向じゃなくて提供されるオブジェクト指向ライブラリが優秀
ってだけだと思う。
>相性はよくない方
どの辺が?ならデータ指向で作る?手続き指向で?俺は絶対いやだけどなー。
パラダイムってのはつまるところコードの整理術なわけで、それを感じないってのは別に
不思議じゃないよ。
さっきでたコード、弾丸と敵との当たり判定がでてきだけど、
int dx = shot->getX() - enemy->getX();
int dy = shot->getY() - enemy->getY();
double distance = sqrt( dx*dx + dy*dy );
if( distance < HIT_SIZE )
{
/*ヒット処理*/
}
って書いてたらお前ちょっと表に出ろだけど、ちゃんとTell, dont ask の原則にのっとって書いたら
if( shot->hitTest( enemy ) )
{
/*ヒット処理*/
}
変更にも強く、なおかつコードはわかりやすくなる。
もー全然できねーよおおおおおおお いっそコレ仕様にすっか 敵の端っこにショット当てた状態でショットボタンを押さないと一定時間大ダメージ! 画期的と言えば画期的だが生憎ただのバグだ。
>>274 今じっくり見たけど
>>262 のif( shotflag == 1 )のブロックを
>>262 の一番最後で閉じるか
else if(hitS < hit )のブロックの中でhitSを条件満たさないように変更する
これで正常になると思うが、違ったらすまそ
shotflagっていうのは弾の生死状態を管理するフラグなんだから、
弾が生きているときだけ判定をすればいいわけだよね。
>
>>264 が言う通り当たり判定をするブロックを if ( shotflag == 1 ){}で囲めば出来ると思うんだけどなあ。
弾が死んでても玉の座標は留まって、さらにshotflagが機能していないから(セットが上手く行っていないか判定処理に考慮されていない)
何度も当たっていると思われるんだけど。
てか敵をデタッチするのにDeleteGraph()で画像そのものを削除するって激しすぎないか?w
if ( enemy_alive ) { Task(); } // 敵が生きているときのみ敵に関する処理を行う
とかにした方が良いと思うんだが。
ごめん、if ( enemy_alive ) → if ( enemy01_Life >= 0 )
>>274 だけど、ちょっと検証した
当たり判定は座標で行ってたから
http://www.uploda.org/uporg1853070.jpg この画像の様に(hit>hitS)になってる時に判定が出て、その判定が次玉を出すときまで残るんだ。
だからこの画像はhitは21でhitSは13.9.....ってなってるので次に玉が出るまで(hitSの数値が変わるまで)凄い勢いでenemy_Lifeが減り続けてる
敵に当たった瞬間にhitSをリセットすればいいのかな?
もうソースうpしてくれよ
>>281 うん、その通りにやってみても何故か結果は変わらずだった
hitSっていうのは敵と弾との距離でしょ それは当たり判定をする必要があるとき、 つまり弾と敵が生きているときに毎フレーム計算すればいい 弾の座標を遥か彼方にリセットしたりhitSを直接いじくって 当たり判定が真にならないようにすれば確かに上手く行くだろうけど 本質的には当たり判定をする必要が無いときに判定しているのが問題なんじゃないの?
>>283 毎回計算して判定してるんだけど
ヒットした時に計算が次玉出すときまで止まっちゃう
>>280 全然修正されてないじゃないかw
「enemy_move.cpp」の
GetGraphSize( enemy01 , &SizeX , &SizeY ) ; //グラフィックのサイズを取得
の前に一行追加して
if ( shotflag == 1 ){
GetGraphSize( enemy01 , &SizeX , &SizeY ) ; //グラフィックのサイズを取得
とする。
次に、その下のほうの
int Color ;
の前に閉じ括弧を追加して
}
int Color ;
とする。
つまり、当たり判定をしている部分を
if ( shotflag == 1 ){
}
で括る。
それとインデントをきっちりしないとネストレベルが分からなくなるよ。
>>273 んーていうかC#の件は、ライブラリが優秀で作りやすい=オブジェクト指向って事じゃなくて、
コントロール一つ設置してイベントを呼び出すってだけでオブジェクト指向を感じる。
もっと具体的に言えばイベントハンドラ(やデリゲート)がオブジェクト指向だなぁって。
提示してくれた下のコードも、それだけじゃオブジェクト指向を感じない。
結果的に言わんとしようとしてることはわかるけどね。
ただそれだけじゃただのサブルーチン呼び出し。
言いたいのはそのコードだけを見てオブジェクト指向じゃないって事じゃないし、
自分でゲーム作る時もオブジェクト指向で書きたいわけだけど、
概念的に無理やり感があるのと、非オブジェクト指向でも書けるってので、
GUIアプリと比べて相性がいい方ではないって事。
>>285 おおおおおおお!!!ありがとおおおおお
一つのライフしか減らないwwwwwww
すげー!ショットフラグがONの時にしか判定しないようにするってそういう事だったのかwww
ちなみにプログラムの書き方?はこんな感じでいいのかな?
どうでもいいけど定数を#defineで書くのとconstで書くのってどっちがいいのけ? 俺は気持ち悪いからconstでやってるわけだが
>288 ・歴史的な経緯とかはあるかも ・特に理由が無ければconstでいいんじゃね? ・defineじゃないと出来ないこと、スマートなこともあるから気をつけろ
>287 とりあえず、何でもいいので1つ完成させてからじゃないと 定番の書き方とかは説明しても意味が無いし、おそらく理解できないと思う。
#defineは計算式入れられるのがいいな 気を付けないと間違った結果が返ってくるハメになるが
>>287 おめでとう。お世辞にも綺麗なソースとは言えないけど、
モノとして動いているということはとても大事なこと、すごいことだよ。
作り続けていれば段々上手くなって行くはず。
あと
>>285 の修正をした段階で、今度は敵の消滅タイミングがおかしくなると思う。
敵のライフが-1になった瞬間には敵は消滅せず、その後自機が弾を発射した瞬間に消滅する、っていう風に。
これを修正するには、敵をデタッチ(殺す)処理をしている部分を移動させればいい。
/* ↓elseは消し、必要なら if ( enemy01_Life >= 0 && hitS < hit ) などとする。しなくても出来るが。
または if ( shotflag == 1 ) のところに敵の生死チェックを入れる。即ち if ( enemy01_Life >= 0 && shotflag == 1 ) とする。しなくてもでき(ry */
if(hitS < hit ){ //敵の画像と自機の玉を直角三角形結んだ時の斜辺が当たり判定より小さい時(hit!!)
PlaySoundMem( hit_test , DX_PLAYTYPE_BACK );
shotflag = 0;
enemy01_Life -=1;
if(enemy01_Life < 0){ //敵死亡してる時 /* この3行を */
DeleteGraph( enemy01 ) ; /* ここに */
} /* 移動 */
}
まずはインデント(ソースコードの段落処理)から始めよう。
そこでPythonとrubyの登場ですね
>>286 さっき提示したコードの価値をただのサブルーチン呼び出しとか
言っちゃってる時点でなんかもう全然わかってない。
あれはShotオブジェクトにEnemyとの当たり判定を”頼んで”いるんだよ。
この違いがわからないんならいつまでたっても素人のまま。
というか
>もっと具体的に言えばイベントハンドラ(やデリゲート)がオブジェクト指向だなぁって。
デリゲートなんか関数型プログラミング言語の概念の拝借だよ。
これがオブジェクト指向!なんてデザインパターンこそがオブジェクト指向!というのと同じくらい笑えるんだが。
>概念的に無理やり感があるのと、非オブジェクト指向でも書けるってので、
>GUIアプリと比べて相性がいい方ではないって事。
どこが無理やりなんだよw
さっきのコード、Enemy,Player,Shotというクラスを抽出できるけど、これのどこが無理やりなんだよ。自然だろうに。
それとGUIアプリだって手続き型で書ける。イベントハンドラやデリゲートはオブジェクト指向の一機能を使って
実装されてるけれど、それ自体はオブジェクト指向じゃない。だからVBでもGUIアプリが組めるわけだ。
ここまで言ってゲームをオブジェクト指向で組むのは向いてないと言うならもうしらね
というかもっと勉強してくださいいやマジで
C#6年やってるんだけど未だにオブジェクト指向わからねえ。 でもゲームとオブジェクト指向は相性いいと思うよ。
イベントを使ってたところをEventListenerとか使ってobserver剥き出しに変更したら
オブジェクト指向になるのか? 実質的に全く等価なのに?
>>294 の言うオブジェクト指向って何なんだ
オブジェクト指向って単純に、人が走っても車が走っても同じ「走る」だ、ってだけじゃねーの
オブジェクト指向って考え方が出る前からプログラム作って遊んでるが 未だにオブジェクト指向が理解できん。 273で言うならちょっと表へ出ろレベル以下だ。
>>294 は釣りだよな?w
突っ込むところが多すぎるww
「ShotオブジェクトにEnemyとの当たり判定を”頼んで”いる」だけでオブジェクト指向とかww
ところで、ゲームをオブジェクト指向で組むのは向いてないって話題は誰がしてるの?してない気がする。。
>>297 たぶんオブジェクト指向入門書にはそういう概念的な事が書いてあると思うけど、
オブジェクト指向って本当は概念の事じゃないよ。
もっと具体的なプログラミングの事。
「ShotオブジェクトにEnemyとの当たり判定を”頼んで”」も別にオブジェクト指向じゃないww
>>300 そうなん?
レシーバか引数が違えばそれは別物だっていう名前空間の概念がまずあって
そいつを楽に実現するための補助がクラスやテンプレートやインターフェースなんだって認識だったが
具体的なプログラミングの事を言うなら言語がクラスベースかどうかで相当違ってくると思うし
あと
>>299 最後の行は
>>272
構造体に関数がくっついただけのクラスのインスタンスを生成して それで動かしたらオブジェクト指向。 そう思っている俺が通りますよ。
何もめてんだよ
>>272 は基本的に用語を間違っているがそれに気付いていない
で、親切に答えてくれた
>>273 と会話がかみ合っていない
>>272 はVBライクなコンポーネント貼りつけとプロパティ設定での
プログラミングスタイルとオブジェクト指向を混同している
また、Windowsのイベントドリブン構造を言語仕様と勘違いしてる
-まとめ-
Q.DXライブラリを使うとVBでアプリ作るみたいにコンポーネント貼ってプロパティ設定だけでプログラムできますか?
A.できません
Q.イベントドリブンがオブジェクト指向ですよね?
A.違います
Q.イベントドリブンでゲームプログラムは書けますか?
A.書けます
Q.オブジェクト指向でゲームプログラムは書けますか?
A.書けます
ん〜・・・?
>>272 の
>DXライブラリ使ってもOO(OO風ともいう)を意識して書いてるけど
っていうのはDXライブラリ自体がC(非OOPL)で書かれてるけどって意味だろ
>>303 こそ勘違いしてるだろ
厳密に言えばC/C++使ってる時点でピュアなオブジェクト指向は無理だけどな。 メッセージ呼び出しっていう機能はないし、それに似た機能はメソッド呼び出し(=関数呼び出し)でしかないし。 組み込み型もオブジェクトじゃないしいきなりint main(){}で始まるしww
幸せって何ですか?
オブジェクト指向ってそんなに高度な事なの? それとも人それぞれ考え方が変わるモノなの?
CしかわかんなくてもDirextXゲームプログラムがさっくりできちゃうのがウリの DXライブラリのスレでオブジェクト指向を熱っぽく語る男の人って……
____ / \ /\ キリッ . / (ー) (ー)\ / ⌒(__人__)⌒ \ < 厳密に言えばC/C++使ってる時点で | |r┬-| | ピュアなオブジェクト指向は無理だけどな。 \ `ー'´ / ノ \ /´ ヽ | l \ ヽ -一''''''"~~``'ー--、 -一'''''''ー-、. ヽ ____(⌒)(⌒)⌒) ) (⌒_(⌒)⌒)⌒)) ____ /_ノ ヽ、_\ ミ ミ ミ o゚((●)) ((●))゚o ミ ミ ミ /⌒)⌒)⌒. ::::::⌒(__人__)⌒:::\ /⌒)⌒)⌒) | / / / |r┬-| | (⌒)/ / / // だっておwwwww | :::::::::::(⌒) | | | / ゝ :::::::::::/ | ノ | | | \ / ) / ヽ / `ー'´ ヽ / / バ | | l||l 从人 l||l l||l 从人 l||l バ ン ヽ -一''''''"~~``'ー--、 -一'''''''ー-、 ン ヽ ____(⌒)(⌒)⌒) ) (⌒_(⌒)⌒)⌒))
DXライブラリで質問が・・・ あ、スレ間違えました!すみません
>>309 int main()ってオブジェクト指向的になんなの?www
>>304 何がん〜・・・?だ
そんな事だから
>>286 >んーていうかC#の件は、ライブラリが優秀で作りやすい=オブジェクト指向って事じゃなくて、
>コントロール一つ設置してイベントを呼び出すってだけでオブジェクト指向を感じる。
とかマヌケな事を書いてしまうのさ
>>303 のまとめでいいんだよ
RADツールと言語の区別もついてない質問に対して、みんなにちゃんと答えてもらってる事をまず理解するべきだな
元々スレ違いだ、感謝こそすれ相手を見下すとか勘違いすぎるんだよww
なんか常に話がちょいズレの人いるな
>>303 には、同意だけど。 OOなんて元の発生が3つぐらいあって、
さらに様々な言語にそれらのOOが混同されながら導入される過程で
どんどんと複雑に入り組んでいってる。
(しかも、良くも悪くも元がProgramming言語における概念だから、
普通の言葉に意味を汲み出す過程で色々とノイズや過不足が起こる。
さらに、OOAだ、OODだなんだので純粋なOOよりも
とりあえず使える道具としてのOOが今のメインストリームだと思うし。)
だから、結果的には、人によってOOの概念も色々な違いがある。
あと、そんな訳だからと言う訳じゃないがCだって、OOPLは可能。
ただし、言語的なサポートが対応してないから、
様々な工夫をする必要があったりする。
また、逆の意見としても
>>305 のint main()で始まるからオブジェクト指向じゃない。
ってのもどうかと思う。
OSも含めたアプリケーションをProgramとみるならば、
int main()は、ズバリそのアプリの呼び出しメッセージと見做しても誤解ではないしね。
あと、
>>301 の言ってる事は別にOOじゃないと思うぞ。
それらは単に多態性とかであって、OOとしてあったら好ましいが、
さらに
>>300 のプログラミングの概念と具体的なプログラミングが別モノっぽいのも違うんじゃない?
基本アセンブリでやるでもない限りは、プログラムは概念に概念を積み上げた産物だし、
それらの概念を如何につかうか?どのように解釈するか?がプログラミングでしょ。
だからこそ、gotoは悪!!やJavaにはポインタはありません!!みたいな話も出てくるわけでww
俺は別にピュアだか厳密だか理想的だかなOOじゃなくても それなりに作れてメンテできればいいかな ピュアなのがいい人はその人が納得する言語なりなんなりを使えばいいし
int ゲーム内ではこっちを使う; ゲーム内ではこっちを使う = GetNowCount(); if (ボタンが押された) ゲーム内ではこっちを使う = 0;
318 :
317 :2008/12/15(月) 00:57:14 ID:r0Y4Aqo3
間違えた。正しくは int ゲーム内ではこっちを使う; int 前にリセットした時間; int now = GetNowCount(); ゲーム内ではこっちを使う = now - 前にリセットした時間; if (ボタンが押された) { ゲーム内ではこっちを使う = 0; 前にリセットした時間 = now; }
>>148 いや、スレチでもないぞ。ライブラリ作者の古い作品だから
>>273 if( shot->hitTest( enemy ) )
{
/*ヒット処理*/
}
って書くとたしかに変更に強くわかりやすくなるけどそれがOOだっていうのは尚早だよ。
hitTest()の中身は結局上と同じ事してるんだから。
だからその部分がOOだって言われるとただのリファクタリング手法でしかない。
もしその部分だけでOOだっていえるならGUIアプリだって
TextBox tb = new TextBox;
list.add(tb);
ほら、同じ。
でも両方ともただオブジェクトを渡してるって事実しかないよ。
それを推しておきながらデリゲートだけじゃOOじゃない!っていうのは横暴だなぁ。
ちなみにVBは今はOOPLだよ。
OOは議論が起きるくらい曖昧なところもあるけど、やっぱりカプセル化・継承・ポリモーフィズムの3つは最低限主張すべきだね。
個人的にはわざわざなんでカプセル化なんてあるのか疑問だけどw(隠蔽や最小の原則なんかは構造化言語からずっとあった)
>>303 煽るわけじゃないけど流れを読んできてなんでいきなりWindowsのイベントドリブンが出てくるのかなって思ったんだけど、
きっと
>>305 のメッセージ呼び出し機能って言葉からそう思ったのかな?
たしかにイベントドリブンもメッセージっていうけどOOのメッセージっていうのは全く別物だよ。
純粋なOOPL(Smalltalkなど)ではメッセージ機能っていうのがあるんだ。
メソッド呼び出しに似てるけどちょっと違う。
C++ではメンバ関数、Javaではメソッド呼び出しで実現してるけどね。
詳しくは自分で調べてみて。
>>321 >>286 >コントロール一つ設置してイベントを呼び出すってだけでオブジェクト指向を感じる。
>もっと具体的に言えばイベントハンドラ(やデリゲート)がオブジェクト指向だなぁって。
いや、Windowsのイベントドリブン構造の事だ
読めばわかる
オブジェクト指向は僕達の心の中にあります
俺の中でオブジェクトっつったらスプライトの事だ!
じゃあ俺は、この形。 int WINAPI WinMain(うんたらかんたら〜){ Application App; App.Run(); return 0; } Applicationのインスタンスが生成されてる間はアプリが生きてる。 App破棄と同時にアプリも終了する、この形がいちばん美しいと思う。
>>325 シングルスレッドであれば、確かに良いアイディアだと思う。
そこまでやる必要あるか?
>>326 中でタスクマネージャー的なものでCPU毎に負荷分散させているかもしれんぞ?
>>324 用語が適当すぎるよな。
メモリを占拠した実体→「オブジェクト」
コンパイルして出来るファイル→「オブジェクト」
自分自身で処理させる論理機構→「オブジェクト」
名前付けたやつちょっとツラ貸せっていうか
昔、書籍読んだときさっぱり意味わからんかったぜ・・
メモリを占拠した実体ってインスタンスのこと?
変数じゃないの?変数もオブジェクトだよね
>324はもっと誉められていいと思う
昔読んだ本には、OOPは オブエクとは「物」と訳される。曖昧さの象徴である。 頭の中でイメージしなさい。 物と呼ばれる、段ボール箱「みかん箱」がたくさんある。 みかん箱の中身は隠されている、知らなくて良い。 みかん箱を紐で結ぶ事が「プログラム」である。 みかん箱には切替スイッチが付いている、それで位置、色、大きさが変化する。 みかん箱が「オブジェクト」である。
基本的にOOやマイノリティ言語のウンチクや自分語りはスレ違いだな
>>334 簡単に言うと
バカでも切り替えスイッチをポチって押せば変化する事が出来る。
けどその変化する「仕組み」を理解する必要は無い。
って事?
オブジェクト指向あんまよく分からないけど、そうなると定数#defineって簡単なオブジェクト指向に入るの?
例えば
#define SPEED 25//数値を変えると速度が変えられます。
ってあったら数字を変えるだけで変化が実装できるし。
なんか違うかw
>>336 それだけだとただのブラックボックス化。
OOの一部ではあるけどCの関数だってブラックボックスでしょ?
グラフィック表示させる関数いろいろあるじゃない DrawGraphとかDrawTurnGraphとかDrawExtendGraphとかDrawRotaGraphとかDrawRotaGraph2とかDrawModiGraphとか あれみんな同じ重さなのかな あと、やっぱ画像の大きさと重さにも関係あるのかな あと、同じ四角のグラを表示させるのでもその四角のグラ用意して読み込んで表示させるのと DrawBoxで表示させるとでは重さは変わらないのかな
自分でOO使ってゲーム作ろうとすると結局グローバル多用したりパブリック多用しちまうんだよなあ
>>338 ”重さ”ってなんだ?^^;
ソース見てベンチ測って見ればいいじゃん。
なるほど その発想はなかったわ そんなこといままでしたことなかったからな 面倒臭さと相談してやるかどうか考えてみる
>>343 やるならGetNowHiPerformanceCount()を使うのはどうだ?
で、計測した方法と結果をここに書けば聞きっぱなしじゃなく他のやつの参考にもなる
DXライブラリでスムーズに最大値合成できませんかね? 「画像を減算合成→重ねて加算合成」で実装すると、色深度が16ビットの時汚くなるし、描画コストも倍になるんですが……
VC6.0でLONGLONG型表示させるには%I64dでよかったかな
sprintfの話? __int64 を使うならそれだね。
DXライブラリいいね! DXライブラリ3Dとは別ものなのかね?
3Dの方は派生verだな
ゲームプログラムってMSXのころBASICでやってた程度だけど DirectXっつーやつはすごいな ダブルバッファリングっつーのがあれば MSXのころ悩んでたことがほとんど悩まなくていいじゃんね。 スクロールすら画像を移動するだけって最強すぎ。
>>350 ちょっ、MSXの頃だってダブルバッファリングしてたっつうのw
MSXはページ切り替えできたから、最高に楽だったわ
まあ、ハードウェアスクロールがあればもっと良かったが仕方ない
>>351 そうか
それはすまんかった
あー。そういえばあったような気がしないでもないな。
でも俺の技術では処理速度が遅くてスプライトを動かす程度しかできなかった
スクロールとかもってのはか。
してたっけ。 もう覚えてないやw
つーか、毎回全画面書き換えに耐えられないからページ切り替えはヘルプ画面とかで 利用してた気がしないでもないが。
タイトル画面を一瞬で表示するために使ってた。 あとはAVGの絵や3D迷路の表示とか。 アクション系のゲームには使わなかったな。
ページを切り替えないと、 ロゴとかが生成される様子が眺められるんだよな。あれはあれで楽しかった。
やっぱりいろいろ工夫する必要あったよね。 でもDXライブラリ使ったらそんなことまったく考えなくてよかったから カルチャーショックだった。
流石に時代は変わったわ。 ま、MSXBASICのノリでかる〜く作っちゃえ。
なんだこの40代スレ
How many pages ? ■
MSXが導入されて、それまでのマシンで頻発してた 「雑誌掲載のソースコードを打ち込んでも自分のマシンだと動かない」っていうのが 少なくなったって印象があったなあ。 まあ、MSX自体のバージョンアップがあって、その栄光も一瞬だったんですけどね! >359 まだ20代の真ん中くらいだよ!
Windowsが導入されて、 「自分で作ったプログラムが他人のPCでは動かない」っていうのが 少なくなった…………かな?
昔はスペックのわりにマシンも高価だったし CPUやビデオをアップグレードするには、PCをまるごと買い換えるのが基本だったり お殿様商売の時代だったなあ
>>350 >>351 MSX1なのか2なのか2+なのかターボRなのかどのスクリーンモードなのかで話が違ってくるし
ここはDirectXのスレじゃなくDXライブラリのスレだぜ!
VECTOR3 hoge; hoge = mL.GetCameraEyePoint(); としてVECTOR3の中身をとりだしたいのですが hoge.x とかいうような形でとりだせないものでしょうか?
VECTOR3 cc; cc.x=5; mL.printf("cc.x=%d", cc.x); としてもcc.x=0って表示されてしまいます。
すみません。 mL.printf("cc.x=%f", cc.x); にしたら表示されました。
更新が止まってるようだけど DXライブラリ3Dって完成したの?
失礼ですが質問です。 DXライブラリでプログラムを作って起動し、終了させたのですが、 なぜかウィンドウは消えてもタスクバーに"DxLib"が残ってしまいます。 閉じようと何度も試しましたが消えてくれません(タスクマネージャでもダメ)。 以前同じことが起こった時はパソコンの電源をスイッチから直接切らないといけませんでした。 何か解決策はないでしょうか。 このトラブルが発生した時は自分の失敗で無限ループを脱せず、 ツールバーのデバッグの停止を使って終了させました。 たぶん原因はこれだと思います。
DxLib_End() を呼ばなかったからに1票
>>371 一応プログラムには書いてありますが、
その無限ループが発生したループ内では通ってないと思います。
これが原因なのでしょうか。
しかしDxLib_End()を通ると即プログラム終了だと思っていたのですが・・・
DxLib_End()はライブラリの終了であって、 ちゃんとその後ループから抜けてプログラム自体終了(WinMainからreturn)してるの?
>何か解決策はないでしょうか >たぶん原因はこれだと思います。 >これが原因なのでしょうか。 ソースも晒さず、これだ、あれだと聞き返されても返答が難しいよね >失礼ですが質問です。 失礼だと思ったので、回答は出来かねます
>>374 私に誠意が足りませんでした。申し訳ございません。
どう書けばよいのか分からないのですが、
WINMAINの中でreturnさせる直前にDxLib_End()を置いています。
DxLib_End()は一度限りでいいと思っていましたがもしかして違ったいたのでしょうか。
私が尋ねたかったのは、プログラムの起動中、
もしくは無限ループで抜け出せない時にデバッグの停止を行うと、
上述のトラブルが発生するのでしょうか、ということです。
分かりづらくて本当に申し訳ございません。
ソースに関しては、プログラムの内容について尋ねていたつもりではなかったため、
晒さずに漠然とした質問になってしまいました。この点に関しても私に落ち度がありました。
抜粋するのが適当だとは思いますが、ソースを全部晒しておきます。
ttp://www6.uploader.jp/dl/falljohn/falljohn_uljp00026.zip.html ・・・喧嘩腰に見えるorz 敬語って難しいです。
これではただの丸投げですねorz int WINAPI WINMAIN( 略 ){ (ここにプロトタイプ宣言した関数) ←ここの中で無限ループが発生している DxLib_End(); return 0; } という風にはしています。 ソースでは一応ですがループを自分で抜けられるようには少し変えています。
ソースのヒドさがなんか好感もてるなw >(ここにプロトタイプ宣言した関数) ←ここの中で無限ループが発生している > >DxLib_End(); それだと、 そのループから処理が抜けない限り、絶対にDxLib_End()には辿り着かない そんでデバッグツールでの停止ではもちろんDxLib_End()が呼ばれず、それが問題だというのは一応あってるかもしれない
Flashのムービークリップや、 JavaScriptのsetIntervalのように 毎フレーム実行させるようにセット・解除できるような機能はないでしょうか?
>>376 ソース見るのだるいから見ないが、
ループを抜けられるようにしてあるなら、ループを抜けてみてプロセスが残ってないか確かめればいいじゃないか。
プロセスがしっかり終了してればDxLib_End()が呼ばれてなくてそれが問題だったって分かるんじゃないか?まぁ、これだけじゃそうとも限らないが。
それでもし終了できていたらDxLib_End()を書いたものと書かないものとを比べればちゃんと分かるが。
で、それが分かればおのずと質問に答えられると思うが。
ただ、ProcessMessage()だっけ?で処理してくれるような終了の仕方(ってある?)の場合には、そこらをしっかり書けばちゃんと終了できると思うが。
>>376 while(CheckHitKey(KEY_INPUT_SPACE)==0){
battle();
WaitKey();
}
ScreenFlip();
WaitKey();
DxLib_End();
return 0;
}
これだとProcessMessageで-1引いてもループ抜けられないような気がする。
whileの条件式にProcessMessageの判定加えたらいいんでは。
あと抜けた後のWaitKeyは、強制終了後も参照されてしまうのでやめたほうがいい。
>毎フレーム実行させるようにセット・解除できるような機能はないでしょうか? 何を毎フレーム実行させたいんだ? というか質問は一つづつにしろよ
>>381 情報が足りませんでした。申し訳ありません。
JavaScriptでは、
var set = setInterval(function(){
〜〜処理〜〜
}, 1);
のようにすると、1ミリ秒ごとにfunctionを呼び出すことができます。
また、clearInterval(set);で解除することもできます。
同じように毎フレーム実行させることはできるでしょうか。
whileに全て入れるのが面倒なのです。
>>379 ,380
アドバイスありがとうございます。
ProcessMessage()を完全に忘れていました。
まだまだ基本がなっていないようなので、しばらくROMって学んでいこうと思います。
>>382 どうも、聞きたいことがよく分からん。
while文に入れるのが面倒なほどに大量に関数があるのか?
複数の関数を一つの関数の中にまとめて、まとめた関数をwhile文の中においておくってのじゃダメなんか?
それとも、while文に全て入れるのが面倒じゃなくて、
フレーム管理とかプログラムの状態遷移が分からないってことか?
ってか、それはライブラリというより言語の使用じゃないか?
もし仮にDxライブラリで出来たとしても、登録、解除のし忘れとかでバグの原因になりそうに思えるんだが。
設計の問題であってDXライブラリとは関係ないな for (int i = 0; i < enemyCount; i++) enemy[i].Update(); こういうようなことを言ってるの?
>>384 whileに全て入れるのが面倒に感じていましたが、言われてみるとそうですね。
>>385 毎フレーム実行させるという意味でこちらにきましたが、観点がずれていたようです。
while文の中にforループを入れるという発想はありませんでした。試行錯誤してみようと思います。ありがとうございました。
>>385 みたいなのって定石だから
試行錯誤するよりも初心者サイトでも見て素直に真似した方がいいよ
>>377 少なくともVSの「デバッグの停止」ならDxLib_End()が呼ばれなかろうとなんだろうとちゃんとリソースを解放してくれるはず。
>>370 がいつまでも終了しなかったのはexeを直接起動したかリリースビルドだったのでは?
>>380 WaitKey()は別に問題ないよ。
あとScreenFlip()がWhileの外にあったら画面更新されないから中へ。
DXライブラリを使用つつ、DirectXを直接使用することは出来ないでしょうか? ○○->(うんたらかんたら) という処理が入っていると、エラーが発生して終了してしまいます。
>389 その例文だと全く意味が伝わらない
>>390 わかり難くてすいません……
DirectXを直に使いたい所があるので以下のコードを追加し呼び出した所強制終了が発生したので、
やはりDXライブラリを使用しながら直接DirectXを使う事は難しいのでしょうか?
#include <d3d8.h>
void aaa(){
LPDIRECT3DDEVICE8 FogDev;
D3DCOLOR FogCol;
float FogStart;
float FogEnd;
FogCol=0xffffff;
FogStart=100;
FogEnd=300;
//この中をコメントアウトすればエラー無し
//逆に一つでもあるとエラーで落ちてしまう……
//================================================
FogDev->SetRenderState(D3DRS_FOGCOLOR,FogCol);
FogDev->SetRenderState(D3DRS_FOGSTART,*((DWORD*)&FogStart));
FogDev->SetRenderState(D3DRS_FOGEND,*((DWORD*)&FogEnd));
FogDev->SetRenderState(D3DRS_FOGVERTEXMODE,D3DFOG_LINEAR);
FogDev -> SetRenderState(D3DRS_FOGENABLE,true);
//================================================
}
質問ですが、ウィンドウモードにした時の左上のウィンドウアイコンは変更出来ますか?
>>391 参照エラーかな?
DXライブラリ側でLPDIRECT3DDEVICE8って持ってなかったっけ?
と無責任な事言ってみる。
DXライブラリのソース確認してみて。
>>392 出来るよん
>>393 ヘッダファイルを確認した所、LPDIRECT3DDEVICE7に関しての記述はみられましたが、
LPDIRECT3DDEVICE8についての記述はありませんでした。
ライブラリ初期化の前に読んだ所起動すらしなかったので、やっぱりDXライブラリとの競合ですかね……
どうやら単純にコードが悪かった様です。 スレ汚し失礼しました……
頑張ってるじゃん BGMやSEも自作? 引用があれば著作権等の明記はしっかりしておいた方が良いよ
398 :
名前は開発中のものです。 :2009/01/16(金) 23:47:43 ID:iRSkofRl
DXライブラリ3Dのサイトが消えてるな
ほんとだ、今見てみたら消えてるな
400 :
名前は開発中のものです。 :2009/01/17(土) 00:17:49 ID:h2yGMjkV
自作なのか……すげぇ。
あ、DXライブラリとPNG読み込み機能の著作権表記してない…これはマズったかも…。
>396 すげえ どんどん敵が固くなるw 敵がワイドショット撃ってくるあたりから先にいけん
>396 相変わらず難し過ぎる……w ところでなんかボスのライフが下がり切らない内に倒せたんだけど。制限時間? あとグレイズタイプって何かと思ったらサイヴァリアなのね。
>>403 どれも芋臭い曲ばかりですけどね…。
>>405 殆ど自機狙いなので直前に避けるとやりやすいと思います。
>>406 サイヴァリアの快感を再現してみたかったんです。
ボスはかすりで永遠に稼げるのと、ショット弱体化の対策として、
ワインダーを放ち終えた2分で自滅するようにしてみました。
ループ前にメニューバー作ってループの命令に解像度変更機能を書いてみたんだが、 どうもフルスクリーンだけ正常動作しない 一応、ソース書いておく if(CheckMenuItemSelect_ID( 14)){ //起動時、フルスクリーン化 ChangeWindowMode( FALSE ) ; //フルスクリーンモードで起動 MAP_W = 640-SPAN_LR*2 ; SPAN_LR =128; SetGraphMode( 1024 , 768 , 32 ) ; SetMenuItemMark_ID(11, MENUITEM_MARK_NONE); SetMenuItemMark_ID(12, MENUITEM_MARK_NONE); SetMenuItemMark_ID(13, MENUITEM_MARK_NONE); SetMenuItemMark_ID(14, MENUITEM_MARK_CHECK); //SetAlwaysRunFlag(TRUE) ;//ウインドウがアクティブではない状態でも処理を続行するか SetDrawScreen( DX_SCREEN_BACK ) ; // 描画先画面を裏画面にセット } 文字は表示されてもグラフィックは読み込まれない 左上隅に表示されるんだが、自分は中央拡大描画を求めている
>>404 お前何か勘違いしてないか?知識なんて使って減るもんじゃないから只だと思ってんだろ?
人に物を訊くってのがどういう事だか、自覚してる?
知識ってのはな、社会人に取って金と同じく貴重な財産なんだよ。使っても減らないけど、教えたら広まった分だけ価値が下がる。それを分けてくれって言ってんの自分でわかってる?
社会で必要とされる知識ってのはな、本になんか載ってない事ばかりなんだよ。全部人から人へ、直接のコミュニケーションを介して伝わって来たモンなんだ。
そういうノウハウを分けてもらう申し訳無さみたいな物が、伝わって来ないんだよ。お前の態度からは。
猿だって仲間から餌を分けてもらう時は申し訳無さそうな顔するんだよ。ヘラヘラ笑いながら近づいてったら殴り殺されんぞ。
猿だったら今頃とっくに死んでんだよお前。そんな態度で今まで。何回も言ったよな。謝る時は申し訳無さそうな顔をしろって。
そういう学校じゃ受けられない教育を受けておきながら、社会人を経験しなきゃ得られない知識を貰っておきながら、
何にも生かせてないんだよ今のお前は。学生のサークルごっこじゃないんだから。もっと四六時中危機感を持って生きてなきゃ駄目だよ。いい加減いつまで学生気分じゃ。
誤爆なのかそうでないのか……w
>いい加減いつまでも学生気分じゃ。 耳が痛い話です。
人生一勝勉強です。
アンカミスだろw
ボクは社会人になってから学生時代以上に学生気分です。
415 :
名前は開発中のものです。 :2009/01/17(土) 23:46:21 ID:h2yGMjkV
ウインドウモードで起動して マウスの左クリックを監視するようにしました その際、ウインドウの範囲外をクリックしてもマウスの左クリックを認識してしまいます その解決策として ウインドウの左上の座標(x,y)からWindowの大きさ(X+width,Y+height)までの間でクリックされた時のみクリックを監視するという方法をとろうと思っています そこで質問なのですが ウインドウの左上の座標を取得する関数は存在するのでしょうか? また、無い場合は何か他に代用できる関数は標準ライブラリなんかに入っているでしょうか? あと、ウインドウがアクティブかどうか判断する関数ももしあったら教えてください 一応調べたのですがヒットしなかったためよろしくお願いします
全部Win32APIにある
417 :
名前は開発中のものです。 :2009/01/17(土) 23:57:48 ID:h2yGMjkV
>>416 ありがとうございます見つかりました
下のは
GetActiveWindow()
でいけそうですね
上も調べてみます。ありがとうございました
418 :
名前は開発中のものです。 :2009/01/18(日) 01:29:33 ID:W8VFm9RV
度々すいません
>>415 はアドバイスのお陰で全て解決しました
ところで、作成したexeを起動するとLog.txtというものができるのですがこれは仕様なのでしょうか?
logファイルを作成しないように設定することは出来ないのでしょうか?
よろしくお願いします
リファレンスを log で検索してみた?
420 :
名前は開発中のものです。 :2009/01/18(日) 19:14:35 ID:d7+8UZEG
Dx_Lib() より前でSetOutApplicationLogValidFlagを呼びださなければなら無かったのですね 解決しましたありがとうございました
dxlibって英語の使い方が変だよね LogValidとか
422 :
名前は開発中のものです。 :2009/01/18(日) 20:26:55 ID:d7+8UZEG
もしかしてめちゃくちゃ初歩なのかもしれないけど 他のツールで作ったソフトの内部でDXライブラリを呼び出すことって出来るんですか? 例えば、ノベルゲーム作成ツールでゲームを作って、ところどころでDXライブラリで作ったゲームを組み込む みたいな感じで ノベルのほうで普通にDXライブラリ製のソフトを呼ぶと窓が起動してしまいますよね? ノベルのほうと同じ窓でゲームを実行することってできないのでしょうか? 意味がよく分からなかったらすいません
たぶん無理だと思うが
424 :
名前は開発中のものです。 :2009/01/18(日) 21:03:33 ID:BZ0GBkU2
>>422 何が言いたいのかはわかるけど、残念ながら恐らく不可能。
両方でしっかりデータの受け渡しができれば、携帯アプリの前編後編みたいにすることは出来るかも知れないけど、
現存のツールではそこまでの機能は無いと思うし……。
プロセス二つ作ってパイプで通信すればいいじゃない
426 :
名前は開発中のものです。 :2009/01/18(日) 21:29:03 ID:d7+8UZEG
>>423 ,424
そうですか・・・
あまり知識無いんですけど、描画先のウィンドウハンドル(ここではノベゲー)を取得して、内部でDXライブラリ製のソフトを呼び出した時
ウインドウを新規で作らず、いまあるウインドウを描画先に指定(取得したハンドルを用い)みたいなことができれば可能なのかな?
よくわからないorz
>>425 具体的にはどういうことでしょうか?
ぐぐったら分かるかな
アドバイスありがとうございます
プラグイン形式的なDLLを作成すれば可能
428 :
名前は開発中のものです。 :2009/01/18(日) 22:57:46 ID:d7+8UZEG
>>427 ありがとうございます
やることとしては
>>426 に書いたとおり
>描画先のウィンドウハンドル(ここではノベゲー)を取得して、内部でDXライブラリ製のソフトを呼び出した時
>ウインドウを新規で作らず、いまあるウインドウを描画先に指定(取得したハンドルを用い)みたいなことができれば可能なのかな?
描画先を既存のウィンドウにすればいいんですよね
これってどうやるんだろう・・・・
430 :
名前は開発中のものです。 :2009/01/18(日) 23:14:26 ID:d7+8UZEG
>>429 ベースプログラムは吉里吉里かSystem4.0を考えてるので多分dllの読み込みは可能かとも居ます
実際色々プラグイン公開されてるし
色々ありがとうございます
調べてみます
>>396 亀だがやってみた
とりあえず途中から敵固すぎワロタ
ボンバーなしじゃ無理な気がww
俺のシューティングは随分昔にシューティングスレに投下してから弾幕に凝っててあんまり見た目の進歩がないぜ
>>431 固さは面とレベルの兼ね合いにしたいと思います。
最近見かけばかりに力を入れてて肝心のゲーム内容は…。
星のパーティクルがすてき。
シューティングってこんなに作るの難しかったんだな ゼビウスみたいのなら楽勝だろとか思ってました、ごめんなさい
初心者です 質問なのですが、ゲームのBGMで 最初に戻って繰り返すときBGMをとぎれてしまわないようにする方法はありますでしょうか 例えばRPGの戦闘音楽のようにずっと放置していてもきれいにループするような方法です
>>436 ありがとうございます!勉強してチャレンジしてみます!
>435 あと、姑息な手段で申し訳ないが MIDIのようにサイズを気にしなくて済むようなものなら、最初から10分続くファイルにしてしまうという手もある。
PlaySoundMem()でループ再生フラグを指定すればいいよ。
>>435 がファイル形式を言ってないのでわからないけどwavなら綺麗にループする。
>>439 たぶん
>>435 が使っているファイルは曲の最初と最後が繋がってないやつなんだろう。
だから、普通にループ指定すると音が途切れずにループしない。
けど、市販ゲームでもこういうBGMあるし、俺は気にしないけどな
>>441 FF10のジェクト戦みたいにボーカルいれた音楽をBGMとして使えそうだな
すげえ
>>440 「最初に戻って」って書いてあるからなぁ。
でも途切れる方法が書いてないところが色んな憶測を呼ぶよね。
まぁここまでで解決方法出たと思うからいいんだけどさ…。
DXライブラリ(2.25)のプロジェクトがコンパイルできない。 '/O2' と '/RTC1' は同時に指定できません ってコンパイルエラーが出る。 プロジェクトの設定でO2→Odにしてるんだけれども。 RTC1の方を切ればコンパイルできるんだけど、なんでだー!
フルスクリーン化ではなく、ウィンドウモードでの最大化って どうやったらできるんでしょうか?
起動時に設定ファイルなり引数なり読み込んで解像度変更させちゃえば?
>>445 は画面サイズを可変にしたいということ?
どこかにそれっぽいサンプルがあったような……。気のせいかな。
SetWindowSizeChangeEnableFlagで可変設定、 SetGraphModeで直接指定ができるね なんとかして使ってるモニタの解像度を取得して当て込めば出来るかも だけど処理速度は厳しいだろうな
ウィンドウのサイズを変えたいのじゃなくて 右上の最大化のボタンを押せば、標準的なアプリと同じような 動作にしたいです、 画面全体にきっちり広がって間違ってマウスでドラッグしても動かないような感じです
えーと、それで、何がしたいの・・・?
>>449 普通にフルスクリーンモードじゃなくてウインドゥモードにすれば
いいだけじゃないの?
そういう関数あったと思うけど。
デフォルトでは画面の端っこにマウスポインタを当ててもサイズは変えられないし
最大化ボタンも押すことができない
これを変えたいってことなら
サイズの手動変更の場合は
>>448 あとはSetUseASyncChangeWindowModeFunction()で最大化ボタン有効化だと思うんだが
ちょっとこっちの使い方が分からないorz
453 :
名前は開発中のものです。 :2009/02/01(日) 22:16:17 ID:2n+Oqc2F
縦シューを作ろうと思ってるんですが、 480x640で起動することってできますか?
454 :
名前は開発中のものです。 :2009/02/01(日) 22:20:08 ID:90n+ELwG
455 :
名前は開発中のものです。 :2009/02/01(日) 22:30:43 ID:2n+Oqc2F
>>454 できた!
ありがと^^
起動時に640x480になってるのが気になるけど、まいっか
456 :
名前は開発中のものです。 :2009/02/01(日) 22:34:51 ID:90n+ELwG
>>455 もっと早い段階で呼び出せば良いよ
DxLib_lint()より上で呼べば最初からそのサイズになる
DXライブラリで同人ゲームを作ろうと思っています。
C++でプログラミングするにあたって、横スクロールアクション(マリオとかロックマンみたいな)
の作り方のサンプルを紹介してるサイトってないですかね?
↓シューティングゲームについては四聖龍神録さんのページが非常に役に立ちました!
http://dixq.net/rp/
応用力の無いやつや
最初はグローバル変数使いまくって 次に構造体をグローバルにして使いまくって 次に構造体をポインタで書き換えるようにして 引数に構造体のポインタがどんどん増えていき 次に各構造体の先頭のポインタをまとめた構造体をつくってそれを引数にしたんだけど だいたいみんなこんな感じ?
462 :
457 :2009/02/04(水) 22:20:44 ID:igrRGuw3
>>461 前から気になってはいたんだけど、構造体とかグローバルで使うのって何かまずいことでもあるの?
ポインタにする利点をずぶの素人の俺にも分かり易く教えて欲しい。
引数で構造体を直に渡してなければ余り関係ない気がしてるんだけど。
グローバルな変数は、他で書き換えられるかもしれないことを いちいち考えないといけないんだよな プログラムの複雑さが増すので乱用は慎しめと言われてる
はっきり言ってしまえば、そのプログラムを自分しかさわらなくて、 注意して組む自身があるならグローバルでも問題ないと思う。
>>465 俺は、あえて 「昨日の自分は他人」だと思って、
可能な限り、必要性のない限り グローバル変数は使わない方がいいと思うけどね。
(特に、携帯機器とかメモリ節約とか求められてない時は余計に。)
>>463 “普通の”ポインタの利点は、微妙だな。ただ、まだまだある所じゃ、速度的に値のコピーよりも
参照して行った方が効率が良かったり、処理の記述がしやすくなったり。
ただ、あるClassのポインタ(関数ポインタ含む)は処理の委譲に頻繁に利用される。
利点として、全体像が綺麗にできるし、コードの混雑が大きく減る。
cf.Strategy パターン Decorator パターン 双方向リスト 動的確保
>>463 グローバル構造体自体は普通に使うよ。
グローバルクラスが普通に使われるように。
C++においては構造体=クラスだからね。
問題は、構造体に使われるpublic変数なんだと思う。
GetXX(),SetXX()にすればいいって問題でもないとは思うけど、もしクラスならメンバ変数は基本的にみんなprivateでしょ?
何言ってるかさっぱりわからん俺のソースは絶対他人には見せられんな。
>>463 461です
俺は今年からプログラミング初めた素人
まだグローバル変数使って困ったことはないけど
勉強しつつゲーム製作やってるから今はポインタ使って試してる
次はクラスってのを使ってみる予定
DxLibでaviを再生させる関数ってありますか???
>>470 すいません
DXライブラリで検索したら即効見つかりました
お騒がせしました
すいません 下のようなコードで何か問題ってありますでしょうか 動画が真っ黒の画像で再生されてしまいます test.aviはexeファイルと同じディレクトリにあります #include "DxLib.h" int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { if( DxLib_Init() == -1 ) // DXライブラリ初期化処理 { return -1; // エラーが起きたら直ちに終了 } PlayMovie( "test.avi" , 1 , DX_MOVIEPLAYTYPE_BCANCEL ) ; DxLib_End() ; // DXライブラリ使用の終了処理 return 0 ; // ソフトの終了 }
>>472 原因を調べるにはまずどこがおかしいか調べようぜ
PlayMovieの戻り値は調べた?
まあおそらくtest.aviが開けないんだと思うけど。
exeと同じディレクトリでもカレントがそことは限らないよ、どうやって実行した?
フルパスで指定してみるのがいいかもね
474 :
名前は開発中のものです。 :2009/02/06(金) 10:04:24 ID:T3lftGPa
>>472 #include "DxLib.h"
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPSTR lpCmdLine, int nCmdShow )
{
if( DxLib_Init() == -1 ) // DXライブラリ初期化処理
{
return -1; // エラーが起きたら直ちに終了
}
if(PlayMovie( "test.avi" , 1 , DX_MOVIEPLAYTYPE_BCANCEL ) ==-1)
{MessageBox(NILL,"ファイルが開けません","読み込みエラー",MB_OK);}
WaitKey();
DxLib_End() ; // DXライブラリ使用の終了処理
return 0 ; // ソフトの終了
}
こう変えて確認してみたら?
PlayMovieは、ファイルの読み込みに失敗すると-1を返す(成功は0)
もし、これでMessageBox表示されたら上手くファイル指定ができてないってこと
もしかしたらコーデックなんかの問題もあるかもしれないけどそこは分からない
あと、PlayMovieはそこでムービー停止するまで処理とまるんだっけ?
そうじゃないならムービーの再生が終わるまで処理終わらないようにする工夫が必要
どれもこれもリファレンスにあるから一度目を通してね
つーかこれ公式のヘルプのサンプルそのまま貼り付けただけじゃないか。 これで問題ありますか?って、、、、 今後もサンプルがうごかないたびにコメントごとそのまま貼り付けるつもりか。
公式ページにカレントディレクトリの説明がないからだろ フルパス指定を推奨しろよ
実行させてないけども、472のプログラムって一瞬で終わったりはしないのか・・
一応、ムービーは最後まで流れたよ。 ファイルが無いときも黒画面のフルスクリーンまでいって帰ってくる
480 :
472 :2009/02/07(土) 12:23:31 ID:m2CcO09N
すいません 解決しました 原因は動画のサイズが大きかったことでした 試しに400*300の小さい動画を再生したところ画面左端にきちんと表示されました
ほー大きいと駄目なのか
大きいってどれくらいだろう。
謎がふかまるばかりだ
画面から一部はみ出てるから表示されないじゃね
背景の画像と前景の人物画の輪郭をアンチエイリアスで 合成するにはどうしたらいいですか?
アルファブレンドの出番かな? ファイル名_a.拡張子で指定。プログラムは変更不要で元ファイルといっしょに読み込む。 グレースケール(白黒)で256階調。 0(黒)が完全透過で255(白)がマスク、中間値で半透明処理できる。
前景に普通にアルファチャンネル付き24bit-PNG使うだけじゃなくて?
png扱えるならそれが一番楽だな
ありがとうございます アルファブレンド試してみました ファイル一つ用意するだけで出来たんですね 美しい描画に感動しました アルファチャンネル付きpngは今から作ってみます 作ったことないからグーグルから始めますが 今日中にがんばってみます
アルファチャンネル付きpngすぐ出来た ありがとうございました
俺はもう何でもかんでもアルファチャンネル付きPNGだ。便利すぎ
だな
pngって使用制限あるんだっけ? pngを知ったら他の形式なんてとても使えたものじゃない。
スピードに問題はないの?<アルファチャンネル付きPNG
読み込んだあとは一緒だから全く問題ない
そうなんだ。 透過処理ってなんか重そうだから多用しないようにしてたんだけど、心配なかったのか。
png使ったら著作権表記が必要じゃなかったっけ?
pngはgifの特許がらみがウゼーって事で作られたものだから その辺の表記なんたらは何にも必要ないよ
pngそのものの著作権じゃなくて
読み込んで表示させるプログラムの著作権じゃない?
>・下記の機能を使用した場合は、配布するソフトウエアのドキュメント等に各機能に応じた
> 著作権表示を含めてください。
>
> PNG 画像を読みこむ機能を使用した場合
>
> libpng Copyright (c) 1998-2004 Glenn Randers-Pehrson.
> zlib Copyright (C) 1995-2004 Jean-loup Gailly and Mark Adler.
http://homepage2.nifty.com/natupaji/DxLib/dxlicense.html
>>496 >>495 はアルファブレンドとアルファチャンネル付きPNGが一緒ってことじゃないかな?
透過処理は普通の描画に比べたら遅いよ。
ああ、なるほど。 491がなんでもかんでもって言ってるから 普通の描画と同じくらい軽いのかと思ってしまった。
TGAだったら外部ライブラリ使ってないから著作権表記の必要はないよ 圧縮アルゴリズムが単純だからPNGよりファイルサイズが大きくなるけど・・・
さっき何気なく3D版の公式見てみたら・・・
終了か
透過処理はそんなに重くないよ
3D版まだ落とせるとこない?
直リンで落とせるんでない?
かゆい うま を思い出したwww作者どうなったんだw
ファイル名が分からない…
だいたいなんで今更3D版がほしいんだ?
なにが今更なの?
公式が死んでるのに今更そこまでしてほしがる理由は何だろうと単純に思った。
きっと、開発を引き継いでくれる猛者なんだと予想
"今更"って主観に左右されると思う
>>512 前に使ってて一時期離れてたとか
DXライブラリの事を最近知ったなら今更とか関係ないし
てか、なんでそな事を疑問に思うのか疑問だ
ちょうどサイトが死ぬ頃にきたもんだから、何かこう「今更かよ!」的な印象を持ってしまった。 失礼した。
んーー???
情弱死ねって事でしょ
とりあえず、webarchiveあたりからリンク引っ張ればいいじゃん
DXライブラリ初めてつかってみたんだけど、なかなかいいね。 面倒なDirectX初期化周りやレンダリング処理を全部任せられるのがすごく便利。 今まで何度も1人でゲーム作ろうとしてゲームのライブラリ化までで燃え尽きてたけど、いけそうな気がする。 ただ、メッセージプロシージャ周りを完全に独立させて、他に譲渡できればいいんだけど、 DirectXの特性上難しいのが残念かな。 ウィンドウモードでデバッグウィンドウ周りを実装してたときに感じた愚痴です。
3Dの方が更新されてたが、作者どうしちまったんだ?気でも違ったか?
人生の方が狂ったんじゃ
523 :
名前は開発中のものです。 :2009/02/13(金) 20:41:49 ID:Br6f/DrZ
>>523 日記の内容からして
もうDXライブラリの方は手をつけないんだろうか
このスレ見てなかったっけ? そのうち書き込むんじゃない?
>>523 ああ、移転だったのか。
あんなイカレた閉鎖文なんか載っけてどうしたのかと思ったよ。
要望に答えるのが日常になって自分の作りたい物に時間や気力を使えなくなったから 過去を全部捨てて仕切りなおしたって感じだな もうライブラリとかそう言うのは作っても公開しない気がする
DXライブラリ3Dは公開される気配はなさそうだし、終了のお知らせか・・・
まあこうなるとは思ってたよ DXライブラリ3Dのソース見てみたらモデルの扱いにD3DX使ってて まともなライブラリに至るにはまだまだ先の長い状態だったしな・・・
いや、作者はどこか意志が弱そうだから、 また公開してくれるまで諦めるな。
人様が作っている物をタダで利用させてもらってる以上、こういう事態は仕方ないと思うよ
532 :
名前は開発中のものです。 :2009/02/16(月) 17:21:56 ID:2DsBHdnG
>>532 >※このサイトは2,3日以内に自動的に閉鎖されます
このスレ見て一時的に公開?w
でもこうやって出来る限りの配慮をしてくれるのはありがたい 非常に乙でした
とりあえずウィルススキャンはクリアした
てか自動的に閉鎖ってできるのか
今北 関数リファレンスページにあるリンクされてない関数ってサンプルがないだけで使えるんだよね? SUGEEEE
538 :
名前は開発中のものです。 :2009/02/17(火) 16:23:49 ID:5nIY3uJB
DXライブラリ3D作者 おつかれさま いろいろ勉強させていただきました
DXライブラリ3D辞めたのか。うーん。これからどうしよう。 SlimDXに行くかな
SlimDX使えるような人ならDXライブラリの世話になんかならんw .NET言語で書けること以外は生DirectXと同じだぞ
まあおかげDirectXのドキュメントが役に立つわけだがw
DXライブラリ3D作者ありがとう、感動した。 おつかれさまでした。
543 :
名前は開発中のものです。 :2009/02/18(水) 01:28:08 ID:p5LpkikR
etGraphMode(800,600,32); if( DxLib_Init() == -1 ){return -1 ;} int t,g; g=LoadGraph("a.png",TRUE); SetDrawScreen(DX_SCREEN_BACK); for(t=0;t<150;t++){ DrawGraph(GetRand(800),GetRand(600),g,1); ScreenFlip(); WaitTimer(10); ProcessMessage(); } 単純に画像を全画面にランダム表示するプログラムなのだがここで問題が・・・ Radeon系のグラボで実行すると画面がおかしくなるんです SetScreenMemToVramFlagでグラホのメモリを使わない設定にするとまともに表示します DXライブラリはRadeonの相性悪いんでしょうか ちなみに実行したパソコンのグラボはラデX1950Proと3870で ドライババージョンは1.2.2545 38946です
544 :
名前は開発中のものです。 :2009/02/18(水) 01:28:34 ID:p5LpkikR
最初のSぬけてた
「おかしく」の内容がわからないけど たとえばSetGraphMode(640,480,16);にしても起こる?
546 :
名前は開発中のものです。 :2009/02/18(水) 04:12:49 ID:p5LpkikR
>>545 色を変えてもちらつきます・・・どうやら色問題でもなさそうです
で試行錯誤していろいろやってみたけど
SetDrawScreen(DX_SCREEN_BACK); というの行を削除して
実行するとまともにちらつきがなく1枚ずつまともにきれいに表示された
(理由はよくわからないけど・・・)
あ 肝心なDXライブラリはVer2.25です
>>543 全文かいてないからどうおかしくなるのか分からないけど、それだとすぐに終わらない?
SetGraphMode(800,600,32);
if( DxLib_Init() == -1 ){return -1 ;}
int t,g;
g=LoadGraph("a.png",TRUE);
SetDrawScreen(DX_SCREEN_BACK);
while(ProcessMessage() == 0)
{
for(t=0;t<150;t++){
DrawGraph(GetRand(800),GetRand(600),g,1);
}
ScreenFlip();
}
DxLib_End();
return 0;
これでもだめ?
548 :
名前は開発中のものです。 :2009/02/18(水) 08:16:18 ID:476p40bE
ラジオン自体、DirectXの規約にこだわり過ぎているからな テクスチャサイズは2の累乗とか特殊なウィンドウサイズに対応してないとか
549 :
名前は開発中のものです。 :2009/02/18(水) 08:38:08 ID:p5LpkikR
>>547 すいません自己解決しました^^;
どうやらDXライブラリのプログラム上ではなく
ATI Catalystのグラフィック設定がおかしかったようです・・・
3Dアンチエイリアス設定を「管理しているアプリケーション」を選択して
設定して実行すると 画面に残像現象がおきて変になるようです
そこの設定を 2x4x6x(どれでもOK)を選択すればちゃんと表示されました
ファイナルパック逃したああああああああああ
>>550 ^q^9m
>改変して二次公開したりしても別にかまいませんが、その際は二次公開の旨を分かる位置に掲載してください。
>なお、DXライブラリ3Dは著作権は原則フリー(常識の範囲内で)なので商用・非商用・自作ライブラリへの組み込み、
>全てにおいてあなたのやりたいようにやってください。
その内誰かうpしてくれるよw
552 :
名前は開発中のものです。 :2009/02/18(水) 21:08:45 ID:CQ81txgw
>>552 それは中身改変してる場合じゃね?>掲載
554 :
名前は開発中のものです。 :2009/02/19(木) 07:50:51 ID:pIWtXiH1
何故か3Dモデルがポリゴン欠けしてしまうよ
それ以前にさ、モデルを100分の1くらいに縮小して表示したら変なことにならないか? もうこれでずっと悩んでるんだが
ヒント 有限な計算精度
縮小するなら、縮小専用のモデル(ビルボでも可)を用意してあげれば?
↑ログイン形式だったの忘れてた。聞かなかったことにしてくれ。
ライブラリ3DはDXアーカイブファイルとFileRead_系の関数が使えないのかああああああああああ
561 :
名前は開発中のものです。 :2009/02/19(木) 20:18:13 ID:bxQhZGhK
File_Read系は #include<stdio.h> で好きなだけ代用できるじゃないか intじゃなくてFILFポインタになるけど アーカイブは探せばいくらでもあるから代用できる ……はず
>>558 うはー、DXライブラリ3Dってこんなの作れるのか。
DXライブラリ3Dを持ち上げては「閉鎖もったいない!」「また公開されるべき」と色んなスレで書き込んでるIDが同じヤツ作者? それにあわせて作者が同じ日に公開とか自演ぽくね? 閉鎖なのか公開なのかはっきりしろよ・・・ 大学続けようとおもいます→大学中退しました→ 夢があるからです→夢から冷めてきました→ 興味が薄れてきました→PC壊れたので・・・→閉鎖します
んな事自演しても意味ないと思うけどな〜w
>>563 アホ?
これ以上のバージョンうpは無いと思ってればいいだろ
閉鎖されてから落とせなくて探してる奴が居ただけだ
ファイナルを何時から準備してかは知らんがな
てか、こんな過疎板に自演して作者に得があるのか?
2Dの方で努力に見合った対価が得られなかったのかな?
DXライブラリ3Dだけど個人的には飽きっぽいのに根気が要るライブラリ公開なんてするなよと思った 無料だから文句は言えないけど、飽きたから管理止めますとか、無責任なことには代わりない もうこの作者のことは信用できない
文句言いまくりですねw
まあ擁護してる奴は作者だろうな
仮に飽きたからでも一身上の都合と言うのが大人だよな
麻生じゃないけど世の中思った事をそのまま口にすると損する事が多いらしい
>572 そらそうだw
麻生は口滑らしすぎだなw
欲しい物が手に入ったら叩き始めるとかもうね
小泉さんは思ったこと口に出したからこそ成功できたタイプ
飽きたから止めますってなんて言われたら今までのファンは凹むもんさ 有料でもいいから続けてみては?
>>576 どこがだよwww
むしろ、逆だろ。ほとんど何も言わなかった。
で、喋る時は、あらかじめブレーンが考えた フレーズで乗り切る。
だから、絵が欲しいTVには喋ってる所で、内容がぶれようがない。
変な編集かませる余裕を作らず、ちゃんとメガホンとしてマスコミを利用してた。
メディアの使い方が上手かった、これだけは間違いない
DXライブラリ3Dの作者は信用できないのは間違いない それ以上にDXライブラリの名前使ったのに逃げたのが許せない
>>578 私の内閣では通用しない
感動した
そして解散を決めたときの名演説
いまさらかつての人気を貶めようとしても無駄ですよ
582 :
名前は開発中のものです。 :2009/02/20(金) 15:48:19 ID:D8Q9D5Jt
DXライブラリ DXライブラリ 関数リファレンスページ dxfunc2.htm(ファイル名) には詳しい説明がなくて メニュー関係関数がいまいち使い方がわからない
あー、なんか >それ以上にDXライブラリの名前使ったのに逃げたのが許せない これはわかる 名前がまったく関連性のないものだったらよかったのにね
メニュー関係関数って何
集客のためだったんだろうよ。
メニュー関係の関数は本当に全然わからんよね 関数の数も多ければ、引数についても説明不足でなにがなんだか分からないよ。まじで。 自分はResourceから作ってます。 IDR_MENUってのがメニューリソースでこんな感じ SetUseGDIFlag(TRUE); //GDI利用 SetUseMenuFlag(TRUE); //メニュー利用 LoadMenuResource(IDR_MENU); //リソースからメニューを読み込み SetDisplayMenuFlag(TRUE); //メニューの表示 注意を1点だけ。 Windowモードだと問題ないけど、フルスクリーンモードだと、 そのメニューからDialogBoxなりMessageBoxを呼ぶと、 一見ちゃんと表示されたようになりますが、処理復帰後、 その後、メニューが隠れて見えなくなります。
あ、あとメニュー作成はDxLib_Initの前でOKです
>552 今DLしました ありがとうございます!
>>552 超ありがとう。
マジで。
おかげで開発引き継げられるわ。
>>589 引き継いでもいいけどDXライブラリ3Dという名称はやめてくれ
>>590 わかるけど
変えたら変えたで問題じゃね?
俺ももうDXライブラリ3Dという名前はやめてほしい 完成度が高くて初心者でも分かる程度になってから名乗って欲しい
DXライブラリ3Dの作者叩く奴等は最低だと思う。 どこのチョンだよ。 見てて恥ずかしい。
勝手にDXライブラリ名乗って売名したうえに ユーザーから賞賛されないって逃げたのは誰だよ ホンディーって名乗ってホンダっぽさだして 富士山移して日本っぽさだして売名してる現代車と変わらないのは作者だろ しかも、性能まで劣ってるというとこまで同じだし 叩くというかもう出てこないで欲しい
行動せん奴よりは100億倍マシだがな
行動の方向性が悪けりゃ邪魔にしかならない そして、作者は現に逃げた 大学からも ライブラリからも サイトからも
ml::だけは格好悪すぎるから変えてくれ
あと作者はあのサイトとあの名称を捨てただけで活動してるみたいよ? ブログっぽいのに書いてあった その宣言と同時に突然DXライブラリ3Dの書き込みや動画投稿増えてるからなー 何をいわんとするかは察してくれ
>>597 あれはセンスないよなmL.とかないわーって思った。
普通に dxlib3d. とか略してdx3dなり関連性だせばいいのにな
そもそも初心者向け狙ってクラス前提はどうかな・・・
表面層ですべて関数化したほうがDXライブラリっぽくていいのいね
プログラマなんだろ? 自分でやれよ。 うだうだうるさいな
クラスやだやだと思っていたクチだが いざ自分がクラスを覚えるとやっぱクラスじゃなきゃやだな。
あのライブラリは終わったんだからさっさと切り替えろよ ここは Dxlibのスレだ
確かにまったく関連ないからね、関連持たせたい人いるようだけど
DXライブラリのひともこんな奴らがユーザーかと思ったらやる気なくすわな。 なんかあったらどうせ同じように叩くんだろ? で、お前ら1本くらいゲーム完成させたのかよ? できてる奴は晒してくれ。できてない奴は3d叩いてないで、一緒に精進しようや。
むしろ何をモチベーションに頑張っているのか知りたい。 一銭にもならんのに世の中には奇特なひとがいるものだなと思っている。 使うほうとしては助かるが。
やる気勝手になくしてろよw なんかあったら同じように叩くに決まってるだろwそれが悪いのか? 一銭にもならなくても集客や勉強にはなるからな それを先に期待して失敗したライブラリもあるようだがw
3D版をよく宣伝しておいてあげるよ 色んなとこでなw よかったなJEX
IDにdx出たらなんか嬉しいわ。
フリーソフト全般に言えることだが、モチベーションはユーザーの笑顔だよ。
勉強も兼ねて作ったソフトでも他人が喜んでくれると嬉しいじゃん。
でも勘違いしないでほしいのは、「奉仕」ではなくて結局は自分が嬉しいからということ。
だから
>>606 みたいなコはツクールでも他のライブラリにでも行けばいいのは確定的に明らか。
…作者乙みたいになっとるorz
だから、DXライブラリとDXライブラリ3Dはまったく関係ないだろ その話題をだすなホンディー野郎が
無関係なのに名前だけで信者が勝手に宣伝してくれる東方のようだ
この過疎スレでまっかっかとはこれいかに
ID:Vvb1WGeN
DXライブラリPortableなるものもあるし、どうなってるんだ
本家の雑談掲示板で 投稿者:管理人 投稿日:2008/12/02(Tue) 03:41 > PSPで使えるDXライブラリ風のライブラリに取り組んでいます。 > DXライブラリPortableというそのまんまな名前です。 DXライブラリの名を冠するのでしたらDXライブラリのプログラムがそのまま動く方向で・・・ 嘘です ( いえ、***さんなら可能かもしれませんが・・・ ) というか、似てる度合いにもよりますが、なにもセンスの無い名前( DXライブラリ )を使う必要は無いのでは(^ ^; ; 遠回しな表現だが、DXライブラリの名が乱用されることに困惑している プログラミング云々以前に、奥ゆかしい心を持つのが大事だと思うよ 渦中の人物さんも、とうに終わったことを批判してる皆様も |ω・)。oO(・・・なんて言ってみたいね)
>なにもセンスの無い名前( DXライブラリ )を使う必要は無いのでは(^ ^; なにを今更かもしれんが 「DXライブラリ」という名前は本当、どうにかならんかったのかな。 一般名詞なのか固有名詞なのか紛らわしい。
>>617 DirectXの公式ライブラリだと思ってる人も居るしね
でもこの微妙な名前のお陰で検索で迷うことが無いw(似た名前を誰も付けないから必ずトップに来る)
しかしDX(デラックス)ライブラリなのか"D"irect"X"ライブラリなのかどっちなんだ
>616 遠回しな否定にちょっと笑った >617 遠い昔に、同じようなことを(仲間内でだが)ツッコんだ記憶があるw
東方二次創作で東方○○○(漢字三文字)って名前にするような感じだな
なんか根本的に違う
DXライブラリとは直接関係無いかもしれませんが質問させてください。 今2Dのゲームを作り始めたばかりです。 座標系の変数にint型を使っていますが計算や関数に通すと小数点以下が切り捨てられ若干正確さに欠けるてしまうのが気になります。 floatやdoubleを使えば正確さは取り戻せるのですが、 この先ゲームを大きくしていくにつれて浮動小数点型を使用するデメリットなどはありますか? たとえば大量の衝突判定を行う際の演算速度に影響しないかなどが気になるのですが・・・
そもそも小数点以下が切り捨てられるのが正確じゃないと考えるのがおかしい。 表示座標と内部座標について見直せ。
int型は整数をいれる変数です
ちなみに内部的に浮動小数点で持っても別にいい。 表示の時は整数キャストしなさい。 切捨てが気になるなら四捨五入の関数やマクロでも使いなよ。 演算速度はint>float>doubleだが、 floatで座標を持たないといけない設計のゲームが、 演算速度の関係でint型に戻すとかは考えない方がいい。 作ってるゲームにもよるが、あたり判定はコストが掛かるところ。 演算速度が気になるようなら、基本的な衝突判定アルゴリズム(4分木空間分割)を使うがいいさ。 演算速度の問題はアルゴリズムが解決してくれる。
2Dゲームでそんなに正確さ求められるもんかねぇ。 それとは関係ない、こっちの話だが 俺の作ってる2Dゲー、今までは普通に動いてたのが PCに故障によって多少環境が変わったところ、 状況によって激重になるようになってしまった。 もともとそんなに高性能PCってわけじゃない(はずな)のに 非効率な組み方でちゃんと動いてたから安心してたんだが これはちょっと根本的に見直す必要があるのかもしれん。 画像のサイズを2のn乗にする事で多少改善した部分もあるが 画像とは関係なしに重くなる部分があるようなので それこそ以前勉強しようとして挫折した空間分割とか考える必要があるのかも……。
まずはどの箇所でオーバヘッドを生んでいるのかを明確にしてからだな 当り判定なのか、描画処理なのか、読み書きなのかだ。 それぞれマイクロ秒単位(GetNowHiPerformanceCount)で処理時間を計測して、 ボトルネックになってる箇所があたり判定なら空間分割したらいい。 勉強するのが嫌なら、どっかその辺のライブラリ引っ張ってきたらいいさ。
浮動小数点なんて使ってたら誤差がどんどん 広がっていきませんか?
整数だと、何故正確じゃなくなるのかが分からないんだ。 誰かアドバイス頼む。
ミサイルの計算とか整数でやろうと思ったらものすごく頭使わないといけないと思うんだが
ソースを貼るのが一番じゃね?
>631が質問者と同一人物かどうかは分からんけど 例えば、毎フレーム5ドットずつ動くオブジェクトがあるとする。 「速度アップ」というアイテムがあり、それを取ると移動速度が10%上昇する。 速度10%アップということは、速度が5から5.5になることを意味する。 だが、当然ながらint型では5.5という数字は表現できない。 無理矢理に5.5を表現しようとすれば、 フレーム毎に5ドット移動と6ドット移動を繰り返す……みたいなプログラムになるだろう。 でもこれはロジックとしては最悪だろうし、見た目にもガクガクしてしまう。 この場合、整数型で「速度10%アップ」なんていうアイテムの仕様が悪い。 もし一人で作っているなら、そのゲームの仕様を見直すべき。 これは極端な喩えだが、 そういう部分を考えずに、安易に浮動小数点にしよう!とするから問題が起こる。
有効数字というのがあってだな
スレチ
>>627 減算とか特殊な描画モード使ってたり、大きいテクスチャ使ってると環境毎に差が出やすかった経験
ファミコン時代のマリオアクションのようなゲームなら整数で座標保持してOK どうせキャラは1ドットずつしか動かないだろう。 いまどきなシューティングしようとおもったら、 弾の移動なんかは、弾オブジェクトに加速度や速度をベクトルで持たせるだろうから、小数点使いなよ。 丸め誤差については値のとるべき範囲と計算式の展開方法を見直せ。 やれやれ。こんな質問じゃあDXライブラリ使用者の質が問われるぜ……。
double x = 0; for(i=0;i<10;i++) x += 0.1; とやってもx==1.0にはならないと読んで、 次アクション系作るときは座標を固定小数点にしようと思った。 たとえば上の計算の直後の x は0.9999になる場合がありそのときそれをintにキャストしたりfloorすると0.0になってしまう というのを(常識なのかもしれないが)それを読むまで知らなかった
639 :
623 :2009/02/23(月) 19:27:59 ID:4Qo3h6rv
>>626 回答ありがとうございます。
衝突判定に試行錯誤する覚悟でfloatを使っていこうと思います。
>>633 たとえば、5ドットずつ動く弾をx軸から10度の方向に撃つとき、
sin10°*5だと1を割ってしまうので座標を整数で記述していると10度の方向に行かず水平に移動してしまいます。
intを固定小数点数的に記述する方法もあるにはあるのですが
あくまでみなし少数なので注意してコーディングしないとバグが出る、要するに面倒くさいんです。
sin10°と書いた時点で浮動小数点使ってる。 まさか1周256°のsinテーブル保持するなんて、オールドテクニック使うつもりじゃないんだよね? 整数部と小数部を持たせる固定小数点だとfloat演算より余計にオーバーヘッド食うよ。 素直にfloatでOK。
みんな知っていることだと思うけど、
>>638 の誤差云々という話についても書いておく。
1.浮動小数点に関して、==で比較してはならない。
2つの浮動小数点数の差を取り、その絶対値が誤差限界より小さい時には、等しいものと判定するようにする。
2.浮動小数点同士の計算は一番最後に行う。
誤差の蓄積を防ぐため。上手いこと計算の順序を変える。
3.一時的に整数型を使う
0.1を10回足し算する計算を、0.1を10倍して1にしてから10回足して、その後に10で割る。
固定小数点の中でも、特に整数部と小数部を分けた固定小数点はバグの温床になりやすい。
正直いらんお世話だと思うが、1人でも悩んでいるのならとおもって書いておいた。
642 :
633 :2009/02/23(月) 21:54:08 ID:cbCnDoWc
>639 整数だと正確さに欠けると言っても、その「正確」って言葉自体に色んな意味があると思うんだ。 (1)何らかの物理法則(嘘物理でもいい)をトレースする正確さ (2)プログラマの想定通りに動くという意味で正確さ 前者だと、intよりもfloat、floatよりもdoubleの方がより正確だろう。もちろん限界はあるけど。 後者だと、ちゃんと仕様を理解している限り正確さなんて変わらない。 なので、整数型だと正確じゃなくなる、という表現は誤解を招くかもしれない。 自分(>631>633)もそうだが、>624なんかも後者の意味で捉えたんだと思う。 >後半(>633へのレス)部分 要は、プログラム側で整数型を使うと決まっている時に、 整数で表現できない数字を使おうとするのが、そもそもの間違いってこと。 よく言われることとして、ゲームは物理シミュレーションではない。 物理法則を “正確” にトレースするより、物理法則に従ってるっぽく見えることの方が重要なわけだ。 >639の例なら、45度の角度なら水平に飛ぶことはないだろう。 もちろん誤差は出るが、その誤差に合わせてゲームの内容や難易度を調整すればいいんだ。 あ、浮動小数点を否定しているわけじゃないぞ。 最終的にはfloatとかdoubleを使うことになるだろうし。
643 :
名前は開発中のものです。 :2009/02/24(火) 18:11:56 ID:ZuK8YWCV
はじめてここきたぜ、誰もいないかなぁ。 RPG作ろうと思って2週間くらい粘って 斜め移動とか歩くモーションとかは入れられるようになったんだ で、チップを使わずに、もしアイテムとか人が立ってたとしたら ある範囲まで近づいたら頭の上にでもアクションが出るようにしたいんだけど こうすると、いけるところといけないところの判定を作るのがごちゃごちゃになる。。 先人の知恵があれば、誰か。。
判定とどう関係があるのかわからないんだが、 間に壁があったらアクションが出ないようにしたいってこと?
おっ 壁の絵を描いたとする。 その壁の座標に沿って越えられないようにする。 ような感じなんだけど、チップでやれば、 チップ番号で判定してそこだけ通れないですむけど 壁が複雑な形(円状に、三角だとかだと、どうするのかなぁって。
646 :
名前は開発中のものです。 :2009/02/24(火) 18:26:41 ID:ZuK8YWCV
訂正orz 円状になってたり、角になってたり、 です
壁ごとに判定するだけ
つまり同じサイズの画像をつくって 通れないところはたとえば緑で塗りつぶして 座標と入力された方向に移動量を加算して 画像の1bitで判定してもし緑なら動作しないでおk?
まずは壁(通れないところ)と通路(通れるところ)を別個で作る。
画像を使ってもメモリが許すなら
>>648 の作り方でOK
で、キャラと反応オブジェクトの間に壁があるなら非アクション。それ以外なら距離が近づいたらアクション
みたいな感じでいいんじゃない?
>>643 とりあえず、日本語を勉強しろ。
すげーわかりにくいぞ。
頭の上にでもアクションってんが、メタルギアソリッドの敵兵の気づき!
みたいなのだとするとして、
1)アクション表示キャラの判定の選別が難しいのか?
それとも、2)キャラの動きの判定(進入可能区域か否か)が難しいのか?
その両方か?それとも判定じゃなくて、3)衝突反応に問題を抱えてるのか?
どれだ?
※衝突反応・・・・壁に計算上はめり込む位置からの移動の時に、
垂直にぶつかったら、壁の前で停止、
斜めにぶつかったら、壁に沿って進行方向に近い向きに進む。
などの判定以降の処理。
とりあえず、 『実例で学ぶゲームAIプログラミング』に1)2)等については書いてあった。
たぶん、今後とも良い勉強になるとおもうから、お勧めする。
3)は、ひたすら細かい調整をしていくしかない。
基本は、幾つかの場合分けをして考えれば直ぐに分ると思う。
>>650 2)だぜ。親切にありがとう。本屋で探してみる。
キャラ同士を結ぶ線についての障害物可否判定かと思ったら、全く違って笑ったw
そういう意味だったのか。 全然わからなかったw
654 :
名前は開発中のものです。 :2009/02/26(木) 12:21:47 ID:dehVPWYB
DXライブラリって描画先をテクスチャに出来なかったっけ? 描画先指定でグラフィックハンドルを指定したら出来なかったから気になったんだけど……
描画可能なグラフィックハンドルってのがある それじゃないと書き込みできないよ
MakeScreenってのかな? グラフィックと画面は別なのね……
ちょっと上の話題に関してなんだが 座標扱う時は素直にfloatでよかったのか 俺は小数点型だともしかしたら遅くなるかもと思い 座標計算には100倍したものを使い、表示するときに100で割って使ってたのだが (まあ10倍で十分かもしれんが) あと、どっかでfloat よりも double 使った方が良いと聞いたので、 俺は小数点型を扱う時には専ら double型を使ってるのだが
>>657 それが得策。floatは、使い方が難しい。
悪く言えば、既に過去の産物で、互換性のために残ってる・・・。
ぐらいに思い切ってしまった方が良いぐらい。
有効桁数が小さいし、感覚と違う所が強いから
小数点として扱う時は、意味も分らずにfloatを使ってると
変なバグに嵌りまくる。しかも、見た目間違ってない様なコードで嵌るからねwww
逆に、doubleだと、intよりも有効桁数が大きいから、
intで大丈夫な桁範囲を軽くカバーできるしね。
ボトルネックになってない所の計算だったら、正直doubleが無難だよ。
(あと、意外とdoubleの方が早かったりすることも多いから、
実測で比べるのは言うまでもないが。)
100倍よりも128倍したものを128で割る方がいいんじゃないかしらんと 確認もせずに想像で言ってみる。
相手のレベルによっては100倍って説明した方がいい時おあるよね。
DXライブラリっていう名前が問題なくね このライブラリ知る前から自前のライブラリもDxLibって付けちまってたし まぁ何年もまえの話だが
DirectXのラッピングライブラリだからDXライブラリでいいんじゃね? ちょっとダサカッコイイ感じが対象者レベルにぴったりだし。俺含めて。
やっぱりDirectX公式ライブラリと思われてしまっても仕方が無い。 が、いまさらオリジナルの名前に戻されてもね。 DXLibで十分や。
>661-663 その微妙な心境が手に取るように分かるぜw
朧村正みたいなゲームも作れるよね?2Dだし
作れるよ
DXLibに収録されてる非公開関数のリファレンスって無いのかな ウィンドウハンドルを取得する方法を探してたら、非公開関数で取得できるのを知って 他にも有用な関数がありそうなので気になったんだが
作者は非公開のリファレンスは書かないってよ。 利用する頻度の少ない関数を初心者に公開するには混乱の元というコンセプトらしい。 コメントとソースで自力で読むしかない。
669 :
名前は開発中のものです。 :2009/02/28(土) 06:34:58 ID:LqQy7pZD
>>668 非公開関数のリファレンスは書くつもりは無いのか
わざわざ用意した関数のリファレンスを書かないのは勿体無い気もするが
ヘッダ見たら色々あったけどコメントだけじゃ引数がわからないし、ソース読むしかないのね
>>669 そこ見て非公開関数の存在を知ったんだけど、他にも説明のある非公式のサイトとかないのかな?
引数の名前と型を見てなんとなく分かると思う。 わかんなかったのはMenu関係かな。 どれが便利な隠れ関数なのか人によってまちまちだからな〜。 全部教えるわけにはいかないので、その都度聞いてくれ。 あと、大概公式の掲示板を関数名で検索すると作者がサンプルコード書いてあるよ。
672 :
名前は開発中のものです。 :2009/02/28(土) 07:00:08 ID:LqQy7pZD
>>670 他のところは知らないかな
もし需要あるなら非公開関数ちょっと調べてリファレンスでも作ろうか?
674 :
名前は開発中のものです。 :2009/02/28(土) 07:06:17 ID:LqQy7pZD
>>673 でも、正直DirectX使えばなんとでもなるから、わざわざ推奨されない非公式関数発掘して制約多い状態でDxLib使うより
その方が早い気もする
中見てないから分からないけど、ソースが綺麗だったらまだ救いようあるんだけどな……
DXライブラリ使ってるのに、その上でDirextX直叩きする酔狂は居ないと思う。 リファレンスもあったら便利だけど、目ぼしい関数はチェックしてるからなぁ。
>>671 教えてもらえるなら助かるわ
といっても、そこそこ量があるので使えそうな関数を探すのが難しそうだがw
>>672 非公開関数をまとめてくれるのなら有難い
>>672 結構需要あると思うし、個人的にもすごくうれしい
詳しい説明は無くてもかまわないからリストだけでもあれば重宝します
>>666 ってことはDXライブラリでも極めれば市販ゲームレベルの作品が作れるって事だね
極端な話,DrawGraphさえあれば十分
画像ファイル一枚を分割してアニメーションさせるのと 全部別々のファイルを読み込んでアニメーションさせるのって負荷とか違うのかな? 後者の方がやりやすいんだがどうなんだろう
一度の画面表示に使用する画像の数はできるだけ減らした方が テクスチャの切り替えが減って効率は良くなる
>>682 やっぱりそうなのか・・
パーツ分けがめんどくさいんだよなぁ
何のためにプログラミングやってんの それこそ機械にやらせればいいでしょ
>>684 フォトショで画像作ってるからPSDファイルなんだよね
ヘボプログラマーなんでPSDファイルを分割するプログラムは作れないです・・
使ったこと無いから知らないけどさ、フォトショってマクロみたいな機能無いの?
>>686 あるよー
でもマクロするほどの作業量でもないので手動でやります
ん〜? 681と682の質疑応答の意味がよくわからん。 1ファイルを分割しようが、複数ファイルを読み込もうが使用する数は同じじゃないの?
俺もわかんね。 同じじゃん。 どっちの方が管理が楽だろう?っていう人間の負荷の話ならともかく
690 :
名前は開発中のものです。 :2009/03/01(日) 05:31:56 ID:idjBCaEs
>>681-689 一枚の画像を読み込み複数に分けハンドルを取得→PCが操作する画像は一枚
複数の画像を読み込みそれぞれをハンドルを取得→PCが操作する画像は複数
負荷が多いのは勿論後者
大げさだけど
一枚100MBの画像を一枚開くのと
一枚10MBの画像を10枚開くの
どっちが早いか考えてみたら分かるんじゃないかな?
まあ、数十枚の画像なら気にする必要はないんだけどさ
容量的にも、バイナリで開けば分かるけど、一枚ごとに色々付加されるから
200kbの画像を2つに分けて保存しても合計で220kbくらいになっちゃう(ものによって違うかな)
691 :
名前は開発中のものです。 :2009/03/01(日) 08:23:41 ID:idjBCaEs
今非公開関数まとめてたんだけど、すごくわかりやすいからわざわざまとめるほどでもない気がしてきた 作者が公開してないんだから公開するのも何かな…… 一応簡単に晒すけど…… 使い方(引数)、いつ呼ぶのか(DxLib初期化前か後か)、返値……ここらへんが分かれば良いんだよね? もしこの中で知りたいとか要望あるならHTMLにして、簡単なソースくらいくっつけてリファレンス化するよ 起動→終了で複数回DxLibを読み込まなければいけないとき(あるのか?)に使えそう int DxLib_GlobalStructInitialize( void ) ; // ライブラリの内部で使用している構造体をゼロ初期化して、DxLib_Init の前に行った設定を無効化する( DxLib_Init の前でのみ有効 ) int DxLib_IsInit( void ) ; // ライブラリが初期化されているかどうかを取得する( 戻り値: TRUE=初期化されている FALSE=されていない ) ファイルを検索して取得ウマー int FileRead_findFirst( const char *FilePath, FILEINFO *Buffer ) ; // 指定のファイル又はフォルダの情報を取得し、ファイル検索ハンドルも作成する( 戻り値: -1=エラー -1以外=ファイル検索ハンドル ) int FileRead_findNext( int FindHandle, FILEINFO *Buffer ) ; // 条件の合致する次のファイルの情報を取得する( 戻り値: -1=エラー 0=成功 ) int FileRead_findClose( int FindHandle ) ; // ファイル検索ハンドルを閉じる( 戻り値: -1=エラー 0=成功 ) ウィンドウから情報を引っ張り出す系の関数 int GetWindowCRect( RECT *RectBuf ) ; // ウインドウのクライアント領域を取得する→描画領域ね int GetActiveFlag( void ) ; // ソフトがアクティブかどうかを取得する→現在アクティブかどうかを調べる。-1が非アクティブ、0がアクティブとかだと思う(未確認) HWND GetMainWindowHandle( void ) ; // メインウインドウのハンドルを取得する→分かる人のために int GetNoActiveState( int ResetFlag = TRUE ) ; // 非アクティブになり、処理が一時停止していたかどうかを取得する(引数 ResetFlag=TRUE:状態をリセット FALSE:状態をリセットしない 戻り値: 0=一時停止はしていない 1=一時停止していた ) int GetMouseDispFlag( void ) ; // マウスを表示するかどうかのフラグを取得する
692 :
名前は開発中のものです。 :2009/03/01(日) 08:24:40 ID:idjBCaEs
int GetMouseDispFlag( void ) ; // マウスを表示するかどうかのフラグを取得する int GetWindowCloseFlag( void ) ; // ウインドウを閉じようとしているかの情報を得る→本当に終了しますか?とか確認を表示するのに使えそう int GetWindowUserCloseFlag( int StateResetFlag = FALSE ) ; //×ボタンが押されたかどうかを調べる int SetDoubleStartValidFlag( int Flag ) ; // 2重起動を許すかどうかのフラグをセットする←複数起動させてもいいゲームならここを変更 マルチタスクのゲーム作りたいならここらへんが役に立ちそう int AddMessageTakeOverWindow( HWND Window ) ; // メッセージ処理をDXライブラリに肩代わりしてもらうウインドウを追加する int SubMessageTakeOverWindow( HWND Window ) ; // メッセージ処理をDXライブラリに肩代わりしてもらうウインドウを減らす 軽くみた感じ使えそうなのはこのあたりかな?
693 :
名前は開発中のものです。 :2009/03/01(日) 08:37:37 ID:idjBCaEs
int SetWindowInitPosition( int x , int y ) ; // ウインドウの初期位置を設定する int SetNotWinFlag( int Flag ) ; // DXライブラリのウインドウ関連の機能を使用しないフラグ←これめちゃくちゃ便利でふいた int SetWindowUserCloseEnableFlag( int Flag ) ; // メインウインドウの×ボタンを押した時にライブラリが自動的にウインドウを閉じるかどうかのフラグをセットする←上記のGetWindowCloseFlagと組み合わせると幸せ int SetDXArchiveExtension( const char *Extension = NULL ) ; // 検索するDXアーカイブファイルの拡張子を変更する int SetBackgroundColor( int Red, int Green, int Blue ) ; // メインウインドウのバックグラウンドカラーを設定する←初期背景色は黒(#000000) int SetDragFileValidFlag( int Flag ) ; ドラッグ&ドロップかんれん // ファイルのドラッグ&ドロップ機能を有効にするかどうかのフラグをセットする int GetDragFilePath( char *FilePathBuffer ) ; // ドラッグ&ドロップされたファイル名を取得する( -1:取得できなかった 0:取得できた ) int GetDragFileNum( void ) ; // ドラッグ&ドロップされたファイルの数を取得する めんどくさいから、存在だけ書くけど 他にも、ツールバーにボタンを追加する関数とか ショートカットキーを追加する関数とか(←いくらでも代用可能だから使わない方がいいかも) メニューを作成する関数とか キー入力中、マウスを点滅させる関数とか ここらへんは人によってピンポイントに使えそうな関数ばっかだから、あんまりリファレンス化しても需要無い気がする 一応応用テクニックとして、HSPからDXライブラリを呼ぶ方法とかだったら需要ある? あるなら書こうかな 吉里吉里やNscから呼ぶことも出来そうだけど本体いじらなきゃ駄目っぽくてめんどくさい
694 :
名前は開発中のものです。 :2009/03/01(日) 08:44:55 ID:idjBCaEs
たとえば、×ボタンで終了確認を出したいときとかは 〜略〜 SetWindowUserCloseEnableFlag( FALSE ); //×ボタンで自動終了しない while(ProcessMessage()==1)//だっけ? { ClsScreen(); game(); ScreenFlip(); if(GetWindowUserCloseFlag()==-1)//×ボタンが押されたら { if(MessageBox(NULL,"終了しますか?","終了確認",MBYESNO)==IDYES) //YES,NOでYESが押されたら break; } } 〜略〜 こんな感じにすればできる(と思う) 組み合わせだからなあ……リファレンス作るより小技をいくつか乗せた方が良いのかな?
695 :
名前は開発中のものです。 :2009/03/01(日) 08:45:28 ID:idjBCaEs
……朝から何やってんだ俺 悲しくなってきたから寝る
おつかれさまです。ごゆっくりお休みくださいな。 リファレンスも欲しいけど、小技のほうがうれしいかも。
>>690 最初のファイル読み込みはともかく
ハンドルに分けて使う段になったらどっちも同じじゃね?
×一枚の画像を読み込み複数に分けハンドルを取得→PCが操作する画像は一枚
○一枚の画像を読み込み複数に分けハンドルを取得→PCが操作する画像は複数
>>691 乙
698 :
名前は開発中のものです。 :2009/03/01(日) 10:04:25 ID:idjBCaEs
ああ、駄目だ
>>694 だと×ボタンが押された時点でキューが送られちゃってるからDXライブラリの内部の構造的に終了確認はできない(終了確認が無限に出続ける)
「終了します」って有無を言わさぬ表示なら出来るけどね
中身見てるけど、終了キューを解除する関数は見あたらないし
独自に一度キューを取得して、ProcessMessageに投げる前に解除しちゃえば良いんだろうけど、そんなことすると初心者でも使えるって良点があじゃぱー
>>696 どんな小技が良いかな?
さっきあげた関数は単体で使えると思うし
今ソース見ながら色々いじってたけど
それ以上のことやろうと思うと色々内部的に引っかかることに気付いた
>>697 もう一度よーく読んでほしい
>>698 ごめん。
よく読んだ上で書いたけどわからない。
理解力なくてすまん。きっと俺が間違っている。
が、これは瑣末な問題なので暇なときにでも考えておくとして…
>>693 >一応応用テクニックとして、HSPからDXライブラリを呼ぶ方法とかだったら需要ある?
これ興味あるかな。
>>697 ハンドル分けたらだめ
一つのハンドルから転送元の領域を指定して描画するんだよ
同じテクスチャを連続して使うときは切り替えが行われないからその分効率が良くなる
HSPなんぞ使うなよ
なるほどLoadDivGraphでもいいのか
>>691-694 乙
前にHSPから使ったりしてたけど、わざわざHSPから呼び出す必要があまり無いような気がしたのでVC導入したな
706 :
名前は開発中のものです。 :2009/03/01(日) 14:11:25 ID:idjBCaEs
>>701 なるほど
StateResetFlagは初期値FALSEになってるやつか、完全に見落としてたアリガトウ
>>702 HSP使うメリットってなんだろう、(うろ覚えだけど)3D処理が簡単なDLLかなんかがあったよね?
でも、それ使うなら最初からHSP使えばいいし……
自分から言っといてなんだがメリット見えないやごめんw
DXライブラリの可能性を追求しようと思ってドラッグ&ドロップで画像表示するアプリ作ろうと思ったらこんなに時間かかっちゃったよ
やっぱりアプリ系はおとなしくWINAPI使うに限るorz
http://www3.uploader.jp/t/nico/images/nico_uljp00021.zip ふ、と思ったんだけどこのスレ結構知識ある人多いしうpロダでも用意しとけばサンプル集みたいなの作れるしいいんじゃね?
人のソース見れるってのは、(俺含め)初心者にはとてもありがたいんだよね
ソースうpは恥ずかしい…
自分の全裸うpするようなもん
俺のは絶対人に見せられないソースだと自覚している。 一応動いているが、初心者どころの問題じゃない。
専ロダほしいな・・・
ドット絵でbmpで保存して使うのと きれいに書いたpngだとぜんぜん解像度違うような気がして変になっちまった。 ドット絵の設定ミス?それともpngにそろえるべきかな。。
ドット絵だからドットが見えるんじゃないのか??
爆発のエフェクトなどを作成する際に グラデーションの画像を極座標変換?して 円形の画像を作成しているのだけれど、 これが何をやっているのかよくわからん。
つ高校数学の教科書
数学Cあたりだっけ
そういえば洞窟物語もDXライブラリ使ってるんだね
公式掲示板か 多分違うと思うぞ Pixel氏が以前DirectX2だか3だかを使って作ったって言ってたし 何か勘違いしてああ答えたか、若しくは今作ってるゲームにDXライブラリを使ってるんだろう
ウィンドウサイズのデフォルトは640*480だけど、これの変更はできる? フルスクリーンにしないといけないから制約はあると思うけど
Dxライブラリのファイルにデフォルトのサイズがディファインされてたから あれいじればできるんじゃね?
>>719 SetGraphMode( 800 , 600 , 32 ); で800*600になる
>>720 ライブラリ書き換えるのはアウトだろ常識的に考えて……
そのせいでいつどこでバグが起こるかわからぬ
>>721 サンクス
画面モードの変更で解像度が変えれるとは、単語検索で見つからないわけだ
リファレンス大した量じゃないんだから 一覧を一通り目を通せば済むだろ。
おれなんかどんなことができるんだろうと、わくわくしながら 上から下まで読むんだけどなぁ・・・
>>718 でも文字表示とかDXライブラリっぽいよな
>別にDXライブラリに限らないけど、DXライブラリを知った時も リファレンスをさらさらっと流して、「これなら俺にも使えるんじゃないかな?」と思って 使い始めたな。 別に覚えなくても、一度目を通しておけば、 後になって「こういう事がしたいけど、それっぽい命令あったよな……」って 探しやすくなるしな。
アレだけ分かりやすくて運営管理もアレだけちゃんとしてるなんて今まで見たことないよな。 DirectXでゲームを作るっていうジャンルに関して革命的だし、最早XNAなんかも超えてると言っても過言ではない。
ハンドルが全部intなのだけはどうかと
ほんとだよな。ちゃんと符号無しにしてくれないと。
730 :
名前は開発中のものです。 :2009/03/02(月) 21:38:18 ID:3lZqI4Au
731 :
名前は開発中のものです。 :2009/03/02(月) 21:42:53 ID:3lZqI4Au
typedefしなかったのは多分初心者への配慮だろうね
画像をプログラムで制御(回転など)して動いてみせるのと 一枚一枚画像を作ってパラパラ漫画みたいにアニメーションさせるのとどっちが負荷低いかな
パラパラ漫画方式の画像が一枚の画像にまとめてあるなら 原理的に変わらないはず
いや画像がまとめてあるかどうかはこの場合関係ないか まあ変わらん
その二つは比較すべきものじゃない気もするがw 回転ありの描画命令よりは回転なしの方が負荷は軽いだろうけど、 大した差じゃないみたいだし、好きにしていいんじゃないかな。
画面上の殆どのパーツが回ってるぜ!とか 512x512のパーツが回ってるぜ!とか 回転角度に応じて256パターンの画像を用意しました! みたいな変なことやってなきゃ大丈夫だろう
メモリに優しいのがプログラムで制御かな。後者はあまりオススメできない。 パラパラ漫画が全部VRAMに乗るとは限らないし、 1フレーム1枚のように別テクスチャ作るのであればさらに重くなる。 1枚でまとめる場合も、作成できるテクスチャサイズ制限があるハードウェアが過去にあり、 (Voodoo時代ではテクスチャサイズが256*256が最大であった) そのような場合、DXライブラリではテクスチャ分割が行われるので、 大きなテクスチャを作るとパフォーマンスが犠牲になります。 なので、回転・反転・拡大縮小などといった Direct3Dによるハードウェア支援で記述できる内容であるのなら、前者の方がパフォーマンスがよくなります。 ちなみに後者で実装するのであれば、テクスチャのサイズは正方形が望ましいですよ。
ただし、斜め向きとかにした場合、 最初から画像を用意しておいた方が綺麗に見えることは多々あるな。 プレイヤーキャラの画像など、 重要そうな部分だけパターンを用意しておくのも悪くない。
>>737 >正方形
一辺の長さが2の倍数の正方形ね
ん……? グラフィックハンドルがintって事は、持てるグラフィックハンドルの最大数は約32000って事?
いやintは2*(10^9)くらいまで その前にメモリがなくなるだろうけど
東方の弾幕とかって1つ1つの弾にハンドラ持たせてるの?
>>742 intってそんなに長かったっけ?
>>743 ちゃんと1つずつID割り振って読み込んでるみたい。
32bit機での 符号無しintは2^32 符号ありintは2^31(符号に1bit使用) プログラミングしてるなら知ってて当然だろ…
>>744 おまえさんのいってるのは short int
なるほど…… なんで勘違いしてたんだろう……
>>743 何を言ってるんだ?
東方はDXライブラリ使ってないぞ
こんにちは^^ 透過処理というのをしたんですけど 下記のコードだと正常に透過処理されます。 LoadGraphScreen( 0 , 0 , "back.bmp" , FALSE ) ; LoadGraphScreen( 0 , 0 , "char.png" , TRUE ) ; しかし LoadGraphScreen( 0 , 0 , "char.png" , TRUE ) ; LoadGraphScreen( 0 , 0 , "back.bmp" , FALSE ) ; とすると透過処理されません なぜでしょうか?
>747 旧VBのIntegerが16bitなのと混ざってない? >745 ハードは関係ない。コンパイラが決定する。 16bitアプリを32bitハードやOSで走らせても intが勝手に32bitになったりしない。 処理系にあわせて決定するのが自然なだけ。
>>749 はい? え?
back.bmp を透過処理なしで描いた上に、char.png を透過処理ありで描いたらそりゃちゃんと透過処理されるだろうけど
char.png を透過処理ありで描いた上に、back.bmp を透過処理なしで描いたらそりゃ上書きされるだけだと思うんだが……。
>>750 あー、昔に見た資料がかなり古いものだったから間違って覚えてたのかも
753 :
名前は開発中のものです。 :2009/03/06(金) 21:17:00 ID:pmzRauOh
ある画像だけの透過と、透過の度合いを設定することはできますか? リファレンス見る限り見当たらないのですが
その画像を描画する前にSetDrawBlendMode 透過の度合いはPal引数 クラス使って透過率とグラフィックハンドルをまとめて管理するようにするといい
755 :
名前は開発中のものです。 :2009/03/06(金) 21:46:01 ID:pmzRauOh
>>754 即レスありがとう^^
うまくできました!!
DXライブラリ3Dの開発引き継いでる奴いないの?
2Dゲームでも背景は3Dにしたい・・・ 本家DXライブラリにテクスチャ付モデルとフォグ表示機能だけあれば最高なんだが
シューティングの背景用にDXライブラリで自前の簡易モデルを描画する仕組みを組んだけど、 意外と簡単に組めたよ。 ポリゴン事に情報を配列に落として、座標を変換してVERTEX配列に入れてから描画。 フォグは出来なかったから単色背景+奥の頂点を透過で誤魔化してる。
クラスのコンストラクタでLoadGraphするとハンドルが取得できてないみたいだけど 仕様ですか? 他で初期化するから別に問題ないけど。
そのコンストラクタを呼ぶタイミングがまずいだけだろ でもLoadGraphみたいな失敗しやすいものをコンストラクタで使うのはあまり好ましくない
C++のコンストラクタはオブジェクトが出来上がる前の不安定な状態だからメソッド呼んだりはしない方がいいよ。
それ俺がよくやった失敗だけどLoadGraphするまえにDxLib_Initやってないんじゃまいか
>>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お願いします!!!!!!!!!!
>>764 今PC故障中で携帯から書き込んでるので、一週間後位になるけど……
龍神録プログラミングの館に似たような内容の講座があったので、
それを参考にした方が早いかも?
自分のソースと比べた所、アルゴリズムは大差なかったし
>>763 そうなの?
憂鬱本かなにかにコンストラクタで複雑な処理はやめたほうがいいって
書いてあったから信じてたよ。
使うほうが失敗したときに面倒でしょ、コンストラクタだと
例外処理を全面的に取り入れてるならコンストラクタで失敗してもおk 失敗したら絶対に例外を投げること そうでなければダメ
>>767 言語仕様的にはまったく問題ない
>768が言ってるように、
その本には別の理由でやめたほうがいいって言ってるんだと思うよ
ただし、staticなインスタンスは例外で
この場合、mainが呼ばれる前のスタートアップルーチンで
インスタンスが生成されるのでコンストラクタでは
初期化以外のことをやるとまずい
東方の新作が発表される度に自作のゲームとシステムが被っててヘコむ……
>771 それを気にしてたら、世の中作品なんて生まれない。 大丈夫、何ら問題ない。思う存分やれ。キミは盗作じゃない。 ……自分のやりたいことを、他の人が作ったのでそれで満足しちゃったなら知らんw (こっちもよくある話だけどな!)
弾幕シューは東方だけじゃないしね
774 :
761 :2009/03/08(日) 18:12:09 ID:pjH2xL1q
>>770 俺も
>>767 のように憂鬱本で読んで信じてきたんだけど、後学のために教えて欲しい。
まず憂鬱本にはこんな風に書いてある。
・コンストラクタやデストラクタはあまり難しい処理をするのは考え物。
1・返り値を持つことが出来ない。
2・インスタンスが完全な状態ではない。
3・外部変数としてクラスインスタンスがある場合、コンストラクタやデストラクタはmain()の走る前、後になる。
>>770 さんが言っているのは3の場合で、この本によると
「ポインタとして宣言しておきmain()が走った後でその中でnewする」
という解決策が書いてある。
で、問題の2にははっきりと
「コンストラクタ、デストラクタが走っているときは、インスタンスは完全な状態ではない」
と書いてあり、
「実は内部的にはそのインスタンスの使用するメモリの取得/解放とそれに伴う複雑な作業も行っている」
「インスタンス自体がまだ生成途中であり、内部的にはまだ不安定な状態」
と書いてあります。
問題点は、
「このような状態で他のクラスのインスタンスのメンバ関数を読んだりすると巡り巡ってまだ生成途中の自分自身のメンバ関数が呼ばれるかもしれないから」
との事です。
C#なんかではコンストラクタでのメソッドの呼び出しなども保障されてますが、C++では言語使用的には保障されていない、と解釈したのですがここらへんどうなんでしょうか?
この際、本家DXライブラリにDXライブラリ3Dを機能統合してしまっても良いんじゃないか? 今どき2Dだけじゃなぁ
>>775 いや、意味が分らん。
碌にDirectXすら使えない人間が3Dに手をだしてどうしたいんだ?
むしろ、本家は本家であの程度でまとまってるからこそ良いライブラリだろ。
もっと色々とやりたかったら海外の3Dライブラリをあさればいい。高機能の多いぞ。
(まぁ、普通に日本語対応がメンドイけど。)
っていうか、DXライブラリ3Dの開発を継続してほしいJEXさん
>>772 ,773
弾幕毎に名前付けてるから、気を付けないとまんまになっちゃうんだよね
もう開き直っちゃおうかな……
どうせやるなら「白い弾幕くん」くらい自由度上げてみたらどうだ
縦弾幕だったらどうやったって東方っぽいって言われるのがオチだから、 変なこと気にせず好きにやっちゃえYO!
東方のオマージュである、と明記しちゃえば変な因縁はつけられなくなると思う
自分で考えて実装した者に対して なんという屈辱を。
パクってないんなら堂々としてればいいじゃない ここで愚痴る前にちゃっちゃと完成させて もう東方に先を越されないようにすればいいじゃない
先を越されたから愚痴ってるんだと思うがのw
785 :
名前は開発中のものです。 :2009/03/09(月) 15:12:00 ID:anLE8kz6
新しいの出るごとに被るというと 低速移動時に敵を貫通するとかボム使うとパワーが減るとかその辺りか?
別に愚痴のつもりじゃありませんでした
こうやって悩むのもゲーム制作の楽しさの一つなので……
気分を害されたのならすいません
>>785 点レートアイテムとか、特殊アイテムを取るとボーナス敵が出る点が……
どんなシューティングでもお前。。。
Q.○○のパクリですか? A1.はい、参考にしました。 →盗作イクナイ! 俺の好きな○○を汚すな! ○○の公式サイトのBBSに通報(?)書き込み A2.いいえ、オリジナルです。似ているのは偶然でしょう。 →嘘を言うな、正直に言えよ A3.いいえ、○○ではなく△△のパクりです。 →そんなん知らねーよ! △△も○○のパクりだな! 実際にあるから困る。
結論:気にせず作れ 作ることにも価値がある
>>788 どっちかと言うと、この手の奴で、実際にパックたりしてなかったら、
何も答えないのがベスト。ただただ、事務的返しで流すべし。
あと、
>>786 みたいのは 東方以前からあるのばっかじゃねぇかよwww
それこそ、ファミコン全盛の時代(のアーケード)から・・・・
「今更それを先を越されたとかwww」
と言われるのが落ちじゃね?
んー、今更だけど自分で気にしすぎだった気がしてきた 前作が東方をリスペクトしたものだったので、今回も素直に断り書きを入れてみます
パロディにまで昇華させてしまうという手もあるな。
押しっぱをできなくするようにしたいけど char a[256] GetHitKeyStateAll(char *a) つかうとうまくできねぇ。。 ポインタをctrcmpやるのはおかしいの? それとも配列に入ってるのがおかしいの? 俺の頭がおかしいの?
>>774 遅レスだがコンストラクタについて幾つか書きます。
さすがに長文書いてコメントが無いのは可哀想だったから。
昔の言語仕様ではコンストラクタではインスタンスの生成途中であるから複雑な処理を書かないようにしていた。これは慣習・慣例の部類の話。
コンパイラの亜種が多くて、C++の仕様外の範疇での動作はどのようになっているのか分からない時代だったからという背景もある。
自分はコンストラクタに初期化処理を噛ませる横着な書き方をしていたときに先輩に指摘された事は、1,2,3以外にも、、、
・クラス設計者とクラス利用者は同じでない
⇒利用者がstaticで外部変数なインスタンスを生成するかもしれないから、
mainよりも先に呼ばれる処理に複雑な記述を置くべきでない。
つまり、利用者の立場になって明示的に初期化処理を宣言するべき。(手を抜くな)
・戻り値を持たない件に関して、例外処理を使うのは怠惰な手段である。
⇒try-catchを用いるのは、デバッグの最終手段である。(例外処理はネストできない為)
例外処理は一般的にコンパイラの最適化の阻害となり遅くなる要因となる。(ジャンプテーブルを生成する為)
つまり、保持値チェックにはassert使えというお話。
⇒メモリ確保に失敗する危険性をもっと認識するべき
特定のハードウェアを対象にする場合、大概は独自のメモリアロケーター(dlmalloc等)を実装していることが多く、
new失敗の可能性(インスタンス生成失敗)は大いにある。
とのことでした。
>問題点は、
>「このような状態で他のクラスのインスタンスのメンバ関数を読んだりすると巡り巡ってまだ生成途中の自分自身のメンバ関数が呼ばれるかもしれないから」
>との事です。
これには同意です。
だから「コンストラクタに記述するのはせいぜいメンバ変数に対して初期値の代入ぐらい」に留めている人が大半で自分もそうしています。
いや〜、バグの無いプログラムって難しいですね。
>>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
前フレームとの差分で押された瞬間と話された瞬間を検出するべさ
>>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.
}
な感じに書く。
推しっぱをできないようにするなんて int pushOK = 0; とか用意しといて if (a[チェックしたいキー] && pushOK) {押したときの処理} if (!a[チェックしたいキー]) pushOK = 1; とかやればいいじゃない (※厳密な文法に突っ込むのなしね、あと変数名が良くないことにもね)
あぁ。詳しくなくてすまん。ありがとう。 でも、なんとか、動作はしたぜ。
LoadSoftImage()でPNG-8のパレットが取得も設定もできん…。 パレットはBMPしか有効じゃないんか。 透過色設定とパレット変更を同時にしようと思うと、PNG-8がベストな選択だったんだけど、 さてどうするべか……。
どっかの時点でBMPに変換されるんだろうけど その時点じゃまだなんだろうかね。 てかそんな命令あったのか……。
PNGについてはlibpng使ってるっぽいからなぁ。 パレット変えられないのは困ったぜ。
libpngって最近脆弱性が発見されたよね
パレットアニメーション諦めて、アルファブレンディングで代用できるんかな……。 例えば、パレットアニメーションで 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)で近づくエフェクトを考えているんですが、 これと同じ機能をブレンドモードを変更することで代用可です? 上手い演算具合が見つからない。
あ、一個p++抜けてた。 でも、伝えたいことは伝わったはず。
フェードイン?
そうですね、指定色へのフェードイン・フェードアウトという感じです。 SetDrawBright()では黒フェードが出来ますが、それの多色化&抜き色対応版です。
2パターンだけ作って重ねてアルファを変えていくのが効率いいんじゃないかな
>>793 ゲームパッドがX-BOX専用コントローラーしか使えないとか論外すぎる。
使う側ならともかく、作って配布する側ならそれは解決にならんでしょ。 まあ自分で対応のパッド追加できると思うけどな。
>>809 やっぱり白黒2値のパターンが別途居るようですよね……。
PNG使ってるのに、わざわざマスク画像が必要なのがめんどくさいと敬遠しているんですよ。
あれGraphLockって関数がいつのまにか消えたのか、と思って検索したら出た
http://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 対応してないとかじゃなくて、単に古くて多用されない技術だからじゃないかと無責任に予想
使えたら部分的なぼかしとか波紋とか屈折描画とかできて表現の幅ひろがりまくりんぐなのに・・・
シェーダサポートフラグですね。わかります。
歪みはテクスチャに背景を描画→2Dポリゴンで挑戦中
>>814 からの流れに関連してるかわからないけど、
ちょっと前に気になった事があるので質問させてください
LoadGraph系統以外で作成したグラフィックハンドルから
グラフィックデータのメモリを参照し、編集する事ってできないんしょうか?
SoftImage系の関数で同じような事はできるみたいだけど、
これは画像ファイルから取得したもののみですよね。。
>>820 MakeXXXColorSoftImageじゃあかんの?
Easy3D正式版きてるな
>>820 ありがとう、今気付いたんだけど先に用途を書くべきでした。
例えば
>>816 の波紋を実現しようと考えた時、
「このエフェクトをかける前までに描画された画面から
エフェクトをかけたい矩形のグラフィックを取得して、
これを元にピクセルを書き換える」
という処理を考えてみたんですが、GetPixelは重いようなので、
なら直接メモリを参照できないかと思った次第です。
MakeXXXColorSoftImageで作成するのはソフトグラフィックハンドルなので、
ここを描画先にしたりはできませんよね。。?
>>823 訂正:ソフトグラフィックハンドル->ソフトイメージハンドル
あと「描画先」と書いたのは、「DrawGraph等で描画できる描画先」という意味です。
直接グラフィックハンドルをソフトイメージハンドルに変換できる方法があればよいのですが。
そもそもこの考え方自体がアホなんでしょうか。。。
>>824 画面全体にエフェクトを掛けたりするのに有ると便利だが、ちょっと調べてみたが出来ないっぽいね。
そもそもLoadGraphやMakeGraphはVRAMに転送した時点でPC環境に依った画像フォーマットに変換されちゃうから、
そこからソフトイメージハンドルを生成するとなると、コンバーター(デコーダ相当)が必要になる。
DXライブラリの作者としては手間が掛かるから、要望が無い限り実装を見送っていると予想している。
優しい作者さんなんで、要望送ってみてはどうかな?
現状で対応するとなると、どうしても遅くなるが、
画面サイズと同じ大きさにMakeGraphした裏画面領域をSetDrawScreenして、
一連の画像を転送し、GetPixcelとDrawPixcelするのがベストな選択かねぇ。
SaveDrawScreenを使ってbmp保存して、そこからSoftImageを作るという最終手段もある。(とても遅い)
>>823 ああ。書いてておもったが、SaveDrawScreenがあるから、デコーダ処理は既に内部には出来てるのか。
作者に要望だすと、すぐに実装してくれると思うよ。
解説 グラフィックデータのあるメモリ領域には『ロック』をしなくては アクセスする事が出来ません。 細かい事は抜きにしてとにかくWindows 環境ではメモリの管理が厳重なので malloc関数 などで確保したメモリ 領域のように簡単にはアクセスは出来ないようになっています。だから 『ロック』という作業を行い直接アクセスできるようにします。 グフィック領域に直接アクセスする利点はDrawPixel や GetPixel 関数を使用するよりも処理が速い、等があります。 ロックの説明をはじめる前に注意なのですが、ロックを行った場合は 直接アクセスが終り次第直ちにロックを解除してください。 ロックを している最中にデバッグモードなどのブレークポイントを使ってプロ グラムを止めるとハングアップするので注意してください。 ロックを すると 『GraphUnLock』関数を使用してロックを解除しない限り DrawLineをはじめすべての描画関数が使用不可能になるので注意してください。 では話を元に戻します。 ロックをするにはまずロックをしたいグラフィックハンドル、または DX_SCREEN_FRONT , DX_SCREEN_BACK 識別子を使って画面をロックする 事も出来ます。 ロックが完了すると関数は PitchBuf に指定したポインタにロック したグラフィック領域の1ライン辺りのバイト数と、DataPointBuf で 指定したポインタにロックしたグラフィックへのアドレスが代入されます。 こうしてロックしたグラフィック領域にはめでたく直接アクセスが 出来るようになります。まず希望の座標(点)にアクセスするには 以下の式を用います (グラフィック領域の先頭アドレス) + (X座標値 × (グラフィックのカラービット数 ÷ 8)) + (Y座標値 × 1ライン辺りのバイト数) = 希望の座標のポインタ
この中の『グラフィック領域の先頭アドレス』と言うのは 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 ) ;
サンプル 表画面をロックして直接アクセスで画面にグラデーションを描きます #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 ; // ソフトの終了 }
>>827 ありがとう。
GraphLock/Unlockなかなか便利だねぇ
ちょっと使ってみます
作者から非公開関数になった理由が知りたいとこだね
>>825-829 なるほど、そのためのGraphLock/UnLockだったのか。
あと非公開関数になっただけで使う事はできるんですね。
てっきり使用すらできなくなったものだとばかり思ってました。。。
とりあえずはこれで出来そうなので、デコード処理の要望の方は見送ろうかと思います。
お二方とも、ありがとうございました。
グラフィックハンドルの復元問題ってどうしています? フルスクリーン<->ウィンドウ切り替え時にだけ発生するならいざ知らず、 フルスクリーン時にフォーカスロストでも発生するから絶対に対策が必要ですよね。 ファイルから復元できるものは別にいいのですが、 困難なのが、MakeGraphやCreateGraphFromMemで作成した画像の自前復元です。 これらハンドルが初期作成状態から書き換えがされている場合、 (GetDrawScreenGraphを使った時や描画可能な仮画面としている場合)には、 画像を元の状態に戻すのってとても困難ですよね? SetRestoreGraphCallbackが呼ばれる時には既に失われている状態だし、 正直お手上げ状態です。 何か良い方法があったら教えてください。
readme.txt 「切り替えなどを行わないでください」
とはいってもユーザーの意図しないところでノートンなんかは自動で行っちゃうしね。 SPY++してみたら、WM_DISPLAYCHANGEもしくはWM_ACTIVATEAPPがDirect3Dオブジェクト解放前に呼び出されてるみたいだから、 このタイミングで保存処理を書いてみようと思う。上手くいくかどうか分からんけど。
俺は良い方法を思いつかなかったから、 グラフィック読み込む前に「これを読み込む」ってフラグを立てておき、 全てのグラフィックの中から、そのフラグが立ってるヤツだけを読み込むような処理を作っておき、 実際に読み込む時や、画面復帰した時にその処理を呼ぶようにしてる。 初期作成状態から書き換えをするような事はしてないけど、 するのならそれもフラグ管理する、くらいしか思いつかないな。
>>835 やっぱりなかなか良い方法が思いつかないですね。
簡単な命令(DrawLineやDrawBox)だけなら描画コマンドをバッファに記憶しておいて、
復号時に一気にコマンドを流せばいけるんですけどね。
どなたかDXライブラリ3Dをうpしていただけないでしょうか
開発終了しているのに何を期待しているんだ? 開発引き継ぐならあげるけど。。。
839 :
832 :2009/03/16(月) 04:54:34 ID:Ki5zFavX
>>838 引き継ぎって具体的に何すればいいのさ?
そんなに利用者いるようにも見えないが。
>>840 ライブラリを使う側じゃなくて作る側になってWebで公開するってこと。利用人数なんて関係ない。
現状、国内じゃまともに使える3Dライブラリが皆無だからね。
ただDXライブラリ3Dが使いたいだけならやめとけやめとけ。
変化の多い3D周りにおいて、開発終了したライブラリを今から使い始めるなんてのは得策じゃないよ。
素直にIrrlichtやORGEを使いなよ。
DXライブラリってDX_SCREEN_BACKとDX_SCREEN_FRONT以外にもバッファって作れないの? 画像ハンドルでもできるってことは知ってるんだけど、それだと遅くなりそうだしなんとかいい方法はないものか
それは何の目的でそんな事をしたいのかな?
画面のスクロールとかするときに、バッファ二つじゃ不便だからなぁ 俺も最近そのために物凄く無駄な苦労をした DrawGraphとかの引数に描画先のバッファID(またはグラフィックハンドル)を指定するとか、 または予め描画先を指定する関数を呼び出しておくとか、 そういう方法で複数のバッファを使えたら楽でいいと思う もしそれが俺の無知によるもので、本当は別に手段があるのならぜひ教えてほしい
いや多分無知なのは俺の方だと思うんだが、 なぜスクロールさせる事にバッファが二つじゃ足りないのか理解できない。
例えば、新しく作ったバッファにステージ全体の様子を描画する 表バッファには、プレイヤーを中心にした長方形を、 さっきのバッファから指定矩形部分描画を使ってコピーする 実際はもうちょっとスマートな方法だけど、簡単に言うとこういう方法
>>846 毎フレーム絶対同じ絵を表示するならそれでもいいけど
実際にはキャラ移動したりするしそれだと良くないんじゃない?
描画開始位置を変数で持っといて、
それを変化させながら表示すればスクロールできるんじゃ?
javaあたりでアクションゲームのスクロールの解説あったろ あれみたほうがいんでね もっと簡単にできるし
うん? 例えば暗闇の中で自分の周りだけ見えてる、みたいなイメージかな。 てか、裏画面にステージ全体を描画っていうけど 裏画面でも表示できる範囲以上の部分は意味なさないんじゃないのかな。 それとも画面はみ出した部分もちゃんと描画されてるの?
でっかいバッファにステージ全体を書いておいて、画面にはそこから一部を切り取ったものを映すってこと?
それって何の意味があるの?
スクロールがとても楽
何が楽なんだろう……? 全画面をバッファにおいておくっつーのなら結局メモリはそれだけ必要なんだから そのまんま画像として持っていてもあまり変わらないと思うし それを好きな位置に表示すればそれこそ楽だろうと思うし……。 それともあれか。 お絵かきツールみたいに、画面上でいろいろ書き換えたデータを そのまんまメモリに重ね落として、それをまた画面上に呼び出すとか するのだろうか。 でもステージって言ってるしなぁ……? 普通ならマップチップつかって必要なとこだけ表示するだけだから楽もクソもないと思うし……。
新しいバッファよりもむしろマルチスレッド使えるようにならんかな
詳しいこと全然知らないんだけど、 DXlibではマルチスレッドは使えないの?
>>855 リアルタイムで背景が拡縮したり回転したり端がループする場合は
一度メモリに書き込んでおいたほうが楽なんじゃないかな
画像自体は既にメモリへ読み込みさせてるだろうし、計算は軽いよ マップチップじゃなくてもSetDrawAreaで領域も最小限で済ませるし
ははは。ワールドマップのような広大なマップに対しても同様の手法をとるのか見ものだな
ちなみに、
>>842 SetDrawValidGraphCreateFlag使えば作れる。
注意点も有るが、それは自分で調べてくれ。
非常に亀レスだが、
>>757 >>758 俺が確認したところDXライブラリ ver2.25bには、
// フォグを有効にするかどうかを設定する( TRUE:有効 FALSE:無効 )
SetFogEnable( int Flag ) ;
// フォグモードを設定する
SetFogMode( int Mode /* DX_FOGMODE_NONE 等 */ ) ;
// フォグカラーを変更する
SetFogColor( int r, int g, int b, int a ) ;
// フォグが始まる距離と終了する距離を設定する( 0.0f 〜 1.0f )
SetFogStartEnd( float start, float end ) ;
// フォグの密度を設定する( 0.0f 〜 1.0f )
SetFogDensity( float density )
が有る。
DXライブラリで3DやってもカメラとかZバッファどうすんだとかいろいろ問題あるんじゃないのか
カメラ周りは平行透視固定みたいだね Zバッファ周りは一通りある 詳しくはDxLib.h見れ
>>862 まじかー!
よーしパパobjファイル読み込んじゃうぞー
そーいえば昔、>849みたいなことをやろうとしたものの 結局やり方が分からなくて諦めたことがあったなあ。 どうするのがスマートだったんだろう、と コーヒー片手にリファレンスを読みなおす。 今は雑巾を片手に。
w
そこで落とす必要があるのかw
ベランダで夕日を眺めながらブランデーでも飲んでたんじゃね?
マップチップの表示にメモリ・速度的にどちらも有利な磐石な方法ってのはないんだよね 毎回マップ画面を生成する必要があるのか無いのかによっても分かれるし、 生成後に加工する必要の有無によっても手法が変わってくる。
PCならメモリたくさんあるんだしマップチップすら作らなくてもいいような時代
当たり判定とかもピクセル単位でやんの?
できなくはないよね、10000*10000でも12.5Mbだし セルオートマトンの砂シム作ったときそれでやったよ、まあそんときは800*800だったけど ところでみんな2Dゲーム作るとき座標関係の変数ってint使ってるの? 自分は三角関数使ったりするから基本floatかdoubleなんだけど、今時のPCなら問題ないよね? プログラム板のスレとか見ると「浮動小数点なんて遅すぎて使えねー」なんて書き込みが2002年にあったりする ゲームつくり初めの頃は固定小数点とか聞きかじりでやったりしてたけどやっぱメンドいわ そろそろ2Dゲームならどんな風に作っても快適な時代になったよね
2002年の段階なら当然の反応じゃねーかな。 ノートPCのことも考えると。
>>873 とにかくメモリーを節約したい場合以外は、floatよりdoubleの方が一般だと思う。
(今時のCPUなら早いし、精度も高いし)
あと、どのくらいその計算をさせてるかにもよると思う。
正直、2Dゲームならよほど大量のデータを演算しまくらなきゃ、
大抵は表画関連の処理時間に肉薄する事もないだろうし。
(パーティクルを超豪華に大放出です!!さらにパーティクル同士が当り判定します!
みたいな時は分らんが、それ以外は問題無いと思う。)
現状、2Dゲームで浮動小数点がネックになることはほとんどない。というか無い。 そもそもDXライブラリは内部的にはサーフェスを3Dで扱ってるし、その上でいまさら固定小数点を使っても、 速度差はスズメの涙である。(ボトルネックになる部分はもっと他にある) 計算コストを見直すのであれば、当り判定を工夫したりする方がよっぽど建設的と考えるが。
昔は、float じゃなければ並列化が効かなかったんだよ。 doubleはどうあがいても高速化できないが、floatは腕次第でフルチューン可能だった。 そんな時代もあったのさ。
>>875 DXライブラリをデフォルトの状態で使うと doubeを使っても精度が float並になるよ。
つまり余計にメモリを食うだけってことに。
>>878 それ、なんかプログラミングが間違ってるか、何かを誤解して理解してると思うが。
引数がfloatでも、それまでに計算したdoubleの精度は精度で有効に使い続けられるわけだし。
ベクトルと行列演算はD3DX系命令に任せたいから俺はfloat派だ。 double精度が必要な時が出たらdouble使うと思うが今のところ無いな。
floatでずれが出ないなら殆ど好みでいいな
DXライブラリ3Dを配布してるサイトって無いのな 作者サイトも昨日までは普通にアクセスできたのに
>>882 3DがC言語初心者レベルで扱えるライブラリなんて設計上不可能だ。
DXライブラリ3Dが目指そうとしたのは砂上の楼閣だったのさ。
ORGEかIrrlicht使いなよ。
885 :
882 :2009/03/24(火) 20:15:11 ID:yDaxsp6N
ファイナルパックは持ってるよ ヘルプが完全ではないから手探りだけど
OpenGL用だが、3DはGLUTってのはどうだろう?
Siv3Dは本当に出るかわからないし 現状、DXライブラリ3Dが最強なんだが…
暇なんでDXライブラリ3Dみたいだけど2chネラー向きのDirectXライブラリつーのを 作ってみるわ。もちろんWindowsネイティブな。少しまちなー。
>>888 まずその名前はややこしいから変えて欲しい。
DirectX自体がライブラリだし、DXライブラリに名前が似てるし。
そして次、作ってみるって思ってから完成するまで膨大な時間が掛かるって事。
少し位じゃ完成しないからやるならもうちょっと長いスパンで考えた方が良いよ。
音ゲーみたいなの作りたいんだけど 音がズレてるような気がする。 int GetNowCount( void ) を使ってるんだけど 違うソフトとか触ったりしたら時間だけ経過されたりして描画されなくなる。
891 :
名前は開発中のものです。 :2009/03/25(水) 07:26:34 ID:kayJkkXd
これって.NETのユーザーコントロールって使えないの? 擬似ボタンとかならDXライブラリの関数で作れるが スクロールバーとか高度なものだとちと無理臭いので気になったのだが。
>>890 非アクティブ状態でもタイマーは進むから、その辺考慮して設計すべし。
>>890 int SetAlwaysRunFlag( int Flag ) ;
か
int LoadPauseGraph( char *FileName ) ;
の関数を使えば、やりたい事は解決すると思う。
>>891 できない事はない。と思うが・・・・
.NETとDirectXは基本別物(.NETからManaged DirectX は動かせるにしても)
結局深い知識が必要だから、まぁ、普通の人はやらん方が無難。
スクロールバーぐらいなら自前した方が何かといいかと思う。
でけた thx
>>891 ちょっと調べたが、簡単には無理っぽいな
試したことが無いが、
SetUseGDIFlag(TRUE)すればコモンダイアログ等のGDIの画面上乗せ出来るようだ。
メインウィンドウのHWND取得して、CreateWindowEx等のAPIで自作したウィンドウハンドルを子ウィンドウとして登録。
メッセージプロシージャ等はAddMessageTakeOverWindowすればコールバックで戻ってくる模様。
.NETではないが、コモンコントロールを扱うのなら、こういう方法しかないとおもう。
ちなみに俺はスクロールバー・ボタン等については必要になった時に自作している。
>>893 >>895 レスTHX。ListViewとかボタン(WINAPIと同じ挙動のやつ)を
作るとなるとかなり大変だからManaged DirectXの方でやることにするわ。
>>896 そもそも初心者が3Dに手を出すこと自体にかなり無理があると思うんだが。
Easy3Dは初心者に対しては本当に良く出来てる HSPで3Dってのが個人的にはありえなかった
そもそも初心者はゲームの作り方自体がわかんないと思うけどなあ
DXライブラリのおかげでなんとかゲームらしきものが作れてるレベルの俺としては 3Dものなんて夢のまた夢。
3Dもそこまでハードルが高いとは思わないんだけどさ、 2Dと違って素材集めやモデリングが難しいんだよね。そして興味ない。 さらに3Dで作るゲームにアイデアがない。 最後に、3Dゲーって2Dゲーと違ってしょぼさが如実にあらわれるんだよね。
ハードルなんてあるのか?軸が1個増えた程度にしか・・・。
あたり判定やらモーションが難しいし面倒 衝突した場合、3Dの場合は食い込んで表示されて不自然だし 回転とかしたときのモデルの先端の座標やらがイメージしにくい
>>903 は次世代コンシューマでメインPGで何作も作ってる程の凄腕のプログラマーに違いない。
カメラを意識しないようなゲームなら、ホントに軸が1個増えただけだと思うよ 計算が複雑になったり、グラフィックに掛ける手間が増えるから 初心者は2Dでゲーム製作に慣れてからの方がいいとは思うけど
PRG作るときのキャラ表示って2次元のグラフィックを三次元空間に配置したほうが楽? 二次元のキャラが2マスのサイズあるので、 NPCの前に立つのと、後ろに立つので被さり表示順序を変えなきゃならん。 3Dならこんなのないだろうになぁ
>>907 3Dでも基本的に同じだよ
奥行きの値で表示順をソートする必要がある
>>907 俺は描画オブジェクトにZ値を持たせ、描画順をstd::listで記憶して表示順序変えてるよ。
Z値が同じ値なら、Y値の設置底面(top+heihtした値)で比較し、ソートする。
たぶんこれが一番楽で一番確実。
毎フレームソートするのはバカらしいから、極力必要最低限の回数にするようにしてね。
>>909 thx.
std::listってc++か・・
そうそう。これを機にSTL覚えなよ。 STLも万能ではないが、知っておくに越したこと無いね。 ちなみに、こういう並び替えが頻繁に行われるものはvectorやmapでもなく、list使うのが良い
オブジェクト指向のc++のが、 何人いるかわからないNPCにとっては有効?
有効。C++じゃなくても書けるが、Cで書くよりははるかに柔軟に書ける。 スプライトを扱う基底クラスを継承してNPCクラス作ればいい。 厳密に言うと何人居るかわからないのはSTLのvectorが基本。(俺ならlist使うけどな) NPC挙動はデザインパターンでいうところのStateかとStrategy
3D版で、衝突したポリゴンから法線ベクトルの取得ってできる?
3Dのスレ立てて、そこで議論しれ
俺は907じゃないけど。 今まで作ってきた2Dゲーでは画面表示の優先度が4段階くらいしかなくて キャラの最大数も固定にして配列を利用して順番に表示していた。 次からはもうちっと一般的な組み方をするようにしようと、 listの使い方をいくつかのサイト巡って見てみたんだけど、どう使うんですか? これ。 要素を追加とか参照する方法はいいとして……。 例えばDXライブラリ使って表示するとしたら、最低限でも 「表示優先度」「グラフィックハンドル」「表示座標(X,Y)」 が必要なわけですが、このうち「表示優先度」をlistに追加していき、最終的にソート? でも「表示優先度」だけソートされてもしょうがない。「グラフィックハンドル」とかと繋がってないと。 とするとlistの項目に「グラフィックハンドル」その他も組み込める? それとも、表示優先度の段階ごとにlistを用意して、それぞれに追加していく? でもこれだと3Dゲーみたいに優先度がどこまで段階わけされるかわからない場合に使えないし……。
その3つをまとめた構造体をつくって優先度をキーにソートすればいいんじゃないの?
listをどう使うかなんてこのスレに関係ないだろ。
……と自治っぽいことを書いておくと、何故か反発して親切な馬鹿が教えてくれるよ。
>>916 クラスないしは構造体で「表示優先度」「グラフィックハンドル」「表示座標(X,Y)」などの情報をカプセル化して梱包する。
クラスには仮想関数でdraw()を持たせる。
この"クラスのポインタ"をstd::listとしてとあるImageListクラス(Singletonオブジェクト)が一律に保持し、優先度が変更されたタイミングでsortをして常に正しい描画順位になっているようにする。
そして、描画タイミング時(毎フレームに1回)に、drawを優先順位順になめるように実行すれば良い。
これで、簡易な描画システムの完成。システムと呼べるほどの出来ではないけどな。
俺の場合、さらにScreenクラス(独自の座標系とクリッピング領域を持つ)とノード型の親子関係で持たせることで柔軟に対応している。
高度な話してるところ悪いんだけど初歩的な質問をさせてくれ。 ここで聞けって言われたもんで。 メニュー画面とゲーム画面を往復する度にメモリ使用量が上がってくんだけど、 読み込んだものはゲーム画面終了直前にInitSoundMemとInitGraphで全て削除するようにしても 上昇量よりはるかに小さい分しか変わらないし、 じゃあ今度は画像の読み込みを全部削除してみたら(画面は真っ暗になるけど)きれいさっぱり解決したから やっぱ画像関係に原因があるのはわかったんだけど、 本題 DXライブラリって画像関係で、読み込んだの以外に変なのを生成したりしてるんですか? あとどうやらそのゲーム画面で初めて登場する画像が描写される度にもメモリ使用量がちょっと上がるみたい。 これも画面真っ暗にしたらきれいさっぱりいった。
>>879 代入なら精度は落ちないけど、計算すると精度は落ちるよ。
double同士の四則演算をすると DxLib_Init前と後で、精度が違うから
同じ計算をしても結果が異なることがある。
>>923 何度読んでも俺には何言ってるのか分からん。
精度が違うって何言ってる・・・。
>>924 わかりにくくてすまん。
例を書いてみた。
double a = 0;
int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
{
double v1 = 3.1415926535897931 + a;
ChangeWindowMode(TRUE);
if(DxLib_Init() < 0) return false;
double v2 = 3.1415926535897931 + a;
return 0;
}
v1と v2の値を比べてみてくれ。
>>925 あ、return falseはまずかった。
return 0の間違いってことで。
あ。わざわざ例挙げてもらってすまん。良いたい事は分かった。 DXライブラリでDirect3D使う場合だとFpuPreserveしてるからdouble型の演算レジスタ弄ってるわけね。 俺3D機能使わずにDirectDrawの方で書いてるから気づかなかったわ。
>>925 ,926
Direct3DのFPU関連の対処法についてDXライブラリのソース調べてみたら、
// FPUの精度を落とさない設定を使用するかどうかを設定する、DxLib_Init を呼び出す前のみ有効( TRUE:使用する(精度が落ちない) FALSE:使用しない(精度を落とす(デフォルト) )SetUseFPUPreserveFlag( int Flag );
を見つけたよ。
double型を使う場合はTRUEにしても良いかもね。(精度は上がるが速度が落ちるので好みに)
でも、俺はfloat派だから関係ないが〜。
929 :
名前は開発中のものです。 :2009/03/28(土) 15:03:24 ID:alJS1U5l
パンツってみんな脱いでるの?あとカップルいるけど警察に捕まったりしないの?
>>922 メモリ使用量の上昇具合ってどんな感じ?
コードを晒してくれると原因が分かりやすいんだがな。
画面遷移時に使われなくなったハンドルについて
・イメージハンドルはDeleteGraphで個別に全て解放をしているか?
・フォントの再生成をしていないか?
を見直してみてくれ。
特にフォントは文字サーフェスをキャッシュしているから、DeleteFontToHandleしないとメモリが解放されない。
その上で、フォントの再生成をしてしまうとメモリ使用量がじょじょに増大する結果になるよ。
>>930 ・メモリの上昇具合
メ=メニュー画面、ゲ=ゲーム画面
メ59M
ゲ108M
メ107M
ゲ112M
メ118M
ゲ124M
メ129M
・イメージハンドルはDeleteGraphで個別に全て解放をしているか?
さっき言ったとおり、Init〜で全部まとめて消去してる。
・フォントの再生成をしていないか?
よこわからないがフォント関係はいじらずデフォルト?の文字で単純に出力してるが、それでもアレ?
ていうかさっき言ったとおり画像を読み込むところだけ切り取ったら全部解決したので画像関係のアレだと思うんだが……
切り取らずに、画像を読み込み終えたところでInit〜してみたらどうなるかな。
>>931 >ていうかさっき言ったとおり画像を読み込むところだけ切り取ったら全部解決したので画像関係のアレだと思うんだが……
ちょっとこの文章の意味がわからんな。
画像を読み込むのを切り取っちゃったら画像が読み取れないんじゃないか?
それとも、状態変移での2度目に読み込みを飛ばすってこと?
でもその前にInitGraphしてるのなら、グラフィックハンドルは解放されて無効になってるはずだよ。(描画できないはず)
えっととりあえず言うと、画面遷移時にInitGraphで全部消しちゃうのはオススメできない。
使い終わったグラフィックハンドルについては面倒でも個別にDeleteGraphしてみるのが良い。(サウンドもDeleteSoundMemを使う)
俺の場合これで画面遷移時でもメモリ上昇は変わらないよ。
未だ問題あるようなら、同じグラフィックハンドルに画像を読み直す命令としてReloadGraphというのがあるので、これで上書き読み込みする手もある。
あと、DXライブラリでのメモリ使用量と数を確認する命令DxGetAllocSizeとDxGetAllocNumを使って、どのタイミングで発生するのかを確認するのも手。
フォントについてはCreateFontHandleしてないなら問題ないよ。
>じゃあ今度は画像の読み込みを全部削除してみたら(画面は真っ暗になるけど)きれいさっぱり解決したから >やっぱ画像関係に原因があるのはわかったんだけど、 って事でしょう。 >えっととりあえず言うと、画面遷移時にInitGraphで全部消しちゃうのはオススメできない。 これ、気になるので、よければその理由を教えて欲しい。
>>932 読み込んだ直後にInit〜やったけどダメだった。なので
>>933 Deleteでそれぞれやってみたけどやっぱダメだった……
あと、WaitTimerとかでところどころ止めながその隙にタスクマネージャで見る方法でもいいよね?
上昇のタイミングはもちろん画像読み込みの時で、問題なのはデリートの時に少ししか下がらないで、
あと各画像がそのゲーム画面で初めて表示されるときも微量ずつ謎の上昇……
ていうか普通はデリートすればあっさり上がるんだな……なんでデリートがちょっとしか効かないんだ。
>>944 リソースの管理はなるべくプログラマが厳密にした方が良いって理由。
InitGraphだとMakeScreenやMakeGraphやCreateGraphFromSoftImageで作った画像も全部丸ごと削除されてしまうから。
DeleteGraphなら無効なハンドル渡したときに戻り値で-1返すし、どのハンドルが解放されたのかを明示的に指示した方が分かりやすい。
自分はグラフィックハンドル周りはクラスでカプセル化してデストラクタで必ずDeleteGraphして解放するようにしてる。
>>935 >あと各画像がそのゲーム画面で初めて表示されるときも微量ずつ謎の上昇……
これは正常な動作だよ。最初の表示1回目はメモリ確保される。
うーん。どっかでDXライブラリ以外の箇所でnew(malloc)したメモリをdelete(free)せずにメモリリークしてないかい?
MSVC環境なら_CrtSetDbgFlag()があるからチェックしてみて。
>>936 そうか最初の1回は上がって普通なのか。
あとメモリの動的確保ならやってない。画像関係の問題ってわかっててるし。
CrtSetDbgFlagって言うのをググってみたけどデバッグ環境が必要みたいだね。
そりゃ無理な話だ……
あまりしたくないんだけど、ゲーム画面のコードを晒せば原因判明するかな?
Borland C++使ってるのなら_CRT関数は使えない。Microsoft Visual Studio専用関数だからね。 さすがに現状で、要因を探すのは難しいな。
それは……晒しても無駄って意味だよな。
いや、発言だけじゃ原因が特定できないってこと。 コード出してくれればもちろん見るよ。
>>941 DLしてみたよ。想像以上のソースだったw
えっと、原因はLoadSoftImageに対して、DeleteGraphを使ってるところ。
DeleteSoftImageを使いましょう。
ちょ、ちょっと待っててね……そのまんま範囲内全置換しても強制終了する。原因究明中。
凄まじいソースだなww
前にもこんなソースを見たことがあるぞ
ID:8c8Vy+u+ありがとう! 100kぐらいずつしか上がらなくなった! 感謝感激雨霰、3か月悩み抜いた甲斐があったってもんですぜ。
>>945 晒したのは初めてだぜ。
あと、ソース長くてもミスが見つかりにくくなるぐらいなもんだよな、問題は……
>>あと、ソース長くてもミスが見つかりにくくなるぐらいなもんだよな、問題は…… それが一番困ると思うぜ
分割オヌヌメ れっつextern
ああそうか。externが原因の1つかもしれないと思ってできるだけ避けてたんだ。 だけど大丈夫なのか。じゃあ関数使いまくれるぜ。
>>946 ういうい。どうもです。
コード晒すのは勇気いるけど、コードを隠すプログラマは例外なくダメプログラマに育つからね。
その点、コードを出したのはすばらしいと思うよ。3ヶ月悩んだものがコード出したら10分足らずで解決できたように早期解決できるし両得だ。
あと、デバッグ環境が無いみたいだけどVisual C++ 2008 Express Edition(無償)を使うと良いよ。
http://www.microsoft.com/japan/msdn/vstudio/Express/ デバッグが使えるのは大きいし、コンパイラの性能が良いから、Borland C++5.5よりも大体1.2倍ぐらいはプログラムが速くなるさ。
なんかSP1てついてるけどこれでいいんだな……やてみるぜ。ありがとう。
>>945 おそらくそれはしょぼんのアクションだ。
>>953 すごいなこれ。
リファクタリングの腕がつくから試してみようかと思ったが、
さすがにマジックナンバーが多すぎてちょっと無理っぽいわ。
//自由な値
int xx[91];
double xd[11];
string xs[31];
とか無茶すぎるだろw
BCCdeveloperでは大丈夫だったのに 全部の関数で「〜で既に宣言されています」 って出る……何のためのヘッダだよ……
あ、ID変わってる。どうも、ショボン二世です。
>>956 ヘッダの先頭に
#pragma once
と書く
#pragma onceだとVCでしか使えないから、 正確にはインクルードガードをするのが良いんだけどね。(__HOGE_H__は自分のヘッダファイル名) #ifndef __HOGE_H__ #define __HOGE_H__ (ヘッダ本文) #endif // __HOGE_H__ ま、どうせVCしか使わないんだろうからどっちでも良いよ。
3ヶ月解けなかったものを10分で解けちゃう人がいると聞いて飛んできたわけじゃないんですけど、 C++でメンバ関数ポインタって使ってもいいもんなんですかね。 goto思想のようなものでもお行儀のようなものでもいいんだけど、普通はどんなもんか教えてください。 ついさっきメンバ関数ポインタっぽいものがあったらスマートに書けるなーと思って検索したら発見しました。 もし具体例が必要なら提示しますので教えてください。
全く意味がわからない。・゚゚(ノД`) 今まで何を勘違いしたか知らないけどヘッダファイルに直接関数を書いてた。 BCCに帰りたくなったけど少しでも軽くするためにがんばります。 修行の旅に出ますありがとうございましたノシ
>>960 staticなメンバ関数について関数ポインタをとるのなら文法的には合ってるが作法的にはよろしくないとは思う。
(クラスは設計者と利用者が異なる観点ではオーバーライドされる可能性があるという意味で。)
けれど仕様上、静的なコールバックを要求する場合(Windowsメッセージプロシージャ等)だと、
staticなメンバ関数を指定した方が読みやすいと俺は思う。
この場合、staticメンバ変数から、Singletonオブジェクトを参照してインスタンスを得る方法を自分は多用しています。
自分で設計するのであれば、C++なら関数ポインタを使わずに、インターフェースクラスから派生する手法だったり、
純仮想関数をオーバーライドする設計(いわゆるStrategyパターン)を使うかな。
ただ、タスクのようなごった煮の振る舞いをしたいのであれば関数ポインタを使うこともしばしばあります。
×この場合、staticメンバ変数から、Singletonオブジェクトを参照してインスタンスを得る方法を自分は多用しています。 ○この場合、staticメンバ関数内で、Singletonオブジェクトを参照してインスタンスを得る方法を自分は多用しています。
>>962 staticではないメンバ関数ポインタでした。
個人製作だから、という言い訳の前提のもと、シングルトンデザパタとかも使わずアプリケーションの最初で1つ生成し、アプリケーションの最後で破棄されるっていうクラスの中なんですが、
staticなクラスにするのもいいのですが今回の話とは関係なさそうなので割愛します。
問題の箇所は、MyClassオブジェクトを生成したint main()から見て、あるMyClass.A()は特定の1度しか呼ばれず、あるMyClass.B()は1フレーム中で毎回呼ばれます。
そして、MyClass.B()はMyClass.C()やMyClass.D()やMyClass.E()のうちどれかを呼びます。
当然B()に呼ばれるC()やD()やE()も毎回呼ばれないと困るのですが、呼ぶ先のメソッドが変わっても困るのです。
そこで、例えばランダムにC()D()E()のどれか一つを呼ぶことを決定したいのですが、
フラグ等を使ってB()内で一度だけ決定するのもいいのですが、
A()で決定しメンバ関数ポインタに入れておき、後にB()で決定された先を読んでもらおうという感じです。
A()では同じような処理を複数するので一括しておきたいのと、C()D()E()のようなメソッドはさらに多くあるので
A()内でメンバ関数ポインタで管理した方がいいかなと思いました。
乱文ごめんなさい。
>>965 まさにそのサイトも見て実装しました。
そしてまさにその使い方の事を聞きたかったのです。分かりにくい説明でごめんなさい。
ただ参考になりました。ありがとうございました。
デザインパターンも勉強してみて試行錯誤してみたいと思います。
蛇足ですが、C++でゲーム作ると(staticな?)アプリケーションクラスを一つ作って、
int main()の中のメインループの中でアプリケーションクラスを呼び出すことから始まりますよね。
で、オブジェクト指向っぽく設計とか考えてやっても結局アプリケーションクラスの中でCの構造化プログラミングをしてるだけっぽくなっちゃってました。
今回もメンバ関数ポインタを呼ぶのも関数ポインタを使った構造化プログラミングっぽいです。。
他の人のソースを眺めてみると頻繁にインスタンスを生成したり破棄したりしてますが、
自分の書いたものはあまりせず、結局全部グローバル関数でも同じじゃん!みたいななっちゃいます。
一応継承とかも使ってみるも、ちょっとしたコードの再利用程度でしかなく、ポリモーフィズムなんて実現できないです。
まあ経験が足りないんでしょうね。。精進します。
>>967 わざわざありがとうございます。
ソース見させていただきました。
ほぼ同じように実装しました。
実際にはポインタに入る関数はA()が決めるのですが同じですね。
>>960 普通につかって全く問題ない。Cとは表記が違うのだけ注意。
他のクラスには適用できないし、キャストも許可されないので、むしろCより安全に使える
>>964 だとこんなかんじ
class Hoge {
public:
Hoge() : target(NULL) {}
typedef void (Hoge::*TargetType)(int param);
TargetType target;
void A() {
TargetType funcs[] = { &Hoge::C, &Hoge::D, &Hoge::E };
target = funcs[rand() % 3];
}
void B(int param) { (this->*target)(param);}
void C(int param) { printf("C called:%d", param);}
void D(int param) { printf("D called:%d", param);}
void E(int param) { printf("E called:%d", param);}
};
>>965 「メンバ関数ポインタ」について調べることをおすすめする
てか、965さんちゃんとわかってるんじゃん… 裏技でもなんでもないよってことで。
>>966 おっと、書き込む前にリロードすればよかった。
デザパタは相当C++やJavaが相当手馴れた頃に初めて見てみると、目から鱗な考え方なんだ。
素人が下手に手を出しても意味が分からないまま終わっちゃう。
大規模アプリを作れるレベルになって設計と実装に悩みだした頃に読むと良いよ。
ゲーム製作に特に使うのはSingleton,Strategy,TemplateMethod,Facade辺り。次にAbstractFadtoryやObserver。後のはほとんど使わない。
オブジェクト指向がする必要の無い局面って結構あるから、
何が何でもオブジェクト指向にこだわって実装していくのも逆に生産性が下がるというのは966も体感していると思う。
クラスは拡張性と多様性を残しつつ、YAGNIの原則で最低限だけを実装していく。というのが一番の理想。これが中々難しいけどね。
自分は、時にベタのCで書くこともあって、C++じゃご法度なextern宣言も使ったりする。(理由はめんどくさいという一点で)
インスタンスの生成/破棄はなるべく少ない方がパフォーマンスはモチロン出るので、966の書くプログラムは良いコードだと思うけどね。
ちょっと補足。 同じようなオブジェクトの微妙な動作違い、なら、設計的には インターフェースを継承してオーバライドしたほうがいい。 この手法は同一オブジェクト内でのステート処理にむいてる。 何度も呼ばれて判定のオーバーヘッドの影響が無視できないような場合には特に有効。
>>970 もちろん知ってるさ。C/C++は20年選手に逝きそうなんだ……。
裏技扱いしたのは、理由があって、
多重継承をした仮想関数(純ではない)のアドレスを取得しようとして、thisポインタのサイズ(4byte)が変わる為に上手くアドレスが取れないことが以前にあった。(オフセット値がなぜかずれるためにアラインメント調整が必要になる)
という理由でコンパイラによっては非推奨な書き方だったりするんだ。
これはコンパイラのバグで、TurboC++ではダメだった記憶がある。
MSVCではたぶん大丈夫だが、一応使わないでおこうとしてた。
ごめん。TurboC++だったか記憶にない。CodeWarriorだったかもしれん。 どちらにしても15年前ほど前の事だったからたぶん今では問題ないと思う。
>>969 ふむふむ、全く問題ないのですね!
提示してくれたソースもよくわかるのですが、た…typedef…。
勉強不足のためなんとなくでしかわからないですがなんとなく分かった感じです。
こんな感じでもいいですかね?
class Hoge {
public:
void (Hoge::*pf)(int param);
void A(int x) {
if(x == 0) pf = &Hoge::C;
if(x == 1) pf = &Hoge::D;
if(x == 2) pf = &Hoge::E;
}
void B(int param) { (this->*pf)(param);}
void C(int param) { printf("C called:%d", param);}
void D(int param) { printf("D called:%d", param);}
void E(int param) { printf("E called:%d", param);}
};
int main(){
Hoge obj;
int i;
scanf("%d", &i);
obj.A(i);
obj.B(10);
return 0;
}
大先輩!失礼いたしました… あー、コンパイラのバグ……。そういうのは一度ふむと使わなくなりがちですな(苦笑) 状態遷移系の処理の他だと、半自動のバインド処理の類を書くときとかに、 テンプレートと組み合わせてばりばり使ってたりします。
>>975 typedefは、宣言した複雑な型をシンプルに表記できて、
書き方覚えるととてもすっきりするので、時間あったら勉強してみてください
表記はそれで特に問題はないですが、その条件判定なら
switch つかったほうがいいと思いますです。
なんという頼もしいスレ… 起きててよかった。 勉強してきます=3
まーたDXライブラリと関係ない話して。 初心者相手に技術自慢したいならc++関係のスレに行けばいいのに。 そこでは相手にもされない程度なのか? DXライブラリ
それだけのベテランがDXライブラリを使ってる(のだろう)事が驚き。 俺はCについてはド素人同然なので、いろいろ教えてもらえるのは助かる。 確かにスレ違いではあるんだが、DXライブラリを使ってること前提で 話をしたい場合もあるし。
>>980 趣味でゲーム作ってるのが長い人には、Cの書き方でパパーッと書き上げる事もできるし、
(Windows95の頃から始めたような人なら短いものならOOじゃない方がある程度の大きさでも楽だったりするしね。)
3Dに手出す(主にデータ的な部分)のが面倒な人には、
余計なモンついてなくて2Dに特化してるのに、 変な癖が少ないから使いやすい。
あと、最初からゲームパッドとかに対応は何気に使えるし。
車輪の再開発をやってきた様な人には、
ソースもあるからちょっとだけ手を加えたい時とかも 其れが可能で、
わざわざRequestしないで良いのは、時間的にもモチベーション的にも良い選択肢。
初心者にも優しいライブラリだけど、其れだからといって
昔のHSPみたいに、他の言語知ったら使いたくなくなるような不自由さがあるわけでもない。
まぁ、DirectXバリバリつかうぜ!!って人とかには別だろうけど。
>>973 それバグでもなんでもねえし、
ポインタのサイズは変わらないだろ
普段はこのスレは過疎ってるから別にいいじゃないのか? DXライブラリでゲーム作るテクとしてメンバ関数ポインタを使うこともあるかもしれないしさ。
>>982 正確に書くと、継承した場合のメンバ関数ポインタのサイズが4バイトとは限らない(コンパイラ依存)
多重継承や仮想継承をしている場合、正しいポインタサイズを返すために8バイトや12バイトとなることがある。
しかし、昔のバグコンパイラではこの点が考慮されておらず必ず4バイト固定だった時代があり、派生や仮想関数を呼び出そうとするとアラインメントを調節する必要があった。
ということ。ポインタは必ず4バイトというのは早計だよ。
>>983 何故得意気なのか理解できんが、
それはサイズが変わるとは言わないだろ?
結局のところ、静的なサイズは確定している。
>>984 RTTIしていると大問題。
なんか、微妙にスレ違いだし、
偉そうにしているといわれたようなので黙って老害は去りますね。
失礼しやした。
どこが得意気なのやら で、次スレはどうするんよ
DXライブラリ総合スレッドその3、で建てればいいんじゃね。
>静的なサイズは確定している > RTTIしていると大問題。 会話になってねぇww
990 :
名前は開発中のものです。 :2009/03/30(月) 18:27:06 ID:II/eiBAq
質問です { { //1フレーム間での処理 A ; B ; C ; } ScreenFlip(); } すごく大まかに言って↑このようにゲーム作ってるのですが CheckHitKeyの判定ってって「フレームの最初のみ」に行われるんでしょうか? それとも「ifの処理があるごと」なんでしょうか? もし後者ならif CheckHitKey(SPACE)==1 みたいな処理をA部とB部両方に入れた場合、 Aが行われてる瞬間にSPACE離しちゃったら Aは行われてBは行われないっていうことも起きちゃうんでしょうか?
最初の大括弧はmainでその次はforとかのループの括弧か…?
int GetHitKeyStateAll( char *KeyStateBuf ) ; を使えば起きない
993 :
名前は開発中のものです。 :2009/03/30(月) 18:43:28 ID:II/eiBAq
>>990 適当な変数にそのフレームで一回押されたか押されてないかを記憶しておけばいいんでは?
main{
int space = 0;
while(うんたら){ //1フレーム間での処理
if (CheckHitKey(SPACE)==1)space=1;
A ;
B ;
C ;
space=0;
ScreenFlip();
}
}
>>990 「ifの処理があるごと」じゃなくて「ChecHitKey」が実行されるごとだけど、
ご想像の通り、1フレームに何回もチェックしてたら
Aでは行われてBでは行われないって事がおきるはずだね。
994さんが言われてるようにフレームの一箇所でだけチェックして記録しておくってのも手だけど、
やっぱり992さんの言われてるGetHitKeyStateAllが俺としてはお勧めかな。
これはこの命令だけで全てのキーの入力情報を記録するから、
フレームの最初に一回やっておけば、あとはそれを参照するだけでいい。
996 :
名前は開発中のものです。 :2009/03/30(月) 20:06:33 ID:II/eiBAq
ume
ume
ume
ume
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。