|
Name: k ..入門者(3,488ポイント)
Date: 2008/10/12(日) 21:05
No:22359
|
|
Title: 龍神録プログラミングの館にリプレイをつける
|
|
龍神録プログラミングの館で勉強しています。
現在、龍神録プログラミングの館やDXライブラリ置き場のサンプルコードを見ながら
リプレイについて試行錯誤しています。
リプレイの記録/再生自体はある程度うまく行ったのですが、
リプレイファイルのサイズが予想外に大きくなってしまい、
何かアイデアが無いかと思い、質問させていただくことにしました。
以下のようにリプレイを記録/再生しています。
リプレイ用の構造体と、保存したフレーム数を記録する変数を用意しています。
typedef struct{
int paddata;//パッド記録用
char keydata[256];//キー記録用
}*replay_t, *LP_recdata;
replay_t replay;
LP_replay_t recdata;
int RecFrame;//保存したフレーム数
リプレイ記録時は
malloc関数でrecdataの領域を(かなり多めに)確保しています。
メインループの中で、パッドとキーの状態を記録する関数を呼びます
//リプレイ記録用関数
void Rec_replay(){
//パッドの入力状態を格納
recdata[RecFrame].paddata = GetJoypadInputState( DX_INPUT_KEY_PAD1 );
//キーの入力状態を格納
GetHitKeyStateAll( recdata{RecFrame].keydata );
//保存したフレーム数をインクリメント
RecFrame++;
}
リプレイをファイルに保存する際に
変数 RecFrame
と
構造体 recdata
とを順に保存しています。
void Save_replay(){
FILE *fp ;
// ファイルを開く
fp = fopen( "new.rpy" , "wb" ) ;
if(fp==NULL){//もし開けなかったら
DrawString(0,0,"replay write error",GetColor(255,255,255));
return;
}
//まず保存したフレーム数を書き込む
fwrite(&RecFrame,sizeof(int),1,fp);
//次に動作保存データ構造体を、保存したフレーム数分書き込む
fwrite(recdata, sizeof( replay_t ),RecFrame,fp);
fclose( fp ) ;
}
以下は再生時の処理です。
リプレイ再生開始時は保存したファイルを読み込みます。
int RePlayFrame;//再生したフレーム数
void load_replay(){
FILE *fp;
//リプレイデータファイルを開く
fp = fopen("replay.rpy","rb");
//もし開けなかったら…
if(fp==NULL){
DrawString(0,0,"replay read error",GetColor(255,255,255));
return;
}
//まず保存したフレーム数を読み込む
fread(&RecFrame,sizeof(int),1,fp);
//動作保存データを読めるだけのメモリ確保
recdata = ( LP_replay_t )malloc( sizeof( replay_t ) * RecFrame ) ;
//次に動作保存データ構造体を、保存したフレーム数分読み込む
fread(recdata, sizeof( replay_t ),RecFrame,fp);
//再生したフレーム数を初期化
RePlayFrame =0;
fclose( fp ) ;
}
以下再生中の処理です
龍神録プログラミングの館8章の
GetHitPadStateAll()にリプレイ再生時の場合を追加しています。
void GetHitPadStateAll(){
int i,PadInput,mul=1;
if(Replay_flag==1){//リプレイの再生のフラグが立っている場合は
PadInput = recdata[ RePlayFrame ].paddata;
for(i=0;i<16;i++){
if(PadInput & mul) pad.key[i]++;
else pad.key[i]=0;
mul*=2;
}
input_pad_or_key(&pad.key[configpad.left] ,
recdata[ RePlayFrame ].keydata[KEY_INPUT_LEFT ]);
input_pad_or_key(&pad.key[configpad.up] ,
recdata[ RePlayFrame ].keydata[KEY_INPUT_UP ]);
input_pad_or_key(&pad.key[configpad.right] ,
recdata[ RePlayFrame ].keydata[KEY_INPUT_RIGHT ]);
input_pad_or_key(&pad.key[configpad.down] ,
recdata[ RePlayFrame ].keydata[KEY_INPUT_DOWN ]);
input_pad_or_key(&pad.key[configpad.shot] ,
recdata[ RePlayFrame ].keydata[KEY_INPUT_Z ]);
input_pad_or_key(&pad.key[configpad.bom] ,
recdata[ RePlayFrame ].keydata[KEY_INPUT_X ]);
input_pad_or_key(&pad.key[configpad.slow] ,
recdata[ RePlayFrame ].keydata[KEY_INPUT_LSHIFT ]);
input_pad_or_key(&pad.key[configpad.start] ,
recdata[ RePlayFrame ].keydata[KEY_INPUT_ESCAPE ]);
input_pad_or_key(&pad.key[configpad.change] ,
recdata[ RePlayFrame ].keydata[KEY_INPUT_LCONTROL]);
RePlayFrame++;
return;//リプレイの場合ここまで
}
PadInput = GetJoypadInputState( DX_INPUT_PAD1 );//パッドの入力状態を取得
for(i=0;i<16;i++){
if(PadInput & mul) pad.key[i]++;
else pad.key[i]=0;
mul*=2;
}
input_pad_or_key(&pad.key[configpad.left] ,CheckStateKey(KEY_INPUT_LEFT ));
input_pad_or_key(&pad.key[configpad.up] ,CheckStateKey(KEY_INPUT_UP ));
input_pad_or_key(&pad.key[configpad.right] ,CheckStateKey(KEY_INPUT_RIGHT ));
input_pad_or_key(&pad.key[configpad.down] ,CheckStateKey(KEY_INPUT_DOWN ));
input_pad_or_key(&pad.key[configpad.shot] ,CheckStateKey(KEY_INPUT_Z ));
input_pad_or_key(&pad.key[configpad.bom] ,CheckStateKey(KEY_INPUT_X ));
input_pad_or_key(&pad.key[configpad.slow] ,CheckStateKey(KEY_INPUT_LSHIFT ));
input_pad_or_key(&pad.key[configpad.start] ,CheckStateKey(KEY_INPUT_ESCAPE ));
input_pad_or_key(&pad.key[configpad.change] ,CheckStateKey(KEY_INPUT_LCONTROL));
}
以上、実際のコードとは変数名などこれとは異なる部分もあるのですが、このような感じです。
実際には9個しかキーは判定しないのに、
char keydata[256]と256個も配列を用意しているのが無駄なような気がするのですが、
どうすれば小さくできるか検討がつきません。
他にも何か気になるところや方法がありましたらお教えいただきたいと思います。
よろしくお願いします。
2,297ポイント を手に入れた。
|
|
|
|
Name: k ..入門者(3,526ポイント)
Date: 2008/10/12(日) 21:38
No:22361
|
|
Title: Re:龍神録プログラミングの館にリプレイをつける
|
|
保存したファイルと読み込むファイルのファイル名が違ってますね。
失礼しました。
よろしくお願いいたします。
38ポイント を手に入れた。
|
|
|
|
|
Name: array ..プログラマー(33,923ポイント)
Date: 2008/10/12(日) 21:39
No:22362
|
|
Title: Re:龍神録プログラミングの館にリプレイをつける
|
|
私も以前、リプレイに挑戦してみたのですが試行錯誤しながら作ったので詳しくは理解できてないです・・・
プログラムは詳しくは見てないのですが気になった点があったので
> 何かアイデアが無いかと思い、質問させていただくことにしました。
とのことなので、自機のみのリプレイならDXライブラリのリプレイサンプルを応用するのが一番軽いんじゃないでしょうか。
見た感じ多分参考にしているんですかね。
本題
keydata[256]←に関してですが、必要なかったと思います。(なくても動作するはずです)
そんな感じで実現したファイルは200KBも超えてないファイルなのですが、サイズ大きいですかね。
ただ、私のは入力情報を再生してるだけなので敵の弾幕にランダム関数が使われてたら、誤動作するんですけどねw
・・・なので、とりあえず
keydata[256] これを消してみてはどうでしょうか。
281ポイント を手に入れた。
|
|
|
|
|
Name: Justy ..ハッカー(237,398ポイント)
Date: 2008/10/12(日) 21:41
No:22363
|
|
Title: Re:龍神録プログラミングの館にリプレイをつける
|
|
>char keydata[256]と256個も配列を用意しているのが無駄なような気がするのですが
はい、パッドとキーポードを両方取得記録するのは大きな無駄ですね。
パッドとキーポード両方見たとしても、結局はどちらかが押されていることさえ
わかればいいのですし、9個しか使用するキー/ボタンがなく、又 on/offの2種類しか
状態ないのでしたら、理論的には9ビットのデータでいいはずです。
つまり(一般的な Windwosのコンパイラなら)unsigned shortに各キーが
押されているかどうかを、ビット単位で入れていけばいい、ということになります。
まず、構造体の方は以下のようになるでしょう。
typedef struct{
unsigned short keydata;
}*replay_t, *LP_recdata;
はい、大幅に減りました。
あとはパッドかキーボードのどちらかで押されていれば keydataのビットを立てて
いきます。
keydata = 0;
if(leftが押されている) keydat |= (1 << 0);
if(upが押されている) keydat |= (1 << 1);
if(rightが押されている) keydat |= (1 << 2);
if(downが押されている) keydat |= (1 << 3);
....
で、これを保存して、読み出すときは反対に
if(keydata & (1 << 0)) leftが押されている
if(keydata & (1 << 1)) upが押されている
if(keydata & (1 << 2)) rightが押されている
if(keydata & (1 << 3)) downが押されている
としていきます。
さて、ここで。
startボタンは保存する必要あるのでしょうか?
多分 startボタンはメニューとかポーズ表示になると思うのですが、
これが行われたときも忠実にリプレイするならともかく、そうでないとしたら
保存する必要は無くなるので 9ビットではなく 8ビットで済み、unsigned shortではなく、
unsigned charで事足りることになります。
typedef struct{
unsigned char keydata;//キー記録用
}*replay_t, *LP_recdata;
とさらに半分になりますね。
と、ざっくりとこんなかんじです。が、どうでしょうか?
1,004ポイント を手に入れた。
|
|
|
|
|
Name: k ..入門者(3,782ポイント)
Date: 2008/10/13(月) 00:57
No:22393
| 解決!
|
Title: Re:龍神録プログラミングの館にリプレイをつける
|
|
arrayさん
Justyさん
ありがとうございます。
これでファイルをかなり小さく出来そうです。
入力状態を全て保存しなきゃならない、
という思い込みがあったみたいです。
乱数は今のところ、
SRand(0);
とかにして、どんな場合でも固定しています。
乱数を再現したい時は、乱数の種もファイルに保存して、
再生時に読み込んで再現するようにすればいいのかな、と思っています。
はじめの投稿のコードにちょっと間違いがあったので訂正しておきます。
typedef struct{
int paddata;//パッド記録用
char keydata[256];//キー記録用
}replay_t, *LP_recdata;
256ポイント を手に入れた。
|
|
|
|
|
Name: array ..プログラマー(34,032ポイント)
Date: 2008/10/13(月) 09:15
No:22403
|
|
Title: Re:龍神録プログラミングの館にリプレイをつける
|
|
>Justyさん
あまりにも凄い回答だったので驚いてました。
私も参考にさせてもらいます^^
41ポイント を手に入れた。
|
|
|
|
|
Name: 管理人 ..伝説なるハッカー(814,947ポイント)
Date: 2008/10/13(月) 11:16
No:22406
|
|
Title: Re:龍神録プログラミングの館にリプレイをつける
|
|
更に突っ込むと、リプレイを作ってみるとよくわかるのですが、
ほとんど記録されるデータは0なんですね。
ここまで龍神録では実装してないんですが・・
例えば
上キー
下キー
左キー
右キー
ショットキー
・・・
色々ありますが、
常にコレ全部おさえるわけは無く、
ボムボタンなんて一度も押されないかもしれません。
ず〜〜っと0ばかり連続するのはもったいないので、データを圧縮すると更に小さくなると思います。
http://homepage2.nifty.com/natupaji/DxLib/lecture/Press/press.html
そこまで小さくする必要があるのかということになるかもしれませんが、
大きなゲームになってプレイヤー同士でリプレイデータを交換したりしてもらえるようになると
やはりリプレイデータは小さいに越した事は無いと思います。
ただしリプレイデータって本当にデリケートといいますか、
どこか少しでも計算式などを間違えたりすると全く違うデータになってしまいます。
ボムボタンが押されたデータ一つ抜けてもそれ以降のゲームは全く違うものになってしまいます。
また、秒間60フレームで沢山のキーデータをしかもビット単位でほぞんするので、
バイナリデータ見てもわけがわかりません。
なので最初からリプレイデータをいじくるとうまく再生されなかったとき、
一体何処がわるいのかわけがわからなくなる可能性があるかもしれないので、
少しずつ作っていくのがいい・・・ということを身を持って知りました・・ので何か参考になれば^^;
416ポイント を落としてしまった。
|
|
|
|
|
Name: Justy ..ハッカー(241,212ポイント)
Date: 2008/10/13(月) 12:22
No:22407
|
|
Title: Re:龍神録プログラミングの館にリプレイをつける
|
|
arrayさん
>あまりにも凄い回答だったので驚いてました。
いやいやいや、そんな凄いことではないです(;^_^
凄い人はもっと凄いことをしているはずです。
管理人さん
>ず〜〜っと0ばかり連続するのはもったいないので、データを圧縮すると更に小さくなると思います。
ですね。
ファイル保存時は既存の圧縮技術を使いやいところなので、zlibとかを使えば相当縮められますね。
0ばかり続く、ということですが、これを利用して記録時にさらにデータを
縮められそうです。
ゲームのボタンの場合、1/60などの細かい単位でみると多くは0、というより
前の値と同じ値が続くことが多いです。
というか、1フレームごとに異なるボタンを押すことが非常に難しい。
激しいシューティングでも平均すれば1秒間に10回も押下情報が変化するか
どうかってところではないでしょうか。
であれば、前のフレームの押下情報と比較して変化があったら、
前回記録したフレームとの差の情報とキーの情報を記録します。
これで、変化があったときだけ記録する形になりますので大分データが小さくなります。
ついでに前回の記録したフレームとの差の情報は 256フレーム以上変化がなかったら、
強制的に記録をとるようにすれば、unsigned charでいけるので、
1回の記録容量は2バイトで済みますね。
ここまでする必要があるかどうかは、ゲーム次第ですけど・・・。
>どこか少しでも計算式などを間違えたりすると全く違うデータになってしまいます。
たしかに。
初期の段階から、それを念頭においた設計が必要ですよね。
一番嫌なのが、非同期ものの処理があったりすることで、個別にちょっと工夫が
必要になったり・・・。
255ポイント を手に入れた。
|
|
|
|
|
Name: 管理人 ..伝説なるハッカー(819,574ポイント)
Date: 2008/10/13(月) 21:45
No:22431
|
|
Title: Re:龍神録プログラミングの館にリプレイをつける
|
|
なるほど〜、毎回キーの入力状態を保存するんじゃなく、
キーの入力状態の変化を保存するわけですね。
基本的にショットボタンなんて押しっぱなし固定ですし、
上下左右移動もホントに1秒に何度押すかと考えたらそんなに無いですね。
これはかなりデータが少なく出来そうです。
これは是非龍神録2に実装させていただきたい・・w
103ポイント を手に入れた。
|
|
|
|
|
Name: 管理人 ..伝説なるハッカー(819,718ポイント)
Date: 2008/10/13(月) 21:50
No:22432
|
|
Title: Re:龍神録プログラミングの館にリプレイをつける
|
|
>非同期ものの処理があったりすることで
例えばストップボタンを途中で押したとして、リプレイにストップボタンを記録していなかった場合、
その間動いていた背景に乱数などが使われていたような場合でしょうか?
このような必要がある時は、個別の自作乱数などを作った方がよさそうですね。
リプレイ系はホントに初期化や乱数系がバグの元になって大変でした・・。
144ポイント を手に入れた。
|
|
|
|
|
Name: Justy ..ハッカー(241,631ポイント)
Date: 2008/10/13(月) 22:31
No:22435
|
|
Title: Re:龍神録プログラミングの館にリプレイをつける
|
|
>基本的にショットボタンなんて押しっぱなし固定ですし、
>上下左右移動もホントに1秒に何度押すかと考えたらそんなに無いですね。
>これはかなりデータが少なく出来そうです。
この方式なら1時間くらい記録しても 100KBにも満たないですよね、きっと。
>例えばストップボタンを途中で押したとして、リプレイにストップボタンを記録していなかった場合、
>その間動いていた背景に乱数などが使われていたような場合でしょうか?
それはそれで問題ですが、ここでいう非同期というのは
ファイルロードやネットワーク、スレッドが絡んでくるような場合です。
リプレイでネットワーク、というのはまずなさそうですが、
ゲームをしている裏でファイルロードなどを行い、読み込みが終わった時点で
表示などの動作を行うような類のもの・・・STGとかですと、ボスの出現前に
小康状態になって裏でロードをしそれが終わり次第ボス出現、となるようなケースです。
読み込み終わるのは状況によって変わってくるので、読み込みが終わったタイミングを
リプレイ記録の中に残しておかなければならないわけです。
激しく面倒ですね。
419ポイント を手に入れた。
|
|
|
|
|
Name: lbfuvab ..初心者(5,356ポイント)
Date: 2008/10/13(月) 22:51
No:22437
|
|
Title: Re:龍神録プログラミングの館にリプレイをつける
|
|
そう言えばリプレイでFPSを保存する必要はないのでしょうか?
プレイ時に処理落ちして40fpsで120フレーム動いた物を60fpsで再生すると1秒ずれますが・・・
68ポイント を手に入れた。
|
|
|
|
|
Name: array ..プログラマー(34,307ポイント)
Date: 2008/10/13(月) 22:55
No:22439
|
|
Title: Re:龍神録プログラミングの館にリプレイをつける
|
|
> そう言えばリプレイでFPSを保存する必要はないのでしょうか?
フレーム毎に入力データを保存してると思うので、多分 実行時(記憶時・再生時)の処理速度はあまり気にしなくてもいいと思います。
55ポイント を手に入れた。
|
|
|
|
|
Name: 管理人 ..伝説なるハッカー(819,851ポイント)
Date: 2008/10/13(月) 23:27
No:22441
|
|
Title: Re:龍神録プログラミングの館にリプレイをつける
|
|
arrayさんの仰るとおり時間による制御をしていないので、fpsを気にする必要がないのです。
そういう意味ではオンラインアクションゲームなんかのりプレイデータは作るのが大変そうですね^^;
92ポイント を手に入れた。
|
|
|
|
Name: 迷える羊 ..入門者(4,542ポイント)
Date: 2008/10/12(日) 20:16
No:22357
|
|
Title: あたり判定_回転
|
|
こんばんは。以前からここを使わせていただいているものです。
たくさんのサイトをめぐっていたのですが,いいアドバイスになるものがなく,困っていたところです。
知りたい方法というのが,静止している短形と回転している短形とのあたり判定の処理についてなんです。
二つの短形が静止しているあたり判定というのは,簡単にできるのですが回転している短形というのは,
あたり判定の動きをどう考えればよいのか分かりません。
もちろん,いろいろな方法を試してはみましたが,短形同士があたっていないにもかかわらずあたっている
と判断されたりと,どの方法でも行き詰ってしまいました。
静止している短形の方は壁となるもので,回転している短形はプレイヤーが動かすものとしています。
そして,プレイヤーが動かす短形は常に画面の中心にあり,十字キーを押すと背景(壁)が動くようにしています。
どなたか静止短形と回転短形とのあたり判定の方法をご教示くださいませんでしょうか?
416ポイント を手に入れた。
|
|
|
Name: 大工 ..プログラマー(29,653ポイント)
Date: 2008/10/12(日) 20:08
No:22356
| 解決!
|
Title: コピーコンストラクタについて
|
|
スタックの内容を統合するというプログラムなんですが,コピーコンストラクタが使われている場面がよくわからないので質問させてください.
添付のプログラムでコピーコンストラクタの部分がないとエラーになると授業で習ったのですが,見た感じはコピーコンストラクタがいらなくても別に異常なく動作するように感じます.
なぜなら
ex1:
CLASS ob1;
CLASS ob2 = ob1;
というようなコピーコンストラクタを用いた操作をplus関数内で行っていないからです.また,main関数内での代入演算子がex1の様な動作をしているのかと調べてみてもoperator=が動いてるだけでコピーコンストラクタではありませんでした.
コピーコンストラクタがplus(stack s1, stack s2)の引数に使われているのは理解しています.plus関数の引数以外でコピーコンストラクタがどこで効いてくるのでしょうか?
stack(int sz)0xbfde5304
stack(int sz)0xbfde52f8
stack(int sz)0xbfde52ec
------------
stack(const stack& s)0xbfde52d4
stack(const stack& s)0xbfde52e0
stack(int sz)0xbfde5284
stack(int sz)0xbfde52c8
~stack()0xbfde5284
operator=(const stack& s)0xbfde52ec
~stack()0xbfde52c8
~stack()0xbfde52e0
~stack()0xbfde52d4
max=5, sp=3, data=(1 3 5 )
max=5, sp=3, data=(2 4 6 )
max=10, sp=6, data=(1 3 5 2 4 6 )
~stack()0xbfde52ec
~stack()0xbfde52f8
~stack()0xbfde5304
19ポイント を手に入れた。
|
|
|
|
Name: Justy ..ハッカー(236,394ポイント)
Date: 2008/10/12(日) 20:52
No:22358
|
|
Title: Re:コピーコンストラクタについて
|
|
>plus関数の引数以外でコピーコンストラクタがどこで効いてくるのでしょうか?
plus(stack s1, stack s2)の戻り値ですかね。
最適化されると、消えてしまうかもしれませんが。
>添付のプログラムでコピーコンストラクタの部分がないとエラーになると
>授業で習ったのですが,見た感じはコピーコンストラクタがいらなくても
>別に異常なく動作するように感じます.
stackクラスのコピーコンストラクタを明示的に定義しなくても異常なく動作する、
という意味でしょうか?
まぁ、コンパイルは通りますよ。定義しなくても暗黙的にコピーコンストラクタは
作られますから。
ただ、オブジェクトのコピーが発生した段階でそのクラスは正常には作動しなくなります。
299ポイント を手に入れた。
|
|
|
|
|
Name: 大工 ..プログラマー(29,877ポイント)
Date: 2008/10/12(日) 21:25
No:22360
|
|
Title: Re:コピーコンストラクタについて
|
|
>stackクラスのコピーコンストラクタを明示的に定義しなくても異常なく動作する、
>という意味でしょうか?
その通りです.
と,いうことはplus関数内のsはmain関数に戻ってくる際に(return s; の時点で)コピーコンストラクタが暗に呼び出されそれを代入演算子によって入力しているからコピーコンストラクタが無い場合,もうすでに開放した無効な領域をさらに開放しようとしてエラーとなるということでしょうか?
なにかしら関数をClass func();と言うように定義していると戻り値ではコピーコンストラクタが呼ばれている?Class& func();では呼ばれない?
よろしくお願いします.
224ポイント を手に入れた。
|
|
|
|
|
Name: Justy ..ハッカー(237,970ポイント)
Date: 2008/10/12(日) 21:58
No:22365
|
|
Title: Re:コピーコンストラクタについて
|
|
>と,いうことはplus関数内のsはmain関数に戻ってくる際に
>〜略〜
>もうすでに開放した無効な領域をさらに開放しようとしてエラーとなるということでしょうか?
エラーになるかどうは環境にもよりますが、そういうことになります。
>なにかしら関数をClass func();と言うように定義していると戻り値ではコピーコンストラクタが呼ばれている
基本的には呼ばれる、と考えて下さい。
ただ、コンパイラによって最適化・・・戻り値の最適化(RVO)が働くことあります。
ttp://www.kmonos.net/alang/cpp/glossary.html#RVO
ttp://ml.tietew.jp/cppll/cppll/thread_articles/12750#ar12750
その為省略されることもありますので、呼ばれることを前提にして組んでしまうと
それはそれで問題になるかもしれません。
>Class& func();では呼ばれない?
これは、
stack& hoge1()
{
static hoge h(5);
return h;
} とか
stack& hoge2(stack& h)
{
return h;
}
という感じのを想定していますか?
これらでしたら、関数を使うだけではコピーコンストラクタは呼ばれません。
でも、もちろん、
stack s1 = hoge1();
stack s2 = hoge2(s1);
とかしたら、呼ばれてしまいますが。
572ポイント を手に入れた。
|
|
|
|
|
Name: 大工 ..プログラマー(29,818ポイント)
Date: 2008/10/12(日) 22:02
No:22366
|
|
Title: Re:コピーコンストラクタについて
|
|
??????????????
戻り値をなんらかの変数に入力しようとしたらアンパーサンドをつけようがつけまいが一緒ってことでしょうか?
なんだか混乱してきました.
59ポイント を落としてしまった。
|
|
|
|
|
Name: Justy ..ハッカー(237,998ポイント)
Date: 2008/10/12(日) 22:07
No:22368
|
|
Title: Re:コピーコンストラクタについて
|
|
>戻り値をなんらかの変数に入力しようとしたらアンパーサンドをつけようがつけまいが一緒ってことでしょうか?
混乱させて済みません。
上の例のように戻り値を変数に入力した際によばれるのは s1、s2のコピーコンストラクタが
働くからです。
この hoge1/hoge2関数自体は使うことでコピーコンストラクタが呼ばれることはありません。
28ポイント を手に入れた。
|
|
|
|
|
Name: 大工 ..プログラマー(30,009ポイント)
Date: 2008/10/12(日) 22:25
No:22370
|
|
Title: Re:コピーコンストラクタについて
|
|
上の例のように戻り値を変数に入力した際によばれるのは s1、s2のコピーコンストラクタが
働くからです。
この hoge1/hoge2関数自体は使うことでコピーコンストラクタが呼ばれることはありません。
なるほど.ですが,質問の中にある実行結果でoperator=のオーバーロードが呼ばれていますが,コピーコンストラクタとは別に動いてる
ということでしょうか?ちゃんとコンストラクタが実行されたらコメントが出るようにしてるのに出てません・・・・・よね?
191ポイント を手に入れた。
|
|
|
|
|
Name: Justy ..ハッカー(239,469ポイント)
Date: 2008/10/12(日) 22:52
No:22373
|
|
Title: Re:コピーコンストラクタについて
|
|
>質問の中にある実行結果でoperator=のオーバーロードが呼ばれていますが,コピーコンストラクタとは別に動いてる
別です。
>ちゃんとコンストラクタが実行されたらコメントが出るようにしてるのに出てません・
ですから、先も書きましたように戻り値の最適化が働くとコピーコンストラクタが
省略されることがあるので、多分そのケースに該当するのでしょう。
ちなみにうちの環境でも同じようになっています。
最適化なしで実行するとこうなります。
stack(int sz)0013FF50 // s1の生成
stack(int sz)0013FF3C // s2の生成
stack(int sz)0013FF28 // sの生成
------------
stack(const stack& s)0013FE08 // s2のplusの引数の為のコピー
stack(const stack& s)0013FDFC // s1のplusの引数の為のコピー
stack(int sz)0013FDC8 // plus関数内でのローカル変数 tmp生成
stack(int sz)0013FDB4 // plus関数内でのローカル変数 s生成
stack(const stack& s)0013FE54 // plus関数の戻り値としてコピー
~stack()0013FDB4 // ローカル変数 s の破棄
~stack()0013FDC8 // ローカル変数 tmpの破棄
~stack()0013FDFC // ローカル変数 s1 の破棄
~stack()0013FE08 // ローカル変数 s2 の破棄
operator=(const stack& s)0013FF28 // plus関数の戻り値を mainの sへのコピー
~stack()0013FE54 // plus関数の戻り値を破棄
max=5, sp=3, data=(1 3 5 )
max=5, sp=3, data=(2 4 6 )
max=10, sp=6, data=(1 3 5 2 4 6 )
~stack()0013FF28 // sの破棄
~stack()0013FF3C // s2の破棄
~stack()0013FF50 // s1の破棄
最適化をかけるとこうなります。
stack(int sz)0013FF4C
stack(int sz)0013FF40
stack(int sz)0013FF58
------------
stack(const stack& s)0013FF28 // s2のplusの引数の為のコピー
stack(const stack& s)0013FF1C // s1のplusの引数の為のコピー
stack(int sz)0013FEFC // plus関数内でのローカル変数 tmp生成
stack(int sz)0013FF64 // plus関数内でのローカル変数 s生成
~stack()0013FEFC // ローカル変数 tmpの破棄
~stack()0013FF1C // ローカル変数 s1 の破棄
~stack()0013FF28 // ローカル変数 s2 の破棄
operator=(const stack& s)0013FF58 // plus関数の戻り値(plus関数内でのローカル変数 s)を mainの sへのコピー
~stack()0013FF64 // plus関数の戻り値(plus関数内でのローカル変数 s)を破棄
max=5, sp=3, data=(1 3 5 )
max=5, sp=3, data=(2 4 6 )
max=10, sp=6, data=(1 3 5 2 4 6 )
~stack()0013FF58
~stack()0013FF40
~stack()0013FF4C
最適化をかけると見事にplus関数の戻り値としてのコピー(コンストラクタ)がなくなり、
代わりに plus関数内部で作成した変数 sをそのまま main関数の sに代入しているのが
わかりますでしょうか。
これが戻り値の最適化です。
1,471ポイント を手に入れた。
|
|
|
|
|
Name: 大工 ..プログラマー(30,294ポイント)
Date: 2008/10/12(日) 23:32
No:22376
|
|
Title: Re:コピーコンストラクタについて
|
|
むむ!コピーコンストラクタがどのように使われているか分かった気がします.
まだちょっと質問があるのでおねがいします><.
stack(const stack& s)0013FE54 // plus関数の戻り値としてコピー
これは s を plus関数の戻り値としてコピーするという理解で良いでしょうか?
あと,
operator=(const stack& s)0013FF58 // plus関数の戻り値(plus関数内でのローカル変数 s)を mainの sへのコピー
~stack()0013FF64 // plus関数の戻り値(plus関数内でのローカル変数 s)を破棄
operator=をオーバーロードしているので,各々のオブジェクトにデータが入っている
(つまり,ob1 = ob2; とするとob1はob2のデータがあるメモリをみているのではなく,ob1がデータをもっているという意味です)
ように設計したので実際のところコピーコンストラクタはいらないんじゃ?という疑問が出てきました.
285ポイント を手に入れた。
|
|
|
|
|
Name: Justy ..ハッカー(239,709ポイント)
Date: 2008/10/12(日) 23:55
No:22380
|
|
Title: Re:コピーコンストラクタについて
|
|
>これは s を plus関数の戻り値としてコピーするという理解で良いでしょうか?
OKです。
>ように設計したので実際のところコピーコンストラクタはいらないんじゃ
operator=があるからといって、コピーコンストラクタを削除すると、
{
stack st1(5);
stack st2a(a1); // *
stack st2b = a1; // *
}
このコードを実行すると st1と st2a、st2bのメンバ dataは全て同じになってしまい、
結果デストラクタで多重解放になりますよ。
240ポイント を手に入れた。
|
|
|
|
|
Name: 大工 ..プログラマー(30,988ポイント)
Date: 2008/10/13(月) 00:10
No:22382
|
|
Title: Re:コピーコンストラクタについて
|
|
それもそうですが,さっき言いたかったのはmain関数内のs = plus(s1, s2);での話です.
言葉たらずですみません・・・
32ポイント を手に入れた。
|
|
|
|
|
Name: Justy ..ハッカー(240,264ポイント)
Date: 2008/10/13(月) 00:19
No:22383
|
|
Title: Re:コピーコンストラクタについて
|
|
>それもそうですが,さっき言いたかったのはmain関数内のs = plus(s1, s2);での話です.
??
えーと、ちょっとご質問の意図が読みとれなかったので、お訊きしますが、
「main関数内のs = plus(s1, s2);」でコピーコンストラクタはいらないと思った、
というのはどういうことでしょう??
178ポイント を手に入れた。
|
|
|
|
|
Name: 大工 ..プログラマー(31,136ポイント)
Date: 2008/10/13(月) 00:37
No:22388
|
|
Title: Re:コピーコンストラクタについて
|
|
えとですね・・・・・・・
operator=をオーバーロードしたので同じメモリを参照することはありませんよね?
だからコピーコンストラクタを明示的に定義しなくてもoperator=できちんと値が入力されると思ったからです....
53ポイント を手に入れた。
|
|
|
|
|
Name: Justy ..ハッカー(240,613ポイント)
Date: 2008/10/13(月) 00:54
No:22392
|
|
Title: Re:コピーコンストラクタについて
|
|
>operator=をオーバーロードしたので同じメモリを参照することはありませんよね?
なるほど。
えーとですね。
「main関数内のs = plus(s1, s2);」の戻り値の代入部分に関しては
既に作られた変数 sへの代入になり、operator=()が呼ばれますので
たしかに同じメモリを参照することはありません。
従って、今回のプログラムの内容ですと、plus関数の引数のところさえ
修正すれば、仰るとおりコピーコンストラクタは不要、と考えてもいいのかもしれません。
とはいえ、クラスの設計的にはやっぱり必要だと思いますよ。
232ポイント を手に入れた。
|
|
|
|
|
Name: 大工 ..プログラマー(31,191ポイント)
Date: 2008/10/13(月) 01:02
No:22394
|
|
Title: Re:コピーコンストラクタについて
|
|
なるほど,ありがとうございます.
代入演算子とコピーコンストラクタは絶対に定義するのが定番みたいなもんでしょうかね?
45ポイント を手に入れた。
|
|
|
|
|
Name: Justy ..ハッカー(240,957ポイント)
Date: 2008/10/13(月) 01:20
No:22395
|
|
Title: Re:コピーコンストラクタについて
|
|
んー、絶対に必要というわけではないです。
クラスの内容によって変わります。
例えば、
class A
{
public:
int a;
int b;
int c;
};
のように丸ごとコピーされても問題ない場合はどちらも必要有りません。
しかし、今回の stackクラスのような内部で何かをリソースを確保して、
デストラクタで解放するような構造だったりする場合は、
コピーコンストラクタや operator=()がないと、2つのクラスで同じリソースを
共有することになります。
そういうケースの場合、なんらかのリソースの共有機構(スマートポインタなど)を
持っていればいいのですが、そうでなければコピーコンストラクタや operator=()を
定義して、それを防ぐ必要があります。
余談ですが、定義ではなく宣言だけでもいい場合があります。
class stack
{
public:
stack(){}
...
private:
stack(const stack&); // 実装は不要
stack& operator=(const stack&); // 実装は不要
};
のように privateで宣言だけしておくとこのクラスは真っ当な手段では
コピーができなくなります。
コピーできないので同じリソースを共有することは無くなり、
安全といえば安全になりますね。
344ポイント を手に入れた。
|
|
|
|
Name: Hexereibote ..ぴよぴよ(988ポイント)
Date: 2008/10/03(金) 09:50
No:21951
|
|
Title: 自作シューティングゲームでの困っていること
|
|
すいません;
かなり前に投稿させていただいたのですが・・・
分からないことがでてきましたので、どなたか、教えていただけないでしょうか?
前回に引き続き、bulletMLは未だに実装できていません。
わかる方がいましたら、教えてください。
あと、今回は別の件で聞きたいことがあります。
現在、自作でシューティングゲームを作っているのですが、背景が2Dで画像を一枚流すという風にしています。
そこで、とあるシューティングゲーム等みたく、背景を3Dに表示に表示したいと思っています。
ですが、どうすればいいのか、わかりません;
どなたか、わかる方はいらっしゃいませんでしょうか?
わかる方がいらっしゃいましたら教えてください。
2倍のポイントを手に入れた! 622ポイント を手に入れた。
|
|
|
|
Name: 翡翠 ..入門者(4,153ポイント)
Date: 2008/10/03(金) 16:16
No:21960
|
|
Title: Re:自作シューティングゲームでの困っていること
|
|
丁度、管理人さんが使用している方法を別のスレッドで回答していたので、ここを見てみてください
背景画像について
bulletML に関しては、以前のスレッドが見つからないので……
101ポイント を手に入れた。
|
|
|
|
|
Name: Justy ..ハッカー(231,033ポイント)
Date: 2008/10/05(日) 15:27
No:22057
|
|
Title: Re:自作シューティングゲームでの困っていること
|
|
>前回に引き続き、bulletMLは未だに実装できていません
前回調べたときの感触では、ちょっと大変そうだなぁと思ってましたが。
で、どこで詰まっているのですか?
96ポイント を手に入れた。
|
|
|
|
|
Name: Hexereibote ..かけだし(1,318ポイント)
Date: 2008/10/11(土) 23:31
No:22326
|
|
Title: Re:自作シューティングゲームでの困っていること
|
|
すいません。回答が遅れてしまいました。
翡翠さん、管理人さん、Justyさん回答ありがとうございます。
背景画像について、上記のスレ、参考にさせていただきたいと思います
管理人さんのURLで間違いありません。できれば、bulletMLを利用したいと思っています。
ですが、無理なら、龍神録プログラミングの館を参考にさせて作らせていただきたいと思います。
詰っているのは、どこに、どういう風に記述すれば、実装できるというのが、まったく分からないです。
継承について勉強したりしていたのですが、糸口が掴めないという状態です。
とある、シューティングゲームというのは、『東方』のことです。
聞いてばかりで、とても申し訳ないのですが・・・
よろしくお願いします
330ポイント を手に入れた。
|
|
|
|
|
Name: Justy ..ハッカー(236,095ポイント)
Date: 2008/10/12(日) 19:50
No:22355
|
|
Title: Re:自作シューティングゲームでの困っていること
|
|
>無理なら、龍神録プログラミングの館を参考にさせて作らせていただきたいと思います
無理とは言いませんが、データ管理を丸ごとユーザーに投げているので
自由度が高い反面、初心者には難しくなっています。
どちらかというと、ある程度ゲームが作れる人が弾・敵制御を簡単に定義するための
ツールという位置づけな感じがします。
Hexereiboteさんが、C++を始めたばかりだったり、龍神録プログラミングの館を参考にしないと
ゲームが作れない状態だとするならば、一端 bulletMLは忘れて館なり書籍などを
参考にして使ってシューティングゲームを作った方がいいのではないでしょうか。
その上で、bulletMLを導入すれば効率的にもいいのではないでしょうか。
>できれば、bulletMLを利用したいと思っています。
>詰っているのは、どこに、どういう風に記述すれば、実装できるというのが、まったく分からないです。
>継承について勉強したりしていたのですが、糸口が掴めないという状態です
それでもやっぱり、bulletMLをやりたいということでしたら、以下をお読み下さい。
一応、試しに半日ほどサンプルを作って BulletMLで遊んでみました。
なるほどたしかに、これは面白いですね。使いたくなるのもわかります。
このサンプルのプロジェクト(MSVC9.0/VisualStudio2008)一式をアップしておきました。
(libbulletMLも少しカスタマイズされていますので、ご注意を)
何かの参考にして下さい。
ttp://tikuwa.net/file/up5665.zip.html
DLKey:alskdjfhg
といっても、何分さわり始めたばかりで、私自身まだよくわかっていないところも多々あり、
どこか実装に間違いがあるかもしれませんし、あまり効率的な書き方にはなっていないので、
流用には向きません。
無条件にこのコードを信用しないであくまで参考、ということで。
629ポイント を手に入れた。
|
|
|
|
|
Name: Hexereibote ..かけだし(1,440ポイント)
Date: 2008/10/13(月) 01:24
No:22396
|
|
Title: 自作シューティングゲームでの困っていること
|
|
Justyさん、回答ありがとうございます。
半日もの時間を費やしていただいてありがとうございます。
Justyさんの回答を参考にして、今後のゲーム製作に生かして製作していきたいと思います。
実装できるように、頑張りたいと思います。
122ポイント を手に入れた。
|
|
|
|
Name: 大工 ..プログラマー(30,956ポイント)
Date: 2008/10/12(日) 23:54
No:22379
| 解決!
|
Title: 継承について
|
|
質問内容が違うので新しいトピを立てさせていただきます.
test2 の引数ありコンストラクタでオブジェクトを生成すると test1 のデフォルトコンストラクタが起動しますが,下記のように動的割り当てを行っている場合,損をしていますよね?(多分・・・・環境にもよるんでしょうが・・・100 個の配列を用意してもtest2で50 個の配列を新しく指すようにしているので100個の配列分の領域が残ってるから・・・・・
この損を無くして,うまく制御するというか・・・test2のオブジェクトの生成時に意図的にtest1のデフォルトコンストラクタを起動させないような感じの仕組みはありますか?やはり,test2の引数ありコンストラクタでdeleteを行うしか手はないのでしょうか?
#include<iostream>
class test1 {
protected:
int* data;
int i;
int j;
public:
test1() : i(0), j(2) {data = new int[100];}
};
class test2 : public test1 {
private:
int x, y;
public:
test2() : x(0), y(2) {}
test2(int sz) {data = new int[sz];}
};
int main(void) {
test2 ts2(50);
return 0;
}
2倍のポイントを手に入れた! 662ポイント を手に入れた。
|
|
|
|
Name: Justy ..ハッカー(240,086ポイント)
Date: 2008/10/13(月) 00:10
No:22381
|
|
Title: Re:継承について
|
|
test1の別のコンストラクタを用意して、そっちを使えばいいかと思います。
例えば、こんなかんじで。
class test1 {
protected:
int* data;
int i;
int j;
public:
test1() : i(0), j(2) {data = new int[100];}
test1(int sz) : i(0), j(2) {data = new int[sz];}
};
class test2 : public test1 {
private:
int x, y;
public:
test2() : x(0), y(2) {}
test2(int sz): test1(sz) {}
};
基底クラスのメンバは基底クラスに任せるのが一番かと。
377ポイント を手に入れた。
|
|
|
|
|
Name: 大工 ..プログラマー(31,083ポイント)
Date: 2008/10/13(月) 00:31
No:22385
|
|
Title: Re:継承について
|
|
なるほど!そんな書き方があったんですね!
test2() : x(0), y(2) {}<-ですが,test2() : x(0), y(2), i(0){} とすると
test.cpp: In constructor ‘test2::test2()’:
test.cpp:24: error: class ‘test2’ does not have any field named ‘i’
とエラーが出ました.
なぜでしょうか?ちゃんと継承しているはずなのに・・・・・・
95ポイント を手に入れた。
|
|
|
|
|
Name: Justy ..ハッカー(240,381ポイント)
Date: 2008/10/13(月) 00:38
No:22389
|
|
Title: Re:継承について
|
|
いや、test2のメンバに iはないので、コンストラクタの初期化子では初期化できません。
test2()のコンストラクタの中で任意の値で test1の iを初期化したいのなら
test1のコンストラクタの引数として値を渡して test1に初期化してもらうか、
test2のコンストラクタの {} 内で初期化するしかないです。
2倍のポイントを手に入れた! 214ポイント を手に入れた。
|
|
|
|
Name: 初心者 ..初心者(8,258ポイント)
Date: 2008/10/11(土) 21:28
No:22309
|
|
Title: 再帰についてです
|
|
何枚かの切手があるときに, 切手の金額の合計がちょうど与えられた金額になる組合せを求めるプログラムを作成する. このプログラムはまず目標の金額を入力した後, 切手1の金額と最大枚数, 切手2の金額と最大枚数, ... , 切手nの金額と最大枚数を入力する. 切手の金額として0 を入力すると終了とする. その後, 入力した切手の金額と最大枚数の範囲内で目標金額と等しくなる組合せを1つ出力する
この問題なんですけど再帰でのやり方が思いつきません。どなたかヒントをくれないでしょうか?
177ポイント を手に入れた。
|
|
|
|
Name: box ..ハッカー(127,003ポイント)
Date: 2008/10/11(土) 21:40
No:22310
|
|
Title: Re:再帰についてです
|
|
本題にいく前に、前提条件を整理しておきます。
切手は何種類ありますか?
切手の金額と最大枚数の積和が、そもそも希望金額に達しない場合、どうしますか?
切手の金額と最大枚数の積和は希望金額以上であるが、ちょうど希望金額になる組み合わせがない場合、
どうしますか?
34ポイント を手に入れた。
|
|
|
|
|
Name: 初心者 ..初心者(8,376ポイント)
Date: 2008/10/11(土) 21:52
No:22311
|
|
Title: Re:再帰についてです
|
|
1、切手の種類は自分で決められます。
2、達しない場合解なしとします。
3、その場合は解なしとします。
ちょうど希望金額の同じになった時だけその組み合わせを出力したいのです。
私的にはn重ループを再帰で書き換えると思うのですがわかりません。
118ポイント を手に入れた。
|
|
|
|
|
Name: box ..ハッカー(127,077ポイント)
Date: 2008/10/11(土) 21:55
No:22312
|
|
Title: Re:再帰についてです
|
|
> n重ループを再帰で書き換える
では、手始めにn重ループで実装してみてはいかがでしょうか。
実装したコードをながめているうちに、ループから再帰へ
どう変化させればよいかが見えてくるかもしれません。
74ポイント を手に入れた。
|
|
|
|
|
Name: 初心者 ..初心者(8,417ポイント)
Date: 2008/10/11(土) 22:04
No:22313
|
|
Title: Re:再帰についてです
|
|
すいません
ずっと考えているのですが、どうにもアルゴリズムがおもいつきません(泣
41ポイント を手に入れた。
|
|
|
|
|
Name: box ..ハッカー(127,003ポイント)
Date: 2008/10/11(土) 23:12
No:22322
|
|
Title: Re:再帰についてです
|
|
具体的な例題から一般化するとよいかもしれません。例えば、
1円切手9枚、10円切手8枚、100円切手7枚があるとします。
合計が543円になる組み合わせは、何でしょうか。また、
その組み合わせを手で求める際、どういう手順を踏んだでしょうか。
74ポイント を落としてしまった。
|
|
|
|
|
Name: 初心者 ..初心者(8,460ポイント)
Date: 2008/10/11(土) 23:31
No:22325
|
|
Title: Re:再帰についてです
|
|
1円切手3枚、10円切手4枚、100円切手5枚ですね
大きいほうから決めていきました。
32ポイント を手に入れた。
|
|
|
|
|
Name: 初心者 ..初心者(8,512ポイント)
Date: 2008/10/11(土) 23:59
No:22328
|
|
Title: Re:再帰についてです
|
|
for
金額を超えないまでたす。
if(まだ足せそうだったらn-1で再帰)
else if(あったら出力)
else if(超えてしまったら最初からやり直し)
こんな感じだと思うのですが分かりません
52ポイント を手に入れた。
|
|
|
|
|
Name: lbfuvab ..初心者(5,240ポイント)
Date: 2008/10/12(日) 00:01
No:22330
|
|
Title: Re:再帰についてです
|
|
再帰についてですが
int saiki(int depth,int NowMoney);//depthは呼び出しの深さ(0から始まりn-1が最終) NowMoneyは呼び出された時点での合計額
でいけると思いますよ。
関数内での処理は
(SUCCESS,FAILUREは定数でNumStanpは枚数を保存する配列)
@ depthがnを超えたら失敗(return FAILURE;)
A 枚数を1枚ずつ増やしていき・・・
Ba 合計額が目標金額を超えたら失敗。(return FAILURE;)
Bb 合計額が目標金額と同じなら成功。その時の枚数をNumStanp[depth]に登録
Bc 合計額が目標金額より少ないならもう一度saikiを呼び、SUCCESSが帰ってきたら枚数をNumStanp[depth]に保存。
でいけると思います。
69ポイント を手に入れた。
|
|
|
|
|
Name: 初心者 ..初心者(8,510ポイント)
Date: 2008/10/12(日) 08:24
No:22335
|
|
Title: Re:再帰についてです
|
|
これって深さ優先探索ですよね?
おおまかにプログラムを書いてくれませんか?
27ポイント を落としてしまった。
|
|
|
|
|
Name: 初心者 ..初心者(8,829ポイント)
Date: 2008/10/12(日) 10:17
No:22338
|
|
Title: Re:再帰についてです
|
|
#include<stdio.h>
void kitte(int , int,int );
int sum, s[100]={0}, k[100]={0};
int main(void)
{
int i=0,gk=0;
fprintf(stderr,"合計金額>>>");
scanf("%d", &sum);
while(1)
{
fprintf(stderr,"切手の金額と最大枚数を入力せよ>>>");
scanf("%d %d",&s[i],&k[i]);
if(k[i]==0)
{
break;
}
i++;
}
kitte(i+1,0,gk);
return 0;
}
void kitte(int c,int d ,int gk)
{
int i,j;
int h[100]={0};
if(c<=d)
{
printf("NO\n");
}
else {
for(i=0;i<=k[d];i++)
{
gk+=i*s[d];
if(sum-gk<0)
{
gk-=i*s[d];
}
else if(sum-gk==0)
{
h[d]=i;
for(j=0;j<c;j++)
{
printf("%d切手%d枚\n",s[j],h[j]);
}
}
else
{
kitte(c,d+1,gk);
h[d]=i;
gk-=i*s[d];
}
}
}
}
ここから分かりません
304ポイント を手に入れた。
|
|
|
|
Name: イチ ..ぴよぴよ(635ポイント)
Date: 2008/10/11(土) 19:33
No:22304
|
|
Title: VisualStdioの使い方が・・・o(TヘTo) くぅ
|
|
すみません。初歩的な質問なのですがvisualstdio2005について。
私はデスクトップ上にC++というフォルダを置いて、そこでプログラミングをしたいと思ってるのですが、
まず、以下の通りにDXライブラリを使うための設定を行いました。
http://homepage2.nifty.com/natupaji/DxLib/dxuse_vc2005.html
ここで作成したtestプロジェクトを雛形に考え、名前を変えて保存し、他のプログラムを動かそうと思ったのですが、cppを書き換えると雛形であるtestプロジェクトのファイルまで書き換わってしまいます。
どうしたらいいでしょうか?
それと、DXライブラリ中のサンプルプログラムに保存している画像を表示させようと思っても、画像が表示されません。どうしてでしょうか?
ご返答お願いします。
324ポイント を手に入れた。
|
|
|
|
Name: 管理人 ..伝説なるハッカー(815,363ポイント)
Date: 2008/10/11(土) 22:26
No:22317
|
|
Title: Re:VisualStdioの使い方が・・・o(TヘTo) くぅ
|
|
cppを書き換えると雛形であるプロジェクトのファイルまで書き換わると言う意味がよくわからないです。
ゲームプログラミングの館の画像を表示するプログラムと、それが表示されない場合のプログラムを試してみてはいかがでしょうか?
61ポイント を落としてしまった。
|
|
|
|
|
Name: Justy ..ハッカー(233,681ポイント)
Date: 2008/10/11(土) 23:25
No:22324
|
|
Title: Re:VisualStdioの使い方が・・・o(TヘTo) くぅ
|
|
>ここで作成したtestプロジェクトを雛形に考え、名前を変えて保存し
これは、ひょっとして VisualStudio上から「名前を付けてXXXを保存」を選択して保存した、
ということでしょうか?
もしそうであるなら。
それを行ったとき、プロジェクトに対して行いましたか? それともソリューションに対し行いましたか?
このコマンドはプロジェクトファイル、或いはソリューションファイルの複製を作りますが、
プロジェクトを保存したときは既存のソリューションファイルのプロジェクトへのパスが新し保存されたファイルに、
ソリューションを保存したときは新しく保存されたソリューションファイル内のプロジェクトへのパスが
既存のプロジェクトへのパスに書き換えられるだけです。
VisualStudio2005では1つのソリューションファイルと1つ以上のプロジェクトファイルを
セットで扱いますので、このように片方だけの複製では登録されている cppファイルなどは
元のプロジェクトをそのまま参照しており、複製を作ったと思っても結局オリジナルの方を
参照していると考えられます。
>どうしたらいいでしょうか?
ひな形のソリューションファイルとプロジェクトファイル一式を
そのまま Windowsのエクスプローラ上でコピーペースとするのが手っ取り早いかと。
(ホントは同一 GUIDになってしまうので、そこを書き換える必要があるのですが、
ほとんどの人は気にしなくていいはず・・・)
188ポイント を手に入れた。
|
|
|
|
|
Name: イチ ..ぴよぴよ(812ポイント)
Date: 2008/10/12(日) 16:11
No:22349
|
|
Title: Re:VisualStdioの使い方が・・・o(TヘTo) くぅ
|
|
ご返答ありがとうございます。♪♪(●^∀^●)♪♪
わたしはソリューションを選択して名前を変えて保存しました。
>ひな形のソリューションファイルとプロジェクトファイル一式を
>そのまま Windowsのエクスプローラ上でコピーペースとするのが手っ取り早いかと。
この場合、ソリューションファイルとプロジェクトファイル一式の名前を変えないといけないですか?
177ポイント を手に入れた。
|
|
|
|
|
Name: Justy ..ハッカー(235,466ポイント)
Date: 2008/10/12(日) 16:24
No:22350
|
|
Title: Re:VisualStdioの使い方が・・・o(TヘTo) くぅ
|
|
>この場合、ソリューションファイルとプロジェクトファイル一式の
>名前を変えないといけないですか?
変えなくてもいいのであればそのままでも構いません。
変えたいのであれば変えて下さい。
ただ、vsprojファイル名の名前を変えた場合は、slnファイル内の vcprojファイルへのパスも
書き換える必要がありますので、テキストエディタで slnファイルを開いて
書き換えて下さい。
37ポイント を落としてしまった。
|
|
|
|
Name: kazuoni ..プログラマー(32,365ポイント)
Date: 2008/10/12(日) 09:25
No:22337
|
|
Title: 長押しの実現
|
|
お邪魔します。
題名の通り、ボタン長押しの実現をどうするのが一番よいかというのが質問です。
例としては携帯電話のメールの文削除の時を思い浮かべてもらうのがわかりやすいです。
あるキーを押すと関数Aを実行するのですが(携帯のメールでいう一文字削除)
そのキーを押し続けると関数Bを実行する(携帯のメールでいう全文削除)
というのを実装したいのですが、
以下の二つが思いつきました。
1、while内でカウンターが作動し続ける
while(ボタン押し続けられている間)
{
if(i>=ある整数)
{
B();
break;
}
++i;
}
A();
2、timeを取り、減算
time1=time(NULL);
while(1)
if(ボタンが離されたら)
break;
time2=time(NULL);
if(difftime(time2,time1)>=ある時間)
B();
else
A();
1で実行したところ、iがものすごい大きい数になりました。
長押しをしたつもりでなくてもiは大きかったです。
これはちょっと危険な感じがしたので2を作りました。
(1では関数Bの後に関数A()に入っていますが、気にしないでください。)
2はうまく実行できているのですが
あまりtime自体使ったことがないので
2が効率がいいのかどうなのかよくわかりません。
もっと良い書き方はあるのでしょうか?
timeを使わないとか・・・。(かつ安全)
初歩的な質問で申し訳ありません。
よろしくお願いします。
455ポイント を手に入れた。
|
|
|
|
Name: kazuoni ..プログラマー(32,395ポイント)
Date: 2008/10/12(日) 11:45
No:22342
|
|
Title: Re:長押しの実現
|
|
申し訳ありません。
DXライブラリを使用を前提としていました。。
1、でiが大きいということですが、
例えば2秒押し続けたら関数Bを実行するとなると
i>=6000000
ぐらいでした。
・・・これって思いっきり処理系依存ですよね^^;
・・・1はなかったことにしてください^^;
30ポイント を手に入れた。
|
|
|
|
|
Name: Justy ..ハッカー(235,503ポイント)
Date: 2008/10/12(日) 11:48
No:22344
|
|
Title: Re:長押しの実現
|
|
>もっと良い書き方はあるのでしょうか?
どういう環境で何を押していて、どういうプログラムの中でそれをしようとしているのかなど
状況がよくわからないので、どちらがいいということは言えません。
ひょっとしたら別の第3、第4の方がいいこともあります。
押した長さがX秒とかX分とかで判定する必要があるなら、2です。
でもそうでなくある程度長く押されていたら、というなら1になります。
ただ仰るように1の場合はこのままでは凄い勢いで iが
カウントされていくていくので適当に1秒間に15〜60回くらい間隔で
ボタンの押下状況をチェックするように調整する必要がありますし、
2の方はボタンを離さないと Aや Bが実行されないので、携帯電話とは挙動が
異なります。
ただどちらにしても、1も2も今のような構造ですと、ボタンの押下チェック以外の
処理がしづらいような気がしますが・・・。
私が書くなら、以下のような関数を作って、それを定期的に(適度な回数)呼びます。
void XXXXXXXXXXXXXXXXXXX(Work *work)
{
// まだ押されていなくて、
if(!work->keyOnA)
{
// Aボタンが押された瞬間(前回は押されていない)ならフラグを立てる
if(PressKey(BUTTON_A))
{
work->keyOnA = true;
work->keyOnACount = 0;
}
}
else
{
// Aボタンが離された瞬間(前回は押されていた)ならフラグを解除
if(!ReleaseKey(BUTTON_A))
work->keyOnA = false;
// カウントが小さい状態でキーが離されたのならAを実行
// 一定時間押しっぱなしにしていたら Bを実行
if(work->keyOnACount < LIMIT_COUNT) // 短
{
if(!work->keyOnA)
{
A();
work->keyOnA = false;
}
}
else // 長
{
B();
work->keyOnA = false;
}
]
}
work->keyOnACountは普通に ++しているだけなので、kazuoniさんのいう「1」ですが
秒やミリ秒単位で見る必要があれば、「2」の方の timeだったり
ハードウェアが持つ高精度タイマーの値にします。
2倍のポイントを手に入れた! 1,822ポイント を手に入れた。
|
|
|
|
|
Name: kazuoni ..プログラマー(32,498ポイント)
Date: 2008/10/12(日) 14:53
No:22346
|
|
Title: Re:長押しの実現
|
|
Justyさんご回答ありがとうございます。
詳細を記入せず、分かりづらい質問で大変申し訳ありませんでした。
せっかく作っていただいたのですが
C言語+DXライブラリ
のみの知識しかないので注釈中心に参考にさせていただきました。
実際は時間は全く関係なく、「ある程度長く押されたら」です。
今回の長押しはサブルーチン化はしておらず、mainに直接書いています。
キー監査はGetHitKeyStateAll_2で行っています。
( 参考:http://l.huu.cc/g/#40 )
Justyさんの作られた関数XXXXXXXXXXXXXXXXXXXは
管理人さんの作られた関数GetHitKeyStateAll_2
に似ていると解釈しました。(違っていたら申し訳ありません。。)
なので以下のようにしてみました。
if(Key[ボタン番号]==1 || flag==1)
{
flag=1;
if(Key[ボタン番号]>=100)
{
B();
flag=0;
}
else if(Key[ボタン番号]==0)
{
A();
flag=0;
}
}
初期条件でflag=0です。
こうすると携帯電話のメールの文字削除ようなことはできました。
直線的な書き方しかできなくてこれが限界でした。。
79ポイント を手に入れた。
|
|
|
|
Name: SH ..ぴよぴよ(14ポイント)
Date: 2008/10/11(土) 19:30
No:22303
|
|
Title: 龍神録13章について
|
|
C言語を始めてまだ二週間の未熟者でプログラミング講座を一通り見ながら
それを手動で打ち込んでいく作業をしていたのですが、龍神録プログラミング13章で詰まりました。
shot.cppの中で、
・shotが定義されていない識別子
・flagの左側はクラス、構造体、共用体でなければならない
・kndの左側はクラス、構造体、共用体でなければならない
・SHOT_KND_MAXが定義されていない識別子
・shot_bulletが定義されていない識別子
だとエラーが出て、
music.cppの中でも同様に
se_flag、SE_MAXが定義されていないと言われました。
龍神録プログラミングの過去のサンプルや追加すべき構造体etcも全て見たのですが、
自分が見た限りでもSHOT_KND_MAXなどは定義されていないような気がします。
実行結果のようにするためにはどうすればよいのでしょうか?
14ポイント を手に入れた。
|
|
|
|
Name: array [URL] ..プログラマー(33,341ポイント)
Date: 2008/10/11(土) 19:52
No:22305
|
|
Title: Re:龍神録13章について
|
|
この章は変更点が多いらしく、同梱されているプロジェクトと見比べながら
変更していく必要があるみたいです。
プロジェクト一括ダウンロードから13章のプロジェクトを開き
[Ctrl]+[F]などを活用しエラーを修正する力を身につければ自分の為になるかもしれません。
C言語を始めてまだ二週間との事なので、エラーの意味も分からないかもしれませが
その時は、また質問してもらえれば良いと思います。
179ポイント を手に入れた。
|
|
|
|
|
Name: SH ..ぴよぴよ(139ポイント)
Date: 2008/10/11(土) 20:12
No:22306
|
|
Title: Re:龍神録13章について
|
|
arrayさんありがとうございます。
頑張って修正したいと思います…。
ここで追加で質問するのはどうかと思うのですが、
コンパイルのたびに
「cl : コマンド ライン warning D9035 : オプション 'Wp64' の使用は現在推奨されていません。今後のバージョンからは削除されます。」と警告が出ます。
Visual C++2008はこのサイトからダウンロードしたものですが、インストールに失敗でもしたのでしょうか・・?
125ポイント を手に入れた。
|
|
|
|
|
Name: SH ..ぴよぴよ(160ポイント)
Date: 2008/10/12(日) 10:34
No:22339
| 解決!
|
Title: Re:龍神録13章について
|
|
解決しました。
ありがとうございました。
21ポイント を手に入れた。
|
|
|
|
Name: array [URL] ..プログラマー(30,459ポイント)
Date: 2008/10/07(火) 18:12
No:22124
|
|
Title: ホームページ作ってみました
|
|
ゲームプログラミングの息抜きにホームページ作ってみました。
基本、個人的な趣味のサイトです。
http://sinkai.net/
約3週間くらい前に公開して、管理人さんに見てもらったのですが
フレーム構成は懸念がある・・・と言われたので、全体的にPHPで作り直してみました。
一応ここに関係ある内容で作りたかったので、「龍神録の支館」とかいうのを公開しています。
暇な時にでも遊びに来て下さい(^^ゞ
87ポイント を手に入れた。
|
|
|
|
Name: Mist ..プログラマー(26,495ポイント)
Date: 2008/10/07(火) 18:25
No:22125
|
|
Title: Re:ホームーページ作ってみました
|
|
拝見させていただきました。
全体的によくまとまったきれいなHPですね。
背景色を黒白切り替えられるのは面白かったですけど、白にすると明るすぎて目がチカチカします(X-X;
余談
TOPページの手紙はやめたほうがいいと思います。
経験上、迷惑メールがたくさんくるようになります。
本家のTOPページの一番下にある管理人さんのメールアドレスも、かなり昔はmailtoしていましたが
迷惑メールが山ほど届くので今のような表記に変わったと記憶しています。
198ポイント を手に入れた。
|
|
|
|
|
Name: toyo ..上級者(19,224ポイント)
Date: 2008/10/07(火) 19:02
No:22126
|
|
Title: Re:ホームーページ作ってみました
|
|
ソースを見たら(すぐ見たがる)手紙の部分はメールアドレスに見えないように工夫はしてありますね
でもプロフィールの連絡先はうちのFirefoxのアドオン(Linkification)は拾ってましたよ
53ポイント を手に入れた。
|
|
|
|
|
Name: array [URL] ..プログラマー(30,815ポイント)
Date: 2008/10/07(火) 19:19
No:22127
|
|
Title: Re:ホームーページ作ってみました
|
|
Mistさん、toyoさん、訪問ありがとうございます♪
>全体的によくまとまったきれいなHPですね。
>背景色を黒白切り替えられるのは面白かったですけど、白にすると明るすぎて目がチカチカします(X-X;
切り替えは、そういうのを公開してるサイトがあったので使わせてもらいました。
画面は友達もチカチカするって言ってましたが 切り替えれてちょうど良いですかね。
ちなみに私は白が好きです。
>TOPページの手紙はやめたほうがいいと思います。
toyoさんの言うとおり一応ソース上の@やmailtoをコード表記にして、対策を取ったつもりですが・・・それでも来るようなら。また対策を考えてみます。
>toyoさん
Firefoxで観覧するとデザインが崩れてると思うので、調べてみて直せそうだったら直します。
356ポイント を手に入れた。
|
|
|
|
|
Name: たかぎ [URL] ..熟練のプログラマー(61,394ポイント)
Date: 2008/10/07(火) 22:22
No:22128
|
|
Title: Re:ホームーページ作ってみました
|
|
> >TOPページの手紙はやめたほうがいいと思います。
> toyoさんの言うとおり一応ソース上の@やmailtoをコード表記にして、対策を取ったつもりですが・・・それでも来るようなら。また対策を考えてみます。
最近はスパムメールの数百通ぐらい何とも思わなくなりました。
今ぐらいの対策で十分だと思いますよ。
それ以上となると、メールフォームを設置するぐらいかと思います。
# 私のところへは、メールフォーム経由でも結構スパムが来ますが...
サイトの管理者に連絡がつけにくいといろいろ不都合もあるので、必要以上にガードしないというのも一つの選択肢です。
162ポイント を手に入れた。
|
|
|
|
|
Name: J ..中級者(11,546ポイント)
Date: 2008/10/07(火) 22:49
No:22130
|
|
Title: Re:ホームーページ作ってみました
|
|
見ましたよ〜
サイト開設おめでとうございます。
ところで、Firefox3.03とIE6で検証してみました。(なんでIE6なんですかって?新しいPCに変えたから、更新・設定がまだなんです(汗
FFだとフィルター(かな?)が適用されていませんでした。「ようこそ」のあれです。
まあIE以外は基本的にフィルターとかには弱いので(独自すぎる)見栄えをよっぽど気にするようならばやめた方がいいかもしれませんね。
メニューなんかも崩れていましたし、スクロールバーの色も適用されていませんでした。
うう〜こうみるとFF使いは結構デザインで損してるかも。。
IEの独自機能が広まらないことを祈るばかりですねFF使いには。
>スパムメール
私のYahooメールには毎月3000件を超す迷惑メールが届きます。私が自分でネットにバラまきまくっていますからね(汗)。迷惑メールフィルターは中々優秀ですし、捨てアドなので痛くも痒くもありませんが。
むしろ迷惑メールの数を見て楽しんでいる方です(笑
因みに、ezxweb@yahoo.co.jpです(爆
404ポイント を手に入れた。
|
|
|
|
|
Name: array [URL] ..プログラマー(31,220ポイント)
Date: 2008/10/07(火) 23:55
No:22131
|
|
Title: Re:ホームーページ作ってみました
|
|
たかぎさん、Jさん、訪問ありがとうございます〜
>サイトの管理者に連絡がつけにくいといろいろ不都合もあるので、必要以上にガードしないというのも一つの選択肢です。
確かに、連絡を取りたいと思っても、連絡が取れない状態だと、嫌ですよね。
実は、公開してるアドレスはニックネームアドレス(?)というやつで、実際の宛先は別になってます。
こっちが返信したら本当のアドレスが相手には分かるようになってるので、迷惑メールが増えたらニックネームアドレスを変えようかと思ってます。
まあ私もフリーメールでは月3000件とまでは言いませんけど、痛い目をみてるので、ここまでの対策は取ってみました。
>Firefox3.03とIE6で検証してみました。
検証ありがとうございます♪
私も、Firefoxなど多種ブラウザがインストールされてるので検証とまでは言いませんが見比べてみました。
そしたら、やっぱりFirefoxだけが懸念でした。
色々調べた結果、どうもスタイルシートの書き方でIEでは良くてもFirefoxじゃダメ!ってのがあるみたいです。
なのでFirefox、IE、共に同等の処理をしてくれるのは無いかと探しています。
まあ、フィルターに関しては、どうしようもなさそうですねw(素直に画像を加工した方が良さそうです)
あと、私が思うに、今のコンテンツ内容だとリピータは、ほぼ期待できないと思ってるので、支館更新、及び新コンテンツを考えてみます。
暇な時に、ふと思い出したら、また覗きに来て下さい(^^)
405ポイント を手に入れた。
|
|
|
|
|
Name: たかぎ [URL] ..熟練のプログラマー(61,493ポイント)
Date: 2008/10/08(水) 01:38
No:22133
|
|
Title: Re:ホームーページ作ってみました
|
|
一応ウェブ制作業者でもあるので...
うちの場合は、最初にFireFoxやSafariで確認して、後からIE6に対応する手順を取っています。
FireFoxで正常に表示されれば、OperaやSafariなどを使っても大体うまくいきます。
IE6だけが曲者でいつも悩まされますが、複数サイトのアクセス解析を見ていると、最近はかなりIE6も減ってきているので、切り捨てられるのも時間の問題のように思います。
クロスブラウザの確認を行うときは、
http://browsershots.org/
が便利ですので、一度試してみてください。
99ポイント を手に入れた。
|
|
|
|
|
Name: たかぎ [URL] ..熟練のプログラマー(61,771ポイント)
Date: 2008/10/08(水) 01:50
No:22134
|
|
Title: Re:ホームーページ作ってみました
|
|
連続投稿ですみません。
今回フィルタがIE以外でうまく機能しないことが問題になったわけですが、ウェブサイトをうまく作るコツは、余計なことをしないことです。
フィルタのような特殊なスタイル以外にも、JavaScriptやらFlashやらと、ちょっとかじった技術は使ってみたくなるのが人情ですが、そうしたテクニックを意図的に使わないのも技術力のうちです。
見た目の調整は、やりだすといくらでも時間がかかってしまいます。
それよりは、コンテンツを充実させることに注力した方が得策です。
ある程度作りこめたら、相互リンクでも貼りましょう。
そういえば、こちらのサイトにもリンクを貼っていませんでした。
よければ相互リンクでもしませんか? > 管理人さん
278ポイント を手に入れた。
|
|
|
|
|
Name: カノン ..ぴよぴよ(193ポイント)
Date: 2008/10/08(水) 05:01
No:22135
|
|
Title: Re:ホームーページ作ってみました
|
|
皆さんサイト作るの上手ですね。
私なんてサイト作るのに、一週間で作れるホームページとか30分で分かるホームページの仕組みとか
見たあげく全然分かりませんでした。
友達に教えてもらったら1日で作れたという悲しい結果になったな。
91ポイント を手に入れた。
|
|
|
|
|
Name: array ..プログラマー(32,083ポイント)
Date: 2008/10/08(水) 07:17
No:22137
|
|
Title: Re:ホームーページ作ってみました
|
|
>うちの場合は、最初にFireFoxやSafariで確認して、後からIE6に対応する手順を取っています。
確かに、最初にFireFoxで確認しながら作るべきでしたね。
>ちょっとかじった技術は使ってみたくなるのが人情ですが、そうしたテクニックを意図的に使わないのも技術力のうちです。
その通りだと思います。しかし、そう言われると、私の知識全部がそんな感じなのですが・・・スタイルシートなんかは、他のホームページソースをみて、こんな感じに使えば良いのかな程度なので、そろそろ参考書を買って、もう少しデザインを作り込んでみます。
>クロスブラウザの確認を行うときは、
>http://browsershots.org/
>が便利ですので、一度試してみてください。
パッと見使い方がよく分かりませんでしたが、利用させてもらいます。
>カノンさん
アクセスありがとうございます^^
>私なんてサイト作るのに、一週間で作れるホームページとか30分で分かるホームページの仕組みとか
>見たあげく全然分かりませんでした。
私も、ホームページの仕組みなんていまだに全く知りませんよ(笑)
作り方に関しても。当時、拡張子すら知らなかったので拡張子をhtmlで保存。と説明されても、笑えるくらい、分かりませんでした。
そこが分かっても、タグ?ソース?と分からない事だらけで・・・ただ、そこが分かるようになってくるとホームぺジ作りも楽しくなってきました。
359ポイント を手に入れた。
|
|
|
|
|
Name: 御津凪 [URL] ..上級者(22,354ポイント)
Date: 2008/10/08(水) 10:58
No:22141
|
|
Title: Re:ホームーページ作ってみました
|
|
遅くなりましたが御開設おめでとうございます。
遊びに行ってきました。(一通り見ただけですが)
Webページの記述も一つの言語ですから、分かってしまえばすらすらと書けますね。
クロスブラウザの確認に上記URLを自分のサイトで確かめてみました。
どうやら各種OS・ブラウザでの表示をスクリーンショットでチェックできるもののようですね。
私のところではアクセスカウンターが右に行ったり左に行ったりしてました。
見る分にはまったく問題ないので放置しています^^;
ページ(サイト)を作る時はあらかじめテーマを持つと
まとまりが良くなると思いますがどうでしょう?
参考までに、私のサイトでは極力画像を使わずにデザインするのをテーマとしています。
164ポイント を手に入れた。
|
|
|
|
|
Name: array ..プログラマー(32,342ポイント)
Date: 2008/10/08(水) 19:55
No:22157
|
|
Title: Re:ホームーページ作ってみました
|
|
>遅くなりましたが御開設おめでとうございます。
ありがとうございます(^◇^)
>どうやら各種OS・ブラウザでの表示をスクリーンショットでチェックできるもののようですね。
私もやってみましたが、ひどいありさまでしたw
>ページ(サイト)を作る時はあらかじめテーマを持つと
>まとまりが良くなると思いますがどうでしょう?
実は今回PHPを使った理由で御津凪さんのHPもPHPで構成されてる感じだったので、真似てみましたというのもあります。
私も一応テーマ(スタイル)統一は意識しましたし、それと絶対に英語は使いたくないと思って作ってみました。
259ポイント を手に入れた。
|
|
|
|
|
Name: 管理人 [URL] ..伝説なるハッカー(814,728ポイント)
Date: 2008/10/08(水) 20:21
No:22160
|
|
Title: Re:ホームーページ作ってみました
|
|
遅くなりました。
HPのご解説おめでとうございます〜^^
以前拝見させて頂きましたが、もっとすっきりして見やすくなりましたね♪
しかも配色設定まで出来る親切設計!
しかも館の支館まであるとは^^
弾幕への愛を感じますw
これは負けずに本家も製作がんばらなくては!
80ポイント を手に入れた。
|
|
|
|
|
Name: array ..プログラマー(32,404ポイント)
Date: 2008/10/08(水) 21:19
No:22163
|
|
Title: Re:ホームーページ作ってみました
|
|
ありがとうございます^^
支館を作って、管理人さんの頑張りが良く分かりました。
本当に館を無償で提供して下さってる事が今さら驚きですw
これからも、陰ながら応援しているので、頑張ってください^^
バグさん有り難うーwまったく気づきませんでしたwまたスレ上がるのもあれなので修正しときました^^
↓>どうしても、タイトルの『ホームーページ』が気になってしまう(^_^;)
62ポイント を手に入れた。
|
|
|
|
|
Name: バグ ..ハッカー(115,123ポイント)
Date: 2008/10/08(水) 21:41
No:22164
|
|
Title: Re:ホームーページ作ってみました
|
|
どうしても、タイトルの『ホームーページ』が気になってしまう(^_^;)
2倍のポイントを手に入れた! 38ポイント を手に入れた。
|
|
|
|
|
Name: 管理人 [URL] ..伝説なるハッカー(814,953ポイント)
Date: 2008/10/09(木) 00:18
No:22168
|
|
Title: Re:ホームーページ作ってみました
|
|
そういえば龍神録の館も番外合わせれば50章分になりましたね。
100章位までは頑張ろうかな^^;
どうせ龍神録のコードとは違うコードなわけですから、
元のゲームより良いものを作りたいですね(ノ▽`)ノ
しかしこうしてみるとゲームの館、シューティングの館、龍神録の館、本家など
全部あわせると結構な量になりますねw
arrayさんのHPはたてたばかりなのに結構アクセスあるんですね。
期待されてますね(*^ー゜)b
135ポイント を手に入れた。
|
|
|
|
|
Name: array ..プログラマー(32,439ポイント)
Date: 2008/10/09(木) 06:11
No:22170
|
|
Title: Re:ホームーページ作ってみました
|
|
>arrayさんのHPはたてたばかりなのに結構アクセスあるんですね。
半数以上、9割はこの掲示板から来て下さってます (^_^)
ありがとうございます。
35ポイント を手に入れた。
|
|
|
|
|
Name: いけやん ..中級者(13,850ポイント)
Date: 2008/10/09(木) 09:53
No:22173
|
|
Title: Re:ホームーページ作ってみました
|
|
遅くなりました。
サイト、おめでとうございます。
トップページの画像といい、デザインといい、カッコイイですね〜。
ちょっと、自分も作ってみたいと思いました。
87ポイント を手に入れた。
|
|
|
|
|
Name: array ..プログラマー(32,473ポイント)
Date: 2008/10/09(木) 19:01
No:22196
|
|
Title: Re:ホームーページ作ってみました
|
|
いけやんさん、ありがとうございます^^
> 自分も作ってみたいと思いました。
公開したら、ぜひ訪問させてもらいます。
34ポイント を手に入れた。
|
|
|
|
|
Name: kazuoni ..プログラマー(31,030ポイント)
Date: 2008/10/09(木) 20:04
No:22200
|
|
Title: Re:ホームーページ作ってみました
|
|
自分も遅くなりました。。
解説おめでとうございます^^
なんだか奇麗な感じがしていいですね!
支館はこれから更新が楽しみですね♪(自分はシューティングは作っていませんが。。)
中学校の時HPを作る努力を必死にしてました^^;
中学の知識だったんでみようみまねで頑張ってました。
そこから箱庭みたいな多人数参加型のゲームを作りたくて
必至にCGIをがんばっていました。(っといってもただすでに作られたものをちょこちょこいじってサーバーに転送していただけですが^^;)
今でもCGI自体何なのか分かっていませんがw
まずはC言語、C++を・・・。
あ、脱線していました。
これからも管理がんばってください^^
245ポイント を手に入れた。
|
|
|
|
|
Name: array ..プログラマー(32,593ポイント)
Date: 2008/10/09(木) 21:05
No:22206
|
|
Title: Re:ホームーページ作ってみました
|
|
おお、kazuoniさんと経歴が似てる感じがするw
私も中学の時に必死で勉強してました。
それに、箱庭を知ってるだけでなんか嬉しいです。
他にもFFアドベンチャーなど本当にCGIゲームが多かったですね。
訪問ありがとうございます^^
64ポイント を手に入れた。
|
|
|
|
|
Name: kazuoni ..プログラマー(31,655ポイント)
Date: 2008/10/10(金) 02:59
No:22229
|
|
Title: Re:ホームーページ作ってみました
|
|
×解説
○開設
でした^^;
FFアドベンチャーも作りましたねー。
あとエンドレスバトルとかもですかね。
・・・ググったらまだこんなにやってるんですね。CGIゲーム。
本格的なオンラインゲームが無料でできるようになって
人気は落ちてしまっているんじゃないかと思ったんですが^^;
148ポイント を落としてしまった。
|
|
|
|
|
Name: 柏 ..中級者(10,136ポイント)
Date: 2008/10/10(金) 23:02
No:22257
|
|
Title: Re:ホームーページ作ってみました
|
|
(*゜▽゜)ノ★+☆【祝】☆+★ヾ(゜▽゜*)
大変遅いですが……ホームページ開設おめでとうございます。
すっきりしていてとてもいいデザインですね。
個人的に羽とか月の素材が好きなので、なんだか落ち着きます。
支館、いいですねぇ。ソースがオープンだとこういった広がりを魅せてくれるので、とても有益だなぁと実感しました。本館と支館で今以上に内容が充実してくると、作る方としては弾幕だけ考えて、必要な機能はコピペして実装……なんてことにもなってくるかもしれませんねw
今後の更新も是非がんばってください。
ところで、支館の内容についての質問はこちらの掲示板でしてもいいのでしょうか?
一応「自己解決で」という記述があったと思うのですが、掲示板としてこちらにリンクが貼ってあったこともあり少々気になりましたので。
もしすでにどこかに記述がありましたら申し訳ありません。
225ポイント を手に入れた。
|
|
|
|
|
Name: array [URL] ..プログラマー(32,536ポイント)
Date: 2008/10/11(土) 00:29
No:22264
|
|
Title: Re:ホームーページ作ってみました
|
|
>kazuoniさん
> 本格的なオンラインゲームが無料でできるようになって
私もオンラインゲームに流れた一人ですw
CGIゲームの人気は確実に低迷していると思います。
柏さん、situmonさん、訪問ありがとうございます^^
> 支館の内容についての質問はこちらの掲示板でしてもいいのでしょうか?
できれば、メールの方が良いと思います。というのも公式的な内容じゃないので周りから見たら何の話か全く分からない可能性もあるからです。
掲示板へリンクを張った理由は特にありませんが、こちらの掲示板に来れる入口が沢山あっても良いんじゃないかと思ったからです。もしも違った目的を持った人が流れそうな場合は迷惑がかかる前に解除しようと思ってます。
57ポイント を落としてしまった。
|
|
|
|
|
Name: 管理人 ..伝説なるハッカー(815,023ポイント)
Date: 2008/10/11(土) 09:47
No:22275
|
|
Title: Re:ホームーページ作ってみました
|
|
龍神録プログラミングの館のトップページに支館のリンク貼らせて頂きました^^
・・ところで支館変換出来ないんですが造語なんですかね?^^;
40ポイント を落としてしまった。
|
|
|
|
|
Name: array [URL] ..プログラマー(33,104ポイント)
Date: 2008/10/11(土) 11:23
No:22278
|
|
Title: Re:ホームーページ作ってみました
|
|
> 龍神録プログラミングの館のトップページに支館のリンク貼らせて頂きました^^
ありがとうございます><
館に負けないように更新頑張らないといけないですねw
> ・・ところで支館変換出来ないんですが造語なんですかね?^^;
造語です。たかぎさんの言う、「別館」や「新館」だと管理人さんの意思で設立された感じがありませんか?
館の支援という意味合いが欲しかったので「支館」ってなってます。読み方は分かりません。
一見さんでも、そんな意味合いを感じ取りやすいんじゃないでしょうか。
114ポイント を手に入れた。
|
|
|
|
|
Name: たかぎ [URL] ..熟練のプログラマー(62,093ポイント)
Date: 2008/10/11(土) 13:17
No:22279
|
|
Title: Re:ホームーページ作ってみました
|
|
あまり強く主張するつもりはないことをあらかじめお断りしておきます。
> > ・・ところで支館変換出来ないんですが造語なんですかね?^^;
> 造語です。たかぎさんの言う、「別館」や「新館」だと管理人さんの意思で設立された感じがありませんか?
それは「支館」でも大差ありませんね。
> 館の支援という意味合いが欲しかったので「支館」ってなってます。読み方は分かりません。
> 一見さんでも、そんな意味合いを感じ取りやすいんじゃないでしょうか。
「支館」の「支」は、単独では「ささえる」の意味ですが、支店や支社からの類推で、本館から枝分かれした館の印象が強いと思います。
110ポイント を手に入れた。
|
|
|
|
|
Name: array [URL] ..プログラマー(33,162ポイント)
Date: 2008/10/11(土) 13:50
No:22280
|
|
Title: Re:ホームーページ作ってみました
|
|
> それは「支館」でも大差ありませんね。
> 館から枝分かれした館の印象が強いと思います。
ちょっとショックです。まあ、私もそこまで深く考えた訳ではなく、「支館」気に入ってるので、スルーしてくれると嬉しいです。
58ポイント を手に入れた。
|
|
|
|
|
Name: 管理人 ..伝説なるハッカー(815,358ポイント)
Date: 2008/10/11(土) 13:59
No:22282
|
|
Title: Re:ホームーページ作ってみました
|
|
>たかぎさん
なるほど。理論的でわかりやすいです。
新館、別館ですね。旅館みたいですねw
>arrayさん
そうですね〜、確かにシューティングの館と龍神録の館が存在するので、
さらに他の館が存在すると、私が作っているように思う方もいらっしゃるかもしれませんね。
支館は聞いたこと無い単語だなとはおもいましたが、パッとみで意味がわかったので、
(私個人的には支援してもらってる印象を受けました)
良いのではないかと思います^^
213ポイント を手に入れた。
|
|
|
|
|
Name: array [URL] ..プログラマー(33,454ポイント)
Date: 2008/10/12(日) 00:10
No:22331
|
|
Title: Re:ホームーページ作ってみました
|
|
tkmakwins15さん訪問ありがとうございます。
私が以前、掲示板に書き込みをする前から居る方々から
こんなにコメントを頂けるとは思っていなかったのでとても嬉しいです。
これからも、頑張っていくのでよろしくお願いします。
113ポイント を手に入れた。
|
|
|
|
|
Name: カノン
Date: 2008/10/31(金) 20:25
No:221241225452352
|
|
Title: Re:ホームーページ作ってみました
|
|
arrayさん質問ですがサイトを作るのに何のソフトを使っていますか?
私はフリーのalphaEDITを使っています。
|
|
|
|
Name: トウラ ..かけだし(1,275ポイント)
Date: 2008/10/10(金) 16:49
No:22245
|
|
Title: operator[]の書き方について
|
|
C++を学び始めて、参考書を読んでいたのですがピンと来ない点があったので質問です。
#include <vector>
using namespace std;
class Hoge
{
public:
Hoge(const size_t VectorSize , const int InitValue = 0) : vi(VectorSize , InitValue) {}
const int& operator[](const size_t pos) const;
int& operator[](const size_t pos);
private:
vector<int> vi;
};
const int& Hoge::operator[](const size_t pos) const
{
return vi[pos];
}
int& Hoge::operator[](const size_t pos)
{
return const_cast<int&>(static_cast<const Hoge&>(*this)[pos]);
}
疑問点はoperator[]のstatic_cast<const Hoge&>についてです。
const_cast<int&>は、operator[]constの戻り値からconstをはずしてint&になる(間違っていたら指摘お願いします)のは
分かるのですが、static_cast<const Hoge&>のHogeをなぜ参照にするのか分かりません。
static_castの&をはずしてビルドすると
warning C4717: 'Hoge::operator[]' : すべてのコントロールのパス、関数を回帰するとランタイム スタック オーバーフローが発生します。
という警告が出る(ビルドは成功しているみたいです)のですが、こちらもよく分かりません。
どなたか説明していただけると助かります><
408ポイント を手に入れた。
|
|
|
|
Name: トウラ ..かけだし(1,319ポイント)
Date: 2008/10/10(金) 17:17
No:22246
|
|
Title: Re:operator[]の書き方について
|
|
書き忘れ
環境は
OS:Windows Vista SP1
コンパイラ:Visual C++ 2008 EE
です。
44ポイント を手に入れた。
|
|
|
|
|
Name: Justy ..ハッカー(233,493ポイント)
Date: 2008/10/11(土) 03:55
No:22271
|
|
Title: Re:operator[]の書き方について
|
|
>static_cast<const Hoge&>のHogeをなぜ参照にするのか分かりません。
参照とかポインタにしないと、一時オブジェクトの生成・・・*thisのコピーが発生するからです。
しかも、そのコピーは returnする段階で破棄されますので、このケースでは作るだけ無駄です。
その無駄を省くために参照にしているのだと思います。
143ポイント を手に入れた。
|
|
|
|
|
Name: 組木紙織 ..熟練のプログラマー(62,398ポイント)
Date: 2008/10/11(土) 06:28
No:22272
|
|
Title: Re:operator[]の書き方について
|
|
追加して、
*thisのコピーが発生した後、operator[]をそのコピーしたオブジェクトに対して適用して、
そうすると
static_cast<const Hoge>がもう一度*thisのコピーオブジェクトをコピーして、、、
と何回も無限回コピーされ続けるので、スタックがあふれるようになります。
operator()を使うときは出来るだけ参照で済ますようにしないと、上記の問題がよく起こります。
#この場合は、return vi[pos];で事足りる気がしますが、
190ポイント を手に入れた。
|
|
|
|
|
Name: トウラ ..かけだし(1,605ポイント)
Date: 2008/10/12(日) 00:00
No:22329
| 解決!
|
Title: Re:operator[]の書き方について
|
|
Justyさん、組木紙織さん
解説していただきありがとうございます。
static_cast<const Hoge>にすると一時オブジェクトの生成、*thisをコピーのループになる
というのは分かりました。
私の勝手な解釈で、キャストすれば自身が変換されるものだと思っていました。
あと、参照をはずし(めちゃくちゃですが)仮にスタックオーバーフローが起きなくても
operator[]の戻り値であるint&は何も指していないので、この書き方ではダメ。ってなるでしょうか?
しかし、自身を変換させる書き方(?)を初めて見るので、しっかり流れを追ってみようと思います。
ひとまず解決マークを付けておきます。
286ポイント を手に入れた。
|
|
|
|
|
Name: situmon ..入門者(4,070ポイント)
Date: 2008/10/10(金) 22:51
No:22255
|
|
Title: Re:bgm
|
|
龍神録のプログラムをシューティングの館のコードでやるとどうなるのでしょう。
龍神録のコードはたくさんあるのでどのコードがシューティングの館のこのコードに当てはまるのかわからないのです。
56ポイント を手に入れた。
|
|
|
|
|
Name: array ..プログラマー(32,990ポイント)
Date: 2008/10/11(土) 01:06
No:22267
|
|
Title: Re:bgm
|
|
詳しく読んでいませんが48章の事だと思います。
DXライブラリ関数なんかはシューティングの館でもそのまま使えますし、使えないコードというのも、宣言していない変数がある程度だと思います。
簡単に(かつ単純でいいなら)書くなら
DXライブラリの基本で、十分だと思います。
/* ExternGV.h */
適当な位置に追加
//音声ファイルハンドル
extern int sound_bgm[2];
extern int sound_player_shot[2];
extern int sound_enemy_shot[2];
/* img_sound_load.cpp */
void img_sound_load()内に追加
//音楽ハンドル取得
sound_bgm[0] = LoadSoundMem("音楽ファイル(BGM)");
sound_player_shot[0] = LoadSoundMem("Sh/sound/Player/shot.ogg");
sound_enemy_shot[0] = LoadSoundMem("Sh/sound/enemy/normalshot.ogg");
/* main.cpp */
WINAPI WinMain()内に追加
while(ProcessMessage() == 0 && GetHitKeyStateAll(Key) == 0){
RefreshTime = GetNowCount(); //今の時間を取得
ClearDrawScreen(); //裏画面のデータを全て削除
if(CheckSoundMem(sound_bgm[0])==0)
PlaySoundMem(sound_bgm[0],DX_PLAYTYPE_BACK);
Background();
一応DXライブラリの基本的な関数を最小限で考えてみたのですが、どうでしょうか。(開始と同時に流れます。)
赤が追加部分。青がDXライブラリ関数になっています。
関数仕様については本家に書いてあります。
454ポイント を手に入れた。
|
|
|
|
Name: しょしょしょしんしゃ ..ぴよぴよ(326ポイント)
Date: 2008/10/10(金) 21:27
No:22248
|
|
Title: アドレスとポインタについての質問
|
|
2つの実数を外部から入力して
それらを相加平均と相乗平均を計算する関数void souka_soujou()を作成し、引数は各自で考え
負の数が入力される場合は正の数が入力されるまで入力を要求するプログラムがどうしても
できません。
相加平均=a+b/2
相乗平均=√ab であらわせますが どのようにポインタをつかえばいいのでしょうか?
69ポイント を手に入れた。
|
|
|
|
Name: box ..ハッカー(126,471ポイント)
Date: 2008/10/10(金) 21:44
No:22250
|
|
Title: Re:アドレスとポインタについての質問
|
|
「どうしてもできない」というのは、
1)途中まで考えてみたが、あるところから先へ進めない。
2)自分では全く考える気がなく、とにかく答えがほしい。
3)その他
のうち、どれでしょうか。
75ポイント を手に入れた。
|
|
|
|
|
Name: box ..ハッカー(126,659ポイント)
Date: 2008/10/10(金) 23:07
No:22258
|
|
Title: Re:アドレスとポインタについての質問
|
|
22:35の投稿では、「MAIL」欄に何も入力せずに投稿したので、
お名前のところにメールアドレスへのリンクがありません。
しかし、それ以外のこれまでの投稿では同欄にメールアドレスが
入っていました。
よって、お名前「しょしょしょしんしゃ」のところへ
マウスカーソルを持っていくと、ブラウザーの左下にメールアドレスを
表示します。
また、お名前のところをダブルクリックすると、
mailto: プロトコルに関連付いているメーラーが起動して、
あなたあてのメールを作成できる状態になります。
188ポイント を手に入れた。
|
|
|
|
|
Name: しょしょしょしんしゃ ..ぴよぴよ(910ポイント)
Date: 2008/10/11(土) 14:15
No:22283
|
|
Title: Re:アドレスとポインタについての質問
|
|
そうなんですか。
はじめて知りました。
ところで話は変わりますが、このプログラムで最大値と最小値の差を
ポインタの要領で void mmd を使い 1つの関数として独立させることができるのでしょうか?
たかぎさんの注意を受け、一応 考えてみましたが、何か違いがありますでしょうか。
#include <stdio.h>
float saidai (float data[],float no);
float saishou (float data[],float no);
int main(void){
float a,b,c,d;
printf("4つの実数を入力せよ\n");
scanf("%f %f %f %f",&a,&b,&c,&d);
float x[4] ={ a, b, c, d };
float max ;
float min ;
float sa ;
printf("4つの実数を%f,%f,%f,%fとしました。\n",a,b,c,d);
max = saidai( x ,4 );
min = saishou( x,4 );
sa=max-min;
printf("このうち最大値は%fで,最小値は%fであり,その差は%fとなる。",max,min,sa);
return 0;
}
float saidai(float data[],float no)
{
float max;
int i;
max=data[0];
for(i=1;i<no;i++){
if( data[i]>max){
max = data[i];
}
}
return max;
}
float saishou(float data[],float no )
{
float min;
int i ;
min=data[0];
for(i=1;i<no;i++){
if(data[i]<min){
min = data[i];
}
}
return min;
}
}
528ポイント を手に入れた。
|
|
|
|
|
Name: しょしょしょしんしゃ ..かけだし(1,150ポイント)
Date: 2008/10/11(土) 14:48
No:22286
|
|
Title: Re:アドレスとポインタについての質問
|
|
ハイ
すみません souka_soujouはおかげで完成しました。
以下の問題に迷っているのです。
4つの実数a,b,c,dを外部から入力できるようにして
そららのうちの最大値、最小値および最大値と最小値の差を計算する部分を
1つの関数 void mmd() として独立させるプログラムを作成するという内容です。
分かり難くて、申し訳ありませんでした。
「最大値、最小値および最大値と最小値の差を計算する部分を1つの関数 void mmd() として独立させる」
という部分が 特に上手くできないのです。
240ポイント を手に入れた。
|
|
|
|
|
Name: lbfuvab ..初心者(5,166ポイント)
Date: 2008/10/11(土) 14:54
No:22288
|
|
Title: Re:アドレスとポインタについての質問
|
|
取り敢えず処理の方向としては
@double型で実数を二つ入力させる(scanf)
A正の数かを判別し、正でないなら@に戻る
B相加相乗を計算するvoid souka_soujou(double a,double b,double *souka,double *soujou)を呼び出す。
C表示する。(printf)
ですかね?
#平方根はmath.hのsqrtで計算できます。
138ポイント を落としてしまった。
|
|
|
|
|
Name: しょしょしょしんしゃ ..かけだし(1,324ポイント)
Date: 2008/10/11(土) 15:09
No:22290
|
|
Title: Re:アドレスとポインタについての質問
|
|
C++です。
規約は読みました
熟読はしていませんが、私の質問に不備があるのでしょうか?
すみませんでした。欠点があるなら、言ってください。
lbfuvabさん、ありがとうございました。
関数void souka_soujou()は、完成していましたが、
手直しの必要があったので、助かりました。
今の問題の処理の方向を教えていただけると、もっと助かります。
174ポイント を手に入れた。
|
|
|
|
|
Name: Mist ..プログラマー(27,526ポイント)
Date: 2008/10/11(土) 15:42
No:22295
|
|
Title: Re:アドレスとポインタについての質問
|
|
後はこの辺ですかね。
・自分は何を使ってコンパイルしているのか、OSは何かを必要に応じて書きましょう。
60ポイント を手に入れた。
|
|
|
|
|
Name: しょしょしょしんしゃ ..かけだし(1,796ポイント)
Date: 2008/10/11(土) 15:49
No:22296
|
|
Title: Re:アドレスとポインタについての質問
|
|
#include <stdio.h>
float saidai (float data[],float no);
float saishou (float data[],float no);
int main(void){
float a,b,c,d;
printf("4つの実数を入力せよ\n");
scanf("%f %f %f %f",&a,&b,&c,&d);
float x[4] ={ a, b, c, d };
float max ;
float min ;
float sa ;
printf("4つの実数を%f,%f,%f,%fとしました。\n",a,b,c,d);
max = saidai( x ,4 );
min = saishou( x,4 );
printf("この部分を1つの関数として独立させるのでしょうか?")
sa=max-min;
printf("このうち最大値は%fで,最小値は%fであり,その差は%fとなる。",max,min,sa);
return 0;
}
float saidai(float data[],float no)
{
float max;
int i;
max=data[0];
for(i=1;i<no;i++){
if( data[i]>max){
max = data[i];
}
}
return max;
}
float saishou(float data[],float no )
{
float min;
int i ;
min=data[0];
for(i=1;i<no;i++){
if(data[i]<min){
min = data[i];
}
}
return min;
}
}
ソースコードの貼り付けはこれでいいのでしょうか?
あと 私の本来の質問にもヒントがあれば、お願いします。
このソースコードをみて、何か気づいた人がいればお願いします。
質問の内容は No:22286 に記載してあります。
472ポイント を手に入れた。
|
|
|
|
|
Name: たかぎ [URL] ..熟練のプログラマー(62,430ポイント)
Date: 2008/10/11(土) 16:00
No:22297
|
|
Title: Re:アドレスとポインタについての質問
|
|
C++であれば、
template <class Iterator, typename T>
void mmd(Iterator first, Iterator last, T* 最大値, T* 最小値, T* 差)
{
*最大値 = *std::max_element(first, last);
*最小値 = *std::min_element(first, last);
*差 = *最大値 - *最小値;
}
でよいのでは?
115ポイント を手に入れた。
|
|
|
|
|
Name: しょしょしょしんしゃ ..かけだし(1,953ポイント)
Date: 2008/10/11(土) 16:28
No:22298
|
|
Title: Re:アドレスとポインタについての質問
|
|
何度もすみません
void mmd(Iterator first, Iterator last, T* 最大値, T* 最小値, T* 差)
{
*最大値 = *std::max_element(first, last);
*最小値 = *std::min_element(first, last);
*差 = *最大値 - *最小値;
}
は何処にいれるのでしょうか?
1番下ですか?
template <class Iterator, typename T>
とはなんですか 必要あるのですか?
157ポイント を手に入れた。
|
|
|
|
|
Name: Mist ..プログラマー(27,613ポイント)
Date: 2008/10/11(土) 17:21
No:22299
|
|
Title: Re:アドレスとポインタについての質問
|
|
本当にC++ですか?
ソース見る限りCだけどなぁ。
わからないことがあればまずググりましょう。
大抵のことはここで質問するより早く解決しますし、あなたにとっても勉強になります。
87ポイント を手に入れた。
|
|
|
|
Name: ジャーニー ..ぴよぴよ(243ポイント)
Date: 2008/10/11(土) 01:59
No:22268
|
|
Title: 龍神録作り方アレンジについて
|
|
はじめまして
今龍神録の作り方を見てまずは打ち込みながら大体同じようなプログラムを作っていっている段階です
ですが最近利用規約を見たところ酷似したプログラムの公開禁止と書いていました。まあ当たり前ですけどね
そのため公開する気はありませんが今後のため完成後プログラムを自分流にアレンジしていこうと思います
ですが自分の中ではすでにかなり完成されたプログラムであるので今のところ短い関数をインライン展開にしたりするぐらいしか思いつきません
アレンジするならばここなんかいいというところはありませんか?
ちなみにC++は今勉強中なので多少はわかります
お願いします
243ポイント を手に入れた。
|
|
|
|
Name: Justy ..ハッカー(233,350ポイント)
Date: 2008/10/11(土) 03:50
No:22270
|
|
Title: Re:龍神録作り方アレンジについて
|
|
>アレンジするならばここなんかいいというところはありませんか?
>ちなみにC++は今勉強中なので多少はわかります
>今のところ短い関数をインライン展開にしたりするぐらいしか思いつきません
こういう系のアレンジがいいのですか?
ということであれば、そうですね。
・ C++への本格的な移行・・・各種オブジェクトのクラス化など
この際全面的に C++化してみてはどうでしょうか。
今ある構造体にコンストラクタを付けたり、メンバ変数を private化、
メンバ関数を追加してメンバ変数の処理を行うようにしたりとか。
・ 静的変数の削減
本当にその変数はグローバル変数である必要があるのかどうか、
或いはアプリケーションの最初から最後までずっとメモリに保持しておく必要があるのかどうか
を検討し、静的変数の削減を検討してみてはどうでしょうか。
・ 共通化・簡潔化
同じような処理が複数回現れているようでしたら、関数化するなり、クラス化するなり
1つにまとめていく、というのはどうでしょうか。
メンバ変数へのアクセも同様で、構造体内部への深いアクセスが続くようなら一時変数に
まとめて一行を短くしてみるとか。
多分これくらいやるだけで、かなりジャーニーさんオリジナルなコードになるはずですよ。
158ポイント を手に入れた。
|
|
|
|
|
Name: 管理人 ..伝説なるハッカー(815,063ポイント)
Date: 2008/10/11(土) 09:35
No:22274
|
|
Title: Re:龍神録作り方アレンジについて
|
|
<pre>龍神録では、構造体の型が見てすぐわかるように似たような構造体もことあるごとに
全て個別に用意してあります。
例えば
typedef struct{
int flag,cnt,knd;
double x,y;
}A_t;
typedef struct{
int flag,cnt;
double x,y;
}B_t;
これらはほとんど同じなので、なるべく共通利用できる構造体の形にしてみてはどうでしょう。
また、配列は全て動的確保していません。敵、弾幕、弾・・。
これからリプレイ機能等を作りますが、これも最初からガッポリ大量に領域確保します。
これらを効率よく領域確保してやるといいかもしれません。
しかし弾幕の弾データについては、画面から消える・登録するごとに配列を確保、解放しては
余計に遅くなってしまう可能性があるので、その辺は単なる動的配列や線形リストに留まらず
必要になったら現在の1.5倍の領域を確保するなど、
工夫する必要があるかもしれません。
後、stageやcountなど、単体で存在する変数が存在しますが、
これらの変数を構造体に纏めてやるのもいいと思います。
変数が単体でグローバル変数として存在すると初期化ミスがあったりするので、
構造体でまとめてやったほうがいいかもしれません。
323ポイント を落としてしまった。
|
|
|
|
|
Name: ジャーニー ..ぴよぴよ(267ポイント)
Date: 2008/10/11(土) 13:50
No:22281
| 解決!
|
Title: Re:龍神録作り方アレンジについて
|
|
回答ありがとうございます
>Justyさん
C++への移行は考えていましたが今はまだクラスやリストを覚えたばかりです
ですが覚え次第移行を考えてみたいと思います
>管理人さん
enemyやenemy_orderがそれにあたりそうですね
とりあえずは1面実装までを区切りに作っていく予定です
ですので1面完成後領域を動的に確保していくようなつくりにしていきたいと思います
ありがとうございます
24ポイント を手に入れた。
|
|
|
|
Name: BlueBlue ..ぴよぴよ(82ポイント)
Date: 2008/10/10(金) 23:02
No:22256
|
|
Title: 画像表示について。
|
|
こんにちは!
今日、初めてDXライブラリを使ってみたのですが、画像の表示ができません。
使っているのはvisual C++2008とDXライブラリver2.24cです。
ここのサイトで教えてくださったとおりやったのですが、できませんでした。
どなたか原因、及び解決法が分かる方いらっしゃいましたら、是非ご教示よろしくお願いします。
40ポイント を手に入れた。
|
|
|
|
Name: box ..ハッカー(126,738ポイント)
Date: 2008/10/10(金) 23:16
No:22259
|
|
Title: Re:画像表示について。
|
|
> ここのサイトで教えてくださったとおりやったのですが、できませんでした。
> どなたか原因、及び解決法が分かる方いらっしゃいましたら、是非ご教示よろしくお願いします。
単に「できません」でした、では、状況が伝わってきません。
教えてもらったとおりに本当にやったかどうかはさておき、
やってみたときに「どうなったので」できないと判断したのかを
示してください。
何かエラーメッセージが出たのであれば、全文を正確に載せてください。
79ポイント を手に入れた。
|
|
|
|
|
Name: situmon ..入門者(4,217ポイント)
Date: 2008/10/10(金) 23:45
No:22261
|
|
Title: Re:画像表示について。
|
|
考えられる理由。
1保存する場所(アドレスが違う。)
画像とプロジェクト(コード)は同じ場所に。
2拡張子が違う。
png形式なのに、bmpと書いてしまったなど。
3あと手順を間違えた、コンマを付け忘れた(括弧を付け忘れた)など。
エラーメッセージは下の出力画面に出てくるので便利です。
132ポイント を手に入れた。
|
|
|
|
|
Name: 管理人 ..伝説なるハッカー(815,145ポイント)
Date: 2008/10/11(土) 09:51
No:22276
|
|
Title: Re:画像表示について。
|
|
ここのサイトでと仰っているのでゲームプログラミングの館のことかな?と思うのですがどうでしょう?
どのプログラムコードを試したのか、どの画像が出ないのか教えて下さい。
もしゲームの館の序盤でしたら表示されない人に試していただくようのプログラムコードが3章にあると思いますが
試していただけましたでしょうか?
122ポイント を手に入れた。
|
|
|
|
Name: リョキョタ ..ぴよぴよ(517ポイント)
Date: 2008/10/10(金) 00:00
No:22223
|
|
Title: 22. キャラを4方向に歩かせる。について質問なんですが・・。
|
|
サンプルプログラムの「ch.img=image[(ch.x%32+ch.y%32)/8 + ch.muki*4]; //画像をセット」
の部分のch.muki*4の意味がいまいちよくわかりません。最初にch.mukiに3を代入している意味もわかりません。
ちなみにつくってみたやつはビルドはできるんですが実行すると画像が表示されないのはなぜでしょうか?
↓自分でサンプルプログラムと画像を変えて作ってみたんですがどこかまちがってますか?(画像の名前:tama.png , サイズ100×100 ,マスの個数はxが3個でyが4個の全部で12個です。)
#include "DxLib.h"
typedef struct{
int x,y,img,muki,walking_flag;
}ch_t;
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){
int image[12];
char Key[256];
ch_t ch;
if( ChangeWindowMode(TRUE) != DX_CHANGESCREEN_OK || DxLib_Init() == -1 ) return -1; //ウィンドウ化と初期化処理
ch.x =150;
ch.y =150;
ch.walking_flag = 0;
ch.muki=3;
SetDrawScreen( DX_SCREEN_BACK ) ; //描画先を裏画面に設定
LoadDivGraph( "tama.png" , 12 , 3 , 4 , 100 , 100 , image ) ;//画像を分割してimage配列に保存
while(!ProcessMessage() && !ClearDrawScreen() && !GetHitKeyStateAll( Key ) && !Key[KEY_INPUT_ESCAPE]){
//↑メッセージ処理 ↑画面をクリア ↑キーボード入力状態取得 ↑ESCが押されると終了
if(ch.x%100==0 && ch.y==0){//キャラが静止しているとき
ch.walking_flag = 1;//ch.walking_flag==1が発動
if( Key[ KEY_INPUT_RIGHT ] == 1 ) //右ボタンが押されたら
ch.muki = 0;
else if(Key[ KEY_INPUT_LEFT] ==1 )
ch.muki = 1;
else if(Key[ KEY_INPUT_UP] == 1)
ch.muki = 2;
else if(Key[ KEY_INPUT_DOWN] == 1)
ch.muki = 3;
else
ch.walking_flag=0;
}
if(ch.walking_flag == 1){//発動したら、
if(ch.muki==0)
ch.x++;
else if(ch.muki==1)
ch.x--;
else if(ch.muki==2)
ch.y--;
else if(ch.muki==3)
ch.y++;
}
ch.img=image[(ch.x%100+ch.y%100)/33+ch.muki*4];
DrawGraph( ch.x , ch.y , ch.img , TRUE ) ;
ScreenFlip();
}
DxLib_End();
return 0;
}
教えてくださいm( __)m
517ポイント を手に入れた。
|
|
|
|
Name: kazuoni ..プログラマー(31,386ポイント)
Date: 2008/10/10(金) 00:34
No:22224
|
|
Title: Re:22. キャラを4方向に歩かせる。について質問なんですが・・。
|
|
ch.muki*4ではキャラの画像の向きを決めています。
例えば、プログラミングの館の例でいえば
↑キーのときch.muki=0です。
そうすると16分割したときのいちばん上の行
(キャラが後ろ向いている4つ)
を示しています。
あとは(ch.x%32+ch.y%32)/8でその4つのなかの何番目を表示するのか決めています。
>自分でサンプルプログラムと画像を変えて作ってみたんですがどこかまちがってますか?
>(画像の名前:tama.png , サイズ100×100 ,マスの個数はxが3個でyが4個の全部で12個です。)
保存先が違う、ファイル名が違うなどが考えられます。
↑のコードが書いてあるソースファイルと同じ場所に画像がありますか?
あとちょっと疑問に思ったのですが
画像のサイズが100×100ですか?
それとも分割した一つが100×100ですか?
LoadDivGraph()の第5,6引数は分割した時の一つの大きさです。
もし前者ならば
3×4だときれいに割れないですが、
LoadDivGraph( "tama.png" , 12 , 3 , 4 , 33 , 25 , image )
です。
356ポイント を手に入れた。
|
|
|
|
|
Name: リョキョタ ..ぴよぴよ(646ポイント)
Date: 2008/10/10(金) 01:48
No:22226
|
|
Title: Re:22. キャラを4方向に歩かせる。について質問なんですが・・。
|
|
ch.muki*4はキャラの向きで、最初にch.muki=3;となっていたのは、
単に右を向いて始まるとうことだったんですね!
前の段階の「21. キャラを一区間歩かせる」まではちゃんと表示されていたので、
フォルダを間違えてはいないと思います。
あと、画像の100×100は区切ったときの大きさでした。すいません><;
ですから、区切る前は300×400です;
ほかに考えられるところはありませんか?
129ポイント を手に入れた。
|
|
|
|
|
Name: kazuoni ..プログラマー(31,631ポイント)
Date: 2008/10/10(金) 02:22
No:22227
|
|
Title: Re:22. キャラを4方向に歩かせる。について質問なんですが・・。
|
|
まずは原因から。
if(ch.x%100==0 && ch.y==0)
この文は絶対に実行されることはありません。
まず初期条件で
150%100=50
ですから満たしません。
(もちろん初期条件よりch.y==0でもないですし^^;)
次に
if(ch.walking_flag == 1)
も実行されません。初期条件でフラグを立てていないからです。
フラグを立てる文は最初のifの中ですので、フラグが立つこともありません。
最後に
ch.img=image[(ch.x%100+ch.y%100)/33+ch.muki*4]
を実行していますが、
ch.img=image[(50+50)/33+4*3]=image[15]
となり、そのimgはありません。
245ポイント を手に入れた。
|
|
|
|
|
Name: kazuoni ..プログラマー(31,803ポイント)
Date: 2008/10/10(金) 02:41
No:22228
|
|
Title: Re:22. キャラを4方向に歩かせる。について質問なんですが・・。
|
|
解決策としては
変更点
ch.x =200;
ch.y =200;
...
if(ch.x%100==0 && ch.y%100==0)
...
ch.img=image[(ch.x%100+ch.y%100)/33+ch.muki*3];
初期位置を変更したのはゲーム開始後いきなりキャラが動いているのは不自然かなと思いまして。
もし動いてもいいなら
ch.x =100;
ch.y =150;
ch.walking_flag = 1;
ch.muki=3;
こんな感じで。
if(ch.x%100==0 && ch.y==0)のch.y==0
はなにか意図があってのものでしょうか?
もしこれだと一回↓キーが押されたらずっとch.y++を繰り返すことになり、
一度フラグが立ってしまうと
とても危ないことになるような気がします。
172ポイント を手に入れた。
|
|
|
|
|
Name: リョキョタ ..ぴよぴよ(698ポイント)
Date: 2008/10/10(金) 08:51
No:22231
| 解決!
|
Title: Re:22. キャラを4方向に歩かせる。について質問なんですが・・。
|
|
画像が表示できました!
kazuoniさんのおっしゃるとおりでした。
ありがとうございますm(__)m
if(ch.x%100==0 && ch.y==0)のch.y==0 は意図はなく入力ミスですorz..
52ポイント を手に入れた。
|
|
|
|
|
Name: kazuoni ..プログラマー(31,699ポイント)
Date: 2008/10/10(金) 10:57
No:22236
|
|
Title: Re:22. キャラを4方向に歩かせる。について質問なんですが・・。
|
|
自分も最初外れた事を書いてしまって申し訳ないです。
もっとコードをしっかり見る癖を養わないと・・・。
がんばってください。
44ポイント を手に入れた。
|
|
|
|
|
Name: リョキョタ ..ぴよぴよ(715ポイント)
Date: 2008/10/10(金) 18:50
No:22247
|
|
Title: Re:22. キャラを4方向に歩かせる。について質問なんですが・・。
|
|
がんばります、ありがとうございました。
17ポイント を手に入れた。
|
|
|
|
Name: suzu ..ぴよぴよ(17ポイント)
Date: 2008/10/08(水) 20:08
No:22158
|
|
Title: ニュートン法を用いた割り算
|
|
学校の課題なのですが、
C言語で”/”記号を使わずにニュートン法を使って割り算の答えを出すプログラムを作れ。
とのことなのですが、
色々と調べてもみたものの、まったくといって良いほど分かりませんでした。
同じ様な課題でニュートン法を使って√の答えをだせ、というプログラムは一応作ることが出来ました。
#include <stdio.h>
#include <math.h>
int main(void)
{
double a,b,c=10.0;
int d=0;
const double eps=10e-11;
printf("Input Number\n");
scanf("%lf",&a);
while (fabs(c-b)>=eps){
b=c;
c=(b+a/b)/2.0;
d=d+1;
printf("%10.9f\n",c);
}
printf("roop%d\n",d);
return 0;
}
ほぼ丸投げという形になってしまって申し訳ありませんが、どうかお願いします。
17ポイント を手に入れた。
|
|
|
|
Name: Mist ..プログラマー(26,601ポイント)
Date: 2008/10/08(水) 20:24
No:22161
|
|
Title: Re:ニュートン法を用いた割り算
|
|
学校の課題にきちんと授業を受けていて解けない問題が出されることはありません。
自業自得です。
ここで回答を丸写しして提出するより正直に報告するか、もしくは友達に教えてもらう
ほうがよほどあなたのためになります。
がんばってください。
#余談
こことか、知恵袋とかOK Webのようなググるで上位にくるようなところは先生も見ている
可能性が高いためどのみちバレますよ。
証拠があるわけじゃないけどさ。
106ポイント を手に入れた。
|
|
|
|
|
Name: suzu ..ぴよぴよ(466ポイント)
Date: 2008/10/09(木) 12:27
No:22179
|
|
Title: Re:ニュートン法を用いた割り算
|
|
私の学校の先生はなぜかまったく授業をしないんです。
講義時間中は一番最初に課題だけ出して後は完全に放置といったわけの分からない授業なんです。
実際、私は課題を出されて調べるまでニュートン法は一切聞いたこともありませんでした。
ここでいただいた回答は、丸写しにするつもりはありません。
自分なりに分解して色々と試してみるつもりです。
というか、この掲示板の主旨は
C言語での質問をさせていただいて、それに答えをもらう。
というものではないのでしょうか?
自分でやったほうが自分のため、という意見はその通りだと思いますが、
ここで教えていただくことと友達に教えてもらうことに違いがあるとは正直思えません。(というか、友達も一人も出来ていませんでした。)むしろ、プログラムに慣れている方の回答を見て、勉強したほうがより勉強になると思って書き込ませていただいたのですが。
何の手がかりもなしに一からこの課題を解くには私は力不足です。
計算部分のヒントだけでもいただけないでしょうか?
449ポイント を手に入れた。
|
|
|
|
|
Name: たかぎ [URL] ..熟練のプログラマー(61,891ポイント)
Date: 2008/10/09(木) 12:48
No:22180
|
|
Title: Re:ニュートン法を用いた割り算
|
|
> 私の学校の先生はなぜかまったく授業をしないんです。
> 講義時間中は一番最初に課題だけ出して後は完全に放置といったわけの分からない授業なんです。
> 実際、私は課題を出されて調べるまでニュートン法は一切聞いたこともありませんでした。
学校といってもどんな学校か分かりませんが...
高等教育であれば、教員に手取り足取り教えてもらうところではなく、自発的に学習するのが原則です。
先生は当面の目標だけを設定して、細かい部分は学生に質問させることを前提としているのかもしれませんよ。
> というか、この掲示板の主旨は
> C言語での質問をさせていただいて、それに答えをもらう。
> というものではないのでしょうか?
まあ、とりあえず規約に目を通してください。
http://l.huu.cc/board/board.html
もし理解できない場合は、その旨を告知してください。
> こことか、知恵袋とかOK Webのようなググるで上位にくるようなところは先生も見ている
> 可能性が高いためどのみちバレますよ。
というか、回答者の中にいるかもしれませんね。
117ポイント を手に入れた。
|
|
|
|
|
Name: 管理人 [URL] ..伝説なるハッカー(815,077ポイント)
Date: 2008/10/09(木) 12:49
No:22181
|
|
Title: Re:ニュートン法を用いた割り算
|
|
ルートのプログラムはできたという事ですが、
bに値が代入されていないのに計算に使っているのでおかしくないですか?
こちらでは実行エラーになりました。
数学的な話はよくわかりませんが、計算方法さえわかれば解けると思います。
プログラムの掲示板なので、プログラムに詳しい人は集まっているでしょうけど、
数学的に詳しい人がたくさんいらっしゃるとは限らないと思いますので、
「数学的にはこういう理論なんだけど、これをプログラムで実装するにはどうしたらいいか」
という質問の仕方の方が回答も集まると思います。
202ポイント を手に入れた。
|
|
|
|
|
Name: Haru ..上級者(17,381ポイント)
Date: 2008/10/09(木) 13:33
No:22183
|
|
Title: Re:ニュートン法を用いた割り算
|
|
>管理人さん
>数学的に詳しい人がたくさんいらっしゃるとは限らないと思いますので、
>「数学的にはこういう理論なんだけど、これをプログラムで実装するにはどうしたらいいか」
>という質問の仕方の方が回答も集まると思います。
プログラムもまだまだ未熟で数学はさっぱりな私から言わせてもらうと、
さっぱりわかりません!ニュートン法というものをグーグル先生に聞いてみましたが…
理解不能だったので断念しました(汗)
>何の手がかりもなしに一からこの課題を解くには私は力不足です。
>計算部分のヒントだけでもいただけないでしょうか?
という、事で全くわかりませんが、グーグル先生に『ニュートン法 割り算』
ときいたら・・・これかなぁ?
というようなものがそれなりにヒットしましたよ。
330ポイント を手に入れた。
|
|
|
|
|
Name: Haru ..上級者(17,551ポイント)
Date: 2008/10/09(木) 13:39
No:22184
|
|
Title: Re:ニュートン法を用いた割り算
|
|
>bに値が代入されていないのに計算に使っているのでおかしくないですか?
>こちらでは実行エラーになりました。
連レスすみません。b=0でした。
下のような実行結果でした。
Input Number
3
5.150000000
2.866262136
1.956460732
1.744920939
1.732098271 ↓この下からが答え(ですよね?)
1.732050808
1.732050808
1.732050808
roop8
170ポイント を手に入れた。
|
|
|
|
|
Name: Mist ..プログラマー(26,759ポイント)
Date: 2008/10/09(木) 14:20
No:22185
|
|
Title: Re:ニュートン法を用いた割り算
|
|
私の言いたいことはたかぎさんと管理人さんと同じなんですが
数学的にこういうふうに計算すればよいことはわかるが、それがC言語でどう表せばいいのかわかりません。
ということであれば回答できますが、ニュートン法を使っての割り算の自体が皆目わかりませんというので
あればプログラム以前の問題ですので数学系の質問掲示板にいかれたほうがよいと思います。
135ポイント を落としてしまった。
|
|
|
|
|
Name: たいちう ..中級者(10,739ポイント)
Date: 2008/10/09(木) 15:11
No:22186
|
|
Title: Re:ニュートン法を用いた割り算
|
|
問題を勘違いしているということはないですか?
Newton法で割り算の答は出せません。
無理やりNewton法で計算しようとしても、
次項を求めるための計算に割り算が出てきます。
割り算の演算子を使わないで、割り算の答を出すことならできます。
商の範囲を予め決めておいて、範囲の中央の値に除数をかけ、
被除数と比較することで、商と中央値の大小を判断でき、
商の範囲が半分になります。これを繰り返せば必要な精度で商が得られます。
予め決めておく商の範囲ですが、色々こだわることもできますが、
とりあえずは0〜1e100とかで実用上問題ないかと。
# 多分ないと思いますが、私が理解しているよりも「Newton法」という
# 言葉の表す範囲が広いのかもしれません。
# また、トリッキーな方法で割り算を避けるNewton法が存在するかもしれません。
# この場合は、課題として適切ではないと思います。
254ポイント を落としてしまった。
|
|
|
|
|
Name: suzu ..ぴよぴよ(941ポイント)
Date: 2008/10/09(木) 16:22
No:22189
| 解決!
|
Title: Re:ニュートン法を用いた割り算
|
|
Haruさんの仰る通り、googleで調べてみたところ、
http://journal.mycom.co.jp/column/architecture/102/index.html
というページが見つかり、それを参考に一応完成させることが出来ました。
質問の仕方などで至らない点が多々あり、申し訳ありませんでした。
ただ、完成したというのは、一応答えは出る。というだけで、とても効率的とは思えません。
アドバイスなどあったらよろしくお願いします。
#include <stdio.h>
#include <math.h>
int main(void)
{
double a,b,c=0.0,x=0.0,xi=0.000000001;
int d=0;
const double eps=10e-11;
printf("Please Input Number A\n");
scanf("%lf",&a);
printf("Please Input Number B\n");
scanf("%lf",&b);
while(fabs(xi-x)>=eps){
x=xi;
xi=xi*(2-(xi*b));
d=d+1;
printf("%10.9f\n",xi);
}
c=a*xi;
printf("A/B=%10.9f\n",c);
printf("roop%d\n",d);
return 0;
}
>たいちうさん
ニュートンラプソン法とニュートン法は別物なのでしょうか?
だとしたら申し訳ありませんでした。
475ポイント を手に入れた。
|
|
|
|
|
Name: Mist ..プログラマー(27,213ポイント)
Date: 2008/10/09(木) 16:53
No:22190
|
|
Title: Re:ニュートン法を用いた割り算
|
|
効率について私から指摘はありませんが動作について2点指摘があります。
1.Bに0を設定できる
現状のプログラムだとwhileから抜けてこずに例外終了します。
以下のような制限を設けるほうがいいのではないでしょうか。
scanf("%lf",&b);
if (b == 0.0) {
printf("0割りは出来ません\n");
return 1;
}
2.Bに負値を設定したときに例外終了します。
私では計算部分の間違いはわかりませんが、問題ではないでしょうか。
2倍のポイントを手に入れた! 454ポイント を手に入れた。
|
|
|
|
|
Name: たいちう ..中級者(10,907ポイント)
Date: 2008/10/09(木) 17:54
No:22192
|
|
Title: Re:ニュートン法を用いた割り算
|
|
> ニュートンラプソン法とニュートン法は別物なのでしょうか?
同じです。私が思いつけなかっただけで、
割り算を避けるトリッキーでない方法があるのですね。
ノーヒントだと時間をかけても私には解けなかったかもしれませんが、
課題として適切でない、というのは言いすぎでした。
> だとしたら申し訳ありませんでした。
こちらこそ混乱させ申し訳ありませんでした。
2倍のポイントを手に入れた! 168ポイント を手に入れた。
|
|
|
|
|
Name: suzu ..かけだし(1,093ポイント)
Date: 2008/10/09(木) 21:13
No:22207
| 解決!
|
Title: Re:ニュートン法を用いた割り算
|
|
>Mistさん
ご指摘どうもありがとうございました。
0で割ることや、-のことをすっかり失念していました。
#include <stdio.h>
#include <math.h>
int main(void)
{
double a,b,c=0.0,x=0.0,xi=0.000000001,y;
int d=0,e=0;
const double eps=10e-11;
printf("Please Input Number A\n");
scanf("%lf",&a);
printf("Please Input Number B\n");
scanf("%lf",&b);
y=b;
if(b==0.0){
printf("0割りは出来ません\n");
return 1;
}
if(b<0.0){
b=b*(-1);
e=1;
}
while(fabs(xi-x)>=eps){
x=xi;
xi=xi*(2-(xi*b));
d=d+1;
printf("%10.9f\n",xi);
}
c=a*xi;
if(e==1)
c=c*(-1);
printf("A/B=%10.9f %10.9f %10.9f\n",c,a/y,(a/y)-c);
printf("roop%d\n",d);
return 0;
}
力技といった感じになってしまいましたが、数値はちゃんと出るのでこんな感じでしょうか?
152ポイント を手に入れた。
|
|
|
|
|
Name: Mist ..プログラマー(27,466ポイント)
Date: 2008/10/09(木) 21:43
No:22212
|
|
Title: Re:ニュートン法を用いた割り算
|
|
たいしたことではないですが。
変数eって必要でしょうか?
bに入力された値はyに退避していますよね。
なので
if(e==1)
↓
if(y<0.0)
でも同じことですよね。
変数をひとつ減らせます。
あとは書き方ですが
d=d+1;
c=c*(-1);
などは
d++; または ++d;
c*=-1;
と省略してかけます。
125ポイント を手に入れた。
|
|
|
|
|
Name: suzu ..かけだし(1,137ポイント)
Date: 2008/10/10(金) 15:14
No:22244
| 解決!
|
Title: Re:ニュートン法を用いた割り算
|
|
なるほど。
早速ご指摘いただいた点を修正させていただきました。
みなさんのおかげで無事にプログラムを完成させることが出来ました。
本当にありがとうございました。
44ポイント を手に入れた。
|
|
|
|
Name: Sora ..ぴよぴよ(199ポイント)
Date: 2008/09/30(火) 10:22
No:21836
|
|
Title: どうしていいのか解りません
|
|
scanf関数を使用して、文字列を10回入力し、最も大きな文字列を表示
+文字列の比較はstrcmpを使用
+未入力の場合はエラーとし、もう一度入力
scanf関数を使用して、数字を10回入力し、最も大きな奇数を表示
+未入力、半角数値以外の入力はエラーとし、もう一度入力
なのですが、エラー処理が出来ません。後々関数化しなければならないのですが
関数化もよく解りません;
自分で作った範囲は
#include<stdio.h>
#include<string.h>
#include<ctype.h>
int main(){
int cnt=0, max1=0 , cnt2, su=0,moji=0;
char str[50],max[50];
for(;cnt<10;cnt++){
printf("%d回目の入力をしなさい" , cnt+1);
while(1){
str[moji] = getchar();
if(str[moji] == '\n'){
break;
}
moji++;
}
if(str[0] == '\n')
printf("数値を入力してください。\n");
else
break;
}
if(strcmp(str , max) == 1){
strcpy(max , str);
}
}
printf("一番大きいのは%s\n" , max);
printf("数字を10回入力してください。\n");
for(cnt2=0;cnt2<10;cnt2++){
printf("%d回目の入力をしてください。" , cnt2+1);
scanf("%d" , &su);
if((su%2) != 0){
if(su>max1){
max1 = su;
}
}
}
printf("一番大きい奇数は>%d" , max1);
}
ご助力お願いいたします。
199ポイント を手に入れた。
|
|
|
|
Name: 御津凪 [URL] ..上級者(20,158ポイント)
Date: 2008/09/30(火) 10:53
No:21838
|
|
Title: Re:どうしていいのか解りません
|
|
字下げがおかしいところがあるのは混乱の元になりますので正したほうが良いでしょう。
関数化をせずに考えると、for 文ではなく、while 文を使うと、
エラーが発生した所で continue を使えば、
再度(同じ回の)入力待ちすることが出来ます。
具体的にはこんな感じになると思います。
(文字列入力&処理のみ抜粋)
while(cnt<10){
moji = 0; // 初期化
printf("%d回目の入力をしなさい" , cnt+1);
while(1){
str[moji] = getchar();
if(str[moji] == '\n'){
str[moji] = '\0'; // 安全に処理するために NULL 文字に置き換え
break;
}
moji++;
}
if(str[0] == '\0'){ // moji == 0 でもOK
printf("数値を入力してください。\n");
continue; // 再度入力へ
}
if(strcmp(str , max) > 0){ // 大小をチェックする場合は 0 より大きいか小さいかを確認したほうが良い
strcpy(max , str);
}
cnt++; // 次の入力回へ
}
printf("一番大きいのは%s\n" , max);
色々と変わっていますが、変更の要点は、
・moji が初期化されていないので、str の配列を超える可能性がある
・'\n'を'\0'に置き換えているのは安全のためと、正しく比較するため
・エラーが発生した回をもう一度やり直すため、正常処理した時のみ cnt を +1
となっています。
2倍のポイントを手に入れた! 1,026ポイント を手に入れた。
|
|
|
|
|
Name: Sora ..ぴよぴよ(282ポイント)
Date: 2008/10/01(水) 09:29
No:21874
|
|
Title: Re:どうしていいのか解りません
|
|
#include<stdio.h> /*stdio.hをインクルードする*/
#include<string.h> /*string.hをインクルードする*/
#include<ctype.h> /*ctype.hをインクルードする*/
int main(){ /*メインクラス*/
int cnt=0, max1=0 , cnt2, su=0, moji=0; /*int型宣言*/
char str[50],max[50]; /*char型で宣言*/
while(cnt<10){
moji == 0;
printf("%d回目の入力をしなさい" , cnt+1);
while(1){
scanf("%s" , str[moji]);
if(str[moji] == '\n'){
str[moji]='\0';
break;
}
moji++;
}
if(str[0] == '\0'){
printf("もう一度入力しなおしてください");
continue;
}
if(strcmp(str , max) > 0){
strcpy(max , str);
}
cnt++;
}
printf("一番大きいのは%s\n" , max);
printf("数字を10回入力してください。\n");
for(cnt2=0;cnt2<10;cnt2++){
printf("%d回目の入力をしてください。" , cnt2+1);
scanf("%d" , &su);
if((su%2) != 0){
if(su>max1){
max1 = su;
}
}
}
printf("一番大きい奇数は>%d" , max1);
rewind(stdin);
getchar();
}
書き直してみたのですが、1回目の処理から抜け出さず
無限ループを繰り返します。
getcharは1文字づつ取り出す処理ですが
scanfとどうちがうのでしょうか?
また半角英数字以外のエラーは。。。
islower(c)
こういう関数を見つけたのですが、int型でないと使えないらしく
この場合どう適応させていいのかよくわかりません;
質問ばかりで申し訳ないのですが、よろしくお願いいたします。
83ポイント を手に入れた。
|
|
|
|
|
Name: 御津凪 [URL] ..上級者(20,808ポイント)
Date: 2008/10/01(水) 10:28
No:21875
|
|
Title: Re:どうしていいのか解りません
|
|
> getcharは1文字づつ取り出す処理ですが
> scanfとどうちがうのでしょうか?
getchar() は、入力された文字列から一文字読み込んで返します。
一方、scanf() は、printf() のように指定された書式設定に従って文字列を読み込みます。
単に文字列として読むのであれば scanf() が楽です。
しかし、 printf() とは違い、データを入れる変数はポインタを渡さなければなりません。
上記のコードでは、
scanf("%s" , str);
となり("[moji]"は不要)、str には一行分(正確には改行・空白文字の前まで)入るので、
ループ処理も不要です。
したがって、
while(cnt<10){
//moji = 0; // "=="は間違いなので修正、というより不要
printf("%d回目の入力をしなさい" , cnt+1);
scanf("%s" , str);
if(str[0] == '\0'){
printf("もう一度入力しなおしてください");
continue;
}
if(strcmp(str , max) > 0){
strcpy(max , str);
}
cnt++;
}
となります。
scanf で一つ注意するのは、空白を含む文字列を読み込むと、最初の空白までしか読み込めません。
きっちり入力を読み込みたい場合は gets() に置き換えると良いでしょう。
> また半角英数字以外のエラーは。。。
> islower(c)
> こういう関数を見つけたのですが、int型でないと使えないらしく
> この場合どう適応させていいのかよくわかりません;
islower() は英小文字を判別する関数なので、 isalnum() を使います。
使い方は、1文字ずつ渡してチェックします。
int i;
for(i = 0;i < strlen(str),++i){ // 全ての文字についてチェック
if(!isalnum(str[i])){
// 半角英数字でない場合にエラー
}
}
チェックしているのは半角英数字なので、記号や空白文字もエラーとして判別されます。
記号の判別は isgraph()、空白の判別は isspace() となっています。
650ポイント を手に入れた。
|
|
|
|
|
Name: Mist ..上級者(23,856ポイント)
Date: 2008/10/01(水) 10:42
No:21876
|
|
Title: Re:どうしていいのか解りません
|
|
グーグル先生をうまく使いこなしましょう。
http://programnet.hp.infoseek.co.jp/clangage/console.html
例えば3文字入力してEnterを押すと3文字が読み込まれて4文字目に\0がセットされます。
> scanf("%s" , str[moji]);
これは大間違いです。
入力された文字列はとんでもないところに入っているのでbreakするための条件を満たしません。
正しくは
scanf("%s", str);
文字列を一回のscanfで取得できるのでwhileによる繰り返しもいりません。
> int型でないと使えないらしく
そんなことはないです。
値を渡すのであればcharやshortでも問題ありません。(ポインタを渡すのはだめ)
半角英数字をチェックしたいのだったらislowerは違うと思う。
isalphaとisdigitかな。
150ポイント を手に入れた。
|
|
|
|
|
Name: Sora ..かけだし(1,040ポイント)
Date: 2008/10/01(水) 11:38
No:21882
|
|
Title: Re:どうしていいのか解りません
|
|
ありがとうございます。
なんとなくうやむやにしていた部分が結構はっきりして
理解できたのかなと思います。
str[0]=='\0'は、普段終端値の'\0'が未入力の場合は一番初めに来るってことを
利用しているんですよね。
一応書き換えて、↓を動かしてみたんですが
うまく処理に入りません。入力画面で
1回目の入力をしなさい の時点でエンターキーを押すと
そのまま下へ下がっていくばかりで文字か入力されるまで
次の処理に行きません。'\n'に書き換えてみてもだめでした。
なぜなんでしょうか;
一応google先生は検索しているんですが、うまくできず。。。
まだ初めて1ヶ月もたたないんですが、早くも挫折しぎみです;;
while(cnt<10){
printf("%d回目の入力をしなさい" , cnt+1);
scanf("%s" , str);
if(str[0] == '\0'){
printf("もう一度入力しなおして下さい。");
continue;
}
if(strcmp(str , max) > 0){
strcpy(max , str);
}
cnt++;
}
printf("一番大きいのは%s\n" , max);
で書き直しましたが、
2倍のポイントを手に入れた! 758ポイント を手に入れた。
|
|
|
|
|
Name: Mist ..上級者(24,110ポイント)
Date: 2008/10/01(水) 11:53
No:21883
|
|
Title: Re:どうしていいのか解りません
|
|
> そのまま下へ下がっていくばかりで文字か入力されるまで
scanfは、スペース、Enter以外の入力が無いとscanf関数が終了しません。
(もしかしたら方法があるのかもしれないけど私は知りません)
scanf("%s" , str);
printf("scanf抜けた\n");
というようにしてみてください。
scanfが終わっていないことがわかります。
こういうかんじでprintfを利用してソースのどの部分が走っているかを確認する方法を
printfデバッグといいます。
163ポイント を手に入れた。
|
|
|
|
|
Name: Sora ..かけだし(1,611ポイント)
Date: 2008/10/01(水) 13:53
No:21885
|
|
Title: Re:どうしていいのか解りません
|
|
> scanfは、スペース、Enter以外の入力が無いとscanf関数が終了しません。
ということはscanfで未入力エラーの対処は不可能と言うことでしょうか?;
> scanf("%s" , str);
> printf("scanf抜けた\n");
このようにやってみましたが、やはり未入力の時は「抜けた」と出ず
終了せず、入力を待ちます。
2つ目の方なのですが、半角数値以外エラーなのでisdigitを使って作ってみたんですが・・・
いまいち?無限ループを繰り返します。まだ練ってる最中なのですが
経過までに。
#include<stdio.h> /*stdio.hをインクルードする*/
#include<string.h> /*string.hをインクルードする*/
#include<ctype.h> /*ctype.hをインクルードする*/
int main(){ /*メインクラス*/
int cnt=0, max1=0 , cnt2=0,i=0,swich=0; /*int型宣言*/
char str[128],max[128],su[128]; /*char型で宣言*/
while(cnt<10){
printf("%d回目の入力をしなさい" , cnt+1);
scanf("%s" , str);
printf("scanf抜けた\n");
if(str[0] == '\0'){
printf("もう一度入力しなおして下さい。");
continue;
}
if(strcmp(str , max) > 0){
strcpy(max , str);
}
cnt++;
}
printf("一番大きいのは%s\n" , max);
printf("数字を10回入力してください。\n");
while(cnt2<10){
printf("%d回目の入力をしてください。" , cnt2+1);
scanf("%d" , su);
swich = 0;
for(i=0;i<strlen(su);++i){
if(isdigit(su[i])==0){
printf("もう一度入力しなおしてください");
swich = 1;
break;
}
}
if(swich == 1){
continue;
}
for(i=0;i<strlen(su);++i){
if((su[i]%2) != 0){
if(su[i]>max1){
max1 = su[i];
}
}
}
cnt2++;
}
printf("一番大きい奇数は>%d" , max1);
}
初心者・・・なので大目にみていただければ・・・。
571ポイント を手に入れた。
|
|
|
|
|
Name: 御津凪 [URL] ..上級者(20,872ポイント)
Date: 2008/10/01(水) 14:08
No:21886
|
|
Title: Re:どうしていいのか解りません
|
|
scanf() に指定されている"%d"は、入力した文字列を数値に変換して変数に格納します。
変数 su は文字列なのでこれは間違いです。(正しい値が入りません)
int型の変数のポインタを渡し、後は数値として比較、処理すれば問題ないでしょう。
64ポイント を手に入れた。
|
|
|
|
|
Name: Mist ..上級者(23,845ポイント)
Date: 2008/10/01(水) 14:52
No:21889
|
|
Title: Re:どうしていいのか解りません
|
|
> ということはscanfで未入力エラーの対処は不可能と言うことでしょうか?;
scanfを使って一文字ずつ取得すれば出来るかと。
getchar使うのとなんら変わらなくなってしまいますが(^^;
御津凪さんのを改造(入力部分のみ)
moji = 0; // 初期化
printf("%d回目の入力をしなさい" , cnt+1);
while(1){
scanf("%c", &str[moji]);
if(str[moji] == '\n'){
str[moji] = '\0'; // 安全に処理するために NULL 文字に置き換え
break;
}
moji++;
// ここに入力文字数が127文字以下になるチェック入れたほうがいいよ
}
> このようにやってみましたが、やはり未入力の時は「抜けた」と出ず
> 終了せず、入力を待ちます。
いや、だからscanfが終了してないってことがわかるでしょ、って意味なんですが(^^;
http://wisdom.sakura.ne.jp/programming/c/c58.html
ここ読んでscanfの使い方について勉強してください。
中途半端な知識で課題を解決しようとしても余計に時間を食うだけだと思います。
265ポイント を落としてしまった。
|
|
|
|
|
Name: Sora ..かけだし(2,143ポイント)
Date: 2008/10/10(金) 13:11
No:22238
|
|
Title: Re:どうしていいのか解りません
|
|
あれから自分なりに工夫して考えてみたんですが、
2つ目の(未入力エラーと数値以外を省くエラー)プログラムがうまくいきません。
未入力も数値も何でもかんでも省いてしまう状態です。
getcharのようにscanf関数を使うと正しく奇数が出力されなくなり
エラー処理をくっつけると省いてしまう・・という感じです。
眺めてみたり、printfデバック、もやってみたのですが。。。。
未熟者ですがご指南いただければと思います。
#include<stdio.h> /*stdio.hをインクルードする*/
#include<string.h> /*string.hをインクルードする*/
#include<ctype.h> /*ctype.hをインクルードする*/
int main(){ /*メインクラス*/
int cnt=0,max1=0,cnt2=0,i=0,swich=0,soe=0; /*int型宣言*/
char str[128],max[128],su[128]; /*char型で宣言*/
while(cnt<10){
soe=0;
printf("%d回目の入力をしなさい" , cnt+1);
while(1){
scanf("%c" , &str[soe]);
if(str[soe] == '\n'){
str[soe] = '\0';
break;
}
soe++;
}
if(soe>=127){
printf("入力文字数をオーバーしています。\nもう一度入力してください。\n\n");
continue;
}
if(str[0] == '\0'){
printf("もう一度入力して下さい。\n\n");
continue;
}
if(strcmp(str , max) > 0){
strcpy(max , str);
}
cnt++;
}
printf("一番大きいのは%s\n" , max);
printf("数字を10回入力してください。\n");
while(cnt2<10){
i=0;
printf("%d回目の入力をしてください。" , cnt2+1);
/*scanf("%c" , su[i]);*/
while(1){
swich = 0;
scanf("%c" , &su[i]);
if(su[i] == '\n'){
su[i] = '\0';
swich = 2;
break;
}
if(isdigit(su[i])==0){
swich = 1;
break;
}
i++;
}
if(swich == 1){
printf("数値を入力しなおしてください\n");
continue;
}
if(swich == 2){
printf("未入力ですもう一度入力してください。\n");
continue;
}
for(i=0;i<strlen(su);++i){
if((su[i]%2) != 0){
if(su[i]>max1){
max1 = su[i];
}
}
}
cnt2++;
}
printf("一番大きい奇数は>%d" , max1);
rewind(stdin); /**/
getchar();
}
532ポイント を手に入れた。
|
|
|
|
|
Name: 御津凪 [URL] ..上級者(22,668ポイント)
Date: 2008/10/10(金) 13:21
No:22240
|
|
Title: Re:どうしていいのか解りません
|
|
while 文を抜ける時、swich が必ず 1 か 2 になるのが問題です。
正しく動作するには、未入力チェックを行っているところで、
if(swich == 2 && i == 0){
printf("未入力ですもう一度入力してください。\n");
continue;
}
と赤字部分を追加すると、正しく入力判定が出来るはずです。
これは i の値が 0 なら未入力だと判定しています。
(i が 1 以上なら何か入力されているため)
110ポイント を落としてしまった。
|
|
|
|
|
Name: Sora ..かけだし(1,813ポイント)
Date: 2008/10/10(金) 13:53
No:22241
|
|
Title: Re:どうしていいのか解りません
|
|
早速直してみたところ数値のみ読み取りました!
が・・・
あと問題点が2つありまして(2つ目のプログラムで)
・例えば「qqq」と入力すると
数値を入力しなおしてください
1回目の入力をしてください。数値を入力しなおしてください。
1回目の入力をしてください。数値を入力しなおしてください。
1回目の入力をしてください。未入力ですもう一度入力してください
1回目の入力をしてください>
このような感じで緑色の部分が入力した文字-1の回数出力される事
緑〜赤字の部分が不要なこと。
・数値を入力していっても
(例)
5・9・999・999・100・1・1・555・999・5
と入力した場合、結果は999になるはずが57と入力すらしていない数値になることです。
これはscanf関数をgetcharの用に使い出してからのエラーでいまいち?です。
もう少し調べて練ってみます。
330ポイント を落としてしまった。
|
|
|
|
|
Name: 御津凪 [URL] ..上級者(22,813ポイント)
Date: 2008/10/10(金) 14:12
No:22243
|
|
Title: Re:どうしていいのか解りません
|
|
一つ目の問題は、scanf で全ての文字を読み取っていないのが原因です。
getchar 関数に差し替えても同様の問題が発生します。
対処するには、いったん全て('\n'まで)の文字を読み取った後、
読み取った文字列が数値かどうかチェックします。
二つ目の問題で出ている「57」とは、'9'という文字のコード値です。
つまり、文字列で読み込んでいるので、数値に変換する必要があります。
変換方法はいくつかありますが、手っ取り早い方法で、 atol 関数で変換できます。
上の方でも書きましたが、scanf に"%d"を指定することでも数値を格納できます。
が、入力によっては最後まで読み込まない可能性がありますので、
いくつか書き加える部分が出てきます。
145ポイント を手に入れた。
|
|
|
|
Name: 匿名 ..かけだし(1,085ポイント)
Date: 2008/10/09(木) 15:57
No:22188
|
|
Title: GIFアニメの描画ってどうやるんでしたっけ?
|
|
GIFアニメの描画をしたいんですがサンプルプログラムがうまくいかなかったので誰かサンプルプログラムを書いてくれますか?
30ポイント を手に入れた。
|
|
|
|
Name: レッツ ..ぴよぴよ(404ポイント)
Date: 2008/10/09(木) 17:32
No:22191
|
|
Title: Re:GIFアニメの描画ってどうやるんでしたっけ?
|
|
どのサンプルプログラムがうまくいかなかったのですか?
どこに描画したいんですか?
何を使って描画したいんですか?
全然わからないですよ、それだけじゃ。
71ポイント を落としてしまった。
|
|
|
|
|
Name: 組木紙織 ..熟練のプログラマー(62,132ポイント)
Date: 2008/10/09(木) 22:11
No:22214
|
|
Title: Re:GIFアニメの描画ってどうやるんでしたっけ?
|
|
GIFの仕様って公開されてたかな。
もし公開されてたら、少し面倒だけど、フルスクラッチもありだと思う。
それか、自分でライブラリを探してくるとか。
探せばすぐ見つかると思います。
94ポイント を手に入れた。
|
|
|
|
|
Name: 組木紙織 ..熟練のプログラマー(62,208ポイント)
Date: 2008/10/10(金) 05:48
No:22230
|
|
Title: Re:GIFアニメの描画ってどうやるんでしたっけ?
|
|
GIFの規格見てみると、解凍アルゴリズムを実装する必要がありそうです。
自分で実装はつらいかな。
内容見てないけど、それっぽいの見つけました。
ttp://www.codeproject.com/KB/static/gifanimation.aspx
76ポイント を手に入れた。
|
|
|
|
Name: 管理人 ..伝説なるハッカー(815,263ポイント)
Date: 2008/10/09(木) 18:09
No:22194
|
|
Title: 新しい検索機能の追加
|
|
この掲示板の過去ログ検索は最大で10個までしか対象を選ぶことが出来ず、
またチェックするのも面倒で使いにくいという声がありました。
こちらの掲示板は私の自作ではないため、カスタマイズが出来ないので、
別のページにデータを移し、検索機能をつけました。
http://l.huu.cc/board/log/
新しい過去ログが出来次第、こちらに過去ログデータを移していこうとおもいます。
過去ログが見つかっても1つの過去ログデータが膨大なので、結局Ctrl+Fとかで検索しないといけないんですけどね^^;
186ポイント を手に入れた。
|
|
|
|
Name: array ..プログラマー(32,529ポイント)
Date: 2008/10/09(木) 19:27
No:22197
|
|
Title: Re:新しい検索機能の追加
|
|
おぉーかなり使いやすくなりました。
詳しくは知りませんが、他にNamazuというのスクリプトがあるみたいです、それを使ったら、もっと高速な検索ができたりしませんかね。
56ポイント を手に入れた。
|
|
|
|
|
Name: Justy ..ハッカー(232,914ポイント)
Date: 2008/10/09(木) 20:49
No:22203
|
|
Title: Re:新しい検索機能の追加
|
|
素晴らしいです。
これで過去ログ検索が、かなりやりやすくなりました。
でもホントデータ量が膨大ですね。
使っている検索スクリプトにも依るのでしょうが、
サーバー負荷とか大丈夫なのでしょうか?
|
|
|
|
|
Name: 管理人 ..伝説なるハッカー(815,386ポイント)
Date: 2008/10/09(木) 22:50
No:22220
|
|
Title: Re:新しい検索機能の追加
|
|
もう少し1つの過去ログが少ない方が見易いですね。
1トピごとにファイルわけた方がいいかもしれませんが、
膨大なファイル量になりそうですね^^;
スクリプトは
http://srch.jp/
こちらの使ってます。
サーバーの負荷は自分のサーバーじゃなくて上URLのサーバーにかかってるんじゃないかな〜と思います。
96ポイント を手に入れた。
|
|
|
|
|
Name: kz ..入門者(2,557ポイント)
Date: 2008/10/09(木) 23:15
No:22221
|
|
Title: Re:新しい検索機能の追加
|
|
新過去ログ検索機能の設置お疲れ様です。
早速使って見ました。
検索には時間がかかるものの検索自体がすごくやりやすくなり、とても使いやすいです。
過去ログがたまったら移すのは若干面倒な気がしますね^^;
92ポイント を落としてしまった。
|
|
|
|
|
Name: Justy ..ハッカー(233,192ポイント)
Date: 2008/10/09(木) 23:41
No:22222
|
|
Title: Re:新しい検索機能の追加
|
|
>もう少し1つの過去ログが少ない方が見易いですね
たしかに。
ローカルでの閲覧・検索には丁度いいのかもしれませんが、
サイトでの検索となると1ファイルが大きいので検索したあとのリンクを
飛んでも、どこにあるかをまた検索する必要が出てきますよね。
>サーバーの負荷は自分のサーバーじゃなくて上URLのサーバーにかかってるんじゃないかな〜と思います。
おー、なるほど、そのようですね。
273ポイント を手に入れた。
|
|
|
|
|
Name: ムンバ ..初心者(5,657ポイント)
Date: 2008/10/10(金) 01:03
No:22225
|
|
Title: Re:新しい検索機能の追加
|
|
こんばんはっ!
とっても検索しやすいです。
密かに?覗かせて頂き(検索とかして)参考にさせて頂いてるので
私、個人としましては重宝してます。^^
ありがとうございます。
91ポイント を手に入れた。
|
|
|
|
Name: situmon ..入門者(3,961ポイント)
Date: 2008/10/09(木) 20:21
No:22201
|
|
Title: Angle
|
|
シューティングの館のコードを変えていたら、
enemy_shot.cpp(152) : error C2039: 'Angle' : 'ENEMY_SHOT_t' のメンバではありません。
とでました。なぜですか?
64ポイント を手に入れた。
|
|
|
|
Name: Justy ..ハッカー(232,919ポイント)
Date: 2008/10/09(木) 20:57
No:22204
|
|
Title: Re:Angle
|
|
その日本語のエラーの通りで、ENEMY_SHOT_t型の構造体のメンバに
Angleが定義されていないからです。
ENEMY_SHOT_t型に Angleを定義してあげるか、そもそもメンバ Angleが存在する別の構造体に
アクセスしなければならないところを間違えてアクセスしているか、のどちらかではないでしょうか。
5ポイント を手に入れた。
|
|
|
|
Name: 究極の初心者 ..入門者(3,113ポイント)
Date: 2008/10/09(木) 20:43
No:22202
|
|
Title: 初歩的なビルドエラーだとは思いますが。
|
|
どうも、以前C言語を始めるにあたって、質問をさせていただいた者です。
さっそく、何が悪いのかわからなくなったので、質問させてください。
あまりにも、初歩的すぎることだとは思うのですが・・・・。
まず、あれから、色々と始める準備をし、コンパイラは、ゲームプログラミングの館にお勧めとあった「Visual C++ 2008 Express Edition」を使用しています。
PCがVISTAのため、2008にしました(オススメと書いてあったので・・・)
そのあと、ついでですので、「VisualC++用 DXライブラリ」もダウンロード&セッティングをしました。
試しに、ゲームプログラミングの館にある、以下のようなプログラムを組むと、うまく表示されます
#include "DxLib.h"
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){
ChangeWindowMode( TRUE ) ;//ウィンドウモードに変更する関数
if( DxLib_Init() == -1 ) return -1;//初期化処理する関数
LoadGraphScreen( 0 , 0 , "test1.bmp" , TRUE ) ;//画像を表示する関数
WaitKey() ;//何か入力があるまで待つ関数
DxLib_End() ;//終了処理をする関数
return 0 ;
}
それで、安心して、C言語の基礎を学ぼうと、とあるサイトにあるものを実践していこうと思ったのですが、うまくビルドできません。。。
内容は、以下のようなものです。
#include <stdio.h>
void main(void)
{
printf("0からのC言語\n");
}
初めはただ、スペルミスかと思って、サイトのをコピペしたのですが、それでもエラーが起きます。
サイトが悪いのかと思い、違うサイトで、似たようなコードを入力しても、同じようにエラーが起きます。
何が、いけないんでしょうか・・・・・?
ちなみに、エラー内容は以下のようになっています。
1>------ ビルド開始: プロジェクト: aa, 構成: Debug Win32 ------
1>コンパイルしています...
1>qa.cpp
1>リンクしています...
1>LIBCMTD.lib(wincrt0.obj) : error LNK2019: 未解決の外部シンボル _WinMain@16 が関数 ___tmainCRTStartup で参照されました。
1>C:\*****\***\*******\Visual Studio 2008\Projects\aa\Debug\aa.exe : fatal error LNK1120: 外部参照 1 が未解決です。
1>ビルドログは "file://c:\******\***\*******\Visual Studio 2008\Projects\aa\Debug\BuildLog.htm" に保存されました。
1>aa - エラー 2、警告 0
========== ビルド: 0 正常終了、1 失敗、0 更新不要、0 スキップ ==========
***の部分は、ファイル名で、一応伏せさせて頂きました。
どなたか、わかる方、ご教授の方お願致します。
えと、習う立場で申し訳ないのですが、始めたばかりで無知なので、わかりやすくお願致します。
1,230ポイント を手に入れた。
|
|
|
|
Name: box ..ハッカー(126,396ポイント)
Date: 2008/10/09(木) 21:02
No:22205
|
|
Title: Re:初歩的なビルドエラーだとは思いますが。
|
|
>1>LIBCMTD.lib(wincrt0.obj) : error LNK2019: 未解決の外部シンボル _WinMain@16 が関数 ___tmainCRTStartup で参照されました。
コンソール・アプリケーションを作成しようとしているのに、
コンパイル・オプションがWindowsアプリケーション用であるため
だと思います。
93ポイント を手に入れた。
|
|
|
|
|
Name: 究極の初心者 ..入門者(3,274ポイント)
Date: 2008/10/09(木) 21:23
No:22208
| 解決!
|
Title: ありがとうございます!
|
|
>Boxさん
お答え、ありがとうございます。
アプリケーションが違かったのですね・・・。
教えていただいたとおり、コンソール・アプリケーションにしたら、うまく実行されました。
ようやく、次に進めます。
本当にありがとうございました。
一応、メインの質問は解決しましたので、解決マークをつけさえて頂きますが、こうなるとコンソール・アプリケーションと、Windowsアプリケーションって、使う用途が違うということですよね?
えー・・・そういう箇所って、参考書や、サイトには載ってないみたいなので、こっそり教えて頂けるとありがたいです^^;
簡潔でいいので・・・。
161ポイント を手に入れた。
|
|
|
|
|
Name: Mist ..プログラマー(27,330ポイント)
Date: 2008/10/09(木) 21:30
No:22210
|
|
Title: Re:初歩的なビルドエラーだとは思いますが。
|
|
アプリケーションは大きく分けてWindowsアプリケーションとコンソールアプリケーションに分かれます。
Windowsアプリケーションは、実行するとWindowsが表示されてその中に文字や画像などさまざまなものが
表示したり操作したり出来るソフトです。
一方、コンソールアプリケーションはコマンドライン上から実行できるソフトで、基本的に文字やデータ
の入出力しか出来ません。
Windowsでは、WindowsアプリケーションはWinMain関数から開始し、コンソールアプリケーションは
main関数から開始すると決まっています。
Visual Studioでは、このどちらを選択するかはプロジェクトを作成する段階で決定します。
サンプルプロジェクトは、全てWindowsアプリケーションで作成されているため、main関数から始まる
コンソールアプリケーションのソースに書き換えてもコンパイルに失敗します。
コンソールアプリケーション用プロジェクトの作り方
VC++2008EEを起動
ファイル→新規作成→プロジェクトを選択
Win32コンソールアプリケーションを選択してOKを押す(プロジェクト名などは適当に)
次へを選択
追加のオプションで空のプロジェクトをチェックしてから完了を選択
新規作成→ファイルを選択
CPPファイルを選んで開くを選択
開いたファイルにソースコードを書いてください
117ポイント を手に入れた。
|
|
|
|
|
Name: 究極の初心者 ..入門者(3,430ポイント)
Date: 2008/10/09(木) 22:04
No:22213
|
|
Title: お答えありがとうございます!
|
|
>Mistさん
お答えありがとうございます。
関数が違うんですね。
未だに、ああ、そういうこと?っというような、明確な理解はありませんが、初心者ながら少しは理解できました。
コンソールアプリケーションとWindowsアプリケーションの違いも知りたかったので、御答はすごく参考になりました。
ありがとうございます。
今後も、何かありましたら、よろしくお願致します。
156ポイント を手に入れた。
|
|
|
|
Name: 紅葉 ..ぴよぴよ(729ポイント)
Date: 2008/10/08(水) 19:15
No:22155
|
|
Title: Xファイルを使ったアニメーション
|
|
学校で使用しているライブラリで3Dゲームを作り
モデルをアニメーションさせたいと考えています。
Xファイルの描画まではできるのですが2Dのようなアニメーションの仕方がわかりません。
いろいろ調べてみるとXファイル作成時にアニメーションのキーフレームを作るみたいなことがありました。
使用しているソフトは
VisualStadio2005
3dsMax
モデルをアニメーションを取得する方法を教えていただけないでしょうか?
よろしくお願いします。
191ポイント を手に入れた。
|
|
|
|
Name: 御津凪 [URL] ..上級者(22,526ポイント)
Date: 2008/10/09(木) 12:13
No:22178
|
|
Title: Re:Xファイルを使ったアニメーション
|
|
Xファイルへの書き出しでアニメーション(モーション)を出力することで、
Xファイルにアニメーション情報を書き出すことが出来ます。
単純な平行移動や回転ならばプログラム上で処理するだけで事足りますが、
複雑なモーションは3dsMax側で作って、それを再生することになりますね。
> 学校で使用しているライブラリ
とのことですが、ライブラリが3Dモデルのアニメーション再生に対応しているのであれば、
アニメーション情報が入ったXファイルを読み込んで処理すれば難しいことはないと思います。
もし、そのライブラリが対応していない(自分で一からアニメーション処理をしなくてはならない)場合は、
はっきり言って難しいです。
172ポイント を手に入れた。
|
|
|
|
|
Name: 紅葉 ..ぴよぴよ(82ポイント)
Date: 2008/10/09(木) 18:14
No:22195
|
|
Title: Re:Xファイルを使ったアニメーション
|
|
ライブラリではxファイルの読み込みはできるのですがアニメはしません。
また保存方法についても分かりません><
質問ばかりで申し訳ないのですが教えていただけないでしょうか?
82ポイント を手に入れた。
|
|
|
|
|
Name: 御津凪 [URL] ..上級者(22,668ポイント)
Date: 2008/10/09(木) 19:50
No:22198
|
|
Title: Re:Xファイルを使ったアニメーション
|
|
> ライブラリではxファイルの読み込みはできるのですがアニメはしません。
ライブラリにはアニメーションさせるための関数が存在しない、ということでしょうか。
単純に描画するだけではアニメーションしません。
ライブラリの機能によりますが、基本はアニメーション情報を読み込み、それをモデルに適用させて、
アニメーションを再生する、という形になるかと思います。
> また保存方法についても分かりません><
私はMaxを持っていませんが、持ってる同僚に確認してみましたところ、
どうやらMax単体ではXファイルを作ることが出来ないようです。
Xファイルを出力するMax用プラグインを探す必要がありますね。
142ポイント を手に入れた。
|
|
|
|
|
Name: 御津凪 [URL] ..上級者(22,778ポイント)
Date: 2008/10/09(木) 19:58
No:22199
|
|
Title: Re:Xファイルを使ったアニメーション
|
|
追加補足です。
Xファイルは汎用的に扱えるようなフォーマットですが、逆に使いづらかったせいか、
DirectX10ではXファイルをサポートされていません。
また、Xファイルの書き出しプラグインも不完全なところがあったり、
かゆいところに手が届かなかったりすると思います。
難しいかもしれませんが、独自形式でのモデル・モーションの作成も一つの道でしょう。
110ポイント を手に入れた。
|
|
|
|
Name: 匿名 ..かけだし(1,031ポイント)
Date: 2008/10/08(水) 17:03
No:22152
|
|
Title: 自作関数って配列みたいにできますか?
|
|
50ぐらいあるキャラの技の処理を自作関数にやらせるとしましょう
int a(void)
{
}
int b(void)
{
}
int c(void)
{
}
switch (a) {
case 1:
a();
break;
case 2:
b();
break;
case 3:
c();
break;
}
これってムダがありすぎますよね
配列見たいに
a[a]();
とかできませんかね?
もしくは
a();=b();
みたいなかんじで中身を移すとか
switch (a) {
case 1:
int a(void)
{
aaaaaaa
}
break;
case 2:
int a(void)
{
bbbbbbb
}
break;
case 3:
int a(void)
{
ccccccc
}
break;
}
a();
とかでもいいんですけど
なにか短くする方法はありませんか?
351ポイント を手に入れた。
|
|
|
|
Name: 匿名 ..かけだし(1,055ポイント)
Date: 2008/10/09(木) 15:54
No:22187
| 解決!
|
Title: Re:自作関数って配列みたいにできますか?
|
|
ちょっと慣れが必要ですが多分うまくいくと思います。どうもありがとうございます。
24ポイント を手に入れた。
|
|
|
|
Name: 黒 ..ぴよぴよ(799ポイント)
Date: 2008/10/08(水) 19:19
No:22156
|
|
Title: LANを使ったオンラインゲーム
|
|
公開されていないLAN(イントラネット)を使いオンラインゲームを作ろうと考えています。
そのような場合はどのように作成すればいいのでしょうか?
お互いに起動時に相手のIPアドレスを入れて通信が確立したら
お互いのデータを送りあうということを考えています。
オンラインでやるにはWindowsSocketというものを使うと書いてあったのですが
あっているのでしょうか?
106ポイント を手に入れた。
|
|
|
|
Name: situmon ..入門者(3,897ポイント)
Date: 2008/10/08(水) 17:04
No:22153
| 解決!
|
Title: Re:描画関数など
|
|
メールでのように、弾の描画に
シューティングの館のコードでDrawGraph関数を使いたいのです。
でもまず見てみます。
78ポイント を手に入れた。
|
|
|
|
Name: 七誌 ..ぴよぴよ(651ポイント)
Date: 2008/10/08(水) 00:19
No:22132
|
|
Title: 分割コンパイルについて
|
|
分割コンパイルを勉強したく、ためしに作ってみているのですが、
どうにもうまくいかないところがあったので、質問させてもらいました。
分割コンパイルを使ってプログラムを作るときに、グローバル変数を使いのですが
それぞれのソースファイルで変数を共有することができません。
ヘッダファイルを用意し、そこで定義してそれぞれのソースファイルでインクルード
してみたのですが、「変数はすでに定義されています」というエラーがでてしまいました。
インクルードガードという方法を試してみたのですが、うまくいきません。
対処法を教えていただけないでしょうか。
実際に動かしてみたプログラムは下のものです。
具体的には、aという変数をmain.cppとsub.cppの両方で使う方法を知りたいということです。
よろしくおねがいします。
// main.cpp
#include "stdio.h"
#include "ren.h"
int main (){
printf ("%d\n", a);
sub();
return 0;
}
// sub.cpp
#include "stdio.h"
#include "ren.h"
void sub () {
printf ("sub %d\n",a);
}
// ren.h
#ifndef REN_H
#define REN_H
int a;
void sub();
#endif
393ポイント を手に入れた。
|
|
|
|
Name: array ..プログラマー(31,724ポイント)
Date: 2008/10/08(水) 06:46
No:22136
|
|
Title: Re:分割コンパイルについて
|
|
多分、#ifndef REN_Hが機能されてないからではないでしょうか、main.cppにの0行目に#define REN_H
を入れたらどうでしょうか。
(別解)----------------------------------------------
龍神録を参考にするなら
// main.cpp
#define _GLOBAL_INSTANCE_
#include "ren.h"
int main (){
printf ("%d\n", a);
sub();
return 0;
}
// sub.cpp
#include "ren.h"
void sub () {
printf ("sub %d\n",a);
}
// ren.h
#include "stdio.h"
#ifdef _GLOBAL_INSTANCE_
#define GLOBAL
#else
#define GLOBAL extern
#endif
GLOBAL int a;
GLOBAL void sub();
で大丈夫だと思います。
2倍のポイントを手に入れた! 504ポイント を手に入れた。
|
|
|
|
|
Name: 御津凪 [URL] ..上級者(22,190ポイント)
Date: 2008/10/08(水) 10:26
No:22138
|
|
Title: Re:分割コンパイルについて
|
|
> array さん
extern の説明をしていないのですが大丈夫でしょうか。
extern は、外部に変数や関数を間接的に用意させる(あると仮定する)ものです。
実体は定義されていないので、どこかで一つだけ実体を定義する必要があります。
下記は私なりの別解です。
// main.cpp
#include "ren.h"
int main (){
printf ("%d\n", a);
sub();
return 0;
}
// sub.cpp
#include "ren.h"
void sub () {
printf ("sub %d\n",a);
}
// grobal.cpp ← グローバル変数定義用
#include "ren.h"
int a;
// ren.h
#include "stdio.h"
extern int a;
extern void sub();
グローバル変数定義用に grobal.cpp を用意して、
そこで a を定義しています。
273ポイント を手に入れた。
|
|
|
|
|
Name: 七誌 ..ぴよぴよ(790ポイント)
Date: 2008/10/08(水) 20:17
No:22159
|
|
Title: Re:分割コンパイルについて
|
|
arrayさん御津凪さん、ありがとうございます。
externを使えばよかったんですね。無事動かすことができました。
ところで、自分が使ったインクルードガードの方法ですが、この使い方は間違っているのでしょうか?
arrayさんが言う、#defineが機能していない、というのが少し気になったのですが、
よろしければ詳しく教えていただけないでしょうか。
139ポイント を手に入れた。
|
|
|
|
|
Name: Mist ..プログラマー(26,894ポイント)
Date: 2008/10/08(水) 20:36
No:22162
|
|
Title: Re:分割コンパイルについて
|
|
インクルードガードの宣言の仕方はあっています。
arrayさんのはグローバル変数が多重定義されないための方法ですが、
七誌さんの方法は以下のような場合に使います。
a.h
struct hoge {
int hogehoge;
};
b.h
#include "a.h"
c.h
#include "a.h"
d.c
#include "b.h"
#include "c.h"
この場合、d.cのコンパイル時struct hogeが2回定義されるため多重定義としてエラーになります。
この時、a.hを七誌さんのやり方でインクルードガードすると、c.hの中でインクルードされている
a.hはスキップされるのでエラーにならなくなります。
293ポイント を手に入れた。
|
|
|
|
|
Name: 七誌 ..ぴよぴよ(841ポイント)
Date: 2008/10/08(水) 21:57
No:22165
| 解決!
|
Title: Re:分割コンパイルについて
|
|
一つのソースファイルが同じファイルをインクルードするのを防ぐ方法だったんですね。
よくわかりました。
Mistさん、ありがとうございました。
51ポイント を手に入れた。
|
|
|
|
Name: フロン ..ぴよぴよ(7ポイント)
Date: 2008/10/08(水) 10:40
No:22139
|
|
Title: 13章の敵に弾を撃たせるについて
|
|
初めて投稿します。13章の敵に弾を撃たせるところで、enemy.cppの中でenter_shotという関数を呼んでますが、この関数の中身はどこに書いてありますか?これがないと、関数のつながりが分かりにくいので回答お願いします。
7ポイント を手に入れた。
|
|
|
|
Name: toyo ..上級者(19,200ポイント)
Date: 2008/10/08(水) 10:54
No:22140
|
|
Title: Re:13章の敵に弾を撃たせるについて
|
|
Visual C++なら関数名のところで右クリック->「定義へ移動」でその関数へ移動できますよ。
24ポイント を落としてしまった。
|
|
|
|
|
Name: フロン ..ぴよぴよ(115ポイント)
Date: 2008/10/08(水) 11:28
No:22142
|
|
Title: Re:13章の敵に弾を撃たせるについて
|
|
言葉足らずですいません。
現在、各章を読みながら、サンプル通りに動かしているのですが、enter_shot関数をはじめ、記載されていないコードがいくつかあるようで、次の章に進めないのです。
自分でも頑張ってみます
すばやい回答、ありがとうございます。
108ポイント を手に入れた。
|
|
|
|
|
Name: フロン ..ぴよぴよ(182ポイント)
Date: 2008/10/08(水) 12:39
No:22144
|
|
Title: Re:13章の敵に弾を撃たせるについて
|
|
ダウンロードしたプロジェクトは、まっさらな状態でした。「この章までのプロジェクトを一括ダウンロード」
も試しましたが、こちらも同様です。 管理人の方のUPを待つしかないようですね。
ありがとうございました。引き続き頑張ってみます。
67ポイント を手に入れた。
|
|
|
|
|
Name: toyo ..上級者(19,398ポイント)
Date: 2008/10/08(水) 12:52
No:22145
|
|
Title: Re:13章の敵に弾を撃たせるについて
|
|
ダウンロードしなおしてみましたがちゃんと入ってますよ
おかしいですね
とりあえず
void enter_shot(int i){
int j;
for(j=0;j<SHOT_MAX;j++){//フラグのたって無いenemyを探す
if(shot[j].flag==0){//未使用の弾幕データがあれば
memset(&shot[j],0,sizeof(shot_t));//初期化して登録
shot[j].flag=1;//フラグをたてる
shot[j].knd=enemy[i].blknd;//弾の種類
shot[j].num=i;//num=どの敵から発射されたものか。
shot[j].cnt=0;
return ;
}
}
}
187ポイント を手に入れた。
|
|
|
|
|
Name: フロン ..ぴよぴよ(244ポイント)
Date: 2008/10/08(水) 17:03
No:22151
| 解決!
|
Title: 解決しました
|
|
解決しました。?章のフォルダはそういう意味だったんですね。
つまらないことで、お騒がせしてすみません。
ありがとうございました。
62ポイント を手に入れた。
|
|
|
|
Name: tt ..ぴよぴよ(42ポイント)
Date: 2008/10/05(日) 20:25
No:22068
|
|
Title: VCでの新規作成について
|
|
DxLib_VCのサンプル実行用フォルダからすでに作られているプロジェクトを利用して作ることはできましたが、自分で新規プロジェクトとして作る場合、プロジェクトの種類などはどうしたらよいでしょうか?
42ポイント を手に入れた。
|
|
|
|
Name: tt ..ぴよぴよ(150ポイント)
Date: 2008/10/06(月) 08:42
No:22090
|
|
Title: Re:VCでの新規作成について
|
|
Win32プロジェクトでできました。
ただ、
LINK : warning LNK4098: defaultlib "LIBCMTD" は他のライブラリの使用と競合しています; /NODEFAULTLIB:library を使用してください
という警告が出てしまうのですが、これは何が原因なのでしょうか?
108ポイント を手に入れた。
|
|
|
|
|
Name: Justy ..ハッカー(232,665ポイント)
Date: 2008/10/06(月) 09:14
No:22095
|
|
Title: Re:VCでの新規作成について
|
|
>という警告が出てしまうのですが、これは何が原因なのでしょうか?
ランタイムの種類が異なるものが混在しているという警告ですね。
多分以下のような手順で直ると思います。
1 プロジェクトのプロパティを開きます。
2 プロパティ上部にある構成が Debugにであることを確認します。
Debugでなければ Debugに変更して下さい。
3 構成プロパティ」の「C/C++」の「コード生成」の中に「ランタイムライブラリ」というのが
あるので、そこをマルチスレッドデバッグ DLL(MDd)から マルチスレッドデバッグ(MTd)に
切り替えます。
4 プロパティ上部にある構成を Relaseに切り替えます。
5 2と同じところをマルチスレッド DLL(MD)からマルチスレッド (MT)に切り替えます。
試してみて下さい。
305ポイント を手に入れた。
|
|
|
|
|
Name: tt ..ぴよぴよ(178ポイント)
Date: 2008/10/07(火) 22:44
No:22129
| 解決!
|
Title: Re:VCでの新規作成について
|
|
直りました。
justyさんありがとうございました。
28ポイント を手に入れた。
|
|
|
|
Name: 七誌 ..ぴよぴよ(63ポイント)
Date: 2008/10/05(日) 22:03
No:22076
|
|
Title: .slnのファイルが開けません
|
|
「ファイル名.sln」のファイルが開けません。
ダブルクリックしても「選択したされたファイルはVisualStudioのソリューションではありません」
とエラーが出てしまいます。
63ポイント を手に入れた。
|
|
|
|
Name: Justy ..ハッカー(231,413ポイント)
Date: 2008/10/05(日) 22:20
No:22078
|
|
Title: Re:.slnのファイルが開けません
|
|
インストールされている VisualStudioより、開こうとしているソリューションファイルが作成された
VisualStudioのバージョンが新しい、ということはないでしょうか。
A インストールされている VisualStudioのバージョン
B *.slnをテキストエディタで開き、先頭行の
Microsoft Visual Studio Solution File, Format Version X.XX
の X.XXの部分のバージョンの部分がいくつになっているか
7.00 Visual Studio .NET
8.00 Visual Studio .NET 2003
9.00 Visual Studio 2005
10.00 Visual Studio 2008
これでAよりBが新しいと、そのままでは開けず上記のようなエラーになることは
考えられますが、いかがでしょうか。
341ポイント を手に入れた。
|
|
|
|
|
Name: 七誌 ..ぴよぴよ(99ポイント)
Date: 2008/10/06(月) 08:08
No:22089
|
|
Title: Re:.slnのファイルが開けません
|
|
返信ありがとうございます。その通りでした。
開きたいファイルはVersion9.00で作成されたもので、
自分の持っているVCは6.00でした。
このような場合、VCのVersionをあげない限り、
ファイルの中身を見ることは不可能なのでしょうか?
36ポイント を手に入れた。
|
|
|
|
|
Name: Justy ..ハッカー(232,360ポイント)
Date: 2008/10/06(月) 09:00
No:22094
|
|
Title: Re:.slnのファイルが開けません
|
|
>開きたいファイルはVersion9.00で作成されたもので、
>自分の持っているVCは6.00でした。
ファイルの方が 9.0ということは slnが作られたのは Visual Studio2005で
インストールされているのが Visual C++ 6.0ということですね。
>このような場合、VCのVersionをあげない限り、
>ファイルの中身を見ることは不可能なのでしょうか?
そのプロジェクトに dswファイルは付いていませんでしたか?
あれば、そちらが Visual C++ 6.0用のプロジェクトファイルとなります。
もしそんなファイルは無い、ということになると
一世代くらいならプロジェクトコンバータがあったりするのですが
Visual C++ 2005から 6.0となると差が大きいので、とりあえず
新規でプロジェクトを作った方が早いかと。
77ポイント を手に入れた。
|
|
|
|
|
Name: 七誌 ..ぴよぴよ(180ポイント)
Date: 2008/10/06(月) 17:25
No:22108
|
|
Title: Re:.slnのファイルが開けません
|
|
バグさん、justyさん、ありがとうございます。
開きたかったファイルは配布されていた「FinalStory」のものだったのですが、
dswのファイルはついていなかったので断念しました。
教えていただきありがとうございました。
81ポイント を手に入れた。
|
|
|
|
|
Name: 七誌 ..ぴよぴよ(202ポイント)
Date: 2008/10/06(月) 17:39
No:22111
| 解決!
|
Title: Re:.slnのファイルが開けません
|
|
解決付け忘れました。
失礼しました。
22ポイント を手に入れた。
|
|
|
|
|
Name: 管理人 [URL] ..伝説なるハッカー(814,575ポイント)
Date: 2008/10/06(月) 17:43
No:22112
|
|
Title: Re:.slnのファイルが開けません
|
|
FinalStoryのフォルダ構造は見てすぐわかると思いますが、
ソースファイルは
dat/sorce
の中にあります(ここにも誤字が(汗))
DXライブラリのヘッダファイルはincludeフォルダにありますから、
これをお作りになったプロジェクトの
ソリューションエクスプローラーなどにドロップするだけでいいと思います。
プロジェクトを作るのが面倒だったりよくわからない場合は
DXライブラリをダウンロードしたときについてくるサンプル実行用フォルダのプロジェクトをお使いになってはいかがでしょうか。
241ポイント を手に入れた。
|
|
|
|
|
Name: Justy ..ハッカー(232,914ポイント)
Date: 2008/10/06(月) 18:59
No:22116
|
|
Title: Re:.slnのファイルが開けません
|
|
>開きたかったファイルは配布されていた「FinalStory」のものだったのですが、
何故それをもっと早く言わない!(w
とりあえず。
うちには Visual C++ 6.0がないのでうまく動くか保証も確認もできませんが、
「なんちゃって dspファイル」を作ってみました。
*.slnがある同じディレクトリに入れて、Visual C++ 6.0から開いてみて下さい。
・・・うまくいかなかったら、諦めて新規に作って戴く、ということで。
249ポイント を手に入れた。
|
|
|
|
|
Name: 七誌 ..ぴよぴよ(258ポイント)
Date: 2008/10/07(火) 16:32
No:22123
| 解決!
|
Title: Re:.slnのファイルが開けません
|
|
管理人さん、justyさん、ありがとうございました。
justyさんのファイルで開くことができました。
最初に言うべきでした。すみません。
とても助かりました。ありがとうございます。
56ポイント を手に入れた。
|
|
|
|
Name: kAit ..ぴよぴよ(25ポイント)
Date: 2008/10/06(月) 22:14
No:22118
|
|
Title: 無題
|
|
はじめまして、いきなりですが質問です
Dxlibや、DirectXなどを使わずC++で画像の半透明化をしたいのですが何か方法はありませんでしょうか?
25ポイント を手に入れた。
|
|
|
|
Name: バグ ..ハッカー(115,085ポイント)
Date: 2008/10/06(月) 22:40
No:22120
|
|
Title: Re:無題
|
|
画像ファイルの形式がBitmapで、なおかつWin32APIを使用してもよいのならば、Bitblt関数が使えると思います。
何も使わないというのであれば、画像の保存形式によりますね。どのように色情報が格納されているのかが理解できているのならば、さほど難しくはないかと思われます。
72ポイント を手に入れた。
|
|
|
|
Name: 御津凪 [URL] ..上級者(21,693ポイント)
Date: 2008/10/05(日) 15:56
No:22058
|
|
Title: ビット演算の使い方
|
|
雑談的な質問です。
初心者の方は知らないかと思いますが、
大体のプログラミング言語にはビット演算というものがあります。
( << , >> , & , | , ^ , ~ など)
皆さんはこれらを使用していますでしょうか?
(またはどのようなところで使用していますでしょうか?)
ビット演算は奥が深いもので、
フラグを立てる用途から2の倍数の乗除、
データの暗号化やハッシュ値生成など、意外と幅広い所で使われています。
どのように使っているか、というのが質問なのですが、
ここは初心者のための掲示板ですので、
出来ればわかるような説明が望ましいかもしれません。
私は、使えるところはバリバリ使う方です。
たとえば、ゲームに関連する処理で、ボタンの入力状態を返す時、
// ボタンを押した瞬間かどうかのフラグを返す
int ispush( int now, int prev ){return ((prev | now) ^ prev);}
// ボタンを押している間かどうかのフラグを返す
int ispress( int now, int prev ){return (now & prev);}
// ボタンを離した瞬間かどうかのフラグを返す
int ispull( int now, int prev ){return ((now | prev) ^ now);}
// ボタンを押していない間かどうかのフラグを返す
int isfree( int now, int prev ){return ~(prev | now);}
このようにしています。(ビット演算初見の方は 何じゃこりゃ!? と思いますね^^;)
これは int 値に入っているフラグをまとめて処理できるのでオススメです。
(DXライブラリのGetJoypadInputState()に使えると思います)
処理の意味を分かりやすくするため、
上記の関数をボタン一個に対しての判定に置き換えた場合も書いておきます。
// 押されている = 1 、押されていない = 0 とした場合
// ボタンを押した瞬間かどうかを返す
int ispush( int now, int prev ){return (now != 0) && (prev == 0);}
// ボタンを押している間かどうかを返す
int ispress( int now, int prev ){return (now != 0) && (prev != 0);}
// ボタンを離した瞬間かどうかを返す
int ispull( int now, int prev ){return (now == 0) && (prev != 0);}
// ボタンを押していない間かどうかを返す
int isfree( int now, int prev ){return (now == 0) && (prev == 0);}
という感じになります。
413ポイント を手に入れた。
|
|
|
|
Name: たかぎ [URL] ..熟練のプログラマー(61,196ポイント)
Date: 2008/10/05(日) 16:06
No:22061
|
|
Title: Re:ビット演算の使い方
|
|
I/Oポートなど、ハードウェアを制御するときには普通に使います。
例えば、制御レジスタP0に、16ビットのI/Oポート(P00〜P0F)が割り付けられている場合、
extern volatile unsigned short P0;
P0 |= 1 << 3;
とすれば、P03に1を出力できますし、逆に、
P0 &= ~(1 << 3);
とすれば、P03に0を出力できます。
他にも、CPUの状態(割り込み禁止やキャッシュなど)の制御や、周辺デバイスの制御を行うには必須です。
この手の分野に関わったことがない人にはさっぱり分からないかもしれませんが、これは初心者〜初級者レベルの内容です。
200ポイント を手に入れた。
|
|
|
|
|
Name: 管理人 [URL] ..伝説なるハッカー(813,486ポイント)
Date: 2008/10/06(月) 10:47
No:22099
|
|
Title: Re:ビット演算の使い方
|
|
私はマップチップのブロックみたいな情報によく使います。
上は進入可
下は進入不可
みたいな情報が4方向必要だったりすることがあるのですが、
その時は構造体でいちいち用意するのも勿体無いので各ビットを使います。
後はぷよ○よを作るとき、どちら方向にくっついているかという情報を格納するのにも使いました。
後、容量を小さくしたいとき、例えばリプレイデータなんかを使う時は
BYTE型でオンオフ情報をいれてたんじゃ勿体無いので、これもビットでやっています。
リプレイデータはほとんどが0で埋まると言う勿体無い構造をしてるので、きっとここで0を圧縮すると
いいと思うのですが、まだ龍神録では未実装です。
・・次回作では頑張ってみようと思ってますっ。
まぁ私もかなり使う方です。
JAVA使ってる友達がJAVAだと途端にビットシフト使わなくなったといってますが、そうなんですかね〜?
224ポイント を手に入れた。
|
|
|
|
|
Name: 御津凪 [URL] ..上級者(21,917ポイント)
Date: 2008/10/06(月) 13:04
No:22103
|
|
Title: Re:ビット演算の使い方
|
|
> たかぎさん
ハードウェアの制御のほとんどはビット演算しやすい構造ですよね。
何かしら2の乗数に関連していますし。
> 管理人さん
Javaはクラスなどの構造体のサイズを意識することなく組める上、
フラグへのアクセスがプロパティとしてアクセスする形になっているので、
ビットシフトを使うとかえって見づらくなるからでしょうか。
(デザインパターンに合わないとか)
そういえば、 ^(XOR) を使った簡易暗号化というものがありましたね。
void crypt( const unsigned char* src, unsigned char* dest, int count, unsigned char seed ){
int i;
for(i = 0;i < count;++i){
dest[i] = src[i] ^ seed;
}
}
暗号化するデータに 一定の値で XOR 演算するという簡単なものですが、
復号化するのもまったく同じ演算で元に戻るという性質を利用しています。
258ポイント を落としてしまった。
|
|
|
|
|
Name: ひよっこ ..ぴよぴよ(27ポイント)
Date: 2008/10/06(月) 22:18
No:22119
|
|
Title: Re:ビット演算の使い方
|
|
「初心者は知らないと思う」というステレオタイプな考え方がイヤ。
27ポイント を手に入れた。
|
|
|
|
Name: 究極の初心者 ..ぴよぴよ(775ポイント)
Date: 2008/10/06(月) 02:24
No:22086
|
|
Title: これからC言語を学ぶにあたって
|
|
皆様、初めまして。
掲示板を見ていると、どんな質問であろうと、きちんと回答されて下さる方が多く、とても好印象でしたので、思い切って質問させて頂きます。
私は、未だにC言語の何もわかっていません。
どのようなものなのかも曖昧なくらい・・・・・要は、C言語によってプログラムを作れる程度くらいの知識しかありません。この認識も当たっているのかも、自信はありません・・・・。
その程度しかないのです。
当然、今後勉強を始めるつもりです。
それにあたって、先輩方に質問させて頂きます。
少々長くはなりますが、ご教授頂けたらと思いっております。
まず、私はちょっとしたきっかけから、パズルゲームみたいなもの(ゲームプログラミングの館にある、ぷよぷ○風のゲーム)を作りたいと思っています。
そのためにどうすればいいか・・・・それをネットで検索した結果、ここに辿り着きました。
質問は幾つかありますので、わけて聞きたいと思います。
初めに、私のことを簡単に紹介させて頂きますね。
・自身のスペック
C言語・・・・触れもしていない、究極の初心者。
数学知識・・・・数学TとAは復習は必要かもしれないが、理解できる。数学UとBも可能。数学V.Cで理解不可。
PC知識・・・・あまりないです。常識の範囲はわかります。
・目標
第一は、ぷよぷ○風のパズルゲームを作り上げること。
また、それが出来たならば、次なる目標として、他のジャンルにも挑戦したい思っております。
最低限、それなりに遊べるパズルゲームができる。これが目標になります。
以下、質問内容になります。
1. C言語を理解した上でなければ、やはりC++言語はできませんか?
私の知識としては、述べたとおり、C言語を理解するも何も、全く触れていません。本当の初心者です。
そんな私ですが、C言語を飛ばして、ゲームプログラミングの館にある作り方を、きちんと理解していけば、パズルゲームは作れるのでしょうか?
それとも、やはり、C言語を理解しなければ、C++言語は理解できませんか?
また、もしかしたら、作り方が勝手にC++言語だと勘違いしているのでしょうか?
ゲームプログラミングの館にある作り方の最初に「VisualC++(VC++)」という記述があったので、C++言語なのではないかと、思っているのですが・・・。
2. もし、C言語の勉強が必須だとすれば、どのようなことをすればいいのでしょうか?
参考書を読むということは、当たり前だとは思いますが、例えば、お薦めの参考書などあったら教えて頂きたいと思います。
また、私が希望する、パズルゲームを作るには、「最低、C言語のここから、ここまでを理解すれば十分だよ」など、アドバイスも頂けると、近い目標もできますので、非常に助かります。
3. ゲームプログラミングの館にある、作り方はパズルゲームに対応できますか?
目次を見た感じ、シューティングや、アクションの作り方っぽいのですが、パズルゲームを作るのにも対応できるのでしょうか?
私が初心者だから、そう思うのかもしれませんが、シューティングとパズルでは、だいぶジャンルが違う気もするのですが・・・・・。
4. 最後に、これから勉強するにあたって、簡単でいいのでアドバイスは注意事項をご教授下さい。
例えば、C言語を勉強するにあたってのやり方。こうすると理解が早まるや、こういうやり方は絶対やめた方がいい。また、このサイトがわかりやすいや、パズルゲームなら、この参考書がいいな(ないとは思いますが)、など、何でも構いません。
今現在、C言語に関しては、良くも悪くも、まっさらな状態です。
物事を、1から学ぶということは、間違って覚えると修正が大変だということを理解していますので、なるべく、正しい道しるべを頂けたらと、切に思います。
全ての質問に答えて下さらなくても結構です。
これなら教えられるけど・・・・というものがあったならば、それだけでもご教授下さい。
少しでも、多くの方の教授があればと思いますので・・・。
それでは、長くなりましたが、ここまで読んで頂き、ありがとうございました。
どうか、よろしくお願い致します。
775ポイント を手に入れた。
|
|
|
|
Name: kazuoni ..プログラマー(30,753ポイント)
Date: 2008/10/06(月) 03:21
No:22088
|
|
Title: Re:これからC言語を学ぶにあたって
|
|
はじめまして。
自分もまだ初心者なので詳しいことは伝えられないですが^^;
パズルゲームはゲームのジャンルの中でもとっつきやすいほうかなって思います。
ただ、CPUを作るのは少々時間がかかるかもしれません。
>1. C言語を理解した上でなければ、やはりC++言語はできませんか?
ゲームプログラミングの館ではC言語+DXライブラリで書かれています。
ちなみにvisual C++は開発環境というものであり
C、C++、C++/CLIに対応しています。
C言語の知識+DXライブラリを使えばゲームは作れます。
>2. もし、C言語の勉強が必須だとすれば、どのようなことをすればいいのでしょうか?
うーん。作っているうちにあれもこれもと必要になっていき
すべてをカバーしてしまうような気もするのですが^^;
http://www9.plala.or.jp/sgwr-t/
↑にあることは理解しておいたほうがいいかなと思います。
まずはやはり制御構造ですかね。
if,while,for,switch
などを使いこなせればちょっとしたソフトがつくれるかもしれません(アバウト)
その際、数Aの論理と集合(名前こんなだったかな?)
あたりは結構重要だと思います。
>3. ゲームプログラミングの館にある、作り方はパズルゲームに対応できますか?
おそらくできます。
>4. 最後に、これから勉強するにあたって、簡単でいいのでアドバイスは注意事項をご教授下さい。
自分もゲームが作りたい一心で始めました。
C言語の知識ゼロでゲームプログラミングの館を読破して
「え、なんでここがこんな文なの?」
「○○の機能ってどうやってつけるんだろ」
と思ってからサイト巡りや、学校の図書館の本を参考にして勉強してました。(しています)
自分の場合はですが、あれもこれもとやっていたら挫折しました^^;
たぶん完成が見えなかったからだと思います。
やはりまず簡単なゲームを作っていくことが一番いいかと思います。
あと参考書はあると便利ですが、なくても大丈夫です。
グーグルで検索したらいっぱい出てきます。
その際、サンプルコードがいろいろ載っていますが
見ているだけだといざ使うときになると使えないことが多いです。
やはり自分で実行してみて、こんな動きをしているんだと実感したほうが一番だと思います。
ちょっと手を加えるとよりいいかもしれません。
このような質問は過去にもいろいろ出ているので検索してもらうと参考になると思います。
長文失礼しました。
2倍のポイントを手に入れた! 1,944ポイント を手に入れた。
|
|
|
|
|
Name: 管理人 [URL] ..伝説なるハッカー(813,262ポイント)
Date: 2008/10/06(月) 10:34
No:22098
|
|
Title: Re:これからC言語を学ぶにあたって
|
|
こんにちは。
そのぷよ○よ風ゲームなどを作った管理人です。
これからの期待に胸を膨らませていらっしゃる事でしょう。是非頑張って下さい。
ではまず、一つずつ回答していきますね。
>> 1. C言語を理解した上でなければ、やはりC++言語はできませんか?
私はC言語で作っています。DXライブラリ自体はC++ですが、
Cの知識だけで使えるライブラリですよ、と本家でもかいてあります。
そのぷよ○よ風ゲームも、龍神録も全部ピュアC(C++ではない純粋なCという意味)で書いています。
ですから、効率、拡張、汎用、うんぬんの話を別にすればCでも充分作れますよ。
VC++はCもC++も同じようにコンパイル出来るコンパイラですから、
特に「両方(CもC++の機能も一緒に書いたようなプログラム)」という中途半端な書き方も出来ます。
だからC言語がわかってきたら、
Cで書きながらC++の便利な機能をちょいちょいついばみながら書くことも出来ます。
>> そんな私ですが、C言語を飛ばして、ゲームプログラミングの館にある作り方を、きちんと理解していけば、パズルゲームは作れるのでしょうか?
ぷよ○よ風を第一目標ということですが、これは案外難しいですよ。
もともとテトリスというのはプログラマーの教育用に考え出されたものですし、
パズルゲームというのは色んなアルゴリズムを考える必要があり、
日ごろプログラムになれている人でも実装となると ん? と思ってしまうかもしれません。
ただその「第一」というのがどの辺かわかりませんし、
また、製作者がどれ位ガッツがあるかでも大きくかわりますから、はっきりとはいえませんが、
まずはもう少し簡単に実装出来るゲームを目指した方がいいかもしれません。
もしかしたらガッツで作り上げられるかもしれませんし、
試行錯誤のすえ断念することも大事な経験の一つですから、
どの道をお選びになるかは自由だし無駄じゃないと思います。
>> 2. もし、C言語の勉強が必須だとすれば、どのようなことをすればいいのでしょうか?
しっかりとしたゲームを作りたいならはやりしっかりとした基礎が大事です。
C言語をしっかり理解しておくことは大変重要だと思います。
ただその勉強はある程度Cの知識がついてきたら、「ゲームを作りながら覚える」というスタイルでも
可能であるため、勉強方法は色々あると思います。
とりあえず0から始める時は、まずウェブで調べてみる事です。
きっと全くわからない状態で本屋にいっても、何の本を買ったらいいか解らないと思います。
コンパイラは用意し、C言語をコンパイル出来る状況は今ありますか?
プロジェクトは自分で作れますか?
C言語を勉強する時はコンパイラを用意することから始まります。
コンパイラを準備し、とりあえず何でもいいから画面に出力させてみて下さい。
C言語系の入門サイトは山ほどあります。
http://www.google.co.jp/search?hl=ja&q=C%E8%A8%80%E8%AA%9E%E3%80%80%E5%85%A5%E9%96%80&lr=&aq=f&oq=
わかりやすそうなサイトを見つけてとりあえず読んでみて下さい。
とりあえず一番上にヒットした
http://www5c.biglobe.ne.jp/~ecb/c/c00.html
こちらをみてみましょう。
ずっとよんでいくと2.1にプログラムコードがかかれていますね。
こういうプログラムコードは見るだけじゃなく、実際に自分のコンパイラで実行して試してみて下さい。
そしてそれをいじってみてどう変化するか確認して下さい。
プログラムはコンパイルした数だけ上達します。
>> 「最低、C言語のここから、ここまでを理解すれば十分だよ」など、アドバイスも頂けると、近い目標もできますので、非常に助かります。
「充分」という段階は一般人には誰にも無いであろうと思われるほどこの分野は奥が深いので
ライン引きは難しいですが、先ほど言いました
「ゲームを作りながら学ぶ」段階になるためには
1,2,3,4,7,9章
(5は非常に大事なのとそうでもない差が激しいのでサッを目を通すといいかも)
はきっちり理解する必要がありそうです。
ポインタはもちろん重要ですが、初心者がつまずく典型的な分野なので、
後回しでもいいかもしれません。
構造体はうちのサイトでもしゅっちゅうでてくるので、こちらもゲームを作りながらでいいので覚えて下さい。
少しずつわかってくると、きっと本屋にいっても自分に合いそうな本はわかると思いますから、
大きな書店にいって探してみて下さい。
私がお気に入りだった本は
http://www.amazon.co.jp/%E6%96%B0%E7%89%88-%E6%98%8E%E8%A7%A3C%E8%A8%80%E8%AA%9E-%E5%85%A5%E9%96%80%E7%B7%A8-%E6%9F%B4%E7%94%B0%E6%9C%9B%E6%B4%8B/dp/4797327928
こちらです。
これ実践編もあるので、両方かっておくといいかもしれません。
演習問題のかいてあるバージョンの本もあるのでそちらも興味があればどうぞ。
>>3. ゲームプログラミングの館にある、作り方はパズルゲームに対応できますか?
パズル系の話は無いので、直接的には参考にはならないかもしれません。
・・が、ただ基礎がきっちりしてきたら自分で思いつけるようになってくるんですよ。
kazuoniさんの回答はおそらくそういう意味だと思います。
それが効率的かどうかは別としてね。
最初のうちは非効率的なプログラムをだらだらかくことも結構重要なんじゃないかというのが
私の持論です。
もちろんその後で人に聞いたり、アドバイスもらったり、調べたり勉強したりする事は大事ですよ。
その前に自分で考えて、おかしなプログラムでもいいから試行錯誤してみることこそ上達の道に繋がると思います。
人に聞いた理論って忘れるんですよね。そして応用も難しい。
しかし自分で考え出した理論は忘れないです。そして何より自分が思いついたものですから応用も簡単です。
ある程度自分の理論を持った状態で、人からアドバイスを受けるとかなりよい形で定着したりします。
ですから、「こんな感じで実装できそうじゃないか?」と思い始めたら
まずはひたすら思いつくままにガリガリかいてみてはどうでしょう。
色んな勉強法はあれども、どの道も無駄にはならないと思います。
>> 4. 最後に、これから勉強するにあたって、簡単でいいのでアドバイスは注意事項をご教授下さい。
あまり長くなると読むのもだるくなるでしょうからこの辺で^^;
何か解らない事があればまた聞いて下さい。
2,327ポイント を手に入れた。
|
|
|
|
|
Name: 御津凪 [URL] ..上級者(22,175ポイント)
Date: 2008/10/06(月) 11:24
No:22101
|
|
Title: Re:これからC言語を学ぶにあたって
|
|
私は就職時の提出課題でパズルゲームを出したことがあります。
そんな私の助言です。
(手短に書きます)
> 1. C言語を理解した上でなければ、やはりC++言語はできませんか?
個人差にもよりますが、C++言語を理解する方が多いのではないでしょうか。
オブジェクト指向を学ぶという意味で。
> 2. もし、C言語の勉強が必須だとすれば、どのようなことをすればいいのでしょうか?
1.「変数」と呼ばれる入れ物の存在。
4.「制御構文」と呼ばれる命令の道。
2.「関数」と呼ばれる処理のブロック。
3.「ポインタ」と呼ばれる変数の住所。
が最低限必要だと思います。
> 3. ゲームプログラミングの館にある、作り方はパズルゲームに対応できますか?
少なくともゲームの基礎部分はある程度使いまわせると思います。
> 4. 最後に、これから勉強するにあたって、簡単でいいのでアドバイスは注意事項をご教授下さい。
頭の中で考えたゲーム構想のみで最初から挑むのは必ずといって良いほど挫折します。
管理人さんの言うようにガッツがあれば出来ると思いますが。
プログラミングは技術的な部分が多いので、さすがに無知からゲームは作れないでしょう。
(どのように移動させるか、どのように判定するのか、など)
何が出来るのか(と自分で作れるか)をきちんと把握してからの方が割とスムーズに行くはずです。
これも修行、と考えるのも面白いかもしれませんね。
> 管理人さん
すいません。誤字で笑いかけました。
「股聞いて下さい」が「股開いて下さい」に見えてしまった…。
400ポイント を手に入れた。
|
|
|
|
|
Name: 究極の初心者 ..かけだし(1,883ポイント)
Date: 2008/10/06(月) 21:02
No:22117
| 解決!
|
Title: 皆様、返信ありがとうございました。
|
|
>kazuoniさん
はじめまして。
Kazuoniさんもまだ初めて間もないということで、色々と参考になりました。
特に
>4のお答えの、C言語の知識ゼロでゲームプログラミングの館を読破して・・・・
は、実際私がやろうとしていたことなので、体験した人の意見を聞けて、とても参考になりました。
おそらく、私もそこから始めると、右往左往してわからなくなってしまうな・・・・ということが予測されます。
なので、やはり近道をせずに、C言語をきちんと理解し、まずは簡単なゲームを作ってみようと思います。
また、
>、CPUを作るのは少々時間がかかるかもしれません
で、一人でやる時は、AIも作らなきゃいけないのか!っと、ハッと気付かされました。
そう考えると、やはり大変なジャンルなのかも・・・っと思います。
貴重な、ご意見本当に助かりました。
わざわざ長くご教授下さって、本当にありがとうございます。
>管理人さん
はじめまして。
実践を踏んだ人の意見は、とても参考になるので、ぜひ、ぷよぷ○風のゲームを作った管理人さんの意見は聞きたいと思っていました。
パズルゲームって、難しいジャンルなのですか・・・・。
そう言われると、アクションなどよりは、ランダム要素が含む分、漠然と難しいような気がしてきました。
なので、パズルゲームを第一目標にはせず、まずはもっと単純なゲームを目標にしてみようと思います。
また、そのほかのC言語の勉強法など、長文に渡りご指導ありがとうございました。
おそらく、今後もこの掲示板や、ゲームプログラミングの館などを参考にさせていただくと思います。
なるべく、自身で調べながらやるつもりですが、どうしても詰まってしまった時は、ぷよぷ○風ゲームを作った先駆者としてアドバイスを頂けたらと思います。
もちろん、手が空いてたらで構いません。
私も、出来るだけ、自分で学ぼうと思っておりますので・・・・。
とても貴重な意見、ありがとうございました。
また、今後ともこの掲示板を利用させてもらう者として、よろしくお願い致します。
>御津凪さん
はじめまして。
就職時ということは、その道のプロ・・・・っということでしょうか?
2の質問など、わかりやすく要点だけを教えて頂き、とてもわかりやすかったです。
ただ・・・・番号が1.4.2.3となっているのは、何か意味があるのかな・・・?っという疑問が少しありますが・・・恐らく、打ち間違い??っと思ってます。
御津凪さんも、パズルゲームの制作経験者ということで、勉強法など、参考にさせていただきます。
また、構想のみで挑むのは危険というアドバイスも頂けたので、まずは実力をつけるためにも、パズルゲームは保留にしたいと思います。
わざわざ、本当の初歩の事を教えて頂き、ありがとうございますた。
これから始めるにあたり、参考にさせて頂きたいと思います。
とりあえず、皆様の意見を参考にパズルゲームは一旦保留にし、何か単純なものを目標に学んでいこうと思います。
その前に、教えて頂いたURLを参考に、基本のC言語を実践をまじえながら、学んでいくことにしました。
本当に初歩の質問で、申し訳ありませんでしたが、暖かいご指導、誠にありがとうございます。
どうしても、詰まった時は、また相談させて頂けたらと思います。
改めて、ご指導のほう、感謝いたします。
ありがとうございました。
1,108ポイント を手に入れた。
|
|
|
|
|
Name: Mist ..プログラマー(25,742ポイント)
Date: 2008/10/06(月) 17:07
No:22107
|
|
Title: Re:画面の作り方
|
|
画像のアイコンを見る限りC++ Builder、もしくはTurbo C++ builderを使っていますね。
どちらもVisual Studioと同じような統合開発環境です。
前者は購入する必要があります。
後者はフリーですがインストールが若干難しいです。
88ポイント を手に入れた。
|
|
|
|
|
Name: Mist ..プログラマー(25,801ポイント)
Date: 2008/10/06(月) 17:48
No:22113
|
|
Title: Re:画面の作り方
|
|
参照されているページはC++ Builder 6で作られたソフトの説明のようですから、
類似の環境が無いと出来ません。
Visual Studioとかで作るのであれば、WinAPIを直接使うにせよ、MFC等を利用するにしろ
まったく違うプログラムになります。
59ポイント を手に入れた。
|
|
|
|
|
Name: Mist ..プログラマー(26,297ポイント)
Date: 2008/10/06(月) 18:00
No:22114
|
|
Title: Re:画面の作り方
|
|
> @番の画面を作成するというのはどのようにすればよいかわかりません・・・
> どなたかわかるかたソースをおしえていただきたいですm_m
勘違いもあるようなのでこれについて一応説明しておきますが、C++ Buiderはプロジェクトを
作成すると自動的にフォームがひとつ作成されます。
このフォームにボタンやエディットボックス、ラベルなどを貼り付けてからコーディングします。
VBを使われたことがおありでしたらイメージしやすいかと思いますが。
つまり1番で「下記のような画面を作る。」と書いているのは、この画像と同じになるようにボタン、
エディット、ラベル、タイマ(画面上には見えないけど必要)を貼り付けてくださいということです。
たぶん、C++ builderを触ったことのない人には、HPにある解説だけでは理解できないと思います。
(知らない人向けに書かれているページじゃないと思う)
2倍のポイントを手に入れた! 496ポイント を手に入れた。
|
|
|
|
Name: 匿名 ..ぴよぴよ(680ポイント)
Date: 2008/10/06(月) 16:59
No:22105
|
|
Title: 情報ください
|
|
フリーの作曲ソフトやグラフィックソフトをいろいろ使ってみましたが簡単と書いてあるのも私はそういうの苦手なのでどなたかおすすめのソフトがあったら教えてください
67ポイント を手に入れた。
|
|
|
|
Name: 管理人 [URL] ..伝説なるハッカー(814,334ポイント)
Date: 2008/10/06(月) 17:35
No:22110
|
|
Title: Re:情報ください
|
|
作曲ソフトはCakeWalk位しか使ったことがないんですが、HOMESTUDIOをすすめられたことがあります。
作曲ソフトは扱いが難しいものが多いので、一つこれだと思う有料ソフトを買ってみてはどうでしょう?
フリーだとややこしかったり、ちょっとめんどうだったら「もういいや」ってなりますけど、
自分で稼いだお金でソフトを買えばそういうこともできないので、
頑張って使いこなせるようになる可能性が高いと思います。
それに多くの場合有料ソフトの方が出来ること多いですし、
有料ソフトを使いこなせるようになるのが一番いいことだと思います。
学生ならアカデミック版があるでしょうし、そうでなくても自分の好きな方面の専門ソフトは一つ持っておいてもいいと思います。
フリーのグラフィックソフトで一番有名なのはなんといってもGIMPですよね。
昔のフォトショとかわらないくらいのことができます。
もっと簡単なソフトといえばPictBearでしょうか。これも結構いろんな事が出来ます。
専門的なソフトは誰でもどんなソフトも触ったこと無い状態から
使いこなせるようになるまでには色々苦労もしないといけないと思うので
みな楽して覚えてるわけじゃないと思いますし、
これだと思うソフトを色々根気良く使い、参考サイトや本で勉強していくことが上達の道だと思います。
GIMP位のソフトになると参考サイトや本も結構ありますよ。
もしフォトショを使ったことがあるならGIMPをフォトショ風にするソフトなんかもあります。
536ポイント を手に入れた。
|
|
|
|
|
Name: kazuoni ..プログラマー(28,594ポイント)
Date: 2008/10/01(水) 01:57
No:21863
|
|
Title: Re:■雑誌iP!に龍神録が掲載されました■
|
|
ついに載りましたかww
あれだけ完成度が高くてフリーですもんね。
載っても不思議ではないのですが。
また一段とゲームを作る意欲がわいてきました。
あ、明日さっそく雑誌確認してきますww
おめでとうございます。
55ポイント を手に入れた。
|
|
|
|
|
Name: ..ぴよぴよ(940ポイント)
Date: 2008/10/01(水) 01:59
No:21864
|
|
Title: Re:■雑誌iP!に龍神録が掲載されました■
|
|
おめでとう
2倍のポイントを手に入れた! 16ポイント を手に入れた。
|
|
|
|
|
Name: array ..プログラマー(28,050ポイント)
Date: 2008/10/01(水) 05:39
No:21867
|
|
Title: Re:■雑誌iP!に龍神録が掲載されました■
|
|
おめでとうございます。ってきり10月1日発売かと思って今日までノーチェックでした・・・orz
変態的・・・って誰が考えたうたい文句だよw
61ポイント を手に入れた。
|
|
|
|
|
Name: 管理人 [URL] ..伝説なるハッカー(805,935ポイント)
Date: 2008/10/01(水) 07:10
No:21870
|
|
Title: Re:■雑誌iP!に龍神録が掲載されました■
|
|
>kazuoniさん
ありがとうございます☆
編集部の方から声がかかったときは、昔からよく読んでいた本だったので嬉しかったです^^
ここにおこしになっている方々のフリーゲーム一覧みたいなページが出来たらいいですね♪
> さん
ありがとうございます☆
>arrayさん
いや発売日は今日なんですが、うちには2日前に届いたようです。
掲載の報酬は掲載された本でしたw
103ポイント を手に入れた。
|
|
|
|
|
Name: J ..中級者(11,142ポイント)
Date: 2008/10/01(水) 13:50
No:21884
|
|
Title: Re:■雑誌iP!に龍神録が掲載されました■
|
|
買いました!おめでとうございます。
他の内容はあんまりアレでしたが、龍神録のためと思い買いました。
猟奇的、刹那的、変態的・・・なんという、うたい文句(笑
arrayさんと同感です。
33ポイント を手に入れた。
|
|
|
|
|
Name: array ..プログラマー(29,066ポイント)
Date: 2008/10/01(水) 17:37
No:21893
|
|
Title: Re:■雑誌iP!に龍神録が掲載されました■
|
|
私も買ってみました。
紹介文も読んでみました。
雑誌の内容も良かったです。
あえて突っ込むなと、雑貨ショップってソコだっけ。
68ポイント を手に入れた。
|
|
|
|
|
Name: situmon ..入門者(3,595ポイント)
Date: 2008/10/01(水) 19:03
No:21897
|
|
Title: Re:■雑誌iP!に龍神録が掲載されました■
|
|
本当におめでとうございます。
これからも、龍神録など楽しみにしています。
2倍のポイントを手に入れた! 44ポイント を手に入れた。
|
|
|
|
|
Name: こめかみ ..上級者(19,079ポイント)
Date: 2008/10/01(水) 22:38
No:21907
|
|
Title: Re:■雑誌iP!に龍神録が掲載されました■
|
|
祝。
半ページかぁ。そんなものかなー。
2倍のポイントを手に入れた! 52ポイント を手に入れた。
|
|
|
|
|
Name: 管理人 [URL] ..伝説なるハッカー(806,530ポイント)
Date: 2008/10/03(金) 18:06
No:21965
|
|
Title: Re:■雑誌iP!に龍神録が掲載されました■
|
|
泊りがけで内定式行っていました。
いや〜ついに自分も社会人になるんだな〜と思いましたm(_ _)m
>Jさん
わざわざありがとうございます><
ホントに誰が考えたうたいもんくだw
あの本の最初にかいてあったgoogle chromeはちょっと試してみたくなりました^^
>arrayさん
・・・雑貨ショップの場所がちがああう!w
購入くださってありがとうございます^^
>situmonさん
ありがとうございます^^
>こめかみさん
おぉ、絵まで書いてくださってありがとうございます!
ちゃんと本にIPとかいてあるw
206ポイント を手に入れた。
|
|
|
|
|
Name: 御津凪 [URL] ..上級者(21,229ポイント)
Date: 2008/10/03(金) 18:20
No:21967
|
|
Title: Re:■雑誌iP!に龍神録が掲載されました■
|
|
内定&掲載(遅くなりましたが)おめでとうございます!
どんな会社かは存じませんが、仕事に追われる毎日が待っていることでしょう(笑
出来れば掲示板での回答等がおろそかにならないよう祈ります。
P.S
以前もそうでしたが、メールチェックしていますか?
思ったタイミングで返信が来ないということがあるので…。
27ポイント を手に入れた。
|
|
|
|
|
Name: バグ ..ハッカー(114,846ポイント)
Date: 2008/10/03(金) 22:48
No:21987
|
|
Title: Re:■雑誌iP!に龍神録が掲載されました■
|
|
個人的に黒目は不要な機能が少なくて、快適だったんですけどねぇ…
デザインも好きなんで愛用してます。
最近、火狐が重くて仕方ないです…。バージョンアップする度にドンドン重くなってきてる気がします。
14ポイント を落としてしまった。
|
|
|
|
|
Name: 管理人 [URL] ..伝説なるハッカー(813,780ポイント)
Date: 2008/10/06(月) 10:58
No:22100
|
|
Title: Re:■雑誌iP!に龍神録が掲載されました■
|
|
お返事遅くなりましたm(_ _;)m
ありがとうございます。
パソコン雑誌ってDVDとか付いてるのが多いので案外高いですよね。
私もよく立ち読みはしますけど、買う事はあまりないですね^^;
google chromeもうちょっと使ってみました。
お気に入り派だったんですがブックマークリンクにその機能を置き換えてみると
サイドバーが無くても大丈夫になりました・・というかむしろこっちの方がいいかも^^;
いや〜レスポンが早いのと、画像が多いページは他のブラウザだと全部表示されない事があったのに、
これだと表示される事などブラウザとしてすごく良いと思います。
しかしあらゆるページで「戻る」を押しても戻れないことがあるのが不便ですね・・。
そこだけ何か設定出来ればいうことないんですが・・。
設定項目が少なすぎるのだけ問題ですかね〜;
今後に期待。
294ポイント を手に入れた。
|
|
|
|
Name: kitanohito ..ぴよぴよ(89ポイント)
Date: 2008/10/05(日) 18:42
No:22066
|
|
Title: 文字列動画について
|
|
文字列動画のデバック中にエラーで実行できないのですが
何が悪いのでしょうか
これが一部変更したところです
#include "DxLib.h"
#define MAX 3000
#define GAMEN_YOKO 512
#define GAMEN_TATE 384
#define IMAGE1
#ifdef IMAGE0
#define BMP_YOKO 1024
#define BMP_TATE 576
#endif
#ifdef IMAGE1
#define BMP_YOKO 512
#define BMP_TATE 384
#endif
#ifdef IMAGE2
#define BMP_YOKO 400
#define BMP_TATE 300
#endif
#ifdef IMAGE3
#define BMP_YOKO 320
#define BMP_TATE 240
#endif
~省略〜
//bmpファイルを読む関数です。
//ファイル名が違う場合はダブルコーテーション内をいじってください
//配列に0を埋めている作業は、ファイル名が00000001になるようにするためです。
void bmp_read(int cnt){
int i;
char name[64];
FILE *fp;
sprintf(name,"image0/3DみくみくPV♪ %7d.bmp",cnt+1);
for(i=12;name[i]!='/0';i++){
if(name[i]==' ')
name[i]='0';
}
fp = fopen( name , "rb" );
if( fp == NULL ){
printfDx( "%sが見つかりません。",name);
return;
}
fread( data, 1, TOTAL, fp );
fclose(fp);
}
〜省略〜
//上のイフ文のコメントアウトを解除し、下をコメントアウトすると全画面になります。
// if(DxLib_Init() == -1 ) return -1;
if( ChangeWindowMode(TRUE) != DX_CHANGESCREEN_OK || DxLib_Init() == -1 ) return -1;
load();
sound=LoadSoundMem("3DみくみくPV♪.mp3");
SetDrawScreen( DX_SCREEN_BACK );
SetFontSize(size);
while(!ProcessMessage() && !ClearDrawScreen() && !GetHitKeyStateAll( Key )){
check_key();
change_size(&size);
if(cnt==0)
play_music();
draw_AA(size,cnt);
cnt++;
if(Key[KEY_INPUT_F12]==1 || cnt>=MAX){
cnt=0;
stop_music();
}
//WaitTimer(???); //<-時間がずれる場合はここで時間調整してください。
if(Key[KEY_INPUT_ESCAPE]==1)break;
ScreenFlip();
}
DxLib_End();
return 0;
}
89ポイント を手に入れた。
|
|
|
|
Name: 御津凪 [URL] ..上級者(21,775ポイント)
Date: 2008/10/06(月) 10:23
No:22097
|
|
Title: Re:文字列動画について
|
|
どこでエラーが出て実行できないのか分かりませんが、気になった点を一つ。
配列に0を埋める処理の部分で問題があると思います。
これでは読み込みパスの全ての空白文字が0に置き換わってしまいます。
%7d では無く、 %07d とすれば、連番部分に0が自動で埋められます。
82ポイント を手に入れた。
|
|
|
|
Name: ただの馬鹿 ..ぴよぴよ(30ポイント)
Date: 2008/10/06(月) 08:59
No:22093
|
|
Title: 無題
|
|
龍神禄の第十三章の「敵にショットを撃たせてみよう」のコードをどこに打ち込んだらいいのか分かりません・・・
30ポイント を手に入れた。
|
|
|
Name: k ..ぴよぴよ(897ポイント)
Date: 2008/10/05(日) 13:59
No:22053
|
|
Title: 龍神録プログラミングの館8章k
|
|
龍神録プログラミングの館で勉強しています。
8章の「キーコンフィグに対応させてみよう」について、質問させていただきます。
void GetHitPadStateAll()の中の
mul*=2;
がよくわかりません。
この一文が無いとパッドでの入力がおかしくなる、というのは実行してみてわかったのですが、
どうしてそのようになるのかが、さっぱりわかりません。
186ポイント を手に入れた。
|
|
|
|
Name: array ..プログラマー(30,215ポイント)
Date: 2008/10/05(日) 14:50
No:22055
|
|
Title: Re:龍神録プログラミングの館8章k
|
|
私も、キー入力などの入力処理については理解してないので間違ってるかもしれません。
上手く書けませんが、パッド入力の際、調べたいキーと入力の&(アンド)を取ってあげる事で、入力状態が分かります
なのでmul*=2とすることでforのループ分各ボタンの状態を検知しているんだと思います。
分からない場合は、本家のリファレンスでGetJoypadInputStateについて調べて自分で理解した方が良さそうです。
211ポイント を手に入れた。
|
|
|
|
|
Name: array ..プログラマー(30,252ポイント)
Date: 2008/10/05(日) 15:01
No:22056
|
|
Title: Re:龍神録プログラミングの館8章k
|
|
ようするに
mul*=2;
がないと、
for(i=0;i<16;i++)
を使って各入力状態を見たいのにmul=1の状態しか見てませんよ。って感じです。
37ポイント を手に入れた。
|
|
|
|
|
Name: 管理人 [URL] ..伝説なるハッカー(809,325ポイント)
Date: 2008/10/05(日) 19:46
No:22067
|
|
Title: Re:龍神録プログラミングの館8章k
|
|
こっちの書き方の方がわかりやすいかな?と思ったんですが、素直にビットシフトしたほうがよかったかもしれません・・。
ビットシフトはご存知でしょうか?
また、キーの入力状態がどうなっているかは、本家リファレンスで一度確認して下さい。
そうすれば意味が解ると思います。
2進数であるので2をかけることで、各ビットがたっているかどうかを1つずつチェックしているのです。
135ポイント を手に入れた。
|
|
|
|
|
Name: k ..かけだし(1,297ポイント)
Date: 2008/10/05(日) 22:48
No:22080
| 解決!
|
Title: Re:龍神録プログラミングの館8章k
|
|
ありがとうございます。
少しですがわかってきました。
この場合は
int GetJoypadInputState()が返す値は、各ビットが各ボタンに対応している。
パッドの入力状態を取得した変数PadInput と
ビットごとの論理積を計算したい値(つまり各ビット・つまり各ボタンに対応した数値)が1,2,4,8,16…
(論理積の結果が0でなければ、入力されている)
なのでmul*=2としている、ということでしょうか。
ビットシフトについては殆ど理解していません。
nビット左にシフトすると、その結果は2のn乗を乗算した値になる(?)だったでしょうか。
使い方はよくわかっていません。
また、ちょっとした疑問ですが、mulは何かの英単語の略でしょうか。
このような場合に使う一般的な単語なのでしょうか。
教えていただければうれしいです。
2倍のポイントを手に入れた! 400ポイント を手に入れた。
|
|
|
|
|
Name: バグ ..ハッカー(115,013ポイント)
Date: 2008/10/05(日) 22:58
No:22081
|
|
Title: Re:龍神録プログラミングの館8章k
|
|
乗算(Multiplication)の事ですね。
一般的かどうかは分かりませんが…
私の場合、加算はAdd、減算はSub、除算はDivなんかを使ったりする事はあります。
42ポイント を落としてしまった。
|
|
|
|
|
Name: k ..かけだし(1,191ポイント)
Date: 2008/10/06(月) 02:51
No:22087
| 解決!
|
Title: Re:龍神録プログラミングの館8章k
|
|
ありがとうございます。
なるほど、乗算の略だったのですね。
関数の使い方も、試してみてだいたい分かってきました。
GetJoypadInputState()は便利に作られているんですね。
調べれば調べるほどDXライブラリの凄さが見えてくるような感じがします。
106ポイント を落としてしまった。
|
|
|
|
|
Name: 管理人 [URL] ..伝説なるハッカー(810,870ポイント)
Date: 2008/10/06(月) 08:56
No:22092
|
|
Title: Re:龍神録プログラミングの館8章k
|
|
先ほどはちょっと時間が無くて丁寧に答えられずごめんなさい。
もうお解かりになったかもしれませんが念のために。
コンピュータは電気が通るか通らないかでデータを識別・処理している為2進数です。
これを0(電気が通らない)か1(電気が通る)かという言い方をします。
0か1、そのどちらかの情報を保持出来る最小単位をビットといいます。
1ビットあれば2つの信号が識別出来ます。
0か1ですからね。
では、これが2つくっついて2ビットになったらいくつ信号が識別出来るでしょう。
00
01
10
11
4種類ですね。では3ビットなら?
000
001
010
011
100
101
110
111
8種類ですね。2→4→8→・・という増加の仕方はおわかりのように2の累乗です。
nビットは2のn乗通りの信号が識別出来ます。
データはビット単位で扱ってはあまりにも小さすぎるので、ある程度まとまった塊を作る事になりました。
こうして8ビットを1まとまりにしたのが1バイトです。
つまり1バイトには2の8乗つまり256種類の信号を格納する事が出来ます。
char型が何故256種類の信号を識別出来るかというと8ビットだからですよね。
int型が何種類の信号が識別できるかは環境にもよりますが、4バイトならば2の32乗通りということになります。
ここまでが前置きです。
このように、int型には32個の0か1が入る入れ物があるのです。
これをキーの入力状態に対応させてみては?と言う考え方をしたのがGetJoypadInputState関数です。
1ビット目を下キー
2ビット目を上キー
3ビット目を左キー
4ビット目を右キー
という感じで各ビットに0か1を代入します。
今仮にGetJoypadInputStateは上記のような4種類のキーの入力状態を格納する関数だとします。
今PadKey変数に仮に、上下左右の4種類の入力状態が入ったとします。
今「右上」が押されているなら、2ビット目と4ビット目がたつはずですから
1010
になるはずですね?ここで、mulはどのような対応になるかみていきましょう。
mulには最初1が入っていますから
----------------------------
nビット番目 4 3 2 1
PadKey 1 0 1 0
mul 0 0 0 1
----------------------------
こうなっているはずですね?
ここで、PadKeyとmulとで論理積(両方とも1なら1,違うなら全て0をはく計算方法)で計算すると
計算結果は0になります。
今はmulが対応しているのは1ビット目だけであり、1ビット目である下キー以外の論理積は0になります。
こうして計算結果が0になったので、下キーは押されていない事がわかりました。
ではmulに2をかけてみましょう。
10進数は10を足すと繰り上がりますが、2進数は2を足すと繰り上がりますね。
例えば0に1を足すと1、さらに1をたすと10になります。以下10進数との対応をみてみましょう
0 0
1 1
2 10
3 11
4 100
5 101
6 110
7 111
8 1000
9 1001
(略
このように、なります。桁が繰り上がっているのは10進数でいう2,4,8...つまり2の累乗ですね?
ということは、ビットをずらす・・つまり桁をずらすには2をかけてやればいいことになります。
では先ほどのmul=1に2をかけてみましょう。1*2は2ですから10になりますね。よって
----------------------------
nビット番目 4 3 2 1
PadKey 1 0 1 0
mul 0 0 1 0
----------------------------
こうなります。PadKeyとmulとの今度の論理積の結果は・・?
0010となり「0ではない」数値が返ってきます。
if(PadInput & mul) pad.key[i]++;
という書き方をしていると思いますが、ifの条件は0なら偽、0以外なら真ですから、
計算結果が0じゃなかったら実行されるわけですので
今回はpad.key[i](どれ位キーが入力されているかカウントするもの)が加算されます。
もし今の瞬間入力されたならこれが1になります。
では、隣のビットに移動する為にまたmulに2をかけてみましょう。
----------------------------
nビット番目 4 3 2 1
PadKey 1 0 1 0
mul 0 1 0 0
----------------------------
今度の計算結果は0となりますから、左キーは入力されていないことがわかります。
最後です。またmul*=2;をしてみます。
----------------------------
nビット番目 4 3 2 1
PadKey 1 0 1 0
mul 1 0 0 0
----------------------------
今回の計算結果は10進数でいう8となり、0以外となりますから、if条件は真となり実行されます。
こういう計算をそこでしていました。
なかなか知らない人にはあの2〜3行のコードからここまで汲み取れというのは
酷い話ですが^^;
所々龍神録の館では説明を省略しているところがありますので、
わからないことがあればまた聞いて下さい。
1,545ポイント を手に入れた。
|
|
|
|
Name: COPY BRAND ..ぴよぴよ(309ポイント)
Date: 2008/10/04(土) 16:10
No:22013
|
|
Title: 不適切な投稿(管理人による削除)
|
|
管理人による記事の削除
ロボットによる投稿ではないと判断し、投稿履歴を一時的に保存します。
ここで商品の宣伝をするのはやめて下さい。
211ポイント を手に入れた。
|
|
|
Name: ねおめろ ..ぴよぴよ(8ポイント)
Date: 2008/10/05(日) 20:34
No:22069
|
|
Title: 画像データを実行ファイルに同梱する
|
|
画像データを実行ファイルに同梱したいのですが、どうやればいいんですか?
実行ファイル単体で実行できるようにしたいのです。
環境:VC++ 2008 ExpressEdition,Dxlib
8ポイント を手に入れた。
|
|
|
|
Name: array ..プログラマー(30,372ポイント)
Date: 2008/10/05(日) 20:47
No:22070
|
|
Title: Re:画像データを実行ファイルに同梱する
|
|
不可能じゃないと思いますが、無理があると思います。
色々なフリーゲームを見てみても、アーカイブで圧縮して、簡単には中身を見れなくする程度みたいです。
実行ファイルに同梱するとなると、画像を独自で変換したデータを組み込んで、読み込める様に・・・とかするんじゃないでしょうか。
多分、独学で勉強しないと無理だと思うので、そういった事を考慮すると、アーカイブで圧縮して、実行ファイルと一緒に同梱する。といった方が妥当だと思います。
120ポイント を手に入れた。
|
|
|
|
|
Name: ねおめろ ..ぴよぴよ(20ポイント)
Date: 2008/10/05(日) 20:55
No:22071
| 解決!
|
Title: Re:画像データを実行ファイルに同梱する
|
|
わかりました。ありがとうございました。
12ポイント を手に入れた。
|
|
|
|
|
Name: Justy ..ハッカー(231,912ポイント)
Date: 2008/10/05(日) 22:29
No:22079
|
|
Title: Re:画像データを実行ファイルに同梱する
|
|
もう解決してしまったようなので、軽く紹介だけ。
>画像データを実行ファイルに同梱したいのですが、どうやればいいんですか
2通りのやり方でできます。
1つ目の方法は同梱したいデータを C/C++の配列に変換してしまうことです。
static const unsigned char data[] =
{
0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a,
0x00, 0x00, 0x00, 0x0d, 0x49, 0x48, 0x44, 0x52,
0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x80,
0x08, 0x03, 0x00, 0x00, 0x00, 0xf4, 0xe0, 0x91,
0xf9, 0x00, 0x00, 0x00, 0x09, 0x70, 0x48, 0x59,
....(略)....
}
これは某 pngデータの先頭部分ですが、このように配列化してしまえば
C/C++のソースの中に埋め込めます。
2つ目の方法はリソースとして埋め込む方法です。
リソースとしてデータを埋め込み、WinAPIの FindResource() / LoadResource() / LockResource()などを
使ってデータを取り出します。
ttp://wisdom.sakura.ne.jp/system/winapi/win32/win72.html
ttp://wisdom.sakura.ne.jp/system/winapi/win32/win75.html
ま、どっちにしても面倒ですね。
※ 実際にはまだ他にも方法がないわけではないですが、その方法は輪をかけて面倒で・・・。
499ポイント を手に入れた。
|
|
|
|
|
Name: GPGA ..熟練のプログラマー(51,825ポイント)
Date: 2008/10/05(日) 23:01
No:22082
|
|
Title: Re:画像データを実行ファイルに同梱する
|
|
さっきFindResourceについていろいろ調べていたんですけど、
これ、解放する関数がないようです。
プロセスが削除されるときに、消えるらしいんですけど
任意で解放する関数がなくて、困りました。
>※ 実際にはまだ他にも方法がないわけではないですが、その方法は輪をかけて面倒で・・・。
exeファイルを作成した後に、リソースをexeの後ろにくっつけて
アプリ起動時にそこから読み取るとか、そんな感じですかね?
120ポイント を手に入れた。
|
|
|
|
|
Name: Justy ..ハッカー(232,283ポイント)
Date: 2008/10/06(月) 00:24
No:22084
|
|
Title: Re:画像データを実行ファイルに同梱する
|
|
>さっきFindResourceについていろいろ調べていたんですけど、
>これ、解放する関数がないようです。
昔は FreeResource() / UnlockResource()ってのがあったんですけどね。
16bitの頃は要求されるまでメモリに読み込まれることが無かったので、
明示的な解放が必要だったのですが、今はリソースは常駐してるので
LoadResource()はメモリを検索するだけになっている、みたいです。
>exeファイルを作成した後に、リソースをexeの後ろにくっつけて
>アプリ起動時にそこから読み取るとか、そんな感じですかね?
それもありますね。
考えていたのはインストーラ的なもので、
実行ファイルの中に別の実行ファイルとデータを入れて、
最初の実行ファイルは展開と内部の実行ファイルを実行する、
というやつでした。
ちょっと反則ですかね(w
371ポイント を手に入れた。
|
|
|
|
Name: べっき ..ぴよぴよ(107ポイント)
Date: 2008/10/05(日) 21:14
No:22072
|
|
Title: 入力して計算
|
|
質問があります。
MAINN関数内で数字の入力と表示を行い
WARU5関数では計算のみを行いたいのですが
エラーが出てしまします。
うまくする方法をご教授願います。
--------------------------------------
#include <stdio.h>
int main()
{
int waru5();
int p,shou;
printf("数字を入力して下さい。\n");
scanf("%d",&p);
waru5();
printf("商は%dです\n ",shou);
}
int waru5()
{
int shou,p;
/* 商を代入 */
shou = p/5;
return shou;
}
107ポイント を手に入れた。
|
|
|
|
Name: べっき ..ぴよぴよ(401ポイント)
Date: 2008/10/05(日) 21:51
No:22074
|
|
Title: Re:入力して計算
|
|
>ばぐ さん
ありがとうございます。表示ができました。
あと申し訳ないのですがもう一点質問があります。
waru5to7関数内でPを5で割ったもの、7で割ったもの
をreturn したいのですがどう処理したらいいか分かりません。
教えて頂けないでしょうか?
----------------------------------------------
#include <stdio.h>
int p,shou5,shou7;
int waru5to7();
int main()
{
printf("数字を入力して下さい。\n");
scanf("%d",&p);
waru5to7();
printf("5で割った商は%dで、7で割った商は%dです。\n ",shou5,shou7);
}
int waru5to7()
{
/* 商を代入 */
shou5 = p/5;
shou7 = p/7;
return ;
}
294ポイント を手に入れた。
|
|
|
|
|
Name: バグ ..ハッカー(115,055ポイント)
Date: 2008/10/05(日) 22:00
No:22075
|
|
Title: Re:入力して計算
|
|
関数の戻り値は1つです。
2つ以上の値を書き換えたい場合で考えられる方法は…
1:グローバル変数を使用する
2:関数の引数にポインタを使用する
3:戻り値を、書き換えたい値の数だけメンバ変数をもった構造体にする
等が考えられますが…
一番ポピュラーなのは2番の方法ではないかと思われます。
132ポイント を手に入れた。
|
|
|
|
Name: kirbest ..かけだし(1,409ポイント)
Date: 2008/10/05(日) 17:08
No:22063
|
|
Title: 画像をメモリに読み込んだときにサイズを変えるには?
|
|
DXライブラリでゲームを製作していて、
様々なサイズの画像を同じサイズにして表示するためにDrawExtendGraphを使って表示していたのですが、
表示の際に回転をさせたいのです
普通回転表示にはDrawRotaGraphを使用しますが、これを使ってしまうと画像サイズが
元のサイズのままになってしまいます
画像をメモリに読み込んだときに、サイズを任意のサイズに拡大、縮小することはできないでしょうか?
108ポイント を手に入れた。
|
|
|
|
Name: Justy ..ハッカー(231,069ポイント)
Date: 2008/10/05(日) 17:17
No:22064
|
|
Title: Re:画像をメモリに読み込んだときにサイズを変えるには?
|
|
DrawRotaGraph2()か DrawRotaGraph2F()とかはどうですか?
DrawModiGraph()でも良さそうな気がします。
36ポイント を手に入れた。
|
|
|
|
Name: 大工 ..プログラマー(29,593ポイント)
Date: 2008/10/05(日) 08:32
No:22032
|
|
Title: 関数オブジェクトとsort関数.
|
|
クラスsample_stringのsei, meiに対してソートを行う関数オブジェクトCSort1(), CSort2()を作成しました.
しかし,出力結果で不具合が出たので質問させてください.
return num1.sei > num2.sei; return num1.mei > num2.mei;
となっていますが,それぞれの不等号を < に変更すると
何も表示されなくなってしまいました.
<sample>
">" バージョン
e: E
d: D
c: C
b: B
a: A
"<" バージョン
:
:
:
:
:
これは何が原因となっているのでしょうか?
どちらか一方に限定して,ソートを行うべきなのでしょうか?
また,メンバ変数をprivateにするとコンパイルエラーでした.
コンストラクタで値の変更を行っているのにエラーになるのはなぜでしょうか?
#include <vector>
#include <algorithm>
#include <iostream>
class sample_string {
public:
std::string sei;
std::string mei;
sample_string(const std::string& nm="", const std::string& ph="") {
sei = nm;
mei = ph;
}
};
/* 関数オブジェクト */
class CSort1 {
public:
// 関数オブジェクト
bool operator()(sample_string num1, sample_string num2);
};
// 関数オブジェクトの定義
bool CSort1::operator()(sample_string num1, sample_string num2) {
return num1.sei > num2.sei;
}
class CSort2 {
public:
// 関数オブジェクト
bool operator()(sample_string num1, sample_string num2);
};
// 関数オブジェクトの定義
bool CSort2::operator()(sample_string num1, sample_string num2) {
return num1.mei > num2.mei;
}
/* 演算子オーバーロード */
std::ostream& operator<<(std::ostream &os, const sample_string& vi) {
os << vi.sei << ": " << vi.mei;
return os;
}
int main(void) {
// 配列を準備する
std::vector<sample_string> nums(10);
int n = 0;
nums[n++] = sample_string("a", "A");
nums[n++] = sample_string("c", "C");
nums[n++] = sample_string("b", "B");
nums[n++] = sample_string("d", "D");
nums[n++] = sample_string("e", "E");
// 配列の先頭から末尾までの各要素について CSort() を呼び出す(sei)
std::sort( nums.begin(), nums.end(), CSort1() );
// 配列の先頭から末尾までの各要素について CSort() を呼び出す(mei)
std::sort( nums.begin(), nums.end(), CSort2() );
for(int i = 0; i < n; i++) {
std::cout << nums[i] << std::endl;
}
return 0;
}
878ポイント を手に入れた。
|
|
|
|
Name: 組木紙織 ..熟練のプログラマー(61,842ポイント)
Date: 2008/10/05(日) 09:24
No:22034
|
|
Title: Re:関数オブジェクトとsort関数.
|
|
前半部は長くなりそうなので、説明が簡単な後半部から説明をします。
>また,メンバ変数をprivateにするとコンパイルエラーでした.
>return num1.sei < num2.sei;
ここの部分で、
CSort1::operator()はsample_stringのメンバ変数に直接アクセスをしています。
よってコンパイルエラーになります。
一番単純な解決法はCsort1をsample_stringクラスのフレンドにしてあげることです。
またはsample_stringクラスにget()などのメンバ変数の値を返すメンバ関数を用意して
それを利用して、CSort1クラスを作ることです。
233ポイント を手に入れた。
|
|
|
|
|
Name: 組木紙織 ..熟練のプログラマー(62,038ポイント)
Date: 2008/10/05(日) 10:55
No:22035
|
|
Title: Re:関数オブジェクトとsort関数.
|
|
前半部分について
std::vector<sample_string> nums(10) は要素数が10の動的配列を
確保すると言う意味です。
動的と静的で異なりますが、
sample_string nums[10]
とほぼ同じ意味だと思ってください。
次にした操作は
nums[0]〜nums[4]まで値を入れるという操作なので、
nums[5]〜nums[9]までは現時点では何も入っていません。
"<"でソートすると何も入ってない文字列が一番最初に来るので
nums[0]〜nums[4]までは何も値は入っていないので、
何も出力されません。
初見では安定ソートと不安定ソートについても話す必要があると思って
前半部分は長くなると書いてしまいましたが、現在の問題には直接関係ないので
触れません。
196ポイント を手に入れた。
|
|
|
|
|
Name: 大工 ..プログラマー(29,634ポイント)
Date: 2008/10/05(日) 17:02
No:22062
|
|
Title: Re:関数オブジェクトとsort関数.
|
|
なるほど,なにかしらの内部エラーかと思ってたんですが,""のせいだったんですね^^;
ありがとうございました.
41ポイント を手に入れた。
|
|
|
|
Name: マニア ..ぴよぴよ(17ポイント)
Date: 2008/10/05(日) 00:37
No:22026
|
|
Title: 文字列の入れ替え
|
|
初めまして。最近C言語を学び始めた学生ですが、
課題に苦しんでします。
その内容が
「文字列を2バイトキーボードより入力する。(unsighned short型)
第一バイトと第二バイトの内容を入れ替えるプログラム」なのですが
いろいろ調べてみたら、どうやら共用体unionというものがつかえそうなのですが…
どうやればいいのか分かりません。どなたかご教授いただけないでしょうか。
17ポイント を手に入れた。
|
|
|
|
Name: box ..ハッカー(126,303ポイント)
Date: 2008/10/05(日) 07:03
No:22031
|
|
Title: Re:文字列の入れ替え
|
|
ab
という入力に対して
ba
という結果を得たいのですか?
だとすると、共用体を持ち出すほどの内容ではありません。
37ポイント を手に入れた。
|
|
|
|
|
Name: マニア ..ぴよぴよ(85ポイント)
Date: 2008/10/05(日) 11:32
No:22036
|
|
Title: Re:文字列の入れ替え
|
|
>ab
>という入力に対して
>ba
>という結果を得たいのですか?
そうですね。
間違えたのですが、共用体を使えという指定でした。
68ポイント を手に入れた。
|
|
|
|
|
Name: たかぎ [URL] ..熟練のプログラマー(60,996ポイント)
Date: 2008/10/05(日) 15:58
No:22059
|
|
Title: Re:文字列の入れ替え
|
|
まず、
> 文字列を2バイトキーボードより入力する。(unsighned short型)
とのことですが、「2バイトキーボード」とは何でしょうか?
あるいは、2バイトの文字列を入力するということでしょうか?
後者だとした場合、2バイトの中にはナル文字を含みますか?
カッコ内のunsigned short型が何を指しているのかも不明です。
そもそも、キーボードからの入力を読み取るための(処理系に依存しない)一般的な方法はありません。
> 第一バイトと第二バイトの内容を入れ替える
これと共用体は直接関係ありません。
140ポイント を手に入れた。
|
|
|
|
Name: どんぐり ..ぴよぴよ(29ポイント)
Date: 2008/10/05(日) 11:53
No:22037
|
|
Title: for文を使って。。
|
|
質問があります。
for文を使って下記のように表示したいのですが、うまく表示出来ません。
「*」の段と段の間に空白が入ってしまします。
どうしたら空白がでなくなるでしょうか>
どなたかご教授お願いします。
*
**
***
****
*****
-------------------------------------
#include <stdio.h>
int main(void)
{
int x,y;
/* 縦 */
for(x=0;x<6;x++)
{
/* 横 */
for(y=0;y<x;y++)
{
printf("*");
}
printf("\n");
}
}
29ポイント を手に入れた。
|
|
|
|
Name: Mist ..プログラマー(25,333ポイント)
Date: 2008/10/05(日) 12:09
No:22040
|
|
Title: Re:for文を使って。。
|
|
xの初期値を0からはじめているためです。
最初x=0,y=0となるので、内側のループが実行されずに改行だけされます。
修正方法はいくつかありますが以下はその一例です。
for(x=1; x<= 5; x++)
2ポイント を手に入れた。
|
|
|
|
|
Name: どんぐり ..ぴよぴよ(91ポイント)
Date: 2008/10/05(日) 13:02
No:22049
|
|
Title: Re:for文を使って。。
|
|
>mistさん
すいません。
for(x=1; x<= 5; x++) をやったのですが
「*」の段と段の間に空白が入ってしまします。
申し訳ないんですが全体のソースを載せていただけないでしょうか。
62ポイント を手に入れた。
|
|
|
|
|
Name: array ..プログラマー(30,004ポイント)
Date: 2008/10/05(日) 13:26
No:22051
|
|
Title: Re:for文を使って。。
|
|
質問内容だけでは、意味がよく分からなかったので、実際に実行してみたのですが、特に問題は無いみたいですが、どういうことでしょうか
上記のどんぐりさんのプログラムそのままで
#########実行結果#########
*
**
***
****
*****
※実行環境
OS Vista
コンパイラ Visual Studio 2008 コマンド プロンプト
86ポイント を手に入れた。
|
|
|
|
|
Name: Mist ..プログラマー(25,654ポイント)
Date: 2008/10/05(日) 13:37
No:22052
|
|
Title: Re:for文を使って。。
|
|
> 「*」の段と段の間に空白が入ってしまします。
段と段の間の空行なんてどんぐりさんが書いたプログラムからありませんよ。
*は他の字に比べて小さく上と下に隙間があるためその隙間が上下でつながると
間にもう一行あるように錯覚しているだけではないですか?
空いているという行をどうやって確認しましたか?
119ポイント を手に入れた。
|
|
|
|
|