トップページgamedev
1001コメント335KB

シューティングゲーム製作技術総合 3機目

■ このスレッドは過去ログ倉庫に格納されています
0001名前は開発中のものです。04/06/16 07:45ID:u0+hin61
ゲームプログラマなら誰もが通る、もしくは、通った道。青春の香り?
それは「シューティングゲーム製作」・・・。

このスレでは、そんなシューティングゲームの製作技術や技術の検証、成功談
失敗談笑い話、難易度の設定方法論、多弾の是非などについて語り合いましょう。
もちろんBulletMLなどで弾幕を作成してみたり、自分の作ったシューティングを
晒してみたり、プロジェクトをはじめてみるなどもOK!

ただし、シューティングの未来とか既存のゲームの話題などは、関連する他の
スレでやってくれ。

■前スレ
シューティングゲーム製作技術総合 2機目
http://pc5.2ch.net/test/read.cgi/gamedev/1073736474/
0067名前は開発中のものです。04/06/20 05:04ID:lH+yFIWz
>>66
死んだときに後になればなるほど高得点が入るようにするとか・・・。
この場合、ボス戦で死ぬのは駄目。道中で死ぬことによって点数増加。
この点数は、ラストの残機ボーナスより(最終面で死んだ場合は)多くなるようにするとか
んで、死ぬことによって1、2段階ずつパワーダウンしていく。

ドドンパチでこれを考えると
緋蜂戦に入る前にぎりぎりまで残機を減らしたほうがいいわけだが
それだと、全一を目指そうとすると、緋蜂発狂モードに未パワーアップ&残機数無しで相手しなければならない。

こんな感じで、安全をとるか、点数を取るか。
とかにしてみるのも面白いやも。
あとこれだと後半で死んでも捨てげーにならない、と、言う利点ができたりするわけですが・・・

どんなもんやろ?
0068名前は開発中のものです。04/06/20 05:16ID:zSzztZMs
そこまでしてパワーアップの必要性を作ることもないんじゃない?
そういったゲーム性はまた別の組み方があると思う。
0069名前は開発中のものです。04/06/20 05:18ID:cSwmhxCc
死んだら敵機よろしく得点アイテムを吐くわけな。自機が。
特定のポイントで死ねなかったら捨てゲー確定ですな(意味不明かもしれん)。
0070名前は開発中のものです。04/06/20 05:49ID:zSzztZMs
あと、あんまり高いリスク→高得点を詰め過ぎてプレイヤーにストレスばっか
与えると、根本的につまらんゲームになりかねん。
0071名前は開発中のものです。04/06/20 05:59ID:JrKJOMHs
残機潰したほうがスコアが稼げるというゲームは実際にあるわけだが
そして不評なわけだが
0072名前は開発中のものです。04/06/20 06:32ID:zSzztZMs
えーとガンネイルとか?
ちがったっけ
0073名前は開発中のものです。04/06/20 07:11ID:BlbgnF66
>>54
なんだろね?
雷電は結構、パワーアップ重要だったと思うけど(復活ゲーだし)
多分、ボス前のショット>レーザーのバランスの事とか?

、、そろそろ、2ヶ月あまり停滞していたSTG作りを再開します。と自分に言い聞かせ、、。
とりあえず、安易な縦シューサンプルが動く所までを目標に、、。
00745804/06/20 08:19ID:eF3refHy
>>59
そんなにいい方法があるのなら、ぜひ聞かせてほしいが…。

>>61
キーワードはググりました。
固定小数点使ってもある程度の誤差は免れないと思う。
俺の方法よりはマシですけど。

>下駄を履かせるとイイ
無駄足は踏まさせてます。
if(〜)
{
before_time = time_table[count] - delta_t + now_time;

>V-SYNC待ち
完璧にV-SYNCが取得できるなら苦労しませんが。
まぁオプションで指定してもらえれば作る側は楽だが、そんなのめんどうだし。

>>63
そうですかね?浮動小数点でも有効数字の範囲なら同じに見えますが。
0075名前は開発中のものです。04/06/20 10:55ID:RCj90FIX
>>59
自分も聞かせてほしいです…
0076名前は開発中のものです。04/06/20 16:05ID:I9qRqgm/
じゃあ簡単に解説

まずWin32タイマー精度が1000ms分解能
ほしい精度が1000/60ms=50/3ms分解能

dword time_prev_mul3; // ワンフレ前の時間
dword time_cur_mul3; // 現在の時間
dword time_remain_mul3; // 誤差蓄積時間

void FpsTimer60::wait(){
  while((time_cur_mul3 = timeGetTime()) *3 + time_remain_mul3 - time_prev_mul3 >= 50);
  time_remain_mul3 = time_cur_mul3 - time_prev_mul3 - 50;

}


remainが大きくなりすぎたら一旦remainを初期化したりする処理
連続49/3日稼動をまたぐ時の処理は省略

…という方法
これでうまく動いてるんだけどどうや!
0077名前は開発中のものです。04/06/20 16:07ID:I9qRqgm/
かってに送信された。一行追加

void FpsTimer60::wait(){
  while((time_cur_mul3 = timeGetTime()) *3 + time_remain_mul3 - time_prev_mul3 >= 50); // 松
  time_remain_mul3 = time_cur_mul3 - time_prev_mul3 - 50; // 誤差を記録
  time_prev = time_cur; // ワンプレ前の値として記録
}
0078名前は開発中のものです。04/06/20 16:23ID:9GKIat6R
QueryPerformanceCounter は使ってはいかんのか?
0079名前は開発中のものです。04/06/20 17:01ID:65EGUQxQ
別に構わんと思うけど、1回の呼び出しに1us位掛かった気もする。
0080名前は開発中のものです。04/06/20 17:11ID:NgwUMUOo
>>74
で、bresenham' algorithm は無視かよ。
0081名前は開発中のものです。04/06/20 17:12ID:NgwUMUOo
s/'/'s/
00825804/06/20 19:22ID:eF3refHy
>>76
ども。
3倍して誤差をなくしてるんだな。

>>78
いいんじゃね?
俺はQPCが嫌いだから使っていないだけ。

>>80
無視しているわけではない、使っていないだけ。
まぁ76のが応用だな。

76を参考にして作ってみたが、delta_tがdj。

DWORD before_time = timeGetTime(), now_time, delta_t = 0;

int wait_vsync()
{
    now_time = timeGetTime();
    delta_t = (now_time * 3) - (before_time * 3);
    if( delta_t >= 50)
    {
        before_time = now_time;
        return 0;
    }
    return 1;
}
で、
while(wait_vsync())
00835804/06/20 19:24ID:eF3refHy
追記、
今回は delta_t が使えないので誤差の蓄積は諦めた。

ちなみに>>74に書いたが、58のソースでも誤差の蓄積はしていた。
0084名前は開発中のものです。04/06/20 21:13ID:5pDtmEUg
76だけど
あのさぁ、わざわざ3倍してんのはremainに誤差を蓄積して後フレームで取り返すためにやってんのに
その処理なくしたら何のいみもねーだろ。
そもそもv_syncとか意(ry
0085名前は開発中のものです。04/06/20 21:14ID:DI+n1JlW
まだブレゼンハムとか言ってる人がいるのか。
タイマ周りなんて容赦なく浮動小数使えばいいのに。doubleで1=1秒で。
0086名前は開発中のものです。04/06/20 21:41ID:DI+n1JlW
const double FRAME_RATE = 60.0;
double gameTime = 0.0;
double gameDeltaTime = 1.0 / FRAME_RATE;

Boost::timer t;

while (true) {
  double currentTime = t.elapsed();

  if (gameTime > currentTime) {
    Sleep(gameTime - currentTime);
  }
  gameTime += gameDeltaTime;

  Update();
  Render();
}

こんなんでも基本に。
0087名前は開発中のものです。04/06/20 22:01ID:OU12cvDW
>>74
>完璧にV-SYNCが取得できるなら苦労しませんが。

んー。DirectX7以前ならフルスクリーンでは確実に同期できますが。
(できない珍種ビデオカード環境があるなら例をあげてみなさい)
 
更に、DirectX8以降に対応したドライバならウィンドウモードでも
確実に同期できますが。大抵はスキャンライン単位で情報得られます。
 
まさか、「CRT側のリフレッシュレートと同期できない環境」で
ノイズレスかつスムーズな2Dゲームプログラムを実現できるとお考えで?
 
>>83
>誤差の蓄積は諦めた。
 
まぁ、勉強中ということなら今回は諦めてもいいんじゃないか。
ただし、精度保証はちゃんとできるんで。数値計算の初歩本ぐらい
買うか借りるかして勉強したほうがいいと思うぞ。

>>85

いや、精度保証付きであれば何でも構わないわけだが。
話の流れ的にも整数演算のみでカタが付くことを58が
望んでる様子だからブレゼンハムって単語が飛び出たのであるし。
0088名前は開発中のものです。04/06/20 22:06ID:zSzztZMs
vsync同期前提で良いんじゃないかなあと俺は思ってんだけどね…。
綺麗だし。
00898804/06/20 22:09ID:zSzztZMs
あ、言葉足らなかった。
タイマはリフレッシュレートいじれない人用と考えて
そんな高精度じゃなくても良いんじゃないって話。
0090名前は開発中のものです。04/06/20 22:13ID:DOcz0XvB
ねーねー、誤差蓄積時間って書いてあるけど、
これって単なる前回誤差時間だよね?
0091名前は開発中のものです。04/06/20 22:55ID:ImnSjeb4
ウィンドウモードでVSyncに同期できるってのはどういうことですか?
例えば普段リフレッシュレートを85Hzに設定してる人が、
ゲームのウィンドウだけをVSyncに同期して60fpsで動かすことって不可能ですよね?
0092名前は開発中のものです。04/06/20 23:02ID:wt7FAzbI
>>91
私はA宗です。

B宗1派の苦労もB宗2派の不幸も知らないし知りたいとも思わない。
0093名前は開発中のものです。04/06/20 23:10ID:ImnSjeb4
A宗でしたかー。
009492=8704/06/20 23:13ID:wt7FAzbI
です。
0095名前は開発中のものです。04/06/20 23:40ID:JrKJOMHs
数値計算屋ならなおのことB宗にしそうだけどなあ。
#ゲームなんて超複雑な偏微分方程式みたいなもんだ
0096名前は開発中のものです。04/06/21 00:01ID:ufNKNDg5
でだ、俺B宗なんだけど、ちとA宗の人に質問。

このことを具体的にどう実装してるのか教えてくれ。
「同じ曲線軌道を取る弾を等間隔に連打して曲線を描く弾幕を作りたい」
もちろん軌道は微分形式で表されてる奴ね。

dt可変だと、連射弾の1つ1つの軌道が変わると思うのよ。直線弾ではなくて、曲線弾だから。
結局そんなもんは誤差の範囲ってことでごまかしてるわけかな?
(実際にプレイしてればそんなに気にならないだろうし、どうせ桁外れに小さい誤差だろうけれど)
00979604/06/21 00:04ID:ufNKNDg5
すまん、ちと要点がなんだかわからない文章だった。

要するにこれをA宗の実装方法でやるのに問題点は
「等時間間隔で発射すること」「全ての弾の曲線に同一軌道を持たせること」
の2つだと思うんだけど、実際どうしてるのかな、と。
009892=8704/06/21 00:13ID:LDPsXW0a
教義をよく読んだら、もすかすてA宗ってオブジェクトのパラメータ更新も
リフレッシュレートに同期させんと異端になるんか。私、原理過激派に抹殺されるかも(・∀・)

>>96
弾幕に関しては、お定まりのアニメーション再生ルーチンと同じでイケルぽ。
空間上のパラメトリック曲線上をナゾルっぺよ。Δtにあわせてスライダー上を
進むようなイメージだべよ。
009992=8704/06/21 00:23ID:LDPsXW0a
えーと、予定調和的な処理を簡素に作り上げるなら
ゲームワールドの更新に未知のΔtを使うのは嫌過ぎる。ってのは同意。
 
私は「滑らかな2Dゲーム、滑らかなスクロール」のために画面更新は
リフレッシュレートに同期させよう。というつもりでA宗だと思ってたプチ信徒ディス。
0100名前は開発中のものです。04/06/21 00:52ID:ufNKNDg5
>>98
アニメーション再生ルーチンってのが具体的にどういうもんだか分からないのだけれど…。
もしオブジェクトごとに非常に小さい固定dtの数値積分で求めているとしたらそれは本末転倒で、
初めからゲーム全体にクロックを与えて、そいつで駆動したほうが楽でよくない?
0101名前は開発中のものです。04/06/21 00:56ID:S8I9DCcV
>>98
よく、知ったかのゲーマーとかがバカの一つ覚えみたいに60fpsとかいうけど、
実際は59.97Hz前後だから、VSYNCに頼ったところで正確に60fpsにゃならないんだよ。
昔のゲームは、単に高速タイマがなくて、ターゲットのリフレッシュレートは固定だから、
タイミング取るのにVSYNC割り込み使ってたという単なる慣習だ。

PCだったら、タイマとトータルのフレーム数のカウンタを併用して、1/60fps相当で
必要な処理を通すようにゲームループ回して、絵の方をつじつまあわせりゃいい。
ちらつきが嫌ならVSYNC検出して、帰線期間に絵を書き換えりゃいいし、
そうじゃないなら洋ゲーみたいにフレームレート可変って感じで。
今のシューティングゲームは、負荷でスローが掛かる表現にしたって、ソフト的に
ウェイト入れてやるだけなんだから、無理してVSYNC使う必要はないんだよ。
0102名前は開発中のものです。04/06/21 01:05ID:p+RaFqmS
俺は敵の挙動を計算式で処理してないので
60FPS固定でやるしかない。
0103名前は開発中のものです。04/06/21 01:14ID:JKYmVFm9
ずいぶんと脱線をしている気がする。まあ、76と86が実用になることだけわかってれば問題ないよな。
リフレッシュレート85とかのCRTでのウィンドウモードで
伝統的57〜60FPSゲームを動かすのがお題目なんだし。
0104名前は開発中のものです。04/06/21 01:15ID:JKYmVFm9
あぁ、76-77と書いておかないと万一のとき大変だ。
010592=8704/06/21 01:30ID:LDPsXW0a
>>100
補足しようと思ったらかぶってしまった。

んーと、A宗原理過激派として実装するなら
弾幕に関しては予めシナリオが作られた打ち上げ花火なので
Δtを使った数値積分で軌道を決定する必要はないです。
Δtが未知なら避けるべきです。
010692=8704/06/21 01:31ID:LDPsXW0a
私はFLASH上で編集した弾幕を自作のエクスポーターで
出力させてるんですが、私のフォーマットは
座標値を補間パラメータとする空間上のベジェ曲線で軌道を表現しています。
この制御点には時間tなども入ってます。なぞるタイミングは、制御点間でtを
3次の多項式で補間しています。

ですので、Δtが例え未知の場合であっても弾の軌道が崩れることはありません。
010792=8704/06/21 01:40ID:LDPsXW0a
>>101
>実際は59.97Hz前後だから、VSYNCに頼ったところで正確に60fpsにゃならないんだよ。
 
おっしゃる通りです。
 
私はVSYNCに同期した画面更新なくして2Dゲームで滑らかスクロールは不可能
という立場を取りつづけますが、ゲームワールド更新に関してはその限りではありません。
0108名前は開発中のものです。04/06/21 01:54ID:CZlBnPbU
リフレッシュレートが59.97Hz前後なら同期で60fpsにならないの?
0109名前は開発中のものです。04/06/21 02:22ID:ufNKNDg5
アニメーションってソレね。ベジェ曲線は自由度は高いけれど実はそうでもないのよね。
要するに3次ベジェ曲線で表せるものしか表せないわけ。
俺が「微分形式で表したもの」って言ったのはちょっと表現的には間違いかも。
「微分形式でしか表せないもの」とか「積分がまんどk(ry」なもの。
計算屋なら数値積分がどんだけ楽か分かると思うんだけど、
それなのにA宗でパラメトリック曲線に頼るというのは、なんか変だなと思って突っ込んでみたのよ。
なんかリフレッシュレートっつーよりは数値積分のありがたみの話になっちゃったけど(笑)
0110名前は開発中のものです。04/06/21 03:16ID:3lNf6LDD
59.97HzはカラーNTSC放送の垂直同期周波数ってだけで、
PCがそうであるかどうかとは全然関係無いと思うんだがなぁ。
0111名前は開発中のものです。04/06/21 03:59ID:c2WK3wbx
>>110
厳密にリフレッシュレートを測定したことはないが
俺は一度、timeGetTime基準による「完全なる60Hz」で
V-SYNC完全シカト描画を行ったが、モニタ60Hz動作時
「前画面と新画面の境界線」がヌルヌルポ下がっていった。
0112名前は開発中のものです。04/06/21 04:38ID:3lNf6LDD
>>111
ガッ
それだとリフレッシュレートは60Hzより上という事ですな・・・。
0113名前は開発中のものです。04/06/21 08:20ID:KBm5y3SS
これからはデジタルディスプレイでいいんじゃ
0114名前は開発中のものです。04/06/21 08:22ID:HeiMivNg
最近の、書き込んである背景って、どう管理されてるか知ってる?
チップと一枚絵の中間という感じかな?
0115名前は開発中のものです。04/06/21 12:54ID:xW89oDgi
何を指して「管理」といってるのかよく分からんが
2、3人程度で趣味でやるなら難しい事考えずにチャランポランで平気だけどな。
例えば地上オブジェクト配置するときの命名規則とか。その程度だろ。

 1面.dat
 2面.dat
 3面.dat
 4面.dat

とかで、中身はレイヤー別に

 地上オブジェクトの配置情報
 地上静的構造物の配置情報
 背景ビットマップ
 
セコくやればレイヤー機能付きペイントツールさえあれば足りる。
0116名前は開発中のものです。04/06/21 12:55ID:xW89oDgi
s/地上オブジェクト/地上キャラ/
0117名前は開発中のものです。04/06/21 14:07ID:e++/Dzs/
絵の話?
書き込んである=2Dと解釈すると、ケイブだったら1画面くらいの大きさのチップ?を
並べてるんじゃないかなあ。あんまり同じ絵を並べてるようには見えないけど。
0118名前は開発中のものです。04/06/21 14:32ID:JKYmVFm9
作画のときにチップをいろんなかたちで並べて、データに落とすときに1枚絵にしてそう。もちろん複数レイヤー
0119名前は開発中のものです。04/06/21 16:18ID:Q8xwgw86
今はそういう力業というか、マシンパワーでごり押しみたいなのが平気で出来るように
なったからなぁ・・・。
16×16ドットでマップチップを作ってた時代が懐かしい。
まあそれでも、サウンドの容量に比べれば可愛いもんかも知れんが。
0120名前は開発中のものです。04/06/21 17:23ID:1qbJMgYw
RPGのレベルアップの意味もそのうち薄まってくるんかな。
0121名前は開発中のものです。04/06/21 17:59ID:3UEhFGgf
いやいや。
0122名前は開発中のものです。04/06/21 18:19ID:5Ni6y7O+
76のヤツって差が50以上開くまで待つんだから不等号逆じゃね?
このままだとprev_time_nul3が初期化されてなければ、
(now = n * 3) + (remain = 0) - (prev_time = 0)になって、
最初の呼び出しで永久ループだし、
ちょっと前にtimeGetTime()で初期化してたらwhile()で待たない。
01235804/06/21 19:11ID:xf+FXc2Y
俺の発言で誤解を招いてしまったが、俺はあくまでB宗一派。
>>84=76
3倍しているのは誤差蓄積の他に、俺の int time_table[] = { 16, 17, 17 }; のような
ばかテーブルを作成しないためでもあるのでは?
あと誤差蓄積を無視しているのではなく、delta_tが死んでいるので出来ないだけ。
そのうちソース修正する。
>>85=86
ソースupサンクス。参考にします。
>>87
いままでのソース読めば分かると思うがDirectXは使っていない。
> CRT側のリフレッシュレートと同期できない環境
それだからタイマ使うんじゃねーの。
実現は出来る。ある程度のマシン性能以上の環境ではな。
> 数値計算の初歩本
お薦めの本があるなら教えて欲しい。
安ければ洋書でも読む。
> 話の流れ
そういうことだが、拒みもしない。
>>88=89
> リフレッシュレートいじれない人
それが俺。
だから1000msぐらいは精度が出ないと困る。
timeGetTimeも微妙だけどな。
>>101
それはB宗だ。
>>111
興味深い。是非詳しく聞かせてほしい。
0124名前は開発中のものです。04/06/21 19:37ID:e++/Dzs/
正直もっと一般的な環境を前提に、一般的な環境で開発したほうが良いんじゃ…
0125名前は開発中のものです。04/06/21 19:54ID:xW89oDgi
>>123
だから、なんでDirectX使わないんだ?
0126名前は開発中のものです。04/06/21 21:02ID:LHnLYc3x
>>125
Macだからとかじゃない?
0127名前は開発中のものです。04/06/21 21:10ID:xW89oDgi
('∀`)
0128名前は開発中のものです。04/06/21 21:56ID:8PUCpaws
DirectXを使う使わないとかいう話なんか?
0129名前は開発中のものです。04/06/21 23:09ID:xW89oDgi
>>128

>>87の発言

 >まさか、「CRT側のリフレッシュレートと同期できない環境」で
 >ノイズレスかつスムーズな2Dゲームプログラムを実現できるとお考えで?

に対して、>>123

 >いままでのソース読めば分かると思うがDirectXは使っていない。
 >それだからタイマ使うんじゃねーの。  
 >実現は出来る。ある程度のマシン性能以上の環境ではな。
 
と反論しているわけだが、おまえどう思う。
01305804/06/21 23:16ID:xf+FXc2Y
お陰様で、だいぶよくなってきた気がする。
明日くらいには誤差修正込みの完全版ソース出せそう。
あと、俺は純粋に1/60secごとに描画したいだけだ。

>>124
「ノイズレスかつスムーズな2Dゲームプログラム」が前提だったから
特殊な環境に依存すると言ったんだが。
文句があるなら>>87にどぞ。
俺の想定環境は PenIII以降, Win9x/NT ぐらいか。
リフレッシュレートは60か75くらいしか確認できないが、それぐらいになら変更できるし大丈夫だろう。
>>125
最も本質的な話題だが、俺に答えられる範囲内ではないな。
まぁ、俺の環境と技術が不足しているから。
そもそもDirectXでリフレッシュレート同期できるんなら、こんな質問していない。
>>126
ソース見てるか?win32依存。
>>127
(´・ω・`)
>>128
ここの方たちから見るとばかばかしいくらいの質問だからこうなる。
でも、正直WIN32APIの範囲内で答えてほしい。
…って言うとDirectXの構成の話になってしまうので、避けておく。
01315804/06/21 23:18ID:xf+FXc2Y
>>129
フォローありがとう。
0132踊る大走査線04/06/21 23:20ID:lcOXuxW6
ぶっちゃけ内部処理300fps最強ですよ。(200fpsくらいでも十分かも)

リフレッシュレートが60Hzだろうが75Hzだろうが85Hzだろうが、
3〜6ステップ適宜進行→描画→VSYNC待ちのループだけで、
60Hz完全同期との違いがわからんくらい十分ぬるぬるぽ動くよ。
今のCPUは滅法速いから、ゲームロジックの負荷が数倍になろうが問題にならないし。

Δt可変の方法はリプレイのこと考えると全滅かな。
0133名前は開発中のものです。04/06/21 23:46ID:xW89oDgi
>>132
ガッ
 
うえー。それは3Dゲーム限定の話でないの?いやマジで。( ゚д゚)ポカーン
にわかに信じられないのでとりあえず確認中。
ちなみに、俺はDirectX7の頃にfpsリミッター解除でD3Dで2D横スクロールとか色々実験したが
流石に2D横スクロールでティアリング誤魔化すのは無理ぽって結論に達したぜ。

この辺は程度問題ということで、気にしなければ大した問題じゃあないという路線なら俺は引き下がる。
 
58の場合、640x480程度の解像度でシステムメモリ→ビデオメモリのBitBlt転送だろう。
ハードウェア支援があっても200fps〜300fps安定して出すのは至難と思われ。
0134名前は開発中のものです。04/06/21 23:56ID:8PUCpaws
更新は1秒間に300回で、描画は1秒間にリフレッシュレート回ってことじゃねーの?

300回は50と60の最小公倍数だからコンシューマ用にもピッタリ
0135ID:xW89oDgi04/06/22 00:03ID:X9zQvkxn
最小公倍数(・∀・)ガッテンガッテンガッテン
01365804/06/22 00:08ID:1dwd+WcH
おかしい、whileに + remain_time した瞬間値がマイナスになってるっぽい。
あと、wait_vsync という意味わかんない関数名は気にしないでくれ、昔の名残だ。
もう寝る(´・ω・`)

DWORD before_time = timeGetTime(), now_time, remain_time = 0;

void wait_vsync(HDC hDC)
{
while(((now_time = timeGetTime()) - before_time) * 3 < 50)
;
remain_time = (now_time - before_time) * 3 - 50;
before_time = now_time;
}
0137ID:xW89oDgi04/06/22 00:14ID:X9zQvkxn
>>132
ゴメンx256。
てーか俺って>>132の書いてること全然読んでないし。
寝ぼけてるので寝る。ごめんあさーせ。
0138名前は開発中のものです。04/06/22 03:00ID:LaxixKHR
素人なのでBoost::timerなんて物があると知らなかったよー
timeGetTimeが1000msまでしか測れなくて悪戦苦闘してたのが馬鹿みたいだ
013913804/06/22 03:27ID:LaxixKHR
>>86の方法を使ってみたら、安定して60fps出るようになったのですが、しかし、
>>58のような方法を使ったときよりも、動きがカクカクします。
素人なので原因がよく分からないのですが、Boost::timerの精度が低かったりするのでしょうか?
0140名前は開発中のものです。04/06/22 03:42ID:3AJBjhfX
timeGetTimeが1000msまで?
ms単位をDWORDで返すのにそれは無いだろう。

>>86のはSleepの精度の問題かもしれないので、timeBeginPeriod(1)
とかやって見ると良いかもね。
もしくはビジーループに変える。

他にはメッセージループの問題とか色々考えられるかな。
014113804/06/22 03:59ID:LaxixKHR
timeGetTimeは1000msじゃなくて1msか。
今は>>58の方法に戻して保存しちゃったからソース残ってないんだけど、
自分はこんな感じで書いたからSleepの精度は関係ないと思う(自信無いけど

const double FRAME_RATE = 60.0;
double gameTime = 0.0;
double gameDeltaTime = 1.0 / FRAME_RATE;
double currentTime;

do{ //ゲームループ
do{ // VSyncに同期しない場合、ループで待機
if(PeekMessage(&msg, 0, 0, 0, PM_REMOVE)){
TranslateMessage(&msg); DispatchMessage(&msg);
}
currentTime = t.elapsed();
}while(gameTime > currentTime);

gameTime += gameDeltaTime;

Update();
Draw();
}while(1);
0142名前は開発中のものです。04/06/22 04:12ID:3AJBjhfX
>>141
Windowsメッセージはビジーループに入れないで一気に処理
しておく方が良いかも。
0143名前は開発中のものです。04/06/22 04:14ID:LaxixKHR
ありゃ、タブが効いてない…
で、boost::timerの精度が低いのかな、って思ったのは、
下みたいなコードを書いた時に32-40FPSあたりをうろうろしたからなんだけど
下のコード、何か間違ってるかな?
あと、内部でclock()を使ってる、と書いてるサイトを見かけた。

const double FRAME_RATE = 60.0;
double gameDeltaTime = 1.0 / FRAME_RATE;

do{ //ゲームループ
 t.restart();
 Update();
 Draw();
  do{ // VSyncに同期しない場合、ループで待機
   if(PeekMessage(&msg, 0, 0, 0, PM_REMOVE)){
    TranslateMessage(&msg); DispatchMessage(&msg);
   }
  }while(gameDeltaTime > t.elapsed());
}while(1);
0144138=14304/06/22 04:19ID:LaxixKHR
>>142
PeekMessageの部分は外に出したり中に入れたり、いろいろ試しましたが、同じ結果だったと思います
0145名前は開発中のものです。04/06/22 04:29ID:3AJBjhfX
>>143
そのコードだとt.restart()が良くない。

1フレームの間隔だけを測っていると安定しなくて当然だよ。
0146名前は開発中のものです。04/06/22 08:51ID:I03ozHCr
>>143
clock 関数は、呼び出しプロセスにかかった時間を通知する。

つまり、この用途には使えない。
01475804/06/22 20:53ID:1dwd+WcH
136のソースのバグが取れない…。明日に回す。
>>138
俺が使っているループです、参考になれば。
WM_PAINTで描画、WM_DESTROYでmsg_loop=0にしてる。

int msg_loop=1;
while(msg_loop)
{
if ( PeekMessage(&msg, hWnd, 0, 0, PM_REMOVE) )
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
else
{
InvalidateRect(hWnd, NULL, FALSE);// 画面更新
}
}
01485804/06/22 22:10ID:1dwd+WcH
意外と簡単に直った。が、ウインドウを2秒間ぐらいドラッグするとfpsが601になる。謎。
通常はだいたい60fps。

void wait_vsync(HDC hDC)
{
while(((now_time = timeGetTime()) - before_time) * 3 + remain_time < 50)
;
remain_time = (now_time - before_time) * 3 + remain_time - 50;
before_time = now_time;
}
上の方のソースとあんまり大差ないな。(´・ω・`)
まぁ、バグが取れただけ良しとしますか。
0149名前は開発中のものです。04/06/22 23:37ID:uFssHTsg
ようするにおまいらシューティングゲーム製作技術について
語ってないってことでOKだな?
0150名前は開発中のものです。04/06/23 01:38ID:mQGYafkt
OK
スレ違い
0151名前は開発中のものです。04/06/23 05:10ID:oqMUUUVk
>>2の関連スレが生きてるんだから、そちらでやったほうが良いかもしれないな。
質問と正答のやりとりで済むならここでもいいんだが。
0152名前は開発中のものです。04/06/23 08:20ID:ome83fsk
>>106
>FLASH上で編集した弾幕を自作のエクスポーター
これってどういう環境で作ったんですか?
関連サイトや書籍とかあれば教えて下さい。

後、アニメーションやキャラ配置、その他のデータ出力とかもやってるんですかね?
0153名前は開発中のものです。04/06/23 10:09ID:Xek9ifdg
俺も気になるな、それ
0154名前は開発中のものです。04/06/23 10:55ID:/LFISmVy
ABAさんトコで紹介されてた
BulletML対応の弾幕生成FLASHのことじゃないかと思う俺。
01558604/06/23 11:35ID:5nypZ6RY
ああ、boost::timerは機種依存なくて
手っ取り早く浮動小数で時間が返るタイマAPIだから使っただけ(w
boostの中の人はANSI Cのclock関数呼んでるだけだから、精度いいとは思えんです。
015692=8704/06/23 23:06ID:cGPveO8h
>>152
http://www.macromedia.com/devnet/subscriptions/
えーと、個人的な感想ですが、あんまオススメできません。
Flash通常版で十分イケます。SWF形式の構造は公になってますので
SWF2●●なコンバータを作るとか、そういう方向でひとつ。
http://www.openswf.org

>>154
別の方です。
0157152 04/06/24 00:45ID:jhY3Irve
ギョエッ。英語かーw

サンクスです。
日本語の解説サイトないかググッてみます。
なければ諦めますw

プラグイン系のスレって、あんまないですね。
興味ある分野なのですが、、。
MAXプラグインとかかなり便利らしいけど、日本語解説がないみたいで挫折。
015815204/06/24 01:05ID:jhY3Irve
一応少しありました。

多分、SWF形式ってムービーのような構造?
プロジェクトファイル(*.fla?)をコンバートORエクスポートするのがよさげかな?

やっぱ、英語が出来んと駄目か、、鬱
015992=8704/06/24 01:42ID:ff6YPiYV
>日本語解説がないみたいで挫折

というか正規ユーザーでなければプラグインのテストすら出来ないはずなので
技術的な面で挫折要素はないんですよ。正規ユーザーなら、分厚いマニュアル
入りの小箱が数個ほど届きますから、まずアレと格闘することになります。
API巨大ですがサンプルありますし。デベロッパーも多いのでフォーラムも
充実してますし。DirectXとかOpenGLとかWin32APIを乗り越えてきた人なら
そんなに心配しなくて平気です。
 
Macromediaの製品に関しても同様で、買えば“相応の”サポート情報は
得られますんで・・・(本当か?
英語は避けられないに関しては同意。まぁ、これは慣れる他ないんで。
016092=87(補足)04/06/24 01:47ID:ff6YPiYV
えーと補足。「お前、割ってるだろ」と言ってるように見えるんで訂正。
挫折するには早すぎるだろ、という趣旨です。
0161名前は開発中のものです。04/06/24 07:53ID:qdETUyP3
Flashの開発環境って結構たかいのね
言語の開発環境並みかよ!
0162名前は開発中のものです。04/06/24 23:58ID:9ja3YKOg
例のシューティング本でてたが・・・ありゃ、シューティングというよりか、
弾本だな。
0163名前は開発中のものです。04/06/25 00:33ID:os769dfK
これのこと?
http://cgi32.plala.or.jp/higpen/shtbook/shtbook.shtml
0164名前は開発中のものです。04/06/25 07:01ID:2dIa5ltV
それそれ。
プログラミングには詳しい人が書いた本だけど、シューティングゲーム・・・
というかゲームについてはイマイチ分かってない人が書いたっぽい内容だった。

あんな当たり判定じゃ、通り抜けしまくりじゃん!とか。
0165名前は開発中のものです。04/06/25 13:41ID:ITAgl7nj
読んでないけど、いろんなゲームの引用してるんでそ?
知らないってことは無いんじゃ…。
0166名前は開発中のものです。04/06/25 14:15ID:uORN20cy
実際に遊ばせるレベルのものは作ってない感じがする。
■ このスレッドは過去ログ倉庫に格納されています