トップページgamedev
981コメント424KB

ゲームプログラミング相談室【Part6】

■ このスレッドは過去ログ倉庫に格納されています
0001名前は開発中のものです。04/03/06 01:25ID:d2e/eEyg
ゲームプログラミング全般の質問スレッド。
扱う話題のダイナミックレンジはやや広め。包容力高め。
他の初心者質問スレとの棲み分けを探りつつ
これからもマターリと活用しておくれ。
 
■過去スレ
【Part2】http://pc.2ch.net/tech/kako/985/985540361.html
【Part3】http://pc.2ch.net/tech/kako/1002/10028/1002894129.html
【Part4】http://game.2ch.net/gamedev/kako/1005/10050/1005040025.html
【Part5】http://pc2.2ch.net/test/read.cgi/gamedev/1036410116/
■関連スレなど
>>2-5
0041名前は開発中のものです。04/03/15 19:08ID:JehxVOt7
半透明ポリゴンのZソートを高速に行う方法を教えてください。
検索をかけたのですが、アルゴリズムを見つけられませんでした。

今やってるやり方は、
3角形の重心を透視変換して計算したZ値 0.0〜1.0を
もとにクイックソートをつかって並び替えています。

この方法が一般的でしょうか?
0042名前は開発中のものです。04/03/15 19:49ID:cPa+rKUo
いいんじゃない
0043名前は開発中のものです。04/03/15 23:18ID:TVsWtjPx
俺がこの前作ったゲームは、面倒だったのでstable_sort一発にしてしまった。
仮のつもりだったのに何の問題もないから不思議だ。富豪的プログラミングマンセー
0044名前は開発中のものです。04/03/16 16:37ID:/Nn0fi6h
>>41
0.0〜1.0の値を、たとえば0-255とか0-1023の値にマッピングする。
あとは256個なり1024個なりのインデックステーブルを用意して、
マップした値のテーブルにポリゴンを登録する。

全部の登録が終わったら、テーブル順に描画すればいい。
0045名前は開発中のものです。04/03/16 20:05ID:JP2lEbCQ
バケツソートですな。
0046名前は開発中のものです。04/03/16 23:07ID:wJFvxNHa
>>41
「Bitonic sort」これって関係あり?
当方、画像プログラムをやった事の無いヘタレなんで、
もし勘違いだったらスマソ。
t-potさんところが詳しいです。
0047名前は開発中のものです。04/03/16 23:40ID:ktbTl6+f
これは一種の未来技術かと。
00484104/03/17 01:12ID:Bz6qtYMx
>>44
ありがとうございます。

Z値をある程度の配列に割り振って、
精度的に問題があれば配列の数を増やしていくということですね。

ただちょっと疑問があるのですが、
インデックステーブルが 100 などの値でなく
256、1024 のように2の乗数なのはなにか理由があるのでしょうか?

Z値1.0から1024個のインデックスを求めるときには
int index = (int)(z * 1024.0f);
といった具合に計算するのでしょうか?
0049名前は開発中のものです。04/03/17 15:40ID:7fGZz4Ir
>>48
単純にシフトで計算しやすい値というだけの話。別に10個でも100個でも1000個でも
好きな数を割り当てればいい。
それから、ある1つのテーブル要素に対して複数のポリゴンが割り当てられる可能性を
考慮して組むこと。具体的にはインデックステーブルをポインタテーブルにして、リンク
各要素からリンクリストがぶらさがるようなイメージかな。
0050名前は開発中のものです。04/03/18 09:07ID:8j8lQKul
OTってやつ?
0051名前は開発中のものです。04/03/18 09:47ID:B+MnpSym
OTZではない。
0052名前は開発中のものです。04/03/19 23:21ID:xSnIz48S
on
0053名前は開発中のものです。04/03/24 09:40ID:HbaECddB
QVGA(320×240) の解像度ってどんなグラフィックカードでもサポートしてる?
0054名前は開発中のものです。04/03/24 10:02ID:6y/xMBfw
してないと思った方がいい
320*240で処理して640*480へ拡大bltがいいだろう
0055名前は開発中のものです。04/03/29 09:22ID:htU9rKwG
>>41
ちょっと複雑になるけど、BSP(2分空間分割)木を使ってもできると思う。
それぞれの半透明ポリゴンを一つのノードとして半透明ポリゴンモデルの
BSPデータベースを作っておいて、
ランタイムで、
・BSP空間へ視点を変換。
・視点の裏面になるノードを選び続けて、葉(末節)に達したらそのノードの
半透明ポリゴンをバーテックスバッファにコピー。
・以降、木を表面に遡っていけば、結果バーテックスバッファにポリゴンが
ソートされている。
ノード毎に視線ベクトルと面の内積を計算しなきゃいけないのが難か?
素直にソートした方が早そうだ。
0056名前は開発中のものです。04/03/29 09:26ID:htU9rKwG
>>48
>int index = (int)(z * 1024.0f);

z=0.0のとき index=0,
z=1.0のとき index=1023
にしたいんだから、
int index = (int)(z * 1023.0f);
0057名前は開発中のものです。04/03/29 12:02ID:iNk+Kk8E
いつでも60fpsを目指した結果以下のようなコードになったのですが
なんかもう頭が混乱して自分でやってることが良くわからなくなってしまいました。
一応思ったとおりに動作するのですが、どうも不安です。
改善点などのアドバイスをお願いします。

DWORD fps60wait[] = {17,17,17,16};

ima_time = timeGetTime();
dtime = ima_time - sakki_time;
if ( dtime < 11 )
{
 lpDD->WaitForVerticalBlank(DDWAITVB_BLOCKBEGIN, 0);
}
counter = (counter % 4) + 1;
wait = fps60wait[counter - 1];

do {
 ima_time = timeGetTime();
 dtime = ima_time - sakki_time;
 Sleep(0);
} while(dtime < wait);

sakki_time = ima_time;

<描画>
<処理>
0058名前は開発中のものです。04/03/29 13:33ID:1rpdsxXj
>>57
Windows環境のプログラムでしょ。なぜ60FPSにこだわる必要があるんだろう。
>>33参照。
00595704/03/29 23:22ID:iNk+Kk8E
>>58
60FPSは実はどーでもいいんですが
既に60固定で作っちゃったんで>>57に問題がないか知りたいんです。
>>33はとにかくVSYNCは無視しろってことですよね。
0060名前は開発中のものです。04/04/03 11:39ID:RYYtnws6
ゲームを作るうえでいきなりシュミレーションゲームを作る
のはやはり無謀でしょうか?
もっと簡単なのから作るのが普通でしょうか?
0061名前は開発中のものです。04/04/03 12:04ID:4VZfUvkc
>>60
シミュレーションってウォーシミュレーション?
ならここ↓の問題設定で手も足も出ないと感じたら
http://pc5.2ch.net/test/read.cgi/gamedev/1079745509/
ブロック崩しとかから五目並べみたいなのからやってみた方がいいと思う。
サンプルも探しやすいしね。
00626204/04/03 14:32ID:c0YQngLd
動く絵を表示させるプログラムで、綺麗にプログラムを書きたいと思っているのですが自分ではどうにも・・・。
とりあえず自分がいま使ってるやり方を書きます。

if(a>1&&a<10){
a++;
1枚目の絵を表示させる}
if(a>11&&a<20){
a++;
2枚目の絵を表示させる}
if(a>21&&a<30){
a++;
3枚目の絵を表示させる}
if(a==30)
a==1;

こんな感じで動く絵を表示させているのですが、どうも見た目が汚いと思います。
うまい方々はこうゆうプログラムをどう書くのでしょうか?
0063名前は開発中のものです。04/04/03 14:40ID:J+xYk8BN
aってナニ
絵ってナニ
いつ実行してるの
00646204/04/03 15:06ID:c0YQngLd
aは整数の変数を表しています。
絵というのは絵1・絵2・絵3でパラパラ漫画の用になっています。

つまり、これは段々と絵が1・2・3へと変わっていくプログラムです。
自分がしたい事はメインのループを10回ループすると絵が1枚づつ変わっていくようなものです。

わかりましたでしょうか?
0065名前は開発中のものです。04/04/03 15:39ID:EgtzjyXv
Picture *lPicture[3];
int indexPic = 0;

lPicture[0] = &picture1;
lPicture[1] = &picture2;
lPicture[2] = &picture3;

for(int i=0; ; i++)
{
  if (i%10 == 0)
  {
    indexPic ++;
    if (indexPic > 3)
    {
      indexPic = 0;
      i = 0;
    }
  }
  DrawPicture(lPicture[indexPic]);
}
0066名前は開発中のものです。04/04/03 15:52ID:sI/6/JHP
>>62

こんな感じで、タイマー使ってやんないと、まともにタイミング取れないと思う。
タイマーは独立したスレッドで、タイマー満了コールバックとかでやる方法もある。

const int numPictures = 20; //フレーム数20枚
const float secPerFrame = 0.1f; // 1フレーム0.1秒=毎秒10枚
int idx = 0;
float sumDt = 0;
long prevTime = timeGetTime();
while( true )//永久に
{
 float dt;
 long currentTime = timeGetTime();
 dt = float(currentTime - prevTime)/1000.0f;
 prevTime = currentTime;
 sumDt += dt;
 if( sumDt >= secPerFrame )
 {
  //idx番目の絵を表示
  idx++;
  if( idx == numPictures )
   idx = 0;
  sumDt = 0;
 }
}
0067名前は開発中のものです。04/04/03 21:02ID:3azEgRom
>>62 正直やりすぎた
template<unsigned int Max, typename Son = EmptyCounter>
class LoopCounter
{
protected:
  Son       m_Son;
  unsigned int  m_Count;
public:
  LoopCounter() : m_Count(0) {}
  bool Inc()
  {
    if (m_Son.Inc())
    {
      if (++m_Count == Max)
      {
        m_Count = 0;
        return true;
      }
    }
    return false;
  }
  unsigned int Get() const { return m_Count; }
};
struct EmptyCounter
{ bool Inc() { return true; } };
//作成
  LoopCounter<3, LoopCounter<10> > AnmCounter;
//ループ
  Draw(AnmCounter.Get());
  AnmCounter.Inc();
00686204/04/03 22:16ID:c0YQngLd
返答ありがとうございます。
とりあえず、すべて試してみようと思います。
0069名前は開発中のものです。04/04/03 23:32ID:UsdbLZaC
そもそも、アニメを制御するのに切り替えをプログラムで直接書こうという
考えから改めるべきだな。
データを読み取って、指定された時間に指定された絵を書くプログラムを書け。
0070名前は開発中のものです。04/04/05 09:52ID:VdLSCHpK
教えて君で申し訳ないけど、
ネットリソースではなかなか見つからなかったので質問させてください。

2Dアクションゲームでモーション中に別モーションを呼ぶ場合、
(例:ダッシュ中にパンチ、パンチキャンセルでキック等など)
モーション要求はスタックに積むのが常道でしょうか?

ダッシュとジャンプはそれぞれ加速度と重力変数で判別できるのですが、
キャンセル系について、たとえばガードキャンセル+パンチキャンセル+キックといった
コマンド技に似たもので、自分がどんなことをしてきたかの遷移がわからないのです。

一応コーディングしてみると、直前モーションを保存するとif文の数が40個ぐらいになってしまいました。
STLって何?っていう厨房なので、スタック以外にも方法があればご教授おねがいします m(--)m


0071名前は開発中のものです。04/04/05 17:41ID:Wxg2TEwm
>>70
スタックに積む=1モーション完了して次モーション
だと、いわゆるスト2の「キャンセル」っぽい動きにはならない。
ちなみにスト2のキャンセルは行きと戻りのモーションがあって、
行きモーション中にコマンドが成功したら戻りを「キャンセル」して
次モーションにつながることから。おそらく行きモーションと戻り
モーションが別コントロールになってるんだろうね。
どういう動きをさせたいのか頭の中を整理してみるほうがいい。
0072名前は開発中のものです。04/04/05 17:44ID:rH0o4MFm
3Dゲーつくってます。
主人公キャラの位置をRAYにして、地形と障害物とのあたり判定をしようと思っています。
とりあえず、移動方向に1フレームの移動分だけレイを飛ばして速度ベクトルをその真下にしました。
地形に沿って移動はできるのですが、この方法では主人公とおなじ高さで垂直に立ってる壁とか、こっちに向かって傾斜しているポリゴンがあると困ります。
はじめにレイを進行方向に飛ばすときもあたり判定を計算すると2倍の計算量になってしまいますが、仕方ないのでしょうか。
0073名前は開発中のものです。04/04/05 20:32ID:WG5Tm/kb
>>72
何を言いたいのかさっぱりわかりません。

もっとわかりやすく書いて、
改行も入れてください。
0074名前は開発中のものです。04/04/08 01:27ID:VoayxJMR
計算量を減らすようにすればいいんじゃねぇか?
どんなやり方してるかしらないけど。
アタリを分割すれば計算量は抑えられる。
AABBツリーを調べてみて。

0075名前は開発中のものです。04/04/13 02:27ID:00yuZNJk
スーパーマリオブラザーズみたいなのを作ろうと思ってます。
今のところスクロールまで作ったのですが、画面のちらつきが気になってしかたありません。
一応バックバッファに描いてから転送するようにしています。
http://gamdev.org/up/img/475.zip

よければ解決策を教えてください。
0076名前は開発中のものです。04/04/13 11:44ID:tK3wV3VD
特にちらついてないように見える
もしかしてティアリングのこといってるの?
0077名前は開発中のものです。04/04/13 12:33ID:xi3HdIxL
>>75
「リフレッシュレートに関する論争」スレでも検索してみるといいことがあるかも。
解決しようとするとちょっとした闇に踏み込むことになるので、覚悟するように。
00787504/04/14 00:41ID:s1vwKqYY
まさにそのティアリングってやつですね、たぶん。
スレを読んだりして見ましたけど、なんかめんどいんでこのまま進めることにします。
余力があったら考えてみたいと思います。
ありがとうございました。
0079名前は開発中のものです。04/04/14 01:24ID:fCb1f0Lh
フルスクリーンモードにしてフリップ使えば大概ティアリングは解消できる

が、垂直同期周波数が環境によって違うことも多いために
垂直同期とってもゲーム内の描画とのずれでカクカクしてくることもある

その辺がばっちり解決してもWinがリアルタイムOSでない時点で完璧には無理

どの辺で妥協するかが重要と思われ
タイマとフリップ併用が一番いいと思うけどね
0080名前は開発中のものです。04/04/14 02:16ID:bV4eSf3V
リフレッシュのタイミングとゲームのタイミングが完全にシンクロしない限り
RTOSでも無理だから。
0081名前は開発中のものです。04/04/16 17:56ID:6nIx9Yzb
はじめまして
とあるPDAで擬似的な3DのGAMEを作りたいと思っています。
2Dではいくつか作って公開していますが、PDAの3Dの場合
自力で書くしかないでしょう。
今、市販されている3DプログラミングものはDirextXを利用した3Dエンジンを使用したものが
多いですね
そうではなく自力で(ある程度はしょったモノになると思います。PDAだから)3Dを書きたい人におすすめな
書籍(もちろんWindows95前後の頃のものだと思うのですが)のタイトルと簡単などういう感じか
教えてもらえないでしょうか?

※こういった質問はここでよろしかったでしょうか? よろしくお願いします。
言語はCもしくはC++です。
上げさせていただいてもいいでしょうか?
0082名前は開発中のものです。04/04/16 18:03ID:ApfI3JPr
>>81
D3Dのマニュアル
00838104/04/16 18:15ID:6nIx9Yzb
>>82
申し訳ありません D3Dとは何かの略でしょうか?
検索してみたのですが 海外の会社ばかり引っかかるようです
フルネームを教えてくださいませんでしょうか?
お手数をおかけしますがよろしくお願いします
0084名前は開発中のものです。04/04/16 18:23ID:ApfI3JPr
>>83
Direct3Dだよ。

基礎知識のページに
ジオメトリやトランスフォーム、ラスタ化ルールとか
入門に必要な情報はみんな書いてある。
00858104/04/16 18:43ID:6nIx9Yzb
ありがとうございます!! Direct3Dですね
MSのサイトが引っかかりました。
ttp://www.microsoft.com/japan/msdn/academic/Articles/DirectX/01/

基礎知識のページとはここでいいでしょうか?
あとDirect3Dのヘルプにも詳しいそうですね。
0086名前は開発中のものです。04/04/16 19:29ID:ApfI3JPr
>>85
http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/DirectX9_c/directx/graphics/programmingguide/gettingstarted/gettingstarted.asp

ここだけど、3Dトランスフォームとかの文章がなくなっちゃってるね。
DirectX7.0迄のマニュアルを落としてきて参照するのがいいかと。
00878104/04/16 20:07ID:6nIx9Yzb
>>86

ありがとうございます。
ttp://www.microsoft.com/downloads/details.aspx?FamilyID=3a9531f6-577c-4748-b59c-2197014f544e&displaylang=ja
より DirectX7.0ドキュメントを落としております。
感謝しています。

あのう…… 非常に図々しいのですがDOSの時代ってDirectXとか無かったわけですよね
DOOMとか…… あのころの技術とこのDirectX7.0に載っている技術とは基本は変わらないと思っていて
いいでしょうか?
DOOMでは、見えないモノは書かない、省略、上下の省略などで稼いでいたようですがこれってこれから
生まれた技術でしょうか? ちょっとWindows以外なのでDOOMが参考になるかと検索しているんです。
きっちりとした3Dを必要としてないものですから 

それと同時に3Dの基本の情報を知りたかったのでこちらは本当に助かりました。
本当にありがとうございます。
00888104/04/16 20:15ID:6nIx9Yzb
CMAGAZINEの 2000年 1月号にDOOMの仕組みと
2002年 6月号に3Dダンジョンの作成と表示の基本アルゴリズム(DOOMも絡む)
がありますね

これを求めたいと思います
他の人の参考になれば。
0089名前は開発中のものです。04/04/16 21:26ID:1fUHdakN
>>81
似非3DならダンジョンマスターとかWizardryとかそっち系のほうがいい気がしないでもない
0090名前は開発中のものです。04/04/16 22:18ID:CYG69g6n
>>89
その手のも作っては見ますが、升目式ダンジョンではなく同じような感じの道が
ないようにしたいわけです。
なんとなくそらで道を覚えられるみたいな感じに出来たらと考えていますので。
0091名前は開発中のものです。04/04/16 23:40ID:bAbJcDxy
>81
キャノンからでたRenderWareの分厚い本。
3Dエンジンを作るにあたって生じた技術資料を適当にまとめて
「プロご用達!」などとうたって1万前後で販売!
CDにはRenderWareが入ってるが、これを使ったソフトを配布してはならないという罠。
クラリオンに聞くと「学習用ですので」。氏ね。
00928104/04/17 00:32ID:KupmHoyY
>>91
それってプロ御用達と学習用と矛盾してますな。誰が見てもわかるところに
これを使ったソフトの配布禁止と書かれていて、学習用と書かれているのでしょうか?
(だったらこんなに怒るわけないよな……)
とあるソフトのマニュアル的なものなんでしょうねえ

そういう3Dプログラミング物多いですよね 以外と。
0093名前は開発中のものです。04/04/17 01:28ID:a3IXbRjM
>>81
3Dプログラミングってどう言ったレベルを想定してるか分らないが
自前実装って言うならラスタライズやら必要だよね?

"コンピュータグラフィックス 理論と実践"

辺りで良いんでないの?12000円と手頃だし。
特定ハードに依存(API等)しない
3Dの数学的理論、3Dの工業的理論(汎用的なコンピューター理論)
を身に付ければ、自前実装はスグできるようになる。

その前に、実装実機の理解は必須だと思うけど。
0094名前は開発中のものです。04/04/17 03:02ID:mkUkAsvi
>>93
この本ってさ、1つの話題に対しての密度薄すぎねぇ?
技術の名前だけのってて「はぁ?こりゃなんも説明できてねぇよ」
ってのが多々あるぞ。
式出したらせめて各変数の意味ぐらい書いとけってのが多々あってムカツク。
0095名前は開発中のものです。04/04/17 05:17ID:a3IXbRjM
>>94
自分のレベルに合わない本は、皆そう感じる物じゃない?
それに、自分の望むチャプターのみで、更にそれが根ほり葉ほり事細かな内容ってありえないでしょ。

DirectXのhelp読んで、
>1つの話題に対しての密度薄すぎねぇ?
>技術の名前だけのってて「はぁ?こりゃなんも説明できてねぇよ」
>式出したらせめて各変数の意味ぐらい書いとけ
何て言い出す人間の大半は
プログラムとC++と3Dプログラミングの基礎を持ってから読もうねって、感じの人間が多いと思う。
それと同じかな…?って思うけど…

違うなら、不満や不足に感じる部分は、他の本や他の情報源、
そして自分の頭で解決ってなる物でしょ?
幾ら何でも、答え頂戴、全部教えて、クレクレって方針はありえないでしょ。

普通に数学の基礎とハードの基礎とプログラムの基礎を持って読めば
十分な内容でしょ、12000円程度の価格なんだし。

0096名前は開発中のものです。04/04/17 07:53ID:Le5gnz+v
>>94
あんた序文や前書きちゃんと読んでるか?
俺はこの本は持ってないが、
同系統の「Real-Time Rendering」だと
「各トピックについて深く知りたい場合は、
参考文献を充実させたのでそちらを参照してくれ」
ってちゃんと書いてあるんだが。
0097名前は開発中のものです。04/04/17 09:41ID:VEtZ9nxQ
>>95 >>96
はてさて、どちらが正しいのやら。
>>95の方が読んだ事無いように見えるけど
0098名前は開発中のものです。04/04/17 16:07ID:a3IXbRjM
>>96
>同系統の「Real-Time Rendering」
両方もってるが、全然同系統じゃないぞ。
Real-Time Renderingの方は原本の奴で英語だけど。

コンピュータグラフィックス 理論と実践は
主にはCGをコンピューターで扱う原理を解説してる。
点を定義してそれらを結んでピクセルを塗る原理(ライスライズ)とか
つまり、普段はハードやらAPIが処理してる低レベル部分の理論的説明が主。
つまり、3Dソフト自体を開発したり、
DirectX使わないでWindowsでポリゴン自力描画(WinAPIは使うけど)実装したり
(勉強で昔やった)って勉強が出来る。

Real-Time Renderingはその名の通り、もうダブルバッファ前提で
いかにリアルタイムで処理時間を稼ぐとかの技術が主にある。
しかも、参考文献ってさ、文献として上がってる
本の著者と名前が載ってるだけだと思うが?

コンピューターCGの本と3Dプログラムの本、同系統では無いと思うけど?
0099名前は開発中のものです。04/04/25 12:00ID:dZ+uD0u1
戦闘シュミレーションゲームつくるのに
Cは向いていますか?
またいいツールとかありませんか?
0100名前は開発中のものです。04/04/25 12:06ID:JYGTOjaq
どういう物かはわからんが言語はまず関係ないと思った方がいいぞ
0101名前は開発中のものです。04/04/25 12:14ID:dZ+uD0u1
ということはCをちゃんと使えるようにさえなれば
作れると言うことですか?
今勉強中ですが、Cってゲーム作れるのか?
と不安になってきました。
絵の表示の仕方がいまだにわかんないし・・・
0102名前は開発中のものです。04/04/25 12:17ID:JYGTOjaq
逆にいえばその程度でつまずくなら(失礼)Cにこだわる必要ないんじゃないの?
絵を表示するコードが1行の命令で、画面の初期化もらくちんって環境は
世の中にたくさんあるよ。

Cの利点は何でもやろうと思えば細かいことは出来るというだけで
その利点もハードガリガリアクセスする環境ならともかく
Winとかだとほとんどメリットないね
0103名前は開発中のものです。04/04/25 12:29ID:dZ+uD0u1
そうですか・・・
ちなにみ皆さんはこういうゲームを作るときは
どの言語を使ってるんですか?
0104名前は開発中のものです。04/04/25 13:14ID:JYGTOjaq
確かに言語によってと喰い不得意はあるものの
結局使い慣れた物が一番だと思う

最近はスクリプト系も結構あるから言語になれて内人はそっちがいいかな
俺はやはりC/C++を長くやっていたから言語体系が近いjavaとCだな
C++で中途半端なオブジェクト指向やるくらいならjavaいったほうがいいし、
シンプルにガリガリ叩くときにはCって感じ
javaだと画像表示やらシステム部分に時間をかけないでゲームの処理のみに
専念できてる感じがいい
Cとかはもちろん必要コード量が多くなるのでライブラリ整備が必須になって
変にシステムをいじってばかりでゲームに専念できないことも多い^^;

>>103がさわれそうな環境はC以外になにかあるの?
画像表示からうまくできてないということはDIBやらDirectXから出来るようになるには
かなり時間かかると思うから他を勧めたい
0105名前は開発中のものです。04/04/25 13:34ID:dZ+uD0u1
親が自営でC++のプログラマやっているので
もっとも勉強しやすい環境にあるのはCだと想います。

こだわりと言うわけではありませんが、
できればCで作りたいと思っています。

>画像表示からうまくできてない
まだ勉強中なのでそこまで達していなのかもしれません
一応C入門の本は1冊読んだのですが・・・
0106名前は開発中のものです。04/04/25 14:07ID:vDhsPj0U
「高校受験したいんです。小学校の課程は修了しました」
みたいなもんだな。

CでやるとしてもまずはコンソールじゃなくWindowsプログラミングやらんといかんし。
まーいっそコンソール&glutって手もあるが。
0107名前は開発中のものです。04/04/25 14:22ID:JYGTOjaq
そもそも言語が分かってさらにGUIまわりも分かっていても
ゲームプログラムが全く出来ない人もたくさんいる

ゲームに必要な知識と、そのプラットフォームで絵を出すとか
システムに必要な知識は全く別物なわけで

逆にスタンドアロンのゲームは作れるけどウインドウシステム上での
ゲームは作れないという人もいる

今のちみの状態は分からないことが多すぎかと
言語自体も本読んだというレベルなら表面上のものだけだと思うので
ポインタガンガン使えるというレベルまで言ってないと思われ

一番重要なのは目的がゲームを作ることなのか、それともC言語を
勉強したいのかってところだよ

昔はC言語&ゲーム作りたいってことが多かったと思うけどこれは
生産性を上げつつマシンスペックが低かった時代これしか選択肢がなかっただけ
8bit時代BASICでゲーム作って遅かったのでしかたなくハンドアセンブルへ
そして16bitになりメモリが多少裕福になってC言語へって人は多いはず

言語が目的ではないんだよ
それにプログラマは複数の言語が使えるのが普通
1つの言語で今後もいくとは思えない
0108名前は開発中のものです。04/04/25 14:52ID:dZ+uD0u1
とりあえず今ある知識でゲーム作ろうというのが、
かなり無謀だったみたいですね。
もちろんゲーム作成が目的ですが、
今は置いておいて、Cをがんがん使えるようになろうと思います
0109名前は開発中のものです。04/04/25 15:36ID:RwxVe3k8
まずCをしっかりできるようにして、
次にC++をいくらかかじって、
あとはDirectXに進めばOK。

このQ&Aってもう何度もされてるよね。
ゲームプログラミングのまともな入門サイトor本がないということだろう。
どうにかならないもんかね?
0110名前は開発中のものです。04/04/25 15:47ID:JYGTOjaq
昔はパソコンでのプログラム=ゲーム作るだったからな
それほど山のように雑誌はあった

ベーマガ、MSXFANなど読みやすくて分かりやすいシンプルな物がないからね
あとは個人レベルで作る物と商業レベルとでできあがる物が違いすぎるというか

でも昔から初心者向けと上級者向けはあってもその間の中レベル向けが
ほとんど存在しないと言う問題もあったよ

たとえばC言語は分かって絵も描画できる、でも具体的にゲームで必須な
垂直同期がなんなのかとかラスター割り込みがどうとかそういった物は
なかなかいいものはなかった

DirectXやるときC++よりCでやったほうが楽な気がする
0111名前は開発中のものです。04/04/25 15:58ID:+MyYZ79o
楽というか
綺麗な使い方が出来ないと思うC++
0112名前は開発中のものです。04/04/25 16:18ID:itt2Cin5
綺麗な使い方ってどんなの?
DirectXやったことないけど、呼び出すだけだからどっちでも一緒じゃ?
0113名前は開発中のものです。04/04/26 09:29ID:YvjKmIIw
CだとCOMを間接的に呼ばなければならないので、
綺麗な使い方には絶対にならない。
0114名前は開発中のものです。04/04/26 15:22ID:AM2u3eHS
>>113
いや、そういうことじゃなくて、アレだろ?
C++なんだけどC風に組むとかそんなんだろ。多分。

でも、C++風に組んだ方が楽だと思うけどね。俺は。
0115名前は開発中のものです。04/04/28 01:45ID:LxpA+NNA
>>111
潔癖主義かつ無能なら何を使っても汚く感じるだろう。
0116名前は開発中のものです。04/04/28 15:15ID:ELYXrsLP
いや、C++は特別だろ。
0117名前は開発中のものです。04/04/28 20:35ID:brIWsk8J
俺はC++でDirectX使ってるが、デザインはうっとりしてしまうほど綺麗にできてるよ。
なにが汚くなる可能性があるのか具体的に言ってみろばかー
0118名前は開発中のものです。04/04/28 20:38ID:YnOaqFHo
一人よがり
0119名前は開発中のものです。04/04/28 20:52ID:brIWsk8J
思わずモニタにティンコこすりつけたくなっちゃうくらい
清純可憐で微妙なエロスの漂う穢れのないコードかけてるっつーの
0120名前は開発中のものです。04/04/28 23:03ID:qRKYM2ci
じゃぁ見せろ
0121名前は開発中のものです。04/04/29 00:07ID:klVfh8nk
>>116
特別ですね。
言語レベルで厳格な貞操帯を装着しないと、猿のようにオナーニを
いえ独り善がりな汚いコードを書いてしまう無能には「C++は特別」です。
特別汚いコードを書ける言語です。彼等にとっては大きな問題です。
貞操帯を装着しなくても問題の無い一般人にとっては瑣末な問題です。
0122名前は開発中のものです。04/04/29 01:29ID:ZbXlsRAe
平和なやつらだ。C#とかDとか試してみたことないんだろうな。
0123名前は開発中のものです。04/04/29 03:54ID:w6BRdvWr
Dは処理系がひとつしかないし、バグバグだからなぁ
0124名前は開発中のものです。04/04/29 04:02ID:tELycjco
class CCharacter : public CEntity, public CRenderNode, public CCollisionNode {};

CEntityは自律行動を行うクラスで主にAIの更新を行う仮想関数Update()を持つ。
CRenderNodeはレンダラに登録され描画を行う仮想関数Render()を持つ。
CCollisionNodeはデフォルトの当たり判定を実装してあって衝突を検出したら仮想関数Collide()を呼び出す。

関連性のない3つのクラスからの多重派生ですがこれは邪道でしょうか?
また、みなさんはこの3つの要素をどの様にクラス化してますか?
ご意見お聞かせくださいませ。
0125名前は開発中のものです。04/04/29 04:54ID:ffNyJU4j
>>122
平和な奴だ。糞汚いコードを書いてばかりの低脳に
Java、C#、Dを試させてみたことがないんだろうな。

言語仕様上の規定(貞操)が厳格であるために
クルクルパーな悪性のハックは多少は減るが
やっぱりおかしなコードを書くんだよ。

馬鹿に付ける薬は無い。言語変えても駄目な奴は駄目。
0126名前は開発中のものです。04/04/29 05:01ID:dU1CdeTe
>>124
俺の場合、

class CCharacter : public CEntity

CRenderNode,CCollisionNodeはCCharacterのメンバ

理由は、描画リソース、コリジョンはいらないキャラのいるから。
例えば、ジェネレータとか。

とある理由で、CEntityをメンバにした事もある。
0127名前は開発中のものです。04/04/29 05:08ID:klVfh8nk
>>124
邪道・正道にはとやかく言及しないが
「〜Node」な2つの基底クラスの間で名前衝突が起きないってのが
ぶっちゃけあり得ない。背後にぐちゃぐちゃなメソッドの群れの気配がする。
0128名前は開発中のものです。04/04/29 08:15ID:0gA9laqu
>>124
肝心なのはその上位で、CCharacterのインスタンスの集合を管理しているクラスが
こいつをどういう風に扱うかにあると思う。
誰がどうやって生成して、どういうリストに組み込まれて、誰がメソッドを呼び出して、
誰がどうやって破棄している?
0129名前は開発中のものです。04/04/29 09:54ID:r5N/wC7K
>>124
俺はちょっと違うなCharacter以外はCharacterのメンバにする。
ちょっと>>124は機能とオブジェクトをいっしょにしてるのがよくなさげ。
継承で考慮するのはオブジェクト指向の説明でよく出てくる
犬と猫は哺乳類で・・・云々の話だけでいい。
もしEnemyなんてのが出てきたら、Characterから継承するって感じの使い方かな。

EntityやRender、Collisionなんてのは明らかに
Characterが所有しちょるものなのでメンバでいいと思う。
Characterより上の方のクラスに入れるかもしれないものもあるね。描画とか。

まあ、クラスのまとめ方が、複数のクラスの処理を一括してやろうと頑張りすぎてて、
かつ、これから継承するものの違いまでカバーしようとしている感じがする。正直うまくない。
まあ、処理で考えるなら、
衝突の検出なんてのは関わるもの同士によって必要な情報が全然違うから
一括処理なんて必要ないならしないほうがいいと思うよ。(仕様変更あると思うしw)
逆に描画なんてのはどれも同じ処理になるはずじゃね?
Characterもしくはその基底クラスがRenderなんて関数をもってればそれでいいような気がする。

AIクラスなんていったら、結構隔離できるクラスのような気がするが
実は他のクラスとの関連が一番多くなるクラス、また、他のクラスとの関連も一番特殊になるクラスだと思う。
何せAIの判断材料に他のクラスの情報が確実に必要になるからね。
AIってのはCharacterそのものになると思うんだけどどうだろうか?
例えばCharacterから範囲10以上に近づいたら、なんてやったらAIにCollisionのデータを使った衝突の検出が必要になるよね?
こういう処理自体をライブラリにするのはいいと思うけど、それに必要になる材料はもろにクラス同士の設計の関連になるわけで略w
013012404/04/29 13:08ID:tELycjco
>>126
CCollisionNodeをメンバにするのは考えましたが、
CRenderNodeをメンバにしてしまうと自身で描画コードを持てないので
描画情報を登録して後で一括描画してもらうって形ですよね。
この場合ちょっと複雑な事をやりたい場合にCRenderNodeに手を加えるハメになりそうですがどうでしょうか?
2Dなら描画形態は限られてくるのでメンバに持ってしまうかもしれませんが。
013112404/04/29 13:09ID:tELycjco
>>127
〜Node系は特定の機能を保有する事を保証するインターフェイスのような物なので今のところ名前の衝突はないですが、
拡張した場合に仰るとおりのぐちゃぐちゃなメソッドの群れになる可能性は大いにありますね。
013212404/04/29 13:09ID:tELycjco
>>128
生成は各entityが任意にnewしてEntity管理クラスに突っ込み、
entityMgr.Add(new CEnemy); // class CEnemy : public CCharacter

各entityが初期化時に必要に応じて描画管理クラスやコリジョン管理クラスに自身を登録してます。
renderer.Add(this);
collisionMgr.Add(this);

各管理クラスが全登録インスタンスの仮想関数 Update(), Render(), Collide() を呼び出しており、
entity間のやりとりはentityMgr経由でメッセージを送受信して行ってます。

破棄は自分自身でentity管理クラスに破棄要求を出してentity管理クラスがインスタンスをdeleteします。
entityMgr.Remove(this);

なんだか鬱設計ですね。
013312404/04/29 13:09ID:tELycjco
>>129
>>ちょっと>>124は機能とオブジェクトをいっしょにしてるのがよくなさげ。
>>EntityやRender、Collisionなんてのは明らかに
>>Characterが所有しちょるものなのでメンバでいいと思う
コリジョンや描画をメンバにするのはある程度納得出来るのですが、
自身の行動をメンバに委譲するってのはちょっとイメージが沸きません。
状態のみを委譲してそれを受けて自身の行動に変化をつけるのでしょうか?
たぶん違うぽ(つд`)

ゲーム内に登場するオブジェクトの殆どはCCharacter派生クラスだと思うんです。
確かに画面には表示されないステージ管理クラスや当たり判定を行わないスコア表示部分などはありますが、
それらは本当に限られてくるんじゃないでしょうか。
共通のインターフェイスやリソースを含んだCCharacterを定義して全てのキャラクタをそこから派生させた方が、
より汎用性があるかなーと思った訳です。
0134名前は開発中のものです。04/04/29 15:51ID:r5N/wC7K
>>132
管理クラスって作った奴が思うほど役に立たないことが多いから
もうちょっと設計考えて見た方がよくね?

>>133
>自身の行動をメンバに委譲するってのはちょっとイメージが沸きません。
どう組んでるのか詳細までは知らないけど、
結局、プロペラ付けたら空を飛んで欲しくて、車輪付けたら道を走ってほしいんでしょ?
ならそういう使い方でいいじゃない?

>共通のインターフェイスやリソースを含んだCCharacterを定義して全てのキャラクタをそこから派生させた方が、
>より汎用性があるかなーと思った訳です。
それはいいんだけど、継承を継承らしく使おうよって話なんだけど。
別にこう↓組んでも組めるっちゃあ組めると思うよ。
class CCharacter : public CEntity, public CRenderNode, public CCollisionNode {};
ただわかりづれぇって一点を除けばw
0135名前は開発中のものです。04/04/29 18:18ID:0gA9laqu
>>132
とりあえずそのノリなら漏れはついていけるから安心していいよ
邪道かどうかは別として、管理される側が自分を管理する側を知っているっていう
状態は改良できるとこだと思う
0136名前は開発中のものです。04/04/29 18:20ID:K2EIDtC0
おまえらそんな議論は学校いってるうちにすませとけや
0137名前は開発中のものです。04/04/29 20:30ID:klVfh8nk
>ゲームプログラミング相談室【Part6】
              ~~~~~~~~
問題は何もない。続けて良い。
0138名前は開発中のものです。04/04/29 21:45ID:0gA9laqu
邪道かどうかは別として、衝突判定が特別扱いされているのが気になる
なんでentity間のやりとりの一種として扱わないの?
0139名前は開発中のものです。04/04/30 02:06ID:zWQ1T1uk
>>130
スマン。やはり、CRenderNodeがどういったものか、理解せずに
答えたので、見当違いだったかも。

CRenderNodeは描画機能?をもっていて、描画する対象のインスタンスではない。
て事かな?
因みに俺はインスタンスを含むと思っていたので、あくまでも、メンバ(参照用のポインタ)という扱い。
(キャラと描画物が1対1ではないという事)

とあるミドルウェアでは、大概のクラスが、シーングラフノードの派生。という構造もあったし、
そういうのも面白いとは思うよ。
0140名前は開発中のものです。04/04/30 02:41ID:TdoOcGaP
これっ
014112404/04/30 04:19ID:r3mzBY0g
>>134
>>管理クラスって作った奴が思うほど役に立たないことが多いから
全AI更新→全衝突判定→全描画
こんな感じにUpdate()やRender()ってのは一括して呼ばれるのが普通だと私は思ってます。
誰かが管理して順番に呼び出した方がスッキリしているような気がしますがどうでしょうか?

管理クラスがない場合って生成されたEntityのUpdate()はどうやって呼ばれるのだろう。
各Entityを木構造のノードにして子or兄弟のUpdate()を連鎖的に呼び出すのか、
それともリストをグローバルで持ってメインループか何処かで呼び出す?
誰かに管理させた方が不用意にノードにアクセスされないだろうしこれが普通かなーと
思ってたんですが一般的ではないんですかね。

>>結局、プロペラ付けたら空を飛んで欲しくて、車輪付けたら道を走ってほしいんでしょ?
この部分の話の流れとしてはCEntityから派生せずに
メンバとしてCEntityを持ったほうがいいよって解釈でよろしいでしょうか?
実際に移動を行う処理やアニメーションを行う処理なんかはAIと分離すべきだと思うのですが、
AIの部分をメンバに委譲して且つ自分ではUpdate()を持たないとなると
自分自身は何も行動を起こせないただの入れ物になりますよね?
うーん。

>>それはいいんだけど、継承を継承らしく使おうよって話なんだけど。
それが引っかかってたので質問した訳です。そしたらその他の部分でボロが出まくる出まくる(;´Д`)
CRenderNodeやCCollisionNodeをメンバに持つってのはいいんですが
CEntityをメンバに持つメリットというか意味が理解できないのです。
■ このスレッドは過去ログ倉庫に格納されています