• ベストアンサー

C# ゲーム作成 FPSと描画処理に関して

環境はVisualStudioC#Expressを使っています。 今回動きのあるゲームを作ろうと思ったのですが、 最も基本となるFPSの処理と再描画の処理が理解できません・・・。 簡単な動きのないアプリケーションくらいしか作れない程度のレベルなので、かなり細かいところになると分からないと思います。 プログラムだけ書かれてもどこにそれを書けばよいのか分からないほどだと思います。FPSに関してはTimerコンポーネントを使ってみたのですがうまくいきません。 そこで教えていただきたいことは、 (1)簡単なFPSのサンプルプログラム(出来れば精度とかもあるのでみなさんが普通にゲームに使っているようなものを) (2)簡単な再描画処理のサンプルプログラム (3)C#ゲーム作成にオススメなサイトや本 出来ればVisualStudio前提の説明だとありがたいです。 とりあえず球が『60FPSで動き、画面も再描画される』ことが目的です。

質問者が選んだベストアンサー

  • ベストアンサー
  • zwi
  • ベストアンサー率56% (730/1282)
回答No.2

>DirectXを使ったほうが簡単ならば是非使いたいと思います。 2Dと3Dのどちらもアクションやシューティングを作るならDirectXを活用しないと速度的に辛いですよ。SFCのドラクエ程度のゲームとかADVなら、WindowsAPIで作れないことは無いですけど。 それと球を画面に描画したいと書かれていたので、sha-girlさんはDirectXを紹介したのです。球はbmpで書かれているデータでしょうか?それとも単なる円の間違い? FPSとDirectXの参考サイト↓ http://www.clks.jp/csg/ http://kadankai.hp.infoseek.co.jp/html/shiraishiakira/csmdx_index.html http://www.atelier-blue.com/program/mdirectx/

noname#60745
質問者

お礼

なるほどー、プログラム内で記述した円と画像データの違いのことだったのですか。最初はただの円でFPS処理やらが出来ているか確認して、いずれはbmp画像を使うと思います。DirectXと聞いてややこしくなりそうだったので逃げてたのですが、やはり使ったほうがよさそうですね。 今C#に関しての参考書は「VisualC#2005 逆引き500の極意」しか持っていません。何かDirectXについてオススメの参考書があったら是非教えていただきたいです。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (3)

  • zwi
  • ベストアンサー率56% (730/1282)
回答No.4

ちょっと補足を。忘れてました。「Managed DirectX 2.0」は「XNA Game Studio」に名前が変わったようです。Xbox360とWindowsのゲームがC#で共通のプラットフォームで開発できるようになりました。 数々の紹介。 http://www.saturn.dti.ne.jp/~npaka/xna/ http://ja.wikipedia.org/wiki/Microsoft_XNA http://www.watch.impress.co.jp/game/docs/20061219/3dxna.htm マイクロソフトの「XNA Game Studio」のページ。 http://www.microsoft.com/japan/msdn/xna/default.aspx http://www.microsoft.com/japan/msdn/xna/XNA_dekiru.aspx http://xna-studio.jp/ 「できるプログラミング XNA Game Studio Express」 という本は非売品でマイクロソフトに連絡すると入手できるようです。 つい数日前「XNA Game Studio 2.0」も発表されました。 http://pc.watch.impress.co.jp/docs/2007/0907/ms.htm http://pc.watch.impress.co.jp/docs/2007/0907/ms2.htm 日本では扱いがまだ少ないですが、世界的には注目されているようです。

noname#60745
質問者

お礼

色々な参考サイトを教えていただきありがとうございました。 一般的にみなさんが行っている方法で簡単なゲームを作りたいのでとりあえずDirectXを用いてシューティングゲームくらい作れたらいいなと思います。

全文を見る
すると、全ての回答が全文表示されます。
  • zwi
  • ベストアンサー率56% (730/1282)
回答No.3

C#のゲームの本は、この三種類です。 http://www.amazon.co.jp/s/ref=nb_ss_/250-1388869-8241015?__mk_ja_JP=%83J%83%5E%83J%83i&initialSearch=1&url=search-alias%3Daps&field-keywords=c%23+%83Q%81%5B%83%80&Go.x=0&Go.y=0&Go=Go で、2DのDirectXの本は皆無ですね。 とりあえず、WindowsAPIの「C#ゲームプログラミング」を読んでみてはどうでしょう? C#で使えるDirectXは「Managed DirectX」と呼ばれていますが本が少ないのです。 洋書で良ければ下記の本もあります。評判も良いようです。 http://www.amazon.co.jp/Managed-Directx-Start-Graphics-Programming/dp/0672325969/ref=pd_bbs_sr_1/250-0399562-6461017?ie=UTF8&s=english-books&qid=1189331165&sr=8-1 本ではないですがマイクロソフトの「Managed DirectX」の使い方解説。 http://www.microsoft.com/japan/msdn/directx/japan/dx9/default.aspx 普通のDirectXの本はc/c++で書かれていますのでC#に自分で置き換える必要があり、そのまま使えるソースコードではありません。その点さえ気にならなければ本は多数出ています。

noname#60745
質問者

お礼

C++でもC#でもどちらでもよかったのでC++のほうが多数本が出ているというのであればC++にします。C++の参考書は『猫でも分かるゲームプログラミング』だけは持っているのですがDirectXについては全く分かっていませんでした。DirectXについて勉強したほうがよさそうですね。

全文を見る
すると、全ての回答が全文表示されます。
  • sha-girl
  • ベストアンサー率52% (430/816)
回答No.1

FPSとはフレームパーセックの事だと思うが そもそもDirectXのアプリは固定60フレームとかで動いてるわけではなく 可変で動いてます。 (一般的に前回表示してフレームからの経過時間ミリ秒で見ます) Windowsの場合、優先順位の高い他のプロセスが高不可になれば 自アプリはCPUのリソースをとれなくなるので、そうなっています。 (最近の次世代機と呼ばれるものもそういう設計です。) DirectX SDKをダウンロードすればサンプルソースが入っていますから それを見てください。(C#用のサンプルソースも入っています。) http://www.microsoft.com/japan/msdn/directx/downloads.aspx 球ということは3Dですよね? DirectXを使わず球の表示を60fpsの速度で描画をするのは 難しいと思いますし、オブジェクト数が増えれば60fpsを維持する事は出来なくなるでしょう。 それはDirectXを使っても同じことです。

noname#60745
質問者

お礼

すみません3Dではなく2Dでお願いします。 「DirectXを使う」ということがよく分かっていません。プログラム中で呼び出したりして使うのでしょうか。 DirectXを使ったほうが簡単ならば是非使いたいと思います。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • PCゲームプレイ中にFPSが低くて処理落ちしてしまいます。

    PCゲームプレイ中にFPSが低くて処理落ちしてしまいます。 Allods online という3D MMORPGをプレイしています。 スペック的には問題ないんですが常時30付近のFPSしか出ず、処理不足でカクついてしまいます。 ゲーム内の環境設定を最高~最低に変えても全く変化がありません。 しかし裏でJaneを起動してタスクバーに置いておくと処理不足が解消されて軽い場所(キャラ選択画面など)で300FPS越え 常時150FPS~100FPS出るようになります。 Jane以外でもFireFoxで特定のサイトを開いたりしてると同じようになります。 なぜかIEではなりません。 ちなみにOSのクリーンインストール、GPUドライバ変更どれも効果なしです。 FF14のベンチマークテストは同スペックのPCとほぼ同じLow4000出ました。 PCスペック i7 860 Men 4g xp sp3 GTS250 何か解決策分かる方いましたらどんな情報でもいいのでよろしくおねがいします

  • CBRにしたかFPSをあげたのか区別がつかない

    VBR録画だとそんなにカクカクつなかったんですが、CBRにしたらカクカクになるのですが同時にFPSもVBRだと40くらいなのがCBRだと70くらいなのでどちらが原因かわかりません。両方でしょうか? media infoでみるとどちらも最小は1~12FPS  最大は120FPSです。 設定だと120FPSにしています。 そもそもFPSがあがってカクつくことはあるのでしょうか? たぶんCBRにしたのが原因だと思いますけど。 動画はこんな感じの動画です。この動画ではありません。このゲームの動画ってだけです。 FPSがあがってPCの処理性能が下がってカクついた? けど録画してるときはカクついてなかったです。やはりCBRのせいでしょうか? https://www.youtube.com/watch?v=rjRJW1nqUQM&t=3s

  • OpenGLでの描画のタイミング

     OpenGLの使い方について疑問があったので質問しました.  OpenGLを用いて3Dのゲームを作っています.しかし, どうも処理が遅くカクカクした動きになってしまいます. 描画の量が多くなるにつれて遅くなっているので,原因は 描画の時に原因があるようです.ダブルバッファリング を用いて描画しているのですが,描画のときは… 1「描画関数の実行」(glVertex3f()などの実行) 2「裏に描画」(見えていないバッファに描画) 3「裏表入れ替え」(2つのバッファを交換) 0「一定時間待機して自分自身を呼び出す」            (60FPSなら1/60秒程度) を繰り返すものと考えています.  「1230」と繰り返せば通常通り動くのですが, 「1」に計算がかかりすぎると,「2」と「3」が遅れてしまい, カクカクしてしまうのだろうと考えました. (↑これがそもそも間違っていたらすいません><)  そこで,対策を2つ考えたのですが,これでいいでしょうか? それとも,もっと良い方法はないでしょうか?(「1」を 速くするしか方法はないでしょうか?) 【1】一定時間待機する秒数を可変的にする  現在のところ,「0」では,1/60秒待機させています.  しかし,1に1/30秒かかったとすると,「1230」を 1回繰り返すのに,3/60秒かかってしまうことになり, 結局FPSは20止まりです.  そこで,「123」でかかった時間を記録し,その秒数 を1/60から引いた分だけ「0」で待機すれば,1/60秒になる だろう,という方法です. 【2】描画のタイミングを変える  現在のところ,「1230」の順番で繰り返しています. しかし,これでは描画の関数を呼び出した時,「1」に 1/30秒かかったとすると,実際に表示できるのは1/30秒後 ということになります.よって,プログラムの始めに 「1232」を実行しておき,描画の関数の中身は 「3120」とする,という方法です. (そもそも,「2」と「3」のタイミングを   離せるのかどうかもよくわかりません><)  もちろん【1】と【2】の方法は併用もできると思っています. 「2」はOpenGLに入っているglFlush() 「3」はOpenGLに入っているglutSwapBuffers() 「0」はOpenGLに入っているglutTimerFunc() を用いています. 質問が長くなってしまいましたが,よろしくお願いします. 参考までに… 【OS】Mac OS10.7(Lion) 【開発環境】Xcode3 【言語】c++ 【プログラミング歴】6年(c++2年,OpenGL1年) 【CPU】2.66 GHz Intel Core 2 Duo 【メモリ】4 GB 1067 MHz DDR3

  • 線描画の座標計算で困っています。

     プログラムにて、仮想画面上に始点から終点までの線を引き、一部分を実画面に描画するプログラムを作っているのですが、機械の性能上の制約で処理が遅くなってしまいました。  仮想画面を使用せずに、計算だけで線を描画させようと思ったのですが、よい処理が思い浮かびませんでした。  そこで質問なのですが、始点から終点までの線のうち決められた範囲に入る部分だけを描画するための座標計算などの解説、もしくはサンプルがあれば教えて頂けないでしょうか?  よろしくお願いします。

  • FPSについて

    ■NVIDIA GeForce8800GT 搭載ビデオカード(512MB / PCI Express2.0) 現在上記のグラフィックボードを積んでいますが、ゲーム時の動作が非常に遅くなります。日によっては快適に動くこともあります。 過去にもこちらで質問をさせて頂きましたが、熱の問題でもドライバの問題でもなく結局原因不特定の状態となっていました。ベンチマークソフト等でいろいろ調べてみたところ「デビルメイクライ4」のベンチマークで快適に動くときはFPSが60前後、動作が重いときはFPSが160前後とFPSの値に差異が見られたのでこれが原因かと思いました。 なにか変な設定をしたわけでもないのですがFPSの設定を変更することは可能でしょうか? 動きが重いときに数度再起動すると正常に動くときがあります。 どなたかアドバイスお願い申し上げます。 (これが原因かはわかりませんが・・・)

  • Visual Web Developer 2008 Expressでの線描画

    Visual Web Developer 2008 ExpressでWebアプリを勉強しています。 Webの画面上に描画エリアを設けて、その中に線(Lineや PolyLine)の 描画をしようと思うのですが、インターネットで調べると、PictureBoxを配置して、その中に描画するように書いてあります。 しかし、Visual Web Developer 2008 Expressのツールボックスには、PictureBoxは、ありません。 (Imageならあります) JavaScriptで描画するという手もありますが、プログラム(C#)の中にPaintイベントを作成して、描画を行うようにするには、どうすればよいでしょうか? 最終的には、クライアントからデータを送って、その内容を描画するようなページにしたいと思っています。 やはりFlashを使わないと不可能でしょうか? Visual Web Developer 2008 Expressでの何か良いサンプルがありましたら、紹介していただけるとありがたいです。

  • C#のTimerについて

    こんにちは。 C#のプログラミングについてわからないところがありますのでご回答いただければと思います。 私はC#を用いて簡単な計算ゲームを作成しています。 その計算ゲームには対戦相手がおり、対戦相手の正解数はTimerを用いてユーザーに練習問題を解かせた時の解答時間を基に勝手に正解数が増えていくといったシステムにしています。 そこで1つ解決できない問題が浮上しました。 対戦相手の数を4人にして4人バラバラに解答しているような動きにしたいため、Timerを4つ設けそれぞれを動かせるようなプログラムを作成しました。 エラーもなく普通に実行できます。 しかしTimer1とTimer2は正常に動き対戦相手の正解数が増えていくのですが、Timer3とTimer4が全く反応していないのか、動かず、対戦相手の正解数が増えません。 プログラムの内容はTimer1~Timer4も対応する変数が違うこと以外一緒です。 原因は何であるかわかる方教えてください! C#ではTimerの使用数が2つまでとなっている?ってことなのでしょうか? スレッドを用いる方法もあると思いますが、Timerを4つ並べてそれぞれを動作させる方法があるのでしたら是非教えてください。 最後になりましたが、わかりにくい文章で本当に申し訳ありません。 よろしくお願いします。

  • FPS制御について

    今DirectDrawを使ったプログラムを組んでいて、そのプロジェクト内でFPSの制御関数(図1)を作りました。その関数は引数を1つ持っていて、その引数に渡した値がそのままフレームレートになるはずなのですが、実際は引数に指定した値よりもフレームレートが落ちています。   図1 FpsControl(60); ↑           1/60フレームレート FPS制御をしていない時にFPSを計ったときには500~600fps は出ていましたので処理自体が遅いわけではないと思います。 FPS制御関数はメッセージループ部分(図2)で使っています。   図2 while(TRUE){ //メッセージがある場合 if(PeekMessage(&msg,NULL,0,0,PM_REMOVE)){ if(msg.message == WM_QUIT) break; TranslateMessage(&msg); DispatchMessage(&msg); }else{ //メッセージが無い場合 if(FpsControl(60))Game_Main();//プログラ ムのメイン部分 ↑    ↑ }        ↑                   ↑                **ここで使ってます** 関数の内部処理は何度も確認したので間違ってないと思います。 ずっとこのバグについて考えいろいろ試しましたが、 結局原因はわからずここに助けを求めに来ました。 お願いします。

  • C#/C++を使って3D画像をゲーム画面に表示

    C#/C++に3Dグラフィック画像を使ってゲーム制作をしようと考えてるんですが、3D画像をゲーム画面に表示させるときに、どのようなプログラム処理内容を打って画像の描画を行わせれば良いのか、そこを教えてください。 後付け足しで、3Dグラフィック画像とドット絵の画像をC++ではどのフォルダーに保存しておけばよろしいですか? 3D画像をどうしてもゲーム画面に表示させるようにしたいので方法をお願いします。 わかりやすいプログラム・説明の回答を待ってます。 宜しくお願いします。

  • マインクラフトのFPSについて...

    マインクラフトのFPSがグラフィックボードの性能に対してあまりにも低いので質問させていただきました。 PCのスペックはこのとうりです。 CPU(APU) AMD A10 5800K BE メモリ DDR3 4GB×2 電源 80plus GOLD 750W OS Windows Vista 32bit←私はこれが原因かと思いましたが、APUでやったときも同じOSなので関係ないと思います。 グラフィックボード サファイア RADEON HD7850 (デフォルトのクロック GPUクロック860MHz メモリクロック1200MHz) 今まではAPUのHD7660でマインクラフトをやっていました。 このときは120%ぐらいOCしてFancy+Farで平均90~100fpsぐらいでした。 しかし、BF3などのゲームもやりたいと思ったのでHD7850を購入しました。 グラボのクロックは変えずに(デフォルト)マインクラフトをやってみたところFancy+Farで30~40fpsぐらいしかでませんでした。 仕方がないのでグラボをGPUは900MHzまでメモリは1280MHzまでOCしましたがfpsはあがりませんでした。 なら逆にとクロックをGPUは300MHzメモリは150MHzまでクロックダウンしましたがFPSは変化なしでした。CPUの処理が追いついていないのか?と思いましたがそれなら内蔵GPUのときも同じfpsなはずなので......... 僕はPC関係はあまり強くないのでよくわかりません。回答よろしくお願いします。