DXライブラリ 総合ス ..
[2ch|▼Menu]
101:名前は開発中のものです。
08/11/15 21:13:47 56rIt8Hu
垂直信号同期待ちについて、おおざっぱに説明してみようか。
俺も聞きかじりの知識だが。

最近はテレビにしろディスプレイにしろ、液晶が主流で「薄型」になってるが
もしブラウン管(分厚い)のテレビなりディスプレイがあるなら、画面の前で手を振ってみるといい。
残像がぶつ切りに、ストップモーションのように見えるはずだ。

これはどういう事かというと、画面が60分の1秒に一回、点滅してるからそう見えるんだ。
(厳密には60分の1秒に画面半分)
つまり、画面が光ってる時に「手の影が見えて」、画面が消えてる時には「見えない」から
手の動きがぶつ切りに見えるわけだ。

そうやって点滅してるのに、ずっと光ってるように見えるのは残像のせい。

もっとも「眼(瞳孔)」の方は反射で動いてるから、画面が光ってる時には瞳孔が小さくなり
画面が消えてる時は瞳孔が大きくなってたりするはず。
だから画面に近づいたり、暗い部屋で画面を見たりすると極端に眼が疲れる。

102:名前は開発中のものです。
08/11/15 21:24:13 56rIt8Hu
さて、画面が点滅してる、と言ったが、画面全体がぱっとついたり消えたりしてるわけじゃない。
ブラウン管ってのは、奥から電子ビームを画面に向けて照射して、その部分のみを光らせてるわけだから
実際に光ってるのは1点のみ。(もっとも一度照射されるとしばらくは持続するらしいが)
その電子ビームの照準が、画面の左上から始まって、右端まで動き、
一段さがってまた左端から始まって右まで動き、を繰り返し、画面の右下まで進む。
つまり
┏━━┓
┃□ぬ□┃
┃□る□┃ みたいな画面が表示されてると、それは実際は
┃□ぽ□┃
┗━━┛

┏━━┓
┃□ぬ□┃
┃■■■┃
┃■■■┃
┗━━┛
┏━━┓
┃■■■┃
┃□る□┃
┃■■■┃
┗━━┛
┏━━┓
┃■■■┃
┃■■■┃
┃□ぽ□┃
┗━━┛
という感じで高速に書き換えられてるという事。

103:名前は開発中のものです。
08/11/15 21:30:19 56rIt8Hu
ここでゲームの話になるわけだが、ゲームのキャラクターは画面上をあちこちに動く事になる。
もしこの「動く」のが前述した「画面を書き換えてるタイミング」だったらどうなる?
┏━━┓
┃ぬ□□┃
┃る□□┃ この状態から
┃ぽ□□┃
┗━━┛
┏━━┓
┃□□ぬ┃
┃□□る┃ この状態からにまで移動しようとすると
┃□□ぽ┃
┗━━┛
┏━━┓
┃ぬ□□┃
┃■■■┃
┃■■■┃
┗━━┛
┏━━┓
┃■■■┃
┃□る□┃
┃■■■┃
┗━━┛
┏━━┓
┃■■■┃
┃■■■┃という感じになり、
┃□□ぽ┃
┗━━┛
┏━━┓
┃ぬ□□┃
┃□る□┃ 人間の目にはこう映ってしまう。この現象をティアリングと呼ぶ。
┃□□ぽ┃
┗━━┛

104:名前は開発中のものです。
08/11/15 21:38:19 zVe3F0+t
>>100
「ScreenFlipを使う前と後の時間差を利用してる方法」ってのを普通に解釈したらリフレッシュレートに依存せずに一定になるよ。
ScreenFlipの待ち時間に関係なく、1フレーム(1ループ)の差時間から移動距離を割り出せばok。
ただし、ゲーム画面がアクティブでなくても実際に時間は経過してるので、ゲームに戻るとその分進む(進んだ)ことになる。
これを回避するなら、ゲーム内で独自にインクリメントカウントを設置し、そこから移動距離を割り出せばok。
ゲームプログラミング独特の考え方だね。

105:名前は開発中のものです。
08/11/15 21:40:57 zVe3F0+t
>>101
ブラウン管テレビは29.97fpsだよ。

106:名前は開発中のものです。
08/11/15 21:41:23 56rIt8Hu
このティアリング(ちらつき)をさせないためにはどうすればいいか?

これが「垂直同期信号待ち」であって、つまりは
ディスプレイが画面全体の書き換えが終わるまで、
次の描画処理をしないで待ってるってわけだ。

これがScreenFlipではデフォルトで行われてる。
だからScreenFlipを使うと速度が一定に保たれる……のだが、

「画面の点滅は60分の1秒」と言ったが前述したが、これが要するにリフレッシュレートの事。
つまりこの速度をPC側で自由に変更できたりする。

リフレッシュレート60の場合はScreenFlipは60分の1秒経つまで待つわけだが、
リフレッシュレート70の場合は70分の1秒しか待ってくれない。
その分ゲーム速度は速くなってしまうわけだ。
(もしプログラム処理自体が重くて、70分の1秒で終わらなかったら
 70分の2秒、つまり35分の1秒かかるわけで、逆に遅くなる)



107:名前は開発中のものです。
08/11/15 21:47:42 56rIt8Hu
移動距離を割り出すという方法は知ってるし理屈も解るけど、
当たり判定もそれ相応の処理にしなくてはいけないし、
そうなるとリプレイ記録&再生をどうやればいいのかわからなくなる。
そこらへんはどうやってるのかな。

ってこれはDXライブラリと関係ないか。

108:名前は開発中のものです。
08/11/15 21:57:26 zVe3F0+t
当たり判定もリプレイ記録も問題ないよ。
でもScreenFlipの待ち時間を基準にするなんて誰もしないと思うから
あたかもScreenFlipを使うとスピードがリフレッシュレート依存になるみたいな解説はやめたほうがいいと思うよ。

109:名前は開発中のものです。
08/11/15 22:29:29 PnDW3j7Q
画面を書き換えたときに時間を取得し、前回取得した時間と比較して、
1ループが17ミリ秒(60FPS)になるまでウェイトをかけてやればいい
これが一番簡単で確実

110:名前は開発中のものです。
08/11/15 22:34:05 RlpGwAN3
リフレッシュレートが60のときはScreenFlip依存でいいんじゃね
それ以外はタイマで

111:名前は開発中のものです。
08/11/15 23:12:07 56rIt8Hu
>でもScreenFlipの待ち時間を基準にするなんて誰もしないと思うから

いや、俺してたし、してるしw

112:名前は開発中のものです。
08/11/15 23:32:40 zVe3F0+t
>>111
その話をしてるのは君だけど、実際にそれを採用してる人はいないって事だよ。

もしかして君は採用もしてるの?
だとしたら自分が長々と説明したデメリットが解消できてないよね。
それを解消したくて質問したいならそれなりの場所でそれなりの質問方法を取ればいいと思うよ。
もしそうじゃないなら誰も採用しない方法を解説されてもややこしくなるだけだから…。

113:名前は開発中のものです。
08/11/15 23:41:52 56rIt8Hu
ティアリングが嫌だから切り替え方式にしてるます。
最初はゲーム起動時に測って自動切換えにしてたけど
それもやめて結局手動切り替えに……。

114:名前は開発中のものです。
08/11/15 23:43:35 56rIt8Hu
切り替えってのはリフレッシュレート依存方法と、タイマでウェイトかける方法の二つね。
移動距離算出方法はやった事ないです。

115:名前は開発中のものです。
08/11/16 00:40:12 H38ODQJJ
ティアリングとスピードは関係ないでしょう。
とりあえずDXライブラリを使うならScreenFlip()で垂直同期を待てば良いと思うよ。
スピードの話はまた別の話。

>>113
ゲーム起動時に何を測るの?
それと、切り替える必要性が見えないんだけど・・・?

116:名前は開発中のものです。
08/11/16 01:43:29 Hwka3oLK
>>115
>ゲーム起動時に何を測るの?

ScreenFlipを一秒間繰り返して、その回数で判断。
>>98で書いたけど、垂直同期信号待ちをしてるはずなのに
ScreenFlipで待ってくれない場合があるから、
FPS値が異常に高かったらそうだと判断して
タイマー値によるウェイトかけるようにしてた。

>それと、切り替える必要性が見えないんだけど・・・?

それはどっちを基準にして?

ScreenFlipを基本として考えるなら、リフレッシュレートが変更された場合や
上で書いた垂直同期信号待ちしてくれない環境の時に異状スピードになってしまう。

タイマ値でウェイトかける場合は、やっぱりティアリングが気になるし、
1フレームごとに点滅するエフェクトとかがきちんと点滅しなくなる。

117:名前は開発中のものです。
08/11/16 02:40:28 H38ODQJJ
>>116
えっと、だからね、ScreenFlipとティアリングは関係あるけど、
それらとウェイトは関係ないって事だよ。

ゲーム起動時にScreenFlipの待ち時間からリフレッシュレートを判断してるようだけど、
それも結局ScreenFlip基準でタイマー取る方式だよね。
てことは例えば60Hzを基準にウェイトをかけるって事だよね。
だとしたらはじめからリフレッシュレートのウェイトなんかに頼らずに、
マルチメディアタイマーででも1/60sを基準にコードを書けばいいでしょ?
だから起動時に測る必要もないし、リフレッシュレートの変更やVsyncを待たない場合は考慮しなくていいの。
繰り返すけど、タイマーでウェイトかけてもScreenFlipを使うならティアリングはないよ。

118:名前は開発中のものです。
08/11/16 03:40:07 Hwka3oLK
何か齟齬がある気がする。

タイマでウェイトかける場合は、ScreenFlipのVsync待ちはOFFにしてあるんだけど、
それでもティアリングは発生しない?

んじゃ発生してる俺のプログラムは何か間違ってるのか。

理屈上、1/60sを基準にウェイトかけるようにすれば
ゲームスピードは一定になるが、タイミング次第で
ティアリングが発生しない状態か、
あるいはティアリングが発生し続ける状態が
維持されるものだと思っていたのだが。



119:名前は開発中のものです。
08/11/16 04:22:31 H38ODQJJ
Vsync待ち、かつ、タイマーで制御するんだよ。
これを前提に最初から読み返してみて。

120:名前は開発中のものです。
08/11/16 14:59:43 Yf+kFgNP
ScreenFlipもやって、1/60secも待って、ってやらないと一定にならないし、ちらつきも解消されないよ。

121:名前は開発中のものです。
08/11/16 17:43:53 fHnaEgZY
タイマー待ちを使うんならVsync待ち無しのScreenFlipじゃないと
ティアリングは発生しないけど動きが凄いガクつくぞ
ADVみたいに動きの少ないゲームならそれでも良いと思うけど、
STGやACTでは見るに耐えない

122:名前は開発中のものです。
08/11/16 18:33:07 H38ODQJJ
60Hzに合わせれば60Hzの環境なら結局タイマーでウェイトしないから問題ないよ。
75Hzの環境なら60fpsに制限されるから多少はガクつくけどこれはトレードだね。
ちなみに3Dモノとか海外のゲームはfpsを出来るだけあげて垂直同期しないっていうのが主流みたい。

>>121みたいにfps制限はするわ垂直同期しないわっていうのは愚の骨頂。
ティアリングするわfps制限されてるわでひどいもんですわ。

123:名前は開発中のものです。
08/11/16 21:17:57 gVsDrcFZ
>>102-103
ガッ

124:名前は開発中のものです。
08/11/16 21:57:20 fHnaEgZY
>>122
なんでそんなに相手を見下したような態度なの?

>60Hzに合わせれば60Hzの環境なら結局タイマーでウェイトしないから問題ないよ。
それはわかってるよ
だから最初にリフレッシュレート測って垂直同期主体にするかタイマー同期にするか判断するんでしょ?
121はあくまでfpsとリフレッシュレートが一致していない場合の話

>75Hzの環境なら60fpsに制限されるから多少はガクつくけどこれはトレードだね。
ここで122の言うとおり垂直同期とるかとらないかはプレイヤーの好みの問題
オプションで選択できるようにすべきだと思う

>ちなみに3Dモノとか海外のゲームはfpsを出来るだけあげて垂直同期しないっていうのが主流みたい。
そうだね。3Dモノは可変fpsと相性良いよね。

>>121みたいにfps制限はするわ垂直同期しないわっていうのは愚の骨頂。
垂直同期をとらないことで手軽に入力に対するレイテンシを下げることができるし、
リプレイを取る目的でfpsを固定しなければならない場合もあるんだから、
短絡的に愚の骨頂というのはどうだろう

122的には60fps固定+垂直同期してない東方緋想天は愚の骨頂?
俺はそうは思わないけど・・・

125:名前は開発中のものです。
08/11/16 22:50:57 5RilDqvE
2Dシューティングを過去いくつか作ってきましたが、
リプレイ周りの実装も含めて、やっぱりFPSは60に固定でロジックを組みますよ。
オプションで「Vsync待ちをするかタイマーか」を選択させてます。
124さんもリプレイの話をしているから、そういう前提で言ってるのだと思うのですが。


126:名前は開発中のものです。
08/11/16 23:07:43 xtMr6+ch
リプレイって別にFPS固定必要ないような
入力があったキーとその時の経過フレーム数があればいいんだし

127:名前は開発中のものです。
08/11/16 23:30:59 0yDeWpwc
おまいら もちつけよ.

128:名前は開発中のものです。
08/11/17 01:36:47 GetktCW+
>>124
何そのゲーム。>東方なんたら
最悪だね〜。

>>126
だよねぇ。

129:名前は開発中のものです。
08/11/17 03:32:51 qWlXMT4E
なんだ釣りか

130:名前は開発中のものです。
08/11/17 18:51:51 TAngTg8T
なんだこんなすばらしいスレがあったのか>>1

131:名前は開発中のものです。
08/11/17 21:49:06 E1tboJG/
DXライブラリで作った横スクロールアクションのソースってどこかに転がってない?

132:名前は開発中のものです。
08/11/17 22:00:58 tSUha7RY
転がってるって・・・
作者の好意で公開してるソースをそんな言い方するなよ

133:名前は開発中のものです。
08/11/17 22:04:49 Zhr1hzWJ
ニコニコで一時話題になった、しかけが外道なスーパーマリオもどきはソース公開してたと思う

134:125
08/11/17 22:57:25 pxmPH9a8
>126
たしかにそうですね。
ただ、自分の場合は、FPSを固定すればあとはキー入力さえきちんと記録できていれば
リフレッシュレートが違えどもリプレイがずれることがないのでそうしていました。



135:名前は開発中のものです。
08/11/17 23:31:08 OriaVhLm
移動量固定方式か、経過時間による移動量計算方式かで
やり方も違ってくるんじゃないかな。

136:名前は開発中のものです。
08/11/18 13:05:35 FZcPiuDy
>>133
しょぼんのアクション だっけ?
やっと1−1クリアだと思ったのに愕然とした記憶がある。

137:名前は開発中のものです。
08/11/19 13:43:13 xnzA6xl6
DirectXのバージョンを9に移行するらしいね

138:名前は開発中のものです。
08/11/19 14:54:42 TpPgoKXn
>>133
あれはやばいです
あれはほんとうに・・やばい・・。
この道10年のベテランですらあれを見ると悶絶して悶え死ぬレベル。
あのソースを読んだあの日、私は自分の人生について考えさせられました。

139:名前は開発中のものです。
08/11/19 15:08:39 lxkh5WN5
そんなにすばらしいのか

140:名前は開発中のものです。
08/11/19 15:11:10 Lz0a0oQh
思わず3回DLし直す位のレベル

141:名前は開発中のものです。
08/11/19 18:41:54 TpPgoKXn
あれは伝説のソースですよ

142:名前は開発中のものです。
08/11/20 23:58:11 UIc9LZep
DLしてみたが・・・凄まじいソースだな

143:名前は開発中のものです。
08/11/21 00:08:16 AZA6fSH/
俺のソースも似たようなもんだなw

144:名前は開発中のものです。
08/11/21 00:14:35 IPu5qEL0
汚いコード書ける奴って尊敬するわ
むしろ逆に頭良いと思う

145:名前は開発中のものです。
08/11/21 00:46:35 PFCyKir9
部屋が汚くても気にしないやつがいるのと同じ

146:名前は開発中のものです。
08/11/21 05:06:26 0gMw7+uw
URLリンク(fatalita.sakura.ne.jp)
これもマジキチ

147:名前は開発中のものです。
08/11/21 05:58:28 VvYw+mZM
>>146
これはアイテム4つで実装力尽きるw
配列すら使ってないとかやべぇ

でもスレチ

148:名前は開発中のものです。
08/11/21 12:55:25 3m8CIP+t
BASIC覚えたての頃、そんな風にGOTO文メインでテキストアドベンチャーゲームを作ったなあ…。
それにしてもその作者はDXライブラリ3Dの作者なの?
なんか色々考えさせられるな…。

149:名前は開発中のものです。
08/11/21 15:36:28 ELcxKG7H
でもスレチ

150:名前は開発中のものです。
08/11/21 19:40:33 yD9XL+v+
自分のスパゲティソースを晒す勇者はおらんのか・・

151:名前は開発中のものです。
08/11/21 21:42:08 FU8hvFU5
さらしてどうすんのよw

152:名前は開発中のものです。
08/11/22 22:21:51 j0m39ynA
タイピングゲーム作ってるけど疲れてきたぜ。
ゲーム一本完成させるって難しいな。

153:名前は開発中のものです。
08/11/23 02:26:12 YAgqgFQm
完全体になる前にリリースすればいいじゃない(マリー

154:名前は開発中のものです。
08/11/23 02:27:42 Ef5lma7p
プログラム歴3ヶ月おれもタイピングゲーム作ってます
プログラム練習としても面白いジャンルのような気がします
がんばりましょう

155:名前は開発中のものです。
08/11/23 14:21:16 bJorsnCE
>>153
俺知ってるよ
そういうのをあじゃいるって言うんだよね

156:名前は開発中のものです。
08/11/23 17:55:00 pnQpCtQf
画面全体をぼかしたいのですが、どうすればいいのでしょうか?

SaveDrawScreen()で画面全体を保存した後に、
その画像を加工して表示するという方法を試しましたが、遅くてとても使えませんでした。
ちなみに手順は
保存→加工→保存→表示です。
加工と二回目の保存の処理の間がとても遅かったです。

直接DXライブラリで描画してる画像をぼかせばもっと早くなると思うのですが、
DXライブラリで直接ぼかす方法がさっぱりわからりません。
どういう方法でぼかせれるのでしょうか?

157:名前は開発中のものです。
08/11/23 20:09:39 YAgqgFQm
ブレンドモードを上手く使えばどうにかなるんじゃなかろうか。
昔、モーションブラーもどきを自分で作ったが細かいやり方は忘れた。

158:名前は開発中のものです。
08/11/25 00:31:59 xYyBQpV1
>156
そのまま画像を描画

αブレンドを適当に128くらいに指定してxy数ドットずらして描画×数回…

こんなのでどう?

159:157
08/11/25 20:03:29 5UMAw8SP
>>158
ああ、そうそう。
そんな感じでできると思う。たぶん。
ずらし量やブレンド率でぼけ足上手いこと調整してどうにかする。
関数化できたら楽そうだ。

160:名前は開発中のものです。
08/11/25 22:23:11 VmASE6nW
>>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になります。
軽くする良い方法は何かないでしょうか?



161:名前は開発中のものです。
08/11/25 22:39:54 MBrRa9Zc
640 / dot ←この計算をfor文の前にやって適当な変数に代入しておく

162:名前は開発中のものです。
08/11/25 23:02:53 EDWbdjkC
>>160
i < 640/dot

i < 160/dot
くらいにまで下げてみる


ぼかすのがゲーム上そんなに大事じゃなかったら
このくらいで妥協するのが一番

163:157
08/11/26 02:18:18 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);
}

164:名前は開発中のものです。
08/11/26 04:53:23 mqCcsZAV
>>160
本当に速度が必要で、それなりのクオリティーが欲しいなら
LoadSoftImage関数とLoadSoftImageToMem関数を使うといいかもしれない。

自分は近頃、DXライブラリまったく触ってなかったから、どんなもんか
わからんが、説明を読む限りではこっちの関数で処理して
GraphHandleをつけて、表画させる方が高速みたいだし・・・・・

165:名前は開発中のものです。
08/11/27 05:33:03 9lHdy+ss
DXライブラリとは直接関係ないのですが、

DXライブラリとかの関数を変な使い方すると、めっちゃ重くなったりして(コンパイルエラーが出るわけではない)、
上手く扱わないとたとえ数百行のプログラムでさえ上手く動かないのに
市販されてる3Dゲームとかだとそれこそ想像もつかない量のプログラム書いてると思うんですが
それを全く重くならないように作るというのはまさに神の所業としか思えないんですが・・・
やはり職人的なひとはそれほどすごいってことでしょうか?
それとも単にまだ自分が未熟なだけでしょうか?

なんか抽象的な質問ですみません。

166:名前は開発中のものです。
08/11/27 07:22:55 UFJsiMGy
>>165
普通に使っている分には問題ないと思うけど…
コード量も関係ないし。
メインのループ(秒間30〜60回くらい回しているとこ)の外で1回やれば済む処理を
ループの中で毎回やってたりしてない?
例えばグラフィックハンドルへの画像の読み込みを毎回やっているとか。

167:名前は開発中のものです。
08/11/27 12:05:54 tLRoJzh6
DXライブラリもよっぽど変な使い方しない限りめっちゃ重くはならんでしょ。
そりゃまぁPCの性能にもよるけど。

市販されてる3Dゲームとかは、俺はヘボプログラマだからそれこそ神の領域にしか思えないけど
同じ市販ゲームでも、すごいグラフィックなのに軽快なのとか、やったらもっさりして重いのとかあるから
そこらへんはプログラマの腕次第でしょ。

凄腕のプログラマは極限まで無駄な処理を省いてるんだと思う。

168:名前は開発中のものです。
08/11/27 17:02:45 HwZNU9zJ
メモリの1バイトは血の一滴ですね

169:名前は開発中のものです。
08/11/27 18:56:41 9lHdy+ss
>>166-167
なるほどサンクス・・・
確かに無駄に繰り返してるかもしれない・・・。

170:名前は開発中のものです。
08/11/27 20:46:39 GnzSYpCC
フォントのサイズ変更とかと勝手に予想

171:名前は開発中のものです。
08/11/27 22:41:46 LOD/UyCK
>>161-164
ありがとうございます。
回数がご指摘の通り多すぎました。
>>157のコードと併用して、思っていたぼかしができました。
コードは私の作成したコードと>>157のコードを関数化しただけなので省略させていただきます。

172:名前は開発中のものです。
08/11/27 22:48:28 tLRoJzh6
フォントのサイズ変更はしゃれにならんほど遅いからな……。
別フォント用意すりゃいいことだが。

173:名前は開発中のものです。
08/11/28 05:15:28 10isJ4oY
SetWaitVSyncFlag(FALSE);

にしたらドラゴンボールの世界になってワロタ


174:名前は開発中のものです。
08/11/29 16:25:44 BtMciNRd
PlayMusic関数で再生位置の指定ってできないの?

175:名前は開発中のものです。
08/11/29 22:48:46 kaHILOZB
>>101

いますぐ昔の再放送の刑事ドラマやドラマの
事務所シーンを見るんだ!!!


パソコンのディスプレイあるだろアレみるとわかりやすい

176:名前は開発中のものです。
08/11/30 02:55:10 Kx1+nHAm
>>175
あれ今見るとなんでそう見えるか理解出来るな
タイヤが逆回転して見えるのとかも

177:名前は開発中のものです。
08/12/01 09:18:57 PQmt2oZj
3Dでゼルダみたいなゲーム作りたいんだけど
DXライブラリ(3D)で完璧に作ったのと
DirectXで完璧に作ったのだったら動きのサクサクさにどれくらい差が出るのかな?
PCの性能は結構良いのでそれは関係なく
個人的にはマリオ64くらいのクオリティーは出したいと思ってるんだけど
始めての大型ゲームなんで全く想像付かない

178:名前は開発中のものです。
08/12/01 09:51:01 Mqk5OkvC
3Dのゼルダってまんま64とGCのゼルダじゃね?

179:名前は開発中のものです。
08/12/01 10:23:13 PQmt2oZj
はい

180:名前は開発中のものです。
08/12/01 16:53:55 B+fc1nCX
DirectXで作るって言ったってどうせ自分でラッピングするんだから一緒だと思うぞ

181:名前は開発中のものです。
08/12/01 16:57:45 Mqk5OkvC
>>177
そのプロセッサ専用のライブラリを熟知してれば
サクサク動くゲームになる

例えばPS2ならEEとかのベクトル計算のためのライブラリの仕様とか
windowsマシンにはそんな計算機能はデフォルトじゃついてないから
どうしてもグラボ依存になる

182:名前は開発中のものです。
08/12/02 00:02:20 zbFv8Mtr
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を超えてしまったら、重くなるという別の影響は出てくる。』
というものだと解釈していいのでしょうか?

(すみません。アク禁中の代レスなので、返事できないかもしれません。)

183:名前は開発中のものです。
08/12/02 08:48:55 jLo5RDUc
どうでもいいがProcessMessage()の場所が俺の好みじゃなかった。
本文は読んでいない。

184:名前は開発中のものです。
08/12/02 08:53:50 l3NK/S0H
SetWaitVSyncFlagがFALSEで無い限りは

185:名前は開発中のものです。
08/12/02 09:50:01 ptyOGcVX
リフレッシュレートに依存する。

186:名前は開発中のものです。
08/12/02 21:13:42 xSROB0kK
x^nの計算なんか描画処理に比べたらほんの一瞬

187:名前は開発中のものです。
08/12/02 22:13:19 g62jpxUX
そういやCを独学でやってて最初に詰まったのがべき乗計算だったなw

188:名前は開発中のものです。
08/12/03 05:14:23 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);
}

189:名前は開発中のものです。
08/12/03 05:38:32 ecRDRm37
同一内容の文字列を毎フレーム表示する処理があり、

空のサーフェスを作成 → 一旦バックバッファに文字列を描画 → バックバッファから空のサーフェスに文字列の画像を取得

こうして予め文字列を描画しておいたサーフェスから
毎回メイン処理でDrawGraphしているのですが、どうもスッキリしません。
しかもGetDrawScreenGraphの説明にもある通り透過色が使用出来ません。
DXライブラリでは作成したサーフェスに直接描画出来ないのでしょうか?
やりたい事は「同じ文字列を毎フレーム描画する処理を軽くしたい」だけなのですが、
文字グラフィックファイルを用意することは出来れば避けたいので、良い方法があったら教えて下さい1


190:189
08/12/03 05:45:19 ecRDRm37
無駄に長くて分かり難くなってしまいました。
(例えば説明文等の)同一の文字列を毎フレーム描画する処理を軽くしたいが
文字グラフィックファイルを用意する以外で良い方法があったら誰か教えて下さいです。

191:名前は開発中のものです。
08/12/03 09:09:23 Zrkeui/r
DrawStringで十分軽いと思う
フォントハンドルを毎回読み込んだりしていない?

192:189
08/12/03 17:18:45 ecRDRm37
>>191
お返事遅くなって申し訳ありません。
当方の環境ではDrawStringでやった場合のFPSが30くらいでDrawGraphにすると60になりました。
DirectX自体、文字描画にGDIを使っているのでビデオカードで処理できるBitBltの方が高速だと思っていました。数年前の知識ですが。。
低スペックでも快適に動くように作りたいので、DrawStringは極力使いたくないです。

193:189
08/12/03 17:29:14 ecRDRm37
フォントの変更は行っていないので、フォントハンドルは使用していないです。

194:名前は開発中のものです。
08/12/03 18:07:17 o+fnXJLe
そんなにたくさんの文字を同時に表示してるのかな?
それともPC環境が悪すぎる?

俺普通にDrawString使ってるけど別に遅くなった事ないよ?
普通に60FPS出てる。古いノートパソコンで。
最高でまぁ10行程度の表示しかしてないけど。

195:名前は開発中のものです。
08/12/03 18:30:58 JlppSG1I
いやそれじゃ全くテストになってないから。
192の知識通り、今も文字列表示は遅いよ。
189の方法が適切だと思うし、他に方法を提示できないのは申し訳ないけど、
少なくとも文字列表示が遅いって前提でレスされると無駄だと思ったので口を出してみた。

196:名前は開発中のものです。
08/12/03 18:37:18 JlppSG1I
×少なくとも文字列表示が遅いって前提でレスされると無駄だと
○少なくとも文字列表示が遅いって前提を否定するレスは無駄だと

197:名前は開発中のものです。
08/12/03 19:17:52 o+fnXJLe
俺の事?
別にテストしたわけじゃなくて、普通に使ってるだけなんだが。

文字列表示が遅いってのが前提なら、そもそもグラフィック表示だって遅いだろ。

グラフィック表示が遅いから他の方法はありますか? って質問があったとしたら
まず現在どういう環境でどれだけのグラフィックをどういう方法で表示させてるのか教えろってのは普通の流れだろ?

そこをかっとばしてグラフィック表示処理そのものを早くする方法を考えるのは無駄な話だ。

198:名前は開発中のものです。
08/12/03 19:27:15 zxrZF3eH
確かに
今与えられた情報だけではなんともいえんな

199:名前は開発中のものです。
08/12/03 19:41:02 RJPTfL79
文字列の長さ、量がまずわからない。

「フォントの変更は行っていない」というのが、フォントの大きさやアンチエイリアス有無の変更は行っているかもしれないとも読める。

200:名前は開発中のものです。
08/12/04 00:31:01 jlPFeEOB
>>197
文字列表示はグラフィック表示より遅いって常識知らないの?
そこは議論の余地なしだから言ったまで。
それと、テストじゃないなら>>194の報告は不適切。
まあ上記の前提を知らなかった故だからしかたないと言えばしかたないが、ややこしくなるのでなかったほうがよかったな。

情報は少ないが、前提を知っているば容易に共感できるし、解決方法を知っている人ならこの情報量でも回答できるかもしれない。

201:名前は開発中のものです。
08/12/04 00:33:46 GF73/yq8
>>197
>文字列表示が遅いってのが前提なら、そもそもグラフィック表示だって遅いだろ。

(;^ω^)

202:名前は開発中のものです。
08/12/04 02:05:10 z7drhJqc
何人か偉そうにレスしてるけど、誰もライブラリのソース見てないのか?

DXライブラリは文字を描画する前にテクスチャにキャッシュしてるから
同じ文字なら2回目以降はほぼDrawGraphと同じコストで処理は完了する
キャッシュ用のテクスチャは512x512だから画面一杯に異なった文字を
描画するくらいしない限りは文字列描画特有の遅さは発生しないぞ

まあ、毎フレームキャッシュに無い文字を描画したら一般に言うところの
「文字列表示が遅い」ってのに当てはまるけど

203:名前は開発中のものです。
08/12/04 09:46:46 ggjOtlxc
良スレage
みなぎってきた、学校でゲーム作ってくる

204:名前は開発中のものです。
08/12/04 10:33:56 763fKCgi
>>200

何を言ってるんだ君は。
60FPSで動いてるゲームに、一回のDrawString処理を追加しただけで30FPSにまで落ちたりするか?
普通はしないだろ?

じゃあどういう処理にしてるんだ? っつーレベルの話だぞ?

192が出してる情報はその程度って事。

205:名前は開発中のものです。
08/12/04 12:47:01 GF73/yq8
>>204
>>202

分からない(・∀・)カエレ!!

206:名前は開発中のものです。
08/12/05 18:06:46 YY5q+8z/
ソフトウェア描画モードと言う物があるらしいのですが、
どれのことなのでしょうか?
一部のPCだと動かなかったりする時にこれを使えばいいらしいのですが……。
リファレンスを見た限りそれっぽいのがありませんでした。

207:名前は開発中のものです。
08/12/05 18:19:39 MN0oAg79
この辺をどうぞ。
URLリンク(www.dkut.flnet.org)

208:名前は開発中のものです。
08/12/05 20:49:20 YY5q+8z/
>>207
ありがとうございます。
SetScreenMemToVramFlag( FALSE );
と、
SetUse3DFlag( FALSE );
を使ったらよさそうなのでこの二つを使ってみようと思います。

209:名前は開発中のものです。
08/12/06 03:56:27 5bnbt+Lt
>>204
垂直同期を使って処理していれば僅かな処理の遅さでFPSは半分になることがある
そしてGDIは遅い

>>189はDrawStringを使用せずに同等の文字描画処理をする方法を模索しているであって
デバッグをしてくれと言っているわけじゃないんだから君がムキになるのは頓珍漢な話
俺を含め解決策が分からない初心者が回答することが間違い

210:名前は開発中のものです。
08/12/06 04:17:22 MshHJhkd
俺もよくわからないけど、>>189

>DXライブラリでは作成したサーフェスに直接描画出来ないのでしょうか?

と明確に聞いてるぞ。
それを初心者が関係ない知ったか話をしてるとしか見えない。
「俺は平気だよ?」とか言う話もいらないと思うww

>>202もヒントになると思うけど多分新しい文字列を頻繁に表示しようとしてるんじゃないかな。
毎フレーム更新される数値を表示するって事も多いと思うし。

211:名前は開発中のものです。
08/12/06 06:11:31 VA5mVjgv
ファイナルファンタジーの裏ワザででてくる
数字ゲームとかあれ作ると面白そう

212:名前は開発中のものです。
08/12/06 09:55:12 DCsCuBVu
ブラックジャックといいたまへ

213:名前は開発中のものです。
08/12/06 11:21:34 gOAp6PdO
>>189は「同じ文字列」って書いてるじゃないか。
まあ任意のオフスクリーンバッファに描いてそれを転送したい、というのはわかるが
できる機能を追加するかDXライブラリをやめるしかないのでは。

214:名前は開発中のものです。
08/12/06 16:48:54 KujsLoK9
クリックイベントを使いたいのですがどうすればよいのでしょうか?
公式などにクリックイベントのコードがなかったのでここで質問させてください

215:名前は開発中のものです。
08/12/06 17:16:43 t9JSHoeE
SetWaitVSyncFlagをFalseにしておいて、16666マイクロミリセカンド待機し描画

↑で描画すると30フレームあたりまで落ちるんですが、SetWaitVSyncFlagをFalseにしてても同期するってあるんでしょうか?

待機を16200にすると60フレームになるので、同期でひっかかってるんだと思うのですが……

216:名前は開発中のものです。
08/12/06 17:19:10 KujsLoK9
自己解決しました

217:名前は開発中のものです。
08/12/06 20:30:15 JBa6ugiY
なんだったのよw

218:215
08/12/07 18:55:49 OyZdJ9xq
すいません、こちらも自己解決しました……

219:名前は開発中のものです。
08/12/08 00:25:32 2qR4Oo16
Cの入門書見てる段階なんですが、DXライブラリでのゲーム製作講座を見てみたら、
C言語というより、DXライブラリ言語でのプログラミングという印象を受けました。
DXライブラリを使ってプログラミングする場合は、
Cのほうは入門書を一通り読んだだけの知識でよくて、
あとはDXライブラリの使い方をきちんとやるほうがいいんですよね?

220:名前は開発中のものです。
08/12/08 00:31:03 A0APKyuo
Cも一通りの知識は要るだろうから
平行して勉強しなはれ。

221:名前は開発中のものです。
08/12/08 00:55:25 FYgRMyd9
いやいや
もろCで作ってるよ
printfが絵を表示する関数になるだけ

222:名前は開発中のものです。
08/12/08 03:17:20 tsVxmfWH
>>219
「C言語 = printfやscanf、fopen等の標準関数」だと思ってるんならそれは間違いだ

223:名前は開発中のものです。
08/12/08 03:37:47 ghLgcWkz
>>219
それでいいと思うよー。
Cの文法なんて覚える事少ないし、入門書片手に取り掛かっちゃえば大丈夫。
今後も、プログラミングで何かを作る時、基本的にDXライブラリのような、外部のライブラリの使い方を覚えるって作業が大半になるよ。
入門書に書いてあるstdio.hのprintfみたいな標準関数を覚えるみたいに。

224:名前は開発中のものです。
08/12/08 11:27:49 tq0zLS+0
>>210

>>>202もヒントになると思うけど多分新しい文字列を頻繁に表示しようとしてるんじゃないかな。
>毎フレーム更新される数値を表示するって事も多いと思うし。

それこそ仕様を見直せとしか言いようがないようなw
毎フレーム更新する数値や文章ならプレイヤーに全文しっかり読ませるためものじゃないだろうし。

225:名前は開発中のものです。
08/12/08 18:07:49 ofH1nP7I
ノベルとかアドベンチャーのサンプルがあるサイト教えてください

226:名前は開発中のものです。
08/12/08 18:55:26 dZklSLE8
公式にあったような気がするが……。

227:名前は開発中のものです。
08/12/08 20:50:58 vtoynrkC
Dxライブラリを使って
60フレーム固定のシューティングを作ろうと思ったんですが

公式をみると「グラフィックがぶれがひどくなる」と書いてあって
URLリンク(homepage2.nifty.com)

で、実際にサンプル試してみたら
確かに時々ひっかかる感じが。

これって改善はできないものなんでしょうか?

228:名前は開発中のものです。
08/12/08 20:56:58 a6vLxw2w
内部の更新処理(当たり判定,posX += vXなど)のフレームレートを倍にするとか

229:名前は開発中のものです。
08/12/09 01:42:49 osPjvukM
>>227
int Time; を
LONGLONG Time; に、

Time = GetNowCount(); を
Time = GetNowHiPerformanceCount(); に

while( GetNowCount() - Time < 17) {} を
while (GetNowHiPerformanceCount() - Time < (1000000 / 60)) {} に

書き換えてみたら?



230:名前は開発中のものです。
08/12/09 13:46:02 uZqK3Qyt
>>224
RPGやアドベンチャーゲームなら
1文字ずつゲーム内Windowに描画され、ゲーム内Windowごと表示非表示を切り替えられるって仕様は普通に有るでしょう

231:名前は開発中のものです。
08/12/09 15:29:12 hNxQdCPd
>>226
文字表示ぐらいしかないと思うけど・・・

232:名前は開発中のものです。
08/12/09 15:52:37 R5xGo07t
サンプルゲームみたいなのでなかったっけ?
前はあったはずなんだが。

233:名前は開発中のものです。
08/12/09 17:32:59 PL50HxGw
「DXライブラリサンプルゲームのダウンロード」のページにある
「スクリプトプレーヤー」の事じゃないかな。


234:名前は開発中のものです。
08/12/09 18:26:23 hNxQdCPd
スクリプトプレーヤーはソースの意味が分からない
いきなりスクリプトのソースみろとか言われてもなにがなにやらって感じ

235:名前は開発中のものです。
08/12/09 19:12:36 PIQiSLzg
サンプル見たいって話を聞くたびに
見てもわかるの?
という疑問が湧く。
同じ動きをするものを自分で書けるくらいの技量がなければ結局読めない気がする。

他人のソース読むのが超苦手で自分で書いた方が早い俺限定の話だが。

236:名前は開発中のものです。
08/12/09 19:35:05 aLvm7Uo6
>>235
アルゴリズムは同程度の技量がないと読めないけど、設計はそんなことないよ。

スクリプトプレイヤーのソース見たけどちょっと酷いな。
マジックナンバー、関数長すぎる、グローバル変数使いまくりetc...
たしかにこれ読めとか言われても俺も困る。


自作2Dライブラリ作ってたんだが、画像系の実装が終了したところで
面倒になってきたんでDXライブラリを使うことにした。おまいらよろしく。

237:名前は開発中のものです。
08/12/09 20:33:33 PIQiSLzg
>>236
ああ確かに設計は読みたいかも。
うまい人のクラス構成とかはみてみたい。

238:名前は開発中のものです。
08/12/09 20:44:39 HfON+uiV
うまい人のコードは,クラスやメソッドの実装にどんどんステップインしていかなくても
表面だけ見れば理解できるよね

239:名前は開発中のものです。
08/12/09 20:59:26 MCEWLRF6
>>228
すいません、内部処理は一定化したかったので・・

>>229
ありがとうございます!
引っかかりが無くなりました。
タイマーの精度の問題だったみたいですね。

240:名前は開発中のものです。
08/12/10 15:43:30 LwDc2Tc0
>>220
>>221
>>222
>>223
printfなどが関数だということを意識していませんでした。
まさに、C言語=標準関数のつもりで勉強していました。
外部ライブラリを使うのだから、それから提供される関数の使い方を勉強するのは当たり前ですね。
プログラミングに対する疑問が少し解けました。どうもありがとうございました。

241:名前は開発中のものです。
08/12/11 09:38:29 oww0q0NN
画像の、ある部分だけを拡大して描画することは出来ますか?
ループ表示する背景の一部分だけを拡大表示したいです。

242:名前は開発中のものです。
08/12/11 10:38:54 qrB4r20j
やった事ないけど、指定領域だけで新しいグラフィックハンドルを作るとかできるはずだから、
それをしてから拡大表示させればいいんじゃないかな。

前提条件として矩形範囲のみって事になるけど。

243:名前は開発中のものです。
08/12/11 11:00:28 oww0q0NN
>>242
なるほど、ありがとうございます。矩形なのでその辺は大丈夫です。
でもアクションゲームみたいに、リアルタイムにバックグラウンドをスクロールさせつつ、
拡大率を変えてバックグラウンド表示するのはその方法ではコストが掛かり過ぎて無理なようですね。
DrawExtendGraphの描画元矩形指定関数があれば一発なのに><

244:名前は開発中のものです。
08/12/11 11:23:00 qrB4r20j
背景をスクロールさせつつ、拡大部分もスクロールさせるのかな。
それじゃ無理だね。

それならいっそ、

背景を普通の大きさで書く → 画面の描画範囲を設定(SetDrawArea) → 背景を拡大して書く

ってやってみるのはどうだろう。
背景を二回描くから、やり方によってはコストかかるけど……。

245:名前は開発中のものです。
08/12/11 12:23:15 Otp3maXe
つDrawRectExtendGraph

246:名前は開発中のものです。
08/12/11 12:49:25 oww0q0NN
>>244
そうですそうです、元画像の一部分を拡大表示したいんです。

>>245
おお!ありがとうございます。そんな関数があったんですねw
面倒でも自分でDxLib.hをチェックしないと駄目ですねw

247:名前は開発中のものです。
08/12/12 18:14:48 dqaLLhhf
今 トルネコやシレンみたいな2Dダンジョン探索ゲームを
800 x 600 ウィンドウモードで作っているんですが
2Dゲームは 640 x 480 が基本だと聞きました。

800x600だと何か不都合でも起こるんでしょうか?

248:名前は開発中のものです。
08/12/12 19:08:10 e0uVhp4S
32x32とか16x16のブロックがぴったり収まらない、とか。?

249:名前は開発中のものです。
08/12/12 20:15:13 dqaLLhhf
画面下と右にブロックが半分だけ表示されるのは我慢しようと思います。
800x600だと特定の環境ではちらつきが酷いとかだったら嫌だなぁと思いまして

250:名前は開発中のものです。
08/12/12 20:24:18 yokHYtBf
>>247
処理速度の問題とユーザの環境の問題
ちなみにカラーモードも256色パレットモードが基本だった
しかしそれは過去の話
今はPCのスペックは十分だし、800*600の画面モードの無いPCの方が少ないと思うから問題ないかと


251:名前は開発中のものです。
08/12/12 21:25:42 aXKygAOw
ちょっと便乗
CRT使いなんでわからないんだけど
液晶の場合、画面サイズに合わない画面モードの表示ってどうなるの?

1)全画面に拡大されてぼやける
2)表示分だけ使われて余白は黒塗りになる

252:名前は開発中のものです。
08/12/12 21:28:59 8ZHcqCMQ
>>251
A.液晶の設定しだい

253:名前は開発中のものです。
08/12/12 22:00:48 J3zydYCS
初心者で悪いんだが質問。

うまく言えないんだけど

player.cpp内でint宣言をして、void player()で増減させる。
そして
「enemy.cpp内」で「player.cppのvoid player()」で増減したint変数を使用して作りたい判定があるんだけど。

こういうのってやっぱり出来ないのかな?


254:名前は開発中のものです。
08/12/12 22:09:20 r3WCUutT
extern

255:名前は開発中のものです。
08/12/12 22:12:35 dqaLLhhf
player.cppでグローバル変数としてint宣言して
enemy.cppの冒頭にextern宣言すれば判定にも使えるようになるよ

256:名前は開発中のものです。
08/12/12 22:19:36 J3zydYCS
>>254-255
ああそれ忘れてたww
おもいっくそ素材ファイルの読み込みで使ってたのに

ありがと、助かった

257:名前は開発中のものです。
08/12/12 22:34:39 ztObze9Y
-- player.cpp --
int i;
void player(){ i += 1; }

-- enemy.cpp --
extern int i;
void enemy(){ if(i) ・・・ ;}

258:名前は開発中のものです。
08/12/12 22:49:50 aXKygAOw
>>252
即レスサンクス。

じゃあプログラムする側としては
あんまり気にしても意味無いんだ・・

勉強になりますた。

259:名前は開発中のものです。
08/12/12 23:04:32 e0uVhp4S
>画面サイズ
最近流行りの低価格ノートPCとかだと、どんな感じなんだろう?
縦600くらい?

260:名前は開発中のものです。
08/12/13 01:45:20 E/1bppJy
if(enemy01_Life < 0){
DeleteGraph( enemy01 ) ;
}
else if(hitS < hit ){
PlaySoundMem( hit_test , DX_PLAYTYPE_BACK );
shotflag = 0;
enemy01_Life -=1;
}

このコードで、最後のenemy01_Life -=1の判定を一回だけ判定場合ってどうすればいいの?
ダメージ判定だけがどうしても残ってしまう

261:名前は開発中のものです。
08/12/13 02:02:18 Swo2xfir
>260
具体的に何がしたいが、何が起こってるのかを示せ。
コードにはコメントを入れろ。第三者には何をやってるか分からない。


んで、だ。
ショットが命中した時、

 (1)ショット自体を消す(敵に当たると弾が消える)
 (2)敵ごとにカウンタを作っておき、「一度当たったら10フレームの間は無敵」とかにする
 (3)弾ごとに自分がどの敵に命中したかを覚えておき、2度目は命中扱いにならないようにする

こんな感じ?

262:名前は開発中のものです。
08/12/13 02:20:00 E/1bppJy
>>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;

263:名前は開発中のものです。
08/12/13 02:39:09 DJ2YFwb1
>>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 ) ;
}


次ページ
最新レス表示
スレッドの検索
類似スレ一覧
話題のニュース
おまかせリスト
▼オプションを表示
暇つぶし2ch

4261日前に更新/249 KB
担当:undef