2 :
名前は開発中のものです。:2014/01/17(金) 03:39:01.55 ID:QAgCxBAj
3 :
名前は開発中のものです。:2014/01/18(土) 12:03:19.53 ID:7z1+2mVy
>>1乙
static constは最適化で#defineとパフォーマンス変わらないって何かの本て見たな
C++で定数を#defineで定義してるようなヤツが居たら血祭りに上げていい。
名前空間が意味なくなってしまうからな。
5 :
名前は開発中のものです。:2014/01/18(土) 18:43:43.17 ID:SuZ9UyBR
const と define の違いが解らない男の人って・・・・
メモリ消費としてはconstはグローバル変数みたいなもんで消費するが
#define error -1 とかやると変なところで誤認されてしまうんだな
void hoge(Error* error)
7 :
名前は開発中のものです。:2014/01/18(土) 20:43:29.35 ID:7z1+2mVy
それ以前に名前の衝突はやめてくださいお願いします
8 :
名前は開発中のものです。:2014/01/19(日) 00:57:25.91 ID:wG94TV9x
C/C++のスレでこんなこと訊くのも何なのですが
CやC++開発ってかなり減ってきてますよね?
募集見てもほとんど無いです。
やはり今後はあんまり需要がなくなるんでしょうか?
誰にもわかりゃしねーよ。自分で予想を立てろ
なくなりゃしないけど
業務アプリをC++で作ってるの? なんで?
みたいなのは淘汰される
プログラミングスキルってのは、
アホなうちは言語依存だけど、
C型、OOP、関数型言語、と一通り極めて1段階上になると
「未知の言語でも2週間いただければキャッチアップできます」
というレベルまで行けるからね。
そのレベルまで行ったら、C/C++が使えないとかあり得ない。
ただし、C++は書けるけど嫌い、って人はちょくちょくいる。
#define public private
>ただし、C++は書けるけど嫌い、って人はちょくちょくいる。
興味本位で聞くんですが、なんで嫌いなんですかね?
メモリ関連のバグで悩まされて糞言語認定したんだろ
回避すればよいだけだろ……
速度重視の大概の言語でメモリー関係のバグは付きまとうのに
回避する脳力がないんだろいわせんあ
いや、そういうの関係なしに結構いるっしょ? C++に限らずさ。
Javaは文字出力関数がやたら長くて面倒で投げた
慣れてしまうとC++が便利すぎて他の言語使う気になれないわ
C++が書けるけど嫌いって人はちょくちょくいるだろうけど、
javaが書けるけど嫌いって人はたくさんいるだろうな
「回避不能な不具合」で地獄を見たんだろ、
それが「自分が書いたプログラムのせいで」とは限らんしのw
回避する能力がないんじゃない、回避する権限がないんだっつー。
>>20 本当にこれ
まぁソースは社内で共有してるからドキュメントでここを直すように指示出すと「お前みたいな新入が生意気言うんじゃねぇ」って怒られる
ボクもう3年目なんだけど、いつまで新入社員って言われるんだろうか・・・
ちなみに社内ではCとC++とJavaを使ってる「C#は使うから勉強しといてね」って言われたまま1年過ぎてるんだけどいつ使うの?
>>21 生意気言うんじゃねぇって言いたくなる気持ち分かるわ
c++は文字列とかSTLにひとくせあったりするからなー
std::string str;
str << "i=" << i << std::endl;
あれ、できないじゃーん!?
ググル → stringstream? めんどくせーな
// GCなしだと不便な例
std::vector<Hoge*> list;
Hoge* add(){
Hoge* hoge = new Hoge();
list += hoge;
return hoge;
}
Javaは不細工だけど使いやすいよ
>>22 マジか・・・
今度から何も言わないようにしよう
>>24 いや、もっとおっさんになってから
ガキだったなHAHAHAって笑えばいい
なにそれブラック企業?w上司もプログラマーなら感情論抜きで論破しろよ
>>23 MFCのCStringは扱いやすいよ
とりあえず自前で実装したが
小さいことが積み重なって不便という意味でな
何でもかんでも自力で作るかライブラリ頼みになるからな
そーゆーのが嫌いな人には向かないのかもな
ゲーム用途だと結局何でもスクラッチになっていくんですけどね…
33 :
名前は開発中のものです。:2014/01/21(火) 20:38:32.81 ID:ZBJojU/1
オレオレライブラリを経てオレオレゲームエンジンを作り
そして個人利用フリーのゲームエンジンに触れて無意味だったと知る
>個人利用フリーのゲームエンジン
ぜひ教えて欲しい。
POCOとか使ってるけど、あちこちのライブラリで
オレオレXML(DOM)、オレオレAutoPtr(スマートポインタ)、オレオレException
みたいなユーティリティクラスが満載なのはひどいよ
オレの場合は俺オレデータ構造を使ってるが?
ツリー状のメモリー情報を簡単に記録でき、しかもフラグメンテーションを
起こさないスグレモノ
だったんだが、ちょいと重すぎた
私はDXライブラリ使って今まで数本ゲームを作ってきたけど、「クラス? ポインタ? なにそれ」な組み方だった。
それが最近になってようやく「少しはわかったかな?」って感じになってきて、
俺俺ライブラリ……と呼べるほど立派なものじゃないけど、ゲームの土台を俺俺で作ってるところだから、
こういう行為を無意味とか言われるとちょっと辛いw
無意味とは思えないけどな。
オレの場合、マルチスレッドのしっかりした使い方はマスター出来たし
データ構造も一般人には何を意味してるか分からないぐらいに複雑なモノを
扱えるようになったし、スクリプト言語も好きなように拡張出来るようになった。
ただ、肝心のゲームはまだ納得のいくものが出来てないわけだが・・・
マルチスレッドってどうやってスレッドセーフ?になるの?
具体的に教えて
>>38 お勉強マシーンと揶揄されるパターンに嵌ってるな
俺も笑えない口だが、まあがんばれ
>>39 ロックしろ。使うのはクリティカルセクションだけで十分
41 :
名前は開発中のものです。:2014/01/22(水) 00:52:28.97 ID:1GoepMJH
>>34 UnityとかUREは個人で使う範囲なら無料ライセンスがある
まあロゴ出ちゃったりするけど
Unityは少しくらい儲けてもおkだったはず
志の低いクズはHSPでも使ってりゃ幸せになれるのに
>>40 んー、頑張る
あとロックする方法に関しては、自分はミューテックスとイベント使ってるな
ちなみにセマフォは使ってない
>>39 マルチスレッド 同期でぐぐってみ?
あと、DirectXでマルチスレッドと相性の悪い命令があるから、それにも注意した方がいい
ってゆーか、ちょっとぐぐってみたんだが分かりづらいページが多いなw
とりあえず、異なるスレッドが同じ変数にアクセスするとエラーになる場合がある事は理解してる?
「作れるけどめんどくさいから既製品でいいや」
と
「どうやって作るのかわかんないから既製品でいいや」
の間には絶対越えられない山脈が横たわる。
んで、一緒に既製品使ってたのにある日突然その山脈をヒョイっと越えてく人達がいるんだ。
自分の書いたコードを別のプラットフォームに移植したり、
別のプロジェクトで再利用したりする機会が出てくると、
フリーのライブラリやミドルウェアを使ってるのが足かせになる場合が出てくる。
…ので、おれは自分で書けるものは自分で書くことにしてる。
C++では悪しき車輪の再発明文化が染み付きやすいからな
JavaとかC#やらん人は一度体験したほうがいい
マルチスレッドって理解してる人が少ないだけで実はそれほど対した技術じゃないよなw
Windows95の頃からある古い技術だし
UNIX系に比べたらWindowsのマルチスレッドなんて遙かに新しい方だが、
いったいこの知ったかは何を言っているんだろう?
話の焦点が分からないけど、windowsではクリティカルセクション以外
覚えることなにもないんじゃないの?
多重起動防止でミューテックス使うかもしれんけど、
マルチスレッドじゃなくてマルチプロセス?の話だし、
セマフォやイベントもまるで出番ないなぁ
そんなわけで結城のマルチスレッド・デザインパターン本の知識とか
ゲーム内で使わないし、ファイルIO、BGM、ネットワークくらいかな、
スレッドが関連してるのは
レンダリングだろ今は。
まあマルチスレッドで面倒なのはデバッグだし
特殊なゲームを除いて、ロジックのマルチスレッド化はやめたほうがいいね
OpenMPとかも保守性を落とすわりには、バッファコピーとかくだらない
並列化しかできないし、積極的にスレッド化してもリスクの方が多い
>>51 Direct3D10以降に出てきたマルチスレッド対応も
結局内部でクリティカルセクションやってるだけだろうから、
だったらswingみたいにシングルスレッドモデルやるほうが無難だと思う
マルチスレッドはねぇ…
低クロック動作省エネこそ正義の非力な組込システムとかなら
仕方なく中〜細粒度並列の形で書いたりもするけれど
ほら、パソコンってアメ車のマッスルカーじゃないですか
CPUリソース、余るんですよね。湯水の如く
なので
>>50の言うように粗い粒度でなら取り入れるけど
ゲームの中核部、シミュレーション部については古式ゆかしい
シングルスレッド前提の簡潔なスタイルでラクチンです
前スレでゲームのメインフレーム部にマルチスレッドを使ってた奴がいたが、今日は来てないのか
あるいは他スレだったかな?
キャラクターの更新
背景・マップの更新
カメラの更新
これで3つスレッド使える
メインループと描画のスレッドってわけても意味なくね?
同じデータ参照しちゃいけないなら
一番負荷のかかるキャラクター周り計算が終わってから描画開始しないといけないじゃん
描画は軽いけどロジック側がめっちゃ重い場合、
描画側の垂直同期で待つのを避けるためにデータの複製を更新したあとに
スレッド間でデータをコピーorスワップする方法はある
データ用のメモリを2倍も使ったり、対価となるコストも大きいがな
これは広大なマップをもつシムシティのような特殊なゲーム用だね
ん?広大なマップを持つゲームなら逆にメモリを2倍も使ったら大変なことになるんじゃないのか
60 :
名前は開発中のものです。:2014/01/23(木) 02:21:59.68 ID:s/ECi/gl
cpuを倍にするよりメモリを倍にする方が安くて現実的
61 :
名前は開発中のものです。:2014/01/23(木) 02:43:04.45 ID:s/ECi/gl
あとそこからもうひと工夫すると実際には+1%くらいで済むかもな
マルチスレッドで処理速度を上げるにはダブルバッファリングしてメモリーを隔離して使う事が基本なの?
ややこしいな
マルチスレッドはCPUの待ち時間を減らして稼動効率を上げる事によって結果的に処理速度を上げるものだからな〜
できるだけセマフォ使う回数が減るようにしないと本末転倒だ。セマフォって本来は要らないモノだし。
マルチコアであればマルチスレッドの恩恵は得られるんじゃないの?
たとえば3Dモデルのフレームの行列計算を、
マルチスレッドで分散させて計算させるだけでも、
マルチコアの恩恵でかなり効果が出る。
モデルデータことにやれば、データのバッティングしないので管理も容易。
細分化して、親フレームからばらけた子フレームの計算を、
複数のコアに投げてもいいんだろうけど、さすがに面倒くさい。
CPUキャッシュをだぶるばっふぁりんぐする技術マダー?
>>66 Intel:「せっかく俺様が気を利かせて面倒を肩代わりしてやってんのに…
最適化をご所望なら弊社謹製の開発ツール群をお買い求め下さい」
こうやってどんどん必要スペックが上げられていくんだな……。
データ並列性さえあればOpenMPで簡単マルチスレッド使えるんだけどな
これ以外ではめんどくてマルチスレッドしないわ
OpenMPなんて効果が出ないものを、未だに使っている人間がいることに驚いた。
検討項目を増やさずに問題解決するに越したことはないし、
作業を増やさずに問題解決するに越したことはないし、
コンピュータを使わずに問題解決するに越したことはないし、
プログラムを組まずに問題解決するに越したことはないし、
並列処理を使わずに問題解決するに越したことはない。
上司に嫌がらせしたいんだったら、↑の逆に向かう理論武装に日々怠らなければ良いwww
OpenMPが普及しないのはそれなりに理由があるからなんだけど
最新技術みたいな中二ワードで本を売る業者に騙されていりこむ信者もいる
彼らは自分が他人より技術があると信仰している
他の連中は技術がないからOpenMP使えないんだ、ヤレヤレと信仰している
実際に計測して確かめろとしか言えん
環境によっても変わるしな
うちにあるメインマシンはシングルコアだ
>>72 計測する技術がないから使えないだけじゃね?
OpenMPで小さなバッファのコピーが3倍早くなっても仕方ないわけでw
肝心な箇所のスレッド化は自前でやるんだから変なものは導入しないほうがマシ
Javaとか.Netランタイムは、何もしなくても勝手に
OpenMPでやるような単純なスレッド化ポイントを探して
やってくれるらしいから、そっちに期待したほうがまだ実りがあると思うよ
>>62 処理速度が目的ならあらゆる手段でロックを避けるのが基本
毎回毎回過去ログ見ない、何も考えない人の質問を謎の義務感があるのか答えさせられてるからな
俺も平穏な頃はお世話になったが代わりにそこの住人の心が荒れてしまった
MTフレームワークのように使えてる奴おるかー?
>>77 技能がないではなく知能がないやつが沸くのは初心者系の宿命さ
まあ確かに全ての質問の相手をしてたら荒むかもなー
初心者向けじゃ無くせばいいのにw
なんでもかんでも馬鹿にするのは良くないよ
ここの住民はその傾向強いけど
世の中に悪いものが溢れすぎているんだよ
バッドノウハウを叩き込む本も海外含めて出版されすぎ
パラノイアになるのもしかたあるまい
84 :
名前は開発中のものです。:2014/01/24(金) 01:19:36.77 ID:2quQhFog
横文字並べんな
俺にわかるように日本語で喋る
85 :
名前は開発中のものです。:2014/01/24(金) 02:38:13.12 ID:75+tl8UC
カタカナ語をやたらとチョイスするメンズはコミュニケーションがノーグッドなのがデフォルトだし
イージーなワードでトーク出来ない事がフーリッシュだとアンダスタンドしてないよね
カタカナ語はノットユーズだグッドルッキングガイども。
初カキコ…ども…
俺みたいな中3でノンブロッキングI/Oしてる野郎、他に、いますかっていねーか、はは
今日のクラスの会話
Boostシリアライズかっこいい とか DXライブラリ とか
ま、それが普通ですわな
かたや俺はデバッグ用のコンソールでカーネル・ウップスを見て、呟くんすわ
it's a 深刻なエラー.狂ってる?それ、ランタイム・エグゼプションね。
好きなFW MTフレームワーク(カプコン社員でもないのに!)
尊敬する人間 ジョエル・スポルスキー(ユダヤ・ジョークはNO)
さすが中3だ
匿名掲示板で自分の事を勝手に語り始めた
自分が特別な存在であり、周囲より目立って当然であるという厨二病症状が伝わってくる
そんな貴方に対し、先輩として一つ、大人の現実を教えよう
ゲームを作りたければ、プログラミングだけじゃ駄目だ
プログラミングと絵を練習しなさい
音楽が得意なら音楽にも手を付けなさい
絵が描けないまま大人になれば、辿り付く先はゲーム会社のディレクターではなく、過労のIT豚小屋企業だ
さぁ、若者よ、時間が無いぞ
今日からpixivに通うんだ
他の板でやって。お願い
だが断る
>>87 そこのクラスは構造体とかのクラスにはしないんだ
94 :
名前は開発中のものです。:2014/01/25(土) 04:15:46.46 ID:8r1nXkC0
>>88 絵って・・・同人じゃないんだから専門の絵描きさんにお願いするだろ普通
勘弁してください
97 :
名前は開発中のものです。:2014/01/25(土) 22:16:45.80 ID:ykCYICO9
いんや。vectorにaddされるのはローカル変数SCache Cache自体ではなく、
vector内でnew SCache()されたものであり、aiueo()ローカル変数SCache Cacheが
新しく生成されたインスタンスに対してコピーコンストラクタでコピーされるはず
だからたぶんコピーコンストラクタをprivateで定義しておくとコンパイルが通らないはずだ
SCache::SCache(const ©){}
一応自分で確認してくれ
訂正
SCache::SCache(const SCache ©){}
100 :
名前は開発中のものです。:2014/01/26(日) 00:11:58.97 ID:Iw5/1QMx
うーん、、特にコピーコンストラクタは触ってないんだけどなぁ
ありがとうございました
なぜかvectorサイズが0になってるとか、
例外ダイアログでvectorほにゃらら〜がでるとか、それ系なん?
俺は前にこれでやらかしたことがあるぜ
vectorの内部バッファが大きくなるとポインタが無効になる
std:: vector<Hoge> list;
Hoge* add(Hoge &obj)
{
list += obj;
Hoge* last = &list[ list.size()-1 ];
return last;
}
103 :
名前は開発中のものです。:2014/01/26(日) 08:53:27.52 ID:Iw5/1QMx
vectorは内部バッファの領域拡張が発生した時にその領域を指してるポインタは無効になるよってこと
だから要素数がいくつだったらって話じゃないよ
vectorの領域拡張はフラグメンテーションが起きやすいよね
何でそのへんの仕組み理解してないのにわざわざ生ポ使うんだよ!
>>105 STLコンテナにアロケータ設定できるのも知らんのか?
そもそもメモリコンパクションがどうとかいう話は
GC系言語ですらとっくに切り捨てた昔話だと思うが
>>108 アローケーター操作するの面倒じゃね?
ある程度大きめにメモリーを取得しといて使い回す方が楽っぽいが
要は固定サイズの配列だろ?
好きなようにやればいいさ
いや可変サイズだが
あらかじめ取得しといた容量よりも大きなサイズが必要になったら倍のサイズに領域を拡張してる
一見listの方が速そうに思えるんだけど、
実際ベンチマークを取るとvectorの方が速いことが多いので侮れない。
いや速度よりもフラグメンテーションでアプリが跳ぶ事を気にしてるんだが
>>109 >>114 やっぱり瑣末かと。換言すれば、取るに足らない、微レ存、取越苦労、枝葉、の話かと。
いや違う考慮に値するというなら問題が再現可能な状況を示してみればいいのでは。
異常な頻度で確保/再割当/解放を繰り返すような無理な状況設定が必要になるけど。
件の話なら適切にreserve使えばいいかと。それで解決しない問題ってあるかな?
補足
ヒープ割当はフラグメンテーション回避で独自のメモリプールをーとかこの手の
取らぬ狸の皮算用になりがちな話題は何度目かというくらい既視感があったので
過去発言を適当に検索。関連ありそうなので貼り
> PCの場合、例えば平凡なDoug Lea Malloc(の亜種)を使うことについて
> 処理速度上の問題で難癖を付けるには、意図的に相当に意地悪な(過酷な)状況設定を
> 引っ張ってくる必要があると思うなぁ
> 例えば3D視点のゲームで、視覚効果に使う粒子状の短命オブジェクトが盛り盛り
> 無数に画面上に散りばめられてて、それらが何と一粒一粒馬鹿正直にヒープから
> メモリ割り当てされてて何の工夫もない線形リストに挿入されてて、毎フレーム
> 線形リストを馬鹿正直に巡回して一粒一粒更新したり削除即時解放したりとか
(この状況設定がなぜ意地悪かというと)
> 描画関数に渡すパーティクル用のデータ構造と明らかに違う状態だから
(不必要な)
> セットアップもあるしね。まぁ、いずれにせよ、何でそんな馬鹿な
> 想定を持ち出すんだと閉口するような話に持っていかないと処理速度上の
> 問題で横槍いれるのは難しいと思う
>>114 オレオレ用語じゃ意味が分からん。
おそらくその現象は君の脳内世界でしか発生しない。
>>117 1jTIwhcQには意味が通じてるぞ?w
>>115 いや、そこまで分かってるなら特に問題は無い……な
ただ、ゲームの場合、ムチャなメモリーの使い方する事が多いから、
reserveを忘れる事も珍しくないのでは?と思ったんだが
まあ、些末な問題と言えば些末な問題か
119 :
名前は開発中のものです。:2014/01/26(日) 20:01:52.93 ID:NBq5fzCq
無能がしったかかまして大恥をかきましたってさ
120 :
名前は開発中のものです。:2014/01/26(日) 20:31:03.96 ID:q4s5e5oc
つまりどういうこと?
初期化したときに必要な分確保しとけってことでいいの?
アホの戯言を相手にせず、普通にSTLを使いましょうってこと
std::vector<T>のTが構造体かクラスであるとき、内部バッファのリサイズに際して
コピーコンストラクタのコストが多数生じること、またコピーコンストラクタにおける
コピーの実装に関する適切さ(シャローコピー・ディープコピー)といった面倒が生じる
リスクを考慮すると、ポインタ型にすることを心がけた方が良いってのはあるかな
もちろん、プリミティブ型に関してはなんの心配も必要ない
あれ?ポインタが領域拡張で無効になるケースの解決にはならないような……
容量を十分確保しておけば、無効になりにくいだけで
>>120 必要な分が分かってる場合はそれでいい
分かってない場合はポインタを取得し直す必要がある。
ここでいうのもアレだが
ソースのバックアップとレポジトリは取れってのをテンプレに入れないか?
それ、個人的な問題じゃね?
128 :
36:2014/01/26(日) 23:44:04.69 ID:UYS8+7kl
俺にはあまり関係ない話だな
処理が多少重いとはいえ、致命的な重さじゃないしな
処理を軽くする場合にはSTLを使うが、それもかなり拡張してあるしな
129 :
36:2014/01/27(月) 00:09:52.23 ID:H+nDAORl
メモリ断片化=メモリのフラグメンテーション
固定サイズメモリを使っているオレに、死角は無い!
ハードがしょぼくてCPUやメモリがきつい家庭用ゲーム機を前提とした記事だろ
Effective C++ とか与太本に洗脳されて全メソッドにinline修飾するようなもんだ
132 :
名前は開発中のものです。:2014/01/27(月) 02:09:19.06 ID:4xmtC5j/
vectorの場合はポインタじゃなくて添字で管理したらいいんじゃない?
133 :
名前は開発中のものです。:2014/01/27(月) 02:31:16.30 ID:R0saBUqG
あまり良いやり方ではないな
配列の先頭や中間に挿入されたら
バグのもとになりやすい
>>124 「必要な分がわかっていない場合」を回避すればいいじゃない
メモリ断片化ならスクリプト言語を自前すればすぐに起きるぞw
>>135 間違えた
×>自前すれば
○>自作すれば
>>134 未来の自分にバグを押し付けるようなやり方は、あまり好きじゃないが……ま、人それぞれか
>>134は、レベル中で発生するオブジェクト最大数をあらかじめ限定してヒープ確保するって手順を想定してた。
※元々の
>>124の問題は、ポインタ再取得ってのもあったが
>>135 kwsk
>>137 話が見えんw
139 :
名前は開発中のものです。:2014/01/27(月) 14:38:03.04 ID:LXwSCF8m
ん?
vectorにインスタンスをaddした後
vectorが要素数増やそうとメモリ上の位置が変わってもnewしたメモリ位置は変わらないよね?
vectorが移動してるだけでvectorのメモリ上の参照してインスタンスを取ってくるわけじゃないから
newした時点でインスタンスのメモリ上の位置は変わらないんじゃないの?
vectorが内部で何してるのか見当つかないのか?
vectorは配列を内部でもってるだけ
T* m_buffer = new T[buffer_size];
add(T obj)されると m_buffer[index] = obj; のようにコピーする
そしてバッファサイズが足りなくなると再確保してコピーするわけだ
int new_size = old_size * 2;
T* newBuffer = new T[new_size];
for(i < old_size)
{
newBuffer[i] = m_buffer[i]; // 構造体とかだと、ここのコピーコスト(大)
}
delete[] m_buffer; // <= ここで以前確保したポインタは無効
m_buffer = newBuffer;
自分は使ったことないんだけど、boostのIntrusiveコンテナってゲーム制作的にはどうなんだろ
オレオレSTLの学習コストが嫌でなければ使ってみてもいんじゃない?
大した利点もなさそうだが、プリミティブはSTL::vector、
クラス・構造体はboost::ptr_vectorとか使い分けるのも悪くないと思う
メモリ断片化が〜とかいう話だったらもういいかげんにしろ
なんか自信なくなってきたわ
値型(スタック型)を格納してるvectorから、
ある要素の参照(生ポインタ)を取り出しておいた場合、
vectorのリサイズが起きた後はその参照はアテにならなくなる。
っていう話だよな。
vectorに値型そのまま入れるなんて、自分で線形台数用のクラス(それこそ名前がVectorとかになりそうだが)
作ろうと思った時くらいじゃない?
日本語でOK?
もしプリミティブ型の意味が分からないとしたら、
int, double, float, long, char, short, wcharのことだからな
あらゆるポインタ型も実際はただのintだから同じノウハウで扱える
ごめん俺は噛み付いたわけでもなくって、プリミティブ型の話でもなくって、
ヒープとスタックの話・・・というのも語弊があるか、
なんつーか、メモリ上への確保の仕方とかメモリレイアウト考えたらこうなるよねって話だったのよ、ごめん
うふふ
データの使い方によって正しくコンテナ選べばstlだけでも十分
要素がでかくて頻繁に入れ替えが発生してインデックスアクセスがしたいならshared_ptrで包んでvectorにでも入れときゃいい
>>144 64bit環境だとintとポインタのサイズが同じとは限らないから泣くぞ
>>127の日本語のblogでは「PC環境」って訳されてるけど
原文は「non desktop」なんだよな。
前から思ってたんだが、
限定されたハイエンドPC環境で「しょぼい」コンテンツを走らせられるからドヤ顔ってどうよ?
ゲ製道を究めようとしているワコウドを、間違った方向に導いてるって自覚あるか?
無策無能をアピールして幸せか?
誤:「PC環境」
正:「非PC環境」
くsっそおおおおおおおおお
150 :
名前は開発中のものです。:2014/01/28(火) 02:11:44.70 ID:IvP/YXMv
意味分からん
くだらねーメモリの話なんかあとにしな
>>147 それで64ビット対応出来なかったorz
>>151 俺のメモリがサザエさんみてーだとっ!?
154 :
名前は開発中のものです。:2014/01/28(火) 21:43:15.57 ID:29GW3hhm
思出話に花を咲かせよう
>>148 おっちゃん、BeagleBone Blackとかで遊ぼうよ。なかなか楽しいよ?
そうだな・・・
Linuxいじるのも大概飽きたが、
画期的な商品開発にでも
いっちょう取り組んでみるか?
しかし発火とかしないよな?www
無償のオープンソース・ライブラリも溢れ返っていることだし、
何か良い組合せアイデアでもないもん加納おっぱいおっぱい
ゲ製だと教育、もしくは協力作業を通じた相性判定、もしくはお前ら童貞が最も好きなコンテンツ分野みたいなんになるんかねwww
日本語でOK?
ヒント:行末濁点、三連草
残念な人が棲み憑いてるんです
濁点→読点
そんなときにはゲーム爺退散の御札を貼ろう
88 :名前は開発中のものです。:2014/01/24(金) 17:30:23.22 ID:jYeepMxG
さすが中3だ
匿名掲示板で自分の事を勝手に語り始めた
自分が特別な存在であり、周囲より目立って当然であるという厨二病症状が伝わってくる
そんな貴方に対し、先輩として一つ、大人の現実を教えよう
ゲームを作りたければ、プログラミングだけじゃ駄目だ
プログラミングと絵を練習しなさい
音楽が得意なら音楽にも手を付けなさい
絵が描けないまま大人になれば、辿り付く先はゲーム会社のディレクターではなく、過労のIT豚小屋企業だ
さぁ、若者よ、時間が無いぞ
今日からpixivに通うんだ
何気に、これ正論だよな
他人に企画任せられる環境ならPGだけでいいが
同人なんてあるもので作るしかないだろ
最近は絵にも色々種類があるからなぁ
アスキーアート
ドット絵
ローポリ
リアルポリゴン
アニメシェーダ
イラスト
まあAAはほぼ完全に廃れたが
2D素材はある程度フリーでまかなえるが、
3D素材は自分で作らないと厳しい。
絵にしろ音楽にしろプログラムにしろ
たいして才能の無い凡人が練習したくらいで通用するものなの?
どうせ作ったこともないやつが適当に知ったぶってるだけだろ。相手にすんな
どんな職場で働いてるんだよ
スキルに応じて仕事は分担されてるだろ
何でプログラマが絵を書かなきゃならんのだ
インディーズでは一人とかの少人数で作ってる事も珍しくないが?
自分の作りたいゲームを作りたいとか、分け前を増やしたいとか、動機は色々だが
評論家専門君が憶測でそんな話をしてなんになる?
一人で作ってますよ?
専門に在籍中だが確かに1人で作ってるな
チーム制作も1人で作ってるチームが大半だな
絵とか音楽とかのリソースはネットで拾うけどね
でもそれって結局のところは1人で作ってないよね
リソースまで全部っていう意味で1人で作ってる上で有名なのを作ってるんだとしたらただの天才だからどっかの企業に引き抜かれてろ
なぜ企業に入らないといけないの?
好きに作らせてくれて、好きに売らせてくれるような、夢のような企業があるの?
むしろ、売れ行き重視で好きに作らせてくれない、
倫理観とかが大事で好きに売らせてくれない、
といった企業がほとんどじゃね?
俺はフリー素材+一部絵師に描いてもらってる
趣味なんだから人それぞれのスタイルでいいだろう
>>173 うん、わかった
自分の生活費さえなんとかできるなら1人で自由に作ってな
176 :
名前は開発中のものです。:2014/02/03(月) 22:55:48.33 ID:HKt11pxu
はやく仕事辞めてゲーム作りに没頭したい
それは言わないお約束だろ
もっと時間のかからない遊びに流れるのも手だけど
しかし一番金になりそうな趣味がゲーム作りなんだよな
売れてからじゃないと仕事を辞められないのが難点だが
お前は金のことばっかりだな
>>180 金持ちに成りたいと考える事は悪い事だと思う?
スレッドの主旨を考えてくれ。どっかのスレみたいに株の話をされても困る
>>166 昔のゲームはアスキーアートを絵として使ってたわけだが?
しかも音楽はbeep音だw
とはいえbeep音でwevファイルを再生させてた事もあるからあなどれん
それくらい無いものの中でなんとかしてきたということだな
やれメンツが無能だとかいってたらきりが無いわけだ
>メンツが無能だとか
そういやそれも一人で作るようになる理由の一つだったな
まあ、人数が増えると衝突も増えるからな
むしろあの頃は、DQ1が出る前までは独りで作るのが当たり前だったような……
"あの頃"から制作してるの?
ひゃあ!ゲーム爺は生涯現役だぜ
作成はしてない!
が、パソコン持ってないのにパソコン本を買ったりするぐらいに憧れてたな
というか今丁度ドラゴンクエストへの道って漫画を読み返していた所だ
伝説級の漫画だよなあれ
うん、長編ゲームを作る人には是非とも読んで欲しい
読めば読むほど
中村光一氏がDQ抜けたのが悔やまれる。
お色気コンテンツに憤慨していたエピソードは笑える。
ドラゴンナイトやカオスエンジェル以前のエロゲだよな?興味はあるな
軽井沢なんとかのことだろうかw
複雑な操作や手抜きグラフィックに怒ったりしてた話やね
197 :
名前は開発中のものです。:2014/02/09(日) 03:20:30.53 ID:yNPMLa+Y
中村光一って不思議のダンジョンシリーズ一発屋で終わったな
高校時代から名作を生み出してる中村光一が一発屋……?
まぁウィザードリィみたいに不思議のダンジョンを伝統化しようとして
燃え尽きた印象があるな
一発屋というより、沢山あった弾を同じ場所に撃ち込んじゃった感じ
ドアドアいまいちだったけど
あの時代にスクランブルを完全移植した情熱の炎は、そう簡単には消えないさ!
俺は信じてるぜ!
>>201 先に子節点を調べなくてもできるけど
先に調べておかないと置けないにも拘わらず置くかどうかを計算するから無駄な計算が増えるし、バグで置いた場合に何処でバグが発生してるのか調べるのが大変になる
>>202 ありがとうございます。
先に子節点を調べることにします。
調べる上で、次の子節点を調べるときにその前に調べた子節点以外から探す方法が
よくわからないのですが、どのような実装を行えばいいでしょうか
204 :
名前は開発中のものです。:2014/02/10(月) 08:15:56.04 ID:EeAxagpY
木構造の探索はスタック使うと楽
再帰処理で実装するといいよ
>>204 スタックとはどのようなものかはわかりますが、実装法などは全くわかりません。
二分木なら
typedef struct node_t{
typedef struct node_t *left;
typedef struct node_t *right;
int data;
}NODE;
のようにすればいいと思うのですが、探索となると多分木になると思うので
同じようには実装できませんよね?
typedef struct node_t{
struct node_t *child;
struct node_t *next;
int data;
}NODE;
>>206 つまり二分木と同じ実装法で見方を変えるということですか?
多分木を表現できるデータ構造の一例ってだけだよ
要件は、多分木であることと、ルートから葉に向かって再帰的に処理できること、でしょ?
その要件に足るようなデータ構造で自分の使いやすいものを選択すればいい
三角関数を使ったカメラの回転が上手くいきません・・・
横回転は綺麗に回るんですが、縦回転がY軸しか動かず変な動きになります
分かりやすく解説してるとこは無いですか?
>>209 クォータニオンで球面線形補間すると
理論はよく分からないけど何故かうまくいくよ
ビューの回転は注視点を移動させた後に組み直せばいい。
>>210-211 ありがとう、ちょっと見てみたんですが、
私のコードは三角関数メインなので行列の理解が追いつきませんでした
根本のコードの変更も考えてみます
213 :
名前は開発中のものです。:2014/02/21(金) 22:16:42.52 ID:WPj1YKPY
船のゲーム創りたいんですが、
どういう考え方で波を作れば船が上下したり傾いたりするでしょうか?
波を表すメッシュの頂点にベクトルを紐付けて、それを隣の頂点に伝搬する・・・
みたいな事は想像してるんですが、あんまりうまくないというか、
あまり効率的ではないですよね?
いい方法ないですか?
>>205 2分探索木を自分で作らなくても、ライブラリにあるでしょ?
B-Tree(self-balancing search tree)平衡2分探索木
B+Tree、赤黒木など
キューやスタックも、ライブラリにあるでしょ?
優先度つきキュー(priority queue)はよく使うよ
詳細はWikipediaなどで、調べて
>>213 なんちゃって水面は基本的にはそういう作り方だよ。バネダンパの二次元格子。
お船は、近傍の格子の頂点や面に反発させてどんぶらこさせればいいやという。
トライアル&エラーでパラメータ適当にいじって見た目の調整。おしまい
あ、リアル志向のゲームは何やってるのか知らないよ。学生時代に数値流体
やってたけど、あっちに凝り出すと際限がないからみんなどっかで折り合い
付けて端折ってそれっぽく見せてるだけだと思うよ
DirectComputeのサンプルをみると、パーリンノイズから低周波成分を取り除いて地面全体に繰り返し、ハイマップとして地面に適用してるみたい
>>216 DX7以前の頃だとテクスチャを2枚用意してマルチテクスチャにして
UV値の操作で各々のテクスチャを交差するように移動させると水面ぽく
見せられるよー的なやり方が多かったけど、あれをハイトマップにも
使う感じかな?
イケメンがいい
c++で別のクラスの数値が欲しいときはメソッドに相手クラスのポインタ変数を持ってコンストラクタでポインタを渡せばいいのですか?
コンストラクタ?
コンス卜ラクタはコンス卜ラクタなんじゃ…?
ああ理解した、メソッド→メンバか
メンバ関数にポインタ変数を渡して…何でここでコンストラクタ??って思った
>>220 メンバにポインタ持たせてもいいし、相手クラスを継承してしまうとか、
その数値が必要になる関数の引数に、ポインタや参照で渡したり、
数値そのものを引数で渡すだけでも、好きなのでいいと思うよ
で、どこにゲーム関係あるの?
暗号化した外部ファイルとかセーブファイルの拡張子ってどうしてる?
foobarとかhogeみたいに意味のない文字なのがベストなんだけど
既存で使われているdatとかsavだと既になんらかの関連付けが
されてしまってる場合がありえるよね
ユーザが開くことを前提としないなら気にしない。
そうか、むしろ無しでもいいか
というか、ユーザーでもすぐ「あ、これがセーブファイルだな」と判るようにしておいたほうがいいだろ。
データのバックアップを取りたいことあるだろうし。
何でも.dbにしてる
bin
232 :
名前は開発中のものです。:2014/03/02(日) 20:11:55.85 ID:uIAHAPdg
ダブルバッファで検索するんだ
235 :
名前は開発中のものです。:2014/03/02(日) 20:51:20.45 ID:uIAHAPdg
>>233 画面のチラツキを抑えるほうが出てきて、出てきても申し訳程度の説明しかない・・・
http://www.cs.tsukuba.ac.jp/~yas/cs/csys-2007/2007-12-14/ >◆ダブルバッファリング
> 整数を1つバッファに書き込むだけでロック/アンロックを行なっていると、 実際の並列処理では重たい。
> ロックの回数を減らすために、ダブルバッファリ ングと呼ばれる技術がよく使われる。読み手と書き手で別々にバッファをもうけ、1つのバッファの処理をしている間は、ロックを行なわない。
リストで1つのオブジェクトを更新してる間は「描画スレッドが使っちゃだめですよフラグ」でもたてるのか?
それを参照する時点でスレッドセーフじゃなさそうだけど
それともリスト内の全部のインスタンスのコピーを毎フレーム作るのか?
236 :
名前は開発中のものです。:2014/03/02(日) 20:59:31.72 ID:uIAHAPdg
あいや、これは循環バッファ?というやつでダブルバッファとは違うのか
計算したデータを参照渡しせずに、値渡しすればいいだけの話
マルチスレッドを効果的に使う場面は、
BGM,効果音など
背景の処理、草や木が風でゆらゆらする
シェダー関係もそう
インスタンスのセットを2つ(AとBとする)作っておいて
・描画スレッドがAの状態を使用して描画している間、更新スレッドは
Aの状態をもとに更新後の状態をBに作成する。
・両方が完了したらAとBをスワップする
って方法かなぁ
>>232の図で言えば、Subスレッドが描画している間に
Mainスレッドがもう次のフレームの接触判定を処理し始めてる感じ
計算したデータを描画用のバッファに積んで、描画処理に引き渡せばいいだけ。
なんで単純に出来ることを複雑にやろうとするんだ?
>>231 .binはlinuxの.exeって感じでデータっぽくない
>>234 面白そうだけど利用者ほとんどいないようだし、すぐに消えそうだな
cocos2dのほうが良いよ
>>239 それって概念的には全てのインスタンスx2だけど、
描画スレッドは描画に関するデータ(それも画面内に入るもの)だけあれば良いから
実際には必要なメモリ量を削った実装で実現できるな
244 :
239:2014/03/03(月) 00:29:47.75 ID:+ppeC4rH
>>243 確かにそうだ
そして多分それが
>>240が言っている
「計算したデータを描画用のバッファに積んで、描画処理に引き渡」す
ってのに近いのかも
この辺で思ったんだが、もしDirectX11を生で叩いてるなら
DeferredContextとか使うといいのかな
245 :
名前は開発中のものです。:2014/03/03(月) 00:38:44.19 ID:/CdxWaD8 BE:1724177849-BRZ(10000)
>>239 スカラだけならともかく毎フレーム描画に必要な情報全てをnewするのか?
>>239 描画用のバッファを積む時にスレッドぶつかるかもしれないって話では?
class aiueo{
private:
Position* position;
Position* drawPosition;
public:
void func(){
position->setX(position->getX+1);
Position* tmp=position;
position = drawPosition;
drawPosition = tmp;
}
void draw(){
image.draw(drawPosition);
}
};
一フレームぶんのバッファに積み終わってから引き渡せばいいだけの話。
引き渡したら描画を描画スレッドにやらせて、計算スレッドは次の計算に入ればいい。
なんで単純で簡単なことを複雑に考えるのか、さっぱり理解できない。
そもそも描画順序などを考えると、座標がすべて確定した後で無ければ、
描画処理なんて出来ないのに、なんで計算直後にチマチマ描画しようという発想になってるんだ?
毎フレームnewとかも、嫌なら最初からある程度の領域を作っておけばいいだけの話で、
そんな簡単に解決できるどうでもいいことをイチイチ聞く意味が分からない。
なにこの思考能力の欠如?
別の書き方は出来ないのかあんたは
248 :
名前は開発中のものです。:2014/03/03(月) 08:19:00.54 ID:/CdxWaD8 BE:574726526-BRZ(10000)
>文字通りZバッファに登録するだけだったりする?
意味不明
251 :
名前は開発中のものです。:2014/03/04(火) 00:42:30.15 ID:tv4RC6nv
なんか描画スレッド分けるのがマルチスレッドみたいな流れになってるけど
処理の分割しないと複数コアの性能いかせないよね
>>238以外にも分割出来るところはあるんじゃないの
AIなんかのフレームと分けられる箇所が効果的だとは思うんだが
>>248 君はレベルが低すぎる。基礎的なことすら理解していないようだから
身の丈に合った技術で制作するべきだ
ゲームロジック以外については定番のパターンがあるわけで、
ゲームロジックについてはゲームの性質次第だから汎用的な議論はできん
254 :
名前は開発中のものです。:2014/03/04(火) 01:12:12.33 ID:eUCtnBam BE:718407735-BRZ(10000)
身の丈に合った技術で満足してたら俺みたいに全然成長しないままになるしいいんじゃね?
自称デキル人の大半はエセ
バグ生産しまくるのは得意みたいだがw
無視するに限るよ(ry
いまどきDXライブラリの初心者でマルチスレッドの基礎も理解してないのに
無理に背伸びした結果が「文字通りZバッファに登録するだけだったりする?」
格好ばかりつけて内容がなさすぎだろ
上で新技術OpenMPとかドヤってたやつといい、もう少し自惚れを抑えて
真摯な姿勢で学ばんと時間の無駄だよ
そもそもグラボの基礎から学びなおせ。
明らかにZバッファが何か分かってないだろ。
>>254 Zソートの機能があるライブラリって訳じゃ無いのね
262 :
名前は開発中のものです。:2014/03/04(火) 21:19:35.34 ID:eUCtnBam BE:2682053287-BRZ(10000)
>>261 アルファ値がある面だけZソートして、不透明な面の後から描画しています。
マルチスレッドの基礎はわかりませんが、
勉強目的で実装してみようかなと考えて、疑問点があったので質問しました。
質問の内容に戻りたいのですが、
メインスレッドではオブジェクトの座標だけ計算して、
描画スレッドでオブジェクトの座標からモデルの頂点等を展開すると
メインスレッドと描画スレッドが共有する値が少なくなっていいかなと考えたんですが、
実際に使われているスタンダードな方法とかあれば教えていただけると助かります。
struct Node {
....Image* image; // D3DMesh mesh でもFontSprite fontでもいい
....Rect bounds;
....Rect src;
....double angle;
};
struct Layer {
....int usingLength = 0;
....Chain<Node> chain; // std::list<Node>
/*
Chain<Node2DImage> chain1;
Chain<Node2DFont> chain2;
Chain<Node3DModel> chain3;
*/
....bool isUpdate = false;
};
Lock g_sync; // winならクリティカルセクション、linuxならセマフォ
Layer g_layers[3]; // instance;
Layer *g_pFront = &g_layers[0];
Layer *g_pSwap = &g_layers[1];
Layer *g_pBack = &g_layers[2];
void threadFront(){ // GUI Thread = main thread
....while(true){
........g_sync.lock();
........if(g_pSwap->isUpdate == true){ // ロジック側がスワップした
............Layer *swap = g_pFront;
............g_pFront = g_pSwap;
............g_pSwap = swap;
............g_pSwap = false;
........}
........g_sync.unlock();
........render(g_pFront);
....}
}
void threadBack(){ // Logic
....while(true){
........g_sync.lock();
........if(g_pSwap->isUpdate == false){ // 描画側がスワップした
............Layer *swap = g_pBack;
............g_pBack = g_pSwap;
............g_pSwap = swap;
............g_pSwap = true;
........}
........g_sync.unlock();
........update(g_pBack);
....}
}
class Scene {
public:
....virtual void update = null;
....virtual void render() = null;
}
class Game : public Scene {
....Sprite sprite;
public:
....void update(){
........sprite.x++;
....}
....void render(){
........sprite.render(); // g_pBackにデータを渡す
....}
}
Scene* g_pScene = new Game();
// Logic Thread update()
void update(Layer* layer){
....g_pScene->update();
....g_pScene->render();
}
問題は、GUIスレッドしかテクスチャーとかの生成と破棄ができないのだが、
ロジック側の要請をキューにしてメッセージパッシングするのは
少し複雑な実装になるこった。
ideoneとかcodepadとか使えばよかったのに
268 :
名前は開発中のものです。:2014/03/05(水) 20:45:55.74 ID:6x2/6ZGn
sleepってなくてもいいもんなの?
269 :
名前は開発中のものです。:2014/03/05(水) 21:47:30.12 ID:6x2/6ZGn
マルチスレッドプログラミングしなくてもいいじゃん
起動時のスプラッシュ画面を出すときに欲しくなるんじゃない?(適当)
マルチスレッドと言えばQtのQMutexLockerはとても便利だった
ミューテックスのロックとアンロックが一行でできる
>>266 書いてくれて嬉しいですが、処理の流れが見えないですね・・・
swapは裏画面と表画面を入れ替えてるというのはわかるんですが
ロジック側も入れ替えるんですか?
layerとかchainとか何を指してるのかイマイチわからないです・・・
g_sync.lockというのはロック出来るまで待機すんるでしょうか?
そうするといい感じに交互に処理できそう?
だから基礎知識のないやつに教えてもこうなるだけだと言ったろう?
時間の無駄だから諦めたほうがいい
275 :
名前は開発中のものです。:2014/03/07(金) 18:45:58.30 ID:p/ke0iDn BE:1005770737-BRZ(10000)
マルチスレッドで描画しているゲームで、FPSが60以上出るゲームがあるけど
あれって一秒間に60回以上オブジェクトの更新しているってこと?
それとも更新側も全力でループ回して、前フレームからの経過時間を測って処理落ちにも対応する感じ?
シングルスレッドでも余裕で1000FPSでますよ?
すっげー爆速だー()
1フレームの処理に16ミリ秒も使えるんだぜ
16,000マイクロ秒だぜ
16,000,000ナノ秒だぜ
XNAは50FPS推奨だったような気がする
俺もなんとなく50FPSで同期とってる
279 :
名前は開発中のものです。:2014/03/07(金) 21:10:47.46 ID:p/ke0iDn
1000FPSでたってモニタがせいぜい120FPSまでしか対応してないじゃん(´・ω・`)
>>279 見た目はそうだけど、例えば 当たり判定があるなら、見えない部分でも計算処理がなされる。
だから、それに何か意味があるのか?
フレーム飛ぶだろ。
裸の王様的当たり判定
>>281 あくまで精度を高めるための処理であって、フレーム飛ぶとかは関係なくね?
よくあるネタとして、毎フレーム32ドットで飛んでいく弾丸は、
大きさ30ドットの敵キャラをすり抜けちゃうとか、そういうやつ。
そういうやつで、あんなやつで、いいかんじに、そんなかんじみたいな?
画面は秒間60回、ロジックは秒間100回更新するより時間差分を使うほうが
一般的じゃないかな。アニメーションなんかでは。
ちなみにマウスを使ったお絵描きソフトをつくると60FPSでは
線が途切れてしまうわけだけど、こちらでは更新回数を増やすのではなく
前回の座標と今回の座標の差分から埋め合わせを計算するのが普通。
マルチスレッドが有効利用できる部分と、利用できない部分がある。
効率的にマルチスレッド化出来る事が限られている。
そして、CPUが4コアであっても 決して4倍には成らない。
「目に見えなくて意味がない部分を省略する」メリットよりも
「あらゆる状況に対応できる」メリットを優先するってだけの話じゃ。
さっぱり言ってることが分からんわ
単にCPUに余裕があるって話なら分かるけど。
それと1000FPSになんの関係があるんだ?
処理を1000回やるのと1000FPSは意味が違うだろ。
アホの子はマルチスレッドを使うことが目的化しているなw
「マルチスレッドでCPU性能を限界まで引き出す(ドヤ」
これからはマルチスレッド・ボーイと名乗りなさい
マルチスレッドを勉強したいんだろうしそれが目的でいいんじゃねえの
>>288 フレームという単位は、確かに元は映像や画像処理の世界の言葉だが、
ゲーム系では映像の出力の他にも、処理の単位(要はループ数)として使われることがある。
どっちの意味で言ってるかは文脈による。
本当にこいつの言う話は意味不明。
マルチスレッド?jは?何言ってるの?
はっはっはっはっは
教えて君の相手をしていても進歩がなさそうだ
単発で何やってるんだよ。
恥ずかしいやつだな。
こんな過疎スレで自演しても意味ないぞ
一体何が単発で何が自演しているというのだろう?
まず、
>>275が振った話題にレスが続いてること理解してる?
図星だしたか?ID:fjndePR8君
日付が変わればIDは変わる。それはお前も同じことだが知らんのか?
わかったら、敗者は立ち去られよ
???本当に馬鹿だなお前w
本当に恥ずかしい流れになってきたw
レス番号と根拠を述べない限り、お前は意味不明なことをいってる糖質にしか見えないが?
追い詰められて苦し紛れに「バーカ」とか「アーホ」と一行レスで煽ってるだけじゃんw
つ鏡
ほら、何も反論できないだろ?突然「単発で自作自演をして、うんぬん」と人を批判するが
「どのレスがそうなんですか?」と聞き返されて「お前馬鹿だろw」「つ鏡」などと
意味不明な返答を繰り返す。
わかったら、敗者は立ち去られよ
皆何と戦っているのん・・・
……単発で自演って日付またいだからID変わっただけだろうに……。
結局275はどういうことなの
★フレームレート(fps)の方法には幾つか種類がある
@固定fpsで、リミッターにより fpsの上限で固定してしまうもの。
AV-SYNCによって固定する、ゲーム機などであり確実に固定する。
B可変fpsにし、fps値が変化しても同じ速度で挙動するもの。
ゲームエンジンが 一般的にゲームループを形成しており、
ループの回転数(fps)を計測する。
PCの処理速度が不安定であり、状況により常に変動している。
ゲーム内では処理の負荷変動に関係なく処理速度を一定にしたい。
@固定fps方法、設定のfpsを越えないように上限値を決める方法、
単純な解決方法です。設定fpsを下回る場合は処理落ちになる。
AV-SYNC方法、これはリミッターと同じですが、
画面の同期にハード的に合わせてリミッター処理します、
ですから、設定fpsが常に安定している。しかし、
画面同期が変更されると困る。ゲーム機などに多い。
B可変fps方法、これはゲームループの回転速度に反比例して
ゲーム内の速度を制御します。よって、fpsが変化しても
ゲームの速度に影響がありません。こうすると
非力PCでもささやかに動き、高級PCでも豪華に動く。
また、以上の組合せの方法もあり、条件によって選択が違ってくる。
ティアリングと絡めて
ガッシ、ボッカ、マルチスレッド・ボーイは逃走した(スイーツ)
>>307 「ゲームプログラマーになる前に覚えておきたい技術」のページ127から140を読んでもらいたい
図書館にあると思う
>275は、>279から推測すると
おそらく画面描画の単位としてのフレームと、処理の単位としてのフレームを混同してる
フハハハハハハハハ
格闘ゲームは60fpsじゃないと古参のファンに叩かれるそうな
このスレは熱いな
ゲ製にしては良い流れだ
なんにせよゲーム内時間の指標となる数値は必要だよね?描画は別としてね
昔に作ったやつは特に深く考えることなく60FPS基準にしてて、
「このエフェクトは1秒間かけたいから設定値は60(フレーム)にしよう」
とかやってたけど、ゲーム内の時間と描画を切り離して考えてなかったから
倍速にしたいときにFPS120にして1フレごとフレームスキップするとか
トンチンカンなことやってたんだよね
(FPS設定値が描画回数と一緒にゲーム内の速度に影響してしまってた)
設定値は素直に、ゲーム時間としては「再生速度 * 秒数(ミリ)」で設定して
描画としてFPS(描画/秒)を使うべきだねぇ
それ、具体的には、デルタタイム(前回更新からの時間差分)を使うのが
一般的だと思うぞ。
もっと原始的にやるなら、画面が50FPSだとキリがよくて、ロジック側もループ回数で
単純計算しやすいかなとは思うんだけど、その延長線上の考え方として
マルチスレッドで秒間100回更新するというのは止めたほうがよいね。
普通のHDMIとかパネルの駆動が60Hz辺りなんだから
EU圏のゲーム機でもなきゃわざわざ50を選ぶ理由ないけど
ロジックを高速にするならゲームパッドのサンプリング周期も考慮した方がいいかもね
マウスも非常に速いのあるけど画面とは綺麗な整数倍にならないし
シングルスレッドのかずき君は去ったようだ
います!
>>317 ネトゲとかアクションじゃない限り、ゲーム内時間は現実のデルタタイムに
影響されないようにした方が混乱しないんじゃね?
Unityのチュートリアルなんかだと、「移動距離 = Δ * speed」みたいなやり方を見るんだが、
俺達みたいに自分でゲームループを制御する場合は、ゲーム内時間とリアル時間を結びつけるために
ループ内でSleep入れて、ゲーム内の「最小単位時間」は常に同一になるように調整した方がわかりやすいと思う
ではその場合、画面が60FPSで更新されるとして、
常に17msの倍数でウェイトやアニメーションを行うことになるな。
別にそれはそれで単純でよいが、海外のゲームエンジンとかライブラリだと
デルタタイムでタイムライン処理するのがデファクトな印象ではある。
ここ日本
UnityとかFlashもタイムラインだし、デファクトに則るのが良いと思うが、
フレームワーク・ライブラリ整備されている前提でないと
むしろ手間かかるというのはあるな
SDLやDXライブラリでそのままでゴリゴリ書いちゃってるような状況なら
原始的な手法がいんじゃまいか
325 :
名前は開発中のものです。:2014/03/09(日) 22:16:48.95 ID:ai4yRe81
時間固定で動くゲームって今ほとんどないんじゃない?
3Dのゲームは大概処理落ちするとコマ送りになる気がするけど
通信対戦なら時間基準しかない
同人ならまだまだ普通にー、って感じじゃない?
自称プロの方ですか。
プロのくせに2chってキモイんで巣にお帰りください
コミュ障の有段者かな?
円や矩形の当たり判定を使わずに3Dのメッシュとメッシュの当たり判定をする方法ってある?
>>331 もう少しくわしく
なぜその方法ではダメなの?
どのような目的の為にその他の方法が必要なの?
着地判定じゃね
あるも何も三角形を総当たりで判定するだけでしょ。
いったい何が聞きたいのかさっぱり分からない。
単に効率的な手法が聞きたいんでしょ
何が聞きたいのかわからないってアスペかよ
効率的な手法=点・円・矩形の当たり判定じゃまいか
バーカバーカ
>>336 いや、色んな当たり判定の取り方有るよ。
それに円、球、円柱などの単純図形による近似判定って処理が軽いだけで、
厳密な当たり判定を取りたい時の手法としては効率的ではないし。
凸包を使う方法とか、xyzそれぞれのベクトルの射影を取る方法とか、調べてみると面白い。
効率的な手法=処理が軽い
精度の高い手法=厳密な当たり判定
効率的な手法で精度の高い手法 = 俺らの目標
妄想の間違いでは
では、球と球の当たり判定の計算式を述べよ
b1{x, y, z, r}
b2{x, y, z, r}
diff.x = abs( b1.x - b2.x )
diff.y = abs( b1.y - b2.y )
diff.z = abs( b1.z - b2.z )
distance = sqrt( sqrt( diff.x^2 + diff.y^2 ) + diff.z^2 )
distance > b1.r + b2.r → no collision
distance = b1.r + b2.r → contact
distance < b1.r + b2.r → collision
数学的に
>>324 が正解です、
しかしながら、プログラミングとしての最適化されていない。
最適化された解を述べよ、 ( 処理速度向上させよ )
345 :
名前は開発中のものです。:2014/03/11(火) 17:31:22.65 ID:7aEkrhcX
あー、どうせ2乗するなら abs() が不要か
平方根の最適化はコンパイラに任せるとして、
distance = sqrt( sqrt( diff.x * diff.x + diff.y * diff.y ) + diff.z * diff.z )
とかじゃダメ?
わからんけど、俺ならとりあえず diff.x > b1.r + b2.r の時点で弾くかな。
diff.y と diff.z も同様。
347 :
名前は開発中のものです。:2014/03/11(火) 21:03:50.46 ID:Xqo2QxT0
distanceはsqrt(diff.x^2+diff.y^2+diff.z^2)
sqrtは重いからsqrt使わずにdistance^2と(b1.r+b2.r
)^2を比較する
標準Cライブラリのmath.hってそんな重いの?
平方根くらいええやん
349 :
名前は開発中のものです。:2014/03/11(火) 21:49:57.82 ID:Xqo2QxT0
今はcpuに命令あるはずだからそれなりに高速だとは思うけど、四則演算と比べれば当然遅い
ちなみ平方根の計算自体は近似値求める計算だから結構でかいよ
どの道その距離は後で衝突箇所(衝突時間)を求める時に必要になるから
計算して返すようにしておいた方がいいよ
352 :
名前は開発中のものです。:2014/03/12(水) 10:35:51.84 ID:DWahuZKR
int i;
double dSqrt, x, y, z;
long T, E;
x = y = z = 1.0;
T = clock();
for (i = 0; i<100000000; i++){
dSqrt = sqrt(pow(x, 2.0) + pow(y, 2.0) + pow(z, 2.0));
}
E = clock() - T;
printf("√( x^2 + y^2 + z^2 ) = %1.5f [%1.5f] sec\n", (float)dSqrt, (float)E / CLOCKS_PER_SEC);
T = clock();
for (i = 0; i<100000000; i++){
dSqrt = sqrt(sqrt(pow(x, 2.0) + pow(y, 2.0)) + pow(z, 2.0));
}
E = clock() - T;
printf("(√(√(x^2 + y^2) + z^2) = %1.5f [%1.5f] sec\n", (float)dSqrt, (float)E / CLOCKS_PER_SEC);
getchar();
return 0;
実行結果
√( x^2 + y^2 + z^2 ) = 1.73205 [0.60800] sec
(√(√(x^2 + y^2) + z^2) = 1.55377 [1.18600] sec
計算結果はゲームで使うなら誤差の範囲かな?
単純に sqrt 2回使えばほぼ 2倍の時間掛かるんで衝突判定するオブジェクトの数に拠りけり
秒間1億に近いから他の処理の重さと併せて考慮する感じだと思う
353 :
名前は開発中のものです。:2014/03/12(水) 13:43:31.76 ID:KEnJWCWv
誤差も何も√( x^2 + y^2 + z^2 )と√(√(x^2 + y^2) + z^2)じゃ違う答えになって当然だし・・・
うん、一応
>>347に書かれてた事を試してみただけ
355 :
名前は開発中のものです。:2014/03/12(水) 21:54:58.99 ID:5WuRlcAH
>>347はdistanceの二乗使うからsqrtは使わんよ
356 :
名前は開発中のものです。:2014/03/12(水) 21:59:51.24 ID:5WuRlcAH
あと、ルート二つついてる方は単に式が間違ってるだけだと思う
pow(x,2.0)て最適化でx*xになるっけ?一昔前のVCだと駄目だったけど
それにdoubleよりfloat使わない?
358 :
名前は開発中のものです。:2014/03/13(木) 10:00:03.12 ID:pSqzCZ7J
なるほど、342から間違ってたのね、失礼しました
>>357 一応検証の為に pow(x, 2.0) と x*x の比較したら最適化されないみたいです(VC++2013)
√( x^2 + y^2 + z^2 ) [4.25600] sec
√(x * x + y * y + z * z) [0.61000] sec
これまでのを総合すると、
float dist2 = x * x + y * y + z * z;
float rr = (r1 + r2) * (r1 + r2);
if (dist2 > rr) {
// no collision
}
else {
// touch or collision
float dist = sqrt(dist2); // 衝突位置の計算用
}
みたいな感じかな?
参考になりました、ありがとうございます
doubleよりfloatが何故か遅いっていう噂があるね
どうせ/fp:preciseのままだからだろ
とあるゲームのソースを見たところ
playMIDI
TextOut
ReleaseMIDI
など出てきたんですけどこれはygs2kで間違いないですかね?
ygs2kってゲ製では有名なんですか?
そうです
わたしが
ヴェルタース
>>362 言ってることが支離滅裂。
なぜ、その名前だけでそのライブラリに行きつくのか。
ついでに言えば全然有名じゃないし。なんでゲ製でなの?
やねうらお氏は10年前に亡くなりました
知ってる人は多そうだけど、使ってるひとってどれくらいいるんだろう?的な
>>367 ああ、彼のライブラリなのか。
結局、3Dは出来なかったな。能力的にも年齢的にも無理があったのだろうが。
新聞でやねうら王の名前みて吹いた
3Dはのんびり開発してるとバージョン変わって台無しだから不毛
3DというかMSがな
今でも、DirectX7 使えるよ
DirectX11は長生きするんじゃない?つっかえねーテッセレータと共に
超長生きしたのって7と9だっけ?
プログラムというより物理の話で申し訳ないんだけど、レースゲームで壁とぶつかった時の速度の計算ってどうしてる?
速度x0.5
方向は壁の法線方向に対して対称(反射)
※リアルさを求めるなら壁から加わる力から加速度をもとめるべき
壁にぶつかったら爆発→リトライ
レースゲームなら
>>377でいい気がするね
ただ、簡易スマートボール作ろうとしたときに
>>377のやり方やってたら
曲面の壁に沿って滑らかに滑ってくれなくてエターなった思い出があるわ
380 :
名前は開発中のものです。:2014/03/16(日) 15:00:37.43 ID:a7Z/sEsx
物理エンジン任せ
どうしてるの前にどうしたいを述べるべき
ガツガツと壁を削りながらアグレッシブに攻めるゲームにしたいのか
スピンしてほぼ停止状態からやり直させるのか
ある程度の傾斜なら斜めに傾いたまま突っ走るロデオか
内積使えよ
383 :
◆UxQ8uxJMok :2014/03/17(月) 01:35:41.18 ID:kdQ7tXJG
>>381 壁とぶつかりながら進む方
一応ライブラリ使えば球体とコースの当たり判定と交点を求めることは出来るんだけど、アクセルを踏み続けると当たってる時でも加速するし、減速する処理を書くと当たり続けて減速しすぎちゃうし・・・
>>384 その辺は真面目なシム系のゲームを作るのでなければ、
>>377 にあるようなゲームならではの調整が必要になるケースだと思うよ
壁に接触してから〇秒間は加速性能を〇〇%落とすとか、
壁から離れるような方向に謎の力が加わるとか
やってみて理想のゲーム性に近づくようにいろいろ試してみるしかないかと
うむ、それしかないと思うよ
>>387 リンク先をチラ見した程度じゃ、何をやってるか正しく把握してないし、
>>387の言わんとしてることもイマイチ分かりかねてるが、
方法としては、
昔ながらRPGみたく、
キャラの位置が画面端に近づいたら画面全体じゃなくて、キャラのみを移動にする方法や
完全にどこの位置でもキャラを移動させる方法、画面端(移動制限をしっかり)して描画に十分な余白
の3通りぐらいはあると思うよ。
他にも3D系のだと、画面端に近づくと縮尺が変わってとかもあるけど。
色々な表現方法があるのだが、比較的応用のききやすい方法を。
こんな事言って、例のkなんとかさんが激おこしないことを祈る。
>>387 現実世界で言うところの、スポーツ中継におけるTVカメラのようなものを想像して欲しい。
例えばマラソン中継。ランナーは常に走っているけど、カメラも同じ方向に動いている。
あるいは野球中継。ホームランボールをTVカメラが追いかけて、常に画面の中央にあるように撮影する。
被写体の動きに合わせてカメラを動かすことで、視聴者には被写体は停止し、背景が流れていくように見える。
カメラを動かすのをやめれば、逆に背景は停止し、被写体は移動する。やがて画面の外に消えてゆくだろう。
これをまとめると
(1)キャラクターは、画面表示に関わらず常に動かせ。
(2)マップは、画面表示に関わらず座標を動かしてはならない。
(3)カメラの位置は、状況に合わせて移動させろ。
ということになる。
387の質問はサンプルソースをどうするかって話だから
その答えだと根本から作りなおせって事になるんじゃない?
まあ答えとしては>389に言われちゃってるしな
そのサンプルだと滑らかに動くスクロール処理をキャラじゃなくてカメラビューの方に入れてるね。
ぶっちゃけサンプルとしてはどうかと思うぞ。
キャラとカメラ両方に入れるか、キャラに入れるか。この二択でしょ。Dxlibの作者もなんでこんな
初心者いじめのようなサンプルを書いたんだろw
俺こそが世界の中心!
C++とかで「グローバル宣言なるべく使うな」って言うけど、どうやって変数のデータを保持するの?
手元の入門書を開いてみてくれ。
「関数」のページに、おそらく「引数(ひきすう)」という項目が書かれてると思う。そこを読むんだ。
398 :
名前は開発中のものです。:2014/03/20(木) 17:55:02.77 ID:XkJNKHnH
クラス化
引数、戻り値
>>397,398
C++があやふやなのであれなんですが、Cで言えば構造体の中でxという宣言をすれば、
void main(){
}
途中で更新ボタン押してしまった(´・ω・`)
勉強したてであやふやなのであれなんですが、Cで言えば構造体の中でxという宣言をすれば、
Test test;
void main(){
test.x=1;
}
こんな感じにしてしまえば、xはグローバル宣言ではないということでしょうか?
>>400 このxはすでにグローバル変数ではなくて、ローカル変数だね
関数の中でしか有効ではない変数で、その関数を抜けるとその変数は破棄されるやつ
グローバル変数ってのはTest testってなってるやつのこと
402 :
名前は開発中のものです。:2014/03/20(木) 18:17:11.33 ID:7FNS6Iq5
なんか言ってることが良く分からんが
Test test;
を関数外に書いてるからtestはグローバル変数
だからその中に保持されているxの値も関数抜けても維持されるよーじゃなくてさっさと入門サイト見てこいカス
グローバル変数を使うことが悪いのではない
グローバル変数を使うことでバグを引き起こしたりメモリを圧迫する事が悪なのだ
要求機能満たして動くならグローバル使っても気にするこたぁない
404 :
名前は開発中のものです。:2014/03/20(木) 20:32:50.84 ID:mbiTOjB0
そういうのはわかるようになってから考えればいいし
初心者のうちはグローバル=悪って覚えていた方が安全
問題になるのは生成、破棄の順序位でしょ
メモリ圧迫なんてヒープからnewしたのと同じだしスタックに積まれるよりまし
アクセス範囲や名前の衝突なんてのも関数でも起こるし
アクセッサーとか間違った使い方のシングルトンで
どこからでも参照できるようにしたら同じこと
シングルトンを使うのがそもそもおかしいって力説するやつに会ったことならある
インスタンスが単一を保証するためのパターンでどこからでもアクセスできる為では無いからな
ローカルなクラス内のシングルトンもあるので間違えられると混乱の元
ゲームのデータクラスとして使うのは設計次第
408 :
名前は開発中のものです。:2014/03/20(木) 22:00:31.87 ID:mbiTOjB0
リソースよりもメンテナンスの問題でないの
一人開発だとそんな気にならんけど規模でかくなると影響範囲の広い変数なんて地雷みたいなもんだからな
下手に修正すると全く関係ないところでエラーでたりしてトレース大変だったり
409 :
名前は開発中のものです。:2014/03/21(金) 18:13:16.93 ID:VAKzG1ya
シングルトン便利なのに
呼び出し側は生成関数使うだけで初期化されてるか気にしなくていいとか楽チン仕様にできる
グローバル変数だけだとそうはいかんよね
初期化に失敗する可能性入れたら
実際に使う前に確認しておきたいけどな
初期化に失敗する可能性のあるものは
初期化するタイミングを図らないといけないもので
それはシングルトンより適したデザインがあるのてはないか
最新のdirectx SDKってどこで入手したらいいですか?
ググっても場所がまちまちで
>>413 Windows8に標準でついてくるそうだ
2012以降のVisual Studioに標準で付いてくる、な
マジレスすると
>>415のやつ
それかWindowsSDKに一緒に入ってる
この程度は自分で調べようぜ
417 :
413:2014/03/24(月) 22:44:31.69 ID:rE2XsGEW
インストール出来ました
ありがとです
418 :
名前は開発中のものです。:2014/03/25(火) 09:41:15.88 ID:KT+bOjyU
シューティングゲームを作る時、移動キー押下時に自キャラと他オブジェクトとの衝突判定を行うと思うのですが、
1フレーム移動毎に、敵や敵の弾や壁との衝突判定をしていると
画面上に敵の弾が100個とかあったりするとかなり膨大な数ループ処理が必要な気がします。
一般的なゲームの場合、画面上で動いているオブジェクトは全て1フレーム毎に衝突判定をしているのでしょうか?
>>420 レスした後でそこ見つけたんだけど私の頭では理解が・・・(´・ω・`)
皆この概念でシューティングゲーム作ってるんですかね?
>>420 今まで普通にやってたけど名前が付いてるの始めて知ったわ
ありがとう
俺もその理屈何度も読んだけど理解できないんだよなぁ。
素人に解るレベルに噛み砕いてくれてるとこあればいいのに。
結局座標で判定して分割してたりする。俺。
>>419 100個くらいなら問題にならないっていう指摘と
なぜ移動キーを押してる間しか当たり判定がないのかというツッコミと
質問はそこじゃないから
質問に答えたつもりは無いのだが…
ID:VxCnnAtl
その嫌われ者キャラは素なの?
治した方がいいよ。この先も友達出来ないよ。
一般的なゲームをどのクラスで指すのか分からないけど、
時代やハードを問わない"基本"は力技というか、1フレームごとの全判定だと思うっす。
ベテランプログラマがざっくりと組んじゃうところじゃなければ、
とりあえずプロトタイプを作ってみて、そっから必要な機能を満たしつつ、
どんだけ不要な判定対象を省いて回数減らせるか、ってやり方が多い気はする。
負荷やループ数を気にしているのなら、最近の据え置き機や携帯ゲーム機の場合だけど、
C++使ってるなら、数万回のループ判定程度がボトルネックやオーバーヘッドになることは少なくて(余程複雑な判定をしてれば別)、
問題になるのは2D3D問わずグラフィックスコマンドの場合が圧倒的に多いと思う。
なので、研究目的とかじゃなくて今時のハードで遊べるものを作りたいというだけなら、
判定そのものはそこそこ効率化してれば十分だと思うお。
よくあるシューティング形式なら、
>>423の考え方でも十分効率上がりまっせ。
そういう変な聞きかじりは止めた方がいい。
>>423ならスクロールなし画面に入るサイズだから判定もせいぜい3000未満でしょ。
それなら普通にforループ回して十分だし、そこだけマルチスレッドにしても良い。
厨が頑張るスレw
「効率の良い判定方法を教えて下さい」
「今どきのPCは高性能だからそんな事考えなくてもOK!」
じゃ会話にならないでしょ。
ていうか自分の環境を基準に考えるのは止めたがいいよ。
「そこに拘るよりは、他の場所がネックになってる可能性が高い」なら回答としてギリギリありかな
そうかなぁ。
私も
>>425と同じ感想を持ったんだけど。
>>419が実際にそういう総当りをしてみて重かったから他のやり方を聞いてるなら
>>432のいうとおりだけど、実際やってみたのかね?
そういう感じには読めなかったけど。
判定するまでもなく接触していないことが自明なものはそもそも判定しない、とか
あとは、シューティングゲームなら
「敵x敵、敵弾x敵弾、敵x敵弾の判定は不要だからしない」とかで
判定回数を減らせることがある
(もちろんその判定がシステム上必要ならやるしかないけど)
あと経験不足な人だと
A→Bの判定とB→Aの判定を別個にやっちゃってて
そのせいで速度が出ないってのもあるかも?
これを修正するだけで判定回数を半分にできる
>>434 馬鹿じゃないの?ほんと文章を文字通りにしか受け取れないんだね。
誰が100個限定の質問してんだか。どう見ても数多くのオブジェクトがあった場合の衝突判定の質問だろ。
お前以外は皆わかってそういう答え返してるのに、お前だけが100個という質問の中のどうでもいい部分に固執してるわけだがw
ここを10000個とでも書かないと分からんの?アホだろw
>>436 まじか。
想定されるオブジェクトの個数というのは重要な情報だと思ってるんだが、他の人はそうじゃないのか。
1個でも42億個でも対応できるようなやり方を毎回してるの?
100個って書いてあったらだいたい100個くらいを想定してるんだと思うのが普通だと思うが、そうでもないんだなぁ。
そもそもプログラム組める奴が434みたいな的はずれなこと言い出す訳がないわけで…
つまり、相手するなカス荒れるから
膨大な数のループを使う判定は書けるんだからさらに増えたらどうすんのって質問でしょ
>ここを10000個とでも書かないと分からんの?アホだろw
2Dの当たり判定の処理は軽いから、マンコでも同じ事。 やってみ
話変わって悪いけど、レースゲームで車が高速移動しすぎて当たり判定が出来ない場合ってどうすればいいの?
>>441 1ループあたりの移動速度を半分にして、ループ数を2倍回す。
>>441 現在フレームをnとした場合、n-1フレームの情報を保持しておいて、nフレームとの線分を引く。
あるいは現在の位置と速度から予測されるn+1の未来予測位置とnフレームとの線分を引く。
この線分が障害物と接触していたら接触した際の処理へ移行するように書いておく。
>>440 PCスペックを限定してないのにその回答は無意味だってば。
たとえ、 2MHz Z80であっても、ディスプレイは40x25のキャラクタ画面だから大丈夫だよ
40*25のテキストエリアで10000個のキャラクター動かすのかw
>>447 俺は
>>442じゃないけど大丈夫だと思う、むしろよくある手法じゃない?
アクションの通信対戦で処理落ちする時の同期なんかで使われるのも似たようなやり方あるし
一時期の同人げーって処理落ちしまくりで
「こいつら良いマシンで開発してるんだな…」って嫉妬してたw
最近はPCの性能頭打ちでそういうのなくなったからいいよねww
>>447 スレチかもしれんがUnityの物理演算部分の判定は秒間1000ループが推奨されてるんだからわりと平気なんじゃね?
>>441 Point before, after; // 前回の座標、今回の座標
int count = 8;
int ix = (after.x - before.x) / count;
int iy = (after.y - before.y) / count;
Point pos;
pos.x = before.x;
pos.y = before.y;
for(int i=0; i<=count; i++){
bool is = collision(pos.x, pos.y); // 当たり判定
if(is) break;
pos.x += ix;
pos.y += iy;
}
count, ix, iyの値をもう少しきちんと平方根使って計ったほうがいいけど
>>451はお絵描きソフトなんかでよく使うんじゃないかな
60fpsでマウス判定じゃ全然足りなくて線が破線になるし
お絵かきならスプライン補間とかだろ2次元だとカクカクの直線になるぞ
あとそれバグ持ちだな
454 :
名前は開発中のものです。:2014/03/28(金) 22:13:02.97 ID:LlNhW3Yy
Windows APIにDirectXが搭載されたならいい加減にウィンドウ生成とかDirectXの初期化とかどんなジャンルでも必要なゲームエンジンの要素とか短縮しねえかな
コピペとはいえ毎回見るのが嫌になってくるよな
ライブラリとかラッパー使えば済むんだろうけど理解するのは面倒だし
>>454 会社では無理だけど自分で作るようなら短縮用のヘッダーと関数とか自作しない
理解すればいろいろと便利だし
ウィンドウ周りは自分で適当にラッパー作ったな
都度調べてコピペするより精神衛生的に良い
さもありなん。
老害にはコードスニペットの概念がないからなぁ。
毎回書くような所だけ書いたプロジェクト作ってテンプレートとして登録しとけばいいんじゃないの
そしてそのテンプレートが、ゲームを作るたびに更新されていく
win32APIで別のプログラムを呼び出したいです
system関数は使ってみたんですがdos窓も一緒に出てきてしまいます
>>460 CreateProcessだとDOS窓出なかった気がする
462 :
460:2014/03/30(日) 01:27:38.78 ID:mb7Whzhe
ドンピシャでした
ありがとうございます
>459
これありすぎて吹く
俺もテンプレートってほどいいものじゃないけど
「今回作ったシステム流用すればいくらでもゲーム作れるぜ!:
と毎回思うんだけど、毎回まるまる作り直してるという……。
自分で作った3Dゲームにめちゃくちゃ酔うんだけど、比較的酔いにくくする方法ってある?
>>465 別にそういう専門知識もってないから経験則になるけど。
酔いやすい人と酔いにくい人がいるけど、酔いやすい人は三次元把握能力の高い人だと思う。これはどうしようもない。
俺は酔いにくい側の人間なんだけど、それでもあるゲームではめちゃくちゃ酔った事がある。
そのゲームはTPSなんだけど「キャラの背後に壁などの障害物があると、それが邪魔にならないよう自動でアングルが変わる」というものだった。
「背後の障害物が透明になる」なら酔わないのに「勝手にアングルが変わる」だと凄まじく酔う事がわかった。
車の運転でも、「運転してる人は酔わない」と言われてる。つ
まり「プレイヤー本人の意思とは関係なくアングルが変わる」と酔う事になる。
他にも、急激にアングルが変わる(目の処理が追いつかない)でも酔うと思われるので、ゆっくり視点を動かす工夫をすればいいのではないだろうか。
あと視点の方向を変えると遠景ほど早く動いて見えるから、遠景はあまり注視できないようにぼかすとか彩度を落とすとかするといいかもしれない。
ソニックアドベンチャーDXは何故かすごい酔った
モニタを「風景の映ってる窓」として捉えると酔いにくい、なんて話も聞いたことがあるね。
FOVの設定が悪いとか
>>469 上でも言ったが俺は酔いにくい人間で、モニタに映る映像を「一枚の絵」としか認識してないんだよな。
頭のなかで3次元空間を構築しながら見ていない。
ガンブレードNYの動画を見てた時、ぐりんぐりん視界が動くのにまったく酔わなかったんだが、
ふと「一枚の絵としてしか認識してない自分」に気づいて、
頭のなかで方位を意識しながら(3次元空間を意識しながら)見なおしてみると、あっという間に気分が悪くなったw
でもこれは個人の話であってゲームをどうやれば酔いにくくできるかって技術とは別の話だよね。
3次元で意識してるけど酔ったことないな
酔うのが不思議でならない
3D酔い
カメラの位置と回転中心位置の関係が悪い
カメラ視野角の調整が悪い
カメラ回転の応答速度が遅い
>>465 FoVが狭すぎてゲロゲロ
カメラの動きでゲロゲロ
この辺りは既に言われてるようなので、あとはレベルデザインかな。
ぐぐったら自レスが引っかかったのでリンクを貼っとく
http://unkar.org/r/gamedev/1223550808/423-452 > 452 : 名前は開発中のものです。[sage] : 2008/12/27(土) 00:34:33 ID:quq8i6DN
>
>>423 > 遅レスで更に
>>425、
>>426と微妙にかぶる内容だが
>
> (1)FOVの問題
> 酔いの原因は様々だが、FOVの調整で改善される場合は多い
> プレイヤーの視野角を考えずに3D画面の投影変換行列を設定すると酔いやすい
>
> ・プレーヤー視点とディスプレイ間の距離
> ・ディスプレイの寸法
>
> 以上のパラメータから違和感の少ないFOVを探ることができる
> まぁ、既存FPSのFOV値を参考にするほうが手っ取り早いかもな
>
> (2)レベルデザインの問題
> 閉鎖空間を多用するマップは酔いやすい。これは(1)の問題との組み合わせでより悪化する
> FOVをどんなに調整しても吐く奴は吐く。対策としては開放空間(屋外)を多用する方法がある
> ただし、閉鎖空間の戦いをウリにするゲームではこの対策はとれない
>
> BFシリーズはオーケーだけどDOOM3とかHLシリーズは駄目、みたいな人に対処するのは困難
> 狭くて暗い閉鎖空間のスポーツFPSを作るつもりなら酔いやすいユーザーは切り捨てたほうが楽
>>473 >カメラ回転の応答速度が遅い
これ、見落とされがちだけどあるよね
ARMAでマウススムージングがデフォルトでONだったので視線の動きに
遅延が生じて気分悪かった。スムージングを切ったら何ともなかった
動き回る飛行船の上でアクションシーンを展開したゲームを作って見たいんだけど
着地判定というか、移動する床みたいなのってどうやってるんだ?
飛行船が上に進んでる時に急制動で下向いたら飛行船に乗ってたキャラクターが跳ねるチンフワ現象を取り入れたいんだけど
素直に物理エンジンに託した方がいい?
物理エンジンが一番楽
正確じゃなくてもいいなら
飛行船が上に進んでいるときにキャラクターの下と飛行船の着地できる部分が接触してるか判定して
接触してるなら飛行船の上の移動量とキャラクターの上の移動量を比べて飛行船の移動量の方が大きいなら
キャラクターの上の移動量を飛行船の上の移動量に書き換える
こうすれば飛行船がいきなり止まったりしたときにふわって感じで浮くことは可能
ただ、違和感はある落ち方になると思うから物理エンジンをお勧めしとく
詳しいね
さすがチンフワ総合スレッド
クラス分けって具体的にどんな感じでやっていけばいいの?
関数分けまでは普通に出来るんだけど、メンバ変数がある以上クラス分けしたくても出来ないし・・・
「// ○○を△△する」ってなコメントが書けそうな関数が複数あったら
○○をメンバ変数に置いて、○○を操作する関数をメンバ関数にしたクラスにする
ツッコミどころ多そうだけど大雑把にこんな原則で大体どうにかなるんじゃないかな
例えばC言語みたいな手続き型の言語で攻撃の判定処理を作ったとする
1.判定対象を選択
2.判定対象の座標と大きさ、形を取得する
3.大きさや形に合わせて判定する
4.当たってたらhpをダメージ分引いたりノックバックさせたり双方の属性に合わせていくつかの処理に分岐する
5.繰り返し
クラスを使ってオブジェクト指向的に処理する
1.対象を選択
2.対象に「お前この判定対象と当たってなる?」と確認する
3.繰り返し
ここまで書いて何を言いたかったか忘れたのでこのまま投稿する
関数を実行するのに必要な変数をまとめたのが最小単位かな
変数として持つデータに依存する部分はメンバ関数にしたいけど
std::stringみたいになんでも入れちゃうのと
マイナーな機能は引数を取る静的関数や別クラスに分けるかはまた悩む
オブジェクト指向を完全に突き詰めると動詞の関数しかなくなるような気がしないでもない
ゲームなら特に
>>482 ええー、そんな感じなの。想像してたのと違うなぁ。
あ、俺は480じゃないけど似たような問題に詰まってる者です。
まあオブジェクト指向の作法については
それだけで厚めの本が出るぐらいだし・・・
自分のことは自分でやれってことだよ
だねぇ
>>480,
>>485 完成させてからのリファクタリングの段階ということなら具体的に説明
できるだろうしコード片をうpってもいいだろうし、お話になるのでは
話の振り方次第ですお
例えばだけど、こういう場合はどうした方がいい?
class Player
{
public:
Player();
void update()
{
aClass_.update();
bClass_.update();
}
private:
A aClass_;
B bClass_;
};
class A
{
public:
A();
void update()
{
//メンバ変数とBクラスのx_が必要
}
private:
int a_;
int b_;
int c_;
};
class B
{
public:
B();
void update()
{
//メンバ変数とAクラスのa_が必要
}
private:
int x_;
int y_;
int z_;
};
>>490 class Aの前にclass B;を書けば良いんじゃね?
横からだけど
とりあえず動作すれば良いってだけならクソ回答としてupdateの引数にそれぞれ渡してあげる
渡し方はゲッターとかクソだけど
素人意見だがPlayerにabcxyz持たせて引数付きupdate作るとか
PlayerのupdateかprivateにupdateA,updateB作ってべた書きとか
AとBくっつけるとか
俺はどうしても他で必要にならない限り分けない、
enemyで必要とかになればそもそも一つ前にcharacterとか作って両方に持たせるとか
>>489 クラスAとBが相互依存してるから設計しなおす
言いたい事は全部言われてた
@AとBは合体だ!フュージョン!
AAとBで壁パスだ!ダブルディスパッチ!
BPlayerが面倒見ろ!メディエーター!
AとBが具体的に何なのか分からないとアレだよな
プレイヤーの所有物で、相互作用(値のやり取り)がある二つのもの。
しかし、プレイヤーとの間に作用はない。
ダウジングのアレとか?
合体魔法をプレイヤー複数人で打つとする
トリガーとなるプレイヤー一人が発動したら周囲のプレイヤーの合体魔法用のメソッドを呼ぶ
メソッドの中ではそのプレイヤーのmpを減らしたりクールタイムを追加したり硬直したりする
トリガープレイヤーはそのメソッド呼ぶだけだから、もしかしたらプレイヤーによって処理は違うかもしれないが、とにかくそのプレイヤーは合体魔法に参加した
メソッドの返り値で成否を確認してもいい
その複数のプレイヤーの中心の座標に合体魔法を発動するなら、その計算処理はトリガープレイヤーがやる
>>490 AとBの使用用途を書け
シチュエーションによって考え方が変わり、考え方に依存するからオブジェクト指向が最も効率いいとされて普及してる
498 :
489:2014/04/07(月) 10:11:55.44 ID:/pjQGnIZ
>>497 Aクラスはキー入力の処理
Bクラスはキー入力後の移動処理と当たり判定
最近は全部hppで書くのか?
ちゃんと.hと.cpp分けろよ
>>498 A…キー入力の処理
↑B.x_ ↓A.a_
B …キー入力後の移動処理と当たり判定
A→Bのデータの流れは分かるが、B→Aのデータの流れは何だ?
フォースフィードバック?
俺はこういう小出しの後出しジャンケンは別に気にしないけど
完成後のリファクタリングの段階なら「具体的に」書けるっしょ?
そろそろ誰かがキレると思うよ
501 :
489:2014/04/08(火) 07:12:29.49 ID:mcCDKO91
>>500 なんかごめん・・・
とりあえずこの質問はスルーってことでorz
テンプレートのせいか全部ヘッダ(h, hpp)に全部書く奴いるけど
面倒くさくてもC++としてはちゃんとヘッダとソースは分けるべきだよ
>>502 あるべき論なんて一考にも値しない。
アホは、何故そう考えるのか理由を述べない。
煽るだけで何も説明しない人による華麗なる自虐芸
レースゲームのAIってどうやってるの?
経路探索だけで市販のゲーム風に出来るの?
幾つか方法はあるが、コース上に複数の「点」を作っておいて
順番にそれを通過するように組む……というのが単純かな?
多数の車が走ってて接触しないようにコース補正とか大変そうだな。
リアル思考でない限り見えないところは適当だろ
多少ぶつかってもペナルティがほとんどないとか
ありえない速度でカーブ曲がってたりとか
カービィのウエライドのデバッグモードを録画した動画がニコニコにあるからそれを見るといい少しはマシになるだろう!
決められたパスを ヘ(^o^)ヘ
|∧
/
/
ただなぞるよりも (^o^)/
/( )
/ / >
(^o^) 三 選んだ自由に
(\\ 三
< \ 三
..\
(/∀・) 傷付くほうがイイ!
( /
/く
ちょっとわかんないからサッカーで説明して
初めて作ったゲームは目標に向かって一直線に飛ぶ意味わからんハエみたいなシューティングゲームだった
プログラム全く関係なくて物理の話で悪いんだけど、戦車が止まってる時と高速で動いてる時に大砲を撃った場合の大砲の速度って違うよね?
ググってもそれらしき情報が出てこないんだけど、具体的に方程式的なのってあるの?
戦車の速度+大砲の初速
これじゃないの?
ベクトル合わせるだけじゃん
もちろん空気抵抗やらゲームバランスやら考慮するなら変わってくるけどな
前から気になってたんだけど、3Dの矩形と矩形の当たり判定って出来るの?
出来るならどんな感じのソースになるのか教えてくれるとかなり助かる
矩形判定を3次元に拡張したのがAABB判定だと思う
各辺が軸に平行、という前提でいいの?
>>519 それで大丈夫
まあさすがに回転してるのは無理だし・・・
それは簡単なんでないの
上辺が相手の下辺をより上&&下辺が相手の上辺より下
を3軸分やればいいだけなのでは?
回転する直方体の衝突判定ってまるぺけになかったっけ?
最初から「平面上での矩形同士の当たり判定」と考えるから、そこから応用しにくいんじゃないか?
直線上で線分同士が重なってるかどうか?という判定があって
単位、それを2回やったのが矩形同士の当たり判定だと考えれば良い。
そうすると、3次元や4次元(?)も、そのまま使えそうだろ?
スーパーマリオ64風のゲームを作ってるんだけど、ステージとプレイヤーの当たり判定ってどうすればいいの?
一応球体の当たり判定と線分の当たり判定でやってるんだけど、坂を下ろうとするとジャンプするように落ちていくっていう・・・
524 :
名前は開発中のものです。:2014/04/22(火) 07:04:26.37 ID:Xs5gC1x8
ゲームエンジン、物理エンジンの吟味から。
いいやつ教えてくれ。
DXライブラリを使っているのですがタイトル画面やゲーム画面でループを変えるべきでしょうか
一つのループでswitchを使ってシーンを変えているのをいろんなサイトで見ますがこういう処理が当たり前なのでしょうか
stateパターンオヌヌメ
俺も最初は画面ごとにループ変えてたけど、ループはひとつにまとめるようになったな。
理由は、ループは違っても共通のやること(キー入力とか画面出力処理)があって
そういうのを画面のループごとに別々に処理させてると管理が面倒だから。
(もちろん共通処理として関数化してはいたが、それでも面倒だった)
>>526 ループ自体は1つにして、そこから何らかの方法で振り分けるのが定番。
複数ループは即「やめとけ」って言われるレベル。
そこだけ守れば、あとはifで関数に投げるなり、switchで分けるなり、好きなようにすればいいと思うよ。
stateパターンについては、処理を振り分けるアルゴリズムの1つだけど
まあ、別にいいんじゃないかな。
>>526 Yes
というか、君にループを分けるという発想を持たせた本かサイトか分からんが著者を呼んでこいぶっ飛ばしてやんよ
データベースといい会社組織図といいマトリクス型はなぜ好まれないのか
>>532 参考資料などがなかった場合、半分くらいは、
真っ先に思いつくのがループを個々に用意する方法のような気もする
オブジェクト指向的に考えるとオブジェクトごとに独立したループが存在してるのもあり得るしな
OSのフレームワーク含めてスレッドセーフな実装があまりない事にがっかりしたり
そのループ(というか一連の処理)の意味合いを無視して設計空論しても意味ねー
たかがシーン遷移でぶん回すループを、複数個所にコピペベースでおく意味がねー
ループ型を嫌う人はシーン数が数十個を越えてもswitchで分岐して作るのか、大変だなwww
イミフだろ。どの案でもループ必須なのに、ループ型ってなんだよw
ポリモーフィズムか関数ポインタ使えよ
で、数十の関数名やクラス名をわざわざ考えるのか、面倒だな
ループが別々にあったら前のループにどうやって戻るんだ?
goto?
ループ内にループが入ってる
その発想はなかった
ループザループ
>>540 シーンの数が数十ってどんだけ大規模なゲーム作ってんのw
C++でゲームを作ろうとすると
ゲームというよりゲームエディタになってしまう
>>546 ゲームを作ってたつもりがエフェクトエディタが完成していた私のことをなぜ知っている
>>548 その数十のループを1ソースにまとめるってとんでもないスパゲティだなw
完成すんのそれw
つーかシーン(画面)をクラスで1:1で管理して、
次回どのシーンを描画するのかポインタ返すってやり方の方がスマートじゃね?
551 :
名前は開発中のものです。:2014/04/24(木) 20:37:26.16 ID:47DD1/Qn
画面の上から下に順番に動作しないと理解出来ないから今のやり方でやってるんだけどね。
関数ポインタやクラスで分けるとあちこちに跳びまくるよね?ソレも嫌だから今のやり方でやってきた。
けどまあ、流れが判らなければ図を描けば済む話か。それでも、今の段階でやり直すのは……ん?
マップや戦闘のメインのシーンは今のままで良いな。サブのシーンの扱いは、直してみるかな?
ちょっと寝かしていたソースだが、色々と検討してみるか。
>>540 世の中にはディレクトリとか名前空間って概念があるから、便利なものよな
ポリモーフィズムで関数の名前考えなきゃならないてどういう状況だよ
クラス名なんて実装したいシーンの名前をそのままだから考える必要ないし
中身は空でいいからすべての遷移とデータの受け渡しくらい先に設計して実装しましょう。
プログラミング自体に慣れてないんだろうけど
一人でコード組むなら図なんて書いたりしないからな
頭の中の仕様書通りにコード打つだけなんだから
ポリモーフィズム使うならむしろ名前は考えなくていいだろ
普通はポリモーフィズムで大まかに分岐した後関数ポインタで細かく分岐するよな
背景に3Dフィールドを表示したまま半透明なステータス画面を描画したいとか
クラスや関数を分けると処理が飛んで困るってstaticおじさんか
ポリモーフィズムの実現手段の1つとして関数ポインタが使われることもあるんだから
その表現はちょっとおかしい気がする
いや言いたいことは分かるけどね?
なんでこういう話になったら、いちいち相手を馬鹿にする人間が出てくるのかね。
数十のクラスが複雑に入り組むプログラムなんて作れない(能力が無い)からでは?と予想
>>557 こういうのどうやって実装すんの?説明してるようなサイトがあったら教えてちょーだい
Stateパターンによる階層付きシーン遷移の方法は、確かセガ本あたりに載ってたような記憶がある
昨日ちょうどそのセガ本の話が有名な同人プログラマのネット配信で出てたわ
「その本はプログラマになる前じゃなくてなった後に読む本だ」って言ってた
その本って学生レベルでも中の下くらいだろ
>>561 というか、そもそもデバッガでソース追えないという話に帰結しそうなのだが。
関数の中とかに「飛ぶ」訳ですし。
今後の事もあるから、「飛ぶ」事に慣れるのが肝要だと思いますけどね。
セガ本で難しかったらgemsとか見たらもう発狂だな
ゲームプログラマの新人でも面接時の作品提出では皆C+DirectX直打ちの人ばかりだようんたらかんたらという
流れの中で言ってたから、難しいというか本に頼らずともネットで情報集めてとにかく作れって感じだった。
その人自体もオブジェクト指向とか意味わからんでゲーム作ってるとか言ってるけど、
同人だけじゃなくコンシューマ機のゲームプログラムを1人で担ってるような人だし、
要は本見て文法覚えるより、汚くていいからとりあえず作品完成させろってことかと。
>>571 とりあえず完成させろってのはその通りだな
ここでウンチク垂れ流してても自分の作品は完成させたことないってやつは多そう
そう、私の事ですorz
directx直打ちじゃないけど大手新卒通ったわ
ゲームコーディングコンプリートって本にはGameLogicってクラスでゲームの状態を切り換えている
ソースコードはネット上にあがってるぞ
ぱっと見た感じ、キューかなんかで格納してる?
スパロボみたいなゲームだと
・フィールドシーン
・戦闘シーン
・アドベンチャーシーン
・シナリオ準備シーン
みたいな感じに大別されるよね
シーンはキー入力の挙動も変わるから
それも内包しないといけないよね
メニューとかの後の分岐はどうやってるの?
デモ読み込みはゲームループ外で、実際のデモ画面はループ内なんだな、面白い。
俺が思ってるデモ画面と別のものかもしれんけど。
>>576 当たり前っちゃ当たり前だけど、
フレームワークなりハードウェアなりから、キー情報を取り出したり使いやすいよう加工するのは共通部分で、
右キーで1マス動かすとか、そういう部分は各シーンのロジックで処理するのが良いんじゃない?
>>577 メニューって、「じゅもん」→「メラ」→「スライムA」 みたいな
シーン中に行われる多層型のメニューのこと?
ポップアップメニュー出しながらもカメラや移動とか一部の操作はできるようにするとかだと
優先度とかそのキーで処理済みかの情報が欲しいから
シーンや入力が欲しいオブジェクトが欲しいキーを入力マネージャに登録しておいて
優先度の高い特殊なキーの組み合わせだけ先に処理して
あとは上位に位置するオブジェクトからキーを拾って処理して未処理は下に投げるとか
WindowsのWM_CHARを参考にしたキー処理終わってから各Updateみたいな事になってるけど
重複する事もあるキー入力の切り分けをシンプルに実装する方法ないかな
キー処理用スレッドを作ってGetAsyncKeyStateを回すとか
よく分からん質問だけどUIコンポーネントの階層でやれば?
class Parent : UI {
UI* child;
void update(Event* e){
// 特殊キー
bool isCopy = Key::isHold(Key::LCtrl) && Key::isHold(Key::C);
// 子コンポーネント先
child->update(e);
// 子コンポーネントでキー入力が確定した
if(e->isKeyEvent == false) return;
// このコンポーネントのキー入力
bool isThis = Key::is ... ;
}
};
class Child : UI {};
>>580 ポップアップメニューはモーダルなインタフェースだから
ある1つのオブジェクト(または選択されたオブジェクト群)を集中して操作しているのに
関係がないオブジェクトを操作ができるのはおかしくない?
恐らくだけど、ここでのポップアップメニューは一般的なGUI部品のソレではなくて、
fpsでよく利用されてるポップアップする選択形式のウィンドウの事でね。
wasdで移動しながらメニュー表示キーを押す事でソレが表示され、マウスカーソルでメニュー選択できる、みたいな。
とりあえず
>>582で問題ないと思うけどね。
>582のままだと何個か同時押ししてる時に子供がキー処理しちゃったら
親は欲しくて子供では未使用のキー情報取りたくとも来なくない?
どういう状況?
メニューが子供でWASDで移動してるとして押しっぱなしで
メニューの選択を動かす矢印やショートカット等の何らかのキー押したら
移動のキー処理が省かれ、結果移動が止まる
ああ、なるほど。
あんまりPCでゲームやらないので分からんのだけど、市販ゲームだとキーアサインはどうなってるのかな。
メニューを開いてない状態で使えるキー(デフォルトだとWASDとか?)は、メニュー画面で何の処理にも使われないような感じ?
使うキー全てを押されているか1つ1つチェックしていけばいい
市販ゲームを買って調べろよ
知らないとこにゲームを作るなんてアホなの
LINEをやったこと無いのにLINEスタンプを作って儲けようとするアホと一緒
>>590 全く意味は分からんが、何か気に触ったようなのでスマン
RPGなどの、キーを1回押したら次のマスまで移動するようなゲームの衝突判定は
自キャラの位置と壁の位置を二次元配列で管理できるので作れるのですが、
アクションゲームのように、キーを1回押したら数ピクセルしか進まないような
ゲームの場合、マップチップエディタでマップを作った場合、衝突判定はどうするのでしょうか?
衝突判定は、全部が計算で出る。 二次元配列で管理と同じ。
>>593 ソース見てみないと分からんけど、今まで1対1で対応するような当たり判定しかやってなかったので
そのままでは応用が効かないって話じゃない?
>>592 こういう場合に昼用となるのは、ある範囲とある範囲同士が、
座標上で重なっているかどうかをチェックする、という処理が必要となる。
少し前にも似たような話題があったが、
まず1次元上で、線分Aと線分Bが重なっているかどうかを判定する処理を考えてみよう。
+---- A ----+
0----------------------------------------X
+-------- B --------+
答えを言ってしまうが、Aの右端がBの左端より右側」にあり、Bの左端がAの右端より左側にあるとき
線分AとBは重なってると言えるのが分かる。
これで少なくともX軸から見た時に重なって見えるかどうかを判定することが出来る。
じゃあこれをもう一度、Y軸に対してやれば、結果として重なってるかどうか分かると思わないかい?
一応、この判定には欠点があったりするけど、そのへんは詳しい諸兄に任せる
592の質問ってそういうレベルの話なのか。
もっと複雑な話かと思った。
マップチップでブロック単位(要するに矩形判定のみ)しかしないんだったら
593の言うとおり2次元配列管理でいいんじゃないかな。
座標をマップチップのサイズ(ピクセル)で割れば配列の座標は出る。(小数点以下切り捨て)
たとえばマップチップのサイズが 16*16 でマップデータが二次元配列に格納されてるとしたら
(100,150) の部分は二次元配列でいう (6,9) の部分という事になる。
あとはRPGなどと同じように衝突判定すればいい。
>>593-595 ありがとうございます!
>座標をマップチップのサイズ(ピクセル)で割れば配列の座標は出る
この考えが欠けてました。言われれば当たり前のことなのに1人で悩んでると全然思い浮かばない(´・ω・`)
597 :
594:2014/04/28(月) 01:02:00.85 ID:BBr+Jrn/
それだけだと自キャラがどのチップ上にいるかしかわからんから
壁と自キャラが重ならないようにするにはちょっと工夫いるんじゃない?
例えば自キャラの上下左右全部で衝突判定するとか
そんな必要ないよ。
自分の位置より進行方向1ブロック分をチェックして障害物なら動かなくすればいいだけ。
ああ、いや違った。
上と左に関しては進行方向1ピクセル分だった。
>>530-536 大昔にタスクシステムスレだったかSTGスレだったかにこんな感じのソース
(微妙に違うかもだが)を貼ったが、別にゴチャゴチャ言われなかったけどな
因みに同人STG
int APIENTRY _tWinMain(HINSTANCE,HINSTANCE,LPTSTR,int)
{
try{
boost::shared_ptr<GAMEENV> gameenv(new GAMEENV); //D3D,SOUND,INPUT,USERDATA,etc
boost::scoped_ptr<SCENE> logo(new LOGO(gameenv)); //ロゴ画面
boost::scoped_ptr<SCENE> demo(new DEMO(gameenv)); //デモ画面
boost::scoped_ptr<SCENE> title(new TITLE(gameenv)); //タイトル画面
boost::scoped_ptr<SCENE> config(new CONFIG(gameenv)); //コンフィグ画面
boost::scoped_ptr<SCENE> stage1(new STAGE1(gameenv)); //ステージ1
(…中略…)
boost::scoped_ptr<SCENE> stage8(new STAGE8(gameenv)); //ステージ8
boost::scoped_ptr<SCENE> ending(new ENDING(gameenv)); //エンディング
logo->Run(); //ロゴ画面再生
while(1){
demo->Run(); //デモ画面再生
switch(title->Run()){ //タイトル画面再生
case TITLEOPTIONTYPE_CONFIG: //オプション画面再生
config->Run();break;
case TITLEOPTIONTYPE_GAMESTART //ゲームスタート
do{
if(stage1->Run() == STAGESELECTTYPE_GAMEOVER)break;
(…中略…)
if(stage8->Run() == STAGESELECTTYPE_GAMEOVER)break;
ending->Run(); //エンディング画面再生
}while(0);break;
}
}
}catch(...){return EXIT_FAILURE;}
return EXIT_SUCCESS;
}
こりゃStateパターンを使えていない時点でゴミっすわ。
バカが書いたコードだと一目で分かる。
面接でこれ持ってきた奴がいたら不採用…と言いたいけど
この程度のバカが偏差値65クラスなわけで
次頭があれば徹底的に叩きなおすことを前提で採用、ってなるレベル。
それでも俺は、自らコードを曝け出した事に対して尊敬するね。
批判だけなら誰でも出来る
>>608 あー、それわかる!
高専生感がぷんぷん臭う。
俺の職場は理系院生が採用の中心だから
君のコード見ると偏差値70以下!って判定を下しちゃうんだよね…。
どうか心安らかな日々を
んー別にいいんじゃね?
大してシーンも多くないゲームなら充分充分
パターンとかはもっと規模が大きくなって
制御構文使ってたら死ぬ時に使う物だと思うのだが
ということで誰かstateとstrategyの違いを教えてくださいな
ググってもイマイチ腹に落ちなくてなあ…
高専生感というとても具体的な指標
これが偏差値70以上の力だと言うのか・・・
これdemo->Run()の中に別のゲームループがあるって事になるんだろ。
つまり
>>528って事だろ。
ところでupdate()とdraw()に分けないのかな。
コンテンツロスト時の再描画とか、各シーンで個別に実装とかだるいっしょ。
>>611 当時のソースは実家のPCに眠ってるのでうろ覚えなんですが、D3D9などの
デバイスロスト時の対応などはGAMEENVクラスに押し付けてました
描画と、ゲーム内時間発展のサイクルは独立。フレームスキップしてました。
描画は60⇔30⇔15[fps]の半固定。
時間発展の刻み幅は1/60[sec]固定。シミュレーション部分の計算自体は
とても軽かったので。あとはリプレイデータの都合。デバッグ時の巻き戻し
や早送り(任意時点へ移動)してたので
>>611 >これdemo->Run()の中に別のゲームループがあるって事になるんだろ。
>つまり
>>528って事だろ。
それぞれにゲーム内の時間発展を計算するサイクルがありましたね。
そういう意味ならそうなんだと思います。ゲーム固有の定石とやらは
よく知りません
配信でコーディングしてる現役ゲームプログラマさんの仰っていた序列表貼っておきますね
神様 綺麗なコードで完成させられる人
人間 汚いコードで完成させられる人
=================( 越えられない壁 )====================
家畜 汚いコードで完成させられない人
ハエ 綺麗なコードで完成させられない人
ハエに出来るのは人間の邪魔だけと言っていて、なるほどなとリスナー達感心しきりでした。
ID:T7NavjR1見ててこの事思い出しましたね
自分は
std::unique_ptr<Scene> scene = new なんかのシーン();
while(1){
scene->update();
scene->draw();
if( scene->isEnd() ) {
scene = std::move(scene->getNext());
}
}
ってやってそれぞれのシーンが次の遷移先返すようにしました
switchを意地でも使いたくてこんな形になった
実際switchの方がよく使われるものなの?サンプル探してもswitch使っているのしか見当たらないから困ってる
>>615 多分だけど、
if(関数に分けずそのまま羅列) → if(関数分け) → switch → stateパターン
……みたいに進化していくんだと思う。
単に自分がそういう順番でステップアップしたってだけなんだけどさ。
仮に自分が教えるなら、stateパターンによるシーン遷移は後回しにするかな
ああそうだ思い出した。
シーン遷移をStateパターンで行う方法についてなんだけど、「シーン遷移しないとき」って、どうしてる?
(1) nullを返す
(2) thisを返す
(3) シーン遷移関数を用意しておき、それが呼ばれなかったとき
(4) その他
自分は(2)で、nullを返すときはゲーム終了ってことにしてる。
一般的なStateパターンなら(1)かなあ。
>>612-613 なるほどthx. sceneの引数でgameenv貰ってるね。
シーン遷移の実装はシーン側は知る必要ないから、
その時の気分とかシーンの数とかで好きにやりゃいいと思うけどね。
Task的に入り組んだ作りしてないのなら、どれでもすぐ遷移図を思い描けるっしょ。
>>616 曰く、
「クラス設計書貰うけど見ない。クラス流用して他のゲーム作ったことがないから意味がない」
「デザインパターン?何それ?」
「参考書は読んだことがないからオススメ本とか分かんない。ネットと、エラーが出たらググレカスで覚えた」
PSでほとんど1人でプログラム任される人の弁です
>>620 すげぇ
俺そんなこと言ったことないけど、完全に俺だわ
ただ、作ってたのはPSじゃねぇけど
>>620 その人、協調性が無いから、単独でしか使い道が無い。
人事を何とかしないとうちの会社はやばい
ゲー専卒で多少のコミュニケーションはできれば入れてる感じがする
8人中2人もう辞めてるし、てかそれ以前にDXライブラリをインクルードディレクトリへの追加方法わからねぇわ、プログラムが組めねぇわで最悪だわ
1人だけまともというかたぶん俺より組める奴居るけど
うちは研修する余裕なんてねぇってわかってんだろうが、去年入ったやつなんてもう最後の1人を何とか留まらせてるんだから、俺らに人事噛ませろよ
PSでググレカスてどんな時代?
一昔前の1500円のミニゲーム移植とかの人てことなんだろうか
従来の手続き型で何本もゲーム作ってきた俺だが
いっちょオブジェクト指向でも勉強するか、とやり始めた結果
もうずっと制作が滞ったままになっている。
なんでこんなにめんどくさいんだ……。
サッカー上手い人がサッカーの技術書読んでうまくなるわけもないし、そういう感覚なんかな。
本読まずにPG覚えるとか想像もつかねえw
本は解るようになってから読むと解るけど、解らないうちに読んでも解らないからなw
そもそも本を書くような人は「本を読んだら解る人」だろうから、
本を読んでも解らない人でも解るような本を書けないだろうな。
ビギナーコラムでオブジェクト指向の哲学とか語られてもな
とりあえず作ってみよう系のほうが理解しやすい
ここを弄ったらこう変わるみたいな
c++だけがoopじゃないっすから…
>>628 だいぶ使いこなせるようになっても読めない初心者向けの本とかあるから性質が悪い
ゲーム用だけじゃないが初心者の頃はコードがのっててサンプルが作りたい物に近いから買ってみるけど…
Cマガも半分ぐらいしか理解できなかったがいま読み返すと消えてる技術も多くて笑える
ゲーム系の学生なんだけど、ゲーム会社ってどのくらいのレベルのオブジェクト指向まで要求されるの?
あと、AIとかそういうアルゴリズムも重視される?
>>632 ぶっちゃけ会社によって様々だからうちの会社で書くけど
新卒には特別な期待はしない
とりあえず、プログラムを作れれば良いや、ゲームまで作れたら儲け物って感じだな
後はただ、人間として基本的なことはできてればそれだけで良い
俺は現場だからこういうのを求めてるけど、人事は即戦力のゲームプログラマーとしてプログラムを作れないやつを入れてくるから何を見てるか同じ会社なのにわからん
とりあえず残業させてないのに毎年1ヶ月以内に1人、3ヶ月以内に半分になる新卒はゲーム作る気がないよね
マ板でやれ。な
>>621 スーパープログラマさんかな?w
他の配信者も有名な人だよって言ってたし、多分在京で働いてる業界人なら知ってる人ですよ。
ちなみに、よくプログラマになるにはどうしたらいい?という初見リスナーのレスあるけど
「C++とDirectX(ライブラリ自作)で『完成した』作品を持ってこい」と言ってますね。
本人もデザインパターンを配信中にググって知ったみたいだし
オブジェクト指向とか関係ないんじゃないかと。とにかく完成品をよこせと。
Q 漫画家になるにはどうしたらいいですが?
A 漫画を描けば漫画家です
プロになりたければ作った作品を持ち込んでください
Q ゲームプログラマになるにはどうしたらいいですか?
A ゲームを作ればゲームプログラマです
プロになりたければ作品を持ち込んでください
>>636 これ
でも、自分じゃなくて友人が作ったやつを持ち込むクソも居る
スレ違いの話題振る質問者は不採用です
くだらないループ話を延々続けてる馬鹿に飽きていたからいい暇つぶしになったw
>>609 >制御構文使ってたら死ぬ時に使う物
>>615 >実際switchの方がよく使われるものなの?
>>619 >シーン遷移の実装はシーン側は知る必要ないから、
>その時の気分とかシーンの数とかで好きにやりゃいいと思うけどね。
>
>Task的に入り組んだ作りしてないのなら、どれでもすぐ遷移図を思い描けるっしょ。
同意です。実装の選択肢は色々あり、個々の状況に応じて選べば良い事かと。
>>602-603の例で言えば、振る舞い的に拡張する予定がなく、実際しなかった
部分なので別に問題なかったですね
元々HSP上がりの人間(周りも同様)だったので手続き型の記述のほうが平易
というのもありました
>>617 State Pattern
switch-case構文
>>635 何年か前に、画像表示、パッド入力、音声出力くらいまでは何とか作ったけど
途中で面倒くさくなって、結局DXライブラリに戻ってしまったという残念な経験しかないやw
>>619 会社帰りにたまにボー●ーブ●イクでチャリンチャリンしてたんですが
転勤先にそれ置いてるゲーセンがなくて悲しみのあまり余暇にパチモン
作りで自分を慰めてるんですが、火器とかAIの部分はStateというかStrategy
というかそんな感じのコードはありますね。条件分岐でダラダラ書いてたら
流石に眩暈がしてきたので
何を言いたいのかサッパリ分からん
>>643 パーツとか持ち替えの武器とか大量にあると面倒くさいことになるよね
あの手のアセンゲーっぽいのは俺も好きだが作りたいとは思わないな
つまらない流れなので誰かネタ振りお願いします><
初心者な質問ですみません。
クラスからクラスを呼ぶときってどういう書き方が普通なんですかね?
class A {
public :
static A* me ;
int a ;
A() ;
}
A* A::me ;
A::A() {
me = this ;
}
ってやって A::me->a とかやってるけど、なんかスマートじゃなくて……。
なにがしたいのかさっぱりわからんけど、それmeにインスタンス入れてるだけであんまり意味なくない?
クラスからメソッド直接使いたいとかなら、メソッドをstaticで定義してクラス名::メソッド名()だけど
グローバル変数みたいなことがしたいのかな
アクセス可能なオブジェクトを限定するのがオブジェクト指向の組み方だから
アクセスする必要があるクラスにポインタなり参照なり持たせたほうが良いんじゃない
日本語不自由で変な質問するやつはほっといたほうがいいよ
staticメンバの初期化の仕方の話でねーのん。
最近c++触ってないから間違ってたらすまんけど。
// A.h
class A {
public:
static int a;
}
// A.cpp
int A::a = 10; // 初期化
// main.cpp
void main() {
A::a; // 利用
}
3Dゲームで経路探索をやってみようと思うんだけど、3Dの位置情報ってどうやって調べればいいの?
具体的には?
基本的に平面で移動するゲームなら2Dと大して変わらんしだろうし
キューブ状の座標(2Dで言うところのマス目)を移動するだけなら、移動方向に上下という選択肢が増えただけと考えられるし
ビルの中を探索するようなゲームなら、階段やエレベータでエリアを区切ればいい気がする。
何が聞きたいのかさっぱりわからんけど、普通に変数参照すればいいんじゃない?
複雑な地形での経路探索がわからんって話なら、地形の要点にポイント作ってダイクストラ法でいいんじゃないの
ごめんダイクストラ法じゃなくてA*か
>>655 A*はダイクストラの拡張版で、基本アルゴリズムは重複する部分が大きいから、
大筋外してはいないよ
ゲーム用途の経路探索性能は、A*の方がより最適化されるみたいだけど
647です。皆さん色々すみません。
やりたかったのは、例えばコンフィグデータを一括管理するクラスを作って
他のクラスでそれを使う、ような事です。
例として挙げたソースは簡単に書いただけで直接書き換えたいというわけではありませんでした。
関係ない愚痴ですが、こうやれば動くからこれでいいのかな、と作り進めてても
やっぱりおかしいよな、とまた一から作り直す、を繰り返してて制作が全く進みません……。
660 :
名前は開発中のものです。:2014/05/01(木) 03:51:25.76 ID:jedbV3SH
唯一のインスタンスを保証するシングルトンではなく、
インスタンスは複数作れるけど、実体は同じものを作っている……っていうアルゴリズムあったよね。
>659の場合だと、その方法使えそうな気がするものの……名前が分からんので教えられん
>>659 そんなのグローバル変数でいいだろ
つまんないとこで止まってないで先進めよ
インクルードガードとexternでおk
>>664 ダイクストラ法は大学数学関係ないぞ
Game Coding Gemsの1か2に解説とソースコードがある
>>664 図のアニメーションと解説を読めば分かると思うが…
難解な数学計算無し。少なくとも高校数学の域は逸脱してない。
記号の意味分からない子向けに手続きを文章で丁寧に解説してる。
下手すりゃ厨房でも「コンピュータってバカ正直な事なんだね…」
と感想を述べながら呆れ顔をしてくるレベル
×「コンピュータってバカ正直な事なんだね…」
○「コンピュータってバカ正直な事をやるんだね…」
「馬鹿正直」って感想はさ、たぶんコンピュータへの理解の第一歩だよね?
そうなんじゃない?学園祭でマイクロマウスの実演と解説をしてた時の消防や
厨房の反応は楽しかったよ。「かあいい」「頭悪過ぎうー」「きゃはは」
「がんばれー」とかが大半だったけど、眼鏡っ子の厨房が模造紙の解説を
一所懸命に読んでて、繰り出す質問がなかなか賢すぎてこっちが呆れた
メンバ変数が全部staticのパターンの名前が思い出せない
モノトーンだかそんなような名前だった覚えがあるけど
monostateじゃね
使ったことないが
シングルトン モノステート
皆さんは描画リストに登録して、Zソートやらしてからとめて描画などしてますか?
2Dで同じようなことを考えてるのですが、描画管理クラスにリストを持たせ、
その管理クラスのメソッドを通してリストへ登録しようとしてます
XNAのSpriteBatchの形が近いです
しかしこの方法だと管理クラスを引数でどんどん渡していかなければいけなく、良い方法がないか探してます
2Dオブジェクトにstaticで管理クラス、または描画リストを持たせた方がいいのでしょうか
設計の話なので明確な答えがないのはわかってます
皆さんの考えを参考程度に聞きたいです
スプライト的な「2Dオブジェクト」を作って、
そこにパラメータ与えて、あとは自動的に描画されるような組み方してるん?
>>674 >しかしこの方法だと管理クラスを引数でどんどん渡していかなければいけなく、良い方法がないか探してます
依存性があるなら明示する(例えばSetterやコンストラクタで注入するだとか)
というのはOO的には無難なお作法だと思うけど。なんか不都合あるの?
(いちいち記述するのがかったるい、だとか)
まぁ、あまりに広範に渡ってその依存性が確認されるなら、グローバルな
存在、グローバルなサービス、として提供してもいいのでは。尤も、描画
モジュールに依存するモジュールってゲームの中では限定的だと思うけどね
表示するもの {
private IDrawable model;
private Vector2 pos;
private 表示するもの[] children;
public void Draw(描画管理クラス){
描画管理クラス.add(model,pos);
for child in child {
child.draw(管理クラス);
}
}
}
ダイクストラ法ってゴールをコロコロ変える(プレイヤーを追いかける)ことって出来る?
たとえば屋内を探索するゲームの場合、
ある部屋から別のある部屋へ行く方法ってのは基本的に固定なので、最初に各パターンを計算しておけばいい。
上手く追いかけるように動かしたいってことなら、
有名なところで、パックマンの敵アルゴリズムの話がシンプルでわかりやすいと思う。
自キャラの範囲と、敵の範囲と、とりあえず目指すポイント
みたいな表を作っておけば良いのか
>>675 2Dオブジェクトは座標、テクスチャを持ち、描画関数内で管理クラスのリストへ登録
という流れを考えてますので、自動的な描画はしません
>>676 やはりプログラムの最初にsetterで登録が一番無難ですよね
不都合はないのですが、2Dオブジェクト全てが
管理クラスのsetterを持つのが気持ち悪く思えてしまい・・・
描画モジュールに依存するものが限定的とは...ゲーム内では殆どのものが
描画されるものだと思ってましたが違うのでしょうか
オブジェクトを管理したりするものは別だと思いますが・・・
>>677 これは結局引数でどんどん渡していくのでは・・・?
>>681 引数で渡していっていいと思う
常に同じ描画管理クラス使うとは限らないし
>>681 何故「気持ち悪い」のか言葉で説明できるようにしてみれば
どうすればいいのかわかるんじゃない?
リストへの登録を描画関数と分ければ?
登録するデータを戻り値にして呼び出し側で登録するとか
>>682 レンダーターゲットを変えた時などでしょうか
>>683 2Dオブジェクトは例えばスコアや、メニューなどに使用するのに
管理クラスのsetterを常に持ち続けてるから・・・?
>>684 list.add(pObj->draw()); という感じですか?
この場合複数のオブジェクトを描画する時はどうなるんでしょう
スコアクラスは1桁描画を複数回呼ぶと思います
そういう時は戻り値でデータを返せないのでは
結局引数で渡してリストへ登録
または2DObject自身がリストを保持し、そこへ各派生クラスが登録する
という形になってしまうのでしょうか
ゲームで2つのプレイヤーの画面を並べる時ってどうしてる?
プレイヤーの状態とかエフェクトとかシングルトンで管理していて今まではどこかのクラスから
Game::instance()->registerEffect(new Effect())
みたいにできたんだけどプレイヤーごとにGameを作るようにしたらこれができなくなって
ゲームのインスタンスをあちこちに渡さなきゃならなくなったんだけどこんなことしないでもできる方法ない?
話の流れがよくわからないんだけど、
renderer.add(PlayerObject); //プレイヤーキャラクターのオブジェクトを登録
renderer.add(EnemyObject); //敵キャラクターのオブジェクトを登録
…みたいなのとは全く別の話?
>>686 Gameクラスってなんじゃらほい?
いわゆるシーンとかシーケンスってやつ?
>686
シングルトンが用を足さない状態だからやめるのが手っ取り早いけど
とりあえずシングルトンインスタンスの取得にID等の引数もたせれば?
引数違いなら違うオブジェクトを返すてのは実装は容易でしょ
こういうどこでも使えるグローバル変数的な状況で使うシングルトンは嫌いだけどな
>>685 レンダリングターゲットを変えたときもあるかもしれないけど、
マルチスレッドで分割してトラバースするこもとあるし。
Direct3D11でコンテキストを複数作れるようになったしね
>>685 戻り値をVectorかなんかにしたら
>>686 instance()に引数渡して特定のインスタンス取得出来るようにする
これまでシングルトンだったのが複数必要になった時点で設計見直した方がいいような気もするけど
情報不足すぎたうえに色々酷いごめんよ
Effectは別で管理している
シングルトンをやめるからどうするのが良いのかと思って聞いたんだ
ダブルディスパッチで敵の当たった処理とかしているんだけど
class Game {
Enemy enemy[];
}
class Enemy {
void hit() {
if( 死んだ ) { Effect::addEffect(new Effect()); }
}
}
みたいにしててどのエフェクトを使うかはEnemy側で決めるようにしたいからこうなったんだけど
GameにEffectのインスタンス持たせてEnemyにそのインスタンスの参照なりなんなり渡して
if( 死んだ ) { effect->addEffect(new Effect()); }
とかしても良いんだけどなんかしっくりこないんで気になったのよ
>>688 そうなんだけど実際あんまり関係なかった・・・
>>689 うまい設計思いつかなかったんよね
その方法手っ取り早いし良さそうです
>>692 EnemyはどうしたってEffectへのポインタが欲しいわけで描画の関係からか複数存在してるとなると
初期化などでずっと持たせるのが嫌ならhitかそれ以上に位置するGameから呼ぶ関数に引数として渡すか
EnemyはGameクラスのポインタ位持ってるならGameのほうにAddEffect関数もたせてEnemyはそれを呼ぶか
スレッドセーフでない設計ならEffectポインタのグローバルか静的関数なGetterとSetter用意して
GameオブジェクトごとにEnemy更新前にSetterでGetterの戻り値となるポインタを入れ替え…止めた方がいいな
実際のコードでは、Effectクラスから派生した HitEffect とか DeadEffect とかを
Enemy内から呼んでるんだよね?
GameがEnemyを管理するんだったらEnemyに
エフェクト番号とフラグを持たせれば良いんじゃない
>>687 そんな感じです
ですがそのrendererを渡そうか悩んでます
引数ですとかなり深い(?)ところまで渡す必要があるのではないかという感じです
>>690 引数で渡した方が自由が利きますね
めんどくささと柔軟性のどっちをとるかみたいな感じでしょうか
>>691 座標、テクスチャ、UV、色などのことを考えるとVectorかなんかだときつそうです
とりあえず引数で渡す方向で作ってみたいと思います
オブジェクト指向難しいです...
ああ、文章にミスが
>>696 rendererを渡そうか×
rendererをどう渡そうか○
です
ヒープ領域のオブジェクトを参照で引数で渡したい時ってどういう風に書けばいいの?
普通に参照渡しするだけだよ
void f(A &a);
A *a = new A();
f(*a);
こんな感じゃない
参照って殆ど使った事ないからあってるかどうかわからんけど
「ゲームプログラマになる前に覚えておきたい技術」
という本がオススメと言われたんですが、これ持ってる人いませんか?
役に立つ度合いとかアドバイスしてもらえたら嬉しいです
>>693 やっぱりそれぞれが持つしかありませんかねえ
呼び出し元をparentとかして持たせておくのって普通にやっていることなんですか?
この場合だとEnemy::parentにGameへの参照か何かを持たせるとか
>>694 はいそうです
重いので持ち運びには向かない、かな
>>703 各クラスがどのエフェクトを使うのか?というのをハッキリさせておいて
必要なものだけインクルードするようにすれば、そこまで気持ち悪いことにはならないんじゃないだろうか。
たとえばEnemyクラスは、Effect::GettingItem(アイテム獲得)とかEffect::PlayerDead(プレイヤー死亡)は不要だろう。
それすら気持ち悪いと思うなら(分からんでもない)、
ObserverとかListenerとかCallbackとかその辺に頼るとかでも良いんじゃない?
>>700 参照引数は「読むだけ」を意図してる場合が多いからconst付きが多いかな
>>703 >呼び出し元をparentとかして持たせておくのって普通にやっていることなんですか?
>この場合だとEnemy::parentにGameへの参照か何かを持たせるとか
その疑問は
>>674-696のやり取りと同じ話っぽいね、俺も
>>704-705に同意かな。
依存関係を明示すると違和感を覚えたり気持ち悪くなるのは、大抵の場合
依存関係の認識(or分析)が大雑把。依存関係を明示するとそれが露見しちゃう。
機能分割が大雑把。依存関係を詳細に分析すると広範に絡み合ってて一体でした。
とか。Gameへの参照は、恐らく要らん情報にアクセスする権利も与えてるから
依存関係の明示というより、広範に渡る権力へのアクセス権の譲渡なのかな?
君はこの世界に神になる。俺はいいと思うけどね。というか、はなっから
グローバルなサービスとして提供してしてもいいかもね。完成させてから
リファクタリングしたほうがいい
個人的な短期小規模開発(作り捨て)なら別に問題ない。完成と反省のサイクルよ
具体的なEnemyなんてアプリ層なんだから泥臭くていいと思うのだが。
すまん、>704はセガ本が物理的に重いって話のつもりだったんだ
まあ大概のゲームプログラミング本は重いよね
電子版あるならそっちの方が捗りそうだ
描画クラスを作って描画用のインターフェイスを作る
描画されるクラスはインターフェイスを実装
描画クラスはそのインターフェイスをリスト管理し順番に描画
ゲームクラスはデータクラスと描画クラスを管理し
必要に応じてデータクラスを作り、描画クラスに登録
ゲームクラスが当たり判定をして、エフェクトクラスをnew、描画クラスに登録
て感じじゃ駄目なの
711 :
名前は開発中のものです。:2014/05/04(日) 18:09:40.60 ID:Oce/sxqq
>>701 サンプルプログラムの修正版があるからそれ見て決めたら?
ちなみに独自のライブラリを使ってる
もし、新幹線できたらな
飛行機乗客が減り、飛行場が苦労する
バス乗客が減り、高速道路が苦労する
結果的に、四国地方の経営破たん
ポインタに構造体を持たせる場合ってきちんとスマートポインタを使った方がいいの?
>>711 独自ライブラリですかー・・・
ありがとう。ちょっとどっかで立ち読み出来るまでは買い控えます。
そのスレ、ちょっと見たけど罵りばっかじゃないかw
x64の64bitビルドでのループ変数とかメンバ変数てint,unsigned intとsize_tどっちが最適なの?
DirectXのAPIが32bit幅なのにSTLは64bitみたいに混在してて決め打ちしにくいんだけど
インデックスとして毎回32bitを64bit拡張と変数を32bitにstatic_castと
タイプ量はともかく実行時に効率いいほうにしたい
>>716 報告しなくていい。そういう感想は彼らに直に言ってあげな。陰口より建設的だろ
はい、次の方どうぞ
>>718 そんな非建設的な事実上機能していないスレに誘導してどうするんだって事だよ。
はい、次の方どうぞ。
>>717 例えばループ変数については普通にint使ってるな
参考までに、科学計算系のライブラリでもそんな感じだったと思うよ
計算速度云々が問題になる場合、気にかける場所はもっと別の所かと
32bit環境でもint iをbyte iとかshort iにはしない
あとむやみにunsignedにするとsignedにunsigned加算して警告でたり面倒のもと
ローカル変数がautoばかりになってしまうんだけど意図的な型だけ除外しておけば問題ないよね?
constもメンバ関数含めて相当あるけど
人間がソースコードを読んだときに
「型が明らかである場合か、あるいは逆に全く意識してほしくない場合にのみ使う……とかにしておけば?
ローカル変数にauto使うメリットってある?
イテレータの型書くの面倒くさい、位しか思いつかない
十分じゃないか
型推論って引数に使ったら勝手にオーバーロードしてくれるんだと思ってたんだが、引数とか戻り値には使えないんだな
iteratorの記述を省略するための機能か
そういう用途にはテンプレート関数があるしね
>>725 個人的にはイテレータを簡単に書けるメリットが一番大きいと思ってるが
それ以外で使うとしたら
auto f = new Foo(); //Foo型なのは明らか
とか
//交換
auto tmp = a; //型は明らかではないが意識する必要がない
a = b;
b = tmp;
とかかなあ。
後者は素直にtemplate関数にでも投げたほうが良さそうだけどね
配列に入ってる複数の要素のうちの一つをポインタに持たせる場合って、スタックのアドレスをポインタに持たせても大丈夫?
const T& f();
void g()
{
auto t= f();
}
ってすると t は const T& 型になると思ってたけど
実はただの T 型でコピーコンストラクタでひどいことになったことあります
733 :
名前は開発中のものです。:2014/05/11(日) 18:46:58.77 ID:8qR2WxrE
#include "define/MoneyType.h"
int money[MoneyType.SIZE];
こういう宣言の仕方って出来ないの?
MoneyTypeはenumで
enum MoneyType {
GOLD,
DIA,
SIZE
};
enumはC++11で整数としてあつかえなくなったってwikiに書いてあった気がする
っていうかその使い方わかりにくいしやめた方が
訂正
static_castでキャストすればいけるっぽい
GOLD,DIA,SIZEって何かと思ったけど、もしかしてお金の単位なのかな?
MoneyType::SIZEかな?
ただこれだと再定義のエラーが前出たような気がする
>>733 enum class MoneyType:int
{
GOLD,
DIA,
SIZE
};
int money[ MoneyType::Size ];
適当に書いちゃったけど何をしようとしてるのかいまいち理解出来ないw
enumの要素数を静的に得たいんでしょ
将来お金の種類増えるかもしれないとか
配列使うぐらいならvectorにしとけとも思うが
構造体じゃいかんのか
実際に使うの想像してこうなった。
例えば複数の種類のお金で買えるショップ機能を作りたい場合、
ショップ側でMoneyTypeという型と整数を持っておけば、処理が楽かなと思ったんだけど
つまり>740が正解っぽい?
ゲームで何時でも何処でも参照、代入できるデータって一般的にどうやって管理してます?
(例えば主人公のデータとか色々な場面で使いそうなもの)
今まで単純にデータクラスの中に静的メンバ変数で定義してグローバル的にやってたけど、
たまたまシングルトンで管理してるソースを見つけて、色々あるのかなって思った
シングルトンは嫌だからゲームマネージャークラス作ってそこにプレイヤーデータのポインタ持たせたりしてるけど、どうなんだろう??
3Dゲームでカメラを遅らせて動かす場合って角度を線形補間してベクトルにしてる?
それともクォータニオンで球面線形補間してる?
>>745 グローバル変数は可能な限り減らす、という理念の上でやってるなら、
それは実に正しい手法だと思うよ
グローバル変数使いまくりの俺だが、グローバル変数は使わない方がいいと言われて
その方向でプログラム書き直したところ、手間の物凄く増えて辟易。
やり方を間違ってるんじゃないか感が半端ない。
あるプログラム本に「JAVAなんかは誰が組んでも似たようなものになるが、
C++プログラムは人によってまるで違ってくる」とあったが本当みたいね。
本や解説サイトによって、サンプルがかなり違ってるようで混乱しまくるわ。
グローバル変数どうのこうのは保険をかけるためのもので手間を減らすものではないから仕方ないね
グローバル変数使わずにやろうとすると関数の引数が複雑になりがちだからな
一人で作ってるコンパクトなプログラムくらいだったら使いまくりでいいと思うわ
グローバル変数は初期化の順序が問題になる
複数のソースコードのあちこちに点在してるとそれが顕著になり
グローバル変数がクラスで依存関係があると動作保証が難しい
せめて組み込み型以外はポインタ型にして初期化の順序を決めちゃうのが安全
753 :
名前は開発中のものです。:2014/05/13(火) 11:22:50.82 ID:i7OBK+99
>>738 'MoneyType' is not a class or namespace
ってでる
visualstudio2010だと出来たと思うんだけど、
Eclipse4.3だと出来ない
C++のバージョンによってなんか変わったのかな
>>753 enum classはC++/CLIだからだろ
Cにそんな構文はない
俺はC++には詳しくないけど実はあるのかな
C++11から入った構文
グローバル変数はこう書けば良いんじゃね
使うところでだけglobal.hをインクルードしてさ
grobal.cpp
int a;
groubal.h
#ifndef _GLOBAL_H_
#define _GLOBAL_H_
extern int a;
#endif
>>756 わざわざ識別子を _ で始めるなんて沸いてるんじゃない?
是非はともかく、よく見かけるけどな
アンダーバー始まりは処理系予約とかじゃ無かったっけ
慣習的に
>>760 まじかよ
学校でこう習ったよ
何でそんな書き方教えるんだよ
まぁ開発はVSだから#pragma onceしか書かないから知らんかっただけっすけどね・・・
>>761 gccでもいつの間にかpragma once使えたりするんだよな
あれ、サッサと標準仕様に盛り込めばいいのになと思うよ
だいたいのコンパイラが対応してるみたいだしデファクトスタンダードってところ
効率的には#pragma onceの方がいいと聞いたことはあるが
IDEによるかもしれん
単純なi nclde guard は力技の処理だけど
pragma once は処理系次第で最適化されてるからね。
複数のプラットフォームを想定するなら
安全策をとって両方記述するのがオススメ。
pragma once があれば効率的に処理してくれるかもしれないし、
もしpragma once を理解できない処理系でも
inlude guardは必ず処理してくれるからね。
VC++に#pragma onceが入ってすぐの頃は
自動生成したヘッダには#pragma onceと#ifndef-define-endifが
コンパイラバージョンによって自動で切り替わるように書かれてたと記憶している
その辺から考えても、両方書くのは無駄じゃない
std::mapにenumとかstructを使いたいんだけど
template argument 4 is invalidっていうエラーが出ます
具体的には
map<アイテムID(enum型),アイテムパラメータ(struct型)> aaaaa;
って感じです。
パラメータっていうのはその名の通りアイテムを装備するとstructのメンバの
addHPとかaddMPっていう変数の分だけ上昇する感じで、
使い方はプレイヤーはアイテムIDだけ持っておけば、あとは必要な時々で値だけ取得できるかなという感じです。
enum itemID{ID1=0, ID2, ID3, ID4};
struct itemParam{int p1; int p2;};
itemParam param;
map<itemID, itemParam> m;
m.insert(make_pair(itemID::ID1, param));
こんな感じで動かない?
>>769 比較関数がないって怒られてるんじゃね
一つ目の型を enum型じゃなくて int に変更するわけにはいかないの?
そもそもそれmapにする意味あるのか?
>>733みたいな感じで配列で十分な気がするんだけど
map だと必要な分だけ使えるじゃん
0〜 イベントアイテム
10000〜 武器
20000〜 鎧
みたいに
enum使うなら10000から武器みたいな区分けがそもそも必要ないと思うんだけど
>>770 enumの最初を0と明示するだけで変わるんです?
変わらないですよ。試せばすぐ分かりますけど、ム板のスレに誘導されたいです?
普通に動くよね
コンパイラのバージョンとかで古いのだと駄目なのかな
実は全然違うところでエラー出てるんじゃないの
ナビメッシュのやり方が書いてある本とかサイトとかってある?
> とかってある?
ありますよ
navigation mesh pathfinding algorithm game waypoint graph search
など適当なキーワードでググるといいです。動画によるアルゴリズムの
解説も出てきますね。書籍ならAI Game Programming Wisdom 4 が
個人的にオススメです
そういうのって概要だけ聞いて自分で考えて作った方が早くない?
サンプルコードみても理解するのに時間がかかるわ
ゲームプログラミング本といえばGameProgrammingGemsシリーズなんだかな
最近の若者は読まないのか
現代の技術の世界において
英語が読めないのは脳が半分無いのと同じ。
それだけのこと。
翻訳したやつ読めば
英語読めてもソースコード読めなかったりするし
プログラムは勉強したところでコード書けないのが大半らしいな
元々作文が下手とかそういう次元ではなく理解できないとか
そもそも日本語で書いてあるプログラム解説書だって意味わかんないよw
>>785 半年遅れで付いていく人間は残念ながら奴隷で終わるよw
英語ができて最先端に追従する奴、ときには自分が最先端を発信する奴に
「あ、こいつバカだなww」と思われながら生きる惨めな三流人生が待っている。
それで良ければ英語なんて学ぶ必要はない。
まぁ、普通は(普通の知性の持ち主は、という意味)
修士課程で英語の論文を死ぬほど読んで
「喋れないけど読める」という妙な英語力を身につけられるんだけどねw
相変わらず病んでますね
とりあえずナビメッシュのやり方教えて
780の人ですか?
具体的に何をやってみてどこでつまずいてるのか話せば答えやすくなるかと
オクツリーに障害物を表示させたいんだけど、オクツリーのある場所がどの座標なのかを調べる方法ってある?
795 :
名前は開発中のものです。:2014/05/19(月) 04:39:02.31 ID:XNC2jE/Y
この入門?みたいなサイトで勉強してたんだけどつまづいたので分かる方いたら教えてください
http://bituse.info/game/shot/11 for(int i=0;i<ENEMY_NUM;++i){
enemy[i]=new ENEMY(data[i].type,data[i].stype,data[i].m_pattern,data[i].s_pattern,data[i].in_time,data[i].stop_time,data[i].shot_time,data[i].out_time,data[i].x,data[i].y,data[i].speed,data[i].hp,data[i].item);
}
↑この文の enemy[i]=new ENEMYのイコールのところでオペランドと一致する演算子なんてねぇよって怒られます
原因として考えられるものってなんでしょうか?
for(int i=0;i<ENEMY_NUM;++i){
enemy = new ENEMY[i](省略);
}
だったらいけるみたいなんですけど、違いがよくわからないです・・・
enemyの型がポインタの配列になってないんじゃないの
こうかな
正:ENEMY *enemy[ ENEMY_NUM ];
誤:ENEMY *enemy;
サイトを見ると省かれてるみたいだけど
敵を複数出すようにした時点で enemy を配列に変更しないといけない
これコンストラクタの引数なんで構造体の参照渡しじゃないのか
無駄に読みにくいわ
799 :
795:2014/05/19(月) 11:33:54.01 ID:XNC2jE/Y
できました。
ご指摘の通り、enemyを配列にしたら無事にコンパイルできました。
ちょっと私にはわかりにくいサイトだったようなので別のところで勉強してみます・・・
800 :
795:2014/05/19(月) 11:34:28.24 ID:XNC2jE/Y
お礼を忘れていました
ご指摘ありがとうございました。
801 :
名前は開発中のものです。:2014/05/23(金) 00:32:00.04 ID:61iiZtPG
おらLAMPしか知らないんだけども
C++で作ったリアルタイムなネットワークゲームのオンラインサーバって
どういう環境で動いてんだべ?
ソシャゲならPHPでhttpでいいかもしんねけども、
ネトゲって実行ファイル動かし続けてんのかね
>>801 お前から感じるそのしったか臭は一体何なんだ?
>>802 そんなこと言っても知りたいってのは本当なんだけど
ていうかソシャゲってphpでhttp返してるって聞いたんだが違うのか
ソース3種類ぐらい別のところから聞いたからそうだと信じてたけど
804 :
名前は開発中のものです。:2014/05/24(土) 14:46:49.15 ID:+A5Yp2pd
テスト
805 :
名前は開発中のものです。:2014/05/24(土) 14:48:01.39 ID:+A5Yp2pd
ロールバックしたのか
スマートポインタ談義がすっぽり消えたなw
MMORPGの鯖はCかC++じゃないのか
普通はそうだな。
速度優先だし。
>>806 は国産とか意味不明のこと言ってるし。ソーシャルゲームのことだろ。
「普通はPHPとかPerlで作ったHTTPサーバ」
↑w
PSO2が80番ポートで通信してたら俺泣くかもしれんww
さあ僕の胸の中で思い切り泣くがいい
Perl懐かしすぎる。
卒論のためのプログラムをPerlで書いたんだよ。
「もしかして俺はアカデミズムの世界で生きられるほど賢くないのかもしれない」
そんな現実に気がつくころ、Perlも衰退を迎えてさ。
なんだか恥ずかしい青春の甘酸っぱい言語だよ。
>>812 一行一行、いちいち、ハテナ?と思わせる文章だな。
それが書けるのは
>>806とお前くらいだよ。
PerlはCGI以外のところで地味に生き残ってる印象があるな
それはさておき、サーバとクライアントとで同じ結果を出したいってときに、
Haxeを使ったってニュースなら見たことあるなあ
最終的に何言語になったかまでは覚えてないけど
まぁなんだかんだで最後に生き残るのはJavaScriptだろうな
サーバサイドのjavascriptって普及してんの?
webブラウザ用の言語として生き残ってく予感しかしないんだが
817 :
名前は開発中のものです。:2014/05/31(土) 10:36:34.27 ID:q6hYVMUh
これまで状態遷移管理をswitch一本でやってたけど、
とうとうネットワークグラフ型に対応したstate machineを導入した。
状態遷移表を作ってみて、当初想定していた状態遷移仕様の複雑さに驚いた!
Game programming gemsの1巻を参考に実装したけど、
一定フレーム(もしくは時間)後に、自動的に遷移させるってどうやるのがいいんだろ。
俺は時限イベント用の配列にイベントと発動時間(シーン開始からの時間)詰め込んで毎フレーム確認するようにしてる
>>818 レスthx
昔ドラゴンセイバーっていうゲームがあって、
射撃ボタンを押さずに放置すれば、溜め撃ちのエネルギーがたまって、十分にエネルギーがたまった状態で射撃ボタンを押すと、溜め撃ち弾発射っていう仕様があった。
この溜め撃ちを、有限状態機械的に表現すると、
・状態としては:「溜め撃ち不可能」「エネルギー溜め中」「溜め撃ち発射OK」「溜め撃ち発射中」
・入力としては:「射撃ボタン押し中」「射撃ボタン押さずに放置」
となって、
・「溜め撃ち不可能」状態で、「射撃ボタン押さずに放置」を入力すると、「ネルギー溜め中」状態になり、
・「ネルギー溜め中」状態で、さらに「射撃ボタン押さずに放置」を入力すると、そのまま「ネルギー溜め中」状態を維持して、
・「溜め撃ち発射OK」状態で、「射撃ボタン押し中」を入力すると、「溜め撃ち発射中」状態になる。
と適当に考えているんだけど、
問題は「ネルギー溜め中」状態から、「溜め撃ち発射OK」状態に遷移させるのはどうすればいいんだろう?
別途、「射撃ボタン押さずに放置(一定時間経過済み)」っていうFSM入力を新規に用意して、より上の層でタイマー管理して、入力を切り替えるのが良いのかな。
FSMとタイマーを融合させるいい方法はないかなあ。
遷移条件に最小連続入力回数を付け加えた上で、FSM入力の種類を増やして、連続入力回数もFSM入力させて、連続入力回数が、最小回数を上回っている場合だけ遷移させるとか・・・?
もしくは、そもそも上のFSMの定義がよろしくないのか・・・
それは状態遷移だけでやるのはきついんじゃないの
チャージ時間をパラメータとして持たせて不可から溜め中に遷移した時に初期化、ため中に放置で更新、一定値以上ならイベント起こしてOKの状態にする
みたいな感じじゃないとキツイ気がする
「現在の溜め量」の状態(数値)が不足してる気がする
822 :
名前は開発中のものです。:2014/06/07(土) 13:54:05.28 ID:TPPcHjY+
C++でゲーム作るからにはカプセル化してちゃんと画面ごとにデータを隠蔽してやりたいんだけど
そうするとシングルトンや画面間で共有する変数とか無いってことだよね?
画面切り替わるたびに毎回HDDにセーブしてロードしてるの?
オブジェクト指向っていうとそうなりそうなんだけど
抽象的な思考に慣れていない偏差値50〜60程度の層だと
見た目=下部構造なんだな。
そのことを疑いもしない。
65越えるとようやく会話が成立するのだが。
偏差値()
本当だ、会話が成立しないってのがよく分かる
もっとも会話自体する気無いように見えるけども
>>822 2行目の認識がちょっとずれてる気がする
シングルトンはオブジェクト指向プログラミングにおけるテクニックの一つだから
オブジェクト指向だとシングルトンが無い、なんてことにはならないと思う
共有したいデータは、複数の画面を管理するような寿命の長いインスタンスに入れておいて
各画面が都度アクセスするように作るかな、俺なら
プログラムって基本的に階層構造になってることが多いから、その上位階層で
下位階層で共有するデータを保持しておく、という感じで
>>825 それいちいち下位階層(各画面)のクラスに、共有データ保持クラスインスタンスへの参照メンバ変数を追加して、
さらにそれに参照を通すめのメンバ関数追加して、
場合によっては、そのメンバ関数を呼ぶタイミングに気を遣ったりと、面倒くさくない?
俺ならてっとり早くグローバル変数で解決だわw
しかし上記の様な構造が複数存在し得て、抽象化が迫られてるんだったら、
>>825の方法を取るかな
827 :
名前は開発中のものです。:2014/06/07(土) 16:19:22.33 ID:TPPcHjY+
>>823 これって俺に対して言ってるの?タイミング的にそうなんだろうけど
何言ってるのかさっぱりわからんこれが偏差値の壁か
65歳にならないと会話が通じないみたいだから、
まだまだずっと先の話なんじゃないか
かなわないよなwww
>>825-826 やっぱりメモリ上に保存するなら、共有したい階層の上で持つしかないよね
シングルトンはその最上位で必要以上の範囲で共有するから使うなって言われるのかな
>>829 「シングルトンを使うな」っていう人は
「グローバル変数は使うな」と言われる理由をよく理解しないで
さらにそれをシングルトンパターンまで勝手に拡大解釈してる人だと思って良いんじゃないかな
つまり聞き流しておk
でも結局シングルトンって使わなくてもいけるよね。
そうなると、あえて使おうとも思わなくなる。
シングルトンはオブジェクトがひとつしかないって事を保証してるのが本来の意図であって
グローバル変数的な使い方は副次的な物
って解釈なんだけど
一つしかないことを保証しないといけないものって大体入出力周りだけ?
多人数プレイをしないなら1つでいいんじゃないかな
あとはサウンド系だと思ってるけど
デバイス周り位しか思いつかない
あとは自分の作ったクラスを他人が使う時にオブジェクトがひとつなのを意識させない、とか
その場合はモノステートの方がいいかもしれんが
使い回しされるようなデータを何回も読み込まないようにシングルトンぽい記述したりすることがあるな
それをシングルトンと呼べるかどうかはわからんが
2DのUIでZ座標で描画の優先順位を決めてるんだけど
3D空間じゃないからわざわざレイ飛ばすより画像のインスタンス見て回ったほうが早いと思ったんだけど
UIリストへの挿入時にソートするべきなのか?
なんか正解というのがピンと来ない
UIならシーンの初期化の時に全部読み込むだろうし、その時にソートしとけばいいんじゃないの
そもそも2Dの優先順位の決定にレイを飛ばす理由が不明、
画像のインスタンスを見るというのも意味不明。
レイ撃ってヒットの逆順に描画するんじゃないの
無駄過ぎて鼻水吹き出しそうな話だけど
画像のインスタンスって言ってんのはスプライトの事かな
クリックした要素が何かを探したいんだろうけど
画面を経由する必要があるほど不定形でぐにゃぐにゃしたUIなんだろうか
もしどうしてもやる場合は
俺ならオフスクリーンバッファにどのUIがトップかを書くかな
z値をインデックスにすれば深度マップで取得できるんじゃね?
と思ったけど、vramアクセスはパフォーマンス悪そうだな
OpenGLのポリゴン描画で影を描画すると、影が赤くなるんだけど、黒くする方法ってある?
スレチだったらごめん・・・
方法も何も、そもそも赤くするコードを書かない限り赤くならない。
「プログラムは思ったとおりには動かない。書いた通りに動く」ってな
物凄いレアケースでハードウェア絡みかもしれんが
もう一度コードを見直しが先決かねえ
エスパーするが
色構造体のバイトオーダー間違ってないか
OpenGLで通常のモデルはちゃんとでて、影だけおかしいとかだと、
LIGHTINGやTEXTUREのEnable/Disableの切り替え忘れとかがありがちかなぁ
848 :
名前は開発中のものです。:2014/06/09(月) 23:44:28.20 ID:hvcdW5Tu
DXライブラリをEclipseで使うやり方を教えて下さい。
詳細に教えてなんて言わないんで、解説してくれているサイトを教えて下さい。
情報が少なすぎるのか、調べ方が悪すぎるかのどちらかで、アホな初心者にはできません。
GL_REDの影テクスチャをそのまま掛けてるとか?
vec3 out = in * texture2D(shadow, uv).rrr;
みたいにする。
>>848 「exlipse DXLib」の検索ワードだけでゴロゴロ出てきたんだが?
そのキーワードでググって1位見れたよ。
何か重くて表示されなかっただけでね。
キャッシュからも表示できたし。
よく知らないが、Eclipseで、
ライブラリのパスを参照設定するだけじゃないの?
他に、何かすることがあるの?
デバッグや配布時に設定が必要くらいでね
EclipseよりVisualStudioのほうがいいんだけどね
きっとインストール権限ない環境かハードディスク残量の問題なんだろうね
宗教上使えない人もいるのです
棄教しろバカ。
棄教できなければ.NET framework神に詫びながら死ね。
EclipseもNetBeansもクソ
Win以外の開発はどうするのさ
でた!屁理屈。Window以外でDXライブラリでゲームを作成されてるのですね。
でしたら、お好きな環境を選択されればよろしいとおもいますよ?
いやdxでとは言ってないが
OpenGLでいいでしょ
マルチプラットフォーム対象にするときどうすんの?
>848
てか、だから好きにすればいいよ
実際のところゲーム会社ってWindowsとMacだったらどっちが多いの?
あと、プログラミング言語とかライブラリとか
そもそもUnityの会社だってあるし・・・
スマホ向けは大概Mac
MacのXCodeじゃないとiOS向けにコンパイル出来ないので
その環境でAndroidアプリも作るからeclipseも入れる
Unityも結局iOS向けはコンパイルにMac必要だからMacになる
Win向けはまあVisual Studioでしょ
コンシューマはわからんけど箱むけならVisual Studioなんじゃない
VisualStudioが強すぎるのと周辺ツールの関係からWindowsが圧倒的
>>863 コンシューマは基本C++で、ライブラリはそれぞれのプラットフォーム用に作られたライブラリ使ってる。
Windows上でデバッグするときは苦肉の策でOpenGLとかで似たように作る。
ゲームエンジンならだいたい両方用意されてる。
今なら、Unrealengine4とかCryengineとか。
開発環境ではなくてゲーム本体でPCなら圧倒的にwindows
>>862 つまりVSはWindows用の開発以外は使えないって事?
個人開発ならそれでいいけどコンシューマ向けだとキツいと思うんだが
実際の現場ってどうなってんの
コンシューマではXBOXのことも忘れないであげてください
>>868 ソニーはVisualStudioで動くやつとgccでのコマンドラインでの開発が選べるのが定番
>>869-870 じゃあとりあえずVS使えればゲームプログラマにはなれそうな感じなのかな
>>871 いや、VS使うだけなら出来て当然なので
あんま意味ない
使えればプログラムかけるかっつーとそんなことはないわけで
APIとかだいたい独自なので、マニュアル読んで理解して使いこなす能力がないとお話にならない
なんで皆そんなに業界に詳しいの?
プロなの? それとも聞きかじり情報?
妄想
VSとかEclipseとかXCodeとかUnityとかUEが使える使えないじゃなくて
どんな環境でもプログラム書いて動かすものが作れるっていうのが重要なわけで
弘法筆を選ばず
でも成熟した産業だし、デファクトスタンダードとかあるんじゃないの
OSX•iOSならXCode、Androidならeclipseで鉄板だし
コンシューマは各プラットフォームのライブラリ使えればVSで行けるみたいだし
学習するならとりあえずターゲット絞った方がいいと思うけど
ゲーム会社に就職するなら、だけど
>>875 弘法じゃない凡人は一本の筆を使いこなせるようになるにも一苦労なので筆を選ばざるをえない。
どれか一つのIDEをしばらく使ってみて、ビルドの工程が理解できてくれば、
どんなIDEでも基本的な操作は出来るようになるよ
特定のIDEに習熟しようとしたって、
どうせ習得してはまた新たな壁にぶつかるという
ラッキョウの皮をむくようなことになるだけだけどな。
IDE らっきょ
>>876 Xcode とかバージョンかわるたびに前のプロジェクトがうまく動かなくなるとかざらにあるので、求められるのは与えられたものを調べてすぐつかいこなす能力
NetBeansなんてなかった
>>879 言いたいことは分かるけど、
>ラッキョウの皮をむく
って例え、経験がないから分からんかったわww
通だなwww
個人でコンシューマーゲーム作ってみようと思うんだけど、個人でもライブラリが手に入るハードってある?
できればVSで動くライブラリだと助かる
一応ゲーム制作経験はあるから、リファレンスがあれば作れると思う
そういう質問をするレベルの人間がコンシューマの開発をしようと考えること自体が、馬鹿の極み。
今時のメジャーなゲームハードでは
個人に対しては制限された環境しか与えられていない
XBoxでXNAで作ったゲーム配信出来るサービスなかったっけ
XNAはC#とかで、C++ではない
VITAのPSMもC#
unrealでもやっとけ。個人でもライセンス契約すればコンシューマー開発できるぞ。
ライセンス料がいくらかは知らない
まあ簡単な開発環境いっぱいあるし、1からゲームエンジン作るくらいの気概ないとC で作る意味ないよな
>>883 PSPならPSP版DXライブラリもあるし割となんでもできるんじゃね
>>883 一応きくけど作れたとしてそれを売ろうとしたらライセンス料いるって知ってる?
>>883 monogame辺りがフリーかな
PSMとかPS4も対応するみたいだけどライセンス大変そう
仕様はまんまXNAなんでそれらサンプルや資料がそのまま使える
開発活発はただしC#
プラットフォームのロイヤルティと
ライブラリやエンジンの利用料をごっちゃにするな
売上なくても固定費取られるんだっけ?
PSMは年間8千円くらいだって以前ここで読んだ
PS4のインディーはどうなってるのかな?
PlayStationMobileのパブリッシャーライセンスなら、今は無料じゃないかな(期間限定、終了日未定)
それ先に言えよ!
登録してくる
LeadWerksじゃだめなん?
\10,000前後で再配布無料だし
ヘッダーファイルの相互参照を回避するために
class "MapAnimationAdmin";
と前方宣言したんですが
forward declaration of 'struct MapAnimationAdmin'
という構造体と勘違いされているのかエラーが出て出来ません
VisualStudioだと出来たと思うんですが、Eclipseだと出来ないんでしょうか?
1) ヘッダ内でnew MapAnimationAdmin()しているのが原因 → cppの中でやる
2) #includeの順番がおかしい事に起因している → 順番を正しくする
チェックする場所はこんな所かな
すいません、cppのほうでincludeしたら何故かh側のエラーが無くなりました
cppでincludeするのは大前提というかなんというか
includeされた側にincludeした側のエラーが出るとは思ってもいなくて
まぁ、c系のエラーメッセージは判り難いからね。
今からゲーム作るとしたらDirectX11でいいのかな
まだXP持っててもゲーム用じゃ使わないだろうし
1から作るならそれがベストだと思う。
なかなか過去の遺産って捨てらんないよね…
他のプラットフォームに移行を考えてOpenGLていう選択肢も
DirectX12で軽量化やGPU活用の為にまた変わるみたいだし
直よりパフォーマンスは落ちるけどレンダラーだけ切り替えられるマルチプラットフォームの
グラフィックスライブラリやゲームエンジンも有り
ゲーム作るときの選択肢コピペ誰かつくったら?自分的には↓
DirectX9...古いけど十分、でも古い
DirectX11...現行なので普通はこっち、ゲームエンジンやプログラミングの学習も兼ねるなら迷わずこれ
OpenGL(CP3.2)...マルチプラットフォームなので他機種での動作が可能、ただしライブラリ設計がクソ、他のライブラリにかなり頼る
Ogre3D...将来性も情報量もなし、使うべきでない
Unity...上位機能を望まなければ簡単なプログラミングでゲームが作れる、簡単にゲームを作りたいだけならこれ
C#だがSharpDXやMonoGameもおすすめ
OpenGL = Direct3D - D3DX
って感じでシンプルだけどクソではないだろ
普及の問題からDirectX9使っとけば間違いないって時代は終わったのか
DirectXは何度か改修してるからな10の時にも一気に整理されたし
12でまた同じような事するんだろうな
(・・・・もう覚えるの面倒です)
>>910 そこに書いてあることを理由にクソと言い切るのは
ゲーム製作を始める初心者に誤解を招くだけ
>>912 OpenGLも選択肢にはなるのは分かるけど……
なによりもオブジェクト指向な書き方ができないのがツラい
技術発表はOpenGLでの実装が多いから先端の技術に興味ある人はいいんだろうけど
>>907 Ogreが情報量少ないて何の冗談だ?将来性は今も開発進んでてIrrlichtよりマシだし
SharpDXとかMonoGameてDirextX9相当だし今時のシェーダーが組めない
SharpDXがDirectX9相当とか
お前こそ何言ってんだ
>>913 自分でステータス管理、バッファ管理その他諸々の処理書けばオブジェクト指向で書けるじゃん
DirectXでもAPI直叩きは気持ち悪くて同じような処理書くことになるし
すまん本当に何言ってたんだろう、SharpDX使った事あるのになんかDXライブラリと勘違いしてたかもしれない
そもそもレイヤの違うもの並べてどうするのと
DirectXは手続きがめんどくさくてラップすることはあるけど
OpenGLはラップしてると何故か気持ち悪くなる
マリオカートみたいなの作るとして
キャラクターごとにクラス作るか、キャラクターというクラス作ってパラメーターとかモデルを登録する方式にするか迷うんだけどどうしますかね
後者でしょ
>>920 >>921が言うようにキャラクタークラス作ってパラメーターやモデルを登録する方式が良い
ただ、キャラクタークラスを継承したキャラクター毎のクラスが在ってもいいとは思う
キャラクター毎に全く挙動が変わるならそれぞれクラス作るのもありだと思う
問題は、ゲーム時ループ中などの速さが要求される箇所で、
個体複雑性に起因する条件分岐が増えるのをどう回避するか、か。
末端(=キャラ個体)に複雑さを集約するか、
流れ制御側(=タスクシステム、メインループ)に複雑さを押し付けるかだな
どちらも楽しそうだな
その程度の分岐で処理落ちが起きたりせんよ
ロジックとして分かりやすく簡潔にかける方を選んどけ
速さを求めるのは衝突判定とか描画部分だけで良い
最近、フィルレートにばっかり処理の比重を取られて、CPUがかなり遊んでいる状態。
>>924 クラスに細分化した所で関数呼び出しがvtable一個分の呼び出しロスぐらいで
分岐は生成時位しかしなくない?
状況で変わるようなのはステートパターンだろうし
挙動だけ別クラスでキャラクタークラスに差し込みしても同じ程度だろう
ゲームループ内で毎回どのキャラか判定するつもりなのかもしれない
無能な奴ほど、最適化しても誤差に吸収されてしまいそうな部分にこだわるんだよね。
「無能な奴」でない奴の作品を検証させろよ^^
>>929 「早すぎる最適化は諸悪の根源である」ってやつだね。
そういうのは遅さが気になってから手をつける部分なのにね。
コードの最適化は最後でいいけど、設計の最適化はコーディング前にやっとかないと修正で地獄見るぞ
RPGの技ってどうやってるの?
やっぱりラムダ式をmapに入れてるの?
934 :
421:2014/06/22(日) 17:30:21.94 ID:So0IxHSH
スプライトアニメーションのアルゴリズムを作っているのですが、
拡大・角度・移動の情報を格納した構造体を3次元配列で保持したいです。
当初は
SAnimationNode animations[MOTION_NUM_SIZE][FRAME_NUM_SIZE][IMAGE_NUM_SIZE];
としていたのですが、よく考えたらキャラクターごとに画像の枚数やアニメーションのフレーム数が違いました
動的配列の部分をvector型にしようとしたら
vector< vector<SAnimationNode> > animations[MOTION_NUM_SIZE];
となったんですが、これは
SAnimationNode animations[FRAME_NUM_SIZE][IMAGE_NUM_SIZE][MOTION_NUM_SIZE];
こういう意味になってしまわないでしょうか?
>>934 vector< vector<SAnimationNode> > animations[MOTION_NUM_SIZE];
↓
animations[MOTION_NUM_SIZE][FRAME_NUM_SIZE][IMAGE_NUM_SIZE]
となるんじゃない?
いまいち文字コードについてがわからん。
Windows上でUTF8,UTF16LE,CP932を相互変換したいんだけど、
マルチバイト?ワイド文字?で混乱
937 :
名前は開発中のものです。:2014/06/24(火) 13:33:03.26 ID:IbY2i7BW
マルチバイト、ワイド文字と、文字コードは別。
windowsでは単に、8ビット単位と16ビット単位で扱うかどうかの差。
>>937 マルチバイト文字→ShiftJis,UTF8,EUCJP
ワイド文字→UTF16,UCS-2
でいいの?
字義的には、一文字をあらわすのに複数の可変長のバイトをつかうのがマルチバイト
同じサイズのワード値をつかうのがワイド文字
ワイド文字は固定長なのでプログラムが
単純になるので楽、というのが本来の想定
windows は歴史的に16bitのユニコード
(UCS2)を内部コード兼ワイド文字としてつかってたんだけど
ユニコードが拡張されて、16bit 可変長(UTF16)になってしまい、
ワイド文字自体は拡張せずそのまま16bitとしたのでの「ワイド文字」を使ってても
マルチバイトと同じことする必要があってプログラム上のメリットは薄れてしまってます
ワイド文字は環境固有の内部データで
統一仕様が無いので、外部とのやりとりは
かならずマルチバイト文字列を使うのが原則
Unix系だとワイド文字は普通32bitです
そういう意味では、そこにでてる名前は全部規格で仕様決まってるのでマルチバイトです。たまたま固定長なだけ
Win環境に限ればAPIで「ワイド文字」
というとUTF16のことで、変換関数で
指定のマルチバイトと変換できます。
UCS2は可変長部分をのぞけばUTF16と合致します
他のOSではそうとは限らないので注意が必要。
マルチバイトのファイルは共有できるけど、ワイド文字はあくまでプログラム内部でつかうもの。
完全に環境依存しないためには、
ポータブルな文字コード変換ライブラリの準備と、
ワイド文字仕様を自分で決めて対応する必要があります
長々かいちゃつたけど、ワイド文字は、その環境で使える全ての文字を含むことになってるので
指定のマルチバイト→ワイド文字→指定のマルチバイト
とすれば文字コード変換できることになります
マルチプラットフォーム前提のゲームの場合、
文字列はwstring型でUTF16で格納しておくのが最善策かな?
942 :
名前は開発中のものです。:2014/06/24(火) 16:03:01.31 ID:IbY2i7BW
マルチプラットフォームだったらUTF8では。
UTF16を使ってるのはWindowsくらいで。
Windowsを使ってるならUTF16でいい。
C++でUTF8は面倒だ
Unityが便利なのはわかるんだけど、プログラミングが好きだから
全部コード書いてるって人は少なからずいる・・・よね・・・
unity使ったことないけど凝ったことやろうとすると結局コード書かないといけないって話は聞いた
>>945 俺もそれしたいんだけど重くなりそうじゃないか?
もともと遅いのに素材の最適化効かないし
Unityってよく知らんのだがコード書かずにゲーム作れるのか?
すげぇな。
C#とかでコード書かんと
RPGツクールならコード書かなくてもゲーム作れるね
>>946 まぁ凝ったことするなら結局自分で実装しなきゃいけないけど
凝らないところはぺいぺいってできるよ
>>947 処理速度とかは自分ができる範囲でいいかな
商用じゃないなら製作者が好きなようにすればいいと思う
いつからゲームはツクールみたいなツールで作るようになってしもうたん
もはやプログラマーじゃないじゃん
コードを書いてなんぼだろ
マウスでぽちぽち画面操作してるだけでゲームができてしまうなんて許されんだろこれは
マシンの性能が昔とは比較にならないので、カリカリにチューニングするより汎用エンジンで生産性をあげた方がコストかかんないし品質も上げやすいだろうね
限界までパフォーマンス突き詰めるなら自分で書くしかないだろうけど、半端なスキルで自作しても汎用エンジンより低性能になるだけだろうな…
グラフィカルになってもプログラマーの
やるべき仕事の本質は変わらんべ
コード書く密度量が減っても
そのぶん規模が大きくなってる
昔からその繰り返しじゃん?
>>952 企画書があってこそコード書いてなんぼな状況になる
しかしプログラマの多くは企画書が書けないので、簡素なものに頼ってる
スレチなのでそろそろ終わったほうがいいと思うが、
unityの無料版は非同期ロードが出来ないみたいだね。個人的にはここが致命的かな。
だからといって有料版買おうと思うほど、高度にグラフィカルなゲーム作ってる訳でもないし。
要件と費用対効果がいい感じになるのなら便利なんだろうけどな。
ゲームが作れるならコードだろうがツールだろうが構わないと思うが、
ツールは固有の使い方を覚えないといけないから
物覚えの悪い俺には不向きだ……。
とはいえ最近はUnity使えるとそれだけで有利なんだよなぁ……
最近下ろしてみたらスプライトエディタまで実装してあるし
なんかすごい事になってるな
>>944 流し読みした限りでは、ヒゲモジャ教祖のコピーレフトじゃないほうの
つまり緩いほうのフリーソフトのライセンスの典型的な文言かと。
ちょっと自信なかったのでFAQのほうも読んでみました
http://userguide.icu-project.org/icufaq の「How is the ICU licensed?」によれば
>a simple, permissive non-copyleft free software license,
>compatible with the GNU GPL.
>The ICU license is identical to the version of the X license
という事なので、Xライセンス(MITライセンス)と同じみたいですね
>>959 おお、要約サンクス
MITと同じって事は著作権表示しとけば好きに使っていいのか
ちょっと触ってみようかな
ICUはすごいけど、でかすぎて大抵の用途に不向きよ
絶望
ゲーム重視の会社・・・Unityが出来ればいい
プログラミング重視の会社・・・オブジェクト指向が出来ればいい
古さ重視の会社・・・C言語とUNIXが出来ればいい
だったらどれが一番多い?
3つ×(バツ)を付けて
ちょっぴり大人さ
左と右がまったく合っていないので答えられません。
エンジンあれば簡単にゲームできると勘違いしている会社・・・Unityが出来ればいい
ツールはつくれても面白いゲームは作れない会社・・・オブジェクト指向が出来ればいい
時代の流れに完全に取り残されてる会社・・・C言語とUNIXが出来ればいい
こうかな…さすがにCとUNIXだけってゲーム会社はもうないかな
>>960 私はpocoライブラリを使ってる都合で文字コード変換はしますけど
UTF-16⇔UTF-8のみなのでMSのAPIで済ませてます。簡便ですので
Unicode相互変換ってC++11で標準ライブラリに入らなかったっけ?
使い方はよく分からんけど
最近のゲーム会社って偉そうだよね
楽して儲かるゲーム作っといてそれを言うなよって感じ・・・