1 :
名前は開発中のものです。 :
04/03/06 01:25 ID:d2e/eEyg
2 :
名前は開発中のものです。 :04/03/06 01:26 ID:d2e/eEyg
。 ◇◎。o.:O☆οo. 。:゜ ◎::O☆∧_∧☆。∂:o゜ /。○。 ∂(*゚ー゚ )O◇。☆ / ◎| ̄ ̄∪ ̄∪ ̄ ̄ ̄|:◎: / ☆。|.. 新スレおめ .|☆ ▼ 。○..io.。◇.☆____| 。.: ∠▲―――――☆ :∂io☆ ゜◎∂:.
windowsでアクションRPGを作ろうとしています。 2Dで作りたいのですが、その場合の最適な方法を教えて 下さい。 DirectXのスプライトやテクスチャを使うよりひょっとして GDIを使った方が早いとか・・その辺どうなのでしょうか? プログラミングに関してわりと初心者なので、ご助言よろしく お願します。
>>4 DirectXとC/C++で作る。
描画まわりを自分で組むのは面倒だし、
よくわからないので誰かのライブラリを使わせてもらう。
誰のライブラリを使うかは自分で探す。
これでとりあえずゲームを作れる環境は整う。
GDI使え
>>4 2Dなら、GDI(DIBSection)の方が開発はやりやすい。
描画性能に関しては、少なくとも「画面への描画速度」は問題ない
場合が多い(内部への描画処理については、単純にメモリを読み書き
るDIBectionの方が有利な可能性もある)。また、スプライトは32
ビットフルカラーなどピクセル単位の処理を容易にできるシステム
でやる分には、ピクセルをすべて自力で処理しても大丈夫だろうね。
ただし「滑らかな画面更新」を重視するのなら、DirectXで全画面
占有タイプにした方が有利なことは有利かもしれない(開発の労力
は一気に増すがw)。
web上でゲームを公開しようと思っているのですが、 javaかflashだと重さを考えたらflashのほうがいいですか?
>>5-7 ご助言ありがとうございます。
とりあえずDirectGraphicsのテクスチャと
ヤネ氏のライブラリで速度を比べてみようかと
思います。(DirectX9.0には大分慣れたのですが、
Win32は、不慣れなので・・。)
DirectXのスプライトとテクスチャってどう違うの? 描画速度に違いはあるのかしら?
スプライトは概念、テクスチャは実装。
スプライトってのがD3DXSpriteのことを指してるなら、 それはテクスチャを含むDirect3Dのラッパーだよ。 で、ラッパーは常に元より遅い。 実際にどれくらい遅いかは知らん。 機能の違いは、2Dと3Dの違いだ。3Dは2Dを包含する。
14 :
名前は開発中のものです。 :04/03/13 03:10 ID:hBBXuD4r
みなさん、浮動小数点数の型はどうやって決めていますか? とりあえずは、思いつくのを列挙してみます。 ついでに、それぞれに個人的な意見を添えてみました。 1) 全部 double +ルールとして単純。 +ゲームプログラム以外では、ほぼ常識? -メモリ使用量が倍 -「浮動少数点」という言葉と直接繋がらないのが嫌。 2) 全部 float +ルールとして単純。 +見た目が美しい。 +メモリにやさしい。 +ゲームプログラムではほぼ常識? -精度が少なめ。 -環境によっては速度も double を下回る? 3) 目的別に typedef (float32,float64,fast_float,precise_float,...) +移植性が高い。 +目的がコードに直接現れる。 +後で変更できる。 -どれだけ、どんな名前で定義したらいいのか? -既存のインターフェースとやりとりするときに問題が? とりあえず、3が正解っぽいなぁ、と思っています。 これら以外の選択肢があれば教えてほしいです。 また、意見のところの、「?」が付いてるもの(特に3のもの)について、 より確かな情報をいただけるとありがたいです。
15 :
名前は開発中のものです。 :04/03/13 03:16 ID:5BV6NOnP
DirectX9はfloat中心の方が速度的にイイ?
>>14 Cだけど整数型でやっている。3を3000としたりして。
PS2なんかは単精度しかないんだっけか。 そのうちdoubleが標準になるんかねえ。 floatだと広大なフィールドをリニアに扱えんし。
20 :
名前は開発中のものです。 :04/03/13 18:14 ID:PUoUaF4y
ファイヤーエムブレムとかタクティクスオウガみたいなシミュレーションRPGを作ってるんだけど 敵の思考を考えるのが難しい プレイヤー側ユニットとの距離を調べる ↓ 一番近いユニットに近づく ↓ 攻撃できる距離だったら攻撃する みたいな感じで組んでるんだけど ・障害物 ・攻撃スキルの特性(2マス離れてても攻撃可、とか回復スキルとか) ・移動した後攻撃するか、攻撃したあと移動するか etc... そういう色々な要素が入ってくるとわけわからなくなる 素人は手を出さないほうがいいジャンルなんだろうか… なにかコツとかあったら教えて下さい
>>21 サンクスです
やはり難しそう・・・
やれるだけやってみます
いざとなったら要素削ってシンプルにするかな・・・
>>20 自分はFE風のを作った事があったが、その場合。
1:すべての移動できる位置、使用できるアイテムから、使用対象がいるか調べる。
攻撃系なら敵、回復系なら味方。複数あるなら効果が一番高いものを選ぶ。
攻撃系なら相手のHPを大きく減らせて(量ではなく%)、命中率がよく、
逆に相手からはそれが低くなるもの、回復系の場合は回復%、命中が高いもの。
同じアイテム、同じ対象に対して使用できる位置が複数あるなら、
地形効果が高い場所から行動する。地形効果が同じなら歩数が一番少ない所から。
2:1の対象がいない、または攻撃すると逆に自分に及ぶ被害のほうが大きそうな時、
移動のみを行い、強い味方によっていく、又は弱い敵によって行く。
地形効果はもちろん高い所へ。
1はカウンタで全部調べればよいので簡単だったけど、
2は抽象的なので思うように動いてくれなくて難しかった。
作る順序としてはまずは1を作ってみるといいと思う。
全部調べるから速度的に大丈夫かと思うかもしれないけど
使用可能アイテム4つ、移動力10以上でも、遅くても2、3秒以内だったと思う。
>>17 それは浮動少数でなく固定少数ですな
普通は1024(=2^10)とか4096(=2^12)を1とするのが速度的にいいよ。
2D時代は、2^8でずっとやってきたな。 ハードの制約だけど、その頃はこれが一番。
今もスケーリングを普通にやってるなー ↓みたいな感じで dest[0] = dest[0] + ((dest[0] - src[0]) * alpha / 256); ...
src[0] - dest[0]の間違いか・・・ MMX命令よりもSSE命令で今は行うのが一般的なのかな?
固定小数点をマクロにしとくと(・∀・)イイ /* 固定小数点型 */ typedef signed long fix; /* 整数⇔固定小数点 */ #define FIX_TO_INT( a ) (( a ) >> 16) #define INT_TO_FIX( a ) (( a ) << 16) /* 浮動小数点⇔固定小数点 */ #define FLOAT_TO_FIX( a ) (fix)(( a ) * 0xffff) #define FIX_TO_FLOAT( a ) ((float)( a ) / (float)(0xffff))
いっそクラスにする手もあり。 コンパイラを信じられる漢におすすめ。
30 :
名前は開発中のものです。 :04/03/15 13:23 ID:p3AFlJa9
Windowsのメッセージループで質問なのだけど、GetMessage()を使うのと、 PeekMessage()を使うのはどちらが主流なのかな? GetMessage()+SetTimer()はFPSが微妙に安定しないし、PeekMessage()だと CPUを100%使いかねない。 個人的にはCPUを100%使ってしかもムダ使いというのはマルチタスクOSでの プログラミングとしては礼儀違反と思うし、例えば落ちゲーとかブロック崩し なんかでCPU100%てのは納得もいかない。 SetTimer()での安定の悪さを考えて、1msecでWM_TIMERを発生させたあとに timeGetTime()で実際の時間を取得、ずれを調整するようにしてみた。 WM_TIMER自体が1〜20msecで発生しているようで、とても60fpsなゲームなんて 作れないなあと思った。 常識的な方法があるなら知りたい。
31 :
名前は開発中のものです。 :04/03/15 13:26 ID:p3AFlJa9
あともう一つ。 よくベンチマークで、400fpsとかいう数値があったりするけれど、 あれって何? 画面自体はせいぜい120fpsでるかどうかでしょ。 オレのモニタは液晶だから60だけど、CRTでも80とかじゃない? 400って表示しているFPSじゃなくて、演算可能な理論値ってことなのかな?
>CPUを100%使いかねない。 Sleep入れればいいじゃん。 >よくベンチマークで、400fpsとかいう数値があったりするけれど、 >あれって何? 画面自体はせいぜい120fpsでるかどうかでしょ。 blitやポリゴン描画なんかの処理とモニタに出力する処理はほぼ平行に行われるから そういう「描画処理」自体はモニタの同期信号の周波数とは関係ない。 普通HBLANKを待つから最大fps=リフレッシュレートなことが多い、というだけ。
33 :
名前は開発中のものです。 :04/03/15 14:54 ID:nFKOW0T2
>>30 GetMessageで。WindowsなどVブランクをシステムが管理している場合は
ゲームスピードをFPS基準にすべきではない。75Hzの人もいれば60Hzの
人もいるのでVブランクではなく時間を基準にすべし。WM_TIMERは200ms
程度の精度(実際は変動あり)しかないのでMultiMediaTimerを使うしかない
と思われる。
Vブランクに関係なく処理が終わったら画面更新という設計にしておいて、
アニメーションは時間単位で制御する方針で。
>>31 Vブランクを待たずに画面更新をした場合の1秒間のフレーム更新回数。
コンシューマゲームと違ってVSyncはシステムが管理しているので、描画
ラスターがどこにいるかは意識する必要がない。
FF風のRPGのゲームを作るプログラムは何が最適かな? 2Dで作りたいんですが。
FFのどれだよ
37 :
名前は開発中のものです。 :04/03/15 17:43 ID:p3AFlJa9
>>32 >>33 おー。レスありがと。30&31です。
そか、fps表示は理論値ってことだね。納得。
IDirectDraw7::WaitForVerticalBlankでVSYNC待ちをするよう
作っていた。そのあとでバックサーフェースからフロントサーフェースに
IDirectDrawSurface7::Bltで画面転送していたけれど、試しにVSYNC待ちを
削ってみても問題なく動作した。そういうものだったのか。
Blt後にGetScanLineでVライン位置を取ってみると1027〜1031くらいの
数値が出る(縦1024のモニタ)から、自動的にVSYNC待ちをしてたんだね。
無駄なことをしてたワ。
なるほど、Sleep()はtimeBeginPeriod()と使うと誤差が減るのか。
PeekMessage()+Sleep()を試してみるよ。サンクス!
VC.NET2003にて デバッグモードだと普通に動いてるのに リリースモードにするとエラります(;´д⊂) このような状況に陥る可能性にはどんな物があるでしょうか
39 :
名前は開発中のものです。 :04/03/15 18:33 ID:p3AFlJa9
>>38 メモリリーク。
あるいはライブラリとのデバッグ/リリースモードの不整合。
加えて ・変数、配列の初期化ミス ・配列や確保したメモリの境界を越えたアクセスにより他の変数が壊れた とかも。 いずれもデバッガじゃ追いにくいやつやね。 がんがれ。
41 :
名前は開発中のものです。 :04/03/15 19:08 ID:JehxVOt7
半透明ポリゴンのZソートを高速に行う方法を教えてください。 検索をかけたのですが、アルゴリズムを見つけられませんでした。 今やってるやり方は、 3角形の重心を透視変換して計算したZ値 0.0〜1.0を もとにクイックソートをつかって並び替えています。 この方法が一般的でしょうか?
いいんじゃない
俺がこの前作ったゲームは、面倒だったのでstable_sort一発にしてしまった。 仮のつもりだったのに何の問題もないから不思議だ。富豪的プログラミングマンセー
44 :
名前は開発中のものです。 :04/03/16 16:37 ID:/Nn0fi6h
>>41 0.0〜1.0の値を、たとえば0-255とか0-1023の値にマッピングする。
あとは256個なり1024個なりのインデックステーブルを用意して、
マップした値のテーブルにポリゴンを登録する。
全部の登録が終わったら、テーブル順に描画すればいい。
バケツソートですな。
>>41 「Bitonic sort」これって関係あり?
当方、画像プログラムをやった事の無いヘタレなんで、
もし勘違いだったらスマソ。
t-potさんところが詳しいです。
これは一種の未来技術かと。
48 :
41 :04/03/17 01:12 ID:Bz6qtYMx
>>44 ありがとうございます。
Z値をある程度の配列に割り振って、
精度的に問題があれば配列の数を増やしていくということですね。
ただちょっと疑問があるのですが、
インデックステーブルが 100 などの値でなく
256、1024 のように2の乗数なのはなにか理由があるのでしょうか?
Z値1.0から1024個のインデックスを求めるときには
int index = (int)(z * 1024.0f);
といった具合に計算するのでしょうか?
49 :
名前は開発中のものです。 :04/03/17 15:40 ID:7fGZz4Ir
>>48 単純にシフトで計算しやすい値というだけの話。別に10個でも100個でも1000個でも
好きな数を割り当てればいい。
それから、ある1つのテーブル要素に対して複数のポリゴンが割り当てられる可能性を
考慮して組むこと。具体的にはインデックステーブルをポインタテーブルにして、リンク
各要素からリンクリストがぶらさがるようなイメージかな。
OTってやつ?
OTZではない。
on
QVGA(320×240) の解像度ってどんなグラフィックカードでもサポートしてる?
してないと思った方がいい 320*240で処理して640*480へ拡大bltがいいだろう
55 :
名前は開発中のものです。 :04/03/29 09:22 ID:htU9rKwG
>>41 ちょっと複雑になるけど、BSP(2分空間分割)木を使ってもできると思う。
それぞれの半透明ポリゴンを一つのノードとして半透明ポリゴンモデルの
BSPデータベースを作っておいて、
ランタイムで、
・BSP空間へ視点を変換。
・視点の裏面になるノードを選び続けて、葉(末節)に達したらそのノードの
半透明ポリゴンをバーテックスバッファにコピー。
・以降、木を表面に遡っていけば、結果バーテックスバッファにポリゴンが
ソートされている。
ノード毎に視線ベクトルと面の内積を計算しなきゃいけないのが難か?
素直にソートした方が早そうだ。
56 :
名前は開発中のものです。 :04/03/29 09:26 ID:htU9rKwG
>>48 >int index = (int)(z * 1024.0f);
z=0.0のとき index=0,
z=1.0のとき index=1023
にしたいんだから、
int index = (int)(z * 1023.0f);
いつでも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; <描画> <処理>
>>57 Windows環境のプログラムでしょ。なぜ60FPSにこだわる必要があるんだろう。
>>33 参照。
59 :
57 :04/03/29 23:22 ID:iNk+Kk8E
>>58 60FPSは実はどーでもいいんですが
既に60固定で作っちゃったんで
>>57 に問題がないか知りたいんです。
>>33 はとにかくVSYNCは無視しろってことですよね。
60 :
名前は開発中のものです。 :04/04/03 11:39 ID:RYYtnws6
ゲームを作るうえでいきなりシュミレーションゲームを作る のはやはり無謀でしょうか? もっと簡単なのから作るのが普通でしょうか?
62 :
62 :04/04/03 14:32 ID: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; こんな感じで動く絵を表示させているのですが、どうも見た目が汚いと思います。 うまい方々はこうゆうプログラムをどう書くのでしょうか?
aってナニ 絵ってナニ いつ実行してるの
64 :
62 :04/04/03 15:06 ID:c0YQngLd
aは整数の変数を表しています。 絵というのは絵1・絵2・絵3でパラパラ漫画の用になっています。 つまり、これは段々と絵が1・2・3へと変わっていくプログラムです。 自分がしたい事はメインのループを10回ループすると絵が1枚づつ変わっていくようなものです。 わかりましたでしょうか?
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]); }
66 :
名前は開発中のものです。 :04/04/03 15:52 ID: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;
}
}
>>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();
68 :
62 :04/04/03 22:16 ID:c0YQngLd
返答ありがとうございます。 とりあえず、すべて試してみようと思います。
69 :
名前は開発中のものです。 :04/04/03 23:32 ID:UsdbLZaC
そもそも、アニメを制御するのに切り替えをプログラムで直接書こうという 考えから改めるべきだな。 データを読み取って、指定された時間に指定された絵を書くプログラムを書け。
教えて君で申し訳ないけど、 ネットリソースではなかなか見つからなかったので質問させてください。 2Dアクションゲームでモーション中に別モーションを呼ぶ場合、 (例:ダッシュ中にパンチ、パンチキャンセルでキック等など) モーション要求はスタックに積むのが常道でしょうか? ダッシュとジャンプはそれぞれ加速度と重力変数で判別できるのですが、 キャンセル系について、たとえばガードキャンセル+パンチキャンセル+キックといった コマンド技に似たもので、自分がどんなことをしてきたかの遷移がわからないのです。 一応コーディングしてみると、直前モーションを保存するとif文の数が40個ぐらいになってしまいました。 STLって何?っていう厨房なので、スタック以外にも方法があればご教授おねがいします m(--)m
71 :
名前は開発中のものです。 :04/04/05 17:41 ID:Wxg2TEwm
>>70 スタックに積む=1モーション完了して次モーション
だと、いわゆるスト2の「キャンセル」っぽい動きにはならない。
ちなみにスト2のキャンセルは行きと戻りのモーションがあって、
行きモーション中にコマンドが成功したら戻りを「キャンセル」して
次モーションにつながることから。おそらく行きモーションと戻り
モーションが別コントロールになってるんだろうね。
どういう動きをさせたいのか頭の中を整理してみるほうがいい。
72 :
名前は開発中のものです。 :04/04/05 17:44 ID:rH0o4MFm
3Dゲーつくってます。 主人公キャラの位置をRAYにして、地形と障害物とのあたり判定をしようと思っています。 とりあえず、移動方向に1フレームの移動分だけレイを飛ばして速度ベクトルをその真下にしました。 地形に沿って移動はできるのですが、この方法では主人公とおなじ高さで垂直に立ってる壁とか、こっちに向かって傾斜しているポリゴンがあると困ります。 はじめにレイを進行方向に飛ばすときもあたり判定を計算すると2倍の計算量になってしまいますが、仕方ないのでしょうか。
>>72 何を言いたいのかさっぱりわかりません。
もっとわかりやすく書いて、
改行も入れてください。
計算量を減らすようにすればいいんじゃねぇか? どんなやり方してるかしらないけど。 アタリを分割すれば計算量は抑えられる。 AABBツリーを調べてみて。
特にちらついてないように見える もしかしてティアリングのこといってるの?
>>75 「リフレッシュレートに関する論争」スレでも検索してみるといいことがあるかも。
解決しようとするとちょっとした闇に踏み込むことになるので、覚悟するように。
78 :
75 :04/04/14 00:41 ID:s1vwKqYY
まさにそのティアリングってやつですね、たぶん。 スレを読んだりして見ましたけど、なんかめんどいんでこのまま進めることにします。 余力があったら考えてみたいと思います。 ありがとうございました。
フルスクリーンモードにしてフリップ使えば大概ティアリングは解消できる が、垂直同期周波数が環境によって違うことも多いために 垂直同期とってもゲーム内の描画とのずれでカクカクしてくることもある その辺がばっちり解決してもWinがリアルタイムOSでない時点で完璧には無理 どの辺で妥協するかが重要と思われ タイマとフリップ併用が一番いいと思うけどね
リフレッシュのタイミングとゲームのタイミングが完全にシンクロしない限り RTOSでも無理だから。
81 :
名前は開発中のものです。 :04/04/16 17:56 ID:6nIx9Yzb
はじめまして とあるPDAで擬似的な3DのGAMEを作りたいと思っています。 2Dではいくつか作って公開していますが、PDAの3Dの場合 自力で書くしかないでしょう。 今、市販されている3DプログラミングものはDirextXを利用した3Dエンジンを使用したものが 多いですね そうではなく自力で(ある程度はしょったモノになると思います。PDAだから)3Dを書きたい人におすすめな 書籍(もちろんWindows95前後の頃のものだと思うのですが)のタイトルと簡単などういう感じか 教えてもらえないでしょうか? ※こういった質問はここでよろしかったでしょうか? よろしくお願いします。 言語はCもしくはC++です。 上げさせていただいてもいいでしょうか?
83 :
81 :04/04/16 18:15 ID:6nIx9Yzb
>>82 申し訳ありません D3Dとは何かの略でしょうか?
検索してみたのですが 海外の会社ばかり引っかかるようです
フルネームを教えてくださいませんでしょうか?
お手数をおかけしますがよろしくお願いします
>>83 Direct3Dだよ。
基礎知識のページに
ジオメトリやトランスフォーム、ラスタ化ルールとか
入門に必要な情報はみんな書いてある。
85 :
81 :04/04/16 18:43 ID:6nIx9Yzb
87 :
81 :04/04/16 20:07 ID:6nIx9Yzb
88 :
81 :04/04/16 20:15 ID:6nIx9Yzb
CMAGAZINEの 2000年 1月号にDOOMの仕組みと 2002年 6月号に3Dダンジョンの作成と表示の基本アルゴリズム(DOOMも絡む) がありますね これを求めたいと思います 他の人の参考になれば。
>>81 似非3DならダンジョンマスターとかWizardryとかそっち系のほうがいい気がしないでもない
>>89 その手のも作っては見ますが、升目式ダンジョンではなく同じような感じの道が
ないようにしたいわけです。
なんとなくそらで道を覚えられるみたいな感じに出来たらと考えていますので。
91 :
名前は開発中のものです。 :04/04/16 23:40 ID:bAbJcDxy
>81 キャノンからでたRenderWareの分厚い本。 3Dエンジンを作るにあたって生じた技術資料を適当にまとめて 「プロご用達!」などとうたって1万前後で販売! CDにはRenderWareが入ってるが、これを使ったソフトを配布してはならないという罠。 クラリオンに聞くと「学習用ですので」。氏ね。
92 :
81 :04/04/17 00:32 ID:KupmHoyY
>>91 それってプロ御用達と学習用と矛盾してますな。誰が見てもわかるところに
これを使ったソフトの配布禁止と書かれていて、学習用と書かれているのでしょうか?
(だったらこんなに怒るわけないよな……)
とあるソフトのマニュアル的なものなんでしょうねえ
そういう3Dプログラミング物多いですよね 以外と。
>>81 3Dプログラミングってどう言ったレベルを想定してるか分らないが
自前実装って言うならラスタライズやら必要だよね?
"コンピュータグラフィックス 理論と実践"
辺りで良いんでないの?12000円と手頃だし。
特定ハードに依存(API等)しない
3Dの数学的理論、3Dの工業的理論(汎用的なコンピューター理論)
を身に付ければ、自前実装はスグできるようになる。
その前に、実装実機の理解は必須だと思うけど。
>>93 この本ってさ、1つの話題に対しての密度薄すぎねぇ?
技術の名前だけのってて「はぁ?こりゃなんも説明できてねぇよ」
ってのが多々あるぞ。
式出したらせめて各変数の意味ぐらい書いとけってのが多々あってムカツク。
>>94 自分のレベルに合わない本は、皆そう感じる物じゃない?
それに、自分の望むチャプターのみで、更にそれが根ほり葉ほり事細かな内容ってありえないでしょ。
DirectXのhelp読んで、
>1つの話題に対しての密度薄すぎねぇ?
>技術の名前だけのってて「はぁ?こりゃなんも説明できてねぇよ」
>式出したらせめて各変数の意味ぐらい書いとけ
何て言い出す人間の大半は
プログラムとC++と3Dプログラミングの基礎を持ってから読もうねって、感じの人間が多いと思う。
それと同じかな…?って思うけど…
違うなら、不満や不足に感じる部分は、他の本や他の情報源、
そして自分の頭で解決ってなる物でしょ?
幾ら何でも、答え頂戴、全部教えて、クレクレって方針はありえないでしょ。
普通に数学の基礎とハードの基礎とプログラムの基礎を持って読めば
十分な内容でしょ、12000円程度の価格なんだし。
>>94 あんた序文や前書きちゃんと読んでるか?
俺はこの本は持ってないが、
同系統の「Real-Time Rendering」だと
「各トピックについて深く知りたい場合は、
参考文献を充実させたのでそちらを参照してくれ」
ってちゃんと書いてあるんだが。
>>96 >同系統の「Real-Time Rendering」
両方もってるが、全然同系統じゃないぞ。
Real-Time Renderingの方は原本の奴で英語だけど。
コンピュータグラフィックス 理論と実践は
主にはCGをコンピューターで扱う原理を解説してる。
点を定義してそれらを結んでピクセルを塗る原理(ライスライズ)とか
つまり、普段はハードやらAPIが処理してる低レベル部分の理論的説明が主。
つまり、3Dソフト自体を開発したり、
DirectX使わないでWindowsでポリゴン自力描画(WinAPIは使うけど)実装したり
(勉強で昔やった)って勉強が出来る。
Real-Time Renderingはその名の通り、もうダブルバッファ前提で
いかにリアルタイムで処理時間を稼ぐとかの技術が主にある。
しかも、参考文献ってさ、文献として上がってる
本の著者と名前が載ってるだけだと思うが?
コンピューターCGの本と3Dプログラムの本、同系統では無いと思うけど?
99 :
名前は開発中のものです。 :04/04/25 12:00 ID:dZ+uD0u1
戦闘シュミレーションゲームつくるのに Cは向いていますか? またいいツールとかありませんか?
どういう物かはわからんが言語はまず関係ないと思った方がいいぞ
101 :
名前は開発中のものです。 :04/04/25 12:14 ID:dZ+uD0u1
ということはCをちゃんと使えるようにさえなれば 作れると言うことですか? 今勉強中ですが、Cってゲーム作れるのか? と不安になってきました。 絵の表示の仕方がいまだにわかんないし・・・
逆にいえばその程度でつまずくなら(失礼)Cにこだわる必要ないんじゃないの? 絵を表示するコードが1行の命令で、画面の初期化もらくちんって環境は 世の中にたくさんあるよ。 Cの利点は何でもやろうと思えば細かいことは出来るというだけで その利点もハードガリガリアクセスする環境ならともかく Winとかだとほとんどメリットないね
103 :
名前は開発中のものです。 :04/04/25 12:29 ID:dZ+uD0u1
そうですか・・・ ちなにみ皆さんはこういうゲームを作るときは どの言語を使ってるんですか?
確かに言語によってと喰い不得意はあるものの
結局使い慣れた物が一番だと思う
最近はスクリプト系も結構あるから言語になれて内人はそっちがいいかな
俺はやはりC/C++を長くやっていたから言語体系が近いjavaとCだな
C++で中途半端なオブジェクト指向やるくらいならjavaいったほうがいいし、
シンプルにガリガリ叩くときにはCって感じ
javaだと画像表示やらシステム部分に時間をかけないでゲームの処理のみに
専念できてる感じがいい
Cとかはもちろん必要コード量が多くなるのでライブラリ整備が必須になって
変にシステムをいじってばかりでゲームに専念できないことも多い^^;
>>103 がさわれそうな環境はC以外になにかあるの?
画像表示からうまくできてないということはDIBやらDirectXから出来るようになるには
かなり時間かかると思うから他を勧めたい
105 :
名前は開発中のものです。 :04/04/25 13:34 ID:dZ+uD0u1
親が自営でC++のプログラマやっているので もっとも勉強しやすい環境にあるのはCだと想います。 こだわりと言うわけではありませんが、 できればCで作りたいと思っています。 >画像表示からうまくできてない まだ勉強中なのでそこまで達していなのかもしれません 一応C入門の本は1冊読んだのですが・・・
「高校受験したいんです。小学校の課程は修了しました」 みたいなもんだな。 CでやるとしてもまずはコンソールじゃなくWindowsプログラミングやらんといかんし。 まーいっそコンソール&glutって手もあるが。
そもそも言語が分かってさらにGUIまわりも分かっていても ゲームプログラムが全く出来ない人もたくさんいる ゲームに必要な知識と、そのプラットフォームで絵を出すとか システムに必要な知識は全く別物なわけで 逆にスタンドアロンのゲームは作れるけどウインドウシステム上での ゲームは作れないという人もいる 今のちみの状態は分からないことが多すぎかと 言語自体も本読んだというレベルなら表面上のものだけだと思うので ポインタガンガン使えるというレベルまで言ってないと思われ 一番重要なのは目的がゲームを作ることなのか、それともC言語を 勉強したいのかってところだよ 昔はC言語&ゲーム作りたいってことが多かったと思うけどこれは 生産性を上げつつマシンスペックが低かった時代これしか選択肢がなかっただけ 8bit時代BASICでゲーム作って遅かったのでしかたなくハンドアセンブルへ そして16bitになりメモリが多少裕福になってC言語へって人は多いはず 言語が目的ではないんだよ それにプログラマは複数の言語が使えるのが普通 1つの言語で今後もいくとは思えない
108 :
名前は開発中のものです。 :04/04/25 14:52 ID:dZ+uD0u1
とりあえず今ある知識でゲーム作ろうというのが、 かなり無謀だったみたいですね。 もちろんゲーム作成が目的ですが、 今は置いておいて、Cをがんがん使えるようになろうと思います
109 :
名前は開発中のものです。 :04/04/25 15:36 ID:RwxVe3k8
まずCをしっかりできるようにして、 次にC++をいくらかかじって、 あとはDirectXに進めばOK。 このQ&Aってもう何度もされてるよね。 ゲームプログラミングのまともな入門サイトor本がないということだろう。 どうにかならないもんかね?
昔はパソコンでのプログラム=ゲーム作るだったからな それほど山のように雑誌はあった ベーマガ、MSXFANなど読みやすくて分かりやすいシンプルな物がないからね あとは個人レベルで作る物と商業レベルとでできあがる物が違いすぎるというか でも昔から初心者向けと上級者向けはあってもその間の中レベル向けが ほとんど存在しないと言う問題もあったよ たとえばC言語は分かって絵も描画できる、でも具体的にゲームで必須な 垂直同期がなんなのかとかラスター割り込みがどうとかそういった物は なかなかいいものはなかった DirectXやるときC++よりCでやったほうが楽な気がする
楽というか 綺麗な使い方が出来ないと思うC++
綺麗な使い方ってどんなの? DirectXやったことないけど、呼び出すだけだからどっちでも一緒じゃ?
CだとCOMを間接的に呼ばなければならないので、 綺麗な使い方には絶対にならない。
>>113 いや、そういうことじゃなくて、アレだろ?
C++なんだけどC風に組むとかそんなんだろ。多分。
でも、C++風に組んだ方が楽だと思うけどね。俺は。
>>111 潔癖主義かつ無能なら何を使っても汚く感じるだろう。
いや、C++は特別だろ。
117 :
名前は開発中のものです。 :04/04/28 20:35 ID:brIWsk8J
俺はC++でDirectX使ってるが、デザインはうっとりしてしまうほど綺麗にできてるよ。 なにが汚くなる可能性があるのか具体的に言ってみろばかー
一人よがり
119 :
名前は開発中のものです。 :04/04/28 20:52 ID:brIWsk8J
思わずモニタにティンコこすりつけたくなっちゃうくらい 清純可憐で微妙なエロスの漂う穢れのないコードかけてるっつーの
じゃぁ見せろ
>>116 特別ですね。
言語レベルで厳格な貞操帯を装着しないと、猿のようにオナーニを
いえ独り善がりな汚いコードを書いてしまう無能には「C++は特別」です。
特別汚いコードを書ける言語です。彼等にとっては大きな問題です。
貞操帯を装着しなくても問題の無い一般人にとっては瑣末な問題です。
平和なやつらだ。C#とかDとか試してみたことないんだろうな。
Dは処理系がひとつしかないし、バグバグだからなぁ
124 :
名前は開発中のものです。 :04/04/29 04:02 ID:tELycjco
class CCharacter : public CEntity, public CRenderNode, public CCollisionNode {}; CEntityは自律行動を行うクラスで主にAIの更新を行う仮想関数Update()を持つ。 CRenderNodeはレンダラに登録され描画を行う仮想関数Render()を持つ。 CCollisionNodeはデフォルトの当たり判定を実装してあって衝突を検出したら仮想関数Collide()を呼び出す。 関連性のない3つのクラスからの多重派生ですがこれは邪道でしょうか? また、みなさんはこの3つの要素をどの様にクラス化してますか? ご意見お聞かせくださいませ。
>>122 平和な奴だ。糞汚いコードを書いてばかりの低脳に
Java、C#、Dを試させてみたことがないんだろうな。
言語仕様上の規定(貞操)が厳格であるために
クルクルパーな悪性のハックは多少は減るが
やっぱりおかしなコードを書くんだよ。
馬鹿に付ける薬は無い。言語変えても駄目な奴は駄目。
>>124 俺の場合、
class CCharacter : public CEntity
CRenderNode,CCollisionNodeはCCharacterのメンバ
理由は、描画リソース、コリジョンはいらないキャラのいるから。
例えば、ジェネレータとか。
とある理由で、CEntityをメンバにした事もある。
>>124 邪道・正道にはとやかく言及しないが
「〜Node」な2つの基底クラスの間で名前衝突が起きないってのが
ぶっちゃけあり得ない。背後にぐちゃぐちゃなメソッドの群れの気配がする。
128 :
名前は開発中のものです。 :04/04/29 08:15 ID:0gA9laqu
>>124 肝心なのはその上位で、CCharacterのインスタンスの集合を管理しているクラスが
こいつをどういう風に扱うかにあると思う。
誰がどうやって生成して、どういうリストに組み込まれて、誰がメソッドを呼び出して、
誰がどうやって破棄している?
129 :
名前は開発中のものです。 :04/04/29 09:54 ID: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
130 :
124 :04/04/29 13:08 ID:tELycjco
>>126 CCollisionNodeをメンバにするのは考えましたが、
CRenderNodeをメンバにしてしまうと自身で描画コードを持てないので
描画情報を登録して後で一括描画してもらうって形ですよね。
この場合ちょっと複雑な事をやりたい場合にCRenderNodeに手を加えるハメになりそうですがどうでしょうか?
2Dなら描画形態は限られてくるのでメンバに持ってしまうかもしれませんが。
131 :
124 :04/04/29 13:09 ID:tELycjco
>>127 〜Node系は特定の機能を保有する事を保証するインターフェイスのような物なので今のところ名前の衝突はないですが、
拡張した場合に仰るとおりのぐちゃぐちゃなメソッドの群れになる可能性は大いにありますね。
132 :
124 :04/04/29 13:09 ID: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);
なんだか鬱設計ですね。
133 :
124 :04/04/29 13:09 ID:tELycjco
>>129 >>ちょっと
>>124 は機能とオブジェクトをいっしょにしてるのがよくなさげ。
>>EntityやRender、Collisionなんてのは明らかに
>>Characterが所有しちょるものなのでメンバでいいと思う
コリジョンや描画をメンバにするのはある程度納得出来るのですが、
自身の行動をメンバに委譲するってのはちょっとイメージが沸きません。
状態のみを委譲してそれを受けて自身の行動に変化をつけるのでしょうか?
たぶん違うぽ(つд`)
ゲーム内に登場するオブジェクトの殆どはCCharacter派生クラスだと思うんです。
確かに画面には表示されないステージ管理クラスや当たり判定を行わないスコア表示部分などはありますが、
それらは本当に限られてくるんじゃないでしょうか。
共通のインターフェイスやリソースを含んだCCharacterを定義して全てのキャラクタをそこから派生させた方が、
より汎用性があるかなーと思った訳です。
>>132 管理クラスって作った奴が思うほど役に立たないことが多いから
もうちょっと設計考えて見た方がよくね?
>>133 >自身の行動をメンバに委譲するってのはちょっとイメージが沸きません。
どう組んでるのか詳細までは知らないけど、
結局、プロペラ付けたら空を飛んで欲しくて、車輪付けたら道を走ってほしいんでしょ?
ならそういう使い方でいいじゃない?
>共通のインターフェイスやリソースを含んだCCharacterを定義して全てのキャラクタをそこから派生させた方が、
>より汎用性があるかなーと思った訳です。
それはいいんだけど、継承を継承らしく使おうよって話なんだけど。
別にこう↓組んでも組めるっちゃあ組めると思うよ。
class CCharacter : public CEntity, public CRenderNode, public CCollisionNode {};
ただわかりづれぇって一点を除けばw
135 :
名前は開発中のものです。 :04/04/29 18:18 ID:0gA9laqu
>>132 とりあえずそのノリなら漏れはついていけるから安心していいよ
邪道かどうかは別として、管理される側が自分を管理する側を知っているっていう
状態は改良できるとこだと思う
136 :
名前は開発中のものです。 :04/04/29 18:20 ID:K2EIDtC0
おまえらそんな議論は学校いってるうちにすませとけや
>ゲームプログラミング相談室【Part6】 ~~~~~~~~ 問題は何もない。続けて良い。
138 :
名前は開発中のものです。 :04/04/29 21:45 ID:0gA9laqu
邪道かどうかは別として、衝突判定が特別扱いされているのが気になる なんでentity間のやりとりの一種として扱わないの?
>>130 スマン。やはり、CRenderNodeがどういったものか、理解せずに
答えたので、見当違いだったかも。
CRenderNodeは描画機能?をもっていて、描画する対象のインスタンスではない。
て事かな?
因みに俺はインスタンスを含むと思っていたので、あくまでも、メンバ(参照用のポインタ)という扱い。
(キャラと描画物が1対1ではないという事)
とあるミドルウェアでは、大概のクラスが、シーングラフノードの派生。という構造もあったし、
そういうのも面白いとは思うよ。
これっ
141 :
124 :04/04/30 04:19 ID:r3mzBY0g
>>134 >>管理クラスって作った奴が思うほど役に立たないことが多いから
全AI更新→全衝突判定→全描画
こんな感じにUpdate()やRender()ってのは一括して呼ばれるのが普通だと私は思ってます。
誰かが管理して順番に呼び出した方がスッキリしているような気がしますがどうでしょうか?
管理クラスがない場合って生成されたEntityのUpdate()はどうやって呼ばれるのだろう。
各Entityを木構造のノードにして子or兄弟のUpdate()を連鎖的に呼び出すのか、
それともリストをグローバルで持ってメインループか何処かで呼び出す?
誰かに管理させた方が不用意にノードにアクセスされないだろうしこれが普通かなーと
思ってたんですが一般的ではないんですかね。
>>結局、プロペラ付けたら空を飛んで欲しくて、車輪付けたら道を走ってほしいんでしょ?
この部分の話の流れとしてはCEntityから派生せずに
メンバとしてCEntityを持ったほうがいいよって解釈でよろしいでしょうか?
実際に移動を行う処理やアニメーションを行う処理なんかはAIと分離すべきだと思うのですが、
AIの部分をメンバに委譲して且つ自分ではUpdate()を持たないとなると
自分自身は何も行動を起こせないただの入れ物になりますよね?
うーん。
>>それはいいんだけど、継承を継承らしく使おうよって話なんだけど。
それが引っかかってたので質問した訳です。そしたらその他の部分でボロが出まくる出まくる(;´Д`)
CRenderNodeやCCollisionNodeをメンバに持つってのはいいんですが
CEntityをメンバに持つメリットというか意味が理解できないのです。
142 :
124 :04/04/30 04:33 ID:r3mzBY0g
>>135 >>邪道かどうかは別として、管理される側が自分を管理する側を知っているっていう
>>状態は改良できるとこだと思う
でもリスト構造とかってそういう物ではないんですか?
ああ、ノード自身が管理クラスに登録するってのがマズイ訳ですね。
その点CEntity以外をメンバとして持った場合は
renderer.Add(this);
はアリですよね。
143 :
124 :04/04/30 04:35 ID:r3mzBY0g
>>135 >>邪道かどうかは別として、衝突判定が特別扱いされているのが気になる
自分の中では一括処理ってのが根底にあったので特別扱いになってます。
全ゲームオブジェクトの行動が終わってから衝突判定を一括で行うのでどうしても
管理クラスに自分を登録して後で判定を実行する必要があったんです。
Update()の中で衝突処理も行うとすればAI処理の一部として実装できますし、
自由度は増すと思いますがこれはゲームの規模や構造にもよりますよね。
144 :
124 :04/04/30 04:38 ID:r3mzBY0g
>>139 すみません、説明不足だったようですね。描画対象ではないです。
CRenderNodeはインターフェイスです。基本的にvirtual void Render() = 0;が定義してあるだけで、
レンダラがこれを任意のタイミングで呼び出します。
派生クラスはRender()を実装して1つもしくは複数のモデルをデバイスに対して描画してます。
145 :
名前は開発中のものです。 :04/04/30 05:47 ID:iUVDJkHq
>>141 >管理クラスがない場合って生成されたEntityのUpdate()はどうやって呼ばれるのだろう。
>各Entityを木構造のノードにして子or兄弟のUpdate()を連鎖的に呼び出すのか、
ん?処理の順番って基本的にこうやらないとまずくないか?
だって、親子関係では親から処理を実行していくようにしないと矛盾がおきないか?
子がワールド座標を欲しがるとき、親がすでに正しい位置に動いてくれていないと
子のワールド座標はバグるはずだけどどうよ?
>CEntityをメンバに持つメリットというか意味が理解できないのです。
俺はEntityクラスはキャラクタの行動を制御するものだと思ってたんだけど
実はただのAIクラスなの?
146 :
135 :04/04/30 12:37 ID:LSXN/0+O
>>142 管理される側が管理者のインスタンスを握っていて、
自分の登録と削除だけしかさせてもらえないならいいけど、
そうなってはいないでしょう?管理者を管理するクラスのために用意してある
メソッドにも自由にアクセスできるようになってしまっているはず。
インスタンスが無駄にグローバルになってるとか、
privateになっているべきメンバがpublicだったりするような程度でマズイです。
ヘッダのインクルードもクロスしてるでしょう。
そういうのはできるだけなくしていったほうがいいと思うよ。
>>143 シューティングゲームをつくってるのかな?
この衝突判定は「何に」当ったたのかみたいなことは分からなくてもいいの?
引数で衝突相手をもらうとしても、 Collide(const CollisionNode&) にならざるをえないし
これでは大抵は困ると思うけども
147 :
124 :04/04/30 19:52 ID:r3mzBY0g
>>145 管理クラス内にリストを持って実行順位毎に実行させるのと(現状はこれ)、
木構造にしてルートのUpdate()を呼んでやるのってのは実質的に同じだけど
木構造の方が何かと便利だよって事でしょうか。
何にせよルートノードは全ての子から見えるわけですよね?
インスタンスを晒さずに特別なアクセス関数を作るにしても
結局管理クラスと同じような存在になっていまうと思うんですがどうでしょうか?
>>実はただのAIクラスなの?
Entityは毎フレームUpdate()が呼ばれ続けるただのAIクラスって認識なので
EnemyはCEntityから派生させている訳です。
状態遷移や座標の更新、子entityの生成などをUpdate()内で行ってます。
148 :
124 :04/04/30 19:59 ID:r3mzBY0g
>>146 管理される側がインスタンスを握っているってイメージでは無いんですが、
管理クラスはシングルトンになっててほぼ全てのゲームクラスから見えてます。
単にリストのノードってのであればノードがリストのインスタンスを
知っている必要はまったく無いですが、
個が主体となるEntityでは知らないと何も出来ないですよね?
隠蔽さえ出来ればいいのであれば管理者のインスタンスを隠蔽して登録、削除は専用の
グローバルな関数経由で行うってのでも現状よりはマシなのでしょうか。
はい、シューティングです。
現状ではまさに Collide(const CollisionNode&) これですね。
CollisionNodeに相手のポインタを仕込ませているので
そのポインタ経由で相手の情報を得てますがやっぱりマズイでしょうか?
>>147 >管理クラス内にリストを持って実行順位毎に実行させるのと
この管理クラスって結局Updateを毎回読んでやるただそれだけのクラスなんだよね。
はっきりいっていらないんじゃないかなぁ。ってこと。
正直、完全自己完結処理な物体ぐらいしか恩恵が全くといっていいほどないじゃん。
一度管理クラスを捨てて1から考え直してみたらどうかな?
>Entityは毎フレームUpdate()が呼ばれ続けるただのAIクラスって認識なので
Entityクラスを継承してCharacterクラスができてるのはなんか
オブジェクト指向的にわかりにくくないか?(C++の機能としてできるって意味とは別にして)
基本に戻って犬と猫は哺乳類でってところから考えると、
キャラクタはAI(脳みそ)でってなってちょっと変だ。
キャラクタは脳みそをもっていてって考えた方が綺麗に組めるんじゃないかな?
>>148 >管理クラスはシングルトンになっててほぼ全てのゲームクラスから見えてます。
こりゃグローバル変数と何も変わらないよ。
これが駄目だとわからないとなると、ちょっと修行が必要。
ちょっと面倒だけど、引数から渡すように改善できないかな?
前にも引数わたしの話がでてたけど、実際やってみるとかなりしんどかったぞ 例えば、引数を渡した関数から、他の関数を呼ぶときは同様に引数を渡さねばならない。 その関数から他の関数を呼ぶときも(以下略) リファクタリングする度に、引数付き関数が増えていく。 さらに、引数がいらない関数から、引数がいる関数を呼ぶ必要がある時は、 呼び出し元を辿って全てを引数付き関数に変更せねばならない羽目に。 結局気づいてみると、ほとんどの関数が引数つきに。 一本の大きな関数で書ききるなら行けるが、 そうでない場合は、地獄を見ることに…… 実際、引数わたしで上手く行っている人の話が聞きたい。
>>150 >例えば、引数を渡した関数から、他の関数を呼ぶときは同様に引数を渡さねばならない。
>その関数から他の関数を呼ぶときも(以下略)
>リファクタリングする度に、引数付き関数が増えていく。
漏れもハマったことあるな(w
まぁ、この辺はバランス感覚というか取捨選択になるでしょ。 何でもかんでもメッセージパッシングでやればパフォーマンス落ちるのと同じで。 膨大な数のインスタンスを高速処理せねばならないエンジン部に近いなら 美しさに伴う冗長性を嫌って汚いハックに走らざるを得ないし。
s/美しさ/OO的美しさ/
>>150 構造体で渡していくらか防げるかも。
でも、俺は引数増えても気にしないほうだなぁ。
DirectXがああだからしょうがないって言えばそうなんじゃない?
155 :
名前は開発中のものです。 :04/05/01 04:02 ID:HtCFg7B3
>>150 綺麗か汚いかじゃなくて、何を言いたいのかを考えてインターフェイスの仕様は決めるべき。
まして2chの名無しがうるさく言っていたからなんて理由では(ry
その参照の元が、そのインスタンスの一生のうちに変わる可能性があるということを示唆
するために、毎回参照を渡すようにしなさい。
その参照の元が、そのインスタンスの一生のうちに変わる可能性がないということを示唆
するために、コンストラクタで受け取り自分のメンバに格納しておくようにしなさい。
どちらが美しいとかどちらが汚いとかではない。
156 :
名前は開発中のものです。 :04/05/01 04:56 ID:HtCFg7B3
>>148 >個が主体となるEntityでは知らないと何も出来ないですよね?
管理者のインスタンスで何をしたい?他entityの検索とかかな。
>現状よりはマシなのでしょうか
インスタンスを生成した人がその人の好きな場所に登録できるのがいちばんよいよ。本当はね。
>CollisionNodeに相手のポインタ
どういうクラスへのポインタ?
157 :
124 :04/05/01 06:39 ID:bkNOTeqK
>>149 そうですね。実際にコード化してみて比較しながら考えてみます。
>>キャラクタは脳みそをもっていてって考えた方が綺麗に組めるんじゃないかな?
理想はそうかもしれませんが実際キャラクタが自分の手足に命令を出したほうが
コード的に自然な作りになりませんか?
頭脳をメンバとして持った場合、親(キャラクタクラス)経由で手足クラスに命令を出す
となると複雑になりませんかね。
>こりゃグローバル変数と何も変わらないよ。
変わらないですね。
生成&破棄が頻繁に行われるオブジェクトや状態が変化するものに関しては隠蔽すべき
だと思うんですがシステムで唯一無二の存在であろう管理クラスくらいはグローバルでも
いいと思うんですがどうでしょうか?
管理クラス的なものはそんなにポコポコ作らないでしょうし。
158 :
124 :04/05/01 06:42 ID:bkNOTeqK
159 :
139 :04/05/01 06:50 ID:9Tu48i71
>>144 ああ、そんな気はしてたが、
virtual void Render() = 0;が定義してあるだけ。か。
俺ならCGameObjectてなクラス作って、メゾットにしちゃうか。
Update()も同様に。
CRenderNodeという名前は、紛らわしいね。tree構造を連想させられる。
管理クラスは、俺も用意してる。
シングルトンで、ファクトリパターンクラスの派生。
作ってるものも同じ。シューティング。
AIは用意してないけど、その辺りを用意すれば、アクションゲームもOK。
ただ、AIをハードコーディングしようとは思わないが。
ありものを作るなら、大抵、コリジョン判定、条件判定の組み合わせが違うだけだから。
160 :
124 :04/05/01 06:58 ID:bkNOTeqK
>>156 >>管理者のインスタンスで何をしたい?他entityの検索とかかな。
そうですね。
Entity間のやり取りでも管理者をかませた方が不正アクセスをチェック出来たり
デバッグ用のアクセスログ吐かせたり延滞メッセージ的な通知とかも出来そうだし。
仲介役が居ることのメリットはあるんじゃないかと思います。
>>どういうクラスへのポインタ?
ここで言うところのCCharacterですかね。
この部分は正直変な事になってると思います・・・。
161 :
124 :04/05/01 07:22 ID:bkNOTeqK
>>159 CGameObjectを管理するクラスがあってそのクラスがレンダラを持ってるんでしょうか?
例えば管理クラスが全ゲームオブジェクトのUpdate()を呼んでからレンダラの参照なんかを
Render()に渡してあげるとか。
AIはハードコーディングしてしまうかも。
部分的に再利用可能な形にする事もできるしちょっとした色付けは外部ファイルから
入力してあげれそれで十分かなーと。
162 :
139 :04/05/01 07:48 ID:9Tu48i71
>>161 実際、今作ってるものには、CGameObjectというクラスはないんだけど、、。
CGameObjectもしくは、CGameObjectManagerが、必要なタイミングで
(生成時、初期化時、視界内に入ってきたとき等々)
に、描画エンジンのmanagerを使って、描画オブジェクトを生成。と。
で、擬似コード
app::Update(frame)
{
描画manager->Update( frame );
GameObjectManager->Update( frame );
}
と。
描画機能と、ゲーム(CPU)的な機能は分離してます。
163 :
139 :04/05/01 07:53 ID:9Tu48i71
言葉足らずだったかな? 要するに、CGameObjectは、レンダラ機能はもたず、 レンダラがもつ描画ノードの参照を持ってるだけ。 update()時も、描画用のセットアップをしているだけ。
164 :
名前は開発中のものです。 :04/05/01 08:16 ID:Jz0Md+j7
>>157 >頭脳をメンバとして持った場合、親(キャラクタクラス)経由で手足クラスに命令を出す
>となると複雑になりませんかね。
どうして?変わらないと思うけど。
手足クラスが何やるか知らないけど、頭脳と手足が認識できる構造なら
どういう処理にしろクラスにしちゃった方がわかりやすいじゃん。
>システムで唯一無二の存在であろう管理クラスくらいはグローバルでも
>いいと思うんですがどうでしょうか?
駄目だよ。グローバル変数が駄目な理由も理解してないな。
システムで唯一無二のものを直接コードに入れちゃうってことは
そのクラスはそこでもう身動きがとれなくなっちゃうってことだよ。
どこでもどんなタイミングでもアクセスできちゃうし、
一番怖いバグが出るパターンだよ。
>>158 なりませんでした
概念だけは美しいが、コードは美しくなく汚くなっただけ
なんだかC言語で、OOやったときのような気分
>>165 なんでそう見た目だけにかき回されるのか激しく疑問。
いくらコードが美しくたって概念が糞なら糞。
>>155 のいう通りだろ。
むしろ、実装してみると、概念の方があなたの言う「見た目」に見えてくる
>>150 みたになるのを防ぐ方法が挙げられなければ、
スパゲッティなコードになることを回避できない。
>むしろ、実装してみると、概念の方があなたの言う「見た目」に見えてくる わかりにくいな むしろ、実装してみると、概念にかき回される、と言いたい
>>167 じゃあ構造体でわたせば?(これで解決するよね?)
170 :
名前は開発中のものです。 :04/05/01 11:53 ID:HtCFg7B3
>>160 >仲介役が居ることのメリットはあるんじゃないかと
なにもできないわけじゃないなら、管理される側からは管理している側が見えないように
しておいたほうがよい。管理する側の何かを変更をしたい時に、
管理される側にはその変更によって何も影響がないということを確信をもって取り組むことができる。
そのメリットの方が仲介役と管理者がいっしょにいることより大きいと思うよ。
もしも仲介役が必要ということなら仲介役クラス、というかインターフェイスをつくって
entity生成時に持たせてあげるようにしたらいい。
>>164 >グローバル変数が駄目な理由も理解してないな。
グローバル変数は、そのクラスが変更されたとき、膨大なコードの全体に対して
影響が及んだかどうかチェックして問題がないことを確信がもてる精神力が
あるのなら使える。ぼくは精神力に自信がないのでシングルdをさらすことはせず
必要とされる単純な処理だけをstaticメソッドとして公開してるyo
171 :
名前は開発中のものです。 :04/05/01 12:28 ID:HtCFg7B3
まぁ最初はリソースやコンテクストをいちいち引数渡しする形でデザインしておいたほうがいいんじゃないか そのクラスのそれ以外のメソッドがリソースやコンテクストなしでも動けるなら、そのほうが。 んでクラスの全部のメソッドがそのリソースやコンテクストなしでは動けないということが判明したら コンストラクタでもらうようにしては。
172 :
139 :04/05/01 12:31 ID:9Tu48i71
>>167 俺の場合、「やばい!」と感じたらw
とりあえず、クラスにして渡す。
作業してて「これやばいな」と感じたら、そのまま突き進まず、
別の回避策を考える事にしてる。絶対可笑しな部分があるから。
173 :
152 :04/05/01 13:27 ID:AwZfI0KO
>>166 というか155は抽象的極論なので一体何が言うとおりなのか理解不能です。
この際言葉遊びは捨てて(というか面倒くさいので)美しさ=概念的合理性と
解釈てしまいますが・・・・確認なんですが
こういうものを追求することは当然なのでありますが、これらが常に計算機側の
特性とマッチするわけでない、ということはお互いの共通理解として宜しいですよね。
ゲームの場合、わりと頻繁に この部分が絡むので論争に発展するのだと思います。
現実(ハード特性)との不整合を冷酷に示すパフォーマンスアナライザを恨めという
以外ありません。
174 :
152 :04/05/01 13:35 ID:AwZfI0KO
まぁ、ただ今読み返すと、ここで議論にあがってるのは 純粋に設計上の不備の部分の話なのかなぁ、とも思うので 173の内容は無粋だな。却下。
ロジックとハード特性の不整合というより、ロジックと言語仕様の不整合、かな。
176 :
152 :04/05/01 13:48 ID:AwZfI0KO
>>175 そんな感じですな。美しさ=記述上の美しさ、という意味合いなら
やっぱ173は筋違いやね。
いや、俺は
>>173 の言ってることは当然のことなので悪いとは思わない。
ゲームにもよるが、ノードの数が物凄く多くなればキャッシュヒット
やら何やらの問題がボロボロと表出することがあるので、途中で
精度犠牲にして走査回数抑制する方向でロジックを修正することあるし。
最悪、内部データ構造から洗いなおすハメになることもあるし。
純粋にパフォーマンス上の話だと 手荷物にするか置き勉にするか、状況によっては相当違ってくるよね。
>>173 >美しさ=概念的合理性
え?じゃあ、なんで俺にレスつけんの?
俺は
>>165 の
>概念だけは美しいが、コードは美しくなく汚くなっただけ
っていう言葉に対してレスつけたんだけど。
引数で渡すことに関しては賛成ってことでいいんでしょ?
180 :
173 :04/05/01 14:50 ID:AwZfI0KO
概念=抽象モデルという話なら、
>>173 は
抽象モデルが糞なら(結果としてそれは)糞という発想は極端だなぁ
という、やや無粋な話。
抽象モデルとして説得力のある・人の直感的に分かりやすい代物であっても
それが常にハードウェア特性との親和性を伴うわけではないならば
何が糞で何が糞でないのか、は一概には決め付けられないだろう、という話。
これは詭弁ガイドラインに抵触している気がするので、
>>174 で取り下げた。
スクロール処理に関して知恵をかしておくんなさい 1.2DのアクションRPGをつくっています 2.プレイできる範囲全体を100*100セルとして定義、後ろ(どっか)にもってます 3.プレイヤーの見える範囲を10*10として定義、現在の座標位置より、2.でもってる内容から上下左右に1セル分多く取得してきます。 4.3.で1セル分多く取得してきているぶんをつかってプレイヤーが移動したときに、すこしずつずらしていきます 5.実際の画面への表示は、3.の内容にマスクして、10セル分だけ表示し、スクロールにみせかけています 最初は2Dのスクロール処理のみを考えていたんで、この方法で、スクロール処理ができるようになってよかったんです。 が、他のプレイヤーや、キャラを追加して、そいつらの動きが入ると意味不明になってしまいました。 たとえば、プレイヤーが(x,y)=(10,10)の座標にいて、他のプレイヤーが(x,y)=(12,12)の座標にいて、 プレイヤーが(x,y)=(10,11)に移動、他のプレイヤーが(x,y)=(12,11)に移動すると 先の上で説明したような状況になったときに、どう他のプレイヤーを描画したらいいのか悩んでます 考えているつもりですが、意味不明になって悩んでしまいます 全体的な処理としては、メインのループがあって、そこで、くるくるまわして描画処理をしています。 キーボードのイベントや、マウスイベントや、ネットワークからのイベントは、別のスレッドでキューにいれて、 上のメインを回しているスレッドから読んで描画に関する処理に影響させています。 長くなってしまった上に、意味不明なことを書いているようなきがするんですが、 よかったら知恵を貸してください。
182 :
名前は開発中のものです。 :04/05/02 07:16 ID:ewEdZS/b
>>166 みたいな、単なる貶し系の文章が書きたいだけのやつが一人いるんだよね。
それが気に入らないから俺しばらく常駐してみてるんだが。
183 :
名前は開発中のものです。 :04/05/02 11:23 ID:8zjGYCSW
>>181 >そいつらの動きが入ると意味不明になってしまいました。
どう上手くいかないのかわからないんだが、
とりあえず、スクロール処理の部分って
プレイヤーの現在位置から見える範囲を決めてるわけだから
他のプレイヤーってこの処理に関係ないんじゃないの?
>>182 >>182 の内容が貶し系なわけだがw
>>181 文章が長い割に、必要な情報が欠落している。
他のプレイヤーやキャラとはなんなのか、説明をちゃんとしろ。
185 :
181 :04/05/02 15:03 ID:GnjcB1ex
>>183 >>184 もうちょっとまとめてみました
プレイヤーと動かない対象(床と動いてないキャラなど)
にかんするスクロールは問題ないです
自分がスクロールしている最中に、
画面内に動く対象がいると、スクロールがうまくいかず、
飛んだみたいに見えるわけです
自分が(10,10)→(10,11)に移動し、
動く対象が(12,12)→(12,11)に移動したら、
2セルぐらい飛んだように見えるんです
また、自分が止まっている時に
画面内に動く対象がいても問題なく動いています
結果:
自分がスクロールしているときに
画面内の動く対象の描画位置を計算するルーチンがおかしい、
または、そんなルーチンが動いていないから、
飛んだように見える
あぁ、なんか解決したような兆しが見える・・・
背景に張り付いてるキャラクターが、主人公と逆に動いた場合、 倍の速度で離れていくのは、普通のことなのではないでしょうか。 ドラクエやイースもそうなってるはずですよ。 (あまり関係有りませんが) セルという言葉を使ってるようですが、RPGツクールでいうところの 「チップ」のことでしょうか。小さい四角のことをセルというのは PCエンジンぽいですね。でべろかなんかいじっていた人なのでしょうか。
>>185 スクロール時のキャラクタ描画を「現在のスクロール量(ずらして
描画しているピクセル数)を減じた座標」に対して行うようにすれ
ばよいのでは? わかりにくければ、方眼紙に表示領域とスクロー
ル領域を描いてみて、1ピクセルずつスクロールさせるとどうなるか、
なぞってみてください。
189 :
181 :04/05/02 17:30 ID:GnjcB1ex
>>186 おっしゃるとおりですね。
倍速ではなれていくことを表現したいと思っています。
現状ではキャラがスクロールするというより、
飛んでるというかんじで、なんでかデバッグ中です
セルという言葉は、距離を表現するつもりでつかっています。
プログラム中では1セル中にはりつけるタイルを
チップという名前をつけています
ゲームプログラムは今回が初めてで、
詳しいこともわからず独善的に作っています
だから言葉も適当です
適切でなければ、以後、脳内で置換します
190 :
181 :04/05/02 17:35 ID:GnjcB1ex
>>187 そうですよね・・・。
適切な表現ができていないですよね。
>>188 すばらしいアイデアですね。
早速方眼紙にかいて試してみました。
なんか、自分のルーチンの間違いが見えてきた気がします。
サンクスです。
こーやって書いて実際に試してみるのがとても大切ですね
191 :
181 :04/05/02 17:55 ID:GnjcB1ex
自分の間違いがわかりました。
スクロール処理に問題があり、
>>188 さんのアイデアで解決しました。
ありがとうございました。
次は、デバッグ中にわかった問題を解決していこうと思います。
自分が(10,10)にいて、動く対象が(12,12)にいて、一旦描画したとします。
その後、次の描画処理までに動く対象が(12,11)、(12,10)と移動した場合、
2セル動いているので、スクロール処理が想定している
ルーチン中で判断できず、飛んだようにみえていました。
自分の処理の中では必ず1セルしか動かないようになっていました。
これは現在作成しているプログラムで、ステップ実行などをしている際に、
動く対象が1セルずつ移動しているが、
実は2回移動して2セル動いてしまっている際に起こっているようです。
今はステップ実行などを行わない限り、こういった状況にはならないわけですが、
いずれさまざまな問題で発生する可能性があります。
で、解決案として以下を考えています。
@放置、トンでもいいじゃないか
A軌跡を事後に計算して描画処理をさせる
@でいこうと思っていますが、みなさんならどうされますか?
微分する
193 :
181 :04/05/02 18:07 ID:GnjcB1ex
微分して、軌跡に近いセルに描画ですか いいアイデアですね
>>181 処理構造に問題があるんじゃないの?
移動は、そのセルとやらが何ピクセルの大きさか知らないが段階を踏んでるんだろうね?
つまり、32ピクセル x 32ピクセルの大きさなら
移動は、瞬間移動?
それとも8ピクセル程度づつスライドして滑らかに描画してる?
背景のスクロールもしかり、セル単位で瞬間移動描画してる?
というか、スクリーン描画座標と
背景セル上での座標がつじつま合ってれば、そんな問題は出ないでしょ?
どっかに構造的、発想的な問題があるんでしょ。
195 :
181 :04/05/02 23:43 ID:GnjcB1ex
>>194 スクロールは、1回の移動あたりが1セル(16ピクセル)
1セルあたりの移動時間を500m秒
描画時に16ピクセル*(現在時間−移動開始時間)/1セルあたりの移動時間
としてスクロール表現のためのマージンを計算してずらす値にしています
>>どっかに構造的、発想的な問題があるんでしょ。
ありました。
自分がスクロールしている最中に、動く対象が動いた場合、
座標計算が元の位置のまま計算していたので、おかしかったです。
この問題は
>>188 さんのアイデアで解決しました。
>自分がスクロールしている最中に 処理は人によって自由だけど、 普通は自分(主人公キャラでしょ?)は、MAP上を移動していて スクロールは別処理でしょ。 つまり、スクロールがどうなってようと キャラ(主人公だろうが、違う移動キャラだろうが)はMAP上を移動するって処理で問題でないと思うけど? 移動したMAPのセルの更にそのスクリーン座標でキャラ管理でもしてるの? キャラのMAP上の座標(セル) ->(スクロールしてようが)-> その描画スクリーン座標って処理をかませれば?
197 :
名前は開発中のものです。 :04/05/03 02:17 ID:/mbgxFmW
cかc++でdirectx使ったシューティングゲームのプログラミングを 基礎から完成まで詳しく解説してたサイトがあったんですけどお気に入りを謝って消してしまって見つかりません そこのサイトの手順にしたがって学習していくと初心者にもとてもわかりやすくかったのに… ソースファイルをコモンファイルとかに分割する方法まで詳しく解説してくれてたサイトで CとC++とdirectxの基礎をまなびながらシューティングゲームを作るサイトでした gooで色々検索しましたがなにしろヒット数が多くて探しきれなかったです もしこのようなサイトをご存知でしたらご一報お願いします
あきらめろ
Game Programming Gems 4 を読んだ人はいますか? 1とか2があればそれほど必要ではないですか?
201 :
名前は開発中のものです。 :04/05/03 07:59 ID:knX8BTK6
>>200 そのサイトに書いてあった言葉思い出してgoogleに突っ込んで
検索かけてみるしかないでしょ?
それより、気にするべきは再発防止だね。
お気に入りを消してしまったから、わからなくなりましたなんて
2度もやったら恥ずかしすぎて俺なら死にたくなるね。
人に知られたら、もう、2度と社会に出れないね。
永遠の負け組確定。
お気に入りの保存の仕方は覚えた?
>>199 俺は注文したよ。まだ届いてないから何とも胃炎が。
原書のほうは(邦訳版よりは)安いんだし。買っとけ。
204 :
名前は開発中のものです。 :04/05/03 16:03 ID:rLHaxHTb
ネットワークゲームを作りたいのですがお勧めの本を教えていただけませんか。 探したところネットワークゲームを作るための書籍が少ないように感じましたので 書き込みました。ちなみにDirectPlayを使おうと思っています。 やはりTCP/IPとかのゲーム以外でのネットワークプログラミングという形で探したほうがいいのでしょうか。 アドバイスお願いします。
資料はあるだろう まともなサンプルは見たこと無いが
206 :
名前は開発中のものです。 :04/05/03 19:43 ID:Omwokgo9
>>181 そもそも、根本的に位置の管理方法が間違っていると思う。
プレイヤーやその他の移動するキャラクターの位置は、
背景スクロールにかかわらず、背景全体が収まる座標で持てば良い。
もちろん背景は、動かないとして計算する。
そして、実際の画面に出す時に、プレイヤーや他のキャラクターの位置を
画面内の表示位置に変換する計算式、表示する背景の領域を求める計算式、
を用意して、それぞれの表示位置を決めれば良い。
JavaやC#に慣れていると、 C++での開発が効率悪くてかなわない。 DirectXを用いたゲーム開発では、 いまだにC++が主流だしやむをえず。
208 :
名前は開発中のものです。 :04/05/04 05:59 ID:ErnoVSSx
スーパーファミコン用シューティングゲームのプログラムに携わった人いる?
>>207 そんなに変わるか?
オブジェクト指向言語だし、たいしてかわんねーよ。
何やって使ってんだよ。
まぁ、結構変わるね 結局ゲームで多用するリスト系とかはこれら中間言語系は得意 ポインタでガシガシやりよりバグでないしね コンパイル時でエラーだしてくれるのでCより実行時でのチェックが少なくて負担は減る ぶっちゃけC++はオブジェクト指向風味を取り入れたCでしかないと思われ 俺も深くjavaとかc#に触る前まではあんまり変わらんと思ってたけどね
SSE がもうちょっとレジスタ本数増えて ベクトルの基本演算くらいサポートしてくれたらなぁ・・・ 頂点シェーダレベルのことができるサブプロセッサがCPU側についてくれたらよいのに
無駄に難しくてよいと思っている 何もかもアセンブラでもよろしい 怠け癖がつくと最終的には 「寝ッ転がりながら頭に概要を思い浮かべるだけで勝手にソース書き上がるようにしてほしい」 などと言い出しかねない
簡単、難しいていうより、注意力便りなのは嫌。 人間、ミスする生き物だし。 人的ミスが入らないように自動化出来る部分はすべき。
より具体的に言うなれば、 メモリ内のデータフロー、ロジックフローを きちんと把握、利用できることが重要なのであって、 それに関わるコンピューター寄りの知識は 速度を重要視しない限りは必要無いんだよな。 環境に頼って手抜きしようとする人間は、 複雑化したデータフローなんて追えなくなってあぼーんするだけ。 でも環境に依存しようとしない人間は 脳内で可能な限り動きを構築してから実際にコードに落とすんで、 コンピューター寄りの本来の目的と直接関係しない部分は排除した方が都合がいい。 自分でデータを細かいところまで管理する環境を少しでいいから経験しないと、 メモリ上のデータをどう扱ったらいいのか学習しにくい。 学習初期に 「メモリ上のデータはライブラリが管理してくれるから俺はデータ突っ込むだけー」 なんて覚えたら洒落にならん。 確かにデータは突っ込むだけなんだが、 何も考えてないとすぐに商品が整頓されてないコンビニみたいになる。 学習初期に最も重要視すべきは管理能力だ。 結局、若いうちは無駄だと思うことも多少はやっといた方がいいってこった。 管理能力がしっかりしてきたら、最近の超高級言語に触れてもいいと思うな。 その方が開発効率いいもん。
>>215 いや、さすがにそんなところは
必要ないって言えばない部分だろ。
アセンブラ組んでた俺でも最近は絶対いらないって確信もって思うぞ。
>>216 現在は開発する上では必要ない事でも、知識としては知っておいた方が
良いことって、あるじゃない。
218 :
215 :04/05/04 22:27 ID:fBBUT8Xb
>>216 俺もアセンブラほどの学習は要らないと思うよ。
C/C++ でそこらのアルゴリズム本の内容を自分で実装できる程度で充分。
> 必要ないって言えばない部分だろ。
言えばない部分だな。
レイとトライアングルの交差判定ルーチン SSE化したら笑っちゃうくらい速くなった アルゴリズム全く換えてないのにC+FPUで書いたものより 20倍平均速くなった SSEで内積だすのいちいちマンドクサかったけど 当たり判定が20倍速くなったっつーのはでかいので満足
何がひでえって、ライブラリ頼りな奴! メーカーで言えばIO Interactiveみたいな MFCで楽に組めるんだから最適化なんて面倒でしてらんないよーん みたいな感じで思い浮かべてもらえると分かりやすい だからっつってN64みたいな職人芸的コーディング必須! んな環境はノーサンキューだが。
仕事干されたハゲが吠えてますが、そっとしてあげてください。
アセンブラでリバースエンジニアリングできる奴はとにかく食うに困らないな。 アンチウィルスで金を稼ぐ会社なら、これができるだけでOKだし Winnyをイジッて暗号化を解いた奴もこれで金を得、 ウィルス作って人に迷惑かけるのにも役立つから、 まことにもって有用な言語だな 食うには困らんが時間は不自由するがね
>アセンブラでリバースエンジニアリング ハァ…
224 :
名前は開発中のものです。 :04/05/07 15:39 ID:LKHXe0/4
2Dのアクションゲームを作っています。 2つの長方形同士の衝突判定を行いたいのですが、それぞれが回転しているので 頂点のXY座標の大小で判断すると言う手法が使えません。 法線の内角外角を使うとか、行列を使うとか、3D制御に近い手法が有ったような 気がするのですが、平面限定で高速化する手法はないでしょうか?
正確な判定方法と高速化は別問題。 高速化したければおおよその判定後、厳密な判定を行えばいいだけの話。
>>224 AABB、OBBをキーワードにgoogleで検索してみ。
ちなみに「頂点のXY座標の大小で判断すると言う手法」は
一言で言えば2DにおけるAABB同士の衝突判定だーね。
OOB同士の衝突判定の適用対象を絞り込むためにAABBを
使うのも当然可。
s/OOB/OBB/
228 :
追記 :04/05/07 17:55 ID:UAroqB1G
>>225 >正確な判定方法と高速化は別問題。
正確かつ高速であればより良い場合が多いわけだが、別問題とはこれいかに。
>高速化したければおおよその判定後、厳密な判定を行えばいいだけの話。
「だけ」か?高速化手法は何も一つではないんだが。
229 :
224 :04/05/07 20:42 ID:fOYveHqs
うーむ、やっぱり行列なのですね〜。 D3Dをいじっていた頃の苦い思い出が〜 とりあえず、行列で頑張ってみます〜、何か突然ひらめくかもしれないし。 Thanksです〜
230 :
225じゃないけど :04/05/07 21:07 ID:AD11pjLw
>>228 >高速化手法は何も一つではないんだが。
効果があるのは225の方法しか浮かばないんだけど?俺は。
他に2つも3つも方法があったっけ?
231 :
224 :04/05/08 00:28 ID:tC9ANaFq
まてよ、2つが回転していると考えるから複雑になるんであって、 どちらかを座標系の基準にしてもう一方を相対角度、相対座標で考えたら sin、cos、tanだけで片がつくのかな…
232 :
226 :04/05/08 00:51 ID:Uo5OKKLo
>>231 うん。例えば辺と辺の判定をするときに
どちらか一方を基準とする(軸とする)座標系に
投影してやると計算を単純化できるのと同じ要領。
233 :
226 :04/05/08 00:53 ID:Uo5OKKLo
>計算を単純化できる ワリ。ここは嘘。
234 :
名前は開発中のものです。 :04/05/08 01:19 ID:aaHhGMRi
>>231 3Dのコリジョンである方法だったような、、。
自前で組んだ事がないのであれだが、、。
対象のローカル座標系に持っていくとかなんとかだったような。
>>230 高速化手法は「前処理の近傍探索」だけではないだろ。
まぁ、たしかに重要なファクターではあるが、局所分布の
状態によって(ゲームによって)最適な実装は変わるなど、
汎用的究極的単一的解決方法はひとつではない単純ではないため。一言で片付けるのは単純化。
2Dアクションや格闘ゲームならベタな方法幾何計算の最適化
だってあるし、時間軸方向のキャッシュ・諸計算の
SIMDや外部プロセッサによる並列化など、状況に応じて
いろいろある。
236 :
236 :04/05/08 01:50 ID:Uo5OKKLo
↑誤送信。
>>230 高速化手法は「前処理の近傍探索」だけではないだろ。
まぁ、たしかに重要なファクターではあるが、局所分布の
状態によって(ゲームによって)最適な実装は変わるなど、
汎用的究極的単一的解決方法があるわけでもない。
一言で片付けるのはやや単純化に過ぎる。
2Dアクションや格闘ゲームならベタな方法幾何計算の最適化
だってあるし、時間軸方向のキャッシュ・諸計算の
SIMDや外部プロセッサによる並列化など、状況に応じて
いろいろある。
237 :
226 :04/05/08 01:56 ID:Uo5OKKLo
何度も御免。寝る寸前で酔ってるもんで。勘弁してください_| ̄|○
>>230 高速化手法は「前処理の近傍探索」だけではないだろ。
まぁ、たしかに重要なファクターではあるが、局所分布の
状態によって(ゲームによって)最適な実装は変わるなど、
汎用的究極的単一的解決方法があるわけでもない。
一言で片付けるのはやや単純化に過ぎる。
2Dアクションや格闘ゲームならベタな方法があるし
他にも幾何計算の最適化、時間軸方向のキャッシュ
諸計算の SIMDや外部プロセッサによる並列化など
状況に応じていろいろある。
寝る。
リアルタイムのオブジェクト共有を実現したいのです. 共有の仮想空間にあるオブジェクト(クラスのnewしたもの)を作った場合, つまり,例えば黒板に図形を書いた場合, 相手も自分もその図形を移動や塗りつぶしたり,拡大とか縮小とか可能にしたいんです. でも,物理的に不可能なことは出来ないようにしたいんです. (相手が移動してるのに,自分が削除してるとか) 常識的に考えれば,制御権のようなものを厳密にやり取りして, 特定ユーザに制御を委ねていくしかないと思います. でも,シリアライズみたいにして,簡単にオブジェクトを転送すると, サーバで差分を判断して・・・みたいな手法はないのでしょうか? これって,ネットワークゲームで,例えば,ボスが攻撃されたら,全てのクライアントでの ボスのパラータが変化するのと似ていると思うのですが, ネットワークゲームではそのあたりをどのように扱っているのでしょうか? 参考になるような,サイトでも本でも(英語でも)ありましたら,教えてください.宜しくお願いします.
>>238 C/Sモデルにしてサーバーで管理すればいい。
えと、質問です。 class GameObject { Camera camera; Map map; } class Map { MapField field; MapObject object; } こんな感じのクラス構成になっているんですが、 fieldやobjectの描画にはview frustumが必要なわけです。 そのため、cameraのポインタがgameobject>map>field>tree... と、殆どのクラスに知られている状態です(汗 しかし引数として毎フレーム渡すのも速度、綺麗さ共に、、、 これを改善する知恵をお貸しください(;´д⊂) #チョト前に同じような質問があるぽいですが、c++をイマイチ理解していないため #多重継承を当然とした議論には付いていけない(´Д`;)ヾ
>>240 大域変数に「現在描画中のカメラ」というものを設けて、パラメータ取得はアクセサ経由で行えばよいのでは?
そもそも一般的なテクニックとしては、被写体がカメラを知っているという構造よりも、
カメラが被写体を知っているという構造が好まれます。被写体登録時にどのカメラで描画されるかを
(enumなどで指定して)、それ以後、被写体はカメラの詳細については感知しないという実装になります。
意味わかりますか? なんにせよ、もう少し情報が欲しいところですなあ。
>>240 多重継承は使わなくていいと思う。
>そのため、cameraのポインタがgameobject>map>field>tree...
>と、殆どのクラスに知られている状態です(汗
これはこれで正解だと思う。
#
>>241 のカメラの方が物体を知っているっていう設計でもいいけど。
仮にカメラ、またその関連のものを引数で渡さずに、
グローバルインスタンスとして用意しちゃうと
カメラインスタンスと描画する物体のインスタンスとの関連が
すげーわかりにくくなっちゃうと思うよ。
引数は多くなっちゃうけど
突然どこかで内容を変更された変数に悩む事が無くなるから
こっちの方が俺はいいと思うけどね。
>>240 >多重継承は当然とした議論
そんなことは決してありません。誤解の無いように。
まぁ、私なりに噛み砕いて説明させてもらいますと
ヤバイ。多重継承ヤバイ。まじでヤバイよ、マジヤバイ。
多重継承ヤバイ。
まず乱用。もう乱用なんてもんじゃない。超乱用。
乱用とかっても
「friendクラス20個ぶんくらい?」
とか、もう、そういうレベルじゃない。
何しろ無限。スゲェ!なんか節操とか無いの。クロスリンクとか何?名前重複とかを超越してる。無限だし超乱用。
しかも病み付きになるらしい。ヤバイよ、病み付きだよ<<以下略>>
246 :
244 :04/05/10 02:57 ID:AwWht2q3
>>245 ありがとうございまつ。
なんとなくそこでプレイヤーのソースが落とせそうな雰囲気があるような
ないような(汗 ・・・
ライセンスがどうこうの部分が怖いので翻訳ソフト買ってから出直してみます。
情報有難うございました。
247 :
名前は開発中のものです。 :04/05/10 20:43 ID:FfmNag7E
また初心者が
>>241 みたいなのを読んで騙されてあとで心配になって
レスするようなことがありませんように。
>>247 心配ならば、あなたの意見を書いてみてはいかが?
>>247 俺漏れも
>>240 無意味なフレームが始まらないうちにCameraや他のへんな名前がついたクラスを
それぞれ具体的にどういうデータのまとまりとして捉えているのか詳しく説明しておいておくれ
そんなに変な名前なのか、チョトショック、、、 GameObjectはそんなに意味ありません。一番上位の物って言うか、、 Cameraはカメラのpos,dirを持っていてsetするとgluLookAtでそっち向いてくれます。 Mapはそのままマップのクラスです. MapFieldはハイトマップです。quadtreeによりカリング、簡略化をして自分を描画してくれます。 MapObjectはマップのオブジェクト(メッシュ)の集まりです。(書かけ) 、、、えーと毎フレームポインタ渡します;;
OpenGLだよなぁ? マトリクススタック使えばいいやん。
>>251 命名の仕方は別にいいと思うよ。
俺もこんな感じだけど。
わけがわからないものはGameObjectだけかなw
そんなに意味ありません。って自分でも言ってるしやっぱり意味無いんだよw
254 :
名前は開発中のものです。 :04/05/12 00:45 ID:BAYSJTEJ
>>240 殆どのクラスで知られる必要のあるものが、その通り殆どのクラスからアクセスできる
ようになっていることは何もおかしなことではないと思う。
もしも視錐台を参照することだけが殆どのクラスで必要で、
カメラの位置を変えることは必要ないなら、視錐台を読み取るメソッドだけを
staticにしてやって、カメラの位置を変える限定的なクラスにだけ
Cameraを引数で渡すようにしてもいいんでは?
255 :
名前は開発中のものです。 :04/05/12 02:55 ID:zyRW5yeg
カルドセプトのようなボード・カードゲームにおいてCOMのプログラミング としてはどういったアルゴリズムなんですか?
>>255 どんなゲームでも人間と同じじゃないかな?
基本は、今の状況を見て、次の行動を判断する。
ってところだから。
稀に、インチキ臭いのあるけどw
>>255 オーソドックスなところでチェスとか麻雀を参考にしてみては。
資料が見つかりやすい。
読むにあたっては、初歩的な統計学やグラフ理論の知識が
要る場合があるかもしれんが、その辺苦手なら入門本の
一冊でもあれば十分。あとはチクチクやってれば何とかなるから。
キャラのアニメーションの質問なんですが 1つあたりの絵の使用時間はどのようにすべきなのでしょうか? アニメーションを作るツールだと単純に時間を用いて ウェイトをとっていますが、同じ方法なんでしょうか もしくは、フレーム数を用いるのでしょうか?
好きなように実装すべし
260 :
:04/05/16 10:24 ID:1hAhUILx
前に、回転する2つの2D面の衝突判定ってあるけど、俺のやり方 1.物体の半径を求めておく 2.まずは半径を使って円同士の接触判定をする 3.円同士であたってれば、ラインごとの判定 四角形同士なら、全ての辺同士の判定をする。 だから、判定回数は最大で16回。
それって片方がもう一方に完全に入ってるとミスらない?
>>260 四角形同士の判定をするために4辺の判定をしてるんだから
4辺の判定をするために四角形の判定が必要だったらいみねぇよ
↑ 263へのレスね
回転してる四角形のようだぞ
>>266 そうか、回転してるんだっけ。
じゃあ、
>>263 は意味がねぇな。すまん。
ううむ、難しいなコレ。
俺なら諦めちゃうな、このやり方。
それか、片方の四角形のローカルに一度もってきて
(四角形のローカルにもってくると、片方の四角形は原点を中心とする〜略w)
そこから、もってきた四角形の辺の始点終点でローカルにある四角形の範囲の計算をしてから〜略
ってなるかな。結構、面倒だね。
>260 お願いだから図に書いてくれー オブジェクトはどんな形だ? 正六面体? 軸はどこだ? オブジェクトの中心か頂点か、面の中心か? 変な妄想してしまって収集がつかない。
>>268 こんなのいちいち図に書いてたら話が進まないよw
軸や中心なんか話の問題にならないと思うけどな。
多角形同士の判定でいいじゃん。 多角形Aの頂点が多角形Bの中にあるかどうか、 多角形Bの頂点が多角形Aの中にあるかどうか調べる。 内外判定は適当に線分を外に引いて、辺と交差する回数でチェキ
>>269 要するにOBB同士の衝突検出っつーことで一般的な話だから
OBB collision detection でぐぐれば図とか出るかもかも。
273 :
260 :04/05/17 19:00 ID:RxL4Iwuq
>261 ミスるな。 2D面がそこまで速く移動しなければ問題にならないけど。 あれは、ワイヤーフレームの接触を判定する方法だな。 面が完全に中に入ってるかまで検出するには・・・。 ラインに、表と裏の情報を持たせて、 裏から出した法線が、相手のラインと接触するかを求める方法がある。
ジョイパッドでの動作確認をしたいんだけど キーボードをジョイパッド代わりにできるツールってないかな? 逆はあるんだけど・・・
無いの(710)なら(奈良)作ってしまえ平城京
つーか、普通に買って操作感とか確認してみた方がいいと思うが…
2000YENぽっちぐらい出せよ
複数のゲームデバイスが繋がってる状態も考慮しといてくれ
>>275 ジョイパッドなんて安いんだから素直に買ってきなさい。悪いことは言わないから。
ゲーム作るなら違う種類のを複数持っといて
どれでもちゃんと遊べるか確認しろと言いたいほどだ。
そういえば、えろげの多くはジョイパッドすら対応してないな。
>>281 ご自身のジョイスティックでおた(以下略
相談です。 自分、パソコンの知識はほとんどありません。 ネットが出来る、2chに書き込めるって程度なもんです。 けど、将来はゲームを開発したい。 で、開発したゲームを家庭用ゲーム機で発売して、 みんなに良い評価をもらえるようなゲームを作りたい、と考えてます。 作ってみたいゲームジャンルは、全てです。 RPGも作ってみたい、アクションも、シミュレーションも、ネットゲームも作ってみたい、と思っています。 企画も作りたいですし、シナリオも書きたい、ドット職人なんてのもいいですね。 とにかくゲームを作りたいんです。 でもまぁ、そんなものは高望み以外のなんでもないことはわかっています。 だから、とりあえずはアクションを作ってみたいと考えています。 これなら、少人数で作ることも可能でしょうし、ゲーム作りの肝も詰まってそうかなぁ、なんて。 そんな俺が学ぶべき知識はどのぐらいあるのでしょうか? そして、何を学んだらいいのでしょうか? たぶん、星の数ほどの知識が必要だと思うのですが、とにかくやってみたいのです。
やる気と時間(大学生相当)がある人なら2年分ほどかな とりあえず大きな書店にいって入門向けの本をひたすら立ち読みしなされ。 そして自分にあいそうなのを購入。 プログラマ目指してるのかプランナ目指してるのかよくわからんが 現状でプロのプログラマ目指すなら、 C言語、C++、VisualC++6.0、DirectX あたりをキーワードにして本やら情報を集めればいいかと。
プログラマになりたいなら 最低限の勉強でゲームを作れるようになりたいとか考えてるようでは無理では? 技術の進歩はものすごく早く、次から次へと新しいことを覚えなくてはならないからな 勉強嫌いでは務まらないのがプログラマ
>>284 読む限りでは、ゲーム製作に携わりたいとしか読めないな。。。
漠然とした質問って困る。
別にプログラマになりたいとは書いてないじゃないの >284 プロ目指してるわけじゃないなら、難しいことなんて何も無いじゃん。 本屋でDirectXの本を何冊か買ってきなよ。 そしたら何からはじめたらいいか分かる。
>>284 学問に王道なし。
ゲーム作りというのは純粋な知的活動であり、相応の知的能力が求められる。
ひたすら本屋や図書館に通い、ひたすらGoogleにキーワードをブチ込み、
ひたすら数学や英語を勉強する。これが入力。
ひたすらプログラムを書き、ひたすら文章を書き、ひたすら絵を描く。これが出力。
興味を持ったこと、疑問に思ったことは、何でも学び、学ぶだけでなくそれを活用しよう。
自分の周りで起こることすべてに関心を持とう。脳に負荷をかけ、それを常態とせよ。
すべてのことに手を出したいのであれば、時間はいくらあっても足りない。
人並みにテレビを見たりゲームを遊んだりする余裕はもはやないと思え。24時間を管理せよ。
2chは1日数回まで。祭への参加禁止。
短くて半年、長くて10年もあれば、何らかの成果は出ているだろう。
実際的なことについては、まず、入門書の類を片っ端から読み漁るべし。
これはどんな分野に挑戦するときでも極めて有効な手段である。
専門書はいきなり読むには難解すぎるし、入門書は平易だがミスリーディングがありすぎる。
しかし、入門書を何冊もあわせて読めば、偏りを打ち消し、
また、説明のわかりにくいところを他で補うことができる。
今はGoogleあるし、楽だな。 情報溢れすぎ、迷うぐらいかな。 こんな所で聞く必要もなし。 漏れらの頃は、X68000で他人のソース読みまくって、 覚えたもんよ。
少なくとも、井の中の蛙になる危険がないってのはうらやましいな。 俺の高校時代なんてまさに盲目だった。
常時接続になってからコンピュータ書籍コーナーに入り浸ることが少なくなったな
格闘ゲームのコマンド判別方法なんですが、 入力履歴とコマンド列群の全マッチをとる方法以外に 効率的な検索方法を教えてください。
>>294 が王道だけど、全マッチでもいいじゃん。
どうせたいした計算量じゃないんだし。
296 :
名前は開発中のものです。 :04/06/10 00:05 ID:EVE2hvMP
>>295 >どうせたいしたゲームじゃないんだしw
酷い人ね!
297 :
名前は開発中のものです。 :04/06/10 01:22 ID:5cqiK5gW
>293 いまはメモリが沢山あるから、 コマンドの全分岐パターンを、メモリにいれておけばいいじゃん。 コマンドに、波動拳と、たつまきがあるとして、 まず、下があって、次にコマンドとして継続可能な入力は、 右下か、左下で、 とう具合に。 波動拳なら、 まず、下で、次にコマンドとして分岐可能なのが、
自動羊肉ってなんだろう。なんかあるのかな。 まあメモリがあるなら、とりあえず希望道理に動作する処理を作るのがいいかと。 まずパターンマッチで作ってみれば良し。 それで自分で入力して遊んでみれば、いろいろ改善点も見えてくると思う。 SNK系とカプ系でも設計思想が割れてて、なかはこうなってんだろうなぁとかそのうち見えてくると思うよ。ちと古いか。
やっぱ相談される方としては、どう作ればいい?といわれるより、こう作ったんだけど こうできませんって感じのがいいよな。 ヘローワールドくらい出力させられる段階になったら、まずなんか作ってもってこいとオジサンは言いたい!
struct InputNode { InputNode *ipsiron_node; };
301 :
300 :04/06/10 02:50 ID:cR6g+xdu
描き込むつもりはなかったんだけど、間違ってなんか訳わからんのを描き込んでしまった( TДT)スマソ
class HissatsuKomandoHadouken: extends HissatsuKomando{ public: void update(){ switch(count_){ case 0: if(g_Keyboard.getKeyState() == Keyboard.DOWN)count_++; break; case 1: /* (略) */ case 3: Hatsudou(); count_ = 0; break; } } private: int count_; };
そこまで自力で出せるなら、それを組み込んで遊んでみるのがいいかと。 もし壁にぶち当たったら、また質問スレにくればいい。
変数名の最後にアンダースコア使うなんて気持ち悪い。
おまえらツクールXP買え
ツクールでプログラムできるやつってあったっけか。
>>307 マルチゲームScripter
内蔵の言語/簡易言語なら
最近体験版が出たRPGツクールXP、ADVツクールシリーズ、
格ゲーツクール、チャイムズクエスト
他にもあるかもシレン
>>285 何でVCが6.0なんだ?
ネイティブコードは普通に打てるし.NETでも構わないと思うが。
最近入門書も増えてきたし。
DirectX7のDirectDrawで透過処理をやっているのだけど、
落ちてたサンプルをほとんどそのまま使っています。
一通りは理解できて、動作するのだけど、どうしても解からない部分があります。
50%の透過色を得るのに、
※lptemp1=転送先のバッファ
※lptemp2=転送元のバッファ
*lptemp1 = ((*lptemp2 & 0xf7de)+(*lptemp1 & 0xf7de))
>>1 ;
の式で、なぜ「& 0xf7de」する必要があるのでしょうか?
ディスプレイは16ビットの565でやっています。
312 :
311 :04/06/13 14:48 ID:zqEFd0SE
すみません。ちょっと言葉が足りませんでした。 「& 0xf7de」でビットマスクをかけているってのは解かったのですが、 これでなぜ正常に色が表現されるのかが解かりません。 よろしくお願いします。
2進の加算では、桁上がりは最大でも1。 各要素のひとつ上のビットを0にしておけば、 加算時の桁上がりが確実にそこに反映される。 それを一つシフトすれば、元の各要素の位置に、 それぞれ足して2で割った値が入る。 隣り合う要素の最下位ビットが失われるので、 最大で1の誤差が生まれるが、演算速度の向上に比べれば 無視できる範囲だろう。
314 :
311 :04/06/13 15:45 ID:zqEFd0SE
>>313 なるほど。
加算した時の桁上がりが、別要素の色に悪ささせないために、
マスクをかけているわけですね。
確かにPhotshopで作った半透明画像と、
プログラムで出力してキャプった画像の色のRGB要素が微妙に違っていました。
おかげで胸のつかえが取れました。
ありがとうございました。
勝手に補足。 1 1110 111 1 10 11110b=F7DEh RRRRRGGGGGGBBBBB 1111011111011110 + 1111011111011110 ------------------ 11110111110111100 11110111110111100 >> 1 = 1111011111011110
>>314 知ってたから答えることもできたけど、
こんなコードをコメントなしで書いてしまうのはお勧めできない。
317 :
311 :04/06/13 16:14 ID:zqEFd0SE
>>315 補足ありがとうございます。
視覚的にも理解でしました。
>>316 すみません、以後気をつけます。
>>311 >落ちてたサンプルをほとんどそのまま使っています
どうでもいいが、そのサンプルの出典(ソースの出自)を書かないのも
あまり誉められた真似ではないな。俺は知ってるが、お前が貼る事に
意味があるので少しだけ待ってやる。
↑ アホ?
アホだな。
スルー汁
lptemp1でググればズバリが出てきますよ(^_^)v
>>323 比較的サラっと出てくるのは、そういうコードに触れた事があったり前例があるから。
PCのアマチュアプログラマでも、たとえば上げられたページなんかを見たことがあれば
応用できるようになるだろうよ。
その手のビット演算系のテクニックは、古いプログラマならだれでも思い付くだろ
>>325 > 比較的サラっと出てくるのは、そういうコードに触れた事があったり前例があるから。
いや、算術演算の加算回路を知ってれば済む話だが。要するにそこは論点じゃあないよ。
汎用知識を個別の分野に適用しよう、というアイディアを思い付くことは素晴らしいし
ネット上で広めた奴には賛辞を惜しまないね。という話だろう。
>>327 レス番号を書きたまえ。尤も、お前さんの発言を否定する書き込みは見当たらないようだが。
なお、大昔のPC-98用のペイントソフトを逆汗したときの経験だが ぼかしツールのコードと思われる部分で16bitレジスタによる8bit値 飽和演算処理を見た。おそらく、それ以前の画像処理方面のプロプライエタリな コードの中でも同様なテクニックが使われていたであろうことは 想像に難くない。 こうしたアイディアを発見的に思いつきオープンな場で広く語られる きっかけを提供した奴らは気の利く奴らであり、相応の評価をしても バチは当たらないだろう。
フリーの物でゲームが作りたくてとりあえずJavaを一通りつかえるようにしました でもJavaゲームってけっこう叩かれてて… もう少し技術が身についたら他の物で作ろうと思うんですけど何がおすすめですか? それともこのままJavaを使ってても充分なものをつくれるでしょうか?
言語は問題ではない ようはやる気 3Dものならアレだがまずはそのレベルまで言ってないと思うから Javaで問題になることはないだろうね
まぁ、JNIでjavaからDirectXよんでもいいしな javaも1.4からは標準でvram直とかDirectDraw使ったりして高速化できるし フルスクリーン化もほんの数行でできるし通常の2Dベースなら問題ないけどな
アドバイスありがとうございます いろいろ考えるよりもまず作ってみますね
画像ファイルの形式ってなにを使えばいいんでしょうか? 今は使ってないんですが、将来的に透過情報も使うかもしれないので PNGとかにしようかと思ったんですが、libpngを使うと思ったより実行ファイルが 大きくなっちゃいまして。
手動でハンドリングするか、独自形式で持てばいい。 A付ビットマップだていいじゃないか。
>>335 >libpngを使うと思ったより実行ファイルが大きくなっちゃいまして。
無圧縮バイナリが200KB程度増えることが障害になるケースが
あるのか疑問だが、もし気になるならlibpngが内部で呼び出してる
zlibを直接呼び出せばいいのではないか。あれは64KB程度だろう。
実行環境のHDD容量をハデに使っても構わないなら
>>336 が云うように
RAW形式にしておけばいいし。どのみち配布時はLZ77派生アルゴで
圧縮するわけだし。
ガチャフォースみたいなアクションゲームの、ルート検索ってどうやるんですか? 迂回したり、飛び越えたりしたいのだが、どうやってルートを計算したらいいのか分からない。 マス目上にして、2Dシミュレーション+大雑把な高さのようなのにしようにも、障害物の大きさがバラバラ過ぎて、判定出来ない。 目を細かくすれば、無駄に容量食うし、処理も重くなる。 風雲新撰組を見ると、ポイントのようなものがあり、迷ったらとりあえずそこに出るという形になってるぽいですが、あれも何か変。 いいのありませんか?
壁ずりするときに必要な2点の壁の頂点座標ってどうやって取得するんですか? DirectX&VC++使ってます。
341 :
名前は開発中のものです。 :04/12/09 17:11:37 ID:xa3u+hyT
ホシュ
342 :
名前は開発中のものです。 :04/12/11 16:27:00 ID:vgTlHBwt
OpenGLでパーティクルを飛ばすソース作って来いと言われたのですがまったく思いつきません。 誰か教えてください 開発環境は.NETでGSlib使ってます。
>342 class CParticle{ public: float px,py,pz;// 位置 float mx,my,mz;// 移動 void Update(){ my-=0.1f; px+=mx;py+my;pz=mz; } }; インスタンスを配列でたくさん作ってそれぞれ別々の初期値を px,py,pz,mx,my,mzに入れて、毎フレームUpdateを読んだ後に px,py,pzの座標にビルボード表示しろ px,py,pzの初期値を全インスタンスで揃えて mx,my,mzをインスタンス毎に別々の値にすると 花火のようなパーティくるになる ↑ このソースはさすがに理解できるだろ? あと、マルチポストするんなら、先に質問してほうに断りいれないと失礼だぞ
344 :
名前は開発中のものです。 :04/12/11 16:45:12 ID:vgTlHBwt
すいませんマナーなってませんでしたね 初心者なんでそのソースみるとJAVAに見えるんですがどうなんですかね?
>344 C++です 自分の使用する言語 後、現在OpenGLでどの程度の事までできるのか などなど、情報が少なすぎる
Javaじゃないのはすぐにわかるだろ
すみません、 現在Cにて、シューティングのタスクシステムを構築中なのですが、製作する構造体で悩んでます 今考えているのは @固有データの性質別に構造体を製作 A構造体を1種類しか作らない Bプライオリティ毎に別の構造体を製作 多分実装するなら@かAになると思うのですが、 構造体の種類が増えると重くなるとか、不具合は出るのでしょうか?
>>347 今月のCマガにタスクシステムのってたぞ
>>349 おお!
じゃぁ明日Cマガ買ってきて勉強してみます〜
351 :
名前は開発中のものです。 :04/12/12 00:37:31 ID:CeTMvWXF
ゲームを作るのにお勧めする、 言語ってありますか?
>>351 C++かJavaが一番だとは思うけど、
挫折した(またはしそう)ならHSPが良いかもしれない
知り合いがHSPでゲーム作ってたけど、意外とキチンと出来てるので驚いた
ゲームの規模にもよるけど、JAVAはあまり向かない気がする
354 :
名前は開発中のものです。 :04/12/12 01:10:41 ID:CeTMvWXF
>>352 情報ありがとうございます。
C++ってお金かかりますか?
>>354 コンパイラと開発環境はBCC使えば無料で揃える事が出来る
出来れば.NETを使った方が良いけどソフト代がン万円・・・・・
学生なら学割で5000円になるけどキーコードの申請に2週間以上かかる
そういえば.NETって評価版があったような希ガス
それと落としてみて使ってみてから決めるのがいいかも
356 :
355 :04/12/12 01:30:19 ID:/zorvY1T
>>355 今はベータ版が無料で使えるYO(VisualC++ 2005 Express)
>>355 vcToolKit + プラットフォームSDK + DirectX SDK
全部タダ
BCCよりいいよ
苦労をしたなりに得られるものはあったよ。 書籍も殆どは図書館で済ませているし。 今はD言語+SDLだけど、総合開発環境に染まっていたらこれらの存在を知ることすら無かっただろうね。 総合開発環境も使ったことあるけど、俺は馴染めなかった。 結局のところ、人それぞれ。
>>353 規模というか3Dが、だな
2Dでも規模が大きければJavaや.NETのほうがC++よりはいい
まぁSDL&OpenGLラッパー使えばどうでもいいが
Java3D方面はおいかけていないのでわからない
Javaの利点はあれだ、無料でコンパイラからIDE、データベースを
使った業務プログラムまでこなせるものがひとつの言語で作れるというところだろう
>>355 VS.net学生版登録しましたが,3日で垢とれました。
2万でstudent買った一ヶ月後に五千円になりました。
366 :
名前は開発中のものです。 :04/12/12 23:09:00 ID:B/rSPOKE
独学でプログラムは十分学べるでしょうか?
>366 私の持論ではプログラムは独学で身に付けるものです
ソースを書きまくる
369 :
347 :04/12/13 00:54:40 ID:oagD9H4j
>>349 Cマガ買ってきたら解決しました〜
どうもありがとうございました
>>366 むしろ経験上、独学以外で学んで奴にロクな奴はいない
>>360 よかったよかった
紹介した介がある
371 :
354 :04/12/13 23:44:03 ID:zV7Kakl+
皆さん本当にありがとうございます。 時間があればこつこつと勉強していきます^^
>>366 みんな独学してます。
専門学校も情報系の学部も、周りに同好の士がいるという以上の意味はたいしてない。
しかも、昔はプログラミングの学習曲線は相当鈍いのが常識でしたが、
今ならやる気さえあれば数年でアマチュア最高峰、下手なプロより上のレベルまで行けます。
この記事の表現に従えば、「高速道路が敷かれた」と。
インターネットの普及がもたらした学習の高速道路と大渋滞
http://blog.japan.cnet.com/umeda/archives/001909.html 俺が正統な書物や論文に当たれないまま
授業中にウンウンポリゴンの出し方考えてた頃と比べりゃめっちゃ恵まれてるから、
悩まずとっととやれ。
初心者がwindowsで2Dシューティングを作るには どのプログラミング言語orツールが適していますか? 勉強しながら簡単なサンプル程度のものから始めようと思っています。
HSPかVC++ Delphi、Rubyもいいかもな 豆乳、GameMakerという手もあるか
初心者にC++をすすめるのはどうかと ま、まずは言語自体が初めてなのかゲーム作成が初めてなのかによるが
>どのプログラミング言語orツールが適していますか?
と聞いてるあたりからプログラム経験は無いと思われ。
そんな
>>373 にはMultiMedia Fusionを薦めてみる。責任は取らん。
>373 プログラミングがしたいんじゃなくてゲームが作りたいだけなら>377 すぐに画面に何かだして動かしたいならHSP、GameMaker、豆乳 時間はかかっても超本格的にやりたかったらC/C++ ちなみにC/C++はどんなに早くても3ヶ月くらいは ビットマップ一枚表示できないことを覚悟せよ 個人差や学習効率によってはもっとかかる 挫折者も多い ちなみに漏れはCがはじめての言語で 結構みっちり勉強してたけど 絵をウィンドウに出すまで半年かかった でもC/C++だと(ある程度マスターできれば)飯が食える
>>378 ヲイヲイ、初心者をいじめるなよ。
現実、.netでもCでSDKならSTGの型を作るだけなら
一週間(一日3〜4時間×5日+10〜14時間×2日を目安)でできぞ。
(馬鹿な事言ってるのは分かるけど突っ込まないでね。)
ただ、問題はそこから
アルゴリズムとか、言語の色んな仕組み、その他多くの関数を知らないと
そこから先進めなくなる。
で、一番高い難所は
Visual Studioの使い方だ。これを理解するのに2日掛った・・・。
380 :
>>379 :04/12/14 18:19:40 ID:FapYMSue
参考までに、自分が使ったものを、
・HSP(一番最初はこれが神に見えた。)
Cを始めるまでに4・5日ぐらいはやってた。Sampleが多いから勉強しやすい。
・猫でも分かるプログラミング(今のCプログラム初心者が一度は見る所)
でも、自分はあんまり役に立たなかった。古い記事が多いので念頭に置くこと
・WisdomSoft(
ttp://wisdom.sakura.ne.jp/ )自分はここでCをほとんど覚えた。
ここの人が書いてる「Windowsゲームプログラミング:書籍」で実質SDKを覚えた。
・C言語 (
ttp://www.wakhok.ac.jp/~kanayama/C/98/ ) とある短期大学の物
別にそこの学生じゃないんだけどね。上とあわせてCを覚えた。
・窓プログラミング (
ttp://hp.vector.co.jp/authors/VA016117/index.html )
色々とポインタとか、特別分かりやすかったわけではないが。
・あと、もう一つあるんだけど、今はWeb上に残ってないので省略。
( 自分はその時のDownLoad版を今でもたまーにみてるけど。)
あとは、Googleでとにかく分からない単語を調べる。=>分からなくてもそのうちどうにかなるさと開き直る。
エラーもとにかく調べる=>解決したときは、その方法を、そのページをコピーしてOffLineでも見れるようにしておく。
381 :
>>379 :04/12/14 18:37:06 ID:FapYMSue
基本的に、方針として 1.コンソール物をいくつか作ってみる。(main関数だけでいいから) ■適当に数回「分岐 if switch 」とか、「ループ」「配列」「文字列」「ファイル操作」とかのサンプルを研究 で、プログラム板の宿題スレからなんか適当に選んで作ってみる。 2.関数を理解する。 ■「引数」「関数」「返り値」とかの言葉を調べる。 1.に同じく、プログラム板の宿題スレ(略 3.Win32APIを泣きながら覚える。 ■とにかく、記事を読む。Sorceを読む。分からないものも調べる。 でも分からないものはそのうちどうにかなるさぁと開きなおる。 4.自分だけで(カット&ペーストは使ってもいいが)キー入力と絵の表示を連動する物を作る。 5.あとは、野と成れ山と成れ
>381 >5.あとは、野と成れ山と成れ なんかカコイイw
>>379 一瞬、「白紙の状態からC++を理解してSTG製作」を一週間でこなしたのか
とか思ってしまった俺は負け組み
まぁHSPはちょっとやったけど、あれも爆発的に手間が省けるってほどじゃない・・・・・・・
結局システムとか判定は1から作らないといけないし・・・・・・
>結局システムとか判定は1から作らないといけないし・・・・・・ それを省いたら××ツクールになってしまう。
>>384 でも、システムとか判定は種類が違えど、どこかしら似ている部分が多い。
再利用できる汎用エンジンを自分で作ればいいじゃないか。
ゲーム開発そっちのけで オナヌィツールを作るのに夢中になる罠
まーわざわざゲームプログラミングやってるって 客観的に見たら、ォナニーにしか見えないだろうとは思う・・w
>388 まぁプラモデルなんかも同じようなもんだろうな
なんだって初めはオナニーだろうさ
>>390 じゃあ、もう、オナニーでいいよ。
みんなプログラムなんて組むのやめようよ。
391は不思議な頭の構造をしているようだ
・オナニーに似ている と言っているのに ・オナニーしよう というのは(*^ー゚)ノ ぃょぅな構造をしているとしか思えない
394 :
373 :04/12/16 08:50:59 ID:Ts+btREq
たくさんのご親切なレスありがとうございます。
>>377 で作ってみます
まあ、最も無難な選択だ。
最初はそれでいいと思う それで限界だと思ったら別のを探せばいいしな
あと、最初から欲張らないことだな。 目標は高く持つべきだが、いきなり挑戦するのは無謀。絶対嫌になる。 いきなりチョモランマ登頂を目指すのではなく、まずは天保山辺りから少しずつ進めていく。
>>399 BallWnd::OnTimerを追加(中身はOnLButtonDownと同じくInvalidateで良い)
メッセージマップにON_WM_TIMER()を追加
InitInstanceの最後にSetTimerをElapse=1000で追加
引数はMSDNなりなんなりで調べれ
401 :
名前は開発中のものです。 :04/12/17 23:01:07 ID:phamhyn5
RPG、SRPGなどの、正方形のマスが1単位のフィールドのタイプのゲームでは、 どのようにフィールドを表示するのが普通なのでしょうか。 僕はSRPGを作っていて、僕のは、フィールド1マス分を表示する関数があって、 そこで、地形下地、地形上地、移動範囲、攻撃範囲、キャラ、カーソルと 順番に表示し、フィールド全体を表示する場合は、それを複数回行う方法です。 全てが1マスに収まっている場合はその方法でよかったのですが、 キャラの立つ位置を変えたり、ダメージを受けた時に吹き飛んだりさせたく、 キャラの位置をマスからはみ出して表示させたくなったのですが、 それをやった所、案の定、体が千切れて表示されてしまいました。 ツクールでは、地形サイズが16に対して、キャラが24なので、 はみ出しているのが普通なのですが、どの様に表示しているのでしょうか。
フィールドとキャラの描画を分ければいいだけの話じゃ…?
フィールド1マスごとでなく、フィールド全体で、 地形下地、地形上地、移動範囲、攻撃範囲、キャラ、カーソル と表示すればいいんでない。
RPGツクール2000の地形は拡大表示してたはず
>>401 STGみたいに座標で管理するのはNG?
背景描写して、その上から座標でキャラクターを描写
ゲーム中のキャラの座標は、マスのドット数で割れば出せる
俺だったらこういう風な処理にするけど、SLGは作ったことないからなぁ・・・・・・
誰か創ったことのある人の意見キボンヌ
406 :
401 :04/12/17 23:18:07 ID:phamhyn5
>>402 具体的にお願いします。
>>403 速度を早くするために、位置を指定して表示するためにそうしていました。
スクロールの時は、新たに視界に入る分のみ表示、
キャラが移動する時は、前の位置と移動後の位置のみとか。
>>404 キャラもですね。縦横それぞれ2倍に。
407 :
401 :04/12/17 23:21:22 ID:phamhyn5
>>405 細かくやれば、正しく表示は出来ると思うのですが、
セルという概念でデータを管理している以上、
それを生かした表示の仕方が無いかなと。
>>407 じゃぁ、
>>402 の言うように背景表示してから
キャラ表示すればいいだけの話では?
/ ̄ ̄/
/ /
/__/こんな風に全ての背景を一気に表示させてから
/ ̄ ̄/
/('A`)/
/__/キャラを描写して
/ ̄w/
/('A`)/
/w_/木とか、キャラの上に来るオブジェクトをのっける
409 :
408 :04/12/17 23:32:15 ID:Am+j201E
ズレた・・・しかも判りにくいし・・・・・・・
410 :
403 :04/12/17 23:44:09 ID:tQoXALVp
>>406 >位置を指定して表示する
そういうふうにするなら、移動後の座標を予測して、その通り道のマスだけを描画するってのは?
どのみちマスとマスの中間にキャラを表示するには、
「1マス分を表示する関数」では表現できないから、
複数のマスを
>>408 みたいに表示する関数を作ればいいんでない。
>>408 たぶんだがそういうことをいっているわけではないかと・・・
だってそれはスプライトのプライオリティの設定だけですむわけだし
どっちにしろ抽象過ぎてどうしたいのかがつたわってこない
412 :
401 :04/12/17 23:46:18 ID:phamhyn5
>>408 もう一度その方法をやってみます。
引き続き、いい方法を見つけた方が居ましたら、教えてください。
そもそも2プレーン+キャラ程度なら速度稼ぐためのせこいことする必要ないんじゃないの?
414 :
401 :04/12/17 23:53:58 ID:phamhyn5
>>410 移動は、半歩ずつとかは無く、1マスごとに飛び飛びに行われます・・。
一マス移動、前のを消す、1マス移動、前のを消すという感じです。
>>411 確かに文章で説明するのは難しいです。
415 :
401 :04/12/17 23:58:14 ID:phamhyn5
>>413 どうなんですかね。確かに見た目で遅いなとは思わなかったですけど。
いい方法が無い場合はそれで行きますが、何かあればいいのですが。
補正値でキャラクタをずらして表示できるようにするか
シナリオ進行時は表示ルーチンを別にする
おそらくマップの論理座標x=1,2,3,....というの指定するだけでそれに対応した位置に
表示してくれる便利なルーチンを作ったんだろうが後から小芝居させるときに不便だと
気づいたんじゃないかな。
キャラクタをグラフィックの座標(0-639)で表示できるルーチンを先に作ってそれのラッパーで
論理座標を指定して表示でいるルーチンを作っていればこんなことにならなかったはず
今から作り直すか論理座標に追加でグラフィックの座標で補正できるようにすればいいと思う
>体が千切れて表示されてしまいました。
ここから推測するに1マス作成してから転送してるんだよね?
で、
>>408 みたいにするのは面倒だから代案を考えてくれと。
だったら影響があるマス全部に個別に対応するしかない
キャラクタが千切れたらその千切れたもう片方が本来あるべきマスに
描けばいい。
別に処理が軽い分には、問題ないと思うのだが・・・・・ 処理軽ければ派手なエフェクトとかガンガン入れても平気だろうし、 低スペックマシンにも優しいし・・・・・
あ、思いついた・・・・ >キャラの立つ位置を変えたり、ダメージを受けた時に吹き飛んだりさせたく、 この処理の時だけ、動いたキャラを表示させないようにして @から改めて動いたキャラを表示させれば良いんじゃないだろうか この方法だと、キャラが一番上に表示されてしまうけど・・・・・・
>>417 SLGならフルフレームでなくてもいいだろうし
マップチップが固定されて2プレーン程度であれば
600MHzクラスのCPU+UMAの統合チップセットでも
60fps余裕で出るぞ
ノーウエイトにしてみればわかるがサイズにもよるが200fps余裕でこえるかな
420 :
401 :04/12/18 00:16:54 ID:oq7OWQ9j
連続投稿とか出て書けないです。
>>416 何となく見えてきました。
>おそらくマップの論理座標x=1,2,3,....というの指定するだけで
>それに対応した位置に 表示してくれる便利なルーチンを作ったんだろうが
>後から小芝居させるときに不便だと気づいたんじゃないかな。
まさにです。
>>417 ゲームの制作意欲を残す為に、
常に難しい方法でやるように心がけています。
>>418 グラフィックを綺麗にする為に、マップチップで陸と海の境界線とか、
草と砂の境界線とか、それらを2層目で書くようにし出したんですけど、
足の位置にその境界線が来てしまって、草か水かどこに居るのか分かりにくくなり、
キャラの位置を全体的に上にずらそうと思いこれをやろうと思ったので、
常にやることになります。ダメージを受けた時はその方法でいけますが。
>>418 最後にソートすりゃいいんじゃね?
もしDirectX使ってるならrhwを指定するだけでいいだろうし
SDLならレイヤーに対応してたはず
でもそんな小細工できるならこんな質問しないよな_| ̄|○
>>419 環境がわからんから皆ツッコミが甘くなってるだけじゃないかと・・・・
GDIで
>>401 の方法だと40FPS出ればいいほうだろ
422 :
401 :04/12/18 00:26:47 ID:oq7OWQ9j
>>416 >影響があるマス全部に個別に対応するしかない
まさにここだと思うんですよね。
ずらして書いた後、そこの上に地形を書いたために千切れてしまったり、
逆にマスに上書きしたつもりが、キャラがずれている分消せなかったり。
>>419 >>421 fpsの事を教えてください。調べてみると
「動画のなめらかさを表す指標。1秒間に何枚の画像を表示しているかを示す。」
らしいのですが。
ちなみに、C言語、SDKウィンドウズアプリ、イベントトリブン方式
で製作していて、フィールドのサイズは、13X13です。
423 :
401 :04/12/18 00:38:29 ID:oq7OWQ9j
かなりいろんな意見が聞けて勉強になりました。 それらを参考にもう一度やってみます。 うまく行きましたら、ご報告します。 みなさま、ありがとうございました。
>>421 DirectDrawでのbltを基準にして考えていた
だからRiva128以降で16bppなら余裕かと思っていたが
GDIでも同じね
DDB使えばDirectDrawより早い
>>422 あーfpsわからないか
その考え方で合っているんだが、ゲームはWinのイベントドリブンで
考えるのはよしたほうがいいぞ
メインループでがりがり毎回描画するアクション系の考え方で
そのなかで独自のイベントを作っていったほうが・・・
どっかにSTGとかならメインルーチンの雛形ころがっているはずだから
それ参考にしてみるといいよ
('д`)ノ<先生、質問です DxInputでパッドの入力処理を製作してるんですが、 bool型で各ボタンの状況を判断する方法以外で、何か良い方法は無いでしょうか?
426 :
401 :04/12/18 05:54:22 ID:oq7OWQ9j
1マスの全てを表示するのを全体に行うというのを、
地形を全体に、移動範囲を全体に、キャラを全体に、に変えました。
後の処理のやり方としては、キャラがずれてかかった分のマスをチェックして、
その分も追加して表示する、という案を使うと思います。
やり方は単純ですが、ずれチェックがかなり難しそうです。
ひとまず眠いので寝ますが、今日中に出来ると思います。
>>424 僕のやり方は、基本はメッセージループなんですが、
メインループの見易さ、細かさも取り入れたやり方をしています。
メッセージだと、その時に関係ないルーチンに当たったり、
グローバル変数だらけになったりして、メインだと、やや重くなりますが、
そこを両方とも解決できないかと編み出しました。
当然、アクション系では使いにくいやり方なのですが。
>>425 意味がわからんが、
ゲーム的には、
・押した瞬間かどうか: bool
・離された瞬間かどうか: bool
・押してからどれだけたったか: int
も実装しておくとらくだが
428 :
401 :04/12/18 20:45:34 ID:oq7OWQ9j
ずれチェックがどうしても重くなってしまいました。 仰っていた通り、全部表示してしまった方が効率がよさそうです。 通常時はずれられないようにして、スクロールの時とかには、 高速の従来バージョンで表示できるようにし、 戦闘など特別な時にのみずれられるようにします。 しかし、まだ問題がありました。 キャラの足が地形の境界線に掛かり、どの属性の地形にいるか分かりにくい事です。 そもそも、キャラの位置を全体的に上にずらして、境界線が絶対こない所に 足の位置が来るようにしようと思い、この質問をしていたのですが、 先ほど結論に達した、通常時はずらさないに反してしまいます。 解決方法として、一番楽な、その部分には目を瞑る方法、 少ないずれチェックで済む、上にだけずれている時の表示関数を作る方法、 ずれている時も全表示でなく位置を指定して表示できる、 ずれ方を半マスに限定して、キャラを半マスずつ表示する方法を思いつきましたが、 逆に位置関係が分かりにくいなどの弊害が起こる事も考えて、 一番楽な、目を瞑る方法で行きたいと思います。 ここらの部分を納得して先に進むことが出来ます。 みなさま、ありがとうございました。
>>427 成るほど!
じゃぁ、そのやり方で構造体作り直してみます!
ありがとうございます〜
ようはハイドライドの森みたいな描画やりたいわけね あんなの速度的にも軽い軽い 8bitマシンでさくさく動いていたし、ノーウエイトにすると早すぎたしね 内部の作りはSTGと同じにしていたとか聞いたことがある希ガス 半キャラ単位で描画してもいいし、Y軸基準で描画してもいい あの程度でいいのなら100MHzでもさくさくかも
431 :
401 :04/12/18 22:04:34 ID:oq7OWQ9j
>431 うわ、懐かしい 漏れがやったのはファミコン版のハイドライドスペシャルだけど
>>425 列挙子で
FREE 押されてない
PUSH 押した
PULL 放した
HOLD 押しっぱなし
を作って分類すると楽かも。
434 :
425 :04/12/18 22:46:42 ID:fcL5sLlu
スミマセン D3DXMATRIXで、左右反転させるような関数って無いですか?
スミマセン D3DXMatrixRotationYで180°指定してやったらできますた もうちょっと自分で確かめてから質問するようにします・・・・・・ スミマセン
437 :
名前は開発中のものです。 :04/12/19 09:51:38 ID:K0ZRB1bT
質問系のスレッドで質問させていただいたのですか、運悪くご返答を頂けなかったので このスレッドで質問させてください。 今開発されてるスクウェア・エニックスのファイナルファンタジー12って 技術的にはかなり凄いんですか? もぐりでも頑張ればグラフィック以外は再現できるレベル? なんか戦闘がリアルタイムで、しかも地形の形状を戦闘に利用できて かつ主人公以外は完全に自動で行動させられるらしいですけど。 プログラムの中さえ分かれば、自分でもどうにか再現できるレベルなのか。 皆さんはどう思っておられますか。
>437 プログラムわかんない人に説明すると長くなるので短く漏れの意見 設計はすごくしっかりしてるんじゃないかと思う
439 :
名前は開発中のものです。 :04/12/19 10:33:30 ID:bc/DHSmt
>>439 Half-life2は2.4GHzのメモリ256M、VRAM32M以上レベルの高性能であのグラフィック。
FF12はCeleron300MHz、メモリ32M、VRAM8M相当の低性能であのグラフィック。
…釣られた?w
グラフィックはプログラムだけじゃ語れないからね FFのテクスチャのクオリティはすごいと思うよ 小さくて制限の多いなかで、すごくいい仕事してると思う 素人さんはそれにだまされて「PCでFF以上のグラフィックって難しいですよね」 とか言いはじめるくらいだから 少し脳内補間が効いてるっぽいところもあるけど 多分>437もその口
>>440 グラボでいうと
Radeon最新とRivaTNTだからな。
>>437 FF12のゲームシステムをツクールで再現したいという話か?
>>440 アルゴリズムの話に何でグラフィックやらハードの差が出てくるんだ?
・・・あ、釣られた?w
名前間違えた('A`)
つまり、
>>437 の言う
戦闘がリアルタイムで、しかも地形の形状を戦闘に利用できて
かつ主人公以外は完全に自動で行動させられる
システムなんてそんな敷居の高いものじゃないから、頑張れば
それなりのものは出来るんじゃね?
>>444 じゃあお前、アルゴリズムさえ知っていたらPC98やX68000時代のマシンでHalf-life2やFF12を実装できるってのか?
…あれ?釣られた?w
俺が言ってるのは
>最高峰の物理エンジンとAI使ってるから。
>FF12?ナニソレ?ってくらい凄いよ。
Half-life2もFF12も似たり寄ったり、どっちも限られた環境を追求してあのグラフィックを作ってるんだから比べられるもんじゃないって事だよ。
>>446 >>437 がグラフィック以外はって書いてるのに何でグラフィックの話持ち出すんだ?
あくまでアルゴリズムの話だぞ。
喪前さんは、ゲーム全体の話をしてるようだが・・・
>>446 釣りだと思うけど、十分いけると思うぞ
と書き込みそうになったorz
確かにグラフィックが無理だし、物理エンジンも走るかどうか微妙だな・・・・・
スマソ吊ってくる
マジレスすると
>>437 の言ってる事は
アルゴリズムが理解できて
尚且つ数学も理解できて無いと_
でも技術的には
結構ありふれた物使ってるのじゃないかと思われ
>>447 話題が二転三転してないか?
お前が
>>439 で書いてるのはほとんどグラフィック関係だけじゃん。
物理エンジンはグラフィックに関係してないのか?
アクションゲームのAIをロールプレイングゲームのAIと比べられるのか?
俺が突っ込んでるのは「PCとPS2でそもそもジャンルが違うHalf-life2とFF12を比べられるわけないだろ、釣りか?」
って事なんだが。
お前にとってHalf-life2のアルゴリズムはFF12より凄いらしいが、真・三国無双と初代ドラクエだとどっちのアルゴリズムが凄いの?w
>>437 連レスだけど・・・・・・
モグリじゃ再現はまず不可能
モグリでも再現できるようなら、
同人ゲームでそういった3Dをバリバリ動かすようなゲームが溢れてるはず
グラ関係等での制約もあるんだろうけど、
今の所そこまで高度な処理をするようなゲームは殆どない
こんな回答で良いのだろうか?
前線に出たがるタムリン(ヒーラー)
>>450 はいはい、クマ-(AA略
アルゴリズムって言葉を調べてね。
国内だと低スペックの奴が、文句言いまくるからなぁ。 3Dですら、連中にとっては高スペックらしい。
>>453-454 池沼か?
>>437 はそもそもFF12がグラフィック以外なら素人に作れる物なのかを聞いてるのに、何でHalf-life2が話題に出てくる?
全く関係無いだろ?
>>456 読解力ってものが無いのか?
>>437 は
戦闘がリアルタイムで、しかも地形の形状を戦闘に利用できて
かつ主人公以外は完全に自動で行動させられる
技術が凄いのか?って聞いてるんだろ。
だから参考にするならHalf-Lifeを見ろと言ったわけ。
おまいさんは、ただFF12をけなされたと勘違いして脊椎反射で噛み付いてるだけじゃないか。
そりゃ総合的に見ればはFF12もかなり凄いって事くらい解るよ。
既存のゲームの名前を出さずに考えるとどーなん?
ピンキリじゃないかね。 地形を戦闘に利用することが出来るようにすること自体は そんな難しくないだろうけど、それを使ってゲームを面白くするシステムを考える方が難しい。 自動行動だって簡単な物はすぐ出来るだろうけど、「頭がいい」って言えるような 学習も備えたやつを作ろうとすると多少手間がかかる。
シミュレーションだけど、PC-88時代から大戦略などで地形を戦闘に利用することは出来た。
RPGでは英雄伝説のAIは、敵のHP情報などを使用して、割と頭の良い行動が出来た。
>>459 の「学習を含めた」、というのは恐らくないだろうから(保存メディアの必要領域が
大きくなるから)、そんなに高度なものは作られていないと思う。
>>460 以前どこかのRTSがやってたと記憶するんだが、
現在の状況を元に次の行動を決定する過程で
パーセプトロンと同じモデルを使っていれば
記憶に使う容量は学習が進んでも増える事はない(重みが変わるだけ)し、
SLGの分野では(類似した物が)そこそこ使われてる気がする
へー、凄いなぁ。 勉強になります。
何故にパーセプトロン限定、相互結合型も入れておいて下さい(A`) てかNNがゲームに使われてるなんて話聞いたこと無いんだが、本当なの? 本当ならすげー嬉しい。
なぜにパーセプトロン限定? あとNNをゲームに使ってるなんて話は聞いたこと無いんだけど、それ本当? 知ってたらネットワーク構造とかも含めて教えてホスィ(A`)
書き込みミスってたかと思ってたら出来てた。。。
研究目的に作られたゲームならいくつか見たことあるけど 商用ゲームに使われてる事例は知らないし、 さすがにまだないんじゃないか?
ごめん、調べてみたらあったわ Renderware A.I.にニューラルネットマネージャがあるね。 曰く 「ニューラルネットワークは、一般に予測、分類、データの関連付け、概念化、およびフィルタリングに使 用される、高性能な統計分析データ構造」 実際に使った事例があるかどうかは知らないけど…
わおほんとだ。ありがと。 事例はともかく、ミドルウェアに一応置いておく位には使えるのか。 涙が出そう。NNって完全に窓際族扱いで。。
NNってそんなにマイナーじゃないんでは? Gems2の3.14にはColin McRae Rally2.0では多層パーセプトロンをつかってるって記述があった。
パターン認識の分野ではSVMやらが脚光を浴びてNNはもうブームが去った感じもしてしまうけど ゲームの分野ではまだまだ未開拓に近いのでは<NN
471 :
名前は開発中のものです。 :04/12/20 15:35:20 ID:hImEK0ED
VC6にて、海賊をモチーフにした2Dな全方位シューティングゲームを製作しています。
現在、背景にポリゴンを用いて海面の揺れ処理を表現しているのですが
このコードでは、なんというか・・動きが変なんです。
gameFunctions.cpp内DrawSea関数で波の動きを制御しています。
ここの伝播処理部分にもっと施すことがあるだろうとは思うのですが、
具体的にどうすれば良いのかが、恥ずかしながら分かりません。
参考になるウェブサイトや、アドバイスなどを頂けたらと思います。
よろしくお願いいたします。
http://prisira.s59.xrea.com/20041219.zip
>471 だから動作環境ぐらい書け
>>471 そのままでも結構上手く動いてると思うけどね。
とことん凝るなら波動方程式で検索してみるといいよ。
>>473 いやこれはマズいだろ。
一見動いてるように見えるけど、たまたま波の伝搬で誤差を打ち消し合ってるだけで
伝搬をさせないとエネルギーの誤差が蓄積してどんどん振幅が増して大変なことになる罠
波動方程式に基づいて計算するのが無難かと
波動砲丁式
>>471 のソースをコンパイルしてみると、sprite.cppのBeginSprite()で、
”error C2660: 'Begin' : 関数が不正な 0 個の実引数をともなって呼び出されました。 ”
というエラーが出る。
ちなみにVC++6.0、DirectX9.0 2004(October)
ヘルプを見ても HRESULT Begin(VOID);だし、引数はいらないように思うのですが。
d3dx9core.hを見ると、
DECLARE_ID3DXSprite_(ID3DXSprite, IUnknown)の中身が、
STDMETHOD(Begin)(THIS_ DWORD Flags) PURE; となっていた。
同じくd3dx8core.hでは、
STDMETHOD(Begin)(THIS) PURE; となっていた。
とりあえず、引数に0を入れてみるとコンパイルは通りましたが・・・。
みなさんはそのままでコンパイルが通ったようなので、どういった環境の違いに
よるものか悩んでいます。とりとめもなく書きましたが、何かわかる方、ご教授ください。
お願いします。
SDK付属の英語の Document(Help) 読んでるか? 日本語Help って 9.0 と 2004(December) しか無かったような 対応したバーションの Help 読んでるなら コードを書いた奴の環境とバーションが違っているんだろ
>>478 ×2004(December)
○2004(October)
ちなみにmsdnじゃOctber 2004って綴り間違えてる
↑
480 :
名前は開発中のものです。 :04/12/22 21:59:05 ID:VEp0024I
SRPGを作っているのですが質問です。
オーソドックスな視点の2Dのゲームなんですが、
このタイプで高さを表現する良い方法はないでしょうか。
それを行う為に、今マップの坂を、以下の絵の様に、草、茂み等の下地の地形に、
崖の絵を合成する形で表示しているのですが、余りしっくり来ません。
http://gamdev.org/up/img/2160.png (
http://hp.vector.co.jp/authors/VA020046/ のMACKさん作の素材で、それを少し改変しています)
下地の地形をベースに、影の付け方を変えて坂を表現するという方法を
考えましたが、そういう素材は見つからず、
下地を取り込むと、坂を自動的に作ってくれるツールがあるのかもしれませんが、
グラフィックに詳しくなく見つけられませんでした。
これに沿った方法で、または別の方法で、
高さを表現する方法がありましたら教えてください。
482 :
480 :04/12/22 22:49:44 ID:VEp0024I
>>481 ありがとうございます。参考にさせていただきます。
自分もゲームでそういうのが使われていないか攻略本を見て探したんですけど、
ドラクエ6、ツクール4に少しあるぐらいでなかなかないんですよね。
483 :
480 :04/12/23 00:24:56 ID:zeGMsZ0H
もう一度ググって見た所、もこもこペイントというのを 見つけましたがこれでいけそうです。ありがとうございました。
>>478 ,479
旧バージョンのヘルプを見てしまっていました。
あらためて2004(October)のヘルプで確認し、納得できました。
ありがとうございました。
>>425 enum{
BUTTON_A = 0x00000001,
BUTTON_B = 0x00000004,
BUTTON_C = 0x00000008,
BUTTON_X = 0x00000010,
BUTTON_Y = 0x00000020,
BUTTON_Z = 0x00000040,
BUTTON_L = 0x00000080,
BUTTON_R = 0x00000100,
KEY_UP = 0x00000200,
KEY_DOWN = 0x00000400,
KEY_LEFT = 0x00000800,
KEY_RIGHT = 0x00001000
};
これをDWORD型変数にOR演算でセット。
AND演算を使って判定。
以前の入力が欲しい時はDWORD型配列にする。
僕が以前格闘ゲームを作成したときに使用した方法です。
トリガーキーとかいう言葉すら知らないんだろうな。
ゲーム作るならDirectX勉強しろーみたいなこと言われたのですが、 PSとかPS2,game cubeのソフトは、DirectXなるものが使われているんでしょうか?
>>487 コンシューマでDirectX使ってるのはXBOXだけ
>>487 それを言ったのは誰だ?
WindowsやXBOXのプログラマが言ったならともかく、PS2やGCのプログラマに言われたなら軽くあしらわれてるぞw
(Windowsで)ゲーム作るならDirectX勉強しろー
>487 まぁあながち間違いではない 右も左も2Dも3Dもその他もろもろもわからない香具師はとりあえずDirectXでも勉強しとけ DirectXを通してグラフィックハードウェアがどういうものなのか知ることもできるし 3Dの勉強もできるし ただDirectXにはD3DX系なんかの便利な関数やクラスの中身を まったく理解せず使ってたらだめだろうな プロットフォームが変われば使用するライブラリも変わるが、 しっかりとした知識を持っていればすぐ対応できる 逆にライブラリが変わったくらいで、すぐに対応できないような香具師は現場では使えない
492 :
487 :04/12/27 14:22:37 ID:c4eg2dH6
DirectXにしろPS、DCにしろ、言語はC++ですよね? なんか、いまはC#だとか言ってるんですが。。。
とりあえずC/C++やっとけ それが出来ればC#もあまり苦労せずに出来るようになるから。 (逆は案外難しい)
案外というか、C#はいろんな機能提供してくれるからC#から入ると自分で 基本的な部分の仕組みを作る、というか考えるということが出来ない気がするなぁ。
>>492 あー、そいつ典型的なWindows専門プログラマだよ。
エロゲの会社にでも勤めてる奴?
XBOX2以降だったらC#が使えるようになるかも知れんが…
ガベージコレクタだとか実行時型判定だとか、 最近の言語はプログラマの負担を減らす代わりに CPUの負担を増やしてるからゲームには不向きだなぁ
動作速度はゲームの種類によりけりだけど、 わざわざランタイムを入れてもらわなければ動かないという方が致命的。
>>497 DirectXだって、ランタイム入れてもらわなきゃならんだろw
2重のランタイムってのが許せない
このゲームをプレイするには拡張の周辺機器を買わなければなりませんよりはマシだけどな。
バージョン別ランタイムの普及率が知りたい・・・・
>>477 ID3DXSpriteインターフェースがDirectX9の前期と後期で変わってるっぽい
BeginのほかにDrawも変更食らってるのを確認済み
ID3DXSpriteインターフェース使って2Dライブラリ組んでた俺としては最新版は使えねぇ・・・
拡大縮小や回転が使えなくなっててもう最悪だった
2D作るのに気軽に使える環境を返してくれYO!
あと同じメジャーバージョンなのにインターフェース変えるなYO!
ライバルがいないから、仕様変え放題やりたい放題だ。
>>502 だから、拡大縮小回転は使えるって
全部Matrixで指定しる
質問質問。 今、2Dのアクションゲーム作ってるんだけど、 オブジェクト(敵や特別な地形)とオブジェクトとの当たり判定っていつやればいいの? 今は水平方向に動かすときと、垂直方向に動かすときにそれぞれ全オブジェクトとの当たり判定やってます。 ちゃんと動くけど無駄が多すぎな気がする・・・
普通は、動かす動かさずに関わらずに毎フレームチェックするものだと思いますが。
>505 比較的軽い計算で、これは絶対に当たっていないって条件が判定できるものは判定する ってやってるとは思うけど一応
509 :
505 :05/01/10 03:04:03 ID:pQUwlE+5
>>506 すいませんすいません、毎フレームごとにチェックはしてます。
ただ、その1フレームの中でさらに二回やっているんです。
具体的には、オブジェクトAがあって、
A.x += velX
って感じの水平方向の移動後と、
A.y += velY
って感じの垂直方向の移動後。
他オブジェクトと当たっていた場合は位置補正してます。
>>505 ・・・やってないかもしれない。
矩形での当たり判定のみなのでこれが一番軽いかな、と手抜きを(汗
X座標やY座標でソートして明らかに外れているオブジェクト達との
判定はしないようにしたんだけど、オブジェクトの数が少ないと
かえって時間がかかっちゃいまして。。。
>>505 8分木は名前だけ知ってたけど、4分木は初めてです。
8分木の2次元版?って感じですか、どうやら。
どう実装すればいいのかよくわかりませんが、これをキーワードにちょっと
調べてみようと思います。
みなさんありがとう!
アクションRPG作ろうと思っているんですが 敵の思考ルーチンをプログラムする際に 参考になりそうなおすすめサイトがあれば教えてください。
>510 サイトじゃなくて書籍だけど 「定本 Cプログラマのためのアルゴリズムとデータ構造」
>>510 サイトじゃなくて書籍だけど
「ゲーム開発者のためのAI入門」
A*ならgamdev wikiにもあったような・・・・
513 :
名前は開発中のものです。 :05/01/16 22:59:35 ID:CY/+3klI
2次元配列をゼロクリアしたいのですが簡単な方法ないですか? 今はfor分の二重ループで1つずつ代入しています 使用環境はVC++です
memset
>>514 うまくいきました。ありがとうございます。
使用前
for (int i=0; i<3; i++)
{
for (int j=0; j<3; j++)
{
map[i][j]=0;
}
}
使用後
memset(map, 0, sizeof(int)*9);
sizeof(map)じゃダメ?
>>516 なるほど!全体を指定してしまったほうが手っ取り早いですね。
うまくいきました。ありがとうございます。
改良後
memset(map, 0, sizeof(map));
なんか、ほほえましいな。自分が若かった頃を思い出す。
>>513 は、もっとガンガレ!!
callocって無かった?
ZeroMemory(map, sizeof(map)); でもいいね。
忘れるな。 memset は string.h ZeroMemory は windows.h
むしろZeroMemoryは中身memset
さらにインライン展開されて、関数を呼ばずにストリング転送に変換される。
525 :
524 :05/01/23 04:52:12 ID:LheYkhaz
なんか違ってた
526 :
名前は開発中のものです。 :05/01/28 12:13:19 ID:7PgE831H
ファミコンのラディア戦記みたいなアクションRPGを作りたいけど イベントの処理やデータの管理(セーブ機能をつけたい)などを どう実現していいやら検討も付きません。 どこかに参考になりそうなソース付きのアクションRPGをDL出来るところは無いでしょうか? ちなみにVC++とDirectXで作っててキャラ&敵の表示、あたり判定、攻撃、マップの移動などは出来てます。
527 :
名前は開発中のものです。 :05/01/28 17:50:53 ID:IiB3r9BB
>>526 暗号化と、バイナリモードのファイル入出力を習得すればできる
大事なのは考えることだ
別に暗号化する必要もないし、バイナリファイルである必要もない。 大事なのは「他人にいじられないようにする」という勝手な用件を脳内で作らないことだ。
529 :
名前は開発中のものです。 :05/01/28 19:29:59 ID:IiB3r9BB
>>528 よく意味がわからないんだが、どういうことだ?
イベントもセーブもどう弄られ様とかまわねーっつーことじゃないの? 弄られることで自分が不利益被らないなら、どーなっても良いんじゃないのかな。 大事なのは考えることだ だけど、余計なことは考えなくて良い
>>526 イベントが発生する時は、何かしらのアクションやシグナルがあるから、
それらをifやswitchとかで監視する。(他にも方法はあるだろうけど)
ボスが死んだらイベントが発生する、とか色々イベントを試していれば、おのずと形が見えてくると思う。
まぁ俺の言ってることは
>>527 、530と一緒で、とにかく試行錯誤したほうがいいよw
532 :
名前は開発中のものです。 :05/01/29 03:56:50 ID:hwmUiymu
>>526 何が分からないのかよく分からないからもっと具体的な質問をしてみな。
データセーブはファイルの入出力さえできれば簡単だろ。どこができないの?
イベントについては、最高の理想を言えば、ごちゃごちゃプログラムで泥縄式に
作るするんじゃなくて、シナリオ記述言語(スクリプト)みたいなのを自分で
勝手に考えて創って、それを読み進めるプログラム(=ゲームプログラム)を
作る…という感じにすると美しいぞ。
533 :
名前は開発中のものです。 :05/01/29 06:10:59 ID:dcHY39ty
>>526 >勝手に考えて創って、それを読み進めるプログラム(=ゲームプログラム)を
>作る…という感じにすると美しいぞ。
多分、526にはその技術が無いから、想像もできんのだよ。
イベントは、まず、イベントマップというのを作る。
これは、画面を表示するマップに重なっているイメージだ。
そんで、そのイベントマップに、イベント番号などを記録する。
すると、マップの。X=5.Y=6の地点で、イベントマップにイベント番号があれば、そこでイベント発生だ。
イベントは、メインルーチンと並列に実行されるようにせねばならない。
たとえば、勝手に上に歩いて、キャラクタが「勝手に足が動いたんだ」というセリフを出すイベントだとしたら、
その歩いてるときにも、ゲームの全体の進行を止めてはならない。
534 :
526 :05/01/29 09:16:02 ID:7YDq9IjJ
お返事ありがとうございます。 データの管理:まとめてメモリを確保して、セーブが必要なデータはそのメモリを使う。セーブする場合はそのメモリを保存する。 イベントの管理:イベントのデータが入ったファイルを用意して必要なイベントファイルを読み込んでおき、そのデータに応じて処理をする。 書き込む前に色々調べて上記のような処理で実現するのがいいんじゃないかとは思ったのですが、 教材になりそうなプログラムやサイトが見つからないのでここに書き込みをしました。 質問べたですみません。 シナリオ記述言語(スクリプト)をつくる技術はありませんが、イベントマップ方式?はできそうです。 イベントマップとはRPGツクールのイベント処理と同じ考え方ですよね。 体験版があるみたいなのでちょっといじってみようと思います。
クイックセーブ(何処でもセーブ)ができるシステム組むのって大変だよね。 でもこれが作れたらかなりの腕だと思うよ。
>>535 場合によるだろ。
はじめからあらかじめ計画してあって
プレイヤーが今そこにいるための情報がすべてまとまっていれば
ファイルに書き込むだけで終わりだろ。
逆に何も考えずにただゲームを作った後で
どこでもセーブしたいとかいいだしたら地獄絵図だが。
システム組むのって大変だよね。
じゃなくてちゃんと計画できてなきゃそもそも不可能であってやるべきじゃねーことだろ。
これが正解 大規模なシステム組むのって大変だよね。 作れたらかなりの腕だと思うよ。
まずはきちんとした設計を。
クイックセーブをシリアライズですまそうなんてぬかすなよ
理由を述べよ。
今DirectX9.0 SDK Update (Summer 2003) + VC++.netで DirectXをプチプチと勉強しているんだけど、2体のポリゴンキャラクター同士の全ポリゴン判定?フル当たり判定? をする場合どうやってやってますか? 自分が思いついたのはVertexBufferとIndexBufferを使ってLockするして判定する方法です。 でもこれだと速度的に心配なので他の方法ないかと思ってエロイ人が集っていて板違いじゃなさそうな ここに相談しにきました。(;´Д`)ハァハァ
普通は衝突判定用の簡易オブジェクトを作るもんだと思うが…
・でもそれだとメッシュによって精度が落ちちゃうんですよ。 ・勉強という事で何かいい方法がないか知りたいんですよ。(;´・ω・`)
簡易オブジェクトでぶつかってるやつだけ詳細にチェック
Lockせずにnewしてそこに置いとけばいいんじゃない?
>>544 それも思いつきました。
でもたくさんのメッシュが一度にぶつかるとやっぱりきついかな?って思いまして。
>>545 むむ!?(;`・ω・´)もっと詳しく説明やここよめアホってなサイトお願いします!
>>546 たくさんのメッシュを一度にぶつけないでください(マジレス)
衝突判定に銀の弾丸はないのです
>>546 当たってるかどうかだけなら重くはならん。
ほかに何か求めたいのか?角度とか。
>>548 角度や摩擦など求める予定ですが、その前にLockして判定する以外
の方法を教えてくれたらと思っています。
簡易オブジェでぶつかっているやつだけLockしてフルチェックさせる方法でも
たくさんのオブジェクトが密集してしまうと結局は簡易オブジェクトなしでフルチェックする
場合とあんまり変わらず処理に影響してしまうので。
4つぐらい重なったら核爆発が起きるようにしてはどうか。
>>549 ゲームが作りたいなら全メッシュ衝突判定なんて考えない。簡易オブジェクトを使う。
それでも超重くなるとしたら設計が悪い。たくさんのオブジェクトが密集しまくる設計にしないでください。
D3DXVec3TransformCoordをヘルプで読んだのですがいまいち分かりません。 これはグローバルな座標変数をローカルな座標変数に変換するのですか? あと似たような名前の D3DXVec3Transformとの違いもD3DXVec3TransformCoord が理解できないため分かりません。 どなたか教えてください。お願いします。
以下の関数はDirectXヘルプを読んで、私がコーディングしたものです。 これらを見ても関数の意味が分からないようでしたら、ベクトルと行列の基礎をしっかり勉強してから再挑戦することをお勧めします。 VECTOR4F* D3DXVec3Transform ( VECTOR4F *pOut, const VECTOR3F *pV, const MATRIX44F *pM ) { pOut->x = pV->x * pM->_11 + pV->y * pM->_21 + pV->z * pM->_31 + pM->_41; pOut->y = pV->x * pM->_12 + pV->y * pM->_22 + pV->z * pM->_32 + pM->_42; pOut->z = pV->x * pM->_13 + pV->y * pM->_23 + pV->z * pM->_33 + pM->_43; pOut->w = pV->x * pM->_14 + pV->y * pM->_24 + pV->z * pM->_34 + pM->_44; return pOut; }
VECTOR3F* D3DXVec3TransformCoord ( VECTOR3F *pOut, const VECTOR3F *pV, const MATRIX44F *pM ) { VECTOR3F ret; float w; w = pV->x * pM->_14 + pV->y * pM->_24 + pV->z * pM->_34 + pM->_44; if(w) w = 1.f / w; ret.x = (pV->x * pM->_11 + pV->y * pM->_21 + pV->z * pM->_31 + pM->_41) * w; ret.y = (pV->x * pM->_12 + pV->y * pM->_22 + pV->z * pM->_32 + pM->_42) * w; ret.z = (pV->x * pM->_13 + pV->y * pM->_23 + pV->z * pM->_33 + pM->_43) * w; *pOut = ret; return pOut; } VECTOR3F* D3DXVec3TransformNormal ( VECTOR3F *pOut, const VECTOR3F *pV, const MATRIX44F *pM ) { VECTOR3F ret; ret.x = (pV->x * pM->_11 + pV->y * pM->_21 + pV->z * pM->_31); ret.y = (pV->x * pM->_12 + pV->y * pM->_22 + pV->z * pM->_32); ret.z = (pV->x * pM->_13 + pV->y * pM->_23 + pV->z * pM->_33); *pOut = ret; return pOut; }
すいません型を以下のように直しておいてください。 VECTOR4F → D3DXVECTOR4 VECTOR3F → D3DXVECTOR3 MATRIX44F → D3DXMATRIX
なんと独りよがりな
D3DXVec3TransformとD3DXVec3TransformCoordの違いが多分分かりました。
559 :
554 :05/02/24 17:48:31 ID:9BALKx7J
>557 少しでも質問者の疑問に答えられれば良いなと思って書いたレスを、「なんと独りよがりな」という言葉で一蹴ですか。 お前みたいなやつがいると正直やる気を無くすよ。
なんでそこでキレるかなぁ〜
機嫌悪かったんだろ
あの日だったんだろ
(*ノノ)
564 :
名前は開発中のものです。 :05/03/19 22:25:07 ID:zqD1MdPq
大手ゲームメーカーでプログラマやってます。 このスレ、レベルひくっ(ぷっ)笑えてきた。 プログラムなんかやめちゃえ!
最初からレベルが高い人など居ませんよ。 くだらないことを書き込まないように。
>>564 無能な上司の下で
デスマーチ頑張ってねwww
>>564 大手ゲームメーカーって言ってるところが笑えるな
腕に自信が無いんだろうな
「大手でプログラマ」ねぇ…。 ま、下請けでも強弁すれば「大手でプログラマ」と言い張れないこともないし、 内部事情を知らない厨房の嘘だと決め付けるのもアレかねぇ。
大手町にある会社の社員だな。
Ruby/SDLでアクションRPG作ってるんですが、 敵の動きを一つずつRubyのマルチスレッド機能で処理するのは良くないですか? 羽虫みたいのが画面一杯に湧いてくるのを蹴散らす場面があるので、弾幕STG並の負荷になると思われます 動作環境はWindowsXPが動いてるメーカー製PCなら例外なく動くようにしたいです
>>571 ゲームに限っては、の話ですが。
マルチスレッドよる処理は、そうする必然性がない限り、お勧めしません。
特にあなたが提案するケースの場合、環境によっては
「自機の処理が行われないまま一つの弾丸にばかり処理権が連続して行く」
事態が、最悪、想定されます。
すると、DIOの世界(ザ・ワールド)に攻撃されたかのような
理不尽な死が体験できることになります。
やめたほうが無難ですよ。
また、世界(ザ・ワールド)現象を回避するために
各キャラの処理一回につき他のスレッドと同期を取った場合、効率は最悪です。
普通にシングルスレッドで処理した方がよっぽど効率的です。
テクに走りたい気持ちはとっても理解する。
そう思っていた時期が俺にもありました。
でも、シンプルかつ愚直に作るのが最善の道であることも多いのですよ。
なるほど ありがとうございます シングルタスクでやるっていうと タスクコントロールブロックとかいうやつですよね 初心者向けに解説してある本とかサイトとかがあれば教えてもらえませんか やね氏の本で扱ってるっていうのを聞いて(プロフェッショナルの続編だったかな)立ち読みしてみましたが あれだとよくわからんかったです
>>573 別にそんなたいそうなものじゃなくても
考え方の基本を1フレームずつの処理に変えればいいだけ。
SWFファイルの仕様について 日本語で詳しく説明している書籍かサイトはありませんか
液晶を使っていてもティアリングみたいなのが出るんだけど、 これを回避するにはどういうコードを書けばいいんですか?
オブジェクト指向勉強中なんですが、インスタンス生成とかカプセル化とかだるい・・・ ゲーム製作には構造化の方が向いている気がするんですが。どう思います?
オブジェクトは構造化の発展です
カプセル化なんか遥か昔からあった概念だもんな。
ゲームプログラミングに興味を持ったのですが全くの素人でやるべきことが多すぎて何から手を出していいかよくわかりません。 数学や物理の勉強から始めた方がいいのでしょうか?
英語やっとけ 物理なんて当面は高校卒業程度の知識で十分だ
>>582 高校の頃は文系だったので科学はやってましたが物理は全くやってないんです
物理なんていらぬ。 算数やっとこう。それさえできれば後は勘。
まずはプログラミングを楽しむことから始めるんだ!!m9('∀`)
まー最初はプログラミング自体がパズルみたいなもんだしな。
楽しむってそんなので大丈夫なんですか? 俺ド素人だし、しかも仕事にしようと思ったらそんな生半可な気持ちじゃ・・・・
特に目的がねーんならプログラミングそのものを目的にするしかねーってこった ゲームプログラミングなんて漠然とし過ぎだって
やっぱやりたいジャンルって最初に絞った方がいいんですかね アクションとかRPGとか
ジャンルはあんま関係ねーな。 つか、仕事にするんじゃこんなとこで聞くなよ それっぽい定番の本買って、そこから参考文献のリンクやら必要な資料を辿って必要なことから身につけろ。
すみません、ありがとうございました
DirectXのSDK落とそうとしたら ver9しかないみたいなんだけど、 ひょっとしてもう8は CD付きの古本とか探すしかないですか? 98SEだと9のSDKが使えないらしいんで… (入門サイトに2000以上って書いてた)
>>592 つMicrosoft download
9のインストールも出来ないのかな? 8は9の中にあるんだけどな。
今大学でC言語やってるんだが、C++との互換性はどんなもんなんだ? CをマスターしていればC++のマスターにどれくらい労力がかかるとか。
互換性は無い。 しかし構文などは似ている部分が多いので、 C++を扱ってた人ならすぐ修得できるよ。
598 :
596 :2005/11/30(水) 20:46:37 ID:NRCIXxVf
>>597 なるほど。ありがとう
ついでに聞いておきたいんだが、そこから派生してWindowsプログラミングってのはやっぱり難しいんだろうか?
今はCでのいわゆるコンソールアプリってのを学んでいる訳なんだが……。
>>596 いやいや、互換性はあるから。
基本的に、C++ は C に仕様を追加したものだから。
そりゃ、細かいところではルールが違うとかはあるけどさ。
C++ のソースコード内に C のコードを書くことはできるよ。
だから…
- 最初は C で書いて、後々 C++ に書き直す
- C++ で書いていって、どうしても分からない場所を C で書く
っていう勉強方法が使えるよ。
連投スマンです… > そこから派生してWindowsプログラミングってのはやっぱり難しいんだろうか? Windows の API は C ベース。 なので、最低限 C のコードを書ける程度の力は必要です。 ともあれ、「猫でも分かるプログラミング」を見て勉強してみることをお勧めします。
601 :
596 :2005/11/30(水) 22:32:57 ID:NRCIXxVf
>>596-600 詳しくトンクス。
「猫でも分かる〜」は一応見てみた。つーか今日の課題やってるときもお世話に(ry
602 :
名前は開発中のものです。 :2005/12/25(日) 18:32:09 ID:QPxHAtwC
最近 Game Programming Gems を読みはじめたのですが、 HandleクラスやHandleMgrクラス内に出てくるマジックナンバーとは、一体どのような役割をする為のものなのでしょうか? 本を読んでもソースを読んでも、全く何のために存在するものなのか理解できません。 初歩的な質問かもしれませんが、マジックナンバーとは何なのか、解る方教えて下さい。お願いいたします。
>>602 Handle のマジックナンバーは、
ハンドルが指すオブジェクトを区別するためのID(識別値)。
詳しく説明すると、
HandleMgr はメモリを節約するためにデータ配列の同じ位置を何度も再利用する。
そのため、ハンドルを参照したとき、それが指す位置のオブジェクトが入れ替わっている可能性がある。
これを判断するのに必要なのがマジックナンバー(=ID)。
例えば、下の様なデータ配列があるとする(数字はID)。
データ { 1, 2, 3 }
このとき 0 番目のハンドルを取得する。
ハンドルA { index=0, ID=1 }
次にIDが 1 のオブジェクトをデータから削除すると、その位置は空になる。
データ { 0, 2, 3 } // 0 番目に 0 が入った
次にオブジェクトをデータに追加すると新しい ID が割り振られ、空の位置に入る。
データ { 5, 2, 3 } // 0 番目に 5 が入った
このとき、さっき作ったハンドルAを参照してみる。
データの ハンドルA.index 位置の ID は 5。
ハンドルA.ID は 1。
ID が一致しないので、ハンドルは無効になった(オブジェクトは削除された)と分かる。
逆に ID が一致した場合は、ハンドルが指す位置のオブジェクトは存在していると分かる。
604 :
603 :2005/12/25(日) 21:17:35 ID:10j12RX3
>>602 とまあこんな感じに、マジックナンバーは、ハンドルの指す位置のオブジェクトが、
ハンドル取得時と同じオブジェクトであるかどうかの判定に使われている。
これで分かんなかったら、
上の例と同じケースをマジックナンバーを使わずにやった場合を考えてみると良いよ。
605 :
602 :2005/12/26(月) 03:37:22 ID:XvOO4Glh
>>603 返信ありがとうございます。
非常に丁寧に解凍して頂いてありがたいです。
マジックナンバーが識別子であると言うことを理解し、順を追って考えたら理解することが出来ました。
606 :
名前は開発中のものです。 :2005/12/30(金) 22:08:40 ID:0oupnfaC
仕様を固める前に実装を聞くなよ。 struct _anime_chr { int number; int max; int **anime; } anime_chr[MAP_PATTERN_MAX]; int map[MAP_Y_MAX][MAP_X_MAX]; int main(void) { int i, x, y; while (1) { for (i = 0; i < MAP_PATTERN_MAX; i++) { _anime_chr *anime = anime_chr[i]; if (++anime->number > anime->max) { anime->number = 0; } /* マップチップをタイルに転送する */ TransferChipToTile(i, anime->anime, anime->number); } for (y = 0; y < MAP_Y_MAX; y++) { for (x = 0; x < MAP_X_MAX; x++) { /* マップ番号を元に、タイルをVRAMに転送する */ TransferTileToVram(x, y, map[y][x]); } } } } こんな感じでどうだ。中身は自分で考えて!
608 :
名前は開発中のものです。 :2006/01/14(土) 12:30:32 ID:pizx291y
スクリプトの実装方法のサンプルをください 言語は問いません
610 :
名前は開発中のものです。 :2006/01/14(土) 12:40:01 ID:ldillV2z
JavaScript or PHP についてなら、多少教えれると思います。 スクリプトを実装して何をしたいかを、教えてもらえれば サンプルを載せま〜す。
PHP風のスクリプトってないのかな。 <?= ?>があれば楽にノベルが作れそう。
外部プログラムからは使いにくいんじゃないの?
使いもしないうちから使いにくいって、あまりに愚かすぎて話にならない。
で、phpはDLL化などして相手にPHPをインストールさせずにC言語から呼べるのか?
Luaは? 組み込み用途に特化してるからライブラリ感覚で使えるよ。 コア部だけなら100k切るし。
何を与えても、なんだかんだ言い訳して使わないに決まってる。
>>615 DLL化すらする必用もなくプログラムに組み込める。
ソースのリンクまで張ってあるのに、なんでその程度のことすら確認しないんだろう。
ECMAScriptやLuaを組み込みスクリプトにするってのはよく聞くけど PHPを使うってのは聞いたことないな
620 :
名前は開発中のものです。 :2006/01/14(土) 19:43:15 ID:j0Ue+PIM
猫でもわかるゲームプログラミングってどうよ? サウンドは、MIDINのストリーム再生とかやってるわけ?
>>618 えー、本当に?
PHP側のソース変更なしで出来るなら、もっと使われてると思うけどなぁ。
php_embed_shutdown(ぬるぽ);..._〆(゜▽゜*)
それは是非おまいが買ってレポよろしく。 頼んだぞ!
なんだか普通にCG系の書籍や雑誌を参考にしたほうが良さそうな本に思えるが……。
626 :
名前は開発中のものです。 :2006/01/17(火) 21:43:04 ID:YlbHfDfM
10年位前のメダルゲームであったような競馬ゲームを作ろうと 考えてるんだけど、馬の速さのバランスを考えるのが難しい・・。 ちょっと速い馬を作ろうと考えたらえらく速くなったり、逆をすると えらく遅くなったり・・。 なんかコツって無いかな? 競馬ゲーム作った事ある人いない?
スタミナを設定して、前半で速く走りすぎたら後半で速度を落とし、 前半でスタミナを温存した馬は、ラストスパートでダッシュできるようにすればいい。
>>626 個々の馬を勝手に走らせるんじゃなくて、全体を見る視点を入れてみたらどう?
たとえば、混戦を演出したいんだったら、重みをつけてみるとか。
馬群の平均位置より後ろにいる馬には、根性補正をかけて足を早くする。
逆に平均位置よりも前にいる馬には、油断補正をかけて足を遅くする。
629 :
626 :2006/01/17(火) 22:13:17 ID:YlbHfDfM
ありがとう!
>>627 ,628
ちなみに一応
力、
スタミナ、
スピード
調子
のパラメタを持たせてる。
あと追いか逃げで二つのタイプを作ってる。
そんで、力が強い方が馬同士がぶつかった時に相手からスタミナを奪え
るようにして、調子がいい方が持ってる最高スピードで走れるようにしてる。
スタミナが無くなると遅くして、あまってたらラストスパートができるように
してる。
まぁ結局いろいろパラメタを作ったんでそれらを上手く調整できなくなっ
ちゃってるのよね・・。
でも628が出してくれた案はなるほどーって感じ。
ちょっと実装してみます!
4月からパソの専門学校のソフト科に入学するのですが、プログラミング技術向上の為に3D格闘ゲームを作りたいと思っています。 そこでこんな書籍が参考になる等アドバイスを頂けたらありがたいのですが よろしくご教授のほどお願いします
まずそれを自分で調べることが技術向上の近道。
>>631 確かに技術は向上するが、近道ではないと思う。
探す時間を読むのに割り当てたほうが効率的。
(自分で解決しないのが癖になったら問題だが)
635 :
名前は開発中のものです。 :2006/01/20(金) 05:04:24 ID:cuy72tDd
こんばんわ。初心者の疑問にどなたかお答え頂けないでしょうか? DirectPlayでピアツーピアアプリを開発しようとしていたのですが、WEBで検索していて、 以下のように変化してきています。 1.ピアツーピアは NAT 越えできないから、費用かかってもクラサバでやるべきだろう。 2.DirectPlay は推奨されていない(MS自身を含めて)から Socket でやるべきだろう。 で、今はサーバーを NAT の外に置き、クライアントはどこでも可、通信は Socket で行う。 という環境を想定しています。 そこで以下の疑問が発生して悩んでいます。 1.部分的に UDP を使いたいのですが、UDP もやはり NAT 越え出来ないのでしょうか? 今回の環境でいうと クライアントからの送信は UDP で行えるが、サーバーからクライアント への送信に UDP は使えないのでしょうか? 2.速さを要求する部分には UDP を使うべきでしょうか?TCP-IP と UDP ではかなり差があるもの なのでしょうか? どうかよろしくご教授下さい。
>>635 まずNATとIPマスカレードを混同するのをやめること。
それからIPマスカレードでUDPが使えなかったら、ドメインを引くことすら出来なくなるぞ。
639 :
名前は開発中のものです。 :2006/01/20(金) 10:45:30 ID:cuy72tDd
>637 ありがとうございます。ネットワークの基礎ができてないようです...orz >>IPマスカレードでUDPが使えなかったら、ドメインを引くことすら出来なくなるぞ。 えーと、DNSサーバーへの問い合わせにはUDPが使われているのでしたよね? >>NATとIPマスカレードを混同するのをやめること。 ちょっと勉強し直してきます。
640 :
名前は開発中のものです。 :2006/01/20(金) 13:09:31 ID:cuy72tDd
>>637 ちょっと勉強してきました。
板違いなような気がする初歩的な疑問がわいてきたのですが、どうかお教え下さい。
NATと静的IPマスカレードは以前ルーターに設定した事があり、外側からアクセスできる事
も確認していました。でも普通のIPマスカレードに関しては特に設定した事がなく、きっと設定
が難しいのだろうと関わらないようにしていました。
ところが今勉強してきた内容によると、特にルータへの設定はいらないと思ったのですが、こ
れは正しいのでしょうか?
最近のルーターは特に設定しない限り(グローバルIP設定等の設定以外)IPマスカレードが
基本なのでしょうか?
641 :
名前は開発中のものです。 :2006/01/20(金) 13:40:27 ID:cuy72tDd
>>637 度々すみません。
>>637 様に指摘して頂いた内容がちょっとだけ分かってきたような気がします。
>まずNATとIPマスカレードを混同するのをやめること。
外側からアクセスできないのはIPマスカレード(動的)の場合のみという事で正しいでしょうか?
>それからIPマスカレードでUDPが使えなかったら、ドメインを引くことすら出来なくなるぞ。
UDP も IP も扱いは同じと言う事でしょうか?
となるとやはり、IPマスカレードの場合、ゲートウェイ内部から外側へのアクセスはできるが、外側から
内側へのアクセスはできないという事になるのですか?UDP、IPに関わらず。
あ、またちょっと勉強してきます。
DirectXを使用しているのですが、メッセージの来てない時に描画処理を行うというゲームループだと動作が重くゲームになりません。 WM_PAINTが呼ばれたときのみ描画するという方法以外に何かないでしょうか。 ありましたらご教授願います。
>>DirectXを使用しているのですが、メッセージの来てない時に描画処理を行うというゲームループだと動作が重くゲームになりません。 徹底的に軽量化しる。あとWM_PAINTを使うのはなんか間違ってる希ガス
645 :
642 :2006/01/20(金) 22:12:05 ID:1+fLDQsB
646 :
642 :2006/01/20(金) 22:13:41 ID:1+fLDQsB
すいません。間違って書き込んでしまいました。
返答ありがとうございます。
>>643 十分軽くしてるつもりなんですが・・・。
>>644 考えてません。タスクシステムを使えということでしょうか。
タスクシステムとか関係ない。
>>642 まずは部分毎に時間を測って
どの処理に時間が掛かっているのか特定しよう。
DirectXだと描画命令の時点では、時間が掛からないと思う
650 :
642 :2006/01/21(土) 11:39:57 ID:7OciQh2j
while(TRUE) { if(PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) { if(msg.message == WM_QUIT) break; else { TranslateMessage(&msg); DispatchMessage(&msg); } } else { Paint(); // 描画処理です } Sleep(1); }
651 :
642 :2006/01/21(土) 11:40:57 ID:7OciQh2j
>>650 このようなゲームループにしてるんですが、ここに問題はないでしょうか。
まず描画処理とイベント処理のスレッドを分ける。
>>652 返答ありがとうございます。さっそくやってみます。
スレッド
>>642 うちはこんな感じ。スレッドなんかいらんw
INTRun()
{
MSG msg;
msg.message = WM_NULL;
PeekMessage(&msg, NULL, 0U, 0U, PM_NOREMOVE);
while (WM_QUIT != msg.message)
{
if (PeekMessage(&msg, NULL, 0U, 0U, PM_NOREMOVE))
{
if (GetMessage(&msg, NULL, 0U, 0U))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
else
{
//ゲームの処理へ
}
}
return (INT)msg.wParam;
}
駄目な書き方の見本提示乙。
>>650 Paint(); をコメントアウトした場合と
掛かる時間を比較しよう。
劇的に速度が違うなら Paint() の中に問題があるんじゃないのかな。
>>656 そうなん?どこが駄目か教えて。
ちなみに少し前のDirectXSDKサンプルのまんまです。
659 :
642 :2006/01/21(土) 13:08:25 ID:7OciQh2j
スレッドを使用してみましたが、多少動作が軽くなった感じはするものの大差はありませんでした。
みなさんありがとうございます。
>>655 うらやましい
>>657 大きな違いはありませんでした。
DirectXを使わなければ問題は起こらないので、初期化の地点で問題があるのかもしれません。
もう少し見直してみます。
660 :
642 :2006/01/21(土) 13:54:29 ID:7OciQh2j
解決しました。 D3DCREATE_MIXED_VERTEXPROCESSING を D3DCREATE_SOFTWARE_VERTEXPROCESSING に代えるだけでした。 まさか初期化にミスがあるとは思わなかったもので・・・。 アドバイスを下さった皆さん本当にありがとうございました。
ttp://lacc.biz/cpp/cpp07.html ここのサンプルを実行してみたのですが
画面消去の命令があるにもかかわらず、
画面が更新されないで指定画像が重なって表示されてしまいます。
ClsDrawScreen() ;だけが効いていないようなのですが、何が問題なのでしょうか。
ClsDrawScreen() ;をコメントアウトしてもしなくても同じ結果になります。
>>654 SleepしないとCPUの処理時間を占有するからじゃないかなぁ…。
急いで書いたから汚いけど、スレッド分けるとセオリー的にはこんな感じかな?
DWORD WINAPI gMainLoop(LPVOID lpDone){//ゲームのメインループ
bool* pDone = dynamic_cast<bool *> (lpDone);
while(!(*pDone));//ここでループ
ExitThread(0L);
}
class CGameMain{/ゲームクラス
public:
CGameMain():done(false){CreateThread(NULL, 0, gMainLoop, &done, 0, NULL);}
~CGameMain(){done = true;WaitForSingleObject(hThread, INFINITE);}//スレッド終了
bool CGameMain::IsDone(void){return done;}
void CGameMain::Kill(void){done=true;}
private:
bool done;
HANDLE hThread;
};
// WinMain側の処理
MSG msg;
CgameMain *pGMain = new CgameMain();
do{
if (PeekMessage(&msg, 0, 0, 0, PM_REMOVE)){
TranslateMessage(&msg);DispatchMessage(&msg);
}else{
if (pGMain->IsDone()) DestroyWindow(g_hWindow);
}
} while (msg.message != WM_QUIT);
delete pGMain;
663 :
662 :2006/01/21(土) 15:26:40 ID:+T+cr/VJ
664 :
663 :2006/01/21(土) 15:27:18 ID:+T+cr/VJ
さらにまちがい、662は
>>658 へのレスです。
酔いが回りすぎです。
まあ、656は単発IDの煽りでしょう。 スレッドの話をすると荒れるのでやめとこうw
>>665 DirectXのサンプル自体はあくまでサンプルであって、
あくまでDirectXの機能を紹介するために作られただけであのままでは実用出来ない。
理由はサンプルのままだとFlip時にV-Sync相当のウエイトを入れているので、
フレームスキップや、動作が重くなった場合に描画以外の処理だけ先に進めることが出来なくなる。
逆にウエイトを外すと無限にぐるぐるまわすことになり、
ベンチマーク用に能力を測るのなら適切だけど、実際のプログラムとしては不適切。
またループの内側でSleepをすると、その間ウインドウメッセージが処理できなくなる。
だからDirectXの機能紹介と能力測定のサンプルとしては適切なソースでも、
実際のプログラムには不適切な書き方なんだよ。
>>666 メッセージ処理のことなら上の3つは同じことだと思うが違うかな。
スレッドのことなら荒れるので(ry
目的の違うサンプルソースをみて、それで正しいと思ってしまうことに問題があるんだろう。 さらに間違ったままそれを広めようとする奴とか。
何も考えず変なソース張った俺が悪いなこれはwすまそん
おし。おれもなにもかんがえずに貼ってみようかな for( ; ; ) { MSG msgmouse; msgmouse.message = WM_NULL; while(PeekMessage(&msgmouse, NULL, WM_MOUSEMOVE, WM_MOUSEMOVE, PM_REMOVE)) Sleep(0); if(msgmouse.message == WM_MOUSEMOVE) DispatchMessage(&msgmouse); MSG msg; while(PeekMessage( &msg, NULL, 0U, 0U, PM_REMOVE )) DispatchMessage(&msg); if(fpstimer.PeekElapsedTime() > MIN_ELAPSED_TIME_FOR_FRAME) { fpstimer.Reset(); HRESULT hr; if( FAILED( hr = Render3DEnvironment() ) ) { break; } if(hr == S_OK) m_pd3dDevice->Present( NULL, NULL, NULL, NULL ); if(msg.message != WM_CHAR && msg.message != WM_KEYDOWN && msgmouse.message == WM_NULL && fpstimer.PeekElapsedTime() + 0.002 < MIN_ELAPSED_TIME_FOR_FRAME) MsgWaitForMultipleObjects(0,NULL,FALSE,2,QS_ALLEVENTS); // sleep until messages come else Sleep(0); } }
>>668 そしてしったかしたいだけのオマエとかな
672 :
661 :2006/01/22(日) 06:34:40 ID:4Vf7TlrB
DXライブラリさんのほうのサンプルでも同じ現象がおきたので、 そちらでお伺いさせていただくことにしました。 スレ汚しすいません。
673 :
名前は開発中のものです。 :2006/01/23(月) 14:58:01 ID:yyObefN6
>> 602-605 閉じられたハンドルにはまた新しいデータが割り当てられますよね。 これって閉じたハンドルを閉じられたとは知らずに保持していて ハンドルを参照した時に別のデータを取得してしまう危険性は無いでしょうか? マジックナンバーがラップして同じインデクスに同じマジックナンバーが 割り当てわれる可能性は十分にあると思うのですがどうなんでしょう? 1. AがHというハンドルを持っていたとします。 2. AはBにHを分け与えました。 3. BはHを破棄したくなりその場で破棄(mgr.Release(H))しました。 4. AはHを参照するも無効なハンドルだと知ることが出来ました。 ここまではいいんですよ。生ポインタじゃこのシナリオは書けません。 上の3.と4.の間で大量のハンドルの生成が行われた場合、 4.でAが(閉じているはずの)Hを参照した時にHと同じインデクス/マジックナンバーの ハンドルの再割り当てが行われるとAは別のデータを参照してしまいます。
>>673 マジックナンバーの値は増加する一方だから
基本的に同じマジックナンバーは割り当てられない。
ただしマジックナンバーを保持する変数には当然上限があるから
ハンドルの生成数にも限りがある。
と俺は思う。
675 :
673 :2006/01/23(月) 15:55:07 ID:yyObefN6
>>674 ハンドル生成数はインデクスの方ですよね?
マジックナンバーは正当性を保証するだけのもので。
ハンドル数に関係なくハンドルの生成/破棄を繰り返せばそれだけでマジックナンバーは増加します。
マジックナンバーはインデクスとは比べ物にならない位インクリメントされるので
意外とすぐ上限に達してしまうような。
>>675 違うんじゃない?
インデックスの方はマジックナンバーがあるお陰でループしても平気だけど
マジックナンバーの方はそうは行かない。
677 :
673 :2006/01/23(月) 16:24:21 ID:yyObefN6
>>676 それだとハンドル数が例え1個でも生成/破棄の回数が決まってしまいますよね?
インデクスは破棄されたハンドルのものを再利用するのでインデクスに16bit割り振れば
65536個持てるわけですよね。
なんだか本題より前の段階で意見の相違があるみたいですね。
実装はgemsの1.6項のものです。
いやいや、参照カウンタではないから ハンドルをコピーするだけではマジックナンバーは増えないのでは?
679 :
673 :2006/01/23(月) 16:32:22 ID:yyObefN6
>>678 ええ、確かにハンドルのコピーだけではマジックナンバーは増えません。
ですがマネージャにハンドルを要求すればその分マジックナンバーは増えますよね?
ゲームを動かしていて2時間くらいしたら
「マジックナンバーが一杯なので終了します」じゃ話にならないですよね・・・?
gemsのP73 でもマジックナンバーのラップ処理は記述されてるので、
マジックナンバーはラップ前提なはずですよ。
>マジックナンバーはラップ前提なはずですよ。 そうでしたか。今手元にGems無いんで家に帰ったら確認してみます。 >マネージャにハンドルを要求すればその分マジックナンバーは増えますよね? >ゲームを動かしていて2時間くらいしたら >「マジックナンバーが一杯なので終了します」じゃ話にならないですよね・・・? だから種類ごとにハンドルマネージャ作れるようにテンプレートにしてあるのでは。 無限にというのはいくらなんでも無理だからその中で想定最大数を見積もって バランスよく分けて管理すると。
681 :
673 :2006/01/23(月) 17:19:16 ID:yyObefN6
>>680 >だから種類ごとにハンドルマネージャ作れるようにテンプレートにしてあるのでは。
と言う事はマジックナンバーがラップして同じインデクスに
同じマジックナンバーが割り当てられてしまうのは仕様って事ですかね。
>無限にというのはいくらなんでも無理だからその中で想定最大数を見積もって
ですね。
ですがgemsでは「インデクスの範囲内でユニークを保証する」といった意味で書かれていると解釈したため
ゲームオブジェクトのようなものにハンドルを割り当てようと思ったわけです。
ですがテクスチャやサウンドなどのリソースに割り当てるなら問題ないってレベルなんでしょうね。
16bit-16bit みたいにインデックスとマジックナンバーで半々にしなけりゃ 同インデックス、同マジックナンバーってのはそうそうでないのではないかな Gemsでも8-24とかになってたような 気のせいだったかな? 記憶があやふやでスマソ。
683 :
673 :2006/01/23(月) 17:56:28 ID:yyObefN6
>>682 >16bit-16bit みたいにインデックスとマジックナンバーで半々にしなけりゃ
>同インデックス、同マジックナンバーってのはそうそうでないのではないかな
でも確立的に低いからといってゲームオブジェクトなどの場合
オブジェクトの摩り替わりは絶対にあってはならない事ですよね。
しかも一番見つけにくい部類のハグになりそうですし。
>Gemsでも8-24とかになってたような 気のせいだったかな?
たしか半々だったような。テクスチャリソースの管理ならどんな割合でも問題なさそうですけど。
マジックナンバーを本物のGUIDにしたらどんくらい遅くなるんだろうか。
他に早くて確実なユニークIDって何かないかなぁ。
アドレスだと確実にユニークです。
>>684 どういうこと?
void* p = malloc(1);
free(p);
void* q = malloc(1);
assert(p != q);
こうは言えないだろ。
アドレス空間より広いサイズのIDは保持不可能という前提で言ってたんだが。 開放済みのアドレス参照するようなアホはハングアップでもなんでもすればいいんじゃね?
687 :
673 :2006/01/24(火) 04:33:44 ID:YZe4vdms
>>686 685氏はアドレスじゃdangling pointerは防げないよって意味でmallocの例を出したんじゃないんですか?
pを他のやつにばらまいて誰かがpを開放したらpの有効性を誰が保証してくれるんでしょう。
上記のハンドルだと再割り当ての可能性があるし、
スマートポインタじゃオーバースペックだから他にユニーク性を保証するものってないだろうかっていう話ですよ。
でももう面倒だから参照カウンタで管理します。
32bitもあれば、1秒間に1000個生成しても、 一ヶ月プレイし続けたところでラップさせられない。 16bitやそこらでも、 16bit値をラップさせるほどオブジェクトが生成されるほどの時間、 ハンドルを寝かせるようなアルゴリズムにしなければいい。
689 :
673 :2006/01/24(火) 05:46:51 ID:YZe4vdms
>>688 >32bitもあれば、1秒間に1000個生成しても、
>一ヶ月プレイし続けたところでラップさせられない。
1秒間に1000個って60FPSのゲームで1フレ約16個ですよね。
局所的に見ればそれ以上生成される可能性は十分にありますよ。
でもまあIPv6でIPが2^128個以上存在する可能性は
将来的に十分ありえるから心配って言ってるようなもんですかね。
>bit値をラップさせるほどオブジェクトが生成されるほどの時間、
>ハンドルを寝かせるようなアルゴリズムにしなければいい。
確かにこれを厳守すれば確立的に問題ないでしょうが、
人間はミスする生き物です。
他人がどうコーディングするかは他人まかせなので・・・。
実際みなさんはゲームオブジェクト(のポインタ)をどのようにして管理してます?
理想に燃えて政治運動に傾倒しちゃうタイプだね。
ミスしないように気をつけてます。 なぜかミスしてなくても止まったり動かなかったりしますorz いろいろなところで、オブジェクト指向のためのプログラミング理論が 展開されてるなあw
>>689 32bit型整数でマジックナンバーを表し、
ゲームが60fpsで1fpsごとに100オブジェクト生成することを考えます。
マジックナンバーがオーバーフローするまでには
2^32 / (100個 * 60fps * 60sec * 60min * 24hour) = 8.28日
かかりますので、仕様として「ゲームは連続一週間以上動かさないで下さい。」とするか、
これで満足できない場合は32bit型整数を2つ使いましょう。
ちなみに、この場合(ry
32bitがフローするようなメモリを扱えるのか?アアン?
滅茶苦茶低レベルな話で申し訳ないんだけど、AIを組むには関数できないと無理? ひたすら条件分岐しまくりだったらやっぱりみっともないの?
アイボの制御コードを、NHKの番組でチラッっと見たことがあるが、 swith-case文が何十何百と、滝のように流れていたな。 アドバイス欲しいなら言語かいた方が良いかもよ。どのみち関数は出来ないとだけど。
状態遷移は、switch-caseで切り替えてもいいし 関数ポインタで切り替えする手もあるな。 どの状態のときに何をするのか、ちゃんと管理出来るのであれば条件分岐しまくりでも構わないよ。 みっともなかろうが作りやすい手段を取ればいい。
>>696 自分ひとりしか読まなくていいなら、という条件付きで頼む。
使ってるのはHSP。 本屋でゲームAIの本を立ち読みしたら、ファジー理論とかって奴が書いてあったからさ。 理屈は分かったんだけど、関数が自分の理解の範疇を超えてたから、 ちょっと不安になった。 やっぱり、条件分岐連発より関数使った方が処理は早いのかな? だったら関数で出来るかぎりやってみたいんだけど。 それとも、初めて組むプログラムでそこまでやるのは無謀?
>>698 条件分岐と関数では、処理速度に大きな違いはない
ただソースコードの読みやすさとか修正のしやすさに大きな違いが出る
基本は関数単位で作るものだと思った方がいい
もちろん
>>696 案のほうが有効な状況もあるけど
自分は条件分岐を連発した関数を使ってます ><
俺らはゲームプログラマだ。 一般アプリのプログラマでもOS屋でもない。 作った者が勝ちだ。 動かした者が勝ちだ。 条件分岐のカルボナーラでいいじゃないか。 ずっと書き続けていれば、いつか自然に条件分岐を捨てる日が来るのさ。
うむ。 後で書き直したってせいぜい3日だよ。 それなのに始める前に何日悩むのかw
>>701 糞コードの量産を正当化するような発言は控えてください。
,j;;;;;j,. ---一、 ` ―--‐、_ l;;;;;; {;;;;;;ゝ T辷iフ i f'辷jァ !i;;;;; ヾ;;;ハ ノ .::!lリ;;r゙ `Z;i 〈.,_..,. ノ;;;;;;;;> ,;ぇハ、 、_,.ー-、_',. ,f゙: Y;;f そんなふうに考えていた時期が ~''戈ヽ `二´ r'´:::. `! 俺にもありました
707 :
673 :2006/01/26(木) 15:37:38 ID:eu4m8wWi
>>692 >32bit型整数でマジックナンバーを表し、
確かにマジックナンバーに多量のbitを割り当てれば問題ないのはわかってるんですが、
ハンドルを32bit(約レジスタサイズ)に収めたいジレンマがあったのでそもそもこんな質問をしたわけです。
しかもその32bitをインデクスと共有するため実用上は最大で20bitほどしか割り当てられません。
単一のインデクスが毎回使いまわされるという最悪なアルゴリズムでは
20bitを消費した直後にハンドルに同じマジックナンバーが割り当てられてしまいます。
均等に12bitのインデクスが使われる確立も低いため、間をとってインデクスの約6bitが平均して使われると仮定すると
26bitですので約3時間で再割り当てが行われる可能性があります。
まぁ32bitにこだわらなくても最近のPCなら(ry
708 :
673 :2006/01/26(木) 15:47:34 ID:eu4m8wWi
間をとって6bitってアホですな。 8bitで12時間ですか。ゲーマーはご遠慮くださいってとこで・・・。
本当に簡単なマリオ風横スクロールRPGみたいなのを作りたいんだけど、ブロック(壁とかのオブジェクト)の表現ってどうするの? 画面表示用の配列を作って、1ブロック分移動するたびにマップデータ配列から新しいブロック列を読み込む ってのを使ってるんだけどどうも重くて
その程度の処理で何で重くなるのかがさっぱり分からん。
Pen4 RadeonVEだからかもしれない
Pen4 1.7GHzだった そろそろパソコン購入を考えた方がよさそう
まあさんざん引っ張って悪いんだが、設計ミスです。
正直自分でもなんとなくおかしいと思ってた マップとか当たり判定の仕方を解説してるサイトとか無いかな
ミスはシリアルナンバーの方ね。(笑) マップのサイズってどんなもんよ。 メインメモリをはるかにオーバーしてるんじゃなければ そうそう重たくならないと思うんだが。 スーパーマリオなんて8bitマシンの4Mhzで普通に動いてたろ。
RPGゲームの作り方教えちくり ダブルバッファリング使ってマップ描画したいんだけど そうすると当たり判定とか訳分からない
>RPGゲーム ねらって書いただろ? ダブルバッファリング使ってマップ描画の方法をしりたい。 マップ描画したあとの当たり判定をしりたい。どっち? どっちにしろ俺はプログラム素人だから知らないがな。
>>717 >どっちにしろ俺はプログラム素人だから知らないがな。
おまい潔いな( ´ー`)y─┛~~
>>717 >ねらって書いただろ?
恥ずかしくて「はいそうです」としか言いようが無い
どちらも
簡単な横スクロールは作ってみたけどどうもおかしい
普通なプログラマのやり方が知りたい
>>719 >> ねらって書いただろ?
> 恥ずかしくて「はいそうです」としか言いようが無い
おまいも潔いな( ´ー`)y─┛~~
キーワードは「自作自演」
マジレスすると、マップの当たり判定はチップナンバーでするか、 細かく判定したいのなら当たり判定用のマップを別に作る。
なんか釣り臭い気がするなw RPG作るなら、マップエディタがいるだろ? マップチップはわかるな? マップチップ0=海 マップチップ1=草原 0とか1がチップナンバー。 それを頼りに判定する方法。 海に囲まれた島があったら 0000000000 0011111100 0111111110 0111111110 0011111100 0000000000 こういうマップになるだろ? で1なら通れるわけだ。 当たり判定にバッファリングは関係ない。
マップ描画用データはマップ描画用データで処理すればいい。 当たり判定は当たり判定用データで処理すればいい。 難しいことは、単純なことに分解、小分けにしていくことで大抵クリアできるんぽ。
>>724-725 ごめん、本当に初心者です
バッファリング用のint二次元配列と当たり判定用のint二次元配列を一緒にしようと思ってたので頭がこんがらがってしまって
別々に作ってみます
ありがとうございました
レイヤ使わないなら、判定用に分けなくてもいい気がする。
BMP読み込み マップデータ(ブロック種類記述)読み込み マップデータからマップデータ配列 struct MapData{ POINT pt; int type)
うっわ恥ずかしミス
>>728 書きかけだし、ミスならアレだけど、
なんで POINT が必要なのかな・・・かな?
0とか1とかが並んだマップデータファイルからデータを読み込んでtypeに格納、その際POINT型のptに座標(開始0,0)も格納 座標は1チップ読み込む度に座標+=1チップのサイズ これを100チップx100チップの仮想BMP(マップファイル)に書き出す キャラクターの座標はクライアント領域内の座標じゃなくマップ内の座標にする ・・ってのをやってみたいと思ってる マップ作っちゃうと重くなるかな?
おk、把握した。チップ画像の座標てことね。 そんなんでいいと思うよ。
良かった がんばってみる
ありがとう 今エディタ探してたところ
>732 今のPCパワーなら何ら問題無い メモリの有効利用がキーになるけど それよりもマップの画像データを 作るほうが大変
739 :
736 :2006/01/28(土) 20:54:31 ID:mw6mWgjC
ざっとソース見させてもらったけど、気になる点がいくつか。 仮想BMP、まさか本当にマップファイルの大きさのBMPを用意するのはさすがにまずいと思う。 それからマップチップの画像は一枚にまとめておいたほうが扱いやすいと思う。 struct MapChipData { POINT src; // マップチップ「「画像」」の開始座標を格納 int type; } int MapData[MAP_HEIGHT][MAP_WIDTH]; // ここにマップデータをそのまま読んで番号を格納していく こういうの用意して、例えば0,0からマップを画面に書きたかったら for (int y = 0; y < 20; y++) { for (int x = 0; x < 15; x++) { POINT src = MapChipData[ MapData[y][x] ].src; // これでチップの座標取って // ここらでsrcを使って裏画面にマップを描画。ソースは省略 }} あと、初心者で普通のRPGのように滑らかな移動を初めから実装するのは無謀だと思う。 まずは、チップサイズ(この場合32ドット)毎にキャラが移動するように作って それで、仕組みを理解してから滑らかにスクロールするところを作りこんだほうがいいと思う。 当たり判定については、キャラを実座標で扱っているからごちゃごちゃしてるんだと思う。 例えば右に移動するのを+10ドットとするのではなく、右に+1とする。 そのとき、一緒に当たり判定するとか。 // 右に移動したとき呼ばれたとして、typeで判定かな if ( MapChipData[ MapData[自キャラのY座標][自キャラのX座標 + 1] ].type == 1 ) { 自キャラのX座標 ++ } 当たり判定用のマップ作りたい場合はマップデータをintじゃなくて構造体にして詰め込めばいい。と思う(´・ω・`)
Direct Graphics の描画時の同期(Present()の終了待ち)をタイマーの代わりにしていたけど、 それだと、ウインドウモードでFPSが変わると速度の変化があるよね。 60Hzと75Hzで同じような処理を行うには、75のときに5回に一回飛ばせばいいだけなの? それだとカクカクしない?
カクカクする。 でもそれは仕方の無いことだとあきらめてる。 解決策教えてエロい人。 速度を一定に保ちたいなら、1秒間でどのくらい動くかということを考えて フレームごとの移動量を足していくようにすればいい。
>>740 はじめに数枚のマップチップを張り合わせたbmp画像を読み込んでおき、
struct MapChipData {
POINT src; // マップチップ「「画像」」の開始座標を格納
int type;
}mapchipdata[読み込むチップ数]
にマップチッブを張り合わせたbmp内の目的チップの座標とタイプを格納して
マップの再描画が必要になったとき(スクロール時等)にマップチップをメモリデバイスに貼り付け
ということでしょうか?
あと当たり判定の
if ( MapChipData[ MapData[自キャラのY座標][自キャラのX座標 + 1] ].type == 1 )
はMapData[自キャラのY座標/チップサイズ][自キャラのX座標/チップサイズ + 1]ですか?
そろそろGDI卒業してDirectGraphic使いと思って本屋で探したけど2Dからの入門書探しても3Dしかない・・
自キャラの位置をマップ座標で持ってるなら、32で割る必要なしだと思うが。 そのところは好きに実装すればいいんじゃね? 単にキャラの座標を32倍して保持するか、しないかの差だろ。 歩くたびに割り算するのはあんまり好きじゃないけど、今時のPCならどうでもいいことだろうし。 要は短形で判定する必要はないってことじゃないかね。 1ピクセルが一歩なら別の方法取らなければならんが。
MapData[40][40];に自キャラ座標のmapdata[120][130+1]を要求するとおかしくなると思ったので キャラの1歩を32ドットとして当たり判定は移動先の座標にブロックがあるかないかで判断すると キャラ移動時のアニメーションが必要になりますね その辺りも勉強しておかないと
判定方法と、移動時のアニメーションの必要性の有無に因果関係はない。
747 :
724 :2006/01/29(日) 17:36:03 ID:38NWeupe
俺は740のソースしか見ていないから違ってるかもしれんが 「自キャラの座標」は適当に直して使えということではないかな? 俺だったら32倍して持たないけど。 745の二行目以降はよく意味が解らん。アニメーション関係あるか??
>>746-747 ポケモンとかのゲームは1歩が1マスで移動時にアニメーション
同じように1歩を1マスにするとアニメーション使わないと見栄えが悪くなるかなと思って
まだまだそんなこと言ってられるレベルじゃないけど
>「自キャラの座標」は適当に直して使えということではないかな?
なるほど。自キャラの座標は実座標で扱ってたのでマスとして扱ってみます
勘違いしてほしくないので補足。 / 32 自体が間違ってるから不要と言ってるのではなくて まぁ初心者だから、好きなようにやってみるといいんじゃね? あとから仕組みがわかるだろうさ、という意味。
なんかRPG作りたくなってキターよ
便乗質問ですが、ウィザードリィやM&M、女神転生などの 3Dダンジョンはどのように作れば良いでしょう。
>>752 「どのように」って質問されてもな。何答えろって言うんだろうな。
大工さんに頼めという答えを期待しているのだろうか?
1,データをどのように持つのか?
→ 自分が作りたいものを内部的にどう表現するのか?
2,準備したデータをどのように表示するのか?
→ 自分の場所と方向を変化させても通用するように一般化させてコードに落とす
の2段階を考えれば、全体の流れは明確だと思うのだが。
まず着手してもらえるかい。
その中で個別に問題が出てきたら、ここで質問するといいよ。
>>752 状態に応じた画像を用意しておきそれを組み合わせて表示する。
>>755 ソースをアップするのは自由だが文面から察するに
「誰かソース見て添削してくれ」と言わんばかりだな。
そのスタンスは歓迎されないし自分の為にならない。
僕らは君の先生じゃない。だが焦点を絞って質問すればその限りではない。
>マップ間のリンクなんとかならないだろうか
>いちいち位置を指定するのは面倒
マップを増やすたびにコンパイルが必要と言うのはあまりよくない。
どのマップからどのマップへ移動というデータは外部で持つべき。
そのトリガはマップチップの番号なのは言うまでもない。
とにかくアルゴリズム以外は外部ファイルに追いやる事が慣用。
なんだかんだ言ってソースを見てる
>>756 に萌え。
…ななな何言ってんのよ!!ふっ、ふざけないでよ! 私だって、す、好きでやってるわけじゃないからね! べ、別にあんたなんか困っててもかまわないんだから! バカーーーーーーーーー!!!
つんでれワロス
マリオ風アクションゲーム作りたくて設計を考えてるんだけど、マップ内の移動と描画はいいとして 敵とかのプレイヤーが動かすことのできないオブジェクトはどうやって表現するの? 出現条件とかもわからないし
>>760 >敵とかのプレイヤーが動かすことのできないオブジェクトはどうやって表現するの?
まぁ基本はこんな感じか。
for (i = 0; i < キャラクタの数; i++)
{
obj[i]->Move();// 移動処理&マリオとの当たり判定など
}
>出現条件とかもわからないし
出現条件はマリオの居る現在位置から割り出し、
画面に出現する直前にキャラクタの登録をしてるんじゃないかな?
それかマップのロード時に一括して登録して移動処理はしないで画面で出そうになったら
移動処理を開始するとか。いろいろ方法はあるな。
>>761 なるほど。
やっぱり専用のスレッドを作った方がいいでしょうか?
スレッドを作るほどのことではない。
というよりスレッドなんか作ったらいかん。
>>763-765 勘違いしてるかもしれないので一応
_beginthread()で生成して_endthread()で破棄するスレッドのことです
現在メッセージループメイン関数(描画処理をプロージャのWM_PAINT内で行う)のほかに
キャラクター表示座標、マップ内表示座標調整スレッドがあります
ありますと言うか予定してます
>>765 いやたぶん
>>763-764 は勘違いしてないと思うよ。
メッセージループとゲーム処理用のスレッドは分けてもいいけど、
ゲームでは仕事ごとにスレッドなんぞ作ったりしない。
マルチスレッドなんぞそれが絶対に必要な状況でなければしないほうがいい。
細かい事だが・・・
>プロージャ
プロシージャな。
>>767 そうでしたか
スレッド重くなりますかね
>プロシージャ
今までずっとプロージャプロージャ(ry
ありがとうございました
ゲーム作りたいけど何をどうすればいいか分からない まぁゲーム以前にDirectXの扱い方知らないわけですが
チュートリアルなぞって、コードを入力しながら動作を確実に確認する。 途中で絶対飛ばさず最後までやる。 これだけである程度は使えるようになる。
何も分からないあなたに H S P
>>771 C言語とWindowsAPIは分かってるかもしれない。
チュートリアルってどこにあるん?
SDKのなか
775 :
名前は開発中のものです。 :2006/02/09(木) 00:16:23 ID:ECXOumIZ
d3dでxファイル表示して動き回るところまでは行けたんだが、 肝心のキャラクターのモデリングが全く進まん・・・ というより、どういうキャラを作れば良いか全く不明orz ゲームの趣旨考えてなかったツケがこんなに早く回ってきた・・・
初期化やらライティングやらマトリックスでコンパイルエラーしまくって鬱状態の俺の前でそんなこと言うか 万死に値する
777 :
名前は開発中のものです。 :2006/02/09(木) 00:48:24 ID:ECXOumIZ
matrix・・・orz それ聞くと鬱になる・・・
>コンパイルエラーしまくって さすがにそれはプギャー
>>777 そんな君に
つQuaternion
>>778 コンパイルエラーならどこが悪いか箇所教えてくれるだけまし
3Dゲームについて聞きたいんだけど テクスチャマッピング機能ってどうやって使うの? VertexBufferに入れた物体には適応できるけど Xファイルには適応できないような・・
>>780 最近のD3Dはわからんのだが、
基本的にXファイル自体はマテリアルやテクスチャを内部で持っている。
読み込むときに自前でテクスチャをロードし、
描画時にデバイスにSetTexture()する。
yaneSDK3のフレームスキップの部分なんですが/**/のところが意味がわかりません。 なぜ2フレームと書いてあるのにdwWait*3なのでしょうか? void CFPSTimer::WaitFrame(){ // (C)yaneurao 1998-1999 DWORD t = timeGetTime(); m_dwFPSWaitTT = (m_dwFPSWaitTT & 0xffff) + m_dwFPSWait; // 今回の待ち時間を計算 // m_dwFPSWaitは、待ち時間の小数以下を16ビットの精度で持っていると考えよ // これにより、double型を持ち出す必要がなくなる。 DWORD dwWait = m_dwFPSWaitTT >> 16; // 結局のところ、今回は何ms待つねん? DWORD dwElp = (DWORD)(t - m_dwLastDraw); // 前回描画からいくら経過しとんねん? if (dwElp>=dwWait) { // 過ぎてるやん!過ぎてる分、250msまでやったら次回に持ち越すで! DWORD dwDelay = dwElp-dwWait; //250以上遅れていたら、フレームスキップしない(初期化のため) //そして、遅れ時間は0として扱う if (dwDelay >= 250) dwDelay = 0; /**///2フレームの描画時間以上ならば次フレームをスキップする m_bFrameSkip =(dwDelay >= dwWait*3); if (m_bFrameSkip) m_dwFrameSkipCounterN++; t -= dwDelay; // 今回の描画時刻を偽ることで、次回の描画開始時刻を早める m_dwLastDraw = t; m_dwElapseTime[m_nDrawCount & 31] = 0; return ; } // ほな、時間を潰すとすっか! m_dwElapsedTime += dwElp; // 時間待ちした分として計上 m_dwElapseTime[m_nDrawCount & 31] = dwElp; m_bFrameSkip = false;//次はフレームスキップしない ::Sleep(dwWait-dwElp); m_dwLastDraw += dwWait; // ぴったりで描画が完了した仮定する。(端数を持ち込まないため) }
>>781 なるほど。
全てXファイルを使用するなら必要のない機能ということですね
そりゃあんた、一周の待ち時間が*1だからじゃよ。 (余計にかかった時間が)2フレームの描画時間以上なら… と読み替えればよろし。 つか、キモいコメントだね。 関西人ってみんなこうなの
関東だろうが関西だろうが、キモい奴はキモいんだよ。 関西人と一括りにするのは失礼。
ちなみにコイツはチュンだな
初心者の俺をキモい呼ばわりですか
789 :
782 :2006/02/12(日) 03:40:55 ID:MOr6hByS
>>784 実をいうと2フレームというところからして理解できないので
m_bFrameSkip = dwDelay > 0;
としました。
>>782 コメントもコードもキモすぎると思ったら
あの偏執狂やねうらおか
また大阪か
テクスチャのお勉強にDirect3Dを使って2Dのゲームを作りたいのですが、 薄い面だけのポリゴンを複数画面に並べ、そこにマップチップ等のテクスチャを貼り付ければいいのですか? 自キャラの描画もキャラ用の薄い面にアルファ値を設定したテクスチャを貼れば大丈夫ですよね?
>792 日本語で(ry マジで薄い面って何だよ
三次元のポリゴンでなくて頂点が4つしかない普通の四角形 日本語は苦手
ポリゴンはそもそもただの三角形。
>>795 それは言い過ぎ。
「ポリゴン」とだけ言った場合は「多角形」という意味。
>>792-794 マジエスパーすると、いわゆる矩形スプライトのことだろう。
もうちっと3Dグラフィックに関する勉強が必要なんじゃないか
>>796 それっぽいです
ポリゴンに貼り付けないと2Dは描画できないと思っていたので
>>797 参考書と睨めっことか嫌いだから
いろいろ作りながら覚えていこうと思ってる
いってくる
「ビルボード」でいいんでない?
SDKだと「スプライト」が座標変換無しの2D画像で 「ビルボード」は爆発とかに使う座標変換ありの1枚板だな
>>80 ゼノギアスの戦闘シーンのキャラとか、FFTのキャラとかがビルボードですな。
爆発にも使えるけど。
どちらかといえば2Dの描画というより、3Dの背景の中に
2D絵をなじませるための技術だと思っていたが、その理解でいいのかな?
3Dゲームは描画用マップとコリジョンマップに分けると聞いたのですが、 描画用マップとコリジョンマップは1ステージ全て1つのXファイルで作るんですか?
キャラクターと衝突判定する部分だけに特化したデータを作ってもらうといいじょー。 例えば天井に衝突しないゲームなら、デザイナーさんに天井無しにしてもらうとか。 描画用ではカーブでも衝突用のは多少ごつごつしてても平気っす。 描画用もヒットチェック用もXファイルじゃなくってもいいけど、基本別々です。
804 :
803 :2006/02/18(土) 20:13:53 ID:+8ZFcTvr
×カーブ ○滑らかなカーブ
>>803 なるほど、描画用マップはテクスチャ情報の付いたXファイルなど、
コリジョンマップは壁や各オブジェクトの位置を表したデータファイル・・・であってますか?
>作ってもらうといいじょー。
業界人ではないので誰にも作ってもらえないですorz
コリジョンマップエディタとかあるらしいのですが有料でしょうか
逆にコリジョンマップを含めたステージの論理的なデータから 風景を生成するっていう考え方もあるが、まぁ普通は別々に作るんだろうな
807 :
803 :2006/02/18(土) 21:51:17 ID:+8ZFcTvr
>>805 そそ、描画データが大体、x,y,z,nx,ny,nz,u,v,面情報,マテリアル情報などなど〜、とかだけど
コリジョン用は、x,y,z,面情報、で十分なので。
>コリジョンマップエディタ
オラにはわかりませんです。
>>806 風景データの完成後、それをコピって別レイヤーで
がすがす頂点削ってく作業なので結構すぐ作ってくれます。
2〜3週間で作るデータでも、1・2日でコリジョンデータは出来てくるっす。
gtkradiantだっけ? そういうのもあるらしい。
809 :
名前は開発中のものです。 :2006/02/19(日) 00:17:34 ID:GTOCpkng
FF7〜9のように一枚の2D絵に描かれた3D世界の中を3Dのポリゴンキャラが動き回るゲームって どうやって実現しているんでしょう? 特に、スクロールとかやった時にどうして遠近感や空間関係が破綻しないのか不思議です。 なんたって、キャラは3Dで背景は2Dですからね。作るの難しいですかね?
あれは一枚のように見えるけど一枚じゃないぞ
>>809 フィールドは、全部3Dでおおまかなブロックにわけてスクロール。FF7で時々読み込み失敗する;;(飛空挺?とかで)
ダンジョンは、カメラの視点・注視点が動かないシーンは背景を2Dでプレイヤーの前面にくるオブジェを
3D計算で(これは2D計算(描画順序のみ)のままでもいけるところもあるかも)。
ムービーへ切り替えするときは、背景をムービーとして、カメラワークとプレイヤーの前面にくるオブジェだけ3D計算。
注視点が動かないシーンなら分かるんです。コンポジションソフトと同じ要領でしょ? 問題はカメラがキャラを追って大きくパン(背景絵もスクロール)するような広いダンジョンの場合は? 空間関係を保持出来ませんよねぇ?
コツとしては絵の中の道は実際の3Dデータとして考えて、 カメラワークをキャラクターの位置から背景2D絵に対して平行にすべらせるとFF7〜9のようにできます。 (道がキャラクターより前面にくる時は当然3Dオブジェとして描画します。 というかFF7〜9の背景データは3Dデータから2Dにおとしてる?) 背景データが3Dじゃないと表現できないのはカメラ視点が平行移動せず奥へ向かって行く場合っす。 FF7〜9ではそういう時、ムービーを使用しています。 そういえばバイオハザードとかも同じっすね。
815 :
813 :2006/02/19(日) 15:41:30 ID:rJ6jDAqF
×奥へ ○奥や手前へ
>>814 そう思います。プレステ1だし風景まで3Dってわけにはいかなかったのかも。
理解しました。つまりカメラがキャラの移動に対して常に平行移動する限り、カメラアングルに「角度」的変化は無いので背景絵と矛盾しなかったんですね。 しかしその場合でも、スクリーン何個分もスクロールするような長い道などの場合マップ絵の読み込みだけで相当なメモリを消費するんじゃないかと思うんですが。 それに3D処理とマップ描きは別の工程での作業になると思うんですが、 実際プログラム上で実行した時に3D処理上の当り判定とマップ絵上の壁とが 寸分違わず一致してますよね〜。一体どうやってるんでしょう?
寸分違わず一致しない理由がわからん。
だってだって、普通少しくらいズレたって良さそうじゃん? 3D処理用の簡易モデル・シーン情報→マップ描く人のツールに移す→細かいパーツとか付け足し、テクスチャ貼り→プリレンダ絵完成 この工程のどこかでズレそうじゃん、どこかでマウスがブレたりして。またはカメラの設定トチったりして。
製品レベルではズレることは許されない
じゃあ慎重な作業と根性でズレないようにしていると理解してよろしいですか? ちなみにこういったシステム(FF7・8・9/初期バイオハザード)のゲームを作るにはどの程度のプログラムの技術が必要になりますか? 自分はプログラムは組めないので、出来る人を探さなければいけないんですが。 例えばこのスレにいる皆さんなら作れます?キャラモデルやマップ等は全部こっちで用意すると仮定して。
821 :
名前は開発中のものです。 :2006/02/20(月) 02:33:26 ID:7NofXH/9
>>820 出来る人は結構いるけど、あんたに付き合っている暇がある人はいないと思われ。
割と大変な方。
>>820 技術もさることながら、単純にマンパワーが必要になるよ
FF7〜クオリティ・量のグラフィックデータを自前で全部作れるのならそんな心配無いのかもしれんけど
上司「高速化がご飯作ってくれるの!?」 オラ「でもスクエ二君の家は・・・」 上司「スクエニ君の家はスクエニ君の家!!うちはうち!!」
プロの作品って技術もさることながらマンパワーが凄まじいよなぁ
確かに。
827 :
名前は開発中のものです。 :2006/02/20(月) 19:14:27 ID:DhgD3x+I
Softimage|XSI FTKに詳しい方に質問です。 XSIのスケルトンをエクスポートしたいんですが、BASEPOSE とSRTの相関関係が良くわかりません。 BASEPOSE, SRT を4x4行列変換済みメンバーとして、スケルトンがRoot->bone->bone2 というチェーンとし、 rootのグローバル変換行列とジオメトリブレンディングは無視するとして、最終的にbone2に結び付けられたenvelopeというメッシュのローカル変換行列Lを得たいとします。 このとき、↓のようにBASEPOSEを無視してよいのか、 Matrix L = bone.SRT * bone2.SRT * envelope.SRT それとも↓のようにBASEPOSEと相対的にSRTがあるんでしょうか? Matrix L = (bone.SRT * bone.BASEPOSE) * (bone2.SRT * bone2.BASEPOSE) * (envelope.SRT * envelope.BASEPOSE) それとも何か別の考え方に基づいているんでしょうか?
>>825 そりゃ、ゲーム作るのに50人とか使えるんだからな。
アマチュアはどう頑張っても10人程度が限度だろう。
プロジェクト管理する人は、相当な交渉能力と カリスマ性と幅広い知識が無いと、50人なんて統制できないんだろね
金がありゃ何とかなるんじゃね?
2Dのファミコンのドラクエの洞窟みたいなマップのシステムを作るには どのようなやり方がよいですか? 参考になるようなサンプルとかないでしょうか。 環境:VC++
>>828 XSIの中間フォーマットdotXSIからゲーム製作などに必要なデータをコンバートするためのライブラリがFTKのようだ
>>827 以前自分がやった時は、良く分からないまま試行錯誤してたら上手く行った感じに
なっただけなので、もしかしたら問題あるかもしれんが書いてみる。
ソース見ても良く思い出せないけどね。バージョンによっても違うかもしれんし。
基本的に、SRTを階層で乗算していった物がそれぞれのBASEPOSEになるみたい。
なので、アニメーションさせないならBASEPSOEだけ使えば、SRTによる階層での乗算は不要かと。
SRTはFCurveで値を変更できるようなので、アニメーションするならSRTも必要。
FCurveでアニメーションさせる場合、SRTにはFCurveの1フレーム目が入っているようだ。
ジオメトリブレンディングをやるならSRTだけじゃ駄目で、BASEPOSEが必要と思われる。
自分のソース上では、BASEPOSEの逆行列保持して、SRTで動かして元に戻す感じになってる。
自分で書いてても良く分からなくなってしまった。
聞きたい事と全然違ったらごめんね。
今度オリジナルのカードゲームをHSPで作ろうと思うのですが どういう風にプログラミングすればいいのでしょうか?
837 :
827 :2006/02/21(火) 13:28:47 ID:Ry7crMJu
>>834 >基本的に、SRTを階層で乗算していった物がそれぞれのBASEPOSEになるみたい。
どもです。BASEPOSEはIKで使うようですね。エフェクターを動かした後、この逆行列を掛けて変換行列を得るようです。
838 :
前430 :2006/02/21(火) 22:19:53 ID:NxD57HWX
>>835 割り込みがあるルールの場合は、お互いのカードをスタックに積んで上から処理する。
Direct3D使ってゲームを作りたいのですが、クラス構成で悩んでます WinMain┬Rendererクラス ・・・レンダラーの初期化と描画開始・終了・Present() └Sceneクラス ・・・シーンの構築と描画 レンダラークラスからポインタで呼び出される 今のところこんな形になってるのですが、(某DX本の構成) ここにキャラクターの移動や描画などの処理をまとめたCharクラス マップのスクロールや描画をまとめたMapクラス などのオブジェクトを表すクラスを組み込むとしたらどこに入れればいいのでしょうか? 上の構成はぶっ壊してもいいです
悩むところなんだろうか?ぶっちゃけどこに入れても その先の部分をきちんと書けばちゃんと回ると思うんだが。
オブジェクトクラスが入力と描画どちらにも対応しないといけないから 描画用クラスに組み込むとおかしくなるし 描画用クラスの外に出すとどうやって描画するかが分からなくて
ひょっとすると俺には想像もつかない複雑な構成になってるのか。 そもそも説明文と図が矛盾してる(レンダラーからシーンが呼び出されるのに 図ではWinMainを介してしか繋がってないように見える)しな。
ttp://dream.my-sv.net/upload/src/up0140.zip ごめん今こんなものしかない
WinMainからレンダラー呼び出してその中でDirectXの初期化
次にシーンクラスのCreateScene()呼び出してテクスチャとかメッシュとかアニメーションとか設定
WinMain最後にスレッド生成。スレッド内は無限ループ。
レンダラークラスのRenderScene関数にシーンクラスへのポインタ渡して
RenderScene関数内で画面クリア後、シーンクラスのDraw関数呼び出してモデルを描画
その後RenderSceneに戻ってpresent()したらWinMainに戻る
打っててなんかおかしいとおもた
長々とスマソ
CSceneクラスにオブジェクトクラスなりそのポインタなりのリストを保持させる
やっぱりシーンクラス内になりますか スレッド内で移動処理などしたいのでWinMainにクラス持たせてポインタを渡すことにします ありがとう
タスクシステムとやらを組んでみた コンパイルエラーの嵐 関数ポインタとメモリが絡んでくると毎回酷いことになる
コンパイルエラー云々言ってる段階じゃ まだ話にならんと思うんだが。
いや関数ポインタの方はあまり使ったことないからその辺はまぁ・・ Class1::test(TASK *t) //TASKはタスク用の構造体 { ・・・ } この関数をタスクの行動関数に指定してタスクを生成したいんだけど タスククラスのpTask->TaskCreate(test, NULL, 1, 1)でタスク生成関数に関数testのアドレスを渡しても 「void (* (_closure )(TASK *))(TASK *)' 型は 'void *' 型に変換できない」とかエラーが出る 渡す先はタスククラスメンバ関数の TASK* TaskCreate(void* Func, void* Release, DWORD Priority, DWORD Type) クラスのメンバ関数はvoid*型に変換できないの?
>>848 >クラスのメンバ関数はvoid*型に変換できないの?
ムリ。
いや、無理すれば出来るけど。
bind1stで調べてみると分かる、かも?
あとクラス内のメンバ関数ではなくクラス外の関数なら普通に渡せた void test(TASK *t){/*・・・*/}とか
>>849 更新してなかった
>bind1st
ありがとう、ちょっとググってくる
>>848 クラスの多重継承を考えると、sizeof(メソッド)は
sizeof(単純な関数ポインタ)+sizeof(オフセット)
が必要になるよ。
しばらく検索してみたけどどうにも・・
>>852 よく分からんです・・
タスク用のデータエリアのことなら
pTask = new CTask;
TASK* Task = pTask->TaskCreate(行動関数,開放関数,優先度,タイプ); //タスク生成、リスト追加
Task->Data = new データ型;
Task->Data = (void*)データ;
で確保してるのでサイズは大丈夫だと思う
タスクってポインタをガシガシ切り替えて処理するものだと思ってたけど
CじゃなくC++のクラスを使ったタスクシステムを見てみると
どれも継承元で仮想関数使って継承先に処理を記述する処理固定のしかないんだなぁ・・・
つStateパターン あと、関数ポインタじゃなくてboost::function使うと色々できるよ。 パフォーマンスは知らんけど。
>>853 C++でもポインタの切り替えはできるよ。というかできたよ。
理由は
>>852 の通りなんだけど、
とりあえずクラスメソッドはvoid*型に変換できないんで
TASK* TaskCreate(void* Func, void* Release, DWORD Priority, DWORD Type)
は
typedef ...(ClassName::*FuncType1)(...);
typedef ...(ClassName::*FuncType2)(...);
TASK* TaskCreate(FuncType1 Func, FuncType2 Release, DWORD Priority, DWORD Type)
のようにする必要がある。
>>854 >Stateパターン
Stateで検索してたつもりがいつのまにかデザインパターン全般のページ見てた
奥が深いね・・・こっち関連の書籍持ってないから今度買ってみる
boostはライブラリをあまり使いたくない派なので迷う
>>855 異なる複数のクラスに対応させる場合、
生成関数をその分用意しないといけないので大変ですね・・
なんでクラスメソッド渡せないんだか・・
デザインパターンに興味を持ったのでStateパターン覚えてからしばらくそっちに走ってみます
> 異なる複数のクラスに対応させる場合、 > 生成関数をその分用意しないといけないので大変ですね・・ > なんでクラスメソッド渡せないんだか・・ まさにここが工夫のしどころで、 いちいち作らないようにする方法はある。
>>857 今思い出したからうろ覚えだけど
もしかして関数テンプレート機能?
ういうい。 このくらいはできて当然だから、がんばっちくり。
ありがとう 俺物忘れ激しいな・・ C++基礎からやり直した方がいいかも
タスクシステムなんて言うから C で組んでるのかと思ったら、 C++ だったのかよ。 普通に仮想関数使えば終了だな。キモイキャストの連発ともおさらばだ。 関数ポインタから void* への変換は、メンバ関数に限らず不可。 もしできたように見えたとしても、それはコンパイラの独自拡張だろう。
>>861 やってみれば分かるけど、仮想関数のみだとキャストしないと無理。
あと、関数ポインタからvoid*への変換は確かに環境依存なんだけど、
boost.function はそれを駆使して実装されてるんで、
boost.function が動く環境ならどこでもできるよ。
class ClassA { public: void static funcA(void* se1f) { ClassA *self = (ClassA*)se1f; cout << self->num++ << endl; } private: int num; }; void call_func(void (*func)(void*), void *arg) { func(arg); } int main() { ClassA *class_a = new ClassA; call_func(class_a->funcA, class_a); } Perlとかに慣れているなら self の存在を許せるよね…
>>863 タスクシステムって言うのは
class Task {
public:
void begin_task() { ... set_task(&Task::task1); }
protected:
void task1() { ... set_task(&Task::task2); }
void task2() {}
};
とか、こういうのを指してると思うんだ。
で、コールするべきメソッドを保存するためには、
テンプレートを使わないならキャストする必要があるよと。
もちろん1タスク1関数を遵守してもいいんだけど、これはこれでなかなか便利だよ。
あと、boostの方は間違えた。
関数オブジェクトを保存しているフィールドと関数ポインタのフィールドを見誤ったようだ。
↑set_taskとそれを呼び出すメソッドは適当に補完して。
ゲームの描画と処理は別にした方がいい? 別にする場合の構成とかどんなもん?
>853 C++でやるならもっと型安全に気を使おう。 そんな古典的な手法を使うならCでやれ。 C++的には >継承元で仮想関数使って継承先に処理を記述する その継承先の処理の記述で、 ifやswitchやメンバ関数ポインタやstaticメンバ関数へのポインタを使って分岐するのが、 型安全でカプセル化でスマート。 >861 void *に変換した物は、何も弄らず元の型に戻せば、 正しく復元される(関数ポインタだとしても)って聞いたんだが。
>>867 普通は別にするとおもわれ。
構成なんて漠然としたこと聞かれても困る。
例を示されよ。
>>868 オブジェクトポインタと関数ポインタの間での変換は規格では認められていない。
C の時からそう。
タスクシステムってまさかCodezineに載ってるアレのことか? C++でやるならStateパターン+1キャラクタ1クラスでFAだろ。
>>865 その形でどこにキャストが要るのかわからない。
>>870 確かにコンパイラの独自拡張なんだけど、もはや共通拡張と言ってもいいくらい浸透してるみたいだね。
条件付きではあるけれど。
ttp://forums.belution.com/ja/cpp/000/015/67s.shtml >>871 状態によって処理を変える必要しかないならそれでもいいだろうね。
ただ、例えばタイトル画面なんかの場合は
1)タイトル文字をフェードイン+移動しながら表示
2)サブタイトルを移動しながら表示
3)全体にエフェクトをかける
みたいに状態によって左右されないシームレスな記述が必要になる。
これを扱う方法としてswitchやマイクロスレッドがあるんだけど、
もう一つの方法がこのオリジナルタスク。
オリジナルとはいっても
Codezineのタスクシステム + Move or Drawメソッドの呼び出し先を変えられる
ってだけなんだけど。
>>872 新規クラス Task2 や Task3 を導入したときに問題になる。
状態によって処理を変えるのが、Stateパターンじゃないのか
タスクシステムのあとから生まれた、関数ポインタとか隠蔽しているC++で タスクシステムの方を優先して設計するのはナンセンスだと思うよ。 関数ポインタを使って実現したいことは処理の共通化だろうし、それは仮想関数だけじゃなくて 普通に継承元になる側にも関数いれときゃいいし。 継承元のクラスポインタに、派生したいろんなクラスをまとめていれられる。
WinMain下の構造教えてくれ
>>865 の言ってるタスクシステムとか百害あって一利無しじゃね?
>状態によって左右されないシームレスな記述
ってのは単に処理をどこで区切ってStateに分けるかの話だろ。
878 :
872 :2006/03/01(水) 00:59:35 ID:IPZ1L++y
>>873 > 確かにコンパイラの独自拡張なんだけど、もはや共通拡張と言ってもいいくらい浸透してるみたいだね。
> 条件付きではあるけれど。
そんなに必死に正当化しなくても、非標準なんだから使わないようにすれば済む話。
「共通拡張」なんて胡散臭い言葉を持ち出すのは混乱の元。
> 新規クラス Task2 や Task3 を導入したときに問題になる。
やっぱりわからない。わかんないのは俺だけ?
何から何へのキャストが要るのか、書いてもらえると分かるかも。
>>878 もういいじゃん。
そっとしておいてあげようよ…。
共通拡張の時点で分かるでしょ。
もういっぱいいっぱいなんだよ。
わかってやれよ。
これは例が悪かったのかな。もう一度プログラムを書いてみる。 これは擬似コードなので動かないし、NULLチェックとかもしてないよ。 // 描画系のメソッドは略 class TaskBase { public: typedef @ FuncType; TaskBase() : m_func(&TaskBase::begin_task) {} void set_task(FuncType func) {m_func = func; /*A*/ } void update() { m_func(); } protected: virtual void begin_task() {} private: FuncType m_func; }; class Task1 : TaskBase { public: Task1() {} protected: void begin_task() { set_task(&Task1::task1); } void task1() {} }; class Task2 : TaskBase { public: Task2() {} protected: void begin_task() { set_task(&Task2::task1); } void task1() {} };
>>875 関数ポインタを使ってしたいことは、処理の共通化でもあるんだけど、
タスクの場合は主に長い処理を1フレーム分に分割することにある。
マイクロスレッドなりスレッドなりを使わないと、どうしてもぶつ切りにせざるを得ないので。
もちろん、templateメソッドみたいに呼び出すメソッドがあらかじめ分かっていれば、
継承元側に仮想関数を追加しておくことはできるよ。
ただタスクシステムの場合、それはほとんど不可能。
>>877 Stateを使うってことは、状態一つに対してクラスを一つ作るってことなのかな?
例えば、
>>873 にあげた1)2)3)でそれぞれに対してクラスを作るの?
これの代替機能としてはswitchやマイクロスレッドがあげられると思うんだけど、
何でステートパターンにこだわるんだか、俺には分からない。
これだと粒度大きすぎると思うんだけど。
(細切れの関数に対していちいちクラスを作らないといけないってことね)
>>878 > そんなに必死に正当化しなくても、非標準なんだから使わないようにすれば済む話。
> 「共通拡張」なんて胡散臭い言葉を持ち出すのは混乱の元。
一緒に示したソース見た?
その中に「共通の拡張」って表現があるから、それを借りただけなんだけど・・・
この辺は
>>868 や俺のように間違えてる人が多いから、一応確認しただけ。
これは本題ではないので、こちらからはこれ以上レスしないよ。
あと、
>>880 に示したプログラムではテンプレートを使ってないので、
@に何を書いてもAでキャストすることになる。
使わない方法があれば、俺も知りたい。
>>881 × @に何を書いてもAでキャストすることになる。
○ @に何を書いてもset_taskの呼び出し時にキャストすることになる。
>>880 ,881
キャストが要るようになったらプログラムが間違ってるのを疑えよ。
なんで仮想関数で得られる型安全を自ら壊すような「タスクシステム」に
こだわるんだ?そんなシステム要らない。
↓これでいいんじゃないの。
class State {
public:
virtual void update() = 0;
};
class State1 : public State {
public:
State1() : m_update_task(&State1::begin_task) {}
void update() { (this->*m_update_task)(); }
private:
void (State1::*m_update_task)();
void begin_task() { m_update_task = &State1::task1; }
void task1() {}
};
>>883 ようやく伝わったようだ。イメージとしてはそんな感じ。
で、テンプレートを使えば m_update_task 周りの処理をすべて
継承元の xxx<Task1> に投げられますよというだけの話。
例でtemplateを使って無いのは、
>>882 に説明するため。
一体何を話しあっているのか分からない俺ガイル State1() : m_update_task(&State1::begin_task) {} void (State1::*m_update_task)(); void begin_task() { m_update_task = &State1::task1; } この辺りの記述ははじめた見た 詳細きぼん
あーすまん分かった コンストラクタとメンバ関数ポインタか コンストラクタでbegin_taskを関数ポインタに代入して それが呼び出されれば関数ポインタにtask1を代入するわけか またひとつ賢くなった
>>884 また分かりにくいかもね。
>>883 の例でいくと、
class State1 : State<State1> { ... };
とすれば、m_update_task 周りの処理を
継承元であるState<>で行うことができますよという話。
根本的に勘違いしてると思うんだよねぇ。 つーかさ、switchでつくりゃいいじゃん。ポインタにしてもいいことないよw 最適化かからなくなるし。 switch( TaskType ) { case TaskType1: funcType1(); break; case TaskType2: funcType2(); break; case TaskType3: funcType3(); break; default: assert( false /*TaskTypeError*/ ); } ああ、安全安全。
タスクの良い点は状態遷移が単純なときに状態変数みたいなものをつくらずに 関数に分けて、特定の状態のときに行う処理がかけることかな。 状態遷移が複雑だったり外部の環境の変化によって遷移の仕方が大きく変わるようなら Fiberつかったほーがいいけど、適材適所ということで。 キャストとかtypedefとか必要ない俺のつくったタスクシステムのきれっぱしを参考にしてくれ 正直つくったはいいがザコキャラがでてきてうろうろしたり弾幕があったりするようなゲームを つくらなかったので使いどころがなかった。 // タスクの管理者はlist<TaskManagable*>をメンバに持ち、Run()を順番に呼んでいくのだ class TaskManagable { public: virtual void Run() = 0; }; //タスクになりたいクラスは class MyEntityTickTask : public Task<MyEntityTickTask> // … とやってMain()を実装する。ChangeTask( hoge ) で自分のメンバ関数 void hoge() へ状態遷移できるよ //管理者に登録するのはこのMyEntityTickTaskクラスをnewするやつの仕事だ。当然だね(^ー^b template <typename T> class Task : public TaskManagable { public: Task() { ChangeTask(Main); }; void Run() { (((T*)this)->*m_doit)(); } protected: virtual void Main() = 0; void ChangeTask(void (T::*fp)()) { m_doit = fp; } void (T::*m_doit)(); };
>>889 > キャストとかtypedefとか必要ない俺のつくったタスクシステムのきれっぱしを参考にしてくれ
> void Run() { (((T*)this)->*m_doit)(); }
キャスト入ってるよ。まぁ型安全は使い方で確保されてると言えるけど。
あんた、たぶん VC 使いだな。メンバ関数ポインタの &ClassName:: は
規格では省略できないことになってるから、気をつけてな。
>>884 ,887
たぶん 889 と似たような形のことだろうな。
これまでに挙がったコードだと template も継承も持ち出さずに
自分でメンバ関数ポインタを宣言(
>>883 )すれば十分に見えるんだけど、
「 m_update_task 周りの処理」ってのは代入と呼び出し以外に何か有るの?
State の実装がメンバ関数ポインタによる処理に切り替えを必要とするとも
限らないし、これをわざわざ「システム」として組み込んでしまうのは
template や継承(特に自己言及的 template など)おぼえたてで
使いたいだけに見えなくも無い。ほんとでそんな構成に利点があるんだろうか?
Cマガのやつじゃだめなの?
>>890 ほとんど似たようなコードを置きながらちっともリスペクトしなかったのは俺の不注意だが
そこまで嫌味をいわんでもええやん
C#あたりでポインタのない世界を勉強するほうがいいかも。 C++がこんな言語なのはCとの互換性を保っているからだしね。 なんつーか、WindowsのDOS窓でプロテクトモードじゃないと動かないような プログラムをいまさら作ってるくらい違和感がありますよ関数ポインタ。
勉強として使ってみるのは十分ありだと思う。
895 :
名前は開発中のものです。 :2006/03/01(水) 21:06:02 ID:IEMguq9O
>>888 あたし、一生あなたについていきます(*・_・)
少なくともC++において設計の時点でキャスト前提に話してるのって絶対おかしいだろ
>>890 分かってるとは思うけど
>>880 はサンプルだし、
実際に使うとなると他にもいろいろと書き加えないといけない。
そうなったときに、継承先クラスの実装とタスクシステムが
分離されてることはいいことだと思うけど。
>>893 もちろん実装として、メンバ関数ポインタの代わりに
boost.functionやらそのたぐいを使うことは十分に考えられる。
そういったことはすでに提案されている。
898 :
名前は開発中のものです。 :2006/03/01(水) 23:16:45 ID:1kpkO4CI
俺も昔はC++で関数ポインタ使うタスクシステムってのを作ってたけど、 今はtemplateとstateパターンだなぁ
グローバルに宣言した変数ならextern使えば他ファイルのクラス内からでもアクセスできるんだな ファイル分割の辺りを飛ばしてたから初めて知った グローバル変数をクラスにポインタ使って渡してた自分が馬鹿みたいだ・・
その変数をローカルにするんだ。
901 :
名前は開発中のものです。 :2006/03/01(水) 23:32:30 ID:hlrpUZzF
>>899 いきなりC知らない人間がC++やると碌なことが無い
>>899 のやってる事の中でC++独自の機能を目を皿のようにして探す漏れ。
っていうかぁ、
○ ○ ○ シ ス テ ム 云 々 っ て 馬 鹿 ぁ?
達成すべき処理に対して最適なアルゴリズムで組んでいけば、
それが最強のシステム。「よし○○○導入するぞ?」ってのは、
自分でまともなアルゴリズム組めない思考停止。PG才能無し。
自分は間違えを犯さないという絶対的な自信があるならそれでもいいと思うけど そこまで自身がないなら既に完成しているシステムを組み込む安全な方法のほうがいい
>>902 自分以外の同業者が何か敵か見下す対象なのであれば
同一のパーソナリティが出す見解としてはあってる。
だいたい設計なんて自分でいくら考えたところで がいしゅつか糞かのどっちかだろ。よっぽど今までに無い 特殊な課題が出てきたってなら話は別だけどな
彼は天才なんだよ。最適なアルゴリズムや設計が 常に湧いてくるなんて尊敬しちゃいます(><)
ogreって日本語使えますか・・・?使う前に聞きたいんですビットマップテクスチャなのかさえ
その前に、君が日本語を使えるのか確認したほうが良さそうだが・・・
>>904 そのとおりなんだが、上で出てるタスクシステムとやらは超絶に危険だろ?w
ツリー構造のタスクシステムをC++で作ったときはリンクリストにしてポインタ使ったけど
アップキャストだけにしてスマートポインタで管理して、タスクを利用する人からは極力
隠蔽するようにしたもんだけどなぁ。
糞システム導入して痛い目に遭って>902のような結論に辿り着くとか愚かすぎ
912 :
名前は開発中のものです。 :2006/03/02(木) 20:22:45 ID:FRBQKYqS
結局は”最終的に評価されるゲームを作った”奴が勝ちなんだよ。 100行以上に及ぶ関数やグローバル変数や状態変数の乱立。 内部でスパゲッティーコード組もうがハードコーディングしようが、 最終的に俗世間に評価されればそれが勝ちなんだよ。 一般大衆はコーディング云々なんて気にしない。 面白ければそれでいい。 オナニーはエロ動画だけで十分って事だよ。 まぁ、いいもん作ろうぜ。
ゲ製クオリティ
オマエのそのクソ設計やクソコード、何十年使う気でいるんだよw っていつも思う。
面白さなんて飾りです。一般大衆にはそれが分からないのです。 勝ち負けなんて気にせず、 自己満足のための美しい設計に心血を注ぐ者がいても良いじゃない。
C丼でデリゲート使うことにしますぅ
917 :
名前は開発中のものです。 :2006/03/02(木) 21:18:05 ID:FRBQKYqS
設計でオナニーしたい奴はすればいいじゃん、止める義理はないからな。 でもオレは要求された仕事を期日以内にキチンとこなして女と遊びに行くほうがずっといいからな。 お外で遊びな? まじ楽しいぞ?
>>917 俺にはWindowsXPたんがいるからいいもんね・・・
もうすぐもう一人増えるんだもんね・・・
>>914 むしろ糞コードでも良いからそれが何十年も使える世界になって欲しい
>>909 え、いやほんとに教えてください・・・・サンプルでは英字しか無理でしたけど・・・
Irrlichtはやろうとしたけど・・・・でしたので
基本的な2Dアクションゲームを話題になったタスクで組みたいんだけど 自キャラ、敵キャラはいいとして重力計算とか当たり判定はどこで行うの?
923 :
名前は開発中のものです。 :2006/03/03(金) 17:48:31 ID:mnIw+zDn
次スレ
924 :
名前は開発中のものです。 :2006/03/03(金) 18:07:00 ID:b9kujG94
>>922 自キャラさんとか敵キャラさんとかが入ってるリストの中に
重力計算さんとか当たり判定さんとか本来実体のないものを
わざわざ実体のあるように見せかけていっしょにつっこむべきだと思う?
まぁ最初なんだからすきにしたらいい間違ってるのがわかったらその時なおせばいいよ
>いっしょにつっこむべきだと思う? 思う。
関数をリストにつっこんでおけば放置しておいても1ループに一度は必ず実行される ってのが基本的なタスクシステムのキモの一つなわけで 実体の有無(画面に表示されるかどうかって意味だよな?)はあまり関係ないんだな。 ただ、当たり判定や重力計算を独自のタスクで組むと、それを適用したいキャラを リストからいちいち探さなくちゃいけないしあまり効率がいいとは言えない。 関数の内容によってリストを別けるとか解決策はいくらでもあるが そこまでして使うものか?とも思う。
>>925 欲張りだから最初から失敗が嫌
とか言っても一発で成功したこと一度もない・・・
コンパイルの度に”必ず”ひとつはエラー出す
タスクとしてリストにぶっ込みたいんだけど色々問題があって
>>927 「リストからいちいち探さなくちゃいけない」
この辺でずっと悩んでた
タスクリストの一番最初に入れるのはもちろん無理だし
一番最後に入れるとタスクリスト内のデータをまた最初から検索しなおさなくちゃならないから単純に処理2倍だし
各タスクの行動関数に組み込むと再利用性がうんこ
タスクリストに入れて問題があるんだったら入れなきゃいいだろ。 なんでタスクリストに入れたいの? 「タスク」とか「タスクリスト」の意味が曖昧なまま話しても無駄っぽいから もっと実のある話にしたければ次スレ立てて 「タスクで組む」の意味を具体的にしてから話すことだね。
タスクじゃなくてオブジェクトとして素直に考え方が楽そうだな… 重力計算クラスはどんな機能が必要で 外からはどんなインターフェースが必要なのか。
>>928 実行順優先度とか設けてないの?
入れるなら最初か最後でしょ。
優先度ごとにリストを設けておけば総なめしなくても済むし
一本のリストで全てをまかなおうと考えない方がいいよ。
>それを適用したいキャラをリストからいちいち探さなくちゃいけない 適応したい処理の対象のリストを、フレーム毎に作成すればいいんじゃね? 検索の約一兆倍スマートでクールだと思うよ??(当社調べ)
流れが読めないならROMってればいいと思うよ。
何度みても笑える。
笑いどころがどこかわからん。 プログラマのとこか?
2Dの当たり判定についでなんですが、 1pixelずつの移動であれば移動する場所の座標で当たり判定をして ヒットしていれば移動しない、ヒットしていなければ1pixel進むでいいですよね。 けど、通常の3倍で進むような場合は3pixel進んだ場所の座標で当たり判定をして ヒットしていれば移動しない、ヒットしていなければ3pixel進むではよろしくないです。 3pixelは進めなくても2pixelは進める可能性があるからですが、 こういう通常の3倍で進む場合は1pixel進む処理をx3してやるのが普通なんでしょうか? それともほかに良い方法がありますか?
>>937 真っ当に考えれば、n pixel進むためには、
n 回ループで 1 pixel ずつ判定するしか方法はないと思われる。
状況によっては、先に n pixel進めてみて
移動不可だったら (n-1) pixelを試すという逆順のほうが効率がいいかも試練が。
当たっていたら 何ピクセル埋まったかを計算してその分戻せば?
跳ね返る時はかなりいい加減でもごまかせるけど ぴったり止まるなら>939が丁寧な方法で>938が簡易だな。
>>938-940 どうもです。
>>939 まさにそれですね。
ジャンプして天井にぶつかったり
落下して地面に着地した時、
キャラクターの移動速度を上げたときに
挙動が変だったのがこれで直りそうです。thx。
>>936 いや全部。 仕事でプログラマとか実務側の方をやってると
全部がだいたいそのとおりなので笑える。
笑えないのは現在進行形の場合だな。
うむ
文字をゆっくり表示させようと思ってるんですが、SetTimer()で時間をとってくる方法しか思いつきません。他に方法はないのですか?
なぜ他の方法を探そうと思ったのか、現状の方法でどのような問題があるのかを説明する方が先だろう。
timeGetTime
本屋寄ったらエフェクト関連の本が二冊あった けど買えなかったorz
マップ読み込みがわかんね・・・ 縦,横,チップサイズ \n 番号,番号,番号,番号,番号 \n 番号,番号,番号…… とかなってるマップの読み込みをスマートにできないかな 暗号化とかもまた意味不明
スマート? とってもスマートなのだが。 暗号化? ぐぐれよ
>>948 それは私のよりスマートそう。
私のもっといい加減だもん。
俺のよりスマート。
いやfgetcとかforとfscanfを組み合わせてるんだけどどうしても分岐が出てくるしこれは見てて嫌だなって
バイナリにしちゃえば?
それだ で次スレ
>>953 早速やってみた
変換ツール作りの段階でコンパイラにコンパイルエラー連射されると困る
テキストファイルをバイナリに変換するのと バイナリをテキストに変換するのを作るのに2時間かかった マップ以前に今後について考える必要があるかも
そういうツールをちゃちゃっと作るならスクリプト言語が楽でいいぞ。
例えばperlで
>>948 のCSVをバイナリ化するならこう書ける。
open(IN, 'map.txt');
while (<IN>) {
chomp($_);
my @linedata = split(/,/, $_);
foreach my $data (@linedata) {
$out .= pack("s", int($data));
}
}
close(IN);
open(OUT, '>map.dat');
binmode OUT;
print OUT $out;
close(OUT);
>>957 短いなぁ
ちょっとそっち関連の勉強でもしてみる
そして、とうとう彼はスクリプト世界から帰ってきませんでした。
ttp://dream.my-sv.net/upload/src/up0144.zip タスク構築していろいろやってみたんだけど、デバッグ中にタスク削除辺りでエラーが出る
WinMain.cpp - エントリ。タスクやキャラクラスの宣言
CTask.cpp - タスクシステム
CChar.cpp - キャラクラス。タスククラスを継承。全キャラクタの継承元クラス。
CUser.cpp - 自キャラ管理。爆発クラスの呼び出し。 キャラクラス派生
CExplosion.cpp - 爆発クラス。一定時間経過で開放。
CRenderer.cpp - DirectX
ChipPoint.h - テクスチャ座標配列
クラスCUserがカーソルキーによる移動時に一定間隔でCExplosionをnewしてタスクリストに追加、
CExplosionが一定フレーム爆発し続ければメンバ関数Proc内で
CTask::TaskKill(TASK* t)にthisポインタ渡して開放待ち状態に移行
TaskKill内では渡されたタスクのタスク用デストラクタを実行してそのタスクのStatusメンバにステータス列挙体のSTATUS_KILLを詰め込む
その後にCTask::TaskExecution()を実行してTASK_KILLのタスクをCTask::TaskDelete(TASK* t)に渡して開放したいんだけど、
そのTaskExecution()内のswitch文でTASK::Statusを参照するとエラーが出る
長々長々とスマソ。ソースは「とりあえずやってみっか」的でかなり雑
>960 で、何だ? 「暇人の皆さん、このとりあえずやってみっか的ソースをデバッグしやがれ。」 って事か?
>>960 (1)(2)(3)の順に読んでね、お兄ちゃん。
for(TASK* i=Top->Next; i!=End; i=i->Next) ← (2) 次のi->Nextは開放後の不定値になり
{
(中略)
switch(i->Status) ← (3) そして、どかーん☆
{
case STATUS_KILL:
TaskDelete(i); ←(1) ここでiの実体を開放した場合、
break;
};
}
964 :
960 :2006/03/11(土) 00:49:40 ID:ojp9Bp1N
>>961-962 すまんかった。
>>963 おお、なるほど
オブジェクト側で何かやらかしてるのかと思ってたから
タスク実行ループは疑いもしなかった
実行できました。ありがとうございます
965 :
名前は開発中のものです。 :2006/03/11(土) 01:09:54 ID:xs4HFJgg
いいなあ、ロリロリの妹に手取り足取り教えてもらえて
ソースレビューはする方もされる方も勉強になるかと。
なんでもかんでもタスクタスクって、あなた達はVOWのファンなのですか?
ゲームのデータ(マップやキャラクタのデータなど)の構造変更時に旧ファイルとの互換性を楽にもたせられる方法はありませんか? 例えば class map_data { public: BYTE chip_x,chip_y;//チップのインデックス }; というクラスがあり、これをそのままサイズ分ファイルに書き込みます。 このクラスはマップファイル用に使われるので実際はマップの編集作業に大変時間を取られます。 しかし、このクラスに何かの変数を追加する必要が生じまして class map_data { public: BYTE chip_x,chip_y;//チップのインデックス char flag[4];// }; こうなったとすると、クラスのサイズの違いから読み込み位置にズレが生じてしまい、 前回頑張って作ったマップのデータが意味の無いものになってしまいます。 これを回避するために上手い方法は無いでしょうか。 今はファイル読み込み関数を旧式、書き込み関数だけを新しいものにして、 一旦新形式でセーブしてから読み込み関数を新形式にする方法と、 あらかじめchar reserved[1000]という余分なスペースを確保し、 追加分の変数のサイズだけ引いていくという方法でやっていますが面倒です。
バージョンでも持てばいいじゃん
答えてやった奴にはお礼にエロ画像でも見せてやれよ
オフセットじゃなくて名前でそれぞれのパラメタを取れるようにしたらどーなのよ? プロパティシート?プロパティテーブル?プロパティセット?そんな感じのやつ。 それができないようなデータならreservedを設けるしかないな!
チャンク使って、データ単位で分類わけするべし。 いま時だとXMLとかでもいいかもしれず。