ゲームにおけるデータ構造・クラス設計・パターン
■ このスレッドは過去ログ倉庫に格納されています
0001名前は開発中のものです。
2006/08/10(木) 20:27:06ID:BnvyxuCBどのようにクラス設計をすればよいか、
継承・委譲関係はどのようにすればよいか、
使えそうなパターンは何かなど語るのもよし。
自作ゲームの内容とクラス図を書いて
改善案を聞くもよし。
設計に関して困ったことを質問するもよし。
関数の具体的な実装内容やゲーム内容に関しては他スレに譲る。
大いに語れ。
0702名前は開発中のものです。
2008/02/02(土) 14:42:47ID:mI6LOL9z設計を見直したくなったので誘導に従い引越して来ました。
C++で練習用にドラクエモドキ作っているんですが
class PlayChara{
int hp;
int mp;
…
public:
void receiveAttack(ATTACK_TYPE atk_type, ATTACK_POINT atk_point);
}
プレイキャラクラス自身に敵からのダメージを与える為のメソッドで
(攻撃のタイプと攻撃力の引数を受け取る)receiveAttackってのを検討したんですけど
設計そのものを見直したほうがいいでしょうか?
・攻撃者が.attackメソッドを持って引数に被攻撃者のパラメータを渡す
・攻撃用のクラスそのものを作る
0703名前は開発中のものです。
2008/02/02(土) 14:49:42ID:nEhdyqU20704名前は開発中のものです。
2008/02/02(土) 14:53:31ID:72phXJxx0705名前は開発中のものです。
2008/02/02(土) 15:03:58ID:eaarCO+Aそれらを操作するコードを制限できる点で、メンテナンス性向上を期待できる。
でも、ちゃんと管理できればpublicでも全く問題ないので、
このやり方で良いとも言えるし、このやり方でなくても良いと言えるけどねw
0706名前は開発中のものです。
2008/02/02(土) 16:16:27ID:sj8x5kQaドラクエならダメージの計算はキャラによらず一律だし、ダメージが
発生するタイミングや順序も明確だから、他の人が言ってる様に
計算式を実装するのはプレイヤークラスではなく、戦闘の進行
管理やってるクラス。
キャラクターごとに持っているパラメタが全然違って計算式が
異なるとか、キャラクタの内部状態によってダメージあり/なしが
変わる、またリアルタム進行でダメージ判定などタイミングが
シビアな場合には、プレイヤークラス内部で計算した方が
やりやすい。対戦格闘とか一部のアクション RPG とか。
ただ、その場合は receiveAttack() というように攻撃専用の
メッセージにせず、回復やらダメージやら全部含めた汎用の
メッセージクラスを一つ用意して、
void sendMessage(Msg const* pMsg);
で送りつけてやったほうが良い。あと、メッセージは即処理せず
キューにためておいて、あとでプレイヤークラスのほうで都合が
良いようにソートしたりしてから処理するとか、インスタンスの
ポインタ直接使わずにハンドル管理にするとかした方が良い。
0707名前は開発中のものです。
2008/02/02(土) 17:20:36ID:09h7GmI7を
damage(DAMAGE_TYPE dmg_type, DAMAGE_POINT dmg_point)
に改名すれば謎は全て解ける
0708名前は開発中のものです。
2008/02/02(土) 19:05:26ID:NHG8vmrtでキャラクラスはストラテジーパターンで行動処理を分けると・・・。
キャラクラスはキャラごとにインスタンス化して行動処理はストラテジーに分離。
ぱっと思いついたがこんなもんか。
0709名前は開発中のものです。
2008/02/02(土) 19:08:36ID:NHG8vmrt↑のコードをスクリプト言語内蔵してハードコーディングしないようにする。
0710名前は開発中のものです。
2008/02/02(土) 19:11:17ID:sj8x5kQaドラクエだと、コアロジックのスクリプト化は要らん気がするなぁ。
俺ならスクリプト指定にするのは、エフェクトとか SE 再生とかの種類・
タイミング制御と、あとはパラメタの定数設定ぐらいか。
0711名前は開発中のものです。
2008/02/02(土) 19:48:03ID:KbmRx+Ru今回の実装方法の話は好きにしろとしかいえんね
0712702
2008/02/02(土) 21:06:24ID:mI6LOL9z有難うございます。
なるべく他のアクションゲームとかにも流用できる汎用性の高い作りにしようと
思っていたのでリアルタイムに仕様変更があっても対応できるように後者のような感じ
でやってみようと思います。
取り合えずクラス候補としてこんな感じでいこうかと。
・プレイキャラ(敵キャラ含む)
・成長管理
・戦闘管理
・シナリオ進行管理
・コマンドメニュー
・アイテム(装備品含む)
・ステージ(街、ダンジョン、フィールド含む)
・ショップ
・酒場(キャラ登録、出し入れ管理)
0713名前は開発中のものです。
2008/02/02(土) 21:25:25ID:sj8x5kQaふつーのRPGにするなら、まずシステム全体を
・戦闘
・フィールド
・デモ(イベント)
に分割して、それぞれの間のツナギを緩やかにしておく(直接インスタンス
参照せずに、パラメタ渡して立ち上げるようにする)、さらにサブシステムを
切り替えるときには画面ブラックアウトさせるようにしておくのが敷居低いよ。
装備品や戦闘中に利用できるアイテムに関しては戦闘システムに密に
絡むので、装備品のパラメタとして何をどう持たせるかなどは戦闘システム
中心で考える。
プレイヤーに関しても、戦闘で利用するプレイヤークラスとフィールドで利用
するプレイヤークラスは別にしとく。戦闘側プレイヤークラスではアイテムの
戦闘中効果や使用可/不可の管理なども要るけど、フィールドだと個数や
値段だけ管理しとけば良いから、必要な情報が全然違う。
0714名前は開発中のものです。
2008/02/02(土) 22:11:59ID:RVYU4pubAVGエンジン作ってるが設計は使ってる言語とプラットフォームによると思う。
たとえばCだとOOPが言語仕様にあるわけじゃないから再利用性のあるライブラリは作りにくいと思うし、
MIDPみたいなリソースが限られてる環境上だと制限多いし。
0715名前は開発中のものです。
2008/02/02(土) 23:15:59ID:ld1ta0/w> プレイヤーに関しても、戦闘で利用するプレイヤークラスとフィールドで利用
> するプレイヤークラスは別にしとく。
あ、それでいいんだ。
現にそうやってRPGのクラス設計してたけど、もしかしたらマズイやり方なんだろうかと
不安になってたとこ。これで前進できるよ〜。
0716名前は開発中のものです。
2008/02/02(土) 23:17:36ID:sj8x5kQa> たとえばCだとOOPが言語仕様にあるわけじゃないから再利用性のあるライブラリは作りにくいと思うし、
それはない。ただ設計が OOA/OOD じゃなくなるだけ。
むしろソース非公開でライブラリ配る場合は C++ より C の方がバイナリ
互換性を維持するの楽だし。C++ だとメンバ変数ひとつ加えただけで
バイナリ互換性崩れるから COM のようにインターフェースと実装を厳密に
分離するような細工が必要になってくる。
社内ライブラリとかでも公開 API は extern "C" してあって、中が C++
なんてのは未だに良くある。
0717名前は開発中のものです。
2008/02/02(土) 23:22:17ID:sj8x5kQa0718名前は開発中のものです。
2008/02/03(日) 02:15:42ID:nv4LC70S0719名前は開発中のものです。
2008/02/03(日) 15:45:30ID:nX/UP8ww0720名前は開発中のものです。
2008/02/05(火) 01:04:17ID:EmCkbq3D0721名前は開発中のものです。
2008/02/05(火) 15:29:46ID:jyHjb4Olフラグメントの問題が面倒だしな
PCのようにリソースが多い場合はJava等でOpenGLベースで作ったほうが楽かも
0722名前は開発中のものです。
2008/02/05(火) 17:47:40ID:gWVvLPR2fpsはかなり出るんだが。
0723名前は開発中のものです。
2008/02/05(火) 20:50:19ID:jyHjb4Ol具体的に
JOGL単体だと不具合はまずでない
0724名前は開発中のものです。
2008/02/05(火) 21:18:49ID:njRVzy5T> C++でオブジェクト指向を生かすにはゲームはちょっときつい
PS2 の頃から、ゲーム部分はほとんど C++ だよ。
0725名前は開発中のものです。
2008/02/06(水) 01:01:34ID:15llbTQ/フラグメントがどうとか言ってメモリのやりくり縛ってるような人は、
GC 付き言語は絶対導入しないってことなんだろうか?
0726名前は開発中のものです。
2008/02/06(水) 01:37:49ID:imNHr76cGF7600GTと特定のドライバで出る。ドライバのバグだといっただろJOGLの問題じゃない。
後はググレ
0727名前は開発中のものです。
2008/02/06(水) 02:46:02ID:G+IyjTNGコンシューマとかサーバーとかは普通に気にするだろ
だから、素の状態だと使えん
GCつきなら問題はないが、フットプリント大きくなるからコンシューマでは採用しにくい
>>726
そんな特定のドライバで動かないといったらそんなのは大量にあるわけだが
0728名前は開発中のものです。
2008/02/06(水) 06:22:47ID:8gln52JP> コンシューマとかサーバーとかは普通に気にするだろ
メモリに関しては断片化と使用量の問題がある。
断片化はモデル・テクスチャ・モーションといった数百KB単位の
リソースデータと C++ インスタンスのようなせいぜい数KB程度の
データを混在させると問題になる。最初からヒープ領域を分けて、
リソースに関しては
・事前に複数ファイルをアーカイブして1つにまとめておく
・ファイル読み込み領域を階層化して管理
・用途によっては固定長で
とすることで解決できる。
使用量は頑張れとしか…
>>725
GCつきの言語は使ってないなぁ。lua とか悪くないとは思うんだが。
メモリ使用量やCPU消費が読めないのと、そもそもスクリプタに
高度なロジック書かせない方針なので、そこまで高機能な言語は
要らなかった。
ストラテジー系のゲームで AI とかスクリプト化するとなると、Lisp
系言語を使うかもしれん。実装簡単だし。
0729名前は開発中のものです。
2008/02/06(水) 16:16:10ID:G+IyjTNGだから、素の状態では使えないと書いた
固定長とかしばってるとC++らしいオブジェクト指向のコードが書けなくなる
結局クラスが名前空間程度のベターCでおわってしまう
0730名前は開発中のものです。
2008/02/06(水) 19:03:53ID:P+v/9YuTバグだらけだが
0731名前は開発中のものです。
2008/02/06(水) 21:38:48ID:8gln52JP> 固定長とかしばってるとC++らしいオブジェクト指向のコードが書けなくなる
断片化が問題になるのはリソースデータだから、そっちだけ固定長とか
縛り入れる。
他は気にせず new しても、ヒープ多めにとっておけば大丈夫だよ。
0732名前は開発中のものです。
2008/02/07(木) 02:50:44ID:Q4eXpMLPnewとdelete繰り返しているとフラグメントがぐちゃぐちゃに
0733名前は開発中のものです。
2008/02/07(木) 04:12:05ID:jx59zphN0734名前は開発中のものです。
2008/02/07(木) 08:58:00ID:iWwJi06cゲームの場合はたいていインスタンスの寿命が入れ子状になってて、
寿命がやたらに長いインスタンスが不定期のタイミングで作成される
ことは少ない。
delete されたときに、積極的に前後のアドレスの空きスペースと融合
するたいぷのメモリアロケータ使ってれば、そんなに酷いことには
ならんよ。
これがサーバ系だと、また話が変わって来るんだが。
0735名前は開発中のものです。
2008/02/07(木) 09:25:32ID:vAX6bai3702じゃないけど、なんか目からうろこだわ。Thanks!!
0736名前は開発中のものです。
2008/02/07(木) 16:22:59ID:YGBnt0cR0737名前は開発中のものです。
2008/02/09(土) 02:03:34ID:Be1sC8H80738名前は開発中のものです。
2008/02/09(土) 15:46:31ID:Rmj5T+sL0739名前は開発中のものです。
2008/02/09(土) 17:21:52ID:Ktk+EzAJ0740名前は開発中のものです。
2008/02/09(土) 18:50:29ID:5eO+wULN0741名前は開発中のものです。
2008/02/19(火) 22:44:36ID:sVjxRGgGみんなどうしているんだろう…
CGやBGMのロード、キーチェックをどこで実施すべきか悩んでしまう
↓だいたいこんな感じで組んでいるけど変?
//----main.cpp----
int WINAPI WinMain( ... ){
GameFrame *game = new GameFrame();
game->doMainLoop();
delete game;
}
//---gameframe.cpp---
void GameFrame::doMainLoop();{
loadCG();//ここ?
loadBGM();//ここ?
while(ProcessMessage()==0 && ...){
switch(gameState){
case GAME_DEMO : drawGameDemo ();break;
case GAME_TITLE : drawGameTitle();break;
case GAME_MAIN : drawGameMain ();break;
...
}
...
}
void GameFrame::drawGameMain(){
checKey();//どこに入れよう?
drawBG();
drawEnemy();
drawPlayChara();
drawHoge();
}
0742名前は開発中のものです。
2008/02/19(火) 22:58:48ID:kk7YgASyvoid GameFrame::doMainLoop() {
// シングルトン系の処理実行
g_pad.exec(); // パッド入力処理
g_file_loader.exec(); // ファイル非同期読み込み処理
// その他の処理実行
std::for_each(m_task_list.begin(), m_task_list.end(), boost::bind(&Task::exec, ::_1));
std::for_each(m_task_list.begin(), m_task_list.end(), boost::bind(&Task::draw, ::_1));
m_task_list.remove_if(boost::bind(&Task::needGC, ::_1));
}
こんな感じだと思うが。ファイルの読み込みは Task 派生クラスの exec の中で
TestTask1::exec() {
switch (m_state) {
case INIT:
g_loader.load("file1.arc");
++m_state;
break;
case LOADING:
if (g_loader.isLoaded("file1.arc"))
++m_state;
break;
case MAIN:
...
}
って感じで。マジメに作るとファイルは事前にアーカイブ&圧縮しておいて、ロード時に
展開するとか、そもそも名前ではなく #define シンボルで扱えるようにして下らないバグを
出さないようにするとか、断片化防ぐためにメモリのセグメント分割するとか、いろいろ
あるけど。
0743名前は開発中のものです。
2008/02/19(火) 23:21:10ID:sVjxRGgG過疎っている思ったのに光速レス有難う。
なんかタスク管理とか高度でかっこいいですね。
デザパタとboostをもうちょい勉強してみます。
自分のはなんかCでやってたことをクラスに詰め込んだだけっぽい。
0744名前は開発中のものです。
2008/02/19(火) 23:24:49ID:kk7YgASy直接 m_task_list に突っ込むのは、いわゆるシーンオブジェクトぐらいに
しておいたほうが良い。個々のキャラクターとかエフェクトの類は、派生
クラス (TastTask1 とか) のメンバ変数で持たせる。
m_task_list は見て分かるように exec, draw 両方とも引数ないので、
これだと相互作用するようなインスタンスをうまく扱えないので。
0745名前は開発中のものです。
2008/02/20(水) 00:09:11ID:mhKVjbwnタスクにキューをためるような処理の仕方が一般的なんですね。
自分はそういうスタイルで組もうとしたことがないので色々と勉強しないと…
0746名前は開発中のものです。
2008/02/20(水) 00:09:55ID:mhKVjbwnを○
0747名前は開発中のものです。
2008/02/21(木) 01:33:19ID:y49BO0DLいきなり、スレタイ否定だが、
本気で一般性の高いのを目指すなら、
ここで聞くより、ソースが見られるゲームエンジン見た方が100倍いい。
力がつくよ。
俺もいろんなソースみて力つけてきた
0748名前は開発中のものです。
2008/02/21(木) 08:24:03ID:f3J60D7jどのエンジンが勉強に良かったか教えてくれ。
0749名前は開発中のものです。
2008/02/21(木) 14:29:42ID:J9L5jpws設計の講座はさっぱり見当たらないな。
実装部分の詳細はよくみつかるけど
0750名前は開発中のものです。
2008/02/21(木) 15:15:43ID:zstakQXs俺も聞きたい。どんなエンジンを見てきたの?
0751名前は開発中のものです。
2008/02/21(木) 16:09:59ID:J9L5jpws>>741のようなCの延長的な書き方でクラスで関数を纏めただけじゃん
みたいにしか組めない俺もききたい。
0752名前は開発中のものです。
2008/02/21(木) 20:26:16ID:Okox727g0753名前は開発中のものです。
2008/02/23(土) 23:46:58ID:DDpK+Okk.._ .......、._ _ /:/l!
:~""''.>゙' "~ ,、、''‐'、| _
゙、'、::::::ノ:::::::_,.-=. _〜:、 /_.}'':,
``、/:::::::::__....,._ `゙'Y' _.ェ-、....._ /_゙''i゙ノ、ノ
,.--l‐''"~..-_'.x-='"゙ー 、`'-、 ,:' ノ゙ノブ
" .!-'",/ `'-‐'') /\ `/ でノ-〈
.-''~ >'゙:: ‐'"゙./ ヽ.,' ~ /
//::::: ', / ,:'゙
0754名前は開発中のものです。
2008/02/25(月) 00:12:54ID:zZm6FQuH0755名前は開発中のものです。
2008/02/25(月) 03:05:17ID:0uW9SKNNそうじゃなければ自演乙
0756名前は開発中のものです。
2008/02/25(月) 12:02:29ID:zZm6FQuHゲームデザインの方じゃなくてABA Games最強だろ。
なんか俺の脳内で一緒になっていた
0757名前は開発中のものです。
2008/02/26(火) 15:08:24ID:xLe52R9Z0758名前は開発中のものです。
2008/02/26(火) 15:52:10ID:PSiNRJla0759名前は開発中のものです。
2008/02/26(火) 19:15:30ID:tRWcfCXW0760名前は開発中のものです。
2008/02/26(火) 20:11:44ID:i0RtjL2w0761名前は開発中のものです。
2008/02/26(火) 23:56:46ID:76zWC3a3一般的にはどうしているんでしょう?
↓みたいな感じでやっているんですけど
class MyFunc{
public:
//上限を超える、0を下回るときの処理
static float trimZeroMax( float val, float val_max ){
if ( val > val_max ) { val = val_max; }
if ( val < 0 ) { val = 0; }
return val;
}
};
//使うとき(ダメージ処理、回復処理の後)
hp = MyFunc::trimZeroMax( hp, hp_max );
0762名前は開発中のものです。
2008/02/26(火) 23:59:37ID:gnaVpqJX0763名前は開発中のものです。
2008/02/27(水) 00:07:04ID:5as5SRvUそれで数値がMAXまで行ってクリッピングされた時に
音を鳴らしたい場合どうする?
ポインタ渡しの引数増やすのも気持ち悪いし
GetLastError() みたいな別関数で状態を取得するのも気持ち悪い
0764名前は開発中のものです。
2008/02/27(水) 00:07:18ID:oXng1J4U俺なら数字っぽく扱えるクラスを書いて、
operator+()の中で範囲チェックするかなー。
0765764
2008/02/27(水) 00:09:34ID:oXng1J4U>>763みたいな要求にこたえるときは、
作ったクラスにコールバックの仕組みを追加する、とかの方法で実現できる。
クラスのクライアントに対しては修正いらないはずだし。
0766名前は開発中のものです。
2008/02/27(水) 00:30:52ID:TisTOwvT0767名前は開発中のものです。
2008/02/27(水) 00:32:46ID:FtdPv/Qb0768名前は開発中のものです。
2008/02/27(水) 00:35:39ID:TisTOwvT0769名前は開発中のものです。
2008/02/27(水) 00:46:29ID:vyFLiqpq言語がHSPなので参考になるかわからんが、
isover(val, min, max) //溢れ判定
irange(val, min, max) //上限下限
itorus(val, min, max) //ループ
ibound(val, min, max) //跳ね返り
の4つでだいたい足りている。
0770名前は開発中のものです。
2008/02/27(水) 00:47:14ID:FtdPv/Qbプロパティは外から見てフィールドのように振舞うべき
101をセットして1が返ってくるのは直感的じゃない
0771名前は開発中のものです。
2008/02/27(水) 00:47:21ID:ICP6u2PIアクセッサメソッドでいいじゃん。getter/setter。
0772名前は開発中のものです。
2008/02/27(水) 00:49:46ID:eBwcQsVt上限下限のコントロールかと思ってた……
まあ1人で開発するから問題にはなんないけど
0773名前は開発中のものです。
2008/02/27(水) 01:11:23ID:L4S10xjM0774名前は開発中のものです。
2008/02/27(水) 01:29:41ID:ICP6u2PI0775名前は開発中のものです。
2008/02/27(水) 01:31:42ID:vyFLiqpqどんどん怠けましょう。
0776761
2008/02/27(水) 02:08:49ID:g7Py3Pl9プレイキャラクターのクラスにダメージやら回復やらを処理させるメソッド内で
件の自作関数を呼び出しています。同じような処理ばかりあちこちにガリガリ書いていたもんで…
↓みたいにクラス化してしまう方が一般的ですかね
class LimitFloat{
//.なんか勝手に良い感じにしてくれる処理
…
};
class PlayChara{
LimitFloat hp;
LimitFloat mp;
…
};
0777名前は開発中のものです。
2008/02/27(水) 02:36:41ID:oXng1J4U直接的なプロパティへのアクセスを許可すると
情報隠匿の観点からマズイので、getter/setterを噛ませるってだけ。
プロパティ自体は
http://e-words.jp/w/E38397E383ADE38391E38386E382A3.html
こんな感じ。
文字列なら、文字列長や、文字エンコーディング。
mp3ならアーティスト名とか曲名。
0778名前は開発中のものです。
2008/02/27(水) 02:41:28ID:RhgcvCBoプロパティが言語仕様にある言語て何があったっけ?
esのプロパティはスロットだし
0779名前は開発中のものです。
2008/02/27(水) 06:06:32ID:VPWpT54e0780名前は開発中のものです。
2008/02/27(水) 07:04:41ID:9e3rMNMJbool add_ubound(float& x, float xmax, float add)
{
assert(x > 0);
assert(add > 0);
asert(xmax > 0);
assert(x <= xmax);
x += add;
if (x > xmax) {
x = xmax;
return true;
}
return false;
}
>>763
if (add_ubound(hp, MAX_HP, 10)) {
playSound();
}
ベタだけど、こんな感じで処理してる。あと >>769 みたく上限加減とか
ループとか扱う関数をいくつか用意。
0781名前は開発中のものです。
2008/02/27(水) 12:56:18ID:ITfjdhQA代入演算の左に来ればsetterが、それ以外ならgetterが呼ばれるから結果的にグローバル変数のように使用できる。
個人的にはプロパティの用途は以下のようだと思ってるのでプロパティで処理するのはありだとおも。
>>772、インターフェイスのメンバにして多態性、getterのみ。
それにしてもRPGっぽいステータス管理って結構複雑だな。
今ぱっと考えただけじゃクラスが作れん。
0782名前は開発中のものです。
2008/02/27(水) 19:16:26ID:ww8Aojqq単にセッタ内で丸めるという処理が目的だろこの場合。
アサートは条件に違反があった場合に吠えることが目的だろ?
違反があるかないか以外に影響しちゃだめだろアサートは。
0783761
2008/02/27(水) 19:30:12ID:g7Py3Pl9static U_BOUND_RESULT add_ubound ( float& val, float val_max, float add ) {
if ( val < val_max ) {
val += add;
if ( val >= val_max ) { val = val_max; return MOMENT_FULL; }
val -= add;
}
if ( val >= val_max ) {
val += add;
if( val >= val_max ) { val = val_max; return ALREADY_FULL; }
val -= add;
}
if ( val <= 0 ){
val += add;
if( val <= 0 ) { val = 0; return ALREADY_DEAD; }
val -= add;
}
if ( val > 0 ){
val += add;
if(val <= 0) { val = 0; return MOMENT_DEAD; }
val -= add;
}
val += add ;
return NORMAL ;
}
} ;
>>763
if ( MOMENT_FULL == MyFunc::add_ubound (hp, MAX_HP, 10) ) {
playSound ( ) ;
}
満タンになった瞬間だけ音が鳴るようにしてみたんですがえらく冗長に…
0784名前は開発中のものです。
2008/02/27(水) 23:19:17ID:9e3rMNMJC++ なら、せっかくだから関数テンプレートにしとこうか。
0785761
2008/02/28(木) 00:50:13ID:fsbSiynpCからC++に移行したばかりで手間取りそうですが…
>>783の条件分岐の記述はもうちょっとスマートに処理できそうな気がするんですが
良い方法が思いつかず…
0786名前は開発中のものです。
2008/02/28(木) 00:53:56ID:aMmxfMJe要するに本来はデバッグ検出用の関数なのね
0787名前は開発中のものです。
2008/02/28(木) 00:56:28ID:gTDbrfGi将来のための勉強にはなるかな
0788名前は開発中のものです。
2008/02/28(木) 02:04:32ID:UDo8JFjd0789名前は開発中のものです。
2008/02/28(木) 02:06:57ID:gTDbrfGiMOTHER2みたいにダメージ受けても減少するまで時間がかかるとか……
0790名前は開発中のものです。
2008/02/28(木) 02:44:14ID:fsbSiynpドラクエとかって最初から整数なのかな…
1ポイント前後のダメージって強制的に1ポイントダメージに補正されている感じだし
内部的に実数で0.1fずつ喰らったダメージが蓄積して1ポイントダメージになったりはしてなさそう
0791名前は開発中のものです。
2008/02/28(木) 07:23:54ID:71Ai97aI俺は assert() が入っていおらず、かつ UnitTest も書かれていない関数は
信用しない。
0792名前は開発中のものです。
2008/02/28(木) 07:41:00ID:cET+1oWo0793名前は開発中のものです。
2008/02/28(木) 08:43:52ID:TTiCigMJ固定小数でググれ
0794名前は開発中のものです。
2008/02/28(木) 09:17:18ID:payXug970795名前は開発中のものです。
2008/02/28(木) 14:13:32ID:gTDbrfGi今どき固定少数で処理するのってメリット少なくない?
処理速度の面でも遜色ないし使用するメモリも
そこまでケチる時代じゃないしコードも固定少数の
ほうがいくらか読みづらくなるでしょ
0796名前は開発中のものです。
2008/02/28(木) 16:35:34ID:cET+1oWofloatなら何も考えなくていいってのは違うので気をつけよう
値の比較や、演算誤差・丸め込みに注意を払う必要がある
int main() {
float a = 0.0f;
for (int i = 0; i < 100; ++i) {
a += 0.01f;
}
std::cout << a << std::endl;
return 0;
}
手元の環境だと結果は0.999999になる
あとゲームではよく使う % での剰余も出来ないので、代わりにfmod()を使う必要がある
例がFAQすぎてすまん
0797名前は開発中のものです。
2008/02/28(木) 18:26:26ID:TilB203vゲーム以前に計算機リテラシー欠乏者なのでこのスレでは無視していい存在では?
0798名前は開発中のものです。
2008/02/28(木) 18:46:41ID:C0ktJ0ww質問しようと思ったけど出直すわ
0799名前は開発中のものです。
2008/02/28(木) 19:23:14ID:TilB203v別にそんな鈍器を買わんでも、その辺の理工学書コーナーに売ってる
薄っぺらい数値計算法の初歩本(教科書)を一冊借りて読んどけばいいよ
情報工学系大学1年次の基礎教養レベルの話なんだからさ
0800名前は開発中のものです。
2008/02/28(木) 21:18:29ID:gTDbrfGi>>796の問題でバグ出すケースも少ないだろうな……
ステータスアップや次のレベルに必要な経験値テーブルなんかに
アクセスすることが多いLVは整数型にするだろうけど、
その場合は値を丸める処理がHPと同じじゃまずいし
0801名前は開発中のものです。
2008/02/28(木) 21:56:42ID:u9i/69wo0802名前は開発中のものです。
2008/02/29(金) 00:50:23ID:scJliyMvすまん
単にMOTHER2だとかドラクエだとか
DC/PS2以前のゲーム機で浮動小数なんて使わないよということが
言いたかっただけなんだw
何でもかんでもfloatにしたら配列の添え字にも使えないわ、単純な比較は出来ないわ
論理演算は出来ないわ
余計に面倒な気がするけど。
■ このスレッドは過去ログ倉庫に格納されています