3 :
名前は開発中のものです。:2012/05/20(日) 22:03:54.15 ID:xMXzf6LN
プラットフォームやライブラリは限定しないの?
何話せばいいの?
>>3 限定しない
C/C++がらみの雑談とか、初心者質問とか
元スレで、DXライブラリ + C/C++でゲーム作ってる住人が、
直接DXライブラリに関係しない、STLとか、ポリモーフィズムとか、
シーン管理とか、ポインタとか、そういう話をしてて、
スレ作ろうか、という話になったのが経緯な感じ
タイトル、ゲーム画面、メニュー画面、ステージ選択画面…みたいに分けるのが普通なのかな
混ぜこぜしてたら分け分からん
関連のあるやつは入れ子にする
「スレ違いの話は他でやれ」とかいうのは嫌いだが、確かにこういうスレは欲しかった。
>>1乙
昔は言語単体の質問はム板で質問する事が多かったが
正直今のム板は質問に対してまじめな答えが返ってくるかどうか怪しいからな
画面(シーン)管理は、StateだかStrategyだかのパターンでやってるけど
入れ子処理までは実装してなかったなー
シーン管理はXNAのサンプルをいろいろ改造して使ってる
ファミコンドラクエのメッセージコマンドが難しかったり。
村人が動き回るの止めて足ふみだけさせつつ、会話窓を動かすやつ。
>>13 歩きモーションと実際の移動量との誤差を気にしないなら、
「動かないけど足踏み」ってフラグを立てるなり、「NPC->Move()」だけを外すようにすればいい。
「あたり判定判断クラス」にキャラクターのデータへのポインタを
「あたり判定判断クラスを保持するクラス」のコンストラクタで持たせた方がいいですか?
それとも
「あたり判定判断クラス」を保持せずに、
あたり判定の要求があったら
その場でインスタンス化して要求と一緒にキャラクターのデータへのポインタをもらった方がいいですか?
一体なんの話だ?
>>1乙
素人だけどたまに覗かせてもらうわ
>>15 文章が下手くそすぎてわからん
「データとその処理クラスはどう保持してる?」って訊きたいのか?
なら管理クラス作って両方保持させたらいんじゃね?
2D/3Dとライブラリとジャンルは書いた方が答えもらいやすいと思うぜ
今簡単なライブラリで3Dゲーム作るならDXよりseleneのがいいかな?
Siv3D待てるんじゃないか?ロジックだけ先に作っとけ
Siv3D待てるんじゃないか?ロジックだけ先に作っとけ
>>18 3Dをモデリングするツールが決まってるなら
対応してるライブラリを選んだほうが楽だと思う
大手有償ツールならツール名指しで対応してて安心だけど
シェアウェアやフリーはフォーマットに対応してても
読み込めなかったり制限があったり多いし
>>6 画面遷移でわけてる
>>8 スレのタイトルっていわばインターフェースだと思うんだよ
目的に沿った質問をしやすいタイトルのスレは、ユーザビリティ向上に必須だと思う
だから、言語別・ライブラリ別にたくさんスレ立てたほうがいいと思う
>>10 あっちはあっち、こっちはこっちだよな
ム板や色んな板と連動とろうとすると矛盾でるから
こっちで完結していいと思う
>>15 ゲームによって違うんだろうけど
if (obj1->collision(obj2->collision()))
{
/*hit!!*/
}
って感じがわかりやすいんじゃね
collision(obj1->pos, obj2->pos)
のほうが見やすいかな
俺は、以前まではそのように画面ごとで処理を分けてたけど今はもう全部同じにしちゃった。
「タイトル画面」というキャラを作って操作して、そこでステージセレクトを選ぶと
「ステージセレクト画面」というキャラを作って、それ以外のキャラを消す、とか。
こうすると新しい画面を作りたいときに、すぐに追加できて凄く楽だった。
一般的な方法かどうかは知らん。
(どういう状況を想定してるのかがサッパリ分からない…)
シーン管理の話でしょ。
そりゃ話の流れを考えれば分かるけど
>>19 そういえばそれあったね、忘れてた
見た感じ年内には出来そうだけど…
人いるかな? クラスのメンバ構造体のポインタを引数に渡すとエラーを吐く。
何回やっても「CClass::TStructをTStructに変換できません」と起こるのよ。
助言求む。
事故解決
おめ
何がどうなってどうしたかを書いてくれると情報共有できて助かる
typedef使ったのかな
クラスのメンバ関数に同じメンバの構造体配列のポインタを渡して処理させようとしたんだけど、配列で同じメンバだったら要素を指定する値を渡せばいいだけだった。
目的は構造体(敵キャラクター)の情報をポインタで参照させてルーチンで動かすことだったんだけど、これに結構な時間を食われたわ。解決法は無理矢理だけどな
しかし、一人でゲ製はきついなあ。傍で優しく教えてくれる美少女プログラマが欲しい
よくわからんがこうしたって事?
class myData
{
};
class Hoge
{
Hoge(){}
~Hoge(){}
myData *arry[10];
void shori (int x){ arry[x]を弄る処理; };
};
まだ良く分からなくて想像妊娠だけど、typenameで根本解決するっぽい。
36 :
名前は開発中のものです。:2012/05/23(水) 22:24:42.87 ID:IjYu3jeM
すいません、何度か過去に若干似たような質問をしてしまったのですがまとめたので改めて質問させてください。
クラスの配列メンバを、コンストラクタで動的に初期化(インスタンス化?)することはできるでしょうか?
コンストラクタに与えられた値の分だけの要素数を持った配列をメンバにしたいです。
配列じゃなくてvectorをメンバに持てばいい
初期化子を使ってvectorのコンストラクタに値渡せばできる
class Hoge
{
std::vector<int> m_array;
Hoge(int num) : m_array(num){}
};
つーか、vectorなら後でどうこうできるから別にこんなことしなくていんだが
>>36 動的に配列のメンバー変数のサイズを決める事はできないと思います。
擬似的な方法として以下ではどうでしょう?
1)テンプレートで要素数を指定する。
template<UINT n>class Hoge {
DATA data[n];
};
Hoge<3> hoge3;
Hoge<2> hoge2;
サイズが違うと違う型扱いになる。
Hoge<3>*で&hoge2は受け取れない(逆も)。
(2)データを配列で持たずポインターで持つ。
class Hoge {
explicit Hoge( UINT n ){ data = new DATA [n]; }
~Hoge(){ delete [] data; }
DATA* data;
};
Hoge hoge3(3);
Hoge hoge2(2);
Hoge*は&hoge2も&hoge3でも受け取れる。
>>38 コンストラクタの手前の装飾子と、UNITという定義はc++の機能なのでしょうか?
みた感じそれが1番わかりやすそうです。
>>37 stdは一個や二個使うんじゃなくて次作る時に一気に活用したいので・・・
すいません。今はめんどくさいです。
>>39 すいません、調べればわかることでしたね・・・
ただ、コンストラクタでインスタンス化してポインタに代入しても、
実体はコンストラクタのスコープの中だけで
コンストラクタが終わるとデータも無くなる・・・
ということはないのでしょうか?
ID:IjYu3jeMはmapを使いたいって言ってた人だろ?
諦めんなよ
>>41 newで確保した領域はdeleteされるまで存在しますよ。
なのでデストラクタ―が呼ばれるまで大丈夫です。
気にしているのは、ポインターdataの寿命かと思いますが、
dataはクラスのメンバ変数なのでこちらも大丈夫です。
dataの初期化はコンストラクタの初期化子でも設定できるみたいです。
こちらの方が初期化として、意味的に正しいのだと思います。
Hoge( UINT n ) : data( new DATA [n] ){}
いろいろ環境や目的もあるだろうからあれだけど
std::vectorやstd::dequeを参照で渡すほうが遙かに楽だと思うぜ
まあイテレータの宣言はダラダラ長くてめんどくさいけど
C++11ならAutoさんが活躍
>>43 とても参考になりました!
ありがとうございます!!
>>44 こっちのほうが楽じゃないですか?
自分の無知から来る疑問ですけど
絶対vectorのほうが楽。
new/deleteで神経質になる必要が無いし、配列サイズ変更も楽。
>>37でもいいし、漏れはコンストラクタで
Hoge(int num){m_array.resize(num,0);}
にする。引数の0は初期値。
あえてvector使わないときは、
せいぜい定数代わりの配列使うときくらいかな?
自分を初心者だと思ってるうちは、STLを安易に使わないほうがいい。
中級者向け。
STLこそ初心者向けだろw
>>46 ゲームだとこんな処理したくならない?
/** キャラクター一覧 */
int listUp( std::vector< MyCharacter >& v ) {
if ( v.empty() ) {
Message( "キャラクターがいません" );
return 0;
}
int s = v.size();
for( int i=0; i<s; ++i ) {
Message( v[i].Name );
}
return v.size();
};
配列の操作を経験しとくのはいいことだと思うけど
リスク≒デバッグ負荷って面もあるしな
表記が長くなるって程度のめんどくささはあるけどね
>>49 入門書にSTLが載っているが、それを理解したら入門者じゃないんだなw
とりあえずC++入門3分の1ぐらい読んで、作り始めちゃっているようなやつが初心者なわけで。
Cの本なんてほとんど読んだ事もなくて、STL? vector? インスタンスとかメソッドとか何それ?
な状態でゲームを数本完成させた俺は初心者ですか中級者ですか。
ゲームの内容や規模によるだろ
規模が大きくなるにつれて低レベルの処理が重要になるからSTLを選ぶかどうかが重要になる
小規模なら力技で何とかなるし
STLを使うのは誰でもできるだろ。
あれと同じ機能のクラスを実装しろってんなら
中級以上じゃないと無理だが。
>>52 他人に自分のコードを説明できなきゃ初心者
他人のコードを読めて理解できれば中級者
クラスの中に int main()
初級者中級者ぐだぐだ言ってるやつは初心者に決まってるだろw
STLは難しいとされてるのが一般的じゃないの?
そりゃプリミティブ型でpush_back()しか知らないで使うならいいけど、
コピーコンストラクタとかスマートポインタに関する
理解をもたないでやったら謎バグに嵌るのが目に見えるわ。
別に嵌っても良いんでない?
勉強になるし
スマートポインタはSTLじゃなくてboost使ったほうがいいよ。
スコープで一時的に使いたかったらunique_ptrでいいけど。
STL使うとバグに悩まされるけど、自前でlistだのmapを実装するとバグはないらしい
いやいやいや、そぉかぁ?www
昔のSTLならともかく、今はそれはないでしょーw
ゲームじゃないけど、業務にバリバリvectorとlistとsetとmap使って遭遇しなかったよ。
STLportだけど。
いや、
>>59の主張を言い換えただけなんだが・・・
俺にはauto_ptrなどのスマーポインタをわけわからんで使ったときの挙動と解釈した。
STL自体のバグには言及してないっしょう。たぶん。
STLなんて、std::vectorとstd::mapにstd::string出し入れするだけなら、
解説サイトの例文をコピペするだけで使えるじゃん
コピペで定番の処理ができるものについては、
初級のうちからガンガンやっといていい
自分で考えるところが出てくるようなものは、多少プログラムに慣れるまでは
迂闊に手を出さないほうがいいかもしれないけど
仕様を理解せずに使えばどんなライブラリだってバグの温床になるよ。
問題は自分の不勉強をライブラリのせいにする無能さ加減。
原因追及は出来ないけどSTLを使うとバグるとか言う人間はその典型例。
きっちり検証した上で、ここの実装がおかしいとか指摘できるならその限りにあらずだけどね。
newしたクラスのメソッドにアクセスして
テスト用の文字出力みて満足してデリートしないでウィンドウ閉じた
(´・_・`)
イテレータとか使い出したら初心者が混乱するのは分かるが、
vectorくらいなら初心者でもぽんぽん使っていいと思う。
インスタンス管理で躓くならstl云々ではなくてC++の勉強しなおしが要る。
>>70 あー、これどうなるんだろうな。
最近のOSだと良い感じにしてくれそうな感じはするが。
>>70 >ウィンドウ閉じた
プロセスを閉じればプロセスで使っていたヒープは解放される。
つまりメモリリークはプロセスの内側のこと。
碌に作ったことないけどmainクラスからtitleとかgameとか呼び出してその中でwhileループ、
クリアとかしたらmainに戻ってまた他の項目呼び出すのが簡単に出来そうだな
76 :
名前は開発中のものです。:2012/05/26(土) 14:19:42.97 ID:e8/fGbGH
シーンクラスのコンストラクタに、シーンクラスのアドレスを保持するクラスのコンストラクタに渡すことはできるでしょうか?
また、する方法はどうしたらいいでしょうか?
↓イメージだとこんな感じです
class abc{
praivate:
def* hoge;
public:
abc(){
def = new def(this*);
}
~def();
};
class def{
praivate:
abc* hogu;
public
def(abc* tmp):hogu(tmp){}
};
class defの前方宣言をclass abcの定義前に置く
78 :
名前は開発中のものです。:2012/05/26(土) 14:24:19.28 ID:lwTzxCQ6
>>76 class abc{
の前に
class def;
を追加すれば出来る。
79 :
名前は開発中のものです。:2012/05/26(土) 14:35:04.98 ID:e8/fGbGH
あ、順番間違えました
コンストラクタの引き数にthis*は、文法としてあってる?
80 :
名前は開発中のものです。:2012/05/26(土) 14:39:08.15 ID:lwTzxCQ6
*thisに直すべし
81 :
名前は開発中のものです。:2012/05/26(土) 14:49:54.86 ID:e8/fGbGH
thisでポインタ
>>77 >>78 できるか?
引数付きコンストラクタを宣言できないからダメだと思うが。
前方宣言すべきはabcのはず。
class abc;
class def{
public:
def(abc* pABC){}
};
class abc{
public:
abc(){
abc* pThis = this;
def* pDEF = new def(pThis);
}
};
.h と .cpp 分けるのは必須だな。
初心者を装って引っかけ質問してる臭い
>>83 正しいと思うが、俺ならテンプレート使いたくなるな
template < class T >
class Class1 {
public:
T * c2;
Class1( T * caller ) { c2 = caller; };
virtual ~Class1() {};
};
class Class2 {
public:
Class1<Class2> * c1;
Class2() { c1 = new Class1< Class2 >( this ); };
virtual ~Class2() { delete c1; };
};
連絡クラスか上位クラスで連携すべきだよね
オンライン対戦ってどうやるんですか
C/C++関係ねえw
ネットワーク接続機能のあるライブラリ使う
DirectPlayとか。
VCって何年版がおすすめ?
C++11触りたいなら2010、それ以外は一長一短
オンラインはな…鯖がな…
いきなりですが2Dエフェクトってどういう作り方してますか?
数枚画像を用意して、あとはプログラム側で加工するのか、
元から透過画像とかを全部用意して表示するだけなのか…一般的なのはどれだろう
>>89 特に理由がなければ最新でいいと思うよ
古いバージョンだと色々と対応してなくて面倒
>>92 グラフィック用意して透過や加算で表示
>>92 スピード的にエフェクト画像は元から用意しとくべき。
ランタイムでは位置とスケールと透過度を変えるくらいだな。
95 :
名前は開発中のものです。:2012/05/29(火) 00:47:50.68 ID:ajD2ZMcH
96 :
名前は開発中のものです。:2012/05/29(火) 03:11:27.66 ID:ZvK6euHz
ここの来ると
「寄ってくるな」「来るんじゃねえよ」
こないと、何故かちょっかいが来る
不思議なもんだ
ホモ本ばっかだけど
男だったんだっけか?
なんでBLなんだよ orz
>>95 動的に確保するなら、そもそもBの引数無しコンストラクタ使う必要ないんじゃない?
Aのコンストラクタの引数で配列のサイズ受け取って、
Aのコンストラクタ内でその分だけBを作ればいい
でも、メモリ管理面倒になるから普通にvector使ったほうが楽だよ
100 :
名前は開発中のものです。:2012/05/29(火) 08:36:02.60 ID:ajD2ZMcH
>>99 Bを、Aのコンストラクタの中でBのコンストラクタに引き数を渡して、初期化をしたかったんですが
iniメソッドを別で作ったほうがいいですか?
101 :
名前は開発中のものです。:2012/05/29(火) 08:36:41.71 ID:ajD2ZMcH
vector(´・ω・`)・・・
vectorでポインタ持たせた方がずっと良い。
動的なサイズ変更とか楽だし。
コンストラクタでnewしてデストラクタでdeleteすれば
別にインスタンス管理で悩むことも無いし。
>>100 Aのコンストラクタ内で
m_b = new B[size];
for (int i=0;i<size;i++)
m_b[i] = B(b);
とすればいいと思うけど、俺なら確実にメモリリークする自信がある
>>103 sizeをconstにすれば大丈夫な気がしてきました!
ありがとうございます!
そもそも同じ引数でいいなら配列版のplacement newてのがあってだな
delete要らないったってデストラクタに意味があるとか使わなくなったから消したいときは
デストラクタとplacement deleteを両方呼ばなきゃいけないし
結論としてvector使え、管理面倒ならvector<shared_ptr<T> >
vectorだと要素数が固定じゃなくても、size()があるしね。
別のコンテナでもイテレータがあるし。
頑なにvector回避する理由なんて無いだろ。
そもそもSTLを回避してる理由ってなに?
コピーコンストラクタが分かっていないとか、
デストラクタの呼ばれるタイミングを理解していないとか、
メンバのポインタがコピーされて二重解放するとか、
仕様を分かっていない馬鹿がバグを出すには十分だからだろう。
無能だからSTLを使わない、その理由に疑問の余地は微塵も無い。
言えてる気がする。
俺もどっちかっつーと馬鹿な方だから、STLが怖くて
自作のコンテナ使ってる。
出来合いのものを使った方が機能も多くて堅牢で
ずっと良いんだろうけどさ。
>>109 漏れも最初はそうだったけど、使い始めると一瞬で慣れるよ。
ググったら日本語で解説や使用例が山ほどヒットするのがデカイ。
STLごときで上級者気取る奴は明らかに初心者
112 :
名前は開発中のものです。:2012/05/29(火) 17:47:49.24 ID:ajD2ZMcH
>>103 これってコンストラクタ??
引き数を渡してるの?
>>112 >>103 Aのコンストラクタ内で、Bのコンストラクタに引数渡して初期化してる
m_b … Aのメンバ変数のBの配列
size … Bの配列のサイズ。Aのコンストラクタの引数とか
b … Bのコンストラクタの引数
>>113 コンストラクタの返値を代入してるように見える・・・
「コンストラクタは特殊で、こういう使い方もできる」
って理解でいい?
一時オブジェクトをコピーコンストラクタでコピーしてる
むしろそっちのやり方のほうがSTLコンテナより高度
いやどっちも全然高度じゃないし
メモリプール&自作動的配列か
俺もさっぱりわからん。placement_newとかなんぞやw
オブジェクトの配列なんて普段STLコンテナしか使わないですしおすし
新しい大統領ってことだよ
121 :
名前は開発中のものです。:2012/05/29(火) 20:55:06.94 ID:ajD2ZMcH
>>115 なるほど!
あと最後に質問なんですが
B(b)って実態できないですか?
122 :
名前は開発中のものです。:2012/05/29(火) 21:06:49.97 ID:ajD2ZMcH
placement new とか 引数付きコンストラクタはできれば避けたほうがいいな。
125 :
名前は開発中のものです。:2012/05/29(火) 22:13:10.43 ID:ajD2ZMcH
間違えました
hugoじゃなくてBでした
あ、違う
new(&B+i) kurasuB(/*Bのコンストラクタの引き数*/);
こうでした。
int型を足すのがよくわからないですが、リンク先の文章ではクラスの配列をintでずらしてましたし・・・
こうやって理解しないままでたまたまコンパイルできちゃったときにバグが蓄積されていくわけだな
どうも2Dキャラの画像パターンが早いと思ったら>と<が逆だった、紛らわしい
ifとかだと逆になるんだっけ
*kurasuB B;
int Bnum
kurasuA(int num){
Bnum=num;
for(int i=0;i<num;i++){
B[num] = new kurasuB("aa");
}
}
これじゃダメっていう
悪いことは言わん
Placement newのことはひとまず忘れるんだ
配列とポインタが全然わかってないのが致命的。
もっと初心者向けのやり方でやれ(つまり初期化の関数作れ)
int karasu_num = 100;
Karasu* karasu_list = new Karasu[100];
for(int i=0;i<karasu_num;i++){
karasu_list[i].Initialize("oh...yea...oh...yes...!");
}
ちなみに placement new だと。
for(int i=0;i<num;i++){
new( B+i ) kurasuB( "aa" );
}
で、それが出来るとどんなゲームが作れるの?
無能には作れないゲームがつくれます
>>131 じゃあ
>>132のほうが簡単じゃないですか
numをconstにすれば多分安全ですし・・・
CRASS **Crass;
Crass = new *CRASS[Num];
for(i=0;i<Num;i++)
{
Crass[i]=new CRASS;
}
少々くどいな
そろそろ他の話題が出てこないかな
非ポインタ配列・コンストラクタで初期化値渡す、ってのに拘ってたら
何時までたってもゲーム作れんぞ。
コーディング中にゲームデザインの見落とし・見直しで嫌ほど悩むのに。
ポインタでの管理が安全じゃないって思うのは単に理解不足。
九九の答えが合ってるか分からないから足し算で計算するのと同レベル。
動いたとしてもメモリリークしまくってそう
>>135 俺がそちらを進めるのは彼がポインタや参照を理解してないとみたから。
質問の文からみて非常に程度が低い。
とりあえず無難なやりかたで進めながら勉強するか、一生無理だね。。
ポインタと参照がわからずつかえないなら
VBでやったほうがわかりやすいし生産効率あがるとおもう
VBで不便に感じたことがCのポインタで便利になったと思え
理解がはやいんじゃないかな
少し前までシーン遷移は継承したクラスのポインタでやってたが
最近テンプレートの特殊化を知って少しずつ処理を置き換えてる
多少手間増えるけど、コンパイル時にエラー出してくれるのはやっぱいいね
みんな頭良さそうだな、俺なんて順次選択繰り返しのゴリ押しだけでゲーム作ってるのにCプログラマ名乗ってるわ
ぶっちゃけ画像と音声と条件文あればどうにでも
この板ではC++だろうがHSPだろうがツクールだろうが
ゲームを完成させるのが一番大事。
ただ、C++選んでる奴は既存のシステムや
枠組みに囚われたく無い奴が比較的多いんだろうな。
となれば、それを実現するために
必要な知識や技術も自ずと増えていくわけで。
ジェネリックプログラミングか
本当に使いこなせるのは天才だけだと思ってる
言語によって、
遅くて1秒間60フレ出ないとかGC対策が面倒とか、
ライブラリ自体に制約があってやりたいことができないとか、
いろいろ制約あるけど、まぁC++とDXライブラリならそういう制約は少ないから選んだわ
知識や技術は別に特別なものは必要ないと思ってる
他の言語と共通する程度と、あとちょっとC++独自のを知ってる程度で十分かと
この板の中じゃどこ行っても万能すぎるお決まりの文句だよな
一番簡単なのってHSP?DX?
小さい仕様であればあるほどHSPのほうが簡単になる
規模が大きくなって、HSPだとめんどくせーってなったらDXライブラリもいい
HSPってクラス扱えないんだよな?
俺には無理w
>>151 でも、他人があえて言う意味って無いよな
モノを完成させたことも無いヤツが、かじった程度で御託を並べるなと言うことだろう。
ま、そういうこったなw
小さい仕様のは作ったけど今作ってる奴は完成してないからな
javaとかC#でゲーム作ったことないのにGCがどうこうとかね。
C++の80%が遅いのに、遅いDXライブラリを使う不思議。
作った作ってないって言っても0か1じゃねーんだし。
俺は数本ほど2Dゲームを作った経験があるけど、「どうせミニゲームだろ」と思われるだろうだけだろう。
ぶっちゃけミニゲームかそうでないかは、データ量の違いがほとんどを占めると思うけどw
横アクション作ってるんだけどジャンプ中に移動が出来なくて困った
ジャンプ処理と移動処理はやはり両方通るようにしないとダメか
本来、ジャンプ中に移動できるほう(いわゆるスーパーマリオジャンプ)がおかしいんだけどねw
魔界村はジャンプ中に移動できないが、
あれはプログラマが初心者だったからなのか・・・
まあジャンプの出来に関しては作り手のこだわり次第だろ
デコジャンプで面白いゲームもあれば放物線でもつまらないゲームもある
ジャンプはステージのデザインと切り離しては考えられないしな
C++は処理速度・ライブラリの豊富さ・エラーチェック・日本語がまともに通る、点に魅力感じるなぁ
HSPは「メインループとはなにか?」ってレベルの勉強には使えるかもだが、それ以降は・・・
>>160 そういやミニゲームって何だろうな
RPGの中にポーカーが入っていれば明らかにミニゲームだが
ではポーカーゲームはミニゲームなのか? とか。まあスレ違いだが
リアルでないこと、現実シミュレーションと違うことが、
ゲームの面白さに繋がることもあるよな
と思ったがこれもまぁスレチか
繋がることもあるってなんだよw
現実シミュレーションが面白さに繋がってるゲームなんて一握りしかないだろう
だったら現実でやれって話
放物線・現実シミュレーションが面白いゲームもあるし、
ジャンプ中に移動できるジャンプが面白いゲームもある
片方が一握りしかないとか、前者をやれ、とかは思わんなあ
現実でFPSをやったら殺人罪になるし、
カーレースをやったら事故死か白バイのお世話になるし、
ジャンプアクションをやったら転落死するし、
恋愛シミュレーションをしたら変態になる。
おまいらはboost使ってる?
なんですかそれは
>>170 ゲームそのものでは、あんまり使った記憶ないなあ。
それ以外だと正規表現とか使いまくってるけど。
173 :
名前は開発中のものです。:2012/05/31(木) 23:56:05.31 ID:uky8HTVF
DXLibとか時代遅れのライブラリなんかより
OgreとかBulletとか使ってるひとおらん?
今はまあC++とかよりUnityやunreal engineの時代なのかもしれんけど
流行に流されない俺様は自前ライブラリを使っていますよ?
人間、使い慣れた道具が一番でしょ。
unityとか何それ、美味いの?レベル。
物理エンジンはとにかく、
他はインターフェースの面でしか楽にならんでしょ。
インターフェースのウェイトが重めのゲームとは縁が無い。
>>173 ogreは機能豊富だけどapiデザインはもう時代遅れ
対応プラットフォームも最近だと物足りない
あえて今使う理由はないかな
>>172 なんか使えそうで使わないんだよね。
最近、シリアライズで使おうと思ったんだけど、
随分ややこしそうな処理してるんで結局やめた。
スマポで使ってる話は聞くけど、俺スマポ使わんし。
178 :
名前は開発中のものです。:2012/06/01(金) 00:27:03.18 ID:fycJbMU0
>>176 今だとC++ではどんなのがタイムリーなの?
>>169 それらが現実シミュレーションだって?冗談だろw
>>175 unity以外にwin, mac, ps, xbox, iphone, androidに対応してる
エンジンなんかあるのか?
急にステマがわいてきたな
>>170 Xpressive使ってる
>>173 Irrlicht使ってる。新しくはないが素直でいいエンジンだと思う
日本語には弱いけどね
RPG作ろうとしてるんだがゼロから作るとデータの保存・読み出しが面倒だ
Xmlで保存しちまうかw
>>184 macはいらないけど、その他は必要でしょ。
>>181 shiva + marmaladeならもっと範囲は広いのではないかと思うが、
marmaladeのゲーム機サポートは最近情報が隠れ気味...
今はideaworkgamestudioチームによる個別移植が必要なのかも。昔はそんなことなさそうだったのだけれど。
>>185 winか携帯だけでいいんじゃね
インディーズでxboxならxnaのほうが楽につくれるし
ps3は会社で専用やつがきまってることがほとんどだし
>>181 現状、windows向けにしか興味ないですしおすし
Ogre触っているけどそれよりもナウなライブラリがあると聞いて
>>189 gritとかmaratisとか
機能面ではogreユーザーには不足かもね
海外のゲームエンジンはメジャーなものでもフルスクリーン切り替えができないものがあって驚く。
>>190 gritは内部でogre使ってるって書いてるような。
フルスクリーン対応って今更必要か?
液晶モニタももはや新品はHDしか売ってないし、規格は統一されてないみたいだし
C/C++と関係するかは微妙だが…
コアなプレイヤーからの要望があって初めて搭載を検討するくらいでいんじゃね
その場合ティアリングはどうしてるんかな?
>フルスクリーン対応って今更必要か?
少なくとも俺はフルスクできないゲームはやる気がかなり減退する。
目が悪いからできるだけでかい画面でやりたいし、
全てのPCユーザーが最新環境もしくはそれに近いスペックの環境でやってるわけではない。
PS3でゲームアーカイブスを遊んだり、3DSでDSゲーを遊んだりするとき、
画像サイズを無理やり引き伸ばすか、それとも整数倍(1倍含む)にしてレターボックスにするか設定できたりするけど、
前者の需要はかなり多いと聞く。
画像サイズを任意サイズに引き伸ばすのは割と優先度高い機能と思う
フルスクリーンなしでも、画像引き伸ばしのほうは必須に近いかと
液晶ディスプレイが普及している現在、最適解像度以外に変更するようなフルスクリーン化をするぐらいなら、
最上位ウインドウを全体に展開して、プログラム側で画像を調整するべきだろう。
全てのプレイヤーが「最適解像度」を意識してるわけじゃない。
そんなの一部のマニアくらいだ。
「最上位ウィンドウを展開して〜うんぬん」ができるのは良いとして
それとは別にフルスクリーンモードをできるようにすればいいだけなのに
それをしないのは作り手の怠慢だ。
4:3の映像を16:9に引き伸ばしてデブったキャラに違和感を感じないんだろうか・・・
上下移動より左右移動の方が速かったり・・・
1)「フルスクなし、引き伸ばしなし」 →NG
2)「フルスクあり、引き伸ばしなし」 →NG
3)「フルスクなし、引き伸ばしあり」 →OK
4)「フルスクあり、引き伸ばしあり」 →OKだがそこまで手間かけなくてもいいよ
こんなとこ
解像度やアスペクト比って
それなりに柔軟に対応出来るように作るもんじゃねーの…?
と思ったけど完全2Dゲームは黒縁いれなどうにもならんのかね
フルスクリーンってひょっとしてディスプレイの大きさに完全一致させる事を言ってるのか。
フルスクリーンを望む人間がそれを望んでいると思うのか。
黒縁ありでアスペクト比優先に決まってるじゃん。
・ゲームの解像度が画面の解像度に比べて小さすぎてプレイに支障をきたす
・アスペクト比が違っていてプレイに支障をきたす
この2点について対策するのは、必須に近いな
引き伸ばしできればこのあたりはできる
スレ違い
javaでAndroidSDK触ってきたけどなんだアレ難しすぎワロタ
対応できる言語が他にはあまり無いだろ
全く無いとまでは言わないが
やっぱC++でコードいじってる方が性に合うわ
3Dゲームなら4:3にも16:9にも対応してないと困る。
3D部分はカメラのパラメータいじるだけだし。
GUIのレイアウトがちょっと面倒だが。
Windows2Kも見捨てた事だし、4:3も見捨てるかな?
どうせ完成までには時間もかかるし
4:3モニタだと香港映画のエンドロールみたく縦長になるの?w
DbD、アス比固定、全画面の選択はビデオカードもしくはディスプレイの仕事だから下手に弄る必要ないよ
例外として、ドット絵系のゲームが拡大されてぼけぼけになるのを防ぐために必ずゲーム側でNN法で拡大したいとか、
画面の大きさによってゲーム内で見える範囲を変えたいとか、3DならGUIの大きさだけ小さいままにしたいとかなら弄らないといけないけどね
「画面が小さいからプレイに支障をきたす」ということで拡大したいならゲーム側での処理は一切必要ない
もちろんフルスクリーンとウィンドウモードを切り替えるオプションは必要だけどな
スレ違いか微妙なところだな
ブラウザゲーでは考慮のいらない部分だし
C/C++以外の環境ではあまり問題にならない部分か
個人的には、ゲーム側に拡大機能がついてないと困るわ
わざわざ拡大するフリーソフトが存在する理由はそれだし
しかも、そのソフトでも拡大できないゲームとかあったりして困るわ
2Dエフェクトとか3Dエフェクトって作るの難しいな…微妙な差が違和感を産む
もしかして自分で作成ツールとか作るのが普通なのか?
>>216 モンハンのような血しぶきがつくれなくてこまっています
>>215 普通のPCならグラボかモニタで設定できるだぞ?
5年以上古いビジネス用途のノートパソコンとか使ってるんだろうが
ゲームするならまともなやつに買い替えたほうがいいよ
220 :
219:2012/06/03(日) 14:29:44.36 ID:4q6OEElb
ああ失敬、フルスクリーンでか。
拡大機能っていうからウィンドウモードでの話かと思ってた。
それならグラボなりモニタ任せってのは1つの方法だよね。
多くのモニタ/グラボが対応してる解像度を選ぶなら、1920x1080とかになっちゃいそうだけど…。
つい最近、昔の320x240のゲームをフルスクで起動したら、見事に真ん中に小さく表示されてしまったのを思い出した。
洋ゲーとかその辺しっかりしてる印象があるけど、デュアルモニタ絡みになると結構バラバラのような。
対応してる解像度って何の話してんだ?
どんな解像度だろうがスケーリングはできるだろ
>つい最近、昔の320x240のゲームをフルスクで起動したら、見事に真ん中に小さく表示されてしまったのを思い出した。
これはスケーリングの設定をDbDにしてるからだろ
嫌なら他の設定にすればいいのに意味がわからん
newとかmallocでちゃんとエラー処理してる人っている?
ってかメモリ確保失敗って実際問題起こる?
エラー処理って言ってもログ出すぐらいだな。
ちなみに、細かい動的メモリー確保で起きるフラグメンテーションには自前でGC作って対応した。
起きないだろ。
メモリ足りなきゃOSがHDD使って仮想メモリをいくらでも作るはず。
それにプレイヤーが推奨動作環境でプレイしていれば
まずメモリが足りなくなるはずないし、普通は必要ない。
226 :
名前は開発中のものです。:2012/06/03(日) 21:00:29.34 ID:v/OzWZ4D
VCのヒープメモリーのサイズは10Mしか無いって知らないんだね
ちなみにnewやmallocはヒープメモリーだ
それ以上のメモリーを取得しようと思ったら、VirtualAllocを使わないと駄目だよ
間違えた。ヒープのサイズは1Mだった。
スタックサイズと間違えてるだろ明らかに・・・
>>226 そんな事実はない。VirtualAllocのがぎりぎりまでとれるのは事実だけど管理も全部自分でするはめになるぞ
>>228 いや、初期値はそれで合ってる。仮想メモリの上限がくるまでどんどん拡張される仕様
ヒープが1Mってw
20年前かw
>>228 VC2010とヒープで検索してみ?
っつ〜か、携帯からの入力は疲れるな
Windows で new の仕様としてHeapAlloc を呼ぶ
HeapAlloc はヒープサイズが足りなくなったらVirtualAlloc を呼ぶ
ソースプリーズ
ごめんうそ書いた。確かめたら
new は足りなくなったら直接VirtualAlloc 呼ぶのね
じゃあ、どっち道newでいいじゃん。
つか、32Mでも確保エラー俺のとこじゃ起きないけど。
>>233 実際やってみ。状況にもよるが数百Mぐらいは特に問題ないから
Win32の VirtualAlloc は仮想メモリから直接メモリを確保する機能で、
ページ単位の操作しかできないので細かい確保にはむかない。
100byte だけ欲しいと思っても 64kbとられてしまうので、
C++のオブジェクトの確保とかで使うとすごい無駄なことになる
静的なM単位の大容量データの確保用に使うのには向いてる
HeapAlloc は仮想メモリから確保したメモリを、
さらに小分けに管理して割り当ててくれる。管理のオーバヘッドと
引き替えに細かいメモリを効率的に使える。
VC++ の malloc や new はこの HeapAlloc で実装されてるはず
ただ、ヒープ系メモリはどうしても「断片化」がおこる。
合計ではメモリが余ってても、間に邪魔者がいると連続領域を確保できなくなる。
ゲームはわりとこの断片化をおこしやすい傾向があるので、
オブジェクトの寿命ごとにヒープを別グループで確保するのが
定番テクニックになる。C++ ではクラス単位で new を差し替えできるから、
そこで使うヒープを切り替えるようにする
Win なら HeapAlloc を直接使って別ヒープを確保する形で new を実装するか、
あるいはVirtualAlloc したメモリに対して dlmalloc などの
ヒープライブラリを使って実装することになる。
良く分からんけど、エラー処理は趣味の問題ってことでいいの?
>>239 VisualStudio2005を使ってた頃、自作のスクリプト言語を作ってみた所、
数百行程度でフラグメンテーションによると思われる確保失敗を起こした。
ちなみにその頃のOSはxp。
で、GlobalAllocのGHNDを使って回避した。
Windowsが7になってもこの状況が変わったとは思えないんだがな……
銃クラスが、兵士クラスのアドレス貰って銃クラスが当たり判定すべき?
それとも銃クラスから判定クラスに銃クラスの位置や角度を渡して判定させるべき?
なになにする「べき」なんて方法は無い。
システムに合わせて一番実装しやすい方法を選択しろ。
>>241 メモリ確保失敗したら、基本続けるのは無理だろうから基本は即終了でいいんじゃないかと
全部解放してタイトルに戻るとかそういう工夫はしてもいいと思う
>>242 Win32以降のGlobalAlloc/LocalAlloc はHeapAlloc のラッパー関数です。領域も malloc と同じはず
GHNDすると再配置もしてくれてるからフラグメンテーションにならなかったってことではないかと。
そのかわりパフォーマンスはわりと落ちていたと推測します
スクリプト系は、作りにもよるけど、案外あっさり
フラグメンテーションの原因になるので、あらかじめ
リソースとはヒープわけるのが上策ですね
>>241 メモリリークを引き起こさない自信があるなら、エラー処理しなくてもいいと思う
フラグメンテーションに関しては、頭の片隅にでも入れておけばいい。
>>245 その辺りの推測は、大筋では当たってると思う。ただ、ちょっと疑問がね。
GlobalAllocのクリップボードでの使われ方の説明がつかない。そして、
GlobalAllocのGHND(正確にはGMEM_MOVEABLE)は64K個まで使える。
この意味理解できる?
おそらく、GlobalAllocのGHNDのヒープは、アプリケーションのヒープ領域
とは別に、OSが割り振ったヒープ領域を使ってる可能性がある。そのため、
下手にヒープ領域を使うよりもより多くのヒープ領域を使える可能性がある。
>>248 そうだよ
似た質問しない方が良かった?
何回も同じような質問するのはまずいだろ
「やろとしたができなかった」とか「やってみたが効果がいまいちだった」とかなら
それを軽く説明してから改めて質問に入るべきじゃね
でなきゃ
>>243だよ。相手する意味がないしな
銃は発射するだけだろ。弾受け取って兵士が処理すりゃいい。
フルアーマーの奴と、裸の奴もおるだろ。
じゃあ生成したユニットデータに座標を持たせるのと、
マップの座標にユニット番号持たせるのどっちが良いのっと
好みだろ
>>251 基本的に当たり判定って食らう側がするもんだよね
この手の話って、常に正解を教えられて育ってきた人間が、精神病のごとく質問してくるよね。
自分で決めていいことなのに、自分で決められず、
誰かに正解を提示されないと不安で仕方がない心の病気にかかっているヤツ。
それまで・これからのコーディングやゲームデザインによっても変わってくるしな。
その上で、この手法はこういうデメリットがあるし、
あの手法はああいうデメリットがあるし悩んでる。
っていうのを言えば、こういう方法があんじゃね?
ってことも言えるんだけど。
質問が大雑把過ぎるんだよな、結局。
恐らくデザインやクラス設計がイマイチ固まってないんだろう。
弾が速くて可変フレームレートの場合は、
前回の位置と今の位置との線分で当たり判定が必要だから、
弾を移動させるロジックと同時に判定もさせた方が
楽だと思うに一票。
銃の弾は、弾の移動でやったほうが楽だし
地雷の接触などはキャラが動いた時のほうが楽だし
楽なほうでやったらいいんじゃないかい
もしくは当たりイベントのスレッドをつくって統括するって方法もあるけど
弾クラスには弾クラスだけで、兵士クラスには兵士クラスだけで
完結するメソッドを持たせて、存在する全ての弾と兵士にアクセスできる
判定クラスがあればいんじゃね?
mediatorパターンというか、トランザクションスクリプトというか
Cライクやり方をお勧めする。
class Judge {
Bullet* all_bullet_array;
Soldier* all_soldier_array;
void judge_all(){
for(...){...};
}
};
FPSなら線分で良さそうに思えるが
毎フレーム接触判定してるもんなのかな
3Dかどうかもわからんが、彼のレベルからすると
ファミコンマリオぐらいのアクションゲームだと思う。
シミュレーションかもしれんぞ
マリオって作るの結構難しいよね
あのジャンプなんだよ
ジャンプ中、亀を蹴って飛び上がれるときと当たって死ぬときが
あるけどどういう判定にしているのかみたいな話題がどっかのスレであったな
>>257 射線1マスごとにユニット表総舐めする前者と
行動主を特定するのにマップを総当たりする後者
冗長構成の一貫性さえ保てればイイトコ取りの
>>254 好きなのを選ぼう!
ユニットスタックの概念がなかったら後者の方が単純でわかりやすいけど、
汎用性とか考えたら前者の方がよいんじゃないかという気がするな。
まぁ今のPCならメモリ不足はあまり心配する必要ないんだし、
前者をベースに後者の「ユニット判定専用マップ」を用意するってのが
いろいろできていいかも。
リアルテイストの競馬育成ゲームで毎年生まれる馬3万体の
遺伝データをずーっとメモリに持たせたらとんでもないことになった思い出
どうなったんです?
正直初心者にはマリオですらアクションゲーは無謀だと思う
まずはWizみたいな探索ゲーを作るべき
おいおいw Wizは難易度高いだろ。
最初はパックマンか倉庫番でいくべし。
そうかな
シーン管理と変数配列構造体辺り出来れば割りとなんとかできそうなんだけど
探索だけなら簡単だな。
1マス未満の移動を出来るようにするとか、戦闘やらイベントを加えると途端に面倒だと思う
宣言用.hと定義用.cpp作って
そこにexternで変数関係ぶち込むと凄い楽できることに気付いた
単純なミニゲームとかなら楽に作れそうだけど何か穴とかあるのかな
単純なミニゲームならそれでいいんじゃね。
規模に比例して、デメリットが大きくなると思うけど。
>>276 関数外のstaticの使い方とか覚えると、さらに世界が広がる
>>277 デメリットって?
>>236 ソースプリーズ
new はVirtualAllocを呼ばないだろ
extern自体あまり使うべきじゃないよな...
>>278 「グローバル変数 弊害」などでぐぐると沢山の資料が出てくるので、そちらを参考にされたい。
名前空間やシングルトンパターンなどの利用で回避できる部分もあるけどね。
あと、プログラミングにおける有名な考え方(哲学)の1つなんだけど。
ざっくり言うと、「オレ専用のモノはオレだけが知っていればいい」という考え方がある。
例えばfor文で使ってる変数iとか、他のところから見て何の価値も無いよね。
単にどうでもいいってだけじゃなく、価値のない情報が溢れかえると肝心の情報が埋没するというデメリットがある。
本当に必要なものだけを選別しないと、それこそ狼少年みたいに重要なことが見過ごされてしまうかもしれない。
ミニゲームのうちは、そういった無価値な情報が多少あっても問題にならない。
でも規模が大きくなると、相対的に不要な情報が増えてくるんだ。
282 :
名前は開発中のものです。:2012/06/06(水) 00:57:04.37 ID:0Qe/6ch0
木の葉を隠すなら森の中
デバイスまとめクラスは
オレオレ名前空間内のstaticなグローバルオブジェクトにしてるな
どの程度正しく作るかって難しいよな
>>281 例えばだけど、規模が大きくても付けた変数名を絶対に忘れない人が一人で作れば問題ないよな
場合によっちゃそこらへんのツールで重複調べられるしな
286 :
名前は開発中のものです。:2012/06/06(水) 07:45:33.71 ID:LQ8HTB51
グローバル変数名は頭に「g_」を付けましょう。
>>285 ホントに「例えば」だな。クラス設計が分からない時、
やたらグローバルな変数を宣言してたが見事に破綻したよ。
288 :
名前は開発中のものです。:2012/06/06(水) 09:28:51.13 ID:yfcMlTbU
>>285 「人によってはなんとかなることもあるから開発効率落としてみてもいいだろ。俺もそのなんとかなる人の一人かもしれないし」
こういうこと?
名前空間+グローバル変数は結構使いやすい。
.hと.cppをめんどくても分けるのは
相互参照でコンパイル通らないC++の都合だね。
なんだかんだで「変数はクラスに入れとけ」となるのはわかるんだが
じゃあそのクラスのインスタンスはグローバル的に参照したらダメなんかね?
たとえばジャンルがRPGだとして、キャラクターデータを
// common.h(各cppでincludeする)
namespace Sample {
// パーティーデータを宣言
MyCharacterData Party;
};
// main.cpp
#include "common.h"
int main( int argc, char ** argv, char ** env ) {
// 起動時に初期化
Party.init();
:
}
・・・といった作りにするのはどうなんだろ
グローバル変数のデメリットと言われるものは複数ある。
そのうちの幾つかは解消されるけど、残りは解消されないと言った感じ。
例えば、意図しない変数名のバッティングは回避されるだろう。
でも、複数の箇所から操作される可能性はそのままだ。
グローバル変数のメリットは複数の箇所から操作出来る事なのでは……。
>>292 それがグローバル変数の「特徴」だな。 メリットにもなりうるし、デメリットにもなりうる。
どうしても複数の箇所から操作しなければならない変数だけ、ピンポイントでグローバルにするのはマジ有効。
何でもかんでもグローバルにするのは、あまり好ましくないと言われる。
熟練者が使えば凄く有効に使えるけど、
俺のような初心者は、最初から「グローバル変数は絶対に使わない」と決めてしまった方が楽w
他にもgoto文なんかがそうだね。
ちなみに自分は、C++のconst変数(いわゆる定数)のみ、
きちんと名前空間で整理した上で、まさに>276の方法でグローバル化することがある。
もちろん、ビルド時間や不要な情報が増えるというデメリットは超デカいけど、
一箇所にまとまるというメリットも、それなりに大きい。
そうなんだ。
俺はどうでもいい一時変数以外は全部グローバルでやっちゃってるよ。
別んとこで確保したローカル変数をまた別んとこで利用する、なんてやりかたやってたらバグの温床になりそうで。
>>294 呼び出し元(例えばmain関数)で変数を宣言して、複数の関数に引数で渡すというのは、
ありとあらゆるプログラム(C/C++以外の言語でも!)で使われる書き方だ。
だからもし、そこに面倒臭さとか一種の恐怖感を感じるなら、
無理矢理にでも改善したほうが良いかもしれない。
その上でグローバルを使うなら、ご自由に。
>>294 さすがにそれは言語に対する理解が足りてないだろ。
「グローバル変数は絶対使ってはいけない」みたいなことを言う人達はおかしいとは思うけどね。
グローバル変数はどうしても必要なときにだけ使った方がいいぞ。
逆にグローバルが最適ってどんなケースだろ?
サブクラス化でメッセージ受け取ったときのための、
ウインドウハンドルを記憶させたstlのmapくらい。
とりあえず俺が使ってるのはそれくらい。
dxutなんかも、使い出したらグローバル変数は使いそうだなぁ。
>>294 一時変数ってローカル変数だろ?
確保したローカル変数ってなんぞ
メインループの前に変数宣言しておいて
メインループの中で弄ってるんだけど、
これってクラスのフィールドとメソッドポインタで代用できるよね
お前ら的にはこの方法どうなの?
シングルトンとしてわざわざprivateコンストラクタとか書きたくない場合、
引数でデータを渡すセッターが書きたくない場合かな。
まあ手抜きだね。
経験や設計力の足りない人が、とりあえずグローバル変数で手抜きをしてつくり、
後で修正するのはいいんじゃないかな。
>>299 >>15さんの好きなようにやりなさい。
302 :
名前は開発中のものです。:2012/06/06(水) 20:03:58.82 ID:dE87BNoI
一人で開発してるとどうしても手抜きになるのは仕方かも。
就職してチームで開発するようになればセオリーの
コーディングスタイルを学べるんだけどね。
すでに退職した人が書いたコードのバグを治す立場になれば
グローバル変数の悪どさが身を持って分かるようになる。
クラスごとに読み込み専用とか書き込み可能とかのアクセス制御を簡単に記述できるなら
何処からでも参照可能なデータクラスがあっても悪くないのかもしれないけど
システム担当が1人しかいないので大して変わらん俺…(´・ω・`)
そもそも数人で作れるほどの腕を持つ奴はこんなとこ来ないから別にいいよ
しかもなんでバグ前提だよ
>>302
まとめ
グローバル変数は把握出来るようにきちんと整理しておきましょう
307 :
名前は開発中のものです。:2012/06/06(水) 21:31:22.54 ID:fkjdBITD
一項目を一通り作ったらビルドしないの?
まさか全部作るまでテストしない…?
なにいってんだ俺は
一通り終わってバグがあったらその都度バグ潰すってことね
というか、グローバル変数をあちこちから直接触るのが危険、はわかるが
(どうせ他人のプログラム読むにはGrep必須じゃね? みたいな揚げ足取りは置いといて)
クラスインスタンスを大域的にアクセス可能にすることにはどういうリスクがあるかな
あちこちで生成・破棄を繰り返したらヤバイとか、
マルチスレッド時変数にロック必須とかは俺にもわかる
他に目立つデメリットってどんなものがあるだろう?
グローバルなフラグ処理があちこちで絡み合って、全体の処理が全くわけわからなくなるとかか?
グローバルアクセスじゃなくてもポインタで共有してたら
マルチスレッドでは注意が必要だな。
問題は追尾性じゃないかな。検索使わないで探すとしたら大変だ。
管理出来るなら使え、管理出来ない奴は使うな、でいいよね
315 :
311:2012/06/07(木) 08:05:17.72 ID:1pAFbwR/
なるほど・・・改めて言われてみるとそうかもな
引数にしとけば関数一覧見ただけで出入りがわかるもんな
今後参考にする、ありがとう
端から見て意思の疎通が出来てるのか心配になるやり取りだなw
317 :
名前は開発中のものです。:2012/06/07(木) 13:55:27.92 ID:QQtm5YS7
ゼノギアスみたいに3Dマップに2Dを歩かせたいんだけど、2DキャラにVECTOR座標持たせないとダメなのかな?
それともカメラとマップの動きでなんとかするのかな
やりたいようにやりなさい。
マジレスしていいのか?
オブジェクト指向の弊害というか、基本的なアルゴリズム力がない人が増えたよな
特に内部の数値と表示部を分けて考えずに直結して考えてる人が多い
アルゴリズム力って何?
まぁ、ゲームというのは基本的に電源を入れ続けている間には停止しないので、
不完全なアルゴリズムであるといえよう
ブログラムを学び始めて一ヶ月、トランプのゲームや簡単なアクションなら楽に作れるようになった
しかし未だにポインタの使い道が分からない
>>325 心配しなくても、そのうちポインタじゃないと出来ないこと、ポインタの方がスマートに出来ることにブチ当たる。
その時に改めて覚えればいいのよ。
例えば、セーブシステムを実装してみるとかどうかな。
うむセーブできるスロットを3個として
それを読み込んだり上書きしたり
そんなときに
俺がポインタ使い始めたのは
オブジェクトの配列を使わざるを得なくなったときかな?
上で一応、ポインタ不使用で配列扱う方法あったけど、
当時はそこまで調べきれんかった。
まぁ知っててもポインタ使ってただろうけど。
あとはfactoryパターンなんかポインタあってこそだな。
俺がポインタ使い始めたのは、文字列の多次元配列を使わざるを得なくなったときだった
ぼ、僕の初めてはmallocちゃん・・・
俺はライブラリがポインタ返してくる場合を除いて使わないかな
それを除けばSTLコンテナと参照渡しでほとんど済むというか
std::mapに関数ポインタ入れてスイッチ消すとかは価値あると思うんだけど
コンパイル時に型と内容が確定するメリットが捨てがたいんだよな
関数ポインタやストラテジーパターンならタイプセーフだぞ。
セガの人の本で関数内で引数の中身が変わるかどうかわかるように
ポインタと参照を使い分ける話があってそれに従ってるな
RPGツクールやってたせいかポインタ使わなくても処理できる方法が浮かぶから困る
多少コード長くなるかもしれないけど知らん
>>333 const使って解決するほうが堅牢に思える
さらにSAL注釈も付けるかな
RPGツクールとポインタ使わなくても処理できる方法の
関連性がよくわからん
みんなポインタどこで勉強した?
>>338 昔はネットが無いかわりにCマガジンという雑誌があってだな・・・
>>234>>236 今更だが、ちょっと気になったので。
GetProcessHeapとHeapCreateでそれぞれ検索する事をオススメする。
ちなみに、C++のnewがどっちのヒープを使ってるかは分からなかった。
速度では前者、汎用性、拡張性を優先しているなら後者なんだが・・・
>>337 ツクールに限らず、そもそもポインタ使わなくてもゲームは作れるって話でしょう。
あれば便利だがなくてもできなくはないという程度の意味で。
while(*dst++ = *src++ )
;
>>340 crt見ればいいよ
昔はheapを確保できればHeapAlloc、できなければVirtualAlloc
VC10だとその辺の記述がごっそりなくなってるからreallocでまとめられたのかもしれない。たぶん
というか本人がよく分かっていないのに他の人にググれっていうのは厳しいだろw
>>343 でも、
>>234>>236が何を混同してたのかは理解出来るんでは?
HeapAlloc+HeapCreate(0,0,0)の挙動とnewの挙動を
ごちゃ混ぜにしてた事は理解できたから。
HeapAlloc+GetProcessHeapの方が早いし使い勝手も良いから、
C/C++ではこちらを採用していると考える方が自然かと。拡張性は無いけど。
実はnewの挙動をMSがコッソリ変えていたというのが真相だったりしてな
>>335 constもつけるよ
あくまで呼び出した側でわかりやすいという話
一種のおまじないかも
CでIMEの設定変更する方法っていうか関数あったりする?
標準全角入力使われたら予期せぬ動きしまくるしrewindでもクリアできないしマジ困る
あれはバッファの中身どうなってるんだろう・・・
>>347 Cにあるわけない。
WindowsAPI(Win32 API)か何かに投げるんじゃねーのかな。
DirectXのサンプルの中にImeUi.h、ImeUi.cppってのがあったけど
俺は途中で放り投げたから詳細はわからない
要はTSFってのを使うらしい
"C/C++" IME
とかでぐぐるといろいろあるみたいだな
ちょっとCからは反れるかも知れないんだけど、3Dのマップモデルってどう表示してる?
1マップを超巨大なモデルを作ってそれをドカッと配置しようかとしてるんだけどまともな方法なのかな?
そしてそれに家とかのモデルを一個ずつ配置するか、それとも地面にセットでくっ付けておくか悩む
>>351 地形と家や木などの何度も登場するモデルは分けて読み込んでプログラム側で配置すると良いよ。
ロード時間の短縮、メモリ節約、当たり判定の高速化、描画の高速化のメリットがある。
もちろんこれらの機能は自分で実装しなくてはいけないけどね。
>>351 地形マップは大きいのが一つ。
建物などのオブジェクトは個々のモデルを配置する。
LODで高速化できるので。
地形マップの着地判定って手作業で設定して行くの?
それともポリゴンの点から面を取得して〜・・・
モデルの周囲のマップポリゴン取得して判定じゃないの
多分上でも横でも下でも同時に判定
開発環境どうしよ
DXライブラリで
DXライブラリからAndroid開発に移ろうともおったら
開発環境の導入難しすぎて笑えない
DXライブラリ使い始めたら便利すぎて興奮するどころか逆に「使われ感」に耐えられなくなったぜ・・・
なんつーかツクール触ってるのと同じ感覚というか
>>359 DXライブラリはそこまでフレームワークしてないだろ…
DXライブラリはせいぜいBASIC程度だと思うが
それで堪えられないんじゃVBとか使えそうにないな。
みんなすげーな、もっかいWIN32APIとDirectX勉強しなおすか
いや、DXライブラリ程度で「使われ感」を感じる方が凄いだろ。
アセンブラとか平気で使いそうだ。
こっちがビックリだな。ホント。
逸材
typeidの使い方が全然わからないんだけど誰か教えてくれ
is-a関係のスーパークラスを対象にtypeidするとサブクラスの型が帰ってくるのか?
判定マップに使おうと思うんだけど高負荷とかないよな
それより基底にidでも持たせて、それぞれのコンストラクタで初期化でもしたら速度的にいいんじゃね?
ハッシュマップとかツリーマップのキーに使えるんじゃないか?
thisで型とればサブクラスの方が取れる
class Base
{
static char*m_name;
char* GetMapKey(){ return m_name; }
コンストラクタ()
{
char* name = typeid( this ).name();
strcpy_s(...);
}
}
staticは、なんでかデバッグの時なかがみれないんでグローバルにしちゃってるわ
>>366 typeidはRTTI使うから、C++の操作の中では凄い高負荷な方だよ
それこそ
>>367の言うような実装の方がまだ良い
>>370 wikiにはdynamic_castより高速って書いてあるけど。
>>371 そらdynamic_castよりは高速だろうよ…… RTTI使って遅いのの代表格じゃないか
dynamic_castは型情報を取得して妥当な場合にcastを行うわけで、結局実行時型情報取得して、さらに操作を加えてるわけだし
あとどのwikiよ?
ドヤ顔w
RokDeBone2で3Dモーション作ったんだけどフレームの最後と最初って勝手に補間しないんだな
これってプログラム側で合わせられるのかな
その最後のフレーム+10あたりのとことに最初のフレームをコピーすればいいさ
>>375 それもそうだな、ありがとう助かった
もう一つ聞きたいんだけど、空ってどうやって描画してる?
空間の↑の方にテクスチャ貼るだけじゃダメなのかな
Skyboxって言うんだっけ?
箱とかドーム形のポリゴンにテクスチャ貼る。
Skyboxってググってもほとんど情報ないんだな
概要さえわかってれば実装自体は難しくないしな
ただ雲の影落としたいとか、ちょっと欲張りな話になってくると悩む
>>378 Game Programming Gemsに掲載されてたはず
どの号かは忘れた
C言語の知識ははprintf,scanfとかfor,whileとか触りだけ知ってて、C/C++でゲーム作りたいと思ってるんだ
まだゲームとか作ったことないから簡単なプログラムのゲームから作っていきたいと思ってるんだけど、
どんな物から作っていけばいいんだろう・・・
わからないところはグーグル先生なりに頼って調べてやるつもりだから
誰かオススメ教えて(´Д⊂
作りたいものを作れ
いや冗談抜きで簡単だけど作りたくないもの作っても作る気力出ないからちょっと複雑でも作りたいものを作るのがいい
ルーチンを学べば後は単語組み合わせるだけだから楽
難易度高ければDXライブラリでも使え
ミニゲーム作りなよ
>>381 マスターマインドとかはどう?
4桁の数字を当てるやつ
Hit&Blowかそれ
色々ありがとう。
とりあえずマスターマインド?Hit&Blow?
かわかんないけど、それ作ってみるわ
テンプレも整えていきたいな
Cのゲーム作りってビットいじるイメージあるが
>>377 それ画面端に近づいたときに歩いて空に触れるっていう現象が起こるんじゃね?
skyrimとかやってるとなにか他の方法があるはずなんだよなと思う
あ、ところで皆はフローチャート書いてる?
3Dやったことないけど、視点中心に固定すりゃいいんじゃないの。
空みたいな遠景、キャラが動いた程度で景色が変わるわけじゃないし。
それでも景色変わらせたかったらプラネタリウムみたいに球体を回すとか。
C++/CLIならとにかく初心者がいきなり
windowsプログラミングに手出すと訳分からなくなるから
とりあえずCUIベースのほうがいいね。
>>391 クラス設計は脳内にしろ紙上にしろ必ずする。
フローチャートは複数のクラスを参照する
込み入った処理を書くときくらい。
背景が3Dでプレイヤーが2Dのゲームって、一見キャラは2Dだけど実は全部3D処理なのか?
モデルに2Dテクスチャ貼っつけて常にカメラの方を向くようにしてるだけなんかな
ジオメトリの後にいつもの2Dゲーみたいにビュー上に反映させればいいだけじゃないのか
ゲームによるとしか。
コーディングで2Dっぽい記述をしても、
ライブラリの内部処理で3Dと同じエンジン使ってたりするんで
どちらを使っているかはあまり意味はない。
ライブラリによって答え変わる話を環境書かずにされてもな
>>381 モダンな思考にある程度慣れてるなら、自分の好みのライブラリで始めるといいと思う
ただWinAPIとかDirectXとかは直接触らないほうがいい、グチャグチャになりやすいからw
モダンな思考にまったく慣れてないなら、スクリプト言語系のライブラリから入るほうがいいかも?
スレ違いなんで説明はしないけど、Rubyの「DxRuby」とかLuaを使う「AIMS」とか
C++にも役に立つ発想が学べるし、なにより短時間で形になるんで、並行して触る価値はあると思います
ところで3Dエフェクトって完全透明なメッシュに普通のテクスチャを貼る、で合ってる?
モデル扱いだよね?
>>399 透明なメッシュっていうか、テクスチャが透明(アルファ付き)なんだけど。
>>400 ごめん俺がよく理解してないかもしれない
見えないモデル(ポリゴン)に、テクスチャ(フォトショとかで透過した斬撃など)を貼って表示するんだよね?
見えないポリゴンにテクスチャ貼っても意味ないだろ
>>399 そんなとこじゃない?
後はシェーダを使うとか。
>>402 透明なガラスに絵を描くようなものだよ。
ポリゴンのアルファ値 * テクスチャのアルファ値 が最終的なアルファ値だから、ポリゴンは不透明にしなきゃ
○透明なガラスに絵を描く
×絵が描いてあるガラスが透明
○×逆だったわw
ポリゴンは普通白でしょ。
それにアルファ付きテクスチャ貼れば透明になる。
ポリゴンの方のアルファ直でイフェクトのフェードイン・アウトを
表現する。
うわあああああああああああああああ
うおおおおおおおおおおおおおおおおおお
出来たああああああああああああああああ
必要のないincludeって可読性のためにしますか?
例えば、
キャラクタークラス→判定クラス/攻撃判定クラス→判定管理クラス・・・
みたいに枝分かれしたりくっついたりしてわかりにくいじゃないですか。
しかも判定管理クラスはキャラクタークラスの情報もわかるわけで、
判定管理クラスでキャラクターの情報を扱おう(ポインタとか)と思った場合簡単にできちゃうわけじゃないですか
そういった場合、無駄というか多少サイズが増えようともincludeを記述すべきなんでしょうか
勿論includeガードを前提とした話で
まだ自前includeが5個しかない小規模プロジェクトだから、
必要なincludeだけ配置する、のほうを優先してる
情報を扱おうと思ったらincludeは必須だろ
ってかソースファイルのサイズなんか意識したことない。
ちょっと俺のソースファイル眺めてみたら
判定管理クラスでもvector使う必要性が生じたら
キャラクタークラスでvectorをincludeしてても新しくincludeする。
と言っても判定管理クラスでは
キャラクタークラスはわざわざincludeしない。
新しくincludeするかどうかは
完全にカプセル化されているか否かだと思うんだけど
自分でもどういうときにやるのか良く分からんw
あともう一個・・・
攻撃を受けることをなんていう?
攻撃←→攻撃を受ける
っておかしいし、弾限定なら
射撃←→被弾
ってあるわけだからなんか・・・思いつかん
>>411 自分の場合、パッと見て分からないものならincludeする。
分かりそうならincludeしないことも多い。
例えば親クラスの親クラスとかなら、簡単に想像できるので改めてincludeはしない。
でも、3代も4代も遡るなら、includeするかもしれない。
継承じゃなくて、例えば途中で特定の構造体を使うために読み込んでるヘッダファイルとかなら、
たとえ必要じゃなくてもincludeすると思う。
>>415 防御、被害、攻撃対象、被ダメージ
このあたりだと思うが、たぶんスレ違い。
被撃やなw
四角・線・円のどれかの形を持ったオブジェクトが複数あって、
それぞれ重なってるかどうかを確認したいんだけどどうしたらいい?
四角-四角
四角-線
四角-円
線-線
線-円
円-円
ってそれぞれ関数を作って、それぞれswitchで分岐したほうがいいの?
>>419 とりあえずその6つの関数はすべて用意した方がいいね。
staticにして。
どう呼び出すかは色々方法あるけど、C++なら
各形状クラスにIsCollidedWith(anotherObject)
って関数作って、その中で処理すると分かりやすいかな。
やったああああああ基本ルーチンできたあああああああああああ
3Dは難易度高い分嬉しいな
だから対外できたああああああああ時点で燃え尽きて
自己満足し完成しない
質問いいですか?
やりたい事:メインのウインドウからの操作で
コンフィグ用のサブウィンドウを呼び出したい
困ったこと:
メインを閉じるとサブのほうが解放されない
(タスクマネージャのプロセスで.exeが残る)
今の状態:
メインのWndProc(HWND ...){
static SubWindow* sub=NULL;
swith(msg){
WM_LBUTTONDOWN:
if (!sub){
sub=new SubWindow();
sub->Loop();
delete sub;
sub=NULL;
}
return 0;
WM_CLOSE:
if(sub){
delete sub;
sub=NULL;
}
break;
...
注)SubWindowはコンストラクタやデストラクタでCreateWindowとか
DestroyWindowsを呼んでいてこれは単体テストでは問題なく動く
サブを先に閉じるとちゃんと解放される
ポインタ消しただけだからじゃないの
>425
独学なのでスレッドの概念がいまいち理解できてないのかもしれませんが
クラスのThread的なものは使ってなくてLoopの中身はよくあるGetMessageとかを
無限ループに入れたやつです(これがないとすぐdeleteが呼ばれるので)
全体の構成を変えてsub->Loop()を失くすと上手くいきました
ありがとうございました
>>426 基本的にウインドウメッセージは必要な処理が終わったら
すぐにOSに処理を返さなきゃ駄目。
メッセージループはもちろん、重くなる画像処理なんかもできれば避けるべき。
そもそもメッセージループを二つ持つ設計もあまり聞かない。
俺が作るならコンフィグ用ウインドウをモーダルなダイアログにするなぁ。
428 :
426:2012/06/30(土) 09:46:52.38 ID:P6kSrEOz
>427
一人で勉強するとこういう暗黙の常識とか天下り的にこう書けみたいに
なっている所を間違いがちなのは自覚しています
(今回はメッセージループはウインドウごとに必要と勘違いしていました
よく考えたらハンドルも渡して無いし当たり前なのですが)
モーダルダイアログは使ったことが無いのですが試してみて使い勝手が
いいほうで実装しようと思います
429 :
名前は開発中のものです。:2012/06/30(土) 15:01:50.05 ID:3F9rNwbD
14歳からはじめるC++ゲームプログラミングを読んでみて
理解を深めるために改造に挑戦してるんですが、シューティングゲームからアクションゲームにしたいと思っています。
拾ってきた棒人間の素材を歩かせてパンチを実装するところまでは出来たんですが、パンチして相手がのけぞる・・なんてプログラムはどのようなロジックが必要ですかね?
見当が付きません・・・向いてないのかな・・・w
因みに当たり判定は一応出来てます。DXライブラリを使用しています。
>>429 敵キャラが攻撃を受けて消滅する、というプログラムが出来るなら、
やることは同じだぜ
431 :
名前は開発中のものです。:2012/06/30(土) 15:21:01.50 ID:3F9rNwbD
>>430 回答ありがとうございます。
なるほど、敵のライフが減ったらのけぞるアニメーションを出力させる。ということをすれば良かったのか・・・w
なんかアホみたいな質問すみませんでしたwww
ダメージを受けた⇒仰け反る画像表示⇒必要あらばノックバック(x軸移動)⇒元に戻す
433 :
名前は開発中のものです。:2012/06/30(土) 16:03:33.88 ID:3F9rNwbD
>>432 ノックバックもあったほうがいいですね!試みてみます!
じ際やるかどうかは別として、仕組みだけでも作っておけば、
ノックバックの数値による武器性能差や敵の防御力差も表現できるからなー。
自キャラと敵の位置関係からのけぞる方向を決めて…ってまで言わなくていいか。
当たり判定って難しいなぁ
斜め四部分の座標を用意して判定してるんだけどダメなのかな
左上と右下だけでいいらしいけど
なんで矩形判定に四つも座標要るんだよw
上下のx座標は同じだし、
左右のy座標は同じだろ。
当たり判定はぐぐればいくらでも例が出てくるから、
かなり簡単なほうだと思う
回転しない矩形なら、まずは1次元(いわゆる数直線)での線分同士の接触から考えると良いと思うんだ。
いくらなんでも回転は必要だろw
ゲームによる
小規模なゲームなら、回転なしで済むことも多いんじゃないかな
小さい当たり判定を持つブロックを連結して回転させるって方法もある。
自機との衝突判定ならそうはいかないけど
敵と自弾の当たり判定なら適当でもそれっぽく見えるもんだしな。
C++でゲームを作る利点は? と訊かれて、何と答えれば良いですか?
座標クラス作って矩形クラス作ってテキスト表示クラス作って
イベント処理クラス作ったあたりで力尽きて次のプロジェクトを開く俺
ノウハウが多い
便利なライブラリがある
俺が慣れてる
C++しかやったことないから分からん
高速省メモリ以外に何があるというんだ
C++の勉強と並行にできるから
C++に対する各界の反応:
私はオブジェクト指向という言葉を発明したが、C++のことなんて全く念頭になかったね。
-- アラン・ケイ
C++の進化の歴史は文字列の抽象化を漏れを塞ごうと試行錯誤するものである。
なぜ彼らが単にネイティブ文字列を追加しないのかわからない。
-- ジョエル・スポルスキー
C++は見栄えをよくしたCOBOLとして現在使われている唯一の言語だ。
-- バートランド・メイヤー
もしBjarneがCとの互換性にこだわる必要がなかったとしたら、Javaを開発していたろうね。
-- ビル・ジョイ
C++言語のデザイナーたちは、同じ問題を解決するアイディアが二つあると、いつも「よし、両方ともやろう」と言う。
だからこの言語は私の感覚ではかなり奇怪(baroque)なものになっている。
-- ドナルド・クヌース
歴史的に、他人に使ってもらえるようにデザインされた言語は出来が悪い:COBOL, PL/I, Pascal, Ada, C++.
良い言語はクリエイターが自身が使うためにデザインしたものである:C, Perl, Smalltalk, Lsip.
-- ポール・グレアム
C++なぞ問題外. ^^;;;
-- まつもとゆきひろ
>>444の質問の仕方が微妙に癪に障る。
「何と答えれば良いですか?」ってどういうことだよ。
>>453 誰かに聞かれて答えに窮したんじゃない?
>>454 だったら尚更おかしくねーか?
>>444がC++に何らかの利点を見出して使っていて
誰かから氏の考える利点を聞かれたのだとしたら、
こちらはそれを知る由がない。とどのつまり、氏の考えを答えれば良い。
「俺はこう思うがみんなはどう思う?」ならわかりやすいってこったな
または、「俺にはよくわからないがみんなはどう思う?」かな
3Dの当たり判定フレームって用意するべき?
透明で作ったのに実際に使うと灰色で表示しちゃう
ここC/C++総合でエスパースレじゃないからいい加減にしとけ
ワロタw
これはすごいww
__|__ __|__ /\ ____
__|__ _|_ /__\ / | _|_
__| / |/ ヽ _|_ ( | .__|
(_ノ\ ヽ__| ノ ヽ _|_ \ し(_丿\
| 立 ヽ|二| | | | ___
ノ|ヽ日 ヽ|二| | | .|
| 心 /ハ .」 | (___
__
\ | |
_ |_|二|_ ―┼―ヽヽ_/_ . l | _|_,
| |┌┐ | ―┼― / \ | \. |  ̄ ̄| ̄ \ /ヽヽ |/⌒ヽ
/. |└┘ .」 | ゝ / ___| | | | | / /| |
/\____ \_ \ノ\ レ レ ノ l__. | ○ヽ
文字を枠内に修めるように20字で改行するようにしたら文字化けして禿げる
結局1文字目から半角全角判定するはめになってしまった
文字数カウントならUnicodeでも使えば? と思ったけど
その目的じゃ無意味か…
文字使わないゲームは楽でいい
ちょっと質問、アクションでの敵の出現って
マップロード時に出現用座標xyセット→
出現用xyが画面(640*480)より内側に入ったら実座標xyをセットして出現フラグ0から1に→
出現フラグ1の時に敵の行動
でいいのかな?
シューティングは時間で勝手に出てくるからいいんだけどアクションとなると不安になる
ちゃんと想定通りになるなら、なんでもいいんじゃないの。
規模によっては、ゲームスタート時に全敵キャラ配置してしまって、
プレイヤーが近づくまでは動かない、みたいにしておいても問題ないだろうし。
>>467 画面に写ってる・写ってない関係なく、
すべての敵を同等に処理すべし。
例えば「主人公が近づいたら攻撃開始」ってロジックだと、
遠くの敵は何もしないわけから、出現フラグとかは無駄なだけ。
キャラが持ってる座標は一つだけでいい。(ワールド座標)
スクリーン座標への変換は描画する時に毎フレーム行う。
>>469 意味が分からない
どれに対して何を言っているんだ
>>470 何が分からないのか逆に分からないが、一応467の言葉を使ってまとめると、
ー出現フラグはいらない(常に1という扱いでいい)
ー出現用座標・実座標という区分はいらない(キャラが持つのは
ワールド座標一つだけ。描画のルーチン内でスクリーン座標に変換)
>>471 なるほど
でも座標区分しないと復活した時に面倒じゃないの?
一回倒せば二度と出てこないってんならそれでもいいけど
あるクラスのメンバクラスが、他のメンバクラスにアクセスするにはどうしたらいいでしょうか?
private:
hoge a;
hage b;
aからbにアクセスするにはbのアドレスをaに渡すほうがいいのでしょうか?
aを配列として使うのですべての配列要素が全く同じアドレスを持つというのは無駄な気がしなくもないんですが・・・
staticメンバ使えば最初に登録すればいいだけなのでは
とりあえず、メンバクラスにアドレスを渡して置くという方法?
>>474 aの管理クラスを作ってbにアドレスを渡してる。
aのインスタンス管理は無論、a管理クラスに任せる。
>>476 hogeのstaticメンバとしてhageへのポインタを用意すんの
これじゃだめかな
>>474 aが何で、bが何かによると思うのは俺だけ?
ネトゲのリポップ処理ってどうやってるんだろうね
あれ全モンスターにID持たせるのかな、数千数万になるけど…
エリアごとに分けてればそれほどでもないだろ。
エリアのプレイヤー数に対してモンスターが少なすぎるようなら生成
IDは生成したときに与える、ってとこじゃないだろうか
俺はID(があるなら)固定だと思うけどね。ていうかそもそも消えたりしてないんじゃないかと。
例えば、あるエリアにスライム5、ゴブリン5居たとして、スライム一匹潰した後に湧くのが
ゴブリンだなんて事はありえない。かならずスライムが湧くはず。
つまりスライムは完全に消えたわけじゃなくて、見えなくなっただけで時間が経つとまた出てくる。
(もし近くに長時間プレイヤーがいなければ、また見えなくなる)
……って感じじゃないかと思ってる。
敵って湧き出させるモノだったのか。作りかけで放置している
アクションゲームでは、敵はマップの切り替え時に出現させてたな。
ちなみに今はRPGを作ってる。
敵をどう出現させるかはゲームにもよるんじゃね?
ネトゲの場合はマップ切り替え事に敵を出現させるわけにはいかないからな
各プレイヤーの画面から外れた時や、視覚になっているところにスポーンさせてるゲームもあるね。
煙とともに湧き出して、爆発して消えれば良いんじゃね?
まあ、地面から生えてきても空から降ってきても何でも良いわけだが。
やっぱり全マップの全モンスターに個別の識別IDあるっぽいね…
データは鯖で受け持つからいけるのか
鯖を安定させたいなら敵の数は一定数以下にするわな。
メモリーの断片化問題は未だに存在するからな。
モンスがマップ移動せず、そのマップで出現数とか種類が固定ならさして意識するほどでもないんじゃないか
同期もマップごとだろうしなおさら負荷は軽いと思うけど
むしろモンスターよりもアクセス数の方が問題になるんじゃね?
何人がアクセスするかは知らんけど。podとかもアクセスするんだろうし。
まあモンスターの増減にくらべたらプレイヤーのIN/OUT管理のほうが面倒だろうね
そのへん扱った本も出てた気がするが
キャラクターってポップ・リスポーンするたびにnewする?
アバウトすぎて悪いが。
弾幕ゲーの弾みたいに、大量に使うもんでもなければnewしちゃうかなー。
>>494 PCならnewで問題ない。
モバイルだとメモリ容量とスピードが厳しいから
スタート時に必要な分だけnewしておくって
方法が推奨されてるが。
2DSTGで大量に使うつもりなんで、最初にnewするほうで作ってる
最初にやるならnewである必要はないんじゃなかろうか
( ´・ω・)ニュ?
二重三重にnewするぐらいなら素直にvector使っとけって事だろ
std::vector< std::vector<int> >
とかな
vectorならいっそlistで…
ん、ここC#じゃなくてC++だろ?
ん?
>>500 intならそれでいいけど、キャラの話だからクラスでしょ。
無駄にコピーコンストラクタ呼ばない為にもポインタ配列の方がスマート。
最初に宣言するなら静的に確保すればいいって話じゃないの?
ポリモルフィズム絡むと動的確保になるんじゃね?
>>507 今ならその振る舞いはデータなりスクリプトなり外に定義するのが定石だし、あんまり多態に気を使う必要はないと思うな。
>>507 そういうものなの?
ほかの人がどうやって処理してるのか知らないけど、私みたいに敵弾全てのポインタを一つのlistにまとめて、判定が求められる度に最初から最後まで回すというやり方だと、静的確保でも動的確保でも扱いは一緒だけど。
>>509 うーんと、日本語でok。
色々言葉が抜けてると思う。
文章の意味は通じるけど、噛み合ってないだけのような気がする。
例えば敵キャラだとして、
>507:
敵基本クラスを用意して、それぞれの敵ごとに派生クラスを用意する方法。(ポリモーフィズム)
この場合、それぞれの敵データは動的確保になるのではないか。
→ コンテナ自体については何も言っていない。
>509:
初心者向け講座などでも見かける、分かりやすい方法。
配列に突っ込んでfor文で回し、その敵キャラが生存中なら動かす。
こういう使い方なら、コンテナが性的確保でも動的確保でも大して変わらないのではないか。
性的確保とかオニーチャン(*・∀・*)エッチー!!
俺も性的確保してるわー!!
クォータニオン全然わかんね
フライトゲー作れん
クォータニオンの理屈を理解する必要はないでしょ。
ただ関数の使い方を覚えればいいだけ。
ベクトル演算してくれる便利な関数として。
今イベント作ってるんだけど結構難しいな、処理の流れが分からん
呼び出したイベントの中でwhileさせて終わったらbreakして元のゲームシーンに戻る、でいいのかな
Event e;
while (GetEvent(&e)) {
switch(e.types){
case EV_XXX: Handle_XXX(&e); break;
case EV_YYY: Handle_YYY(&e); break;
default: UndefinedEvent(&e); break;
}
}
Update();
Render();
こういう話け?
ゲームループを2つ持つのは危険じゃない?
危険というか面倒というか。
>>517 多分そう、具体的にいうとイベント発生場所にいったら関数でIventを呼び出して…って思ったけどよく考えたらwhileいらなそうだった…
とにかく呼び出したイベント内で人形劇の処理をして、終わったら操作可能にしたいんだ
>>519 イベントではゲームのステートを「ゲーム中」から「人形劇」に変えるだけ。
Update関数の中で、
if ( state == IN_GAME ) UpdateGame();
if ( state == NINGYOGEKI ) UpdateNingyogeki();
って分けて処理する。
Render関数内も同様にステート別に分けて処理する。
一番いいのはStateMachineのデザインパターンを使う事だな。
なんか話がかみ合わないと思ったらここDXライブラリスレからの派生だったのか
ほかの人がC/C++で何使ってるかも興味ある
カードゲーム作ってる
>>521 噛み合わないって程でもないと思うけどな。
DXライブラリのユーザや経験者はかなり多いから、その話になることはあると思うけど。
どこにDXライブラリの話があったのかすら分からない
俺はどうかしてしまったんだろうか
>>519 シーンごとにクラス分けてポインタで切り替えるのが一般的なんじゃないかな
俺はシーン遷移が好きじゃないんで、
入力処理、描画処理、エネミー管理、などをそれぞれクラスにして毎ループ呼んでる
処理が不要なときはそれらのクラスが自分で判断して即return
いずれにしろ、ゲームループ側では何も判断しないほうが安全だろうと思う
メインループあちこちに作っても作れなくはないだろうけど、大変でしょ。単純に
C++で書かれていてお手本になるような、ゲームのソースコードがどこかにないものか
出来のいいオープンソースのゲームを覗くしかないのでは
でも出来がいいものほどソース理解するの難しいよな
デザインパターンを理解してないと難しいだろうね。
Factoryとか。
出来のいいものほど柔らか骨格にパラメータで全体の流れを巧みに操つる造りに成ってるからな
勉強の段階によってお手本は変わってくるんじゃね
1個のお手本で、こどものさんすうから大学の数学までカバーできないように
むしろDXライブラリ使ってまでC++に留まるメリットがわからん
というか何が言いたいのかわからん。
>>534 ちょっと考えてみたが、C言語用のゲームライブラリくらいにしか認識してないのかなと思った。
それなら何故C++使ってるのにDXライブラリなのか?という疑問も理解できる。
いや、それでも分からん・・・
じゃ何使えばいいの?
じゃあ何言語を使えばいいの?って聞き返せばいいんだよ。
C#と言う宗教
C#使ってみたけど結局C++に戻った俺もいるしな
な〜んか使い方にクセがあって扱いづらかった
.NET用に拡張されたCって感じで、VBで良いジャンて
おや?IDがPGだ
C++って資料が沢山出てるから本に頼ってゲームを作る人には扱い易いんだよな
ライブラリも色々出てるしな
まあ、自分の場合はライブラリは自前で作ってるけど
c#もc++/cliちょっと弄ったことある。
ヴィジュアルな開発スタイルは確かに魅力的だが
いかんせん、.netがもっさりしてるw
いや、C#の構文は美しいよ。
さすがに後発だけあって、Javaでの不都合も解消されてるし。
スピード命のエンジンレベルはC++で、
ゲームの挙動レベルはC#でって組み合わせが最強。
C#キチは専用スレでやってね
現状ではWin2000以降の対応でゲーム出してるけど、.NETだとランタイムをユーザーにインストールして貰う必要があるからなあ。
フリーソフトならともかく金取ってるゲームでそんな手間かけてもらうわけにもいかない。
545 :
535:2012/07/13(金) 12:54:11.36 ID:enpDtwWd
>>536 >DxLib + C++
例えるなら、PerlでGUIアプリを作るとか、PHPをウェブ以外で使うとか、
特に問題があるわけではないけど、何か違うくね?……っていう感覚なんじゃないかなと。
DxLibは基本的にDirectXのラッパでしかなく、それを更にラップした独自ライブラリ/フレームワークを用意して
実際のゲーム制作ではそちらを使うというスタイルが多い(らしい)から、ちょっと的外れかなとは思うけれどね。
C++初心者向けのゲームライブラリとして、何があるかまでは不勉強なので分からないや。
こんな回りくどい言い方しないで
もっと率直に自分の感情を書くべきだ
1日でIDが変わる匿名掲示板なんだから
DirectXのラッパを自作する上で参考になるサイト知らないですか?
>>547 DXライブラリのソースを読んでみたら?
俺は挫折したけどw
>>547 無目的なただのラッパ?
それとも何か理由と目的のあるラッパ?
前者ならなんとなくDxLib真似るとか、
後者なら内容次第。
完全な個人向けならお好きなように、じゃね
俺とともにIrrlichtを使わないか?
551 :
名前は開発中のものです。:2012/07/14(土) 01:50:47.28 ID:/kLJ8Xzy
ラップる目的なら色々あるな
Windowsの面倒な初期化処理を隠蔽するとか、エラー処理を統一するとか、
メモリーの断片化を押さえるとか、色々な後始末をクラス構造に任せるとか、
文字列処理を理解し易くするとか、ファイルとメモリー処理を統合するとか、
とりあえず自分がクラス構造でラップしまくった理由を思い付くままに挙げてみた
まだ何か自前ライブラリに走った理由はあったかな?
>>552 そこまで詰め込むと何かが犠牲にならない?w
パフォーマンスとか、設計構造を維持するための時間とか、
全体の整合性とか、ゲームを作る目的とライブラリを作る目的が
入れ替わってきている気がするんだが・・・。
鉄製の釘でも鋼鉄製の釘でも釘は釘なんだが。ちなみにIDがPC。w
>>552にはなにも難しいこといってない
毎回書くお決まりをまとめておいたりスマート化させるだけ
デメリットはほとんど無い
十分なスキルがあれば、いいんじゃないかな
逆に言えば、自分のスキルと相談して規模決めるのは必要かもな
ライブラリ作る時間でどれだけゲーム作れるかと
必要だと思ったときにつくりゃいいよ
ミニゲーム作る
↓
汎用的に使えそうな部分だけ抜きだす
↓
それを元に新作を作る
↓
汎用的に使えそうな部分だけ抜きだす
↓
以下、ループ
自分はこんな感じ
俺もそんな感じだな。
次第に使いやすくなってきてはいるが、あくまで「自分にとって使いやすい」だけなのが微妙だw
それに「抜き出す」作業が結構めんどい。
>>559 一応ライブラリっぽい体裁にはなってるけど、新作の度に少しずつ修正してるから
ライブラリ自体の互換性がないのも問題だよなw
カプコンのMTフレームワークもそんな感じだし別にいいんじゃね
修正と互換性は関係ないだろ...
>>562 そういう人はそうなんだろうね、としか言えん
クラスで遷移管理しているゲームで、
トップメニュー→ゲームセッティング→メインゲーム
って分けるか
トップメニュー→メインゲーム(セッティング)
ってわけるかどっちがいいの?
セッティングってのはキャラクターの数とか武器の種類とか決められる
プレイヤーに何をやらせたいか次第じゃない?
毎回セッティングさせたいなら、セッティングを上位に持ってくる
セッティングは最初の1回だけなら、セッティングは下位に置いておく
その中間なら、中間の位置
スタンダードなのは
・トップメニュー
・メインゲーム
・ゲームセッティング
という階層構造だよな
>>565 ゲームセッティングの情報をメインゲームに伝えるにはトップメニューで情報を持つの?
ごめん、
>>565はUIのことしか考えてなかったわ
多分
>>564のききたいことと無関係なんで、一旦おいといて
参照さえ渡しておけば、どっちからでも呼び出せるんでは。
全部シングルトンにしておけば万事おk
>>566 int level = 1; //ステージセレクト
p = new GameMain(level);
とか
p = new GameMain();
p->level = 1; //ステージセレクト
とかは?
よくわからないので
クラス3つ作って
「このゲームモードでメインゲームを作って」
↓
「ゲームモードの各種設定するからこれらを使ってメインゲーム作って」
↓
「メインゲームの管理するよ」
ってわけました
一番目のやつですね
ゲームセッティングは、 メインゲームのファクトリクラスの要素が強ければ上
(例えばSTGの残機の初期数、難易度の初期値とか)
メインゲームのパラメータを直接触るなら(例えば残機そのもの、難易度そのものを増減させる)
それは、メインゲームのコントローラクラスの要素が強いから下
もし、コントローラクラスでの設定をファクトリクラスにも伝播させたければ、chain of responsibility で繋ぐ。
って感じじゃないかなぁ・・。
セーブ処理って使ってる変数一個一個調べて全部詰め込むの?
凄い大変そうなイメージがある
構造体丸ごとバイナリデータとして吐き出しゃええやん
シリアライズ
構造体丸ごとっていうけど
普通キャラクターのHPとかのステータス情報と
マップの現在位置とかのデータって別構造体になってるよね
別クラスのメンバになってるよね
構造体丸ごとじゃできないよね
構造体2個保存すればいいじゃん
構造体に対してまるごとコピーするのって、そもそもあんましよくないんじゃなかったっけ?
継承関連の情報が含まれてたり(C++)、データのアライメントの問題(C、C++)だったりで。
俺はRPGのデータ一つ一つ保存してるけど、対して苦じゃないよ
Boost.Serializationを知らないって哀しいことだよな…
ゲーム作れればいいとか言ってるヤツほど、無駄な労力使ってる
こう作るのが楽って書いてあるところが見つからなくてな
>>579 まったくその通りだ。
でも、どこで無駄な労力を使ってるのかすら分かってないんだ。
>>580 そのものズバリが書かれてないと書けませんなんて事無いでしょ
boostにしろデザインパターンにしろ、知らない人向けに噛み砕いたサイトってのはまだまだ少ない気がするな
全て構造体で変数作るのか、かなり大変だな…
仮想メモリ環境のOS下なら、mmap とか CreateFileMappingから始まる
メモリマップをつくってPODの構造体コピーしてやるのが一番楽だと思うけど。
ヒントが転がってても気づけなきゃ意味ないし答え知ってるのは自分の飯の種として隠すか見下すために言わないか
実績のある作者が本でも書いてくれりゃいいがそういう人は自分のゲームに忙しい
おかげで初心者たちは再発見に時間を使わなきゃならんというわけだ
同じ立場なら俺もそうするから責められないが
自分のことは棚に上げて責めるのも自由だ
クラス設計で悩みだしたら
デザインパターンを一通り目を通しておいたほうが良いと思う。
情報を噛み砕いて文章にするのはスキルがいるし労力もかかる。
それに正確性を期すのも大変だよ。
多分そんな感じで情報が共有されるレベルまで行かないんだと思うな。
>>578 マクロで全フィールドにマーキングしておけば
msgpackなんかはよきに計らってくれるはず
なんだかんだでセガ本あたりかねぇ
>>586 〉答え知ってるのは自分の飯の種として隠すか見下すために言わないか
〉実績のある作者が本でも書いてくれりゃ
飯の種とか見下すとか、 なんかまるで教えてくれないのが悪い、みたいな前提の話になってないか?
別に学校の先生でも我が子育てる親でもないんだから、労力がいる事を「してくれて当たり前」みたいに考えちゃダメでしょ。
根本的な話として。技術を得たいのは自分自身であって、何が自分に足りないかを知ってるのも自分なんだから、
わからなければ、他力本願じゃなくて、経験して理解するのが早道。
お説ご尤もだが、飯の種の方はともかく、見下す方は擁護の必要はないと思われる。
「なに? お前、こんな事もわかんねーの?」と嘲るだけで何も説明しない輩は
技術の習得うんぬん以前に人として非難されるのは至極当然。
見下してるやつを非難するなんてことに労力使ってるからいつまでも見下される側なんだろうなw
お前が典型的な例だもんな
>>592 禿げ上がるほど同意
悩んで禿げてこそ一流だ
お前等の下らない言い合いのためにリソース食い散らかすな
職業PGだけど、ゲームでこう使える!みたいな発想がどうも苦手でなあ……
俺はSQLiteでセーブする派
RPG作るとテーブルデータからクラス(or構造体)起こす処理が必要なのは明白
テーブルデータの調整を楽にするためにSQLiteを選んだ
だがゲームは完成していない
>>550 使ってるぜIrrlicht。公式バイナリで日本語表示できるようになると勧めやすいんだけどな
>>579 良さそうだなこれ
>>591 あれすごいけど「いまの家庭用ゲーム機についていくには」みたいな視点じゃないかな
Cで開発してきた人をC++に移行させるための啓蒙書みたいな感じがしたよ
個人制作だとちょっと話が大きすぎるような気がします
うん。いまはスタティックリンクにしてる
完成してないから配布については考えてない
配布するとしてもフリーだから暗号化とかはしない
boostのserializationはfriendクラスにしないといけないからなぁ。
何らかのバグが発生したときトレースしきれない自信がある
とりあえずboostっていうのを入れればいいんだな?
デカいライブラリは導入が異常に面倒くさい
Boost proでインストーラ落としてこいよ
>>599 >セガ本
そういう感じ方もあるのか。
個人的には、家庭用云々はあんまり関係ない気がしたなあ。
ある程度C/C++の経験があるって人に向けた、ゲーム開発への生かし方って感じで読んでた。
「ゲームプログラマのためのC++」っていうのも、そんな感じらしいと聞いたけど
こっちは積んじゃってるので他の人に任せる。
セガ本一冊まるまる読んだけど
分かったような気になっただけで見返しては納得する俺
セガ本は読むほど味が出てくるいい本
ただ厚過ぎて持って読んでると腕が折れそうになるのが名
つい先日引っかかったんだけどセガ本のファイル構成にすると
最新版だとコンパイル通らないらしいな
ディレクトリの違う同名ファイルを区別できなくなってる
シーン遷移周りを参考にしたかったんだけどなあ
解決策は出版社のサイトに載っていなかったか
ほんの少し手間がかかるけれども
>>611 おお、たしかに書いてある。でもすでに1の方法で解決済み
名前を長くしていいならフォルダに入れる意味が薄いから
Game/GameParentじゃなくてGame_Parentにしているけど
┌────────────────
│DEATHTRUCTORが呼ばれました
└───v────────────
/⌒\ っ /\
/'⌒'ヽ \ っ/\ |
(●.●) )/ |: |
>冊/ ./ |: /
/⌒ ミミ \ 〆
/ / |::|λ| |
|√7ミ |::| ト、 |
|:/ V_ハ |
/| i | ∧|∧
и .i N /⌒ ヽ)
λヘ、| i .NV | | |
V\W ( 、 ∪
|| |
∪∪
はぁ大した量表示してないのにすごいカクカクする
>>606 >「ゲームプログラマのためのC++」
コストとかパフォーマンスについての話が多いんだけど
なんつーか、延々とわかり切ってる理想論をグダグダ並べたててるだけな感じだった
あと個人的な見解だけどSTLとboostとゴリ押ししてるし翻訳本だし、原本は少し古めの文献なんじゃないかな
すれ違いをgdgd書いてるお前よりは役に立ってるだろうよ
>>616追記
ちなみにゲームジャンルごとのサンプルプログラムみたいなものは一切ナシ(悲しかった)
「ゲームプログラマのため」という文言は「ゲームを作るプログラマのため」という意味ではなく
「限られたリソースの中で頑張るゲームプログラマのため」と受け取った方が良い
それくらいひたすらにパフォーマンスに拘っててしつこい。
デバッグ関連の有用性を説く章はそれなりにありがたみがある
「C/C++ゲーム製作総合スレッド Part1」で
「ゲームプログラマのためのC++」 っていう本についての話題がスレ違いなら
どこがどうスレ違いなのか是非とも説明して貰いたいね
c/c++に付いて話すスレで
本の評価してるのがスレ違いだっていってんだよ
自治厨うぜえ
>>618 なんか最近の人っぽい考え方だな
あまり物考えないと言うか。
いや、その本が良いかどうかはさておき
スレの使い分けも出来ないようだし
推薦図書スレも糞だろ
自然発生的に本の具体的な内容を書いてるから
スレチだといわれててもレスを読んで参考になった
オワリ
c++11使ってみたいけど古いライブラリに依存しまくってるからたぶんコンパイル失敗しまくる
なんか憂鬱
よくわかんないけどvc++2010ってc++11は対応してないの?
しらねぇ、ムーブコンストラクタってなんだよw
>>625 失敗しまくってから元の環境に戻せば良いんじゃね?
新しいアプリ試したいときは仮想マシンで試すと、失敗しても安心だね
Eclipse CDTとかそのうち試したい
雑談スレ向けの内容だが
これからの季節には効果がありそうだな
そのサイト
膨大な量のキャラデータが必要になる場合、データベース部分ってお前らどうしてる?
本格RPG作ろうと思ったら敵キャラデータをコンストラクタに直打ちなんてダメだよな・・・
エクセルに1つずつ打ち込んでる
>>634 CSV?暗号化は一回専用のアプリ通してクラスにあったバイナリ化すればいいのかな
暗号化は面倒だからしてないなー
テキストで独自のデータ形式作って、バイナリー変換してる
はとんどスクリプト言語のノリだけどな
暗号化はしてないけど、色々な機能を組み込んでて、重宝してる
csvだな。excelで編集できることもあって
製作過程でのパラメータ追加やバランス調整が圧倒的に楽。
特にサポートしないけど、改造したけりゃ改造して良いよって感じ。
バイナリデータ化したこともあったが酷く面倒。
バイナリー化する前はこんな感じだな、俺は。
MapUnit{
ドット絵ファイル(file)={"MapUnit.png"}
カラーキー(dword:16)={ FF008080 }
ドット絵サイズ(word:10)={32,32}
}
MapChip{
ドット絵ファイル(file)={"マップチップ.png"}
ドット絵サイズ(word:10)={16,16}
}
MapObject{
ドット絵ファイル(file)={"マップオブジェクト.png"}
カラーキー(dword:16)={ FF004B4B }
ドット絵サイズ(word:10)={16,32}
}
>>633 いいんじゃない?ツールでもない限り作業量ほとんど変わらんわ
外部ファイルにまとめる事で作業量が減るのなら、外部ファイル化するべきかと。
外部ファイル化にはいくつかのメリットもある。外部ファイルに共通の情報をまとめる事で、
似たようなソースコードを量産する手間を減らせる。あと、多人数で作業する場合に、
プログラマ以外の複数の人間に作業を分割する事が出来るようになる。
本格RPGはプログラムもリソースも大規模になる
先にごくごく小規模の(ファミコンドラクエよりもずっとずっっと小規模の)
RPGを作って、コツを身に着けておくのもいいんじゃないかな。急がば回れ
csv以外なら
xmlとかjsonとかYAMLとかどうだろ
でもxml以外は編集ツールが無くてほぼ手打ちになるな
後は(もう言ってるみたいだけど)スクリプト内に書くとか
sqliteとか
表計算→TSV→そのまま読む or DB化 かなぁ
ごく簡単な算出マクロを組むことはあるけどだいたい手打ちで
一連の流れを作って力尽きてゴールインするのがいつものパターン
C++ハードコーディングだと調整するときイヤにならんかい?
svnとかでバージョン管理するならマージできるテキストファイルの方が良いよな
バイナリ化する場合も、テキストファイルの方だけ管理して
生成されたバイナリファイルは無視って事ができる
>>644 コンパイル遅いし共同作業には使えないよね
みんなどうもありがとう。色々試してみるよ
データマスクしてSQLiteかな俺
データマスクしてSQLiteかな俺
エラーだと思ったら連投になってたスマン
Protocol Buffer とか、Message Pack とかシリアライズ用のライブラリはさがせばいろいろあるよ
ライブラリでちっとも楽にならないC/C++のシリアライズ
ネイティブだとjavaみたいにはいかないのかー?
よっぽど性能求められるところ以外はスクリプト言語のせて処理させるのが楽やね
ちょっと変わった事をやろうとすると途端に面倒くさくなる印象があるな
javaを比較にだされると、メンバをいちいち指定する必要がある時点でどうしようもないよね
他言語、他プラットフォーム向けにソースやデータ、データ構造を転用する可能性を考えたらboostでシリアライズすることをしつこく勧めるなんてありえない
ゲーム製作と関係あんの?
>>657 どのレスが関係ないと思ったのかくらい書けよ
こういうのやり始めたい場合とかって、まずCから学ぶのがいいの?それともC++?
教えてエロい人
使いたい方の言語を好きに選べばいいんじゃないの。
一般的にはBetterCとしてのC++が多いと思うよ。
>>659 c89から始めるとc++使うようになってから、c++に合わないソースを書く癖がつきやすい(ループカウンタを関数先頭に書くとか)
c99はvc++で使えないからWindows向けではじめたい人には微妙 。
純粋なcから始めるってのは選択肢から外れると思う。
モダンな言語もつまみ食いするとなおよしですな
>>653 boostは入れててもビルド必須のものは無視ってヤツもいる。俺とか
boostは正規表現のために入れたのが最初だったなあ
boostのシリアライズは怖い。friendにしなきゃならんし。
>>656 どこに転用する前提が出てたの?
妄想?
>>665 プログラマとして当然の想定だろ。
こんなものも毎回作り直す気か?
コンパイラのバージョンが変わったりboostのバージョン変えたりするだけで文法エラーが起きるboostへの依存度を落とすのは悪いことじゃないぞ。
>>666 単に、とある制作中のゲームの内部データをシリアライズして読み書きしたいって話じゃないの?
こんなもの毎回とか言ってるけど、ただの固有用件じゃないの?そこの前提違うの?
汎用ライブラリ書いてるならまた別のはなしだけど
>>667 dbでいえばせいぜいカラムとテーブルが増減するだけなんだから、毎回書かないほうが利口なのは間違いない。
パッチ担当者の好きなツールチェーン以外だとあまりテストされないし、マイナーバージョンの変更どころか、リビジョンの変更程度でも結構な変更が加えられるからboostの信頼性はそれほど高くない。
boost自体の更新はしないようにするにしても、セキュリティの観点からコンパイラと標準ライブラリの更新はするだろう。
それでも動かなくなることは普通にある。
シリアライザのテストコードを自分でプロダクト毎に書くなんてやってられんがな。
てかstlのコンテナそのまま扱える以外にいいとこない。遅いし。
stlは命名規則をマジでどうにかしてほしい
>>661 じゃあどこから始めるのがいのだろう。
誰かに貢献したい一心なんだけどどこから始めていいかさっぱり
いや、アレで分かる初心者が居たら凄いぞ
>>668 boostに結構な変更がっていうが、根本的な変更なんて稀だろう
メソッド名の変更とかなら分かるが、それなら直すコストは低い
そしてコンパイラと標準ライブラリがポンポン入れ替わる環境に居ることに同情する
デバッグにも金がいるんだよねぇ
>>675 根本的な変更なんかなくたって"構文エラー"になるよ。
正しい使い方のままstatic assertにひっかかるような変更は頻繁にある。公式のbts見てみるといいよ。
あと、モバイル開発なんかやってたらツールチェーンの変更なんて1年に1,2回はあるし、pcだってvisual studioのリリースペースもそこそこなもんだ。
boostのバージョンアップで、従来使ってたvisual studioのバージョンよりも前のvisual studioでしか動かなくなってしまったこともある。(パッチ提供者の環境が古かっため)
で、実際更新してひっかかったら開発止めるのかい?
いま目の前にある、単発の製品の開発で使う、って話じゃなかったのか
そうでなければその通りだけど、アスペみたいな反応してるように見えるぞ
言い方悪いけど
>>677 うるせえええええええええええええええええええええええええええええええええええええ
IT土方ってアスぺみたいなの多いよな
プログラムなんてしたことありませーんっていう文系SEのほうが
よっぽどまともというか実用的なアルゴリズム作れるのはよくある
職業マと趣味マがごちゃまぜのスレは上手くいかない。
>>680 入門スレで質問しても叩く奴いるからな
しかも叩いてるのはちょっと齧った初心者レベルのクズというオチが…
オタ系多いからかな
>>674 C系やPerlだと1990年代から放置されてるページなんかもあるからなぁ
うかつに検索しても迷宮に入るだけってことも・・・俺はずいぶん迷ったからなぁw
・大きな本屋行って専門書のプログラムの棚をざっと眺める
・活発なフォーラムをROMる(英語フォーラムがほとんどだが)
・日本では仕方ないので2chスレにあたる
古い言語についてはこのへんが妥当なんじゃないかな
少なくとも2chなら的外れすぎ・レトロすぎる意見にはそれなりに批判つくしね
>>671 お前が何作りたいかわからんのに何をどう指示しろと言うんだ
>>683 わかるわ、独学で進めてたらハンガリアン記法だのdefineで定数定義だのなかなかの化石地雷を踏まされた
Cでdefineは特に地雷じゃないと思うな
defineは使うなとか、あんなもの実装しなきゃよかったとかカーニハンが言ってるって噂を聞いたことがある
>>678 > いま目の前にある、単発の製品の開発で使う、って話じゃなかったのか
まてまて、そんな話は出てないぞ
defineが無ければtemplateは生まれなかったわけで
2Dのマップチップのあたり判定ってどうすればいいの?
例えばコの字型のマップチップと_ではあたり判定の数って違うよね
最小単位に区切ってそれを一つとして判定
>>689 意味が分からん。
スーパーマリオだとどの部分?
普通はマップチップ単位で当たりか当たりじゃないか設定するんじゃないの
普通に考えると、コの字って言われると
■■
□■
■■
こんな感じで6枚のチップを使うことが考えられると思うんだけどね。
■■■ ■□■ ■■■
■■■ □□■ □□■
□■□ ■■■ ■■■
>>694 なんで2Dと3Dが関係あると思ったの?
長方形3つの当たり判定領域に分ければいいんじゃないの
どういう答えが返ってくるつもりだったんだろ
こんな聞き方しておいてifで分ければいいだけじゃんとか言うとキレるんだろうか
ようやく意味分かったわ
矩形とか円とかじゃなくて変態図形に当たり判定付けたいんだろ
何個か矩形判定重ねて置くしかないんじゃないの
四角の組み合わせでほぼ何でもカバーできる。
変態図形と、そうで無いものを同じクラスで管理してるんですけど
あたり判定をあらかじめ複数個宣言しておいて使用フラグをつけるしかないですか?
使用フラグはいらない。
>>701 そうで無いものを基底クラス、変態図形を派生クラス、
あたり判定を仮想関数にするのはどうでしょうか?
図形を認識して勝手に当たり判定付けてくれる関数作れば完璧や!!不可能はないんや!!
そしてパフォーマンスの壁にぶちあたると
>>703 普通形状と変態形状の境界でめりこむんじゃないの
2Dで厳密に判定したいならシェイプ並べて物理エンジンに投げることになると思う
でも凝るべきところはもっとほかにあるんじゃないかしら
このヘンタイ!
一方通行の壁(壁の中には入れないが外には出れる)って
不可侵領域の壁より難しくないか?
なんでみんなそんなの使うんだ?
普通グラフでやるから簡単だぞ
俺は一方通行専用のブロックみたいなの作って対応したが別に不都合はなかった。
なんでみんなそんなの使うんだ? ってどういう意味だ
ゲームに必要なら作るだけだよな。
それはさておき、例えば2Dマリオ系のゲームだとして、
真下からのジャンプで飛び乗れるブロック(上方向の一方通行)っていうのは、作っておくと便利ではあるな。
飛び乗れる判定 のが汎用性あるかと
グラフで接触判定って何?
無知ですまん
接触判定じゃなく一方通行領域を片方向グラフで表現するって意味だろ
俺もそのグラフとやらがさっぱり分からん、初耳だな
どんな実装方法なの?簡単で良いから説明して欲しい
俺も初耳だな
長方形の下の辺に触れた時上の辺に有向グラフが張ってあったらすり抜けて
張ってなかったら当たるだけで下に落ちるってこと?
これをグラフ理論ていうのか
でも、辺り判定に使おうとは思わないな
フィールドマップとかで目的地をキー操作でマーカー動かすとかなら使うけど
・〆切あと10日
・音ゲー制作
・C++全然理解できない、ポインタ?STL?わかんね
これはオワタ
C++わからないのになぜ音ゲー作ろうなんて事になったのか。
STLはイタレータとかやらなければ簡単
厳しそうだな
どの環境でどのライブラリ使ってるか、によっては変わるのかもしれんけど
音ゲーでもC++/CLIでワンキーゲームなら実製作期間は短い。
音ゲーだとむしろ素材が大変そう
mbedに関しての質問です。
LEDを一気に選択する方法を教えてください。
つまりこういうことです。↓
myled[0]=0;
myled[1]=0;
myled[2]=0;
myled[3]=0;
wait(0.1);
っていうプログラムを
myled(0〜4)=0;
wait(0.1);
ってかんじにまとめることはできませんか?
myled[0]=myled[1]=myled[2]=myled[3]=myled[4]=0;
あんまりまとまってないが
>>725 イタレータをゼロから作るのは大変だが、
使うだけなら簡単だろw
>>727 そんなもの使うならc++だけにするかc#+P/Invokeのほうがいい。
音ゲーは同期のためサウンドモジュールを低レベルから実装する必要が出てくることがあるので、そう(期間的に)なめてかかれるものでもない。
mbedがなにか知らんけどループにしたらいいだけじゃないの?
マイコンキットだと思うけど、板として合ってるかどうかは疑問
>>732 どーせ、課題かなんかでしょ。
例えば、動画サイトに上がってたセサミストリートのハードコアみたいなのを
再現するだけでも音ゲーの範疇にはなる。ひたすら連打するだけになると思うが。
そういえば学校の組み込みプログラミングの課題でマイコンキットを渡されたときに
課題無視してマスターマインドっぽいゲームを作ったことはあったな。あれは楽しかった。
課題無視しちゃう自由奔放な俺パネェ
>>737 確か7セグLEDに数字を表示しなさいって課題だったから、条件は満たしてたよ! 大丈夫!
俺パネェ
ハードに強いやつは尊敬するw
やる気の出る動きってなんでもないからないか
プラシーボでもいい
実行中にマイコンに書き込もうとして壊したことなんて数知れず
>>741 ゲーム・パソコンから離れる。特に外に出る。これだね。
効くね
>>743 最初だるいけどなんか良いよね。軽くなるというか何というか・・・w
一発抜いて聖人モード中にゲーム作るとすごく効率いい。
場合によるんじゃね
抜いたあとに思考力、判断力が落ちて、あとは寝るだけモードになって、
効率どころじゃなくなることもあったりなかったり
つまり外で抜くと良いのか。
ガンシューティングゲームのマップ作成に悩んでるんですけど質問させてください
外部から貰ったオブジェクトを外部から貰ったマップデータに沿ってぽんぽん置いてく感じに作りたいのですが、
このオブジェクトを
「机や椅子や植木鉢だけでなく、部屋や通路といったマップ上のすべての要素」
というようにしたいんです。(楽そうだし)
また、敵AIの関係上、部屋や通路といったものは単純な障害オブジェクトとは別に切り分けたいんです。
多分基底クラスを同じにして継承して分ければなんとかなると思うのですが
やる気がおきないです。どうしたらいいですか?
お前の考えたゲームを作れるのがお前だけ
やる気を起こせばいいです
ガンシューとか入力どうするの
パッドじゃいまいちでしょ
マウスじゃね?
タッチパネルPC向けとかそういう
クラス定義の中でクラスメンバのコンストラクタの引き数を指定できますか?
class Hoge{
public:
Hage hage("うんこ");
}
Hage hage に悪意を感じた
できるの?
できねえ
>>756 定義内では無理。
定義はあくまでも定義だけ。
実際メンバー変数が初期化されるのは
クラスのコンストラクタ内だから、
そこで引数指定すべし。
class Hoge
{
public:
Hage hage;
Hoge();
}
Hoge::Hoge()
: hage("うんこ")
{
}
.Netってどうよ?C++とAPIでプログラム組むのはなれてるけれども、
C++と.Netで組むのは初めてなんよ。何となく、ツールとか作るのが
楽になりそうだな〜とか、正式なC++と比べると別物なのかな??
とか色々思ってるけど。
>>761 c++/cliという意味ならやめておけ。
グチャグチャだし、使える.netのバージョンも低い。
ツールだけpure .NETにする分にはあまり問題はない。
データ変換にGUIにだいたいこなせる。
ゲーム本体と同じレンダラでプレビューできるツールがほしいならはP/Invokeとかでなんとかなる。
コンパイル時間とlinqにこだわりが無いならにC++11でもC#に近い感覚で書けるよ。
class Hoge{
public:
Hoge() : hage("うんこ") { }
Hage hage;
}
連チャンで質問しちゃって悪いんだけど
1つのマップオブジェクトクラスが複数の当たり判定を持つ予定なんだけど、
マップオブジェクトの情報はすべて外部ファイルから読み込むからどんな形の判定が来るかわからない。
そういった場合、どんな形で持つのが適切ですか?
自分が思いついたのは、
そのマップオブジェクトの当たり判定の情報が読み込まれたら、適切な形状の判定クラスのコピーコンストラクタで、
マップオブジェクトクラスが保持している当たり判定のポインタ配列にぽんぽん追加してく
というのがメモリ浪費しなさそうだし良いと思うんですけど
もっといい方法がありますか?
敬語がばらばら死にたいくない
>>762 4.0と4.5ってそんなに違うの??あと、グチャグチャって何がそんなに違うの?
>>765 ごめん、ちょっと意味がわからない。
マップオブジェクトがフィールドとキャラクターの当たり判定持つの?
>>762 併用してみた。strcpy系を使えない点がちょっと面倒かな?
#include <TCHAR.h>
#include <stdio.h>
using namespace System;
int main(array<System::String ^> ^args)
{
int nLength = args->Length;
for(int i = 0;i<nLength;i++)
{
int nLength2 = args[i]->Length;
System::String ^ argc = args[i];
_TCHAR sz[80];
for(int i2 = 0 ;i2 < nLength2; i2 ++)
{
sz[i2] = argc[i2];
}
sz[nLength2] = 0;
_putts(sz);
Console::WriteLine(argc);
}
return 0;
}
1つのマップオブジェクトには、1つの判定オブジェクトだけ持たせる。
ただし、マップオブジェクトがツリー構造になってて、
親マップオブジェクトが、実質的に複数の当たり判定オブジェクトを持つことになる。
とかどうだろう。
子マップオブジェクトは、親マップオブジェクトからの相対座標を
持つようにすれば、親に追随して移動するし。
まぁ、
>>765と大した違いはないけど。
>>768 マップオブジェクトクラスはマップオブジェクトが持つ当たり判定のみ持ちます。
"複雑な形状の当たり判定は複数に分けたほうが楽"なのでマップオブジェクトクラスは複数の当たり判定を持つ。
例えば
>>765の場合ですと、
外部ファイルが「基準座標から(x1,y1)の座標に縦3横5の四角形と、(x2,y2)の座標に半径2の円の当たり判定を持つオブジェクト」
と指定してきた場合、マップオブジェクトクラスは四角形の当たり判定クラスと円の当たり判定クラスをそれぞれインスタンス化して保持する。
という感じです。
勿論四角形が2個や3個、種類が3種類以上になる場合も想定してマップオブジェクトクラスを作りたいです。
>>765の"思いついたのは〜"のくだりは
すべての当たり判定クラスは基底クラスがあるので
基底クラスのポインタに派生クラスをインスタンス化したものを追加してったら無駄が無さそうと思っただけです。
イテレータ?のようなものを使うのでよくわからないですが
>>770 マップオブジェクトがマップオブジェクトを持つ感じですか
そっちのほうが楽かなーー
>>769 失礼、新しいvsだと.netのサポートバージョンあがったんだね
以前fbx sdkから.netアプリへのブリッジ作ろうと思ったけど
演算子や非マネージコードとの書き分け、.netの参照と参照とポインタと...と考えたところで
c++のみの独自形式へのコンバータをc++で描いて、c#側にインポータを実装するほうがはるかに楽だと思ってc++/cliはやめた。
そこそこ名前の知れてる日本人のc++/cliユーザーってひげねことえぴすてーめーくらいだし
トラブルあっても情報すくないよ
c++/cliからあるモジュールを起動したら死ぬ。c#からはうまくいく。なんてこともxnaかなんかで発生してたとはず。
あと静的オブジェクトの初期化に関して、ひげねこが最近はまってたな
>>773 なるほどね。情報が異常なまでに少ないんだ。
インテリセンスも切られてるしな。MSの対応もC++だけ遅いみたいだし。
ただ、情報の多いvb.netのコードが参考に出来るから便利なんだよね〜。
ガベコレ使えるし、Excelで図表とか描けるし、XML使えるし。
んー、必要なときだけ流用するかな?ライブラリとして見たら便利そうだし。
質問です。struct, class のプロタイプ宣言ってできますか?
struct Hoge;
class Nanika{
Hoge hoge;
};
struct Hoge{
int a, b, c;
};
的な流れで書きたいです
それくらい自分で試してみろよ……
struct Hoge{
int a, b, c;
}hoge[3]={{0,1,2},{3,4,5},{6,7,8}};みたいな事をしたいって事?
ぐぐってみた。
struct Hoge{
int a, b, c;
};
class Nanika{
Hoge hoge;
};
C++の場合はこの順番でないと駄目じゃね?
>>775 前方宣言はあるけど、ポインタじゃないといけなかったはず
struct Hoge;
class Nanika{
Hoge* hoge;
};
struct Hoge{
int a, b, c;
};
これならいける
あとはどっかでインスタンスつくればおk
自分のクラスに別のクラスを持たせるには、
その別クラスの情報(サイズ)を知っておかないと、自分自身のサイズを確定できないからね。
自分より先に定義されていれば何も問題なし、
定義されてない場合はNGだけど、ポインタとしてならサイズは固定だから自身のサイズを確定できる……と。
結局のところは、
>>780 の制約からは逃れられないから、
可能ならば
>>778 の様にHogeの定義を先にした方が楽だと思うし、
>>779の様にポインタで持たせるのもまた定石だと思うけど、
Nanikaから見てHogeは未知の型だから、ここはtemplateを使って
template<class Hoge> class Nanika{ Hoge hoge;};
struct Hoge{ int a,b,c;};
// インスタンス
Nanika<Hoge> a;
とすれば、Nanikaの定義 → Hogeの定義という流れがつくれるんじゃないかな。
↑
こういう例を英語で「over engineering」と言います。
テクニックに頼り過ぎると問題の本質を見失いがちです。
循環参照てポインタなら発生しないの?
動いて完成すりゃあいいんだよ
>>783 ポインタだとメンバーに持たせる時宣言してるだけでいい
class huge;
class hoge
{
class huge a;//includeが必要なのでエラー
class huge *b;//必要ない
};
なので結果的に循環参照することもない
質問の内容なら「定義を後に書くな」で終わりな気もするが
持たせたいクラスが数種類あって分岐するなら
>>781かな
クラス内で使うものを外で生成する
>>779はできれば避けたい感じ
そうするしかない時はあると思うが、この質問程度なら必要はないかと
ttp://ynupl.com/reddam/archives/146#comment-7 このサイトの
BaseScene* main(){
BaseScene* nextScene;
などはなぜポインタにしているのでしょうか?というかこれはポインタなんでしょうか?
ポインタにするとアドレスだけ渡すので関数の引数へ渡す時処理が軽くなるというやつでしょうか?
また、このことについてよくわかるサイトなどがあれば教えて欲しいです
この行為の一般的な名称でもいいです
おねがいします
>>787 コストとか以前の問題。
一つは、シーン毎にそれぞれのシーンを起動、実行するコードを書かなきゃいけないのを回避するため。
これ以上はここでうだうだ説明するのはなんか違う気がする。あとは自分で調べたほうが良い。
ポインタ使わない書き方に直してみるってのもいいね。
余談だけど、いまから作るならシーン毎にc++のクラスなんか作らずに、scriptに投げたほうがいいと思う。
>>789 英語で言っちゃ分からないよw
ようするに多態性ってことね。
元の、BaseScene::main() が BaseScene自体を返すと、BaseScene の仮想関数を呼び出すときに、サブクラスの仮想関数が呼ばれるのではなくて
BaseScene自体の仮想関数が呼び出されてしまう。値で返すと、元のサブクラスの型情報は失われるから、そりゃそうだよねって話。
少し簡略化して、基底クラス Base とそれを継承した サブクラス Sub が存在して、それぞれに仮想関数invoke() を用意する。
// cl.exe /EHsc /W4 /WX main.cpp
#include <iostream>
// 基底クラス
class Base{ public: virtual void invoke(){ std::cout << "Base::invoke();" << std::endl; };};
// サブクラス
class Sub : public Base{ public: virtual void invoke(){ std::cout << "Sub::invoke();" << std::endl; };};
int main( int, char*[]){
Sub a; Base b = a ; Base* c;
c = static_cast<Base*>(&a);
a.invoke(); // Sub::invoke(); "Sub::invoke() が呼び出される"
b.invoke(); // Base::invoke(); "Base::invoke() が呼び出される"
c->invoke(); // Sub::invoke(); "Sub::invoke() が呼び出される"
return 0;
}
この場合、bは、Sub のインスタンスである a を代入してるけど、b は 依然としてBaseのインスタンスなので、
b.invoke() は、 Base::invoke() を呼び出す。 これをポインタ経由で呼び出すときは c->invoke() で Sub::invoke() が呼ばれる。
バーチャルってやるとエラーでるからオーバーライドにした
外部のcsvファイルからデータを読み込んでキャラクターのパラメータの初期化をしたいんだけど
どういう拡張子にしたらいい?
拡張子とか関係なしにcsvとして読みこめるかな?
なら適当に.datとかにするんだけど・・・
>>794 拡張子は何でもかまわない。
.bmpでもおk。
拡張子なんてなくてもええやないの
拡張子があったら編集するソフトと関連付けられる利点がある
種類は競合しなければ何でもいいけどね
拡張子はただの判別記号
質問botじゃねーの? という気がしてきたんだが
基底クラス→サブクラスのエラーコードlnk2001がデバックできない
仮装関数をがどうのでエラー出るし、他のサブクラスと全く同じ記述してるのにわけわかめ
仮想関数と関数名が重複してるんだろ
別の関数名に変えれば良いんじゃね?
仮想関数ってサブクラスでオーバーロードして定義した関数を基底クラスから呼び出すものだと思ってた
勉強し直そう
オーバーライドでした
>>801 エラーメッセージのヘルプに書いてるだろ
基底クラスのコンストラクタかデストラクタで純粋仮想関数を呼び出すことは出来ない
実体あればそのエラーにはならないが、基底クラスのコンストラクタ呼び出し中は、まだサブクラスの仮想関数の初期化ができてないから君の期待する処理にはならない。常に基底クラスの関数が呼ばれることになる
そういうことをしたい場合は Factory パターンで生成するようにするのが一般的
立ち絵ってどう表現してる?テクスチャに貼り付ける場合、
画面サイズと比べると明らかに無駄になる領域が多い気がするんだが。
無駄になる領域は無視?それとも、巨大なテクスチャを切り分けて使ってる?
立ち絵ごときに無駄な領域なんて気にするな。
BMPファイル使ってるわけでも無いだろうから、どうせ圧縮されるし。
画面サイズより小さいサイズにしないかい?
じゃないと、画面内の好きな場所に表示できないし。
(画面サイズと同じ大きさでも、はみ出させれば好きな場所に表示できるけど
はみ出させるのってなんか気持ち悪い)
俺ははみ出させるのが趣味だ!!!っていうなら止めないがw
>>806 立ち絵の性質上共用テクスチャは詰められないから効果は限定的だけど、
テクスチャをパックするツール使って他のリソースを一緒に詰め込むのはどうか。
それ以上を望むなら、文字列の動的レンダリングみたいに、
動的に作った巨大テクスチャにロードしたテクスチャを貼って詰めて使うとか?そこまでして得られるものは大きくないと思うけど。
立ち絵のテクスチャ…?
マルチスレッドで fopen(), fclose() 使ってるところを
別スレッドにして動かしたりして大丈夫かな?
やりたいこととしては、メインスレッドで Now Loading って出して
別スレッドで fopen() とかで読み出すようにしたいんだ
環境によってスレッドセーフじゃなかったりするんだろうか
スレッドセーフじゃないって、メインスレッド以外で使うなって意味じゃないだろ
あ、読み込み処理自体を並列化するわけじゃないのか。失敬
マルチスレッド上の、エラーコードを返すためのerrnoの取り扱いってどうなってるの?
それとも規格に書いてあるの?それともコンパイラ依存?
>>816 実装依存。posix ではスレッドセーフであることが求められてる。
Visual C++ ではCRTの範囲で、ドキュメントの errno の所には書いてないけど、マルチスレッド版ならスレッドセーフな実装になってる。
この場合、スレッドセーフってのは、スレッドごとに別の値ってことね
VRAMでも断片化って起こるのかな?それともグラボによって変わるのかな?
簡単で小規模なRPGを作ってるんだが、敵画像や立ち絵の管理で迷ってます。
画像を一括で読み込むか?必要になったら読み込んで不要になったら消すか?
必要になったら読み込んで、そのままゲームが終わるまで消さないか?
やっぱり二番目ですかね?
>>818 グループにわけてグループ毎に一括で読んで、シーン毎にそのグループを解放するのがいいよ
テクスチャの解放って遅延されるし、GPUメーカー毎のプロファイラ使って調べてとか大変だし、
消費具合を見積もりやすい構成にしておくほうが楽だと思う
Thanks!あんがと!やってみる!!
っっh
822 :
名前は開発中のものです。:2012/08/27(月) 15:09:09.65 ID:6lu5kgZo
質問です。
ファミコン風のゲームをc++で作ろうと思っています。
しかし、当時のテイストでドット絵を打っていると
エミュのファミコンゲーム同様
遊ぶにはあまりに小さいゲーム画面になります。
(例えば、ファミコンのマリオのドットは32×32)
結果、エミュレータでは画面を拡大させ遊んでるわけで、
だったらファミコン風ゲームを作るなら
最初からそれぞれのドット絵を描いては2倍ほど拡大し
それでゲームを作った方がいいと考えました。
しかし、そこで気になったのですが
最初から拡大したグラフィックを用意するより、
小さいサイズのグラフィックをプログラムの方で拡大表示しつつ利用するのとでは
どちらがプログラムの実行速度への影響が強いのでしょうか?
教えてくださいませ。
小さいサイズでゲームを作って、描画はすべてサーフェスにする
その後描画済みの画面を好きな大きさに拡大して描画すればいいだけ
質問の内容に答えるとするなら、当然小さいサイズのグラフィック
でもどっちでも実行速度一緒みたいなもんじゃないかな
ファミコン風のゲームなのにどこにどれだけリソース使うつもりでコストの心配してるんだろう
あと個人的な好みで言わせてもらうとフルスクリーン化のできないゲームはノーサンキュー
フルスクリーンて需要あったのかよ・・・
逆にゲームする時に全画面以外にするメリットって何?
>>828 育てゲーがフルスクリーンだったらウザくね?
ロード時間に2chとか見れる
2PCとか2画面する以前は断然ウインドウモードだったわ。FPS的な視点操作するなら全画面だけど
スカイプとかメッセとか確認しないといけないからなぁ
ネットで攻略ページを見ながらゲームを遊べる
あと、メモ描きしながらゲームを遊べる
フルスクリーンってどういう意味で使われてるんだろう
モニタの解像度変更?
クライアント側を拡大などでフルスクリーンはまた違うん?
834 :
名前は開発中のものです。:2012/08/27(月) 15:43:04.17 ID:6lu5kgZo
レス沢山ありがとうございます。
びっくりしました。
携帯からなのでアンカーは割愛させてください。
ビジュアルスタジオ2010で作りだして間もないのですが
すでに最初の読み込みが遅くなって来てまして、
ゲーム中も表示したオブジェクトの数の増減で
処理速度がパンパン変わります。
まだ作り始めて敵と自機と弾と背景程度なのに、、、
もちろん初心者なのでプログラムに問題があったり
ノーパソなんでそれらも影響しているのかもしれませんが
とにかくファミコン程度の画像群でこんななるとは思いませんでした。
(だってファミコンのRomなんて数バイトですよ??)
ふぇえ、さすがに数十KBじゃないとキツイよぉ・・・
836 :
名前は開発中のものです。:2012/08/27(月) 15:54:17.37 ID:6lu5kgZo
例えばスーパーマリオと同じ見栄え、同じ内容で
ゲームを作れば、当時のスーパーマリオの用量に近いはず
じゃないですか?
もちろん、いろんな部分で工夫があったわけで
可能だったのはわかります。
しかしその工夫を度外視しても、
スーパーマリオを再現した様なものがメガレベルのデータ量になるもんなんですか?
不思議なんです。
もしかしてメモリに画像を読み込まず直接表示してる?
ファミコン時代のテレビって解像度どのくらいだったの?
>>836 扱う画像は差が無くても、当時とは実行環境も開発環境も何もかも決定的に違うでしょ
アセンブラでハードウェアを直接叩くようなコードを書いてるわけじゃないんだから
>>836 ファミコン上で動くプログラムならそれくらいで済むかもしれんが
>>836 windows用アプリとして必要な情報とかあるだろ
ホントはライブラリのコードなんだけど
>数バイト
当時のハドソン任天堂シャープのエースかきあつめても無理。
そんな容量のファミコン向けマリオは無い。
「ゲーム専用機」の意味を考えれば自ずと答えが出る。
で、画像は他の人も要ってるように毎回読み込んでるんじゃないの?
メモリに読ませておけばローディングで一度読み込ませれば良いいから
その分作業が減る
>>834 流石にコードがおかしいとしか考えられん。
今日日、24bitビットマップをbitbltで描画してもそこまで遅くならんはず。
.net使ってるんじゃね?
SetTimer使ってるとか
描画か当たり判定で変な事してね?
STGではないが、昔、敵同士の当たり判定とかやったら重くなったなぁ〜
敵同士が重ならなくするの
多対多の判定は最適化しないと重いな
ゲーム制作に向いてるのがC++なの事実
C#はミドルウェアが強くてマルチプラットフォーム前提の商業がメインのイメージがある
エンジンやコアな部分はC++。
ゲームの挙動はC#。
この組み合わせでFA。
回転軸である基準点と、高さと幅の情報から四角形を作りたいんだけど、
一つの角を求めるのに数学関数の中でも重いって評判のcosを2回も使ってしまう。
cosを一個に減らすように最適化、もしくは点の求め方を教えて下さい
(x1,y1)
・━━━┓
┃ ┃
┃ ・ ┃ ↑角度0 Angle
┃ (X,Y) ┃
┗━━━┛
x1=X+cos(Angle)*takasa+cos(Angle+3.141592/2)*haba;
y1=Y-sin(Angle)*takasa-sin(Angle+3.141592/2)*haba;
xとyは左上が0,0です。
最近のPCなら猛烈な回数実行しないなら誤差じゃね
>>855 なんというか、例えば
cos(Angle)*takasa
の部分がY軸の差分で
cos(Angle+90度)*haba
が横の差分でわかりにくいので、なんとかひとつに纏められないかと思ったんですけど・・・
cos(x+pi/2)=-sin(x)
sin(x+pi/2)=cos(x)
sincosだかcossinだか、一回呼べば二つ計算してくれる関数があったと思う。
arctanで一発じゃん
俺が昔書いたやつだとたしか
r = (X - haba)*(X - haba) + (Y - takasa)*(Y - takasa);
x1 = (X - haba) + r * sin(Angle);
y1 = (Y - takasa) + (r - r * cos(Angle));
みたいに書いてたはず
AngleがPI/2以上ならPI/2以下になるようにして
>>860 忘れてた、平方根つけるわ
あとPI/2じゃなくてPI/4だわ
その昔だと、角度をunsigned char の256通りとかにしておくという手法もあったな
atan2で45度の方向に高さ幅でいいかな・・・
適当な sin cos のテーブル作っといて線形補間すればいいんでねーの?
翻訳、頑張ってね〜
エンジンは珍しいな。他は何かあったっけ?
>>866 そんなに難しい英文じゃないだろ。
C++PGなら英語ドキュメント読むこと多いし。
GPLライセンスかバイバイ
俺にはMITに読めるが
派生クラスの内部クラスから
基底クラスのpublicメンバにはアクセスできないんでしょうか?
よくわからん。javaみたいなアクセスをしたいって話?
それとも、インスタンスを受け取ったうえでの話?
class A{
int Data
};
class B : public A{
public:
class C{
public:
void Test(){
Data = 100;
}
};
};
};
みたいなことです
classの宣言のときにメンバ変数/関数に付けるアクセス指定子と、
継承の時に使う指定子とを勘違いしている予感。
ちなみにclassの場合、デフォルトのアクセス指定子はprivate。
>>872 それ派生とか関係なくCはBの変数にだって干渉できない
CクラスはBクラスの中にあるだけでAやBとは関係のないクラスなんだから
void Test( B* b ) { b->Data = 100; }
875 :
873:2012/09/12(水) 01:09:35.75 ID:EJWmlpV2
失敬、内部クラスなの見逃してた
C++の内部クラスはJavaとは違って直接親のメンバは参照できない。
Javaでもstatic指定すれば同じようになる
親のprivate なメンバは見えるから、コンストラクタとかで親の参照を持つようにするか、
それぞれのメソッドで渡すようにして、
それ経由で操作する形にすれば同じようにつかえる
テンポラリオブジェクトが乱舞して楽しい。
class キャラクター
{
int 体力;
public:
キャラクター(){};
};
int _tmain(int argc, _TCHAR* argv[])
{
キャラクター 主人公 ;
return 0 ;
}
コンパイル出来た\(^o^)/
よかったね。
>>878 そりゃ真面目に一生懸命頑張ってる人の足まで引っ張ったりはしないよ
そういう人にそんな隙は無い
しかし頑張りが足りない、足元がおろそかな奴がいたならば
容赦なく引っ張ってやるのが礼儀ってもんだろ社会の
他言語を馬鹿にするのをやめてもらえませんか?
話の流れが全く見えない
>>883 流れを逸脱したレスを読んで流れ読むのは無理だろw
class B{
B();
bool Flag;
B::B(){
Flag = false;
}
};
class C{
void Test(bool& flag);
void C::Test(bool& flag){
flag = true;
}
};
class A{
bool update();
B b;
C c;
bool A::update(){
if(Key[KEY_INPUT_Z]) c.Test(b.Flag); //Zキーを押したらTest実行
return b.Flag;
}
};
int main(){
A a;
while(1){
if(a.update) break;
}
return 0;
}
クラスAの内部クラスB,クラスC
クラスBのメンバFlagがtrueになるとbreakします。
クラスBのメンバFlagをクラスC内で操作(true)する場合
参照渡し?やポインタで引数で渡す以外方法はないのでしょうか?
要点は内部クラスBからCのメンバを呼んだりCからBを呼んだりなどはできないのでしょうか?
設計自体がおかしいというのもあるかもしれませんが
お願いします
>>886 それは内部クラスとはいわない。適当にpublicなメソッドはやすか、friendクラスにすればいいんじゃね
#include <iostream>
class B;
class C{
int m_d;
public:
C():m_d(0){}
void set(B& b);
};
class B{
bool m_f;
public:
B():m_f(false){}
void set(bool f){ m_f = f; }
bool get(C& c){
c.set(*this);
return m_f;
}
};
void C::set(B& b){ b.set(m_d > 10); ++m_d; }
class A{
B b; C c;
public:
bool update(){ return b.get(c); }
};
int main() {
A a;
for(;;){
if (a.update()) break;
std::cout << "run\n";
}
}
889 :
886:2012/09/30(日) 21:41:02.90 ID:8YJ8oAKd
なるほど色々調べてみます
ありがとうございました
890 :
名前は開発中のものです。:2012/10/05(金) 23:29:32.39 ID:/P4DXadn
#include <map>
#include <string>
class Base{
};
int main(){
std::map<int, Base> Map;
Map.insert( std::map<int, Base>::value_type( 10, Base ) );
//std::map<int, std::string> Map;
//Map.insert( std::map<int, std::string>::value_type( 10, "aaa" ) );
std::cout << Map[10] << std::endl;
return 0;
}
キーがint,値が独自クラスのmapを作成したいのですがこれだとコンパイルが
insertでエラーになってしまいます。
値を独自クラスにする場合どうすればいいのでしょうか?
Baseの値は?
Map.insert( std::map<int, Base>::value_type( 10, Base ) );
Baseのところコンストラクタ呼んでやらんとだめだよ
それと、std::map<int, Base>::value_type()のかわりに
std::make_pair();を使ってやるといい
そうすっと
Map.insert( std::make_pair( 10, Base( ) ) );
こんな感じになる。
Map[10] = Base( );
これでも要素の挿入が可能。
893 :
890:2012/10/06(土) 21:27:09.32 ID:f2F52Ryh
上記の記述でうまく走りました
ありがとうございました
894 :
名前は開発中のものです。:2012/10/09(火) 23:44:44.58 ID:Gx7Ti8c3
class Base{
public:
int x;
};
class A : public Base{
};
class B : public Base{
};
class Scene{
public:
std::vector<Base*> Data;
};
895 :
名前は開発中のものです。:2012/10/09(火) 23:45:47.68 ID:Gx7Ti8c3
int main(){
Scene scene;
A a;
B b;
A c;
B d;
a.x = 2;
b.x = 0;
c.x = 7;
d.x = 4;
scene.Data.push_back(&a);
scene.Data.push_back(&b);
scene.Data.push_back(&c);
scene.Data.push_back(&d);
std::sort(scene.Data.begin(), scene.Data.end());
for(unsigned int i = 0; i<scene.Data.size(); i++){
std::cout << scene.Data[i] << " " << scene.Data[i]->x << std::endl;
}
return 0;
}
Base型ポインタのvector Data内の要素を基底クラスxの値でソートしたいのですが
Data内のアドレスでソートされてしまいます。Data内の要素はアドレスを格納しているのでそうなるようですが
xの値でソートするにはどう記述すればいいのでしょうか?
比較関数とかoperatorとかでしょうか?
std::sortの三番目の引数について調べるんだ!
>>895 そこまでわかってるならあと少しだろう
struct Compare { bool operator()(const Base *a, const Base *b){rerurn a->x < b->x; }};
std::sort(scene.Data.begin(), scene.Data.end(),Compare());
とか比較用の関数オブジェクトを使えばいい
Baseに対してoperator<とかを定義して std::lessやstd::greaterを使う書き方も出来る
898 :
894:2012/10/11(木) 00:45:51.50 ID:PmqcuLt2
うまくいきました
ありがとうございました
今までXY座標・角度・距離などで接触判定を行なっていたのですが、ベクトルというもののほうが接触判定の公式がいっぱいあるので乗り換えたいです。
そう思っていた時に過去ログに
http://dixq.net/forum/index.php というページが貼られていたので「これを機に全部ベクトルで判定するか」と思っていたのですが
案の定コード内容ですら意味不明です。
わかりやすいベクトルの使い方の解説サイトなどないでしょうか
XY座標・角度・距離からベクトルに乗り換えるって、意味が分からん。
移動を考慮するってことだろうな。
function checkcirclclsの説明ならできるけども。
最初のifはv・cの内積がマイナスか? つまりcosがマイナス、90<θ<270
始点から終点へのベクトルが円の方向とは逆向き 始点が円の中にあるかを判定してる
2つ目のif n2はvの二乗 n1=v・c=V*C*cosθ が、v・v=V^2よりもでかいってことは
cosθ>V/C ここで0<cosθ<1だから(上のifより)
V/C<1つまりV<C 2つのベクトルは同じ方向だけど、始点から終点への距離のほうが短い
よって終点が円の中にあるか確認
3つ目のifは終点が、始点と円の中心より遠くにある場合で
円の中心から線分に下ろした垂線の長さと円の半径比べてるって感じだと思う たぶん・・・
違ってたら申し訳ない。
小文字がベクトルで大文字が絶対値ね。
高校数学の類推で書いたけど、ゲーム数学でのtipっぽいサイト・本は知らないなあ。
904 :
名前は開発中のものです。:2012/10/12(金) 01:34:50.66 ID:DAtskPpl
ググったら普通に本もサイトもあるし
905 :
名前は開発中のものです。:2012/10/12(金) 20:59:11.47 ID:e5RAe9Bd
他スレの話しなんだが、なんか説得するのが面倒になったので
こっちに吐き出させてくれ…
処理系依存と未定義動作は完全に別物。
前者は、言語仕様で動作が規定されない代わりに
処理系(コンパイラ、リンカとかと、実行時のOSとか)側で
動作が規定されている。
どこかしらに「こういう動きになるよ」と書いてある事が大半(VCならMSDNにあるはず)
対して後者は、言語仕様側でも処理系側でも動作は規定されない。
誰も動作を保証しない。トラブルが有った時のクレーム先はどこにもない。
「今までこういう動きだったし」とかいう何の根拠にもならない理由は通用しない。
なぜなら、「今後もその動きをする」と保証してくれる所はどこにも無いから。
ゲ製では設計に迷っている人に対して「動きゃいいんだよ!!」と言う事がままあるが
こっちに関しては「今動いている事が奇跡」と考えるべきで、全然別物。
…と、この辺りまで考えて「何やってるんだろう俺」と感じて、書き込むのをやめた。
スレ汚しごめんよ、誰かに見てもらいたかっただけなんだ。
スレ汚しついでに、上の文で認識が間違ってるところがあったら教えてほしい。
あー、あのスレかw
あっこはstd::mapだから重い的な書き込みとか
自身の思い込みをそのまま書いて
それが真実であるようにして自分は間違ってない!って感じになることがあるなw
そもそもどんなことにも保証など存在しない。
他のスレで揉めたことを他に持ち込むな。
2chで誰かを言い負かしても何の得にもならんのに何やってんだお前ら
ゲーム作れゲーム
嘘知識で汚染されて(現場に)派遣されてくることがあるから
2chなんかと笑ってられなかったり
現場から極端に近い人と極端に遠い人ほどムキになる
>>906 あちらでもチラッと言ったけど、似たような概念は他に「不定」があるな
つーか「処理系定義」のことか?
お前らウイルスとか荒らしスクリプト作れないだろ?
雑魚そうだもんな
くっせーコテだなぁ
規制依頼すんぞ?
>>913 そういえばそうね。
文章的に正しいのは、処理系定義の挙動を前提としたプログラムは処理系依存、ってところか。
ここ見てる人たちは仕事でゲーム作ってる人たち?
本職のゲームプログラマも、
仕事でゲーム作ってるけどPGじゃない人も、
プログラマだけどゲーム作りは単なる趣味だって人もいるよ。
日本の低脳ゲームプログラマはカードゲーム、ボードゲームばっかりだなあおいおい!!
一人でMMORPGとか変わった対戦ゲームとかつくれねーのか!ヘイヘイヘイ!
本当にしょーもねーなシュシュ
全くグズばっかりだぜ
920 :
名前は開発中のものです。:2012/10/15(月) 00:15:23.38 ID:zkA4YGgF
あぼーんw
他のスレの話なら他のスレでやればいいのに
味方作って慰めてもらおうとしてるだけにしか見えないから
>>921 他のスレで荒れてたのを持ってきたというより、
C言語の仕様に関する話題になったので、こっちに持ってきたというのが正しいんじゃないかな
やる方法はあるみたいだけど、しないほうが無難じゃないかなあ
ロックマンみたいな横アクション作ってる人に聞きたいんだけど、カメラってどういう風に動かしてる?
縦にもスムーズに追跡したいんだけどキャラ中心にするとジャンプしただけでカメラが上下…
かといってジャンプ時に縦に動かないようにすると下に落下してもカメラが追跡しない
画面中央を基準として遊びの領域を設定しておき、キャラがそこから出たら追従
落下して端に到達したら暗転して次のマップ
カメラなんて概念捨ててフレームバッファだけで考えた方が簡単だと思うよ
でも今の横スクロールアクションって進行方向にカメラが予め設置されてるよね
レースゲームとかソニックのカメラってどうなってるの?
入力方向じゃないし、慣性方向でもなさそうだし、
かといって別にゴールの方向に常にカメラが向いてるわけでもないし
真似することを考えずにまずは自分なりの方法でやってみろ
>>932 全部cpuのピクセル処理で頑張ってるんじゃね
昔はマリオとかのゲームってキー入力のチェックと現在の位置から、場面場面で全部のパターン予め決めておいて分岐させてるだけかと思ってた。
つまり1フレーム目で上下左右のどのキーが押されたかチェックして4パターン作っといて、さらにそこから分岐して次の2フレーム目は16パターン3フレーム目は64パターン
>>933 どういうことだろう?と考えてみたが、みんな想定してる「カメラ」の定義がバラバラなのかもしれないと思った。
たぶん928が言ってる「カメラ」は3Dにおけるカメラなのかな。
>>934 想像したくねぇw
まあ、子供の頃は無茶な事を平気で考えるからな
俺の場合は、図形の組み合わせでプログラムが作れると本気で思ってた。
まあ最近、仕事でそれが出来るようなツールを知ったわけだが……UMLモデリングツールなんだけどな
オブジェクト指向言語なら組み合わせて使えるから、欲しいんだけどな……ち〜と手が届かない
俺はバイファムに出てきた戦闘シミュレータみたいなのは
俺が生きてる間には実現しないだろうなと思ってたよ……。
まさか家庭用ゲーム機がアーケードゲームの性能を超えるなんて
夢にも思わなかった。
お前は何を言っているんだ
941 :
名前は開発中のものです。:2012/10/19(金) 21:15:01.53 ID:ySWLrrZA
セーブするのはどうせプリミティブな型だけだからいいんでないの?
>>943 Cならば->は単純なポインタの足し算だからコンパイル時に決定されるけど、
C++だと->はそうではないことがあるってことかね?
典型的な offsetof の記述はこうなので
#define offsetof(type, mem) ((size_t) \
((char *)&((type *)0)->mem - (char *)(type *)0))
VCで仮想継承 を持つときには、アロー演算子が仮想関数テーブルを見にいくけど、
この時 Windowsのユーザモードの場合は(ほとんどの場合)読み込み禁止ページを見にいって、
Access violationを発生させる。保護機構が無い環境だと、アドレス 0に仮想関数テーブル分
のオフセットを足したアドレスを仮想関数テーブルだとおもって、多分でたらめな値を返す。
>(このアイデアはGame Programing Gems 3に記載されています。すばらしいですよね(^-^))
出展が書かれてるから本屋が近くにあるなら
載ってる部分立ち読みしてきたらどうだろう。
てかおれもGems3みかけたら読んでみよっと
2010年3月のネタを全く臆することなくドヤ顔で貼れる
>>946さんチョーカッコイイ
真のC++プログラマはdeleteを書かない
パフォーマンスのため、未だにメンバ変数にアクセスするときは、いちいちローカル変数に置き換えていたり、
明らかに多態させた方がいいのに、仮想化を避けたり・・・
確かに俺の場合、ゲームで使うときはなんかC++の爽快感がないなぁ
後者は今時のコンパイラなら上手いこと最適化してくれるんだっけ?
最適化もだが、そもそも今時のマシンはそのくらい気にする必要がないくらい速いだろ
マシン性能におんぶにだっこで、できる改善をやらないのは、プログラマの行動じゃないと思う。
じゃあ全部ハードウェアで実装しろ
改善というのは、できうる限りマシン性能におんぶにだっこさせることなんだが、
それがプログラマの行動じゃ無いというのは、いったいどれだけ愚か者なんだろう?
ハードに頼れない馬鹿なプログラマはクビだ
こいつらってハッカソンとか勉強会に参加してない低能なんだろ?
できる改善というやつも
結局コーディングの手間と実行速度やリソース消費とのバランスだよな。
一概に言えるもんじゃない。
あーよくいるよね、知識だけ溜めこんで実装できない奴
わかる
俺も中二の頃はハッカソンとか勉強会に参加するだけでカッコいいと思ってたよ
だれこいつ
例えば「この処理はハードがやってくれるからそっちに投げよう」というのはアリだろう。
けど「最近のPC処理能力ならできるだろうからやる必要はない」は相手の状況次第だろう。
相手が対象としてるPCが「最近の」だとは限らないし、作るゲームの規模も不明。
少なくともプログラム技術について語るスレで言うようなことじゃない。
950からの流れでプログラム技術とか言っちゃう人って……
手を抜くための理由以上のモノではないしな
>>925が救われたのかが気になる
スレチだろうけどな
>>950は素直にC使った方がいいんじゃないだろうか
そんなところに拘っても可読性落ちるだけで
プレイヤーには誤差にも感じない程度の差しかでないでしょ
967 :
956:2012/10/21(日) 21:43:51.38 ID:fWFEJkHx
>>959 かっこいいって何?
ハッカソンとかGame Jamにも足運んでるし
CEDECとかにも毎年参加してるし
いろいろな勉強会開いたりしてるよ?
バンナム社員の人と会話とかしてTwitterでも話してるし
ちなみに愛機はMBP(MacBook Pro)使ってるかな
UDKで作ったゲームは東方風のシューティング
あとはUnityとかもやってるしね
あとこう見えてゲームは全くやらないかな(笑)
「ゲーム好き、ゲームヲタク」っていうのはゲーム開発に不要って言われてるからね
普段全くゲームをしない、所詮人が作ったゲーム、自分で作ってやるほうがおもしろいかな
好きなゲームは地球防衛軍、ストリートファイター4
ネトゲは韓国の利益になるからやらないかな
968 :
956:2012/10/21(日) 21:52:32.03 ID:fWFEJkHx
一応できる言語書くね
C,C#,C++,Javascrip(Node.js),Coffeescript,Haskell,Eralng,Go,Scala,Python,Objective-C,OCaml,Scheme,LISP
とか使えるね
あとUnityの本とか全部そろえてるし
今はアンドロイドアプリ作ってるかな
じゃんけんゲームみたいなやつ
969 :
名前は開発中のものです。:2012/10/21(日) 21:58:35.68 ID:70260In1
ここってプロフェッショナルレベルの人たちが集っていたのか
>>968 「使える」のレベルが低いことが用意に窺い知れる書き込みだな
>>968 はじめて見るのがいくつかあるな
俺もgimpのスクリプト書くのにschemeちょっとやったけど
lisp系の言語ってどういう場面で必要になんの?
やっぱりスクリプト?
lispはemacsの設定で使う場面しか思いつかないな
>>966 可読性が落ちるのは間違いないが、効果は誤差どころじゃないな・・・。
俺が950で挙げた前者は、みんなもやってるよね。
今時のコンパイラなら後者もOKなら、そろそろ観念してVS2012Pro買うかなぁと思ってさ。
プログラミングのスキルは手段であって目的じゃないからな。
自分の作りたいゲームが作れなければ全ては無意味だ。
>>973 すいません、やってないっす…
関数細かく作るから同じメンバに何度もアクセスする箇所があんまりない
ループする箇所はSTLにまとめてイテレーターでやっちゃってるな…
もしかして、俺のコード超遅い?
>>975 いやフレーム毎に収まれば正義ですし、可読性重視でいんでないですかね。
考えてみればExpressならすぐ使えたなと言うわけで、VS2012で試してみました。
うちの環境だと、基底から仮想関数で呼び出した場合に比べ、直で呼び出した場合は、
大体23%くらいの速度で行けるみたい。
最適化オプション色々変えてもあまり変わらず。
最新のコンパイラでも、やっぱり遅いみたいね・・・。
どうでもいいけど2012のUIかっこいいな。メトロというよりレトロだけど。
クラスインスタンスのdelete時に、Pure virtual function callのエラーが出て悩まされた。
純粋仮想関数持ってる親クラスのデストラクタに入ってから、その仮想関数を呼んでいることが原因だった。
deleteなんて自分で書くものじゃないし
デストラクタもなるべく書かないほうが良い
2012ってXPには未対応なんね
>>978 そうなのか?
俺はdeleteもデストラクタも使い放題だぜ。
boostの参照カウンタ使えばdelete書かなくてもなんとかなる…かも?
>>982 移植の際にコンパイルエラー出たときの対応コストがboostは大きくつく。
ジャンルによってはカウンタ同期のコストが馬鹿にできないこともあるだろうし。
minmalなオレオレsmartptrを作っておくのが一番苦労しない気がする。
#include <iostream>
#include <vector>
#include <string>
int main(){
std::vector<std::string> Strings;
std::vector<int> Vector;
Strings.push_back("1-2-3-4-5");
Strings.push_back("9-7-8");
Strings.push_back("6");
for(unsigned int i = 0; i<Strings.size(); i++){
//VectorにStringsの文字列を正規表現等で格納したい
}
return 0;
}
Stringsに格納した文字列を正規表現で数字だけ取り出してVectorに格納したいのですが
正規表現はどうかけばいいのでしょうか?
Vectorを[1,2,3,4,5,9,7,8,6]といった具合です。
よろしくお願いします。
誰が調べてあげてたもれ
試してないけどboost::regex_grepに\\d+を突っ込むんじゃダメかな
deleteを自分で書くな
std::unique_ptrを使え
ノーコストのスマートポインタだ
スコープから抜けるときに自動的にdeleterを実行してくれる
std::unique_ptrが使えない場面では仕方ないのでstd::shared_ptrを使え
多態が必要なときはstd::shared_ptrじゃないとダメだった気がする
デストラクタを書くのはスマートポインタで自動的に解放できないリソースを扱うクラスのときだけだ
例えば、OpenGLのテクスチャオブジェクトとかな
だがFILEオブジェクトなんかはdeleterにfcloseを指定すればスマートポインタで自動解放可能だ
メンバ変数の解放はメンバ変数のデストラクタに任せて自分で解放しようとするな
抱合した子オブジェクトは親が死んだときに勝手に死ぬし
newしたオブジェクトはスマートポインタに入れとけば勝手に死ぬ
自分でdeleteする必要がある場面なんてまずないだろう
でもさ、
あるクラスをアプリ実行期間中、存続させつつづけて、
ゲーム・ステージの切り替わりのタイミングで、
それが持つ配列型メンバをリサイズする場合なんかには
deleteを使わざるを得ないんじゃないか?
こういうケースは頻繁にあるんだが。
全ステージ配列のサイズは固定とか縛り持たせるわけでもあるまい。
スマートポインタのvectorを使いなさい
あと、いまどき生配列はないな
固定長配列ならstd::array、可変長ならstd::vectorを使いなさい
Visual C++でデバッグモードでコンパイルすれば、範囲外アクセスしたときに例外投げてくれるはずだ
相互に関連していて、deleteでトリガーされるデストラクタの実行順を気にしなきゃいけない時もあるよ。
またブラックボックスな配列ってのは、リサイズ後のメモリアクセス効率性への影響が不安じゃない。
それなりに寿命が短くて、確実に管理できるなら
new/deleteの方が楽よね
>>991 例えばこういう循環参照を持つやつだよね。
struct B;
struct A{ B* b;};
struct B{ A* a;};
こういうときは、生存期間の管理用に一つ使い捨てのクラスを用意して、
struct C{
A a; B b;
C():a(),b(){ a.b = &b; b.a = &a; }; // 循環してるポインタをセット
~C(){} // デストラクタで a と b が 同時に破棄されるようにする。
}; // struct C自体はスタックか std::unique_ptr<C> にまかす。
デストラクタが走るときはコンストラクタと逆の順番だから、循環参照してて
デストラクタの実行順番を気にしないといけないような状態の場合はそれ自体を
struct Cのデストラクタに封じ込めるのはどうだろう。
オブジェクトへの参照を保持していることとオブジェクトを所有していることは別だと思うんだ
例えば木構造でなるべくメモリを局所化したい場合だとこういう感じになると思う
class Node { Node* firstChild; Node* sibling; Node* parent; };
std::vector<Node> vNode;
この場合、Nodeは他のNodeへの参照を持ってるけど、所有しているわけじゃない
所有しているのはvNodeを持つオブジェクトだ
あれこれって>993と同じことじゃね
weak_ptrを使うのだてめえら
class Task {
Task* m_pNext;
Task* m_pPrev;
bool m_Head; //デク先頭フラッグ
bool m_ToBeDeleted; //削除フラッグ
virtual void Exec()=0; //
};
class Filament : public Task { //m_EntryPointにTaskクラスをつなげる。
Task m_EntryPoint; //デク先頭
~Filament() { //親delete時に、連鎖的にdeleteする子の削除フラッグを立てる。
Task* child = m_EntryPoint.m_pNext;
while (!child->m_Head) {
child->m_ToBeDeleted=true;
child = child->m_pNext;
}
};
};
class Fiber : public Filament {...}; //m_EntryPointにFilamentクラスをつなげる。
class Synthesis { Fiber* fibers_active[4]; }; //1次元配列。参照のみ。
class Repository { //シーンの切り替わりで動的に生成・破棄し、インスタンスを必要分だけ保持する。
Task* tasks[1024]; //1次元配列。インスタンスを注入。
Filament* filaments[256]; //1次元配列。インスタンスを注入。
Fiber* fibers[64]; //1次元配列。インスタンスを注入。
};
↑極端な例だが、
Repositoryクラス内で、シーン中、必要なインスタンスしか確保しないという条件の場合、
まずSynthesisクラス内の要らないfibers_active要素だけ削除フラッグを立てて、
次にRepositoryクラス内のフラッグが立ったfibers要素をdeleteして、
次にRepositoryクラス内のフラッグが立ったfilaments要素をdeleteして、
最後にRepositoryクラス内のフラッグが立ったtasks要素をdeleteする、
っていうのが効率的なんじゃないか?
要は、麗しのタスクシステムなんだが(笑)
>>992 「確実に管理しなければならない」ポイントを減らすためにライブラリ使うんでしょ
お疲れ
そしてさようなら(#゚Д゚)/~~
1001 :
1001:
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。