C言語何でも質問掲示板



アンケートにご協力下さい → >> アンケートフォーム <<   エラーで投稿できない方は → こちら


規約と使い方

 
   ゲーム製作について   
     ・[21328] 管理人 
     ・[21331] yuuki++ 
     ・[21332] 御津凪 
     ・[21385] ムンバ 
     ・[21389] 管理人 
     ・[21390] ムンバ 
   コマンドプロンプトに ....   
     ・[21339] 御津凪 
     ・[21340] たかぎ 
     ・[21343] fight 
     ・[21349] バグ 
     ・[21367] たかぎ 
     ・[21368] ibis 
     ・[21370] 御津凪 
     ・[21371] fight 
     ・[21373] バグ 
     ・[21376] たかぎ 
    龍神録プログラミング ....   
     ・[21289] yuuki++ 
     ・[21290] array 
     ・[21293] 自由闊達 
     ・[21330] 管理人 
   .演算子 ->演算子 ....   
     ・[21300] nayo 
     ・[21303] konacchi 
     ・[21305] Justy 
     ・[21308] 御津凪 
     ・[21315] nayo 
     ・[21316] konacchi 
     ・[21324] バグ 
   無題   
     ・[21318] array 
     ・[21319] hatena 
     ・[21320] yuuki++ 
     ・[21322] hatena 
     ・[21323] hatena 
   ポインタについて   
     ・[21309] 御津凪 
     ・[21310] array 
   無題   
     ・[21260] たかぎ 
     ・[21295] yasya 
     ・[21298] Mist 
     ・[21306] yasya 
   オブジェクトに生成に ....   
     ・[21272] Justy 
     ・[21281] JugS 
     ・[21285] YuO 
     ・[21286] lbfuvab 
     ・[21287] J 
     ・[21288] バグ 
     ・[21291] たかぎ 
     ・[21292] Justy 
     ・[21294] JugS 
     ・[21297] konacchi 
     ・[21299] Mist 
     ・[21301] konacchi 
     ・[21302] yuuki++ 
     ・[21304] JugS 
   龍神録プログラミング ....   
     ・[21262] array 
     ・[21263] s 
     ・[21264] array 
     ・[21266] array 
     ・[21267] yuuki++ 
     ・[21268] 自由闊達 
     ・[21273] yuuki++ 
     ・[21274] s 
     ・[21275] 自由闊達 
     ・[21276] array 
     ・[21277] yuuki++ 
     ・[21278] yuuki++ 
     ・[21280] array 
     ・[21283] 自由闊達 
   3Dっぽい表現   
     ・[21279] nayo 
     ・[21282] 組木紙織 
   SetDrawScreen()が使え ....   
     ・[21255] tkmakwins15 
     ・[21256] yuuki++ 
     ・[21269] JugS 
   アロー演算子について   
     ・[21247] 御津凪 
     ・[21248] box 
     ・[21249] あなざぁ 
     ・[21250] あなざぁ 
     ・[21252] たかぎ 
   五目並べを作ろうとし ....   
     ・[21237] 組木紙織 
     ・[21238] box 
     ・[21241] ね〜す 
     ・[21242] Mist 
     ・[21244] ね〜す 
   C言語を始めたのですが ....   
     ・[21061] バグ 
     ・[21063] 管理人 
     ・[21066] pupil 
     ・[21068] 御津凪 
     ・[21070] 管理人 
     ・[21072] 管理人 
     ・[21073] 管理人 
     ・[21074] 管理人 
     ・[21085] pupil 
     ・[21089] pupil 
     ・[21090] 御津凪 
     ・[21092] 管理人 
     ・[21100] pupil 
     ・[21103] 管理人 
     ・[21106] pupil 
     ・[21108] 管理人 
     ・[21109] Justy 
     ・[21112] 管理人 
     ・[21113] たかぎ 
     ・[21114] Justy 
     ・[21115] 管理人 
     ・[21149] J 
     ・[21150] pupil 
     ・[21151] 管理人 
     ・[21153] Justy 
     ・[21176] pupil 
     ・[21177] 御津凪 
     ・[21179] 管理人 
     ・[21219] konacchi 
     ・[21222] Yuki 
     ・[21223] バグ 
     ・[21243] pupil 
   オセロMinMax法の実装   
     ・[21152] Justy 
     ・[21168] yujin 
     ・[21185] Justy 
     ・[21195] yujin 
     ・[21234] yujin 
   実行ファイルの作り方   
     ・[21232] array 
     ・[21233] 一戸建  
   教えてください   
     ・[21169] バグ 
     ・[21170] recoba 
     ・[21172] バグ 
     ・[21173] 管理人 
     ・[21174] recoba 
     ・[21175] recoba 
     ・[21183] バグ 
     ・[21186] recoba 
     ・[21187] バグ 
     ・[21188] recoba 
     ・[21190] フリオ 
     ・[21191] recoba 
     ・[21192] バグ 
     ・[21194] recoba 
     ・[21197] recoba 
     ・[21198] フリオ 
     ・[21199] recoba 
     ・[21200] バグ 
     ・[21201] recoba 
     ・[21212] バグ 
     ・[21213] たいちう 
     ・[21214] バグ 
     ・[21215] バグ 
     ・[21217] recoba 
     ・[21220] バグ 
     ・[21224] recoba 
     ・[21225] バグ 
     ・[21226] バグ 
     ・[21227] recoba 
     ・[21228] バグ 
     ・[21229] recoba 
     ・[21230] recoba 
   クラスのメンバ変数の ....   
     ・[21162] 御津凪 
     ・[21163] たかぎ 
     ・[21167] GPGA 
     ・[21171] ibis 
     ・[21178] たかぎ 
     ・[21218] GPGA 
     ・[21221] ibis 
   配列について   
     ・[21207] 管理人 
     ・[21208] 管理人 
     ・[21216] 柏 
   出力について(2)   
     ・[21209] 管理人 
     ・[21211] fight 
   出力について   
     ・[21196] box 
     ・[21203] fight 
     ・[21204] fight 
     ・[21206] fight 
     ・[21210] fight 
   ワイルドカード   
     ・[21096] Haru 
     ・[21097] Haru 
     ・[21102] toyo 
     ・[21105] Mist 
     ・[21116] Haru 
     ・[21132] フリオ 
     ・[21154] Haru 
     ・[21155] 御津凪 
     ・[21156] いけやん 
     ・[21157] Haru 
     ・[21158] 御津凪 
     ・[21159] Haru 
     ・[21160] いけやん 
     ・[21189] フリオ 
   こんな自分でもゲーム ....   
     ・[21181] ouh 
     ・[21182] 管理人 
     ・[21184] nirica 
   当り判定について   
     ・[21130] Justy 
     ・[21136] 御津凪 
     ・[21138] konacchi 
     ・[21145] konacchi 
     ・[21146] Justy 
     ・[21164] konacchi 
     ・[21165] konacchi 
   質問   
     ・[21107] 管理人 
     ・[21119] ibis 
     ・[21148] J 
   アルファブレンドにつ ....   
     ・[21139] 御津凪 
     ・[21140] ヤマ 
     ・[21141] 御津凪 
     ・[21142] ヤマ 
     ・[21143] Justy 
     ・[21144] ヤマ 
   ストップウォッチとタ ....   
     ・[21094] バグ 
     ・[21095] バグ 
     ・[21098] 管理人 
     ・[21099] 管理人 
     ・[21121] Jack 
     ・[21122] 管理人 
     ・[21123] バグ 
     ・[21124] Jack 
     ・[21127] Mist 
     ・[21128] 管理人 
     ・[21133] Jack 
     ・[21134] Mist 
     ・[21137] レッツ 
   オープニング画面   
     ・[21129] 管理人 
     ・[21131] 一ノ宮 
   デバイスコンテキスト   
     ・[21081] 御津凪 
     ・[21082] バグ 
     ・[21101] lbfuvab 
     ・[21120] abc 
   ファイル書き込み処理   
     ・[20868] 御津凪 
     ・[20870] Mist 
     ・[20903] あっちゃん 
     ・[21117] ym 
     ・[21118] たかぎ 
   超悩み   
     ・[21086] バグ 
     ・[21087] 御津凪 
     ・[21088] み 
     ・[21091] ibis 
     ・[21110] Justy 
     ・[21111] たかぎ 
   進むスピードを変えず ....   
     ・[21075] 管理人 
     ・[21076] 管理人 
     ・[21077] 御津凪 
     ・[21078] 御津凪 
     ・[21079] 自由闊達 
   Platform SDK のインス ....   
     ・[21053] 御津凪 
     ・[21057] t.h 
     ・[21058] 御津凪 
     ・[21060] t.h 
     ・[21065] t.h 
     ・[21067] 御津凪 
     ・[21069] t.h 

Name: ムンバ  ..ぴよぴよ(776ポイント)   Date: 2008/09/16(火) 02:49   No:21326       
Title: ゲーム製作について    
こんばんは。 初めまして、ムンバと申します。

彷徨った挙句、こちらのサイトにて質問させて頂きます。
(C++ で検索エンジンにて辿り着きました。)
年齢は、平均寿命の半分以上を超えてますので脳ミソは硬くなりつつあると思って下さい。(涙

が、どうしても作りたい(似たようなものを復活)させたいゲームがありまして 周りの人達(そのゲームに集ってた方々)から 「C++とかDirextXとか使わないと、あのゲームはできねんじゃね?」 とか言われたので・・・。

サーバーの老朽化という事で、廃止になってしまったゲームです。 (完全無料のゲームでした。)
C++を始める理由としては不純かもしれませんが C++を、ご解説されている色々なサイトを拝見させて頂いてるうちに
興味が沸いてきて勉強したくなったので、質問させて頂きます。 (前置き長くて、申し訳御座いません。)

C++を、5日前(9/10)より勉強を始めた超初心者です。(汗 他のサイトの事で申し訳ないのですが コンパイラのダウンロードや設定の仕方など(その他)の、
ご解説が私には解り易かったので そのサイトの、ご解説通りに Borland C++(無料版)をDLして設定しました。
5日しか経ってないので何とも言えないんです。
あっ!?うまく言えなくてすみません。
こちらの、ご解説や掲示板を見て VC++ の方が、いいのかな〜?って、悩んでます。

作りたいと思っているゲームは、(素人考えで、すみません。)
恐らく、C++ と DirextX を使って作るゲームで、2Dに近い3D?ゲームで 参加者は、チャットをしながら戦闘を待つのですが
指名されると1対1で、ゲームを競う。の様なゲームです。
この様なゲームを作りたいのですが コンパイラは何にしたらいいでしょうか?
どなたか、お時間ある時にでも、ご指導の程よろしくお願い致します。
(長文、申し訳御座いません。)


776ポイント を手に入れた。


Name: 管理人 [URL]  ..伝説のハッカー(791,267ポイント)   Date: 2008/09/16(火) 03:43   No:21328     
Title: Re:ゲーム製作について    
とりあえずコンパイラは何でもいいと思いますが、
私はVisualStudioをお勧めします。

たまにプロジェクトファイルが配布されているサイトをみかけますが、
そういうところにはVisualStudioのプロジェクトが多いように思います。

サンプルを実行するときもなれたインターフェイスの方がやりやすいですしね。
ちなみにうちのサンプルは全部VisualStudioです。
無料版で充分使えますし、機能も高いので、コンパイラとして申し分ないです。

どの程度のゲームを想像されているのか、よくわかりませんが、DirectXで3Dゲームを作るのは結構ハードルが高いです。
なので、最初のうちは3Dゲームを意識せず、小さな2Dゲームを沢山作って慣れていったほうがいいと思うので
うちで紹介しているDXライブラリをお使いになってはいかがでしょう。
DirectXの機能を2D限定で使いやすくしたライブラリです。

DXライブラリは3Dが表現出来ないのが欠点ですが、ゲームプログラムの作り方の勉強にはなります。
あと、2D風の3Dゲームなのと、3D風の2Dゲームじゃかなり難易度が違うと思いますが
どちらなのでしょう?
まぁスーファミのマリオカートを後者に分類するなら後者も難しいでしょうが・・。
具体的なゲーム名を教えていただければより詳しい回答が集まるかもしれません。
また、本格的に作るのなら線形代数やベクトル計算の知識もいるので、数学のおさらいもしておくといいかもしれません。


354ポイント を手に入れた。

Name: yuuki++  ..かけだし(1,964ポイント)   Date: 2008/09/16(火) 07:31   No:21331     
Title: Re:ゲーム製作について    
ただ、最新のDirectX SDKを直接使うにはBorland C/C++ Compilerでは少々面倒になります。
ライブラリが読み込めないので・・・


64ポイント を手に入れた。

Name: 御津凪 [URL]  ..中級者(12,626ポイント)   Date: 2008/09/16(火) 10:29   No:21332     
Title: Re:ゲーム製作について    
オンラインゲームとしては、MMORPGのように、常時複数人と対応するものではないらしいので、
比較的簡単な部類ですが、
恐らく、初めて作るゲームとしては正直厳しいかもしれません。
まずは、

じゃんけんゲームのような簡単な遊びをするゲーム、
簡単なアクションゲーム、
チャットをするソフト、

の三つを作ってみると良いかもしれません。
それぞれムンバさんの目的とする要素が含まれていると思いますので、
この三つを作ることが出来たら、

そのゲームを作ることは夢ではありません。

プログラミング言語を覚えるのは、はじめが肝心です。
最初はあせらずゆっくりとやっていって、わからなかったら調べるか、
ここのような掲示板で質問していってください。
サポートしてくれますよ。


296ポイント を手に入れた。

Name: ムンバ  ..かけだし(1,548ポイント)   Date: 2008/09/16(火) 23:16   No:21385     
Title: Re:ゲーム製作について    
管理人(様、ご配慮ありがとう御座いました。)さん、yuuki++さん、御津凪さん。
早速の丁重なご解説、どうもありがとう御座います。
すみません。私の言葉が足りなかったです。

根本的にC++の事は何にも解って無いので正直
こちらの掲示板で引き続き、質問などして良い内容なのかどうかも迷ったのですが
改めて質問させて頂きます。宜しくお願い致します。

1998年5月〜2001年6月まで、プロバイダ(H○-h○)に搭載・設置されてました
「なんバト」と言うゲームです。
プログラミングされた方が疾走してしまった説。etcなど、色々と噂もあったのですが
閉鎖の理由が謎?の多いゲームでした。
当時の解説では、3Dに近い2Dと解説されていた記憶があるので、たぶん2Dなのだと思います。
DirectX 6の環境で動いていたと思います。
DirectX 7(が提供されたので)をインストールした所、ゲームに参加できなくなり6に戻した記憶があります。

私が最初に(自分なりに解るかな?と思って)辿り着いたページに
C++環境の構築を、ご解説されてるサイトがありましたので
コンパイラ Borland C++Compiler 5.5
エディタ BCC Developer
ライブラリ DXライブラリ(BorlandC++ 用)
ご解説通りにやってみたら、うまく動作しました。
(中略)
その後、こちらのページに辿り着いたのです。
(BCCは、C++の基礎を勉強する時に使用する事にしてみました。)
こちらの、ご解説を見て「俺には、ここだっ!」と勝手に感じてしまったのですが
掲示板では、VC++に変更したい方を御見受けし
ゲームプログラミングの館では(管理人さんが)VC++を使用してる様に御見受けしました。
そこで、VC++ 2008が無料でしたので早速DL(専用のDXライブラリも)して
こちらのページの、ご解説通りにやってみたら、うまく動作しました。
コンパイラ VisualStudio
エディタ Visual C++ 2008
ライブラリ DXライブラリ(Visual C++ 用)

・エディタとコンパイラなのですが、この↑の私の解釈で宜しいでしょうか?
 すみません!これが、今回の質問だったのです。
 またまた、長々と申し訳け御座いません。本当にバカですみません。(謝

C++の基礎の勉強をしながら並行して
こちらの「ゲームプログラミングの館」でC++のゲームの勉強をさせて頂き
最終的な目標は「なんバト」に似たゲームを作りたいという、かなり自分勝手な欲望なのです。
みんなで集まってチャットができて、雑談しながらチャットルームで待機してるのですが
そこにゲームコーナーみたいなのがあって、呼び出されたら(ゲーム)拒否していない時は
1対1で、ジャンケンゲームしたりとか簡単に作れそうな?ゲームができる様にしたいだけです。

改めて読み返してみて、自分勝手な要求が多い質問だと思いました。(激汗
つまり、エディタとコンパイラについての質問だったのです。
申し訳御座いませんでした。


772ポイント を手に入れた。

Name: 管理人 [URL]  ..伝説のハッカー(792,078ポイント)   Date: 2008/09/17(水) 00:18   No:21389     
Title: Re:ゲーム製作について    
DirectX5.0で作られているゲームのようですね、
6.0を入れたら動作が変になるとかって記事がありました。
・・随分昔のゲームですねw

しかしどこ探しても参考になりそうなサイトがないですね・・。
youtubeにもニコニコにもプレイ動画ないですし。

コンパイラとライブラリはそれでいいです。
エディタは別に意識せずともvsの機能の中にあるので大丈夫です。

あと、うちのサイトはDirectXでも、C++でもないですが、大丈夫でしょうか?

仰るゲームはなんちゃって程度ならDXライブラリでも出来るかもしれません。
つまり小規模なハンゲームみたいなものを作りたいわけですよね。

私もDXライブラリでなんちゃってオンラインゲームは作ってみましたが
オンラインゲームは常に同期とるのが結構面倒ですよね〜。
まぁ、本格的に作るにしてもまずこちら(DXライブラリ)で練習してみてはどうでしょう。

いつもこちらで一番最初に作るゲームとしてお勧めしているのがジャンケンゲームです。

http://www.play21.jp/board/formz.cgi?action=res&resno=19213&page=&lognum=61&id=dixq&rln=19340

もしよければ参考にして下さい。


495ポイント を手に入れた。

Name: ムンバ  ..かけだし(2,000ポイント)   Date: 2008/09/17(水) 01:02   No:21390 解決!     
Title: Re:ゲーム製作について    
度重なり、ご解説ありがとうございます。

ハンゲームの様なゲームを作りたいのではありません。
無料だと言う言葉に誘われ、気が付いたら課金を使ってた自分に腹を立てていた時期はありましたが・・・
えっ?ん?あははっ!誘導尋問されちゃいましたねっ。
やっぱり動機は不純かもしれませんが、私の意思は変わりません。w

課金や宣伝をするゲームを作るつもりは、ありません。
しつこい様ですが、なんバトで知り合った方々と
また、なんバトに参加されてた方達のみで同じ様な似たページででも、再会したいだけです。
そのためだけに、C++言語を勉強したいと思っています。
できるかどうかは、わかりませんが寿命まで諦めないでやってみたいと思います。^^

>コンパイラとライブラリはそれでいいです。
>エディタは別に意識せずともvsの機能の中にあるので大丈夫です。
この組み合わせで大丈夫と言うことですね。ありがとうございます。

>あと、うちのサイトはDirectXでも、C++でもないですが、大丈夫でしょうか?
 大丈夫だと思ったので書き込みさせて頂きました。
 最後まで勉強させて頂きます。<(_ _)>

 今後とも宜しくお願い致します。
 ありがとうございました。




452ポイント を手に入れた。



Name: fight  ..かけだし(1,117ポイント)   Date: 2008/09/16(火) 13:47   No:21338       
Title: コマンドプロンプトについて    
C言語を使ってプログラミングをしている者です。コマンドプロンプトで大きい行列(特に列が大きい)の計算をすると上手く表示されなくなってしまいます。コマンドプロンプトのプロパティで横に長くするように設定を変えても上手くいきません。このような場合に何か解決する方法はありますか?どうかよろしくお願いします。

89ポイント を手に入れた。


Name: 御津凪 [URL]  ..中級者(13,143ポイント)   Date: 2008/09/16(火) 14:06   No:21339     
Title: Re:コマンドプロンプトについて    
必ずコマンドプロンプト上に表示しなければならないわけではないのであれば、
いくつかの方法があります。

一つ目は、出力するデータをファイルに記録すること。
もう一つは、以下のようにして実行すること。
実行ファイル.exe > 書き出しファイル


後者の方を使用する場合で、VC++の場合、下記のようにすると出来ます。

1.プロジェクトのプロパティを開く
2.「デバッグ」カテゴリの「パラメータ(引数)」に、"> (出力ファイル名)"を入れる。
3.適用して実行する。



166ポイント を落としてしまった。

Name: たかぎ [URL]  ..熟練のプログラマー(58,876ポイント)   Date: 2008/09/16(火) 14:08   No:21340     
Title: Re:コマンドプロンプトについて    
どんな内容を出力して、どう上手くいかないのかを補足してください。

20ポイント を手に入れた。

Name: fight  ..かけだし(1,051ポイント)   Date: 2008/09/16(火) 14:33   No:21343     
Title: Re:コマンドプロンプトについて    
>たかぎさん
例えば簡単なものだと1行200列の行列の足し算をすると結果が2行以上で出てくるので・・・それを1行で表示するための方法が知りたいと思っています。


66ポイント を落としてしまった。

Name: バグ  ..ハッカー(110,774ポイント)   Date: 2008/09/16(火) 14:50   No:21349     
Title: Re:コマンドプロンプトについて    
WIN32APIならば、SetConsoleScreenBufferSizeという関数で、ある程度までならバッファサイズを変更する事ができます。フォントの大きさや環境によって限界値が変わるようなので、fightさんの環境で試してみてください。

ただし、200個のデータの足し算となると1行に表示するのは厳しいんじゃないかとは思いますが…


119ポイント を落としてしまった。

Name: たかぎ [URL]  ..熟練のプログラマー(59,183ポイント)   Date: 2008/09/16(火) 18:55   No:21367     
Title: Re:コマンドプロンプトについて    
1個あたりのデータが3桁以内であれば、幅3ピクセルのラスタフォントを使えば、区切りの空白も入れて、1列辺り12ピクセルですね。
200列であれば2400ピクセルですので、WQXGAのモニタを使えば折り返しなしで表示できます。


105ポイント を手に入れた。

Name: ibis  ..中級者(13,018ポイント)   Date: 2008/09/16(火) 19:13   No:21368     
Title: Re:コマンドプロンプトについて    
いや、モニタは関係無いですよ。
コマンドプロンプトはウィンドウ幅に上限があります。
最大化したらウィンドウの高さは大きくなるのですが、幅は変わらないですね。
コマンドプロンプトでは、多分どうやっても80桁までしか表示できないです。


71ポイント を手に入れた。

Name: 御津凪 [URL]  ..中級者(14,584ポイント)   Date: 2008/09/16(火) 19:28   No:21370     
Title: Re:コマンドプロンプトについて    
プロパティで変更したコマンドプロンプトでそのプログラムを実行してみたら良いのではないでしょうか。
(画面バッファの幅を変更)


47ポイント を手に入れた。

Name: fight  ..かけだし(1,089ポイント)   Date: 2008/09/16(火) 19:47   No:21371 解決!     
Title: Re:コマンドプロンプトについて    
たくさんのご回答ありがとうございました。皆さんにアドバイスをいただいたことを参考にしてこれからも勉強していこうと思います。

38ポイント を手に入れた。

Name: バグ  ..ハッカー(110,939ポイント)   Date: 2008/09/16(火) 20:31   No:21373     
Title: Re:コマンドプロンプトについて    
>ibisさん
Windows.hをインクルードできる環境ならば、私が前述した関数でサイズ変更できますよ。
横幅80は初期値なので変更しなければ最大化すると、この幅になります。


54ポイント を手に入れた。

Name: たかぎ [URL]  ..熟練のプログラマー(59,134ポイント)   Date: 2008/09/16(火) 20:53   No:21376     
Title: Re:コマンドプロンプトについて    
横幅は変更できますね。
ただ、モニタの解像度が低いと横スクロールバーが出てきますので、解像度の高いモニタが必要です。


49ポイント を落としてしまった。



Name: 自由闊達  ..かけだし(1,525ポイント)   Date: 2008/09/15(月) 03:17   No:21284       
Title: 龍神録プログラミングの館の13章について2    
前の質問を解決してもらって、新たに13章でわからないところが出来たのでお願いします。

1.探したのですが下の三つが見つからない(多分関数?)
enter_shot
shot_search
shotatan2

2.SE_MAXの定義も見つからなかったけど、音楽ファイルが20個あったので20で作ればいいのでしょうか?

3.se_flagも見つからなかったけどse_flag[SE_MAX]で作ればいいのでしょうか?

わからない事が多くてすいません、よろしくお願いします。


177ポイント を手に入れた。


Name: yuuki++  ..かけだし(1,464ポイント)   Date: 2008/09/15(月) 09:06   No:21289     
Title: Re: 龍神録プログラミングの館の13章について2    
1.については、言うとおり関数です。
shot_search・・・空いている弾配列を探す
shotatan2・・・敵→自機への角度を返す
enter_shot・・・弾幕を登録する
これらは、弾幕を作るときに使用する関数なのですが、関数自体は作成しましたか?

作成していたら、宣言場所の関係を直すだけなのですが・・・

2.と3.についてはその通りですよ。
SE_MAXとは、効果音フラグの配列の数ですから、同時に鳴る効果音の最大数になりますね。
そしてその「効果音フラグ」がint se_flag[SE_MAX]です。
音を鳴らしたいところで1を入れて、実際に鳴らした直後かループの最初でリセットする、というように使います。


219ポイント を手に入れた。

Name: array  ..プログラマー(27,030ポイント)   Date: 2008/09/15(月) 09:43   No:21290     
Title: Re: 龍神録プログラミングの館の13章について2    
なるほど、なんでエラーが出てるのか不思議でしたが、たぶん手打ち(かコピペ)で頑張ってるんですね。
詳しくは覚えてないですが、前に管理人さんが全部は説明していないって言ってましたから、プロジェクトをDLして前章と比較していく必要があるかもしれません。

基本的にyuuki++さんの通りで間違ってないと思いますが、

13章のプロジェクトをDLしてみてくださいね。
1.に関して

enter_shot() ⇒ enemy/enemy.cpp の55行目
shot_search() ⇒ shot/shot.cpp の15行目
shotatan2() ⇒ shot/shot.cpp の10行目

2.に関して
>SE_MAXの定義も見つからなかったけど、音楽ファイルが20個あったので20で作ればいいのでしょうか?
で大丈夫ですが

define.h の12行目 にも記述されています。

3.に関して

GV.h の15行目に記述されてます。





189ポイント を手に入れた。

Name: 自由闊達  ..かけだし(1,566ポイント)   Date: 2008/09/15(月) 11:41   No:21293 解決!     
Title: Re: 龍神録プログラミングの館の13章について2    
なるほど、館には全部載ってないのですね

ダウンロードしたのを見て比較しながらやりたいと思います、ありがとうございました。


41ポイント を手に入れた。

Name: 管理人 [URL]  ..伝説のハッカー(791,583ポイント)   Date: 2008/09/16(火) 06:22   No:21330     
Title: Re: 龍神録プログラミングの館の13章について2    
最初は全部記載しないつもりだったのですが、
どうも手打ちで一つ一つ丁寧に確認されている方が多く、
小さい変更が書いてないとわかりにくいという意見が多く寄せられましたので、
全部かいていくつもりです。
一応少しずつ修正していったのですが、今までの変更点を全て修正するのは手におえなくて・・。

なので、もし記載していない変更箇所がありましたら、教えていただけるとありがたいです。

後、龍神録の館の方、1ヶ月ぶりに38章追加しました。
これからもちゃんとコンスタントに作るよう努力します^^;


2倍のポイントを手に入れた! 294ポイント を手に入れた。



Name: konacchi  ..かけだし(2,185ポイント)   Date: 2008/09/15(月) 12:42   No:21296       
Title: .演算子 ->演算子 について    
vc++6.0を使用しています。

雑談的なものです、
構造体や、クラスやクラスのポインタを参照する場合.演算子 ->演算子 を使用しますが、
記述が間違っていないのに その後に続くステータスが出てこない場合があります。


struct {
int a;
int b;
int c;
}Hoge;


Hoge.

........(あれ?出ない(汗))

Hoge.a = 0;

(出ないけど まぁいいか)


コンパイルエラー無し。

といった症状が出ます。
Hoge.の後は出るときもあります、そして出ない時もあります。

vc++6.0を使っている友人に聞いてみたら「うーん安定しないね、俺も出ない時あるよ->とか特にね」
と言われました。

こういう症状が出た事がある方いますか??
vc側に設定があるのか、何が悪いのかいまいち判りません。
もしかしたら記述が悪いのかも・・・。
そんなに困るワケではありませんが、たまにイラッっときます。


426ポイント を手に入れた。


Name: nayo  ..入門者(3,420ポイント)   Date: 2008/09/15(月) 13:04   No:21300     
Title: Re:.演算子 ->演算子 について    
Hoge.の後がでないときは
その状態でその場所の前(後も?)にエラーがあるときのような気がします

しかし実際どうなんでしょう
私も気になるときがあります

元々Borlandの方を使っていたため
未だにVC++の機能を使いこなせていないところも多々…


80ポイント を手に入れた。

Name: konacchi  ..入門者(2,502ポイント)   Date: 2008/09/15(月) 13:30   No:21303     
Title: Re:.演算子 ->演算子 について    
nayo様もありますか。

気になりますよね。

エラー無い時もなったりしますし。


2倍のポイントを手に入れた! 68ポイント を手に入れた。

Name: Justy  ..ハッカー(222,465ポイント)   Date: 2008/09/15(月) 13:47   No:21305     
Title: Re:.演算子 ->演算子 について    

>記述が間違っていないのに その後に続くステータスが出てこない場合があります

 インテリセンスのことでしょうか?

Visual C++ 6.0 での IntelliSense の制限の一覧
ttp://support.microsoft.com/kb/153284/ja

 うちは VC6ではないですが、候補が出てこないのはよくありますね。

 それでイライラすることはないのですが、逆に出てこられる方がうっとしいことが多いです。
 気持ちよくタイプしてたら突然候補ウインドウが出て、間違って確定してしまったり
巨大なライブラリの名前空間を入力して :: としたら以降の候補リストを出すために
何秒も固まる、とか。


177ポイント を手に入れた。

Name: 御津凪 [URL]  ..中級者(11,780ポイント)   Date: 2008/09/15(月) 16:45   No:21308     
Title: Re:.演算子 ->演算子 について    
どうしても出したい場合は、
一旦そのプロジェクトを閉じ、
プロジェクト(ソリューション)のフォルダを開いて、
*.ncb(Intellisense Database) のファイルを削除して、(VC6も同じ拡張子?)
再度プロジェクトを開きます。

すると、ステータスバーにインテリセンスの更新の文字が表示されるので、
終了するまで待ちます。
(大きなプロジェクトや SDK の類を沢山インクルードしている場合は時間がかかります)
(このとき、一時的に CPU と メモリを食うので、貧弱な環境では注意してください)

これで、ちゃんと出ると思います。

プロジェクト作成初期のときは、更新ミスも無く、きちんと表示できるのですが、
バグ取りや大幅な修正ばかりしていると、更新されないことが多くなるようです。
(推測ですが)

また、しばらく入力が無い(2秒前後?)と更新されないので、
出なかったら一回手を止めてみるのも一つの手です。
(大体はこれでも直らないこともありますが)


232ポイント を落としてしまった。

Name: nayo  ..入門者(3,532ポイント)   Date: 2008/09/15(月) 18:56   No:21315     
Title: Re:.演算子 ->演算子 について    
なるほど、参考になります
しかし、製作者側は便利になるようつけた機能でも状況によっては厄介になることもあるものですね

個人的に自動修復の保存で一瞬固まるのが嫌ですね
まぁ以前それで救われたことがあったわけですが


2倍のポイントを手に入れた! 112ポイント を手に入れた。

Name: konacchi  ..入門者(2,665ポイント)   Date: 2008/09/15(月) 19:21   No:21316     
Title: Re:.演算子 ->演算子 について    
Justy様<
インテリセンスっていうんですか、ためになります。
私は記憶力が乏しいのであれが出てこないと、「なんだっけ??」と定義まで飛んで確認してしまいます・・・笑

御津凪様<
ありがとうございます。
更新の仕方があったんですね、
試してみます。
どうしてもってワケではないですが、私レベルだとやっぱりあって欲しいと思いますので。

nayo様<
もう頭にすべて入っていて、テンポ良く打っているときに出てくるとイラつくって話は聞いたことありますね。
私はというと「でてくれー!頼むからでてくれー!!」と心の中で叫んでいるワケですが 笑


163ポイント を手に入れた。

Name: バグ  ..ハッカー(110,893ポイント)   Date: 2008/09/15(月) 23:11   No:21324     
Title: Re:.演算子 ->演算子 について    
とりあえず、VC++6.0用の修復方法を記述しておきますね。
VC++6.0を終了させて、プロジェクトが保存されているフォルダ内の下記の拡張子のファイルを削除してください。

ncb
opt
clw
aps

その後、もう一度VC++6.0を起動して、プロジェクトをリビルドしてください。これで修復できるはずです。

もしそこまでしなくても、とりあえず的にメンバ変数or関数を知りたいだけなんだというのであれば、ローカルに1つオブジェクトを生成してやるコードを記述してやると、どういう訳かそのオブジェクトのメンバは表示されるはずです。

表示されることに慣れていると、急に表示されなくなるとイライラしますよね(笑)


280ポイント を手に入れた。



Name: hatena  ..ぴよぴよ(96ポイント)   Date: 2008/09/15(月) 21:14   No:21317       
Title: 無題    
すっごい所歩的かとおもいますが
11章の(エクセルを使って敵の出現データを作ってみよう)
ってとこで
--ini.cppのini関数に以下を追加--

memset(enemy_order,0,sizeof(enemy_order_t)*ENEMY_ORDER_MAX);



ini関数ってなんですか?


96ポイント を手に入れた。


Name: array  ..プログラマー(27,618ポイント)   Date: 2008/09/15(月) 21:28   No:21318     
Title: Re:無題    
iniは自作関数です。(自分で用意する関数で呼び出すとその処理をしてくれます)

Initialization(初期化)

の略でiniになってるんだと思います。


11章のプロジェクトを開けば分かりますが、ini.cppファイルに
void ini(){
〜〜
}
ってあるのでそこに追加しましょうということです。


88ポイント を手に入れた。

Name: hatena  ..ぴよぴよ(0ポイント)   Date: 2008/09/15(月) 21:45   No:21319     
Title: Re:無題    
#include "../include/GV.h"

//一番最初の初期化
void first_ini();){

configpad.down=0;
configpad.left=1;
configpad.right=2;
configpad.up=3;
configpad.bom=4;
configpad.shot=5;
configpad.slow=11;
configpad.start=13;
configpad.change=6;
}

//ゲームの初期化
void ini();){
stage_count=1;
memset(&ch,0,sizeof(ch_t));//自機データの初期化
ch.x=FIELD_MAX_X/2;
ch.y=FIELD_MAX_Y*3/4;

}
返答ありがとうございます
いまいちよくわからないので
これのどこに入れればいいですか


169ポイント を落としてしまった。

Name: yuuki++  ..かけだし(1,900ポイント)   Date: 2008/09/15(月) 21:48   No:21320     
Title: Re:無題    
これは敵の出現データを初期化するためのコードなので、とりあえず

memset(&ch,0,sizeof(ch_t));//自機データの初期化

これの下あたりに入れておけばいいと思います。
もちろん、これから作り進めるにあたって「いつ読み込んで、初期化するか」は自分でどんどん変えられます。


108ポイント を手に入れた。

Name: hatena  ..ぴよぴよ(509ポイント)   Date: 2008/09/15(月) 22:20   No:21322     
Title: Re:無題    
1>------ ビルド開始: プロジェクト: RyuJin, 構成: Debug Win32 ------
1>コンパイルしています...
1>cl : コマンド ライン warning D9035 : オプション 'Wp64' の使用は現在推奨されていません。今後のバージョンからは削除されます。
1>ini.cpp
1>c:\users\hatena\desktop\龍神録プロジェクト\1章\mydat\source\ini.cpp(4) : error C2059: 構文エラー : ')'
1>c:\users\hatena\desktop\龍神録プロジェクト\1章\mydat\source\ini.cpp(4) : error C2447: '{' : 対応する関数ヘッダーがありません (旧形式の仮引数リスト?)
1>c:\users\hatena\desktop\龍神録プロジェクト\1章\mydat\source\ini.cpp(18) : error C2059: 構文エラー : ')'
1>c:\users\hatena\desktop\龍神録プロジェクト\1章\mydat\source\ini.cpp(18) : error C2447: '{' : 対応する関数ヘッダーがありません (旧形式の仮引数リスト?)
1>ビルドログは "file://c:\Users\hatena\Desktop\龍神録プロジェクト\1章\Debug\BuildLog.htm" に保存されました。
1>RyuJin - エラー 4、警告 1
========== ビルド: 0 正常終了、1 失敗、0 更新不要、0 スキップ ==========

入れてみましたができませんでした
こんな感じででたんですが
どこを直したらいいと思いますか?


509ポイント を手に入れた。

Name: hatena  ..ぴよぴよ(543ポイント)   Date: 2008/09/15(月) 22:26   No:21323 解決!     
Title: Re:無題    
できました〜
ありがとうございました


2倍のポイントを手に入れた! 34ポイント を手に入れた。



Name: ライン  ..ぴよぴよ(108ポイント)   Date: 2008/09/15(月) 16:43   No:21307       
Title: ポインタについて    
#include <stdio.h>

main()
{
int a=100,b;
int *p_a;

p_a=&a;
b=*p_a;
printf("変数a,変数b,ポインタの内容\n");
printf("a=%d b=%d *p_a=(ポインタ ノナ イヨウ)%d",a,b,*p_a);
}

上記のプログラムが本を見ながらやったのですが、ポインタの意味がよくわからないです。
くわしい説明をお願いします。


108ポイント を手に入れた。


Name: 御津凪 [URL]  ..中級者(12,330ポイント)   Date: 2008/09/15(月) 17:09   No:21309     
Title: Re:ポインタについて    
ポインタとはアドレス、つまり、値の住所を格納することができる型です。

家の住所がこれに当たるでしょう。

上記のコードでは、 p_a=&a; で a の住所を p_a に格納し、
b=*p_a; で p_a の住所にある値を b に格納しています。

p_a は、住所を格納しているので、実際の値(a の値)を持っていません。
そのため、上記のコードを、

#include <stdio.h>

int main( void )
{
int a=100,b;
int *p_a;

p_a=&a;
b=*p_a;
printf("変数a,変数b,ポインタの内容\n");
printf("a=%d b=%d *p_a=(ポインタ ノナ イヨウ)%d\n",a,b,*p_a);

a = 200;
printf("a=%d b=%d *p_a=(ポインタ ノナ イヨウ)%d\n",a,b,*p_a);

return 0;
}

と変更して実行すると、
a は 200、
b は 100、
そして、 *p_a は 200 になるはずです。
これは、 *p_a は a の住所を指しているため、間接的に a の値を取得しているからです。
(これで理解できるでしょうか。)

ちなみに、 main 関数が違ったり、戻り値が付いているのは、こちらが正しい関数の書き方だからです。
(引数は使わないので空( void )にしています)


2倍のポイントを手に入れた! 550ポイント を手に入れた。

Name: array  ..プログラマー(27,530ポイント)   Date: 2008/09/15(月) 17:19   No:21310     
Title: Re:ポインタについて    
先越されましたが一応書いたので(^^;

御津凪さんと同じような事しか言ってませんけど。文で説明してるので読む気になれば、読んでください。



この前本屋でみたのですが、ポインタや配列を覚えるのは「Cの絵本」ってやつが、とても分かりやすかったです。

プログラムの考えみたいのが、絵を使いとてもわかりやすく解説してくれてます。あまり詳しく見てませんが、多分システム的な意味でも理解できるような気がします。


>上記のプログラムが本を見ながらやったのですが、ポインタの意味がよくわからないです。

なんか大雑把すぎて何を説明して良いのか分かりませんが

ポインタの意味としては、int a;で宣言すればaはアドレスを持つ(御津凪さんのいう住所です。)わけですが、このアドレスを、ポインタで示してあげて値を呼び出すためのものだ思います。

aの値を出力するには普通にprintfで出力できますよね。

このaをポインタでも呼び出すことができるんです。

int *p_a;とポイント形式で宣言してあげて

ポインタにaの値が格納されてる場所(アドレス:御津凪さんのいう住所)を教えてあげます。

そして、printfで出力する際に、ポインタで、aの場所を出力して!って言えば同じようにaが出力されるわけです。

その際、printf("ポインタからの出力=%d",*p_a); で出力できます。


・・・・なぜポインタを使う必要がある?と聞かれれば理由はありますが、まずはこれから理解した方が良いと思います。


500ポイント を手に入れた。



Name: yasya  ..かけだし(2,374ポイント)   Date: 2008/09/14(日) 22:14   No:21259       
Title: 無題    
こんばんは。
質問なんですか、今、ゲームを作るのにCStringクラスというのを使ってます。
しかし、これをデバックすると、

warning C4996: 'sprintf': This function or variable may be unsafe. Consider using sprintf_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
c:\program files\microsoft visual studio 9.0\vc\include\stdio.h(366) : 'sprintf' の宣言を確認してください。

などの警告が10個近く出てしまいます。
まあ、警告なのでプログラムは通るのですが、この警告を消すことはできないでしょうか?


262ポイント を手に入れた。


Name: たかぎ [URL]  ..熟練のプログラマー(58,823ポイント)   Date: 2008/09/14(日) 22:29   No:21260     
Title: Re:無題    
警告の抑止方法は、警告メッセージの中で記述されています。


17ポイント を手に入れた。

Name: yasya  ..かけだし(1,885ポイント)   Date: 2008/09/15(月) 12:13   No:21295     
Title: Re:無題    
上の質問で書いた、

This function or variable may be unsafe. Consider using sprintf_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.

の部分を訳すと、

この機能または変数は、安全でないかもしれません。その代わりにsprintf_sを使うことを考えてください。非難を抑制するために、_CRT_SECURE_NO_WARNINGSを使ってください。詳細はオンラインヘルプを見てください。

ということになりました。
それで、書いてる通りにsprintfをsprintf_sに変えてんですけど・・・。
今度は、

error C2664: 'int sprintf_s(char *,size_t,const char *,...)' : 2 番目の引数を 'const char [3]' から 'size_t' に変換できません。(新しい機能 ; ヘルプを参照)
この変換が可能なコンテキストはありません。

というエラーが出るようになってしまいました^^;
sprintfをsprintf_sに変えるだけでは駄目なのでしょうか。どうしたらエラーを消せるのか教えて下さい。
ちなみに、コードは「C++ CStringクラス」と検索したら出てきます。








489ポイント を落としてしまった。

Name: Mist  ..上級者(21,569ポイント)   Date: 2008/09/15(月) 12:53   No:21298     
Title: Re:無題    
> 非難を抑制するために、_CRT_SECURE_NO_WARNINGSを使ってください。

sprintfを使ってワーニングを出さないようにする方法はここに書いてる。
やり方は「VC++ 警告抑制」でググればたくさんヒットします。

> error C2664: 'int sprintf_s(char *,size_t,const char *,...)' : 2 番目の引数を 'const char [3]' から 'size_t' に変換できません。(新しい機能 ; ヘルプを参照)

ヘルプ見てください。
書いてます。


2倍のポイントを手に入れた! 38ポイント を手に入れた。

Name: yasya  ..かけだし(1,865ポイント)   Date: 2008/09/15(月) 14:16   No:21306 解決!     
Title: Re:無題    
ありがとうございます。
おかげで、解決しました^^


20ポイント を落としてしまった。



Name: JugS  ..入門者(3,812ポイント)   Date: 2008/09/15(月) 00:36   No:21270       
Title: オブジェクトに生成について    
最近、オブジェクト指向について勉強しているのですが、
勉強といっても「C++で学ぶオブジェクト指向プログラミング」 湯田幸八 著
を読んでみた程度ですが、

オブジェクト指向で「勇者のくせになまいきだ」というソフトを、
部分的に再現してみようかなと思っているのですが、

このゲームは味方が100体以上になることもあるのですが
この場合、
味方を1つのオブジェクトとすると、100体味方を召喚すると、
100体分オブジェクトを生成するのでしょうか?

なんだかデータが膨大になってしまいそうな気がするのですが、


191ポイント を手に入れた。


Name: Justy  ..ハッカー(222,105ポイント)   Date: 2008/09/15(月) 00:52   No:21272     
Title: Re:オブジェクトに生成について    

>味方を1つのオブジェクトとすると、100体味方を召喚すると、
>100体分オブジェクトを生成するのでしょうか?

 そうです。



>なんだかデータが膨大になってしまいそうな気がするのですが

 100体でデータが膨大過ぎるというのであれば、体数を減らすか
1体あたりのデータ量を減らすしかないかと。


 ・・・って 100体くらいでそんな膨大になるのでしょうか?


242ポイント を手に入れた。

Name: JugS  ..入門者(3,836ポイント)   Date: 2008/09/15(月) 02:11   No:21281     
Title: Re:オブジェクトに生成について    
実際は分からないので、適当に考えてみたのですが、

データメンバ
画像、体力、攻撃力、フラグ数種

メンバ関数
攻撃、移動、体力管理、描画

あ、書き出したら結構少ないですね。
まぁ、かなり適当ですが、

数の問題はどうにかなるようですね。
では、味方オブジェクトは

最初から味方の最大数まで生成しておき召喚するたびに空いているオブジェクトに割り当てるのか、
それとも
召喚するたびにオブジェクトを生成するのか、
どちらがいいでしょうか?

私的には後者が良いと思うんですが、



24ポイント を手に入れた。

Name: YuO  ..上級者(23,599ポイント)   Date: 2008/09/15(月) 03:17   No:21285     
Title: Re:オブジェクトに生成について    
> 最初から味方の最大数まで生成しておき召喚するたびに空いているオブジェクトに割り当てるのか、
> それとも
> 召喚するたびにオブジェクトを生成するのか、
> どちらがいいでしょうか?

速度とメモリ管理の簡略化のどちらをとるかです。
基本的に,newは重い処理なので,速度が出ないのであればnewを削る方向になると思います。

で,100程度のオブジェクトであれば,std::vector<T>で管理してしまって問題ないと思います。
おそらく,capacityが128まで大きくなって,あとはそのままになると思います。
# つまり,メモリアロケートが発生しない。


147ポイント を手に入れた。

Name: lbfuvab  ..入門者(4,939ポイント)   Date: 2008/09/15(月) 03:34   No:21286     
Title: Re:オブジェクトに生成について    
配列で最大数用意しておいて生成する毎に割り当てるのが楽だとは思いますが・・・

22ポイント を手に入れた。

Name: J  ..中級者(9,405ポイント)   Date: 2008/09/15(月) 05:09   No:21287     
Title: Re:オブジェクトに生成について    
「勇者のくせに生意気だ」というゲームが何なのかは知りませんが、
ここは敵の数が100固定ではないと思うので、
可変配列vectorを使ってみてはどうでしょう。

気になさっていた膨大なデータも最小限にできると思います。
確かvectorのメンバ関数にreserveやresize等があったはずです。
これで敵データの個数ぴったし分だけ簡単かつ動的に用意できます。
もし、vectorの使い方が分からないようであれば、
http://www.cppll.jp/cppreference/
を参照するといいと思います。


122ポイント を手に入れた。

Name: バグ  ..ハッカー(110,613ポイント)   Date: 2008/09/15(月) 08:01   No:21288     
Title: Re:オブジェクトに生成について    
std::listでもいいんじゃないかな?

16ポイント を手に入れた。

Name: たかぎ [URL]  ..熟練のプログラマー(58,856ポイント)   Date: 2008/09/15(月) 10:25   No:21291     
Title: Re:オブジェクトに生成について    
最大数が高々数百程度であれば、その都度デフォルトのnewで割り付けるより、その分のメモリを事前に用意しておいて、メモリプールを作る方がよいでしょう。
その際、std::vectorでもよいですが、operator newを多重定義した方が利便性が高いと思います。


33ポイント を手に入れた。

Name: Justy  ..ハッカー(222,288ポイント)   Date: 2008/09/15(月) 10:51   No:21292     
Title: Re:オブジェクトに生成について    

>最初から味方の最大数まで生成しておき召喚するたびに空いているオブジェクトに割り当てるのか、
>それとも召喚するたびにオブジェクトを生成するのか、どちらがいいでしょうか?

 基本的には、後者でいいと思います。
 前者も有りといえば有りですが、味方オブジェクトが1種類(1クラス)で
なくなった場合、その分の空いているオブジェクトリストが必要になってしまうかも
しれません。


183ポイント を手に入れた。

Name: JugS  ..入門者(3,898ポイント)   Date: 2008/09/15(月) 12:12   No:21294     
Title: Re:オブジェクトに生成について    
vectorを使う場合
コンテナについては、ほとんど知らないのですが、
自分はコンテナは関数付きの配列みたいなものと思ってたんですが、
コンテナの要素として、味方オブジェクトを召喚するたびに入れていくと言うことですか?



62ポイント を手に入れた。

Name: konacchi  ..かけだし(2,273ポイント)   Date: 2008/09/15(月) 12:49   No:21297     
Title: Re:オブジェクトに生成について    
そのゲームのことは何も知りませんが、
味方が100人も出るのですか?!!

同時に出ないのであれば100人分を確保する必要はないと思いますが、
出てくる味方のみのオブジェクト生成→描画→破棄 でいいのでは??


88ポイント を手に入れた。

Name: Mist  ..上級者(21,618ポイント)   Date: 2008/09/15(月) 13:02   No:21299     
Title: Re:オブジェクトに生成について    
> 勇者のくせになまいきだ
紹介ページ
http://watch.impress.co.jp/game%2Fdocs/20071207/nama.htm

絵が(わざと)ファミコンレベルなんだけど、ゲームシステムが秀逸で結構面白ですよ。


49ポイント を手に入れた。

Name: konacchi  ..かけだし(2,434ポイント)   Date: 2008/09/15(月) 13:17   No:21301     
Title: Re:オブジェクトに生成について    
どこかのフリーゲームかと思いきや PSPですか、プレイできませんねorz

スクリンショットを見ただけですが、
モンスターサイドのゲームということで中々面白そうです。

とりあえずは上限100でしたら、100体のオブジェクトを生成して描画してみてはどうでしょうか。
それで重ければ、また次の方法を考えればよろしいかと思います。


161ポイント を手に入れた。

Name: yuuki++  ..かけだし(1,611ポイント)   Date: 2008/09/15(月) 13:24   No:21302     
Title: Re:オブジェクトに生成について    
あるいは、100体作っておいて足りなくなったらnewする、とか
生成のタイミングが頻繁なら、予め確保したほうが良さそうですね。
間が開くなら1つずつ動的確保の方がループ数の削減になりますね。

もしくは、配列のフラグ検索でループ数を食わないように
・配列の要素を消したら、最後尾の要素を消した部分にコピー
・有効な要素数をカウンタとして保存
みたいなことをすればちょっとは節約になったり・・・笑


147ポイント を手に入れた。

Name: JugS  ..入門者(3,983ポイント)   Date: 2008/09/15(月) 13:39   No:21304 解決!     
Title: Re:オブジェクトに生成について    
たくさんの意見ありがとうございます。

とりあえず、オブジェクトを作ってどの程度の処理速度になるか等、
実験的なプログラムを組んで模索していきたいと思います。


こんなふわふわした質問にも答えていただき、

ありがとうございました。


85ポイント を手に入れた。



Name: 自由闊達  ..ぴよぴよ(685ポイント)   Date: 2008/09/14(日) 22:46   No:21261       
Title: 龍神録プログラミングの館の13章について    
龍神録プログラミングの館を見て勉強しているのですが、13章がわからなくて行き詰ってます

1.なぜか前の章まであった○○.hに追加or変更のようなメッセージがなく、どこに入れるかわからない。

2.二つ目の//define.hと//struct.hと書いてあるものをコピペするも
error C2065: 'SHOT_BULLET_MAX' : 定義されていない識別子です。
と表示される

3.一番したの音楽のところにあるSE_MAXなどが触れられていない

などあって全然わかりません、これは試練なんでしょうか?

試しに37章の下の一括ダウンロードってのをダウンロードしてもすべてほぼ白紙のプロジェクトでした

教えてください、お願いいたします。


262ポイント を手に入れた。


Name: array  ..プログラマー(26,139ポイント)   Date: 2008/09/14(日) 23:22   No:21262     
Title: Re:龍神録プログラミングの館の13章について    
2.
>'SHOT_BULLET_MAX' : 定義されていない識別子です。 と表示される
確か、画面に表示できる敵の弾の最大数だったと思うので。

#defin SHOT_BULLET_MAX 30

と、画面に表示できる敵弾の数は30個までですよ。ってdefine.hで宣言してあげればいいかもです。

3.
>試しに37章の下の一括ダウンロードってのをダウンロードしてもすべてほぼ白紙のプロジェクトでした
音楽に関するプログラムの事ですかね。全体的に白紙ってのは、DLミスだと思いますが・・・

SE_MAXは音楽のファイル最大数を指定してあげるためのものだったと思います。

シューティングの処理が全部終わり、一番最後に再生しろと宣言されたものがないかforでループさせてます。その時のファイルの最大数分、ループしてくれるわけです。最大数が増えればその分少し処理が遅くなります。

正確に言ったら違いますけど、だいたいそんな処理なので、music.cppの内容は少なくなってるんだと思います。
現在はシューティングの処理部で効果音を鳴らせと宣言されたものを再生する為だけのものみたいです。


311ポイント を手に入れた。

Name: s  ..ぴよぴよ(137ポイント)   Date: 2008/09/14(日) 23:27   No:21263     
Title: Re:龍神録プログラミングの館の13章について    
すみません、同じ章で躓いたので便乗で質問させてください
13章なのですが見本を真似て一応エラー0で敵がショットを打つとこまではたどり着けたのですが
ショットの効果音が凄い速さで連打されて常時なり続けている感じになってしまいます

これはどの部分を書き換えるもしくは追記すれば対処できるのでしょうか


137ポイント を手に入れた。

Name: array  ..プログラマー(26,509ポイント)   Date: 2008/09/14(日) 23:46   No:21264     
Title: Re:龍神録プログラミングの館の13章について    
> 2.
> >'SHOT_BULLET_MAX' : 定義されていない識別子です。 と表示される
> 確か、画面に表示できる敵の弾の最大数だったと思うので。
>
> #defin SHOT_BULLET_MAX 30
>
> と、画面に表示できる敵弾の数は30個までですよ。ってdefine.hで宣言してあげればいいかもです。

なにか違う気がして見てみたら、間違ってました。1つの敵が持つ弾の数なので、30個じゃ少なすぎます。

37章では、
#define SHOT_BULLET_MAX 1000//敵1匹が持つ弾の最大数
と1000個で宣言されてるみたいです。

#define ENEMY_MAX 30 //敵の同時表示最大数

と敵の数は30に設定されているので。
この場合、敵が画面に1匹いるとしたら
 1×1000=1千回
5匹の場合
 5×1000=5千回
30匹の場合
 30×1000=3万回

と処理が最大で3万回増える事になります。


>などあって全然わかりません、これは試練なんでしょうか?

多分、「BGMを流そう」的な章ができたら、その時に説明してくれると思います。
でも、自分で十分分かるレベルだと思うので、試練だと思って頑張ってもいいと思います。


2倍のポイントを手に入れた! 370ポイント を手に入れた。

Name: array  ..プログラマー(26,805ポイント)   Date: 2008/09/14(日) 23:51   No:21266     
Title: Re:龍神録プログラミングの館の13章について    
>sさん

>ショットの効果音が凄い速さで連打されて常時なり続けている感じになってしまいます。

se_flag[0]=1;

が毎回呼び出されてるのが原因だと思います。

とりあえず、消せば鳴りません。

これは、ショットを打つタイミングで鳴らせば良いものなので究極に言えば、

shot[n].bullet[k].flag =1;//フラグ

の真下に書いておけば間違わないかもです。


2倍のポイントを手に入れた! 296ポイント を手に入れた。

Name: yuuki++  ..ぴよぴよ(632ポイント)   Date: 2008/09/14(日) 23:56   No:21267     
Title: Re:龍神録プログラミングの館の13章について    
> 13章なのですが見本を真似て一応エラー0で敵がショットを打つとこまではたどり着けたのですが
> ショットの効果音が凄い速さで連打されて常時なり続けている感じになってしまいます

おそらく、効果音フラグがオンになったまま、以降のフレーム処理をしています。
状態の変化(弾を出した、とか)はフレーム単位で進行します。

nフレーム目で弾を出す→フラグオン→音が鳴る→次のフレーム

なので、フレームの最初または効果音を鳴らした直後にフラグをすべてリセットすると解決するのでは?


125ポイント を手に入れた。

Name: 自由闊達  ..ぴよぴよ(998ポイント)   Date: 2008/09/15(月) 00:21   No:21268     
Title: Re:龍神録プログラミングの館の13章について    
一応、//define.hと//struct.hに

//define.h
//敵1匹が持つ弾の最大数
#define SHOT_BULLET_MAX 1000
//一度に画面に表示できる敵の弾幕の最大数
#define SHOT_MAX 30


//struct.h
//弾に関する構造体
typedef struct{
//フラグ、種類、カウンタ、色、状態、少なくとも消さない時間、エフェクトの種類
int flag,knd,cnt,col,state,till,eff;
//座標、角度、速度、ベースの角度、一時記憶スピード
double x,y,angle,spd,base_angle[1],rem_spd[1];
}bullet_t;

//ショットに関する構造体
typedef struct{
//フラグ、種類、カウンタ、どの敵から発射されたかの番号
int flag,knd,cnt,num;
//ベース角度、ベーススピード
double base_angle[1],base_spd[1];
bullet_t bullet[SHOT_BULLET_MAX];
}shot_t;



とコピペしたのですが、2.のようなエラーが出てしまいます。
なぜなんでしょう・・・


313ポイント を手に入れた。

Name: yuuki++  ..ぴよぴよ(909ポイント)   Date: 2008/09/15(月) 00:57   No:21273     
Title: Re:龍神録プログラミングの館の13章について    
>自由闊達さん
まず、このサイトの通りやっていれば、各ソースファイルにはdxlib.hとGV.hがインクルードされていますね?
そしてGV.hの中では、function.h、define.hがインクルードされているはずです。
#define SHOT_BULLET_MAX 1000 などをちゃんと書いているようなので、「定義されていない」と言われるとしたら、インクルードし忘れではないでしょうか?

GV.hの中では、define.hと、function.hをincludeしてください。
さらに、、define.hの中では、、struct.hをincludeしてください。
これで、これらヘッダファイルがすべてのソースファイルから見えるはずです。


277ポイント を手に入れた。

Name: s  ..ぴよぴよ(176ポイント)   Date: 2008/09/15(月) 01:05   No:21274     
Title: Re:龍神録プログラミングの館の13章について    
隅々見渡していたら効果音無限ループしている箇所発見でき対処できました
arrayさんyuuki++ありがとうございました


39ポイント を手に入れた。

Name: 自由闊達  ..かけだし(1,290ポイント)   Date: 2008/09/15(月) 01:25   No:21275     
Title: Re:龍神録プログラミングの館の13章について    
一応GV.hの中には

#include "define.h"
#include "function.h"


define.hの中には

#include "struct.h"


を確認しました。あと、補足として上に書いたコピペをする前(12章)までは動いてます


とりあえずdefine.hを貼ってみます

//フィールドの広さ
#define FIELD_MAX_X 384
#define FIELD_MAX_Y 448
//フィールドの左上の座標
#define FIELD_X 32
#define FIELD_Y 16
//パッドキーの最大数
#define PAD_MAX 16

#include "struct.h"

//敵の同時表示最大数
#define ENEMY_MAX 30

//敵の出現情報最大数
#define ENEMY_ORDER_MAX 500

//円周率
#define PI 3.1415926535898
#define PI2 (PI*2)

//敵1匹が持つ弾の最大数
#define SHOT_BULLET_MAX 1000
//一度に画面に表示できる敵の弾幕の最大数
#define SHOT_MAX 30


292ポイント を手に入れた。

Name: array  ..プログラマー(26,824ポイント)   Date: 2008/09/15(月) 01:33   No:21276     
Title: Re:龍神録プログラミングの館の13章について    
#include "struct.h"

がSHOT_MAXより上に記入されてるのが問題です。

プログラムは上から下へ処理していくので

#define SHOT_MAX 30

の下に

#include "struct.h"

を移してあげれば大丈夫です。


19ポイント を手に入れた。

Name: yuuki++  ..かけだし(1,141ポイント)   Date: 2008/09/15(月) 01:35   No:21277     
Title: Re:龍神録プログラミングの館の13章について    
んー、それで
>2.二つ目の//define.hと//struct.hと書いてあるものをコピペするも
>error C2065: 'SHOT_BULLET_MAX' : 定義されていない識別子です。
>と表示される
のか・・・

12章まではちゃんと動いていたなら、インクルードミスとかはなさそうですね。
また、エラーメッセージやソースを見ても、おそらくタイプミスもないでしょう。

とすると、何なんでしょう?笑

12→13への変更点は主に敵の弾幕部分ですが、弾幕の処理でエラーが出ずにSHOT_BULLET_MAXで出るとは・・・

・・・と、ここまで書いて気づきました。
長くなったので分けますね。


232ポイント を手に入れた。

Name: yuuki++  ..かけだし(1,245ポイント)   Date: 2008/09/15(月) 01:39   No:21278     
Title: Re:龍神録プログラミングの館の13章について    
・・・と思ったら先に書いてくれましたね。

確か、struct.hの中には「弾幕」の中の「弾」の構造体の配列にSHOT_BULLET_MAXを使っていますね?

ということは、これを使う前に定義を済ませなければならないのです。

arrayさんの言う通り、#include "struct.h"をdefine.hの(できれば一番)下に移すといいでしょう。


104ポイント を手に入れた。

Name: array  ..プログラマー(26,841ポイント)   Date: 2008/09/15(月) 02:02   No:21280     
Title: Re:龍神録プログラミングの館の13章について    
今後間違わないように、define.hに「#include "struct.h"」を書くのではなく

GV.hに書いた方がいいです。

GV.h -----ファイル(ヘッダファイル)に追記

#include "DxLib.h"
#include "define.h"
#include "struct.h"   ←追加
#include "math.h"

#ifdef _GLOBAL_INSTANCE_
#define GLOBAL
#else
#define GLOBAL extern
#endif

/* 省略 */


こんな感じですかね。これをする際はdefine.hの中に書いてあった「#include "struct.h"」を消すのを忘れないでくださいね。


17ポイント を手に入れた。

Name: 自由闊達  ..かけだし(1,348ポイント)   Date: 2008/09/15(月) 03:05   No:21283 解決!     
Title: Re:龍神録プログラミングの館の13章について    
ありがとうございます!2が解決しました!

これをやってるうちにわからないのを見つけたのでこれ解決して新しいのたてます。


58ポイント を手に入れた。



Name: 新参者  ..ぴよぴよ(585ポイント)   Date: 2008/09/15(月) 00:42   No:21271       
Title: 3Dっぽい表現    
DXライブラリには3D機能がないのですが、
工夫をすることで3Dっぽい表現はできるのでしょうか。
例えば画像が表と裏を繰り返しながら回転してるようなものを作れるのでしょうか。


64ポイント を手に入れた。


Name: nayo  ..入門者(3,340ポイント)   Date: 2008/09/15(月) 01:53   No:21279     
Title: Re:3Dっぽい表現    
トランプが表裏回転しながら〜といった感じでいいのでしょうか

一応DrawPolygon3Dという関数があります
y軸中心に回転するだけなら楽に実現できるかと思います
(斜めに回転したり、となると結構面倒ですが)
ただ毎回値を設定していくのは面倒なので自前で簡単化する関数を用意したほうがよさそうです

たとえば
x座標の中心、y座標の中心、z軸位置、横幅、高さ、回転角度、値を入れたいVERTEX_3D構造体を渡すと
値を設定してくれるような関数です

他にもDrawModiGraphという関数も使えるかもしれませんがこれは3Dっぽくは見えないかも
試してないので分からないですが…


214ポイント を手に入れた。

Name: 組木紙織  ..比類無きプログラマー(60,340ポイント)   Date: 2008/09/15(月) 02:44   No:21282     
Title: Re:3Dっぽい表現    
ライブラリを使わずに、
自分で3次元空間を用意して、物体と、カメラを置いてあげれば
3Dの計算はできます。
(実装自体は少々手間なんですが)
それをDXライブラリを使って表示すれば、DXライブラリで3Dを扱うことができます。

また、種類が少なければ3Dを表示した画像を事前に用意しておくというてもあります。

ただ、自分で書くときは処理速度をゲームに使用可能なレベルまでチューニングするのが大変かもしれません。
DirectXでは3Dを扱う機能があったはずなので、そちらを勉強した方が
自分ですべて書くより楽で、速くて、バグが少ないです。


213ポイント を手に入れた。



Name: JugS  ..入門者(3,540ポイント)   Date: 2008/09/14(日) 07:23   No:21254       
Title: SetDrawScreen()が使えない!    
プログラミングの館の「処理速度を一定にする」のところのプログラムを、
クラス化してみようと思ったのですが、画面に何も表示されないので、
調べようと思い、ループ処理の前に、
    
color_white = GetColor(255,255,255);

DrawString(0,80,"while外1",color_white);
Sleep(3000);

ClearDrawScreen();

SetDrawScreen( DX_SCREEN_BACK );

DrawString(0,120,"while外2",color_white);
ScreenFlip;

Sleep(2000);

    while( 略 
と追加して実行すると
 「while外1」と表示され、3秒後に消えてそこで止まってしまい、
SetDrawScreen()以降の処理が実行されてませんでした。

どうしてでしょうか?


248ポイント を手に入れた。


Name: tkmakwins15 [URL]  ..比類無きプログラマー(88,895ポイント)   Date: 2008/09/14(日) 09:20   No:21255     
Title: Re:SetDrawScreen()が使えない!    
まずサンプルプログラムは動作するのですよね?
後環境を教えてください。


25ポイント を手に入れた。

Name: yuuki++  ..ぴよぴよ(300ポイント)   Date: 2008/09/14(日) 12:14   No:21256     
Title: Re:SetDrawScreen()が使えない!    
赤字に注目してください。

    color_white = GetColor(255,255,255);

    DrawString(0,80,"while外1",color_white);
    Sleep(3000);

    ClearDrawScreen();

    SetDrawScreen( DX_SCREEN_BACK );

    DrawString(0,120,"while外2",color_white);
    ScreenFlip;

    Sleep(2000);

ケアレスでしょうが、ここはScreenFlip();と、関数を呼び出さないと裏画面が描写されません。
実はこれ、関数のポインタが置いてあるだけで、何もしてないんです。
でも式値(というのだろうか)は有効なので、コンパイルは通るようですね。


215ポイント を手に入れた。

Name: JugS  ..入門者(3,621ポイント)   Date: 2008/09/15(月) 00:24   No:21269 解決!     
Title: Re:SetDrawScreen()が使えない!    
返信遅くなってすいません。

おっしゃるとおり()のつけ忘れでした。
つけたら正常に表示されるようになりました。

が、52FPSだったのでちょっとガッカリでしたね。

yuuki++さん
ご指摘ありがとうございました。

tkmakwins15さん
すいません、お早い返信でしたのに答えるのが遅れました。


81ポイント を手に入れた。



Name: あなざぁ  ..かけだし(2,356ポイント)   Date: 2008/09/13(土) 22:15   No:21246       
Title: アロー演算子について    
こんばんは。とても初歩的な質問なのですが困っています。
今、アロー演算子を使ってテストプログラムを書こうと思っているのですが、
どうしてもエラーが出てしまいます。


構造体にint型の二つのメンバを用意し、関数にポインタを渡すことによって両者の値を入れ替えようと思っています。




#include <stdio.h>

void swap_struct(struct Data *);

int main(void)
{
struct Data{
int a,b;
};

struct Data MyData;

MyData.a = 5;
MyData.b = 10;

printf("before a=%d b=%d",MyData.a,MyData.b);

swap_struct(&MyData);

printf("after a=%d b=%d",MyData.a,MyData.b);
return 0;
}

void swap_struct(struct Data *lpData)
{
int c;

c = lpData->a;
lpData->a = lpData->b;
lpData->b = c;

return;
}


エラーは、自作関数内でa,bが未定義であるといったものです。
本を読み直してやってみたのですが、やはりエラーが出てしまいます。


2倍のポイントを手に入れた! 684ポイント を手に入れた。


Name: 御津凪 [URL]  ..中級者(12,012ポイント)   Date: 2008/09/13(土) 22:34   No:21247     
Title: Re:アロー演算子について    
エラーの原因は main 関数内で Data 構造体を定義していることにあります。
(関数の中に書くことはエラーでなく、きちんと定義できますが)

Data 構造体を関数の外に置くとコンパイルが通るはずです。

ただし、必ず使用される前の場所に置くこと。
この場合、宣言されている部分に Data 構造体が使われているので、

void swap_struct(struct Data *);
struct Data{
int a,b;
};

こう置くとやはりエラーが出ます。

struct Data{
int a,b;
};
void swap_struct(struct Data *);

このように置いてください。

ちなみに、使用しているコンパイラは C++ ですか?それとも C ですか?

書き方を見ると、たぶん C だと思うのですが。


216ポイント を手に入れた。

Name: box  ..ハッカー(125,588ポイント)   Date: 2008/09/13(土) 22:34   No:21248     
Title: Re:アロー演算子について    
構造体の定義を main 関数の「中」で行なっているため、
swap_struct 関数では a や b というメンバーのあることがわかりません。


56ポイント を手に入れた。

Name: あなざぁ  ..かけだし(2,428ポイント)   Date: 2008/09/13(土) 23:02   No:21249 解決!     
Title: Re:アロー演算子について    
みなさんのおかげで解決しました。
先に定義する必要があったのですね!
ありがとうございます。^^


2倍のポイントを手に入れた! 72ポイント を手に入れた。

Name: あなざぁ  ..かけだし(2,459ポイント)   Date: 2008/09/13(土) 23:03   No:21250     
Title: Re:アロー演算子について    
回答し忘れました;
ついでにコンパイラはBorland C++ Compilerです。


31ポイント を手に入れた。

Name: たかぎ [URL]  ..熟練のプログラマー(58,806ポイント)   Date: 2008/09/13(土) 23:53   No:21252     
Title: Re:アロー演算子について    
> ただし、必ず使用される前の場所に置くこと。
> この場合、宣言されている部分に Data 構造体が使われているので、
> void swap_struct(struct Data *);

>
> struct Data{
> int a,b;
> };

> こう置くとやはりエラーが出ます。

そんなことはありません。
実際に試してみてください。


32ポイント を手に入れた。



Name: ね〜す  ..かけだし(1,620ポイント)   Date: 2008/09/13(土) 00:41   No:21236       
Title: 五目並べを作ろうとしているのですが・・    
Cの勉強のお供に、五目並べを作ろうとしています。

実行すると、初期化したはずのarray配列に変な値が代入されています。
あと、入力にも問題があります。

二つとも、悩みに悩んで解決できませんでした。
どうか、ソースコードにどのような問題があるのかご指導お願いします。

ソースコードは以下です。



#include "DxLib.h"

extern int array[15][15];
extern int i,j,turn,stone;

int clear(void);
int screen_cl(void);
int screen_st(void);
int input(int);


////////////////////////////////////////////////////////
char Key[256];

int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){
if( ChangeWindowMode(TRUE) != DX_CHANGESCREEN_OK || DxLib_Init() == -1 ) return -1; //初期化処理
SetDrawScreen( DX_SCREEN_BACK ); //裏画面に設定

while(!ProcessMessage() && !ClearDrawScreen() && !GetHitKeyStateAll( Key ) && !Key[KEY_INPUT_ESCAPE]){
//↑メッセージ処理 ↑画面をクリア ↑キーボード入力状態取得 ↑ESCが押されていない

////////////////////////////////////////////////////////


int turn;
clear();
screen_cl();
screen_st();
ScreenFlip();

// メインループ //

for (turn = 0;turn<100;turn++) {
screen_st();

if (turn == 0) {
}

input(turn);

ScreenFlip();
}
}

DxLib_End();
return 0;
}

int clear(void)
{
int array[15][15];
int i,j;

/*初期化*/

for (i=0;i<15;i++) {
for (j=0;j<15;j++) {
array[i][j] = 0;
}
}

return 0;
}

int screen_cl(void)
{

int k;
int i,j;
int white = GetColor( 255,255,255 );
int black = GetColor( 0,0,0 );

//碁盤の枠

DrawBox(80,0,559,479,white,TRUE);

for (i=0;i<15;i++) {
if (i==0 || i==14) {
DrawBox( 108 , 30*i+28 , 532 , 30*i+32 , black , TRUE );
} else {
DrawBox( 109 , 30*i+29 , 531 , 30*i+31 , black , TRUE );
}
}
for (j=0;j<15;j++) {
if (j==0 || j==14) {
DrawBox( 30*j+108 , 28 , 30*j+112 , 452 , black , TRUE );
} else {
DrawBox( 30*j+109 , 29 , 30*j+111 , 451 , black , TRUE );
}
}

int guid[5][2] = { {199,120},
{439,120},
{319,240},
{199,360},
{439,360}
};
for (k=0;k<5;k++) {
DrawCircle( guid[k][0] , guid[k][1] , 5 , black , TRUE );
}

return 0;
}

int screen_st(void)
{
//碁石
int m,n;
int i,j;
int array[15][15];
int white = GetColor( 255,255,255 );
int black = GetColor( 0,0,0 );

for (i=0;i<15;i++) {
for (j=0;j<15;j++) {
m = 30*i+29;
n = 30*j+109;
if (array[i][j] == 1) {
DrawCircle( n , m , 10 , black , TRUE );
} else if (array[i][j] == 2) {
DrawCircle( n , m , 10 , black , TRUE );
DrawCircle( n , m , 8 , white , TRUE );
}
}
}

return 0;
}

int input(int turn)
{
int i,j,stone;
int array[15][15];
int MouseX,MouseY,MouseInput;
int x,y,hasi_x,hasi_y;


if (turn%2 == 0) {
stone = 1;
} else {
stone = 2;
}


// マウスを表示状態にする
SetMouseDispFlag( TRUE ) ;

// マウスの入力を待つ
MouseInput = GetMouseInput() ;

do {

while( ( MouseInput & MOUSE_INPUT_LEFT ) == 0 )
{

// メッセージ処理
if( ProcessMessage() == -1 )
{
break ; // エラーが起きたらループから抜ける
}

// マウスの入力を得る
MouseInput = GetMouseInput() ;
}
while( ( MouseInput & MOUSE_INPUT_LEFT ) == 1 )
{

// メッセージ処理
if( ProcessMessage() == -1 )
{
break ; // エラーが起きたらループから抜ける
}

// マウスの入力を得る
MouseInput = GetMouseInput() ;

// マウスの位置を取得
GetMousePoint( &MouseX , &MouseY ) ;

}
} while ( ( (MouseX < 85) || (MouseX > 555) ) && ( (MouseY < 5) || (MouseY > 475) ) );



//判定部分
hasi_x = 94;
hasi_y = 14;
x = MouseX - hasi_x;
y = MouseY - hasi_y;

for (i=0;i<15;i++) {
for (j=0;j<15;j++) {
if ( (y >= i*30) && (y < i*30+30) &&
(x >= j*30) && (x < j*30+30) ) {
array[i][j] = stone;
}
}
}

return 0;
}




相変わらず覚束ない日本語ですみません。><


1,337ポイント を手に入れた。


Name: 組木紙織  ..比類無きプログラマー(60,127ポイント)   Date: 2008/09/13(土) 07:02   No:21237     
Title: Re:五目並べを作ろうとしているのですが・・    
ざっと見ただけですが、初期化したのを使わずに捨てているところが問題です。
使いたいgrobalな変数をlocalな変数で覆い隠しています。
Cの変数のスコープに気を付けてください。
externは今回は必要ないです。

以下問題のコードの一部、ここ以外にも同様な問題があります。

int clear(void)
{
/*ここでlocalにarrayの配列を確保*/
int array[15][15];
int i,j;

/*初期化*/
/*localのarrayを初期化する*/
for (i=0;i<15;i++) {
for (j=0;j<15;j++) {
array[i][j] = 0;
}
}

return 0;
} /*ここでlocalのarrayを捨てる*/



188ポイント を手に入れた。

Name: box  ..ハッカー(125,532ポイント)   Date: 2008/09/13(土) 07:21   No:21238     
Title: Re:五目並べを作ろうとしているのですが・・    
WinMain()を除く関数の設計の話をします。
当該関数群では0以外の値をreturnしておらず、
しかも、その0という戻り値を呼び出し側で全く使っていません。
そういう状況で、関数の型をintにすることに何か意味があるでしょうか。


61ポイント を手に入れた。

Name: ね〜す  ..かけだし(2,473ポイント)   Date: 2008/09/13(土) 14:13   No:21241     
Title: Re:五目並べを作ろうとしているのですが・・    
どうやら、グローバルとエクスターンを完全に取り違えていたようです。><

というか、実際に作っているときは複数のソースファイルに分割していたので、
少々混乱してしまっていたのかもしれません。
また、スコープについて勉強しなおそうと思います・・

とりあえず、一つのソースファイルにまとめてみると、初期化は成功しました。
きちんと完成したら分割してみるつもりです。

ところで、実は入力の方はまだ詰んでおりますorz

原因は以下のソース内だと思います。


int input(void)
{
int MouseX,MouseY,MouseInput;
int x,y,hasi_x,hasi_y;


if (turn%2 == 0) {
stone = 1;
} else {
stone = 2;
}


// マウスを表示状態にする
SetMouseDispFlag( TRUE ) ;

// マウスの入力を待つ
MouseInput = GetMouseInput() ;

do {

while( ( MouseInput & MOUSE_INPUT_LEFT ) == 0 )
{

// メッセージ処理
if( ProcessMessage() == -1 )
{
break ; // エラーが起きたらループから抜ける
}

// マウスの入力を得る
MouseInput = GetMouseInput() ;
}
while( ( MouseInput & MOUSE_INPUT_LEFT ) == 1 )
{

// メッセージ処理
if( ProcessMessage() == -1 )
{
break ; // エラーが起きたらループから抜ける
}

// マウスの入力を得る
MouseInput = GetMouseInput() ;

// マウスの位置を取得


}
} while ( ( (MouseX < 85) || (MouseX > 555) ) && ( (MouseY < 5) || (MouseY > 475) ) );

GetMousePoint( &MouseX , &MouseY ) ;

// 判定部分
hasi_x = 94;
hasi_y = 14;
x = MouseX - hasi_x;
y = MouseY - hasi_y;

for (i=0;i<15;i++) {
for (j=0;j<15;j++) {
if ( (y >= i*30) && (y < i*30+30) &&
(x >= j*30) && (x < j*30+30) ) {
array[i][j] = stone;
}
}
}

return 0;
}



今一度、問題解決に協力していただければ嬉しいかぎりです。m(__)m


あと、input関数は 変数をグローバルにすることで、void型に直すことができました。
int型だったのは、変な試行錯誤があったとお察しください><


853ポイント を手に入れた。

Name: Mist  ..上級者(21,531ポイント)   Date: 2008/09/13(土) 14:35   No:21242     
Title: Re:五目並べを作ろうとしているのですが・・    
最初のソースでは

// マウスの位置を取得

で、GetMousePointをコールしているのに、後のソースではなくなっているせいではないですか?


37ポイント を手に入れた。

Name: ね〜す  ..入門者(2,802ポイント)   Date: 2008/09/13(土) 16:37   No:21244 解決!     
Title: Re:五目並べを作ろうとしているのですが・・    
すいません、

// マウスの位置を取得

GetMousePoint( &MouseX , &MouseY ) ;

に訂正します。即ち、最初のソースの内容に戻します。

あと、

// メインループ //

for (turn = 0;turn<100;turn++) {
screen_st();

input();

ScreenFlip();



// メインループ //

for (turn = 0;turn<100;turn++) {

input();

screen_st();

ScreenFlip();


と変更することで、入力が変になるのが解決しました。

これから、勝利判定などを作っていこうと思います。

ご指導していただいた皆様、ありがとうございました!



329ポイント を手に入れた。



Name: pupil  ..ぴよぴよ(60ポイント)   Date: 2008/09/08(月) 19:46   No:21059       
Title: C言語を始めたのですが    
このサイトをたまたま見つけて自分でもゲームを作ろうと思ったのですが、C言語でゲームを
作るサイトといえばココぐらいでした。ゲームプログラミング館はすべて読ませていただいたの
ですがゲームを1本作るには知識が少なすぎるように思います。なので、ゲームを作りながら
C言語を学べ、RPG、格闘、パズルなどのゲームが一通り作れるようになる良書を探しています。
本屋さんで聞いてもPCに詳しい人は居ないようなので、ぜひお勧めの本を教えてください。

あと、最終的には3Dゲームを作ろうと考えているので3Dゲーム製作の良書も教えてください。
キャラクターや背景はもうできているのであとはプログラミングだけと言うところなんです><
3Dゲーム作りながらC言語を1から学べる都合のいい本があればいいのですが;

PCのスペックは
4CPU 3GHz
RAM 1Gb
グラフィックカード VIA Chrome9 HC IGP WDDM
OS WindowsVista HomeBasic 32bitオペレーティングシステム

コレだけのスペックであれば3Dゲーム作れ無いでしょうか?


本題がわかりにくくてすみません。
最終的に3Dゲームが作りたくてC言語を学ぼうと思っているのですが、
始めは2Dゲームを作成しながらゲーム独特の考え方を学ぶための
良書を探していると言うことです。
資金は3万円ほどと考えています。


60ポイント を手に入れた。


Name: バグ  ..ハッカー(108,532ポイント)   Date: 2008/09/08(月) 20:12   No:21061     
Title: Re:C言語を始めたのですが    
シューティングゲームを作れたら、大抵のゲームに応用できますよ。

21ポイント を手に入れた。

Name: 管理人 [URL]  ..伝説のハッカー(786,891ポイント)   Date: 2008/09/08(月) 20:45   No:21063     
Title: Re:C言語を始めたのですが    
勉強方法は人それぞれだと思いますし、以下は私の見解ですので、
以下ご自分の判断で参考にして下さい。

---------------------------------------

C言語に慣れていない状態でDirectXやOpenGLとかに手を出すと挫折する元だと思います。
本格的なゲームを目指すのでしたら、しっかりC言語の知識を固めるか、
簡単なゲームをDXライブラリで沢山作りながらC言語やゲームプログラミングの手法を勉強し、
慣れていくのが良いと思います。

本を読むこともとても大事な事だと思うのですが、
それ以上にプログラムは自分で沢山書いてコンパイルしてプログラムに慣れる事が大事だと思います。
(良書の紹介は他の回答者に譲ります。

また、プログラミングは数学と同じく、教科書を読むだけでは身に付きません。
やはり重要なのは演習ですね。

一通りゲームプログラミングの館をお読みになったのでしたら
簡単なゲームは作れると思います。

以前初心者と仰っている方に
「下でカゴを持って構えている人を操作して落ちてくるリンゴをカゴに入れるゲームを作ってみてはどうか」
と提案した事があります。

このような簡単なゲームでも、ゲームを作ったことが無ければ
結構難しく思うと思います。
以下に私がそれを実装してみたサンプルがあるので、よければ参考にして下さい。

http://www.play21.jp/board/formz.cgi?action=res&resno=20298&page=&id=dixq&lognum=64

バグさんの仰るように、シューティングが作れたら大抵のゲームに応用出来ます。
例えば格闘ゲームのハドウケンだってシューティングのアルゴリズムを使うでしょうし、
マリオのファイアだってシューティングのアルゴリズムが使えるでしょう。
上に紹介したリンゴが落ちるプログラムもシューティングの理論を使っています。

また、どのゲームでも、大きな計算アルゴリズムの骨格はかわりません。
なので、簡単なゲームでもしっかり汎用性や拡張性を考えて作っていくことで、
大規模で本格的なゲーム作りの勉強にもなります。

それに本ばかり読むより、沢山ゲームを作っていきながら覚えたほうが面白いと思いますしね。
重複しますが、本を読むことも大事であることはもっともだと思います。


814ポイント を手に入れた。

Name: pupil  ..ぴよぴよ(333ポイント)   Date: 2008/09/08(月) 22:24   No:21066     
Title: Re:C言語を始めたのですが    
そうですか・・・・・・
私は理数系大学を目指していて文系はぜんぜんダメですが;
何回も同じような問題をやる事で徐々に難しい問題を解けるようになると言うのは
実感しています。ですがゲームの基礎の部分がいまいちわかりません^^;
一度、何か簡単なゲームを作って見るので、ご指導いただけますでしょうか?

もちろん、無理に「指導してくれ!」とは言いませんが><

>例えば格闘ゲームのハドウケンだってシューティングのアルゴリズムを使うでしょうし、
>マリオのファイアだってシューティングのアルゴリズムが使えるでしょう。

確かにおっしゃる通りです。
ですが、ゲーム館からいきなりグレードアップしすぎて難しいです^^;


273ポイント を手に入れた。

Name: 御津凪 [URL]  ..中級者(10,334ポイント)   Date: 2008/09/08(月) 22:59   No:21068     
Title: Re:C言語を始めたのですが    
> ですがゲームの基礎の部分がいまいちわかりません^^;
(難しい話なので判らなかったら読み飛ばしてください)

本格的なゲーム(市販など)でよく使う手法の一つに「タスクシステム」というものがあります。
いわゆるこれがゲームの基礎になっていると思います。
しかし、作り手により沢山種類があるため、ゲームライブラリにはほとんど組み込まれていません。
(汎用性を持たせるためだと思いますが…)

もちろん、ゲームプログラミングの館などで紹介している方法が(絶対的に)簡単です。
覚えるのもC言語(+DXライブラリ)だけですし、三角関数を使えるようになるだけでも
作れるゲームの幅がグンと広がるはずです。


作り手によってゲームの基礎はまちまちです。
なので、何かの縁ということで、
ゲームプログラミングの館や龍神録の館を題材にして、

「管理人さんを筆頭に掲示板の皆さんが教授する会」

というのはどうでしょう(笑



…さて、気を取り直して、私の薦める本ですが、
ゲーム作りとして必要な数学、物理学として下記の本を薦めます。

「ゲーム開発のための数学・物理学入門」 (ISBN4-7973-2907-6) \2,800 + 税

この本で私は3Dに必要な行列や当たり判定の基礎を覚えました。
C言語を知らなくても先にこういう方法があるのだと予習できますしね。
(ちなみに会社にもありました)


400ポイント を手に入れた。

Name: 管理人 [URL]  ..伝説のハッカー(787,047ポイント)   Date: 2008/09/08(月) 23:17   No:21070     
Title: Re:C言語を始めたのですが    
>pupilさん

試行錯誤してみるということも大事だと思います。
また、突然ゲームを作るのが難しければすごく簡単なものから作ればいいですよ。

最初はグー・チョキ・パーの3枚の画像を表示するだけのものから、
入力を受け付けて、それに対応した画像を表示するもの、
乱数に応じた画像を表示するもの、
実際にコンピュータとジャンケンできるもの・・。

こうしていけば作れそうじゃないでしょうか?

今後ステップアップされる時も、
ゲームプログラミングの館のほかに、シューティングゲームの館、龍神録プログラミングの館もあり、
ゲームの作り方はある程度参考にしていただけるのではないかと思います。


>御津凪さん

その会面白いですねw
私の方法を教科書の方法のように言ってしまうのはよくないので、
指導するという形は出来ないと思いますが、アドバイス位ならいくらでもします。
最初は私も本当に苦労したものです・・。
今思えば 正気か?! と思うようなプログラムをプログラムを始めた頃書いていましたが、
裏画面を使うでもなく、メインループを使うでもなく

DrawBox(黒);
描画1
sleep();

DrawBox(黒);
描画2
sleep();

DrawBox(黒);
描画3
sleep();

みたいにして、無限に同じような処理を書いてゲームを作っていました^^;
「いや〜プログラミングって大変だな〜」とか一人で思っていましたが、
一人で大変な方法をとっていただけでしたw


24ポイント を手に入れた。

Name: 管理人 [URL]  ..伝説のハッカー(787,779ポイント)   Date: 2008/09/08(月) 23:29   No:21072     
Title: Re:C言語を始めたのですが    
上の4つの仕様を一つずつ実装してみましょう。

1、グー・チョキ・パーの3枚の画像を表示する
2、入力を受け付けて、それに対応した画像を表示する
3、乱数に応じた画像を表示する
4、実際にコンピュータとジャンケンする。

ここにジャンケン用の3枚の画像をおいておきます。

0.png

1.png

2.png


これを表示するだけなら、ゲームプログラミングの館のサンプルをそのまま使えば良いので簡単ですね。

41章
http://dixq.net/g/#41
の毎回書く骨格をペタっと貼って、読み込みと、描画の処理を追加すれば終わりです。

実際にやってみて下さい。
答えを下に書いておくので、出来たら答え合わせしてみて下さい。
41章から追加したのは赤字の部分です。


#include "DxLib.h"

int Key[256];
int image[3];

int GetHitKeyStateAll_2(int GetHitKeyStateAll_InputKey[]){
char GetHitKeyStateAll_Key[256];
GetHitKeyStateAll( GetHitKeyStateAll_Key );
for(int i=0;i<256;i++){
if(GetHitKeyStateAll_Key[i]==1) GetHitKeyStateAll_InputKey[i]++;
else GetHitKeyStateAll_InputKey[i]=0;
}
return 0;
}

int WINAPI WinMain( HINSTANCE hInstance,
HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){
ChangeWindowMode(TRUE);//ウィンドウモード
if(DxLib_Init() == -1||SetDrawScreen( DX_SCREEN_BACK )!=0)return -1;

image[0]=LoadGraph("0.png");//画像ロード
image[1]=LoadGraph("1.png");
image[2]=LoadGraph("2.png");


while(ProcessMessage()==0 && ClearDrawScreen()==0
&& GetHitKeyStateAll_2(Key)==0 && Key[KEY_INPUT_ESCAPE]==0){

DrawGraph( 0,0,image[0],TRUE);//描画
DrawGraph(200,0,image[1],TRUE);
DrawGraph(400,0,image[2],TRUE);


ScreenFlip();
}

DxLib_End();
return 0;
}

 
これで「1」はできました。


732ポイント を手に入れた。

Name: 管理人 [URL]  ..伝説のハッカー(788,518ポイント)   Date: 2008/09/08(月) 23:34   No:21073     
Title: Re:C言語を始めたのですが    
次は「2」です。
ゲームプログラミングの館を一通りご覧になったと仰っていますので、
特に関数の説明はしませんので、なにかわからなければその都度お聞きになるか、
館をご覧下さい。


#include "DxLib.h"

int Key[256];
int image[3];

int GetHitKeyStateAll_2(int GetHitKeyStateAll_InputKey[]){
char GetHitKeyStateAll_Key[256];
GetHitKeyStateAll( GetHitKeyStateAll_Key );
for(int i=0;i<256;i++){
if(GetHitKeyStateAll_Key[i]==1) GetHitKeyStateAll_InputKey[i]++;
else GetHitKeyStateAll_InputKey[i]=0;
}
return 0;
}

int WINAPI WinMain( HINSTANCE hInstance,
HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){
ChangeWindowMode(TRUE);//ウィンドウモード
if(DxLib_Init() == -1||SetDrawScreen( DX_SCREEN_BACK )!=0)return -1;

image[0]=LoadGraph("0.png");//画像ロード
image[1]=LoadGraph("1.png");
image[2]=LoadGraph("2.png");

while(ProcessMessage()==0 && ClearDrawScreen()==0
&& GetHitKeyStateAll_2(Key)==0 && Key[KEY_INPUT_ESCAPE]==0){

if(Key[KEY_INPUT_Z]>0) DrawGraph( 0,0,image[0],TRUE);//描画
if(Key[KEY_INPUT_X]>0) DrawGraph(200,0,image[1],TRUE);
if(Key[KEY_INPUT_C]>0) DrawGraph(400,0,image[2],TRUE);

ScreenFlip();
}

DxLib_End();
return 0;
}
 

Zキーが押されるとグー
Xキーが押されるとチョキ
Cキーが押されるとパーを表示するというだけです。

if文が増えただけですね。


739ポイント を手に入れた。

Name: 管理人 [URL]  ..伝説のハッカー(789,047ポイント)   Date: 2008/09/08(月) 23:43   No:21074     
Title: Re:C言語を始めたのですが    
次は「3」です。
2も3もいくらでも違う解釈が出来るあいまいな仕様なので、答え合わせに成らないかもしれませんが
参考程度にどうぞ。

Zキーを押すたびに画像がランダムに変わります。
GetRandという乱数を作る関数を使っています。
また、Keyに入っている値は入力している間カウンタのように上昇していくので、
1の時入力された瞬間だと解るという事は館に書いた通りです。


#include "DxLib.h"

int Key[256];
int image[3];

int GetHitKeyStateAll_2(int GetHitKeyStateAll_InputKey[]){
char GetHitKeyStateAll_Key[256];
GetHitKeyStateAll( GetHitKeyStateAll_Key );
for(int i=0;i<256;i++){
if(GetHitKeyStateAll_Key[i]==1) GetHitKeyStateAll_InputKey[i]++;
else GetHitKeyStateAll_InputKey[i]=0;
}
return 0;
}

int WINAPI WinMain( HINSTANCE hInstance,
HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){
ChangeWindowMode(TRUE);//ウィンドウモード
if(DxLib_Init() == -1||SetDrawScreen( DX_SCREEN_BACK )!=0)return -1;

int num=0;

image[0]=LoadGraph("0.png");//画像ロード
image[1]=LoadGraph("1.png");
image[2]=LoadGraph("2.png");

while(ProcessMessage()==0 && ClearDrawScreen()==0
&& GetHitKeyStateAll_2(Key)==0 && Key[KEY_INPUT_ESCAPE]==0){

if(Key[KEY_INPUT_Z]==1)
num=GetRand(2);


DrawGraph(0,0,image[num],TRUE);//描画

ScreenFlip();
}

DxLib_End();
return 0;
}
 
 
これでだいたい軌道に乗ってきたと思うので、「4」も作ってみて下さい。


529ポイント を手に入れた。

Name: pupil  ..ぴよぴよ(841ポイント)   Date: 2008/09/09(火) 11:39   No:21085 解決!     
Title: Re:C言語を始めたのですが    
少し見ない間にこんなに立派なプログラムを作っていただき感謝感激です><
じゃんけんゲーム、後は自力で作って見たいと思います。これも練習になりますもんね。



>「ゲーム開発のための数学・物理学入門」 (ISBN4-7973-2907-6) \2,800 + 税
3Dゲームに物理はかかせませんもんね。本屋さんで立ち読みしてから購入します^^

>この本で私は3Dに必要な行列や当たり判定の基礎を覚えました。
>C言語を知らなくても先にこういう方法があるのだと予習できますしね。
>(ちなみに会社にもありました)
なんか、皆さんが神に見えてきました〜
と、言う事はココに来ている解答者の方たちはほとんどゲーム会社勤務ってことなのでしょうか?
もしかして、管理人様は○EGAとか任○堂とか○UDSONのプログラマーだったりして・・・・・・


皆様、丁寧な解答ありがとうございました。
ガンバって管理人様の課題を解いて行こうと思います^^

PS
管理人様のシューティングゲーム面白かったですが難易度高いですね〜;
あれも、DirectXライブラリとC++コンパイラで作られているのでしょうか?
そうであれば、スーパーファミコンいや、64のゲームあたりまで作れそうですね^^


508ポイント を手に入れた。

Name: pupil  ..かけだし(1,014ポイント)   Date: 2008/09/09(火) 12:43   No:21089     
Title: Re:C言語を始めたのですが    
追加の質問させてください。
いま、3D描画ソフトはShadeを使ってるのですが、C++コンパイラと3D描画ソフト
以外に3Dゲームを作るために必用なものを教えてはいただけ無いでしょうか?
DXライブラリでキャラクターを動かすと言うのはとても無理そうなので;
できるとすれば、ある一つの物体を回転させるとか一定方向に動かす程度しか私にはできません><

よろしくお願いします


173ポイント を手に入れた。

Name: 御津凪 [URL]  ..中級者(11,208ポイント)   Date: 2008/09/09(火) 12:58   No:21090     
Title: Re:C言語を始めたのですが    
DXライブラリを3Dに拡張した「DXライブラリ3D」というものがありますよ。

http://fatalita.sakura.ne.jp/3DLib/

モーションもちゃんと対応しているみたいですよ。

DirectX を使って1から3Dモデルを表示させるのには非常に難しいです。
ましてやモーションに対応するのは100%理解しないと出来ません。

だから上記のようなライブラリがあると非常に楽ですね。

さて、必要なもの、といいますか、一つ覚えるべきものがあります。
カメラの概念です。
3Dの概念もそうですが、3D空間を表示するカメラの扱い方をマスターしなければ
凝ったカメラワークなどを取れないと思います。


18ポイント を手に入れた。

Name: 管理人 [URL]  ..伝説のハッカー(788,433ポイント)   Date: 2008/09/09(火) 15:39   No:21092     
Title: Re:C言語を始めたのですが    
>と、言う事はココに来ている解答者の方たちはほとんどゲーム会社勤務ってことなのでしょうか?

私の勝手な推測ですが、その逆じゃないかと思います。
実際に皆さんに確認取ったわけではないので確かな事は言えませんけど。
もちろんゲームプログラマーだと伺った方もいらっしゃいますよ。
プロの業界ではDXライブラリは使わないでしょうし、あくまで
趣味でゲームを作りたいと思っている方々が多いのではないかと思います。

また、アンケートを取っており、
http://dixq.net/board/ank/enq.cgi?mode=kekka
ここで確認出来ます。プログラマーは全体の20%。
多く見積もってその半分がゲームプログラマーだとしても、全体の10%ですよね。
(という勝手な推測です。「回答者の何%」と仰っているのでこの数値より多いでしょうけど)

>管理人様は○EGAとか任○堂とか○UDSONのプログラマーだったりして・・・・・・

私は学生ですよ。
簡単なプロフィールはHPのトップから見れますので、もしよければどうぞm(_ _)m

>管理人様のシューティングゲーム面白かったですが難易度高いですね〜;

ありがとうございます。
やはり難易度設定にちと問題がありますよね〜・・。
このゲームをしてくれる人は、東方知ってる人だろうと勝手に思って、
やや難しい目にしてしまいました^^;

>DirectXライブラリとC++コンパイラで作られているのでしょうか?

DXライブラリとVisualStudioです。

>スーパーファミコンいや、64のゲームあたりまで作れそうですね^^

スーファミはいけるでしょうけど、64は難しいと思います。
というのも、2D用のライブラリなので、Xファイルなどを読み込んだ3D描画が出来ません。
少しだけ3D関数があるので、それを最大限利用すれば立体的な背景は作れますけど、
ちょっと限界があります。

>C++コンパイラと3D描画ソフト 以外に3Dゲームを作るために必用なものを教えてはいただけ無いでしょうか?

OpenGLやDirectXとかそういうことでしょうか?
XNAとか他にも色々3Dが扱えるライブラリはあるので、探してみてはどうでしょう。

DirectXは書籍が多くwindowsでしか動かない。
OpenGLはOSに依存せず使える。
XNAはX-Boxで動かせるが書籍が少ない。

など色々特徴はあります。


950ポイント を落としてしまった。

Name: pupil  ..かけだし(1,462ポイント)   Date: 2008/09/09(火) 18:36   No:21100     
Title: Re:C言語を始めたのですが    
>DXライブラリを3Dに拡張した「DXライブラリ3D」というものがありますよ。
さすがDirectXですね〜^^
そんなライブラリがあるとは・・・・・・私が3Dのページを飛び回ったのはいったいなんだったのか;

>3Dの概念もそうですが、3D空間を表示するカメラの扱い方をマスターしなければ
>凝ったカメラワークなどを取れないと思います。

おっしゃる通りです。3Dフリーゲームなどを遊んで見ると、カメラの使い方が最悪って
事が多いですよね。私の意見からするとカメラは360度自由に動かせて、なおかつ距離も
5段階、少なくとも3段階はあるとぐっと面白みと見やすさがあがると思います。なので、
ガンバってカメラの使い方もマスターしなければ。


>OpenGLやDirectXとかそういうことでしょうか?
>XNAとか他にも色々3Dが扱えるライブラリはあるので、探してみてはどうでしょう。
やっぱり、ライブラリを使って3D動画などは動かされているのでしょうか?
てっきり、3Dを簡単に動かすソフトか何かがあるのかと思っていました・・・・・

丁寧な解答ありがとうございました。とても勉強になりました^^


448ポイント を手に入れた。

Name: 管理人 [URL]  ..伝説のハッカー(788,657ポイント)   Date: 2008/09/09(火) 19:10   No:21103     
Title: Re:C言語を始めたのですが    
ムービーじゃない限り、ゲーム内の3D描画はリアルタイムレンダリングされていると思いますよ。
3D映像を作るソフトはありますが、それはゲームでも、「ムービーシーン」のように視点がかえられない
きっぱりわかれた映像になっていると思います。

shade等を使ってモデリング出来ますが、動かしているのは座標をリアルタイムで計算しているプログラムです。

あと、DXライブラリ3Dは
私もすごく期待しているライブラリなのですが、
DirectX、OpenGL、XNA、DXライブラリなどと同じようには考えるとまずいかもしれません。
http://fatalita.sakura.ne.jp/3DLib/Ref.htm
まだまだ製作途中のライブラリだと思いますし、
リファレンスもまだ書いてないものが多いです。
なので、利用するならそれを知っていて、利用するべきでしょう。
ただ、DXライブラリと互換性があるのでそこが強みだと思います。

詳しい事はDXライブラリ3Dの製作者であるJEXさんに聞けば詳しく教えてくれますよb


360ポイント を落としてしまった。

Name: pupil  ..かけだし(1,998ポイント)   Date: 2008/09/09(火) 21:58   No:21106     
Title: Re:C言語を始めたのですが    
>ムービーじゃない限り、ゲーム内の3D描画はリアルタイムレンダリングされていると思いますよ。
>3D映像を作るソフトはありますが、それはゲームでも、「ムービーシーン」のように視点がかえられない
>きっぱりわかれた映像になっていると思います。

やっぱり、Cyberdeliaなんかで作った画像はゲームには使え無いんですね;
今までてっきり、3Dキャラクターが歩いているアニメーションを動かしているのかと
思っていました。ですが、リアルタイムで座標を計算して動いてるんですね〜
いま、すでにキャラクターのアニメーション作ろうとしていましたが、話の中間や
おまけ用のムービにする事にします・・・・・・
あ、でもモーション付きモデルだから、カメラ変更ぐらいならできるのかな?

3Dの動きは難しいでしょうね><
例えば、鳥が羽ばたいている時の羽の曲線変化とか、人間の髪の動きとか・・・・
物体を動かすのではなく変化させるのは素人的にむりっぽそう。でも、今まで
やってきたゲームがどんな風に作られていたかって事が手に取るようにわかって
面白いですね。ますますプログラミングにハマりそうです。こんなわかりやすく丁寧な
HPを作ってくださった管理人様・上級者の皆様に感謝です><


536ポイント を手に入れた。

Name: 管理人 [URL]  ..伝説のハッカー(789,110ポイント)   Date: 2008/09/09(火) 23:27   No:21108     
Title: Re:C言語を始めたのですが    
Cyberdeliaは使った事が無いですが、アニメーションをさせる事はで来ますよ。
行列計算じゃ手に負えないようなアニメーションはアニメーションを作るソフトで作ったり、
モーションキャプチャを使って、実際にダンサーが踊ったような動きのデータを作ったりしていると思います。

ゲームで使うなら座標を計算する必要があるので、
ポリゴンデータを自力で計算するか、アニメーション情報を読み込んで、
計算するか、になると思います。

3Dデータ作りは私もまさに今勉強中の身なので、詳しい事は言えませんが
複雑でリアルなモーションは難しいですよね・・。
FinalFantasyという映画が昔ありましたけど、
あのキャラクタの髪のナビキは計算式やキャプチャじゃうまく表現出来ないから、
マヤで一つ一つ手作業で作っていったとインタビューで答えている記事を見たことがあります。

アニメーションが作れるソフトを使えば羽ばたきや髪の動きも再現できると思います。
(ポリゴン数が増えるから、髪のナビキはリアルタイムレンダリング無理かもしれませんが)


367ポイント を手に入れた。

Name: Justy  ..ハッカー(220,445ポイント)   Date: 2008/09/10(水) 01:16   No:21109     
Title: Re:C言語を始めたのですが    
 DXライブラリ3D見てみました。
 ざっと見たところ本格的なのはちょっと厳しそうですが、本家のように
さくっとモノを作るには丁度いいかもしれませんね。



>プロの業界ではDXライブラリは使わないでしょうし

 ところがどっこい、去年非ゲームな製品内部で使われているのを見ました!
 画面にデバッグ時に文字を出すのと、Vsync待ちが別のデバイスとの通信待ちに
使われていました(ちょっと待てば結果が返ってくるだろう、という希望的観測による
待ち方なので Vsync待ちを止めた途端バグる)。
 何でそんなありえない選択をしたのかは、作った人がもういないので今となっては謎です。



>3Dフリーゲームなどを遊んで見ると、カメラの使い方が最悪って事が多いですよね。
>私の意見からするとカメラは360度自由に動かせて、なおかつ距離も
>5段階、少なくとも3段階はあるとぐっと面白みと見やすさがあがると思います

 どういうゲームでのことを言っているのかはわかりませんが、
動かすだけなら簡単なんですよね。

 ゲームの内容にも依るのですが、変にカメラ周りの自由度を上げれば上げるほど、
それに附随してプログラムが複雑になり調整が大変になって、
ゲームが破綻していきます。
 素直に見下ろし固定だけにしとけばどんなに作るのが楽になることかwww



>鳥が羽ばたいている時の羽の曲線変化とか、人間の髪の動きとか

 鳥の方は羽ばたきの1つ1つのモーション自体は実物の動きをよく見て落とし込めば
そんなに大変じゃないような気がします(ツールがショボイと辛いことはありますが)。
 むしろ実際に飛ばした時の鳥の移動・姿勢制御だったり、モーション遷移だったり
群衆制御だったりの方がよほど大変かもしれません。

 髪の方はいろんなやり方がありますんで、どういう髪なのかどこまでまじめに
やるかで難易度が変わってきますね。



>やっぱり、Cyberdeliaなんかで作った画像はゲームには使え無いんですね;

 使えるんじゃないですか?
 様々な形式(Xファイルも)にエキスポート出来るようですし。


938ポイント を手に入れた。

Name: 管理人 [URL]  ..伝説のハッカー(789,130ポイント)   Date: 2008/09/10(水) 02:17   No:21112     
Title: Re:C言語を始めたのですが    
>ところがどっこい、去年非ゲームな製品内部で使われているのを見ました!

おぉ!ホントですか!
非ゲームですか、どんなソフトだろう・・。

>何でそんなありえない選択をしたのかは、作った人がもういないので今となっては謎です。

むむ。もういないって・・。

内部的な部分のどこにDXライブラリが使われているか
何か見たらわかるんですか?


20ポイント を手に入れた。

Name: たかぎ [URL]  ..熟練のプログラマー(58,376ポイント)   Date: 2008/09/10(水) 02:21   No:21113     
Title: Re:C言語を始めたのですが    
> >ところがどっこい、去年非ゲームな製品内部で使われているのを見ました!
>
> おぉ!ホントですか!
> 非ゲームですか、どんなソフトだろう・・。

私も実製品(非ゲーム)で使いたくなるときがあります。
それなりに便利ですからね。


45ポイント を手に入れた。

Name: Justy  ..ハッカー(220,867ポイント)   Date: 2008/09/10(水) 02:36   No:21114     
Title: Re:C言語を始めたのですが    

>むむ。もういないって・・。

 よくあることです(w



>内部的な部分のどこにDXライブラリが使われているか
>何か見たらわかるんですか?

 デバッグのあのLOGが exeと同じディレクトリに吐き出されてました。
 で、ソースもらって見てみたらやっぱり・・・ってかんじで。


132ポイント を手に入れた。

Name: 管理人 [URL]  ..伝説のハッカー(789,261ポイント)   Date: 2008/09/10(水) 03:10   No:21115     
Title: Re:C言語を始めたのですが    
>たかぎさん
お〜そうなんですか。
しかし意外にプロの世界で使われているにしても、
ゲーム用ライブラリがゲーム以外に使われているわけですね^^;

>Justyさん
>よくあることです(w
なるほど、、社会は怖い・・w
>デバッグのあのLOGが exeと同じディレクトリに吐き出されてました。
なるほど。SetOutApplicationLogValidFlag(FALSE)はしてなかったわけですねw
(こんな事言うと失礼ですが)DXライブラリはきっと学生時代の勉強用ライブラリか
同人ゲー製作用ライブラリにとどまっているだろうと
思っていましたが案外そうでもないんですね。


131ポイント を手に入れた。

Name: J  ..中級者(9,208ポイント)   Date: 2008/09/10(水) 22:01   No:21149     
Title: Re:C言語を始めたのですが    
自分は学生なので製品だのなんなのは言えないですが。
管理人さんの言う通りで勉強用ライブラリ兼同人ゲーの製作に使わせてもらっています。
これが無いとやっていけない!
DirectXの参考書をチラリと見たことはありますが、絶対にDXライブラリの方がいいですね。
DirectXと比べると、3Dに限界はあると思っていましたが、3Dバージョンがあったことを知り、
より一層DXライブラリの私的価値が上がりました。

しかし、製品版に使われているとは・・・
プロの方でも使われるのですね。でも肝心なところが間抜けだったみたいですが(笑
確かに使いやすくて便利なライブラリなのであらゆるプログラムに使えそうです。
プロの方が使っていたということで社会に出ても、胸を張って使って行けそうです(笑


176ポイント を落としてしまった。

Name: pupil  ..かけだし(2,281ポイント)   Date: 2008/09/10(水) 22:46   No:21150     
Title: Re:C言語を始めたのですが    
ちょっと今日、本屋さんで見てきたのですが、DirectXライブラリを使って
ゲームを作る本って無いのでしょうか? 私が見て見る限りDirectXを使った
本はたくさんありますが、ライブラリを使った本は見当たりませんでした。

DirectXを使いやすくしたものがDirectXライブラリと言う事はわかったのですが、
自際にどのように違うのかが全くわかりません。また、本屋さんはC++やDirectX
に関する知識が全く無く、自分で何を選んでいいのか全くです(種類が多すぎて)
C言語とDirectXを使ってゲームを作る本のお勧めを教えてください。
両方一つにまとめてあるものが無理ならば、別々の本でもかまいません。
やっぱり、それ相応の知識を身に付けるためには、ちゃんとお金を出さなければと思っています^^

レスが長くなって申し訳ないのですが、よろしくお願いします。


283ポイント を手に入れた。

Name: 管理人 [URL]  ..伝説のハッカー(790,698ポイント)   Date: 2008/09/10(水) 23:07   No:21151     
Title: Re:C言語を始めたのですが    
DirectXライブラリじゃなく、DXライブラリですね。
DirectXもライブラリの一つです。
DirectX,OpenGL,XNAなどは世界規模で使う為に作られた本格的なものですが、
DXライブラリは一般の方が趣味で作られた物だと思いますから、そういう意味では全く種類が違います。
(まぁライブラリのライブラリという時点で種類は同じではないですが、それでもあのクオリティは神ですよね。)

なので、DXライブラリの使い方の本は出版されていなくて不思議は無いのです。
・・・ですが、先日DXライブラリを使ったゲームの作り方の本が出版されました。
DXライブラリ製作者さんの執筆ではないようですが。
DXライブラリのHPにいけばどんな本か書いてありますよ。

DirectXとDXライブラリは何が違うか使ってみればすぐわかると思います。

DirectXは細かい事が自在に設定でき、あらゆることが実現できる分、マスターするのも難しいです。
大規模な開発をすれば本格的な3Dゲーム、例えばCrysisや最近のFFのようなゲームも作れるでしょう。
DXライブラリは2D限定の表現しか出来ず、出来ることも制限されていますが、
すごく使いやすく、3日あれば結構やりたいことが実現出来るようになるでしょう。

pupilさんは、DirectXの勉強がしたいのでしょうか?DXライブラリでしょうか?
DXライブラリなら、上でも紹介したとおり、
うちのサイトである程度勉強出来ると思います。
綺麗なプログラムじゃないとは思いますが・・。
DirectXの良い本は人に聞いてもいいでしょうけど、
やっぱ自分で読んでみてやる気の出そうな本がいいですよ。

大きな書店に行ってまず沢山読んでみること。
「絵やサンプルが沢山のっててある程度抽象的な方がやる気が出る」と感じると感じる人もいれば
「事細かく厳密にかいてあるほうがやる気がでる」と感じる人もいるでしょう。
DirectXのような多くの人が挫折してしまいがちな難しい分野は自分が読み易いと思う本であることも重要だと思います。

そのためにはある程度プログラムがどんなものか解らないといけないと思います。
でないと、読んでもそれが読み易いのかどうかわからないでしょうし・・。

>また、本屋さんはC++やDirectXに関する知識が全く無く、自分で何を選んでいいのか全くです

とりあえず本を手にとって、序章を読んでも何がかいてあるのかわからない状態では、
本を購入しても辛いと思います。
なので、まずDXライブラリを使いながらC言語に慣れていくのがいいかもしれません。


782ポイント を手に入れた。

Name: Justy  ..ハッカー(221,455ポイント)   Date: 2008/09/10(水) 23:33   No:21153     
Title: Re:C言語を始めたのですが    

>同人ゲー製作用ライブラリにとどまっているだろうと
思っていましたが案外そうでもないんですね。

 気付かないだけで、意外なところで使われているのかもしれませんね。



>しかし、製品版に使われているとは・・・

 とはいえ、今はもうないはずです。
 私にところにオハチが回ってきたときに、再設計したらそのアプリは不要になったんで。


151ポイント を手に入れた。

Name: pupil  ..かけだし(2,418ポイント)   Date: 2008/09/11(木) 17:31   No:21176     
Title: Re:C言語を始めたのですが    
管理人様、ありがとうございました。
今まで、「DXライブラリ=DirectXを簡単にした物」とばかり思っていました;
DXもまだ完璧に使いこなしてはいませんが、DirectXを使ってゲームを作って行こうかと
思います。始めてゲームを作るといっても、手の込んだものを作りたいですしね^^


137ポイント を手に入れた。

Name: 御津凪 [URL]  ..中級者(11,796ポイント)   Date: 2008/09/11(木) 17:41   No:21177     
Title: Re:C言語を始めたのですが    
> 始めてゲームを作るといっても、手の込んだものを作りたいですしね^^
作っている最中にあれやこれやと追加するような書き方はなるべく避けてくださいね。
色々と修正を加えているうちに何がなんだか分からなくなって、
仕舞いには破綻、となりかねませんので。

私が昔そうであったように…。

最初は大まかに考えて作るより、具体的に何がしたいのかを
しっかり書き留めてから取り掛かったほうが吉かもしれません。
特に中規模以上のゲームを作るには必須でしょう。


99ポイント を手に入れた。

Name: 管理人 [URL]  ..伝説のハッカー(791,368ポイント)   Date: 2008/09/11(木) 18:40   No:21179     
Title: Re:C言語を始めたのですが    
>Justyさん
>気付かないだけで、意外なところで使われているのかもしれませんね。

そうですね〜。
とりあえず同人2Dゲームをのぞいてみると
かなりの頻度でDXライブラリをみかけました^^;

>pupilさん
> 始めてゲームを作るといっても、手の込んだものを作りたいですしね^^

いや〜これはどうでしょう。
初めて作るものだからこそ、手を込んで作ってはいけないと私は経験上思います・・。
千羽鶴を折り始めるのと違い、作っていく中でその一つ一つは関連していますから、
途中から「こういうモジュールの作り方じゃ効率が悪かった・・」と思っても
根底から全部作り変えないとそれが解決出来なかったりするかもしれません。
うまく作れば完全に独立したモジュールから構成されるゲームもつくれるでしょうけど、
初めて作ってそこまで完璧に作っていく事は難しいのでは無いでしょうか。
う〜ん、何かせっかくやる気を持っていらっしゃるのに否定的な意見は言いたく無いのですが、
最初から大きなものを作ろうとすると挫折してしまうと思います。
・・段々慣れていくのが一番だと思いますよ。とだけ言っておきますm(_ _)m

御津凪さんの仰るように、途中から思いつきで機能を付けて行ったりすると、
わけがわからないモジュールになったりしかねません。
初めて作る状態で全て先を見越した設計をするのは結構難しいですよ;
まぁ大変な思いをすることも、いい経験だと思います。
経験に無駄なことなんてありませんからb

私も昔ありえないスパゲティコードを延々と書き続けたこともいい経験だと思っています^^;


436ポイント を手に入れた。

Name: konacchi  ..かけだし(1,759ポイント)   Date: 2008/09/12(金) 12:13   No:21219     
Title: Re:C言語を始めたのですが    
私は未だにひとつもゲームを作った事がないです・・・・。
(未だにとは言っても、暦は浅い訳ですが(汗))
必死に勉強してまして、はやくゲーム作って公開したいなぁ〜 といつも思っています(笑)
言語に対してすら知識が少ないのに同時にDirectXも覚えなくてはならず四苦八苦です。
ああ、早く本格的に開発したい・・・。
でも焦らずやっていこうと思います。
大風呂敷広げても後から苦労しそうですしね^^;

directXやライブラリの話が出てましたが。

DirectX→パズル工場
DXライブラリ→パズル
私達プログラマ→パズルを組み立てる人
コンパイラ→額縁
ゲーム公開→部屋に飾る

といったカンジですかね〜〜^^


84ポイント を手に入れた。

Name: Yuki  ..上級者(19,252ポイント)   Date: 2008/09/12(金) 13:52   No:21222     
Title: Re:C言語を始めたのですが    
・DirectX→グラフィック処理に特化したMicrosoft提供ライブラリ
・DxLib→DirectXの処理をある程度まとめたライブラリ

つまり中身はDirectXだし、突き詰めればすべてはアセンブリないし機械語にたどり着く。

プログラマとコンパイラに関しては

・プログラマ→設計図、手順を作る人
・コンパイラ→設計図にしたがって組み立てる人

でしょう。

何はともあれ、これからプログラミングする人は、手段が目的化するのは避けたほうがいいと思いますね。
どういうことかと言うと、「目的」があまりにも高度だと「手段」に労力を費やすということです。
もっと簡単に言ってしまえば、「コンソールアプリから始めましょう」


205ポイント を手に入れた。

Name: バグ  ..ハッカー(110,485ポイント)   Date: 2008/09/12(金) 14:08   No:21223     
Title: Re:C言語を始めたのですが    
そうですね、コンソールアプリもWindows.hを利用すれば、結構色々とできますしね。
意外に奥が深いですよ。


50ポイント を手に入れた。

Name: pupil  ..入門者(2,656ポイント)   Date: 2008/09/13(土) 15:54   No:21243     
Title: Re:C言語を始めたのですが    


 >管理人様

>いや〜これはどうでしょう。
>初めて作るものだからこそ、手を込んで作ってはいけないと私は経験上思います・・。

なるほど〜手を込んで作るのも慣れてからですね^^
ココ2日ほどいろんなサイトを見て回って学んだ事がたくさんありました。
DXライブラリに関する本が無いのは、個人で作ったライブラリだから。
でも、初心者向けには使いやすい。そして、初級編サイトには大抵
DXのことが書かれている。その理由は、最初からいろんな物を詰め込むより
シンプルに作って行けるようにって事だったんですね^^
じゃんけんゲームは何とか作れたので、次ぎはテトリスやブロック崩し、4×4ぱずる
なんかを作ってみようと思います。



 >Yukiさん

>何はともあれ、これからプログラミングする人は、手段が目的化するのは避けたほうがいいと思いますね。
>どういうことかと言うと、「目的」があまりにも高度だと「手段」に労力を費やすということです。
>もっと簡単に言ってしまえば、「コンソールアプリから始めましょう」

了解です。
英語も始めは短文から習いますもんね^^
それと同じで高度を目指すならまず低いところからなんですね。


みなさんの貴重なアドバイスありがとうございました。
また困った事があればよろしくお願いします。


238ポイント を手に入れた。



Name: yujin  ..ぴよぴよ(291ポイント)   Date: 2008/09/10(水) 21:32   No:21147       
Title: オセロMinMax法の実装    
オセロプログラムを作っているのですが、MinMax(再帰関数)法の実装がうまくいきません。
管理人様のクイックソートアルゴリズムで再帰関数を勉強させていただきました。
とても分かりやすかったです。この場を借りてありがとうございますm(_ _)m
因みにオセロプログラムはここのサイトを参考に作っています。
http://javagame.skr.jp/index.php?AI%A4%CE%BC%C2%C1%F5%2F%A5%DF%A5%CB%A5%DE%A5%C3%A5%AF%A5%B9%CB%A1
コンピューターが打つと一手ではなく(探索レベル2の時で)三手ぐらい返してきます。
ちゃんと一手だけ返してほしい(ToT)
数日間プログラムとにらめっこしていますが、バグの原因がつかめず。
打った後に手を戻す辺りが怪しいのですが。
添付ファイルにソースプロジェクトがあるので、恐縮ではありますが解決策のアドバイスを
お願い致しますm(_ _)m


環境は
Windows XP HomeEdition sp2
VC++ 2005EE DXライブラリ使用 です。


291ポイント を手に入れた。


Name: Justy  ..ハッカー(221,304ポイント)   Date: 2008/09/10(水) 23:23   No:21152     
Title: Re:オセロMinMax法の実装    
 コードを精査したわけではないので、根本の原因と違うかもしれませんが。
miniMax()関数でおかしなところがあります。

 オリジナルのコードは Undo undo = new Undo(x, y);の部分で関数内部に
undo変数としてデータを持っているので、再帰するたびに異なる undo変数が生成され
値を保持しますが、yujinさんのコードでは Undo()関数を呼び出した中で
グローバル変数を使って値を保持しているため、1つしか実体がありません。

 ここを直さないと、正しく Undo処理が行われないのではないでしょうか。


289ポイント を手に入れた。

Name: yujin  ..ぴよぴよ(592ポイント)   Date: 2008/09/11(木) 13:51   No:21168     
Title: Re:オセロMinMax法の実装    
返信が遅くなりましたが、Justyさんアドバイスをありがとうございますm(_ _)m
やはり手を戻す機能が怪しいと言うか、おかしいですか。
オリジナルのプログラムでは手を戻す時の機能をクラスを使って表現しているので、
同じように実装してみようと思います。
ただクラスは一度も使ったことが無いので、うまくいくかどうか^^;

オリジナルのクラスはこの様になっているので、

public class Undo {
// 石を打つ場所
public int x;
public int y;
// ひっくり返った石の数
public int count;
// ひっくり返った石の場所
public Point[] pos;

public Undo(int x, int y) {
this.x = x;
this.y = y;
count = 0;
pos = new Point[64];
}
}


C++風に書くなら、

class Undo {
// 石を打つ場所
int x;
int y;
// ひっくり返った石の数
int count;
// ひっくり返った石の場所
int pos[];

Undo(int x, int y) {
this.x = x;
this.y = y;
count = 0;
pos[64];
}
};

こんな感じでしょうか?


301ポイント を手に入れた。

Name: Justy  ..ハッカー(221,863ポイント)   Date: 2008/09/11(木) 20:06   No:21185     
Title: Re:オセロMinMax法の実装    

>C++風に書くなら
>こんな感じでしょうか?

 いえ、それだと配列の宣言で要素数がないのでコンパイルエラーになりますし、
そもそも全部 private扱いになるのでコンストラクタが実行できずやはりエラーになります。


 Undoクラスは単純にこんな感じでいいかと思います。
    struct Point

{
Point() {}
Point(int x_, int y_) : x(x_), y(y_) {}
int x, y;
};

struct Undo
{
Undo(int x_, int y_)
: x(x_), y(y_), count() {}

int x, y;
int count;
Point pos[64];
};



 とりあえず一通り見てみました。
 
 Undo関連の処理は前に指摘した通りだったのですが、もう1つ MIN_VALUE値もなにやら
悪さをしていました。

 とりあえず正常に動いているように見えるところまでは手を入れてみたので、
変更点を見比べて自分なりに書き直してみて下さい。


408ポイント を手に入れた。

Name: yujin  ..ぴよぴよ(666ポイント)   Date: 2008/09/11(木) 23:16   No:21195     
Title: Re:オセロMinMax法の実装    
>とりあえず一通り見てみました。

貴重な時間を裂いてまでありがとうございますm(_ _)m

しっかりと一手だけ返してくれる状態まで変更を加えていただいて大変恐縮です。


struct Point
{
Point() {}
Point(int x_, int y_) : x(x_), y(y_) {}
int x, y;
};

struct Undo
{
Undo(int x_, int y_)
: x(x_), y(y_), count() {}

int x, y;
int count;
Point pos[64];
};


これは構造体の中の構造体ですね。(苦手意識^^;)
Reverse関数が
void Reverse(int x, int y, int vecX, int vecY) から
void Reverse(Undo &undo, int vecX, int vecY)  になった瞬間私の頭の中はパニックです(笑)
 実は、関数の引数に&や*が付くのが苦手で、ここら辺の理解がしっかりと
していないから今回の様なバグを発生させてしまった様な気がします。
 Justyさんが修正して下さったソースを参考にしてここら辺の理解も
しっかりと固めてようと思います。


2倍のポイントを手に入れた! 74ポイント を手に入れた。

Name: yujin  ..ぴよぴよ(753ポイント)   Date: 2008/09/12(金) 21:37   No:21234 解決!     
Title: Re:オセロMinMax法の実装    
解決マークを忘れていました。

Justyさん色々とアドバイスをしていただきありがとうございますm(_ _)m
 まだまだ未熟者なので能力の限界が来た時にまたここの質問サイトを利用させて頂く
のでその時は宜しくお願いいたします。
 早く色々な人にアドバイスが出来るよう精進していきます。


87ポイント を手に入れた。



Name: 一戸建  ..ぴよぴよ(67ポイント)   Date: 2008/09/12(金) 18:56   No:21231       
Title: 実行ファイルの作り方    
龍神録の実行ファイルの作り方を教えてください。

リリースファイルから作成したexeを他のディレクトリーに写した状態だとロードエラーになってしまうのですが・・・・


67ポイント を手に入れた。


Name: array  ..プログラマー(25,828ポイント)   Date: 2008/09/12(金) 19:43   No:21232     
Title: Re:実行ファイルの作り方    
以前同じような質問があったので参考にしてみてはどうでしょうか

過去ログ


60ポイント を手に入れた。

Name: 一戸建  ..ぴよぴよ(11ポイント)   Date: 2008/09/12(金) 19:58   No:21233 解決!     
Title: Re:実行ファイルの作り方    
解決しました。ありがとうございます。

11ポイント を手に入れた。



Name: recoba  ..ぴよぴよ(483ポイント)   Date: 2008/09/11(木) 13:24   No:21166       
Title: 教えてください    
20分おきにデスクトップ上に自動でexcelシートが記録されていく

加速度センサを使っています。

そこで質問ですが、このセンサは手打ちで保存先の名前を

変えないと上書きされてしまい、時間ごとの変化がみれません。

自動でexcelシートの名前を変更することができるでしょうか?

(20分おきに記録されるといいましたが、マクロのフリーソフトを
 
 使っていますので、間隔を変えることは可能です。ただし、20分
 
 たつと、もう1度クリックしないと記録は再開されません。 )
 
 よろしくお願いします。



210ポイント を手に入れた。


Name: バグ  ..ハッカー(109,182ポイント)   Date: 2008/09/11(木) 14:36   No:21169     
Title: Re:教えてください    
発想を転換して、新しいファイルが出来る前に、今あるファイルの名前を変更してやればいいのではないでしょうか?

定期的(当然ですが、20分よりも短い間隔でないと駄目ですよ)にデスクトップ上のファイルを検索して、自動生成されるエクセルファイルの名前と同じものをみつけら、名前を変更してしまうというのでいいのではないでしょうか?

例えば、そのファイルのタイムスタンプを参照して、作成日時の年月日時分秒をファイルの名前にするとか…(2008年9月11日14時40分50秒ならば、20080911144050.xlsみたいな感じです)


175ポイント を手に入れた。

Name: recoba  ..ぴよぴよ(584ポイント)   Date: 2008/09/11(木) 14:55   No:21170     
Title: Re:教えてください    
このセンサの利用目的の関係上、24時間の

測定が必要ですので、デスクトップ上にexcelシートが

きたら、連番などで自動で名前を変えてくれる必要性が

あります。。。

返信あるがとうございますm_m


101ポイント を手に入れた。

Name: バグ  ..ハッカー(109,112ポイント)   Date: 2008/09/11(木) 15:24   No:21172     
Title: Re:教えてください    
ん?ファイルの名前は何とでもできますよ。
recobaさんの開発環境を教えていただければ、簡単なサンプルを組みましょうか?
少し、お時間はいただきますが…(苦笑)


70ポイント を落としてしまった。

Name: 管理人 [URL]  ..伝説のハッカー(790,932ポイント)   Date: 2008/09/11(木) 15:35   No:21173     
Title: Re:教えてください    
例えば今「Record.csv」という名前で吐き出されているとしましょう。

デスクトップ上にあるファイル情報を取ってきて、
Record*.csvに引っかかるファイルリストを作ります。

もしなければRecord.csvをRecord0000.csvに変更。

もしRecord0000.csvが既にあればRecord0001.csvに変更・・・。
このようにしていけば
Record0000.csv
Record0001.csv
Record0002.csv
Record0003.csv
Record0004.csv
といったファイルが出来ていくと思うので、数の一番大きなファイル名+1のファイル名に名前を変更してやれば良いと思いますよ。

ループは
例えば Sleep(20*60*1000);←1000ミリ秒×60秒×20分
のようにしておけば20分待機します。


234ポイント を手に入れた。

Name: recoba  ..ぴよぴよ(606ポイント)   Date: 2008/09/11(木) 15:57   No:21174     
Title: Re:教えてください    
visual C++を利用しております。

すいませんが、よろしくお願いします。


22ポイント を手に入れた。

Name: recoba  ..ぴよぴよ(621ポイント)   Date: 2008/09/11(木) 16:34   No:21175     
Title: Re:教えてください    
すいません補足です。
WindowsXPです。


15ポイント を手に入れた。

Name: バグ  ..ハッカー(109,295ポイント)   Date: 2008/09/11(木) 19:38   No:21183     
Title: Re:教えてください    
ごめんなさい、チェックする前にC#で作ってしまいました(^_^;)

添付したファイルをデスクトップに置いて実行してください。
検索ファイル名、保存先フォルダ、検査間隔の3項目を入力してからStartボタンを押してください。

検索ファイル名…拡張子込みのファイル名です。例えば"Test"というエクセルシートファイルならば、"Test.xls"と入力してください。

保存先フォルダ…保存先フォルダ名です。これはデスクトップに作成されますので、フォルダの名前だけでかまいません。

検査間隔…何秒に一度ファイルの検索を行うかの設定です。

設定を変更したい場合はStopボタンを押した後に変更してください。




183ポイント を手に入れた。

Name: recoba  ..ぴよぴよ(731ポイント)   Date: 2008/09/11(木) 20:16   No:21186     
Title: Re:教えてください    
バグ様どうもありがとうございます。

すいません、質問ですが早速やってみたのですが、入力文字列が正しくありません。

と表示されましたm_m

また使っているセンサの関係上、full01.xls という名前で20分おきにデスクトップに

記憶されるのですが、これをフォルダに移動した場合、自動的に上書きされないのでしょうか?

すいませんがお答よろしくお願いします。


110ポイント を手に入れた。

Name: バグ  ..ハッカー(109,374ポイント)   Date: 2008/09/11(木) 20:37   No:21187     
Title: Re:教えてください    
フォルダ名か検索間隔に無効な文字が入力されているのだと思います。試しにフォルダ名を「TEST」、検索間隔を「5」と入力してみてください。
それから、逆に質問なのですが、加速度センサーのファイルというのは毎回作成されて、同じ名前のファイルが存在する場合は上書きされるんですよね?


79ポイント を手に入れた。

Name: recoba  ..かけだし(1,010ポイント)   Date: 2008/09/11(木) 20:55   No:21188     
Title: Re:教えてください    
バグ様。

説明が不十分で申し訳ありません。

センサはSTARTを押すと20分間連続で記録することができます。

20分たつと自動でSTOPされてしまい、20分間の記録された値が

full01.xlsという形でデスクトップ上に記録されます。

マクロを使い、自動で再度クリックすることができるようになったので

またfull01.xlsという形で20分間連続で記録することができます。

よって、20分前〜40分前に記録されたfull01.xlsが上書きされてしまいますので

上書きされる前に、自動で名前を変えることができないかと思いまして・・・。

検査間隔というのは、5秒に設定すると、5秒毎にデスクトップ上にfull01.xlsがないかを

チェックして、ある場合はフォルダに移動できるのでしょうか?

まことに申し訳ありませんが返信よろしくお願いいたします。


279ポイント を手に入れた。

Name: フリオ  ..プログラマー(27,618ポイント)   Date: 2008/09/11(木) 22:12   No:21190     
Title: Re:教えてください    
 
 タイトルは、内容がわかるものにしてほしいです。
 
 
 とにかく、その"マクロのフリーソフト"の仕様と、どこまで自動化したいのかを明確にしないと
話が進まないんじゃないでしょうか。

その"マクロのフリーソフト"がデータを書き込んでいる間は、
ファイル名を書き換えることができません。

したがって、"マクロのフリーソフト"がストップしてから、再スタートするまでの間に、
バッチファイル又はプログラムを使ってファイル名を書き換えるしかありません。
そしてその場合、ストップを確認した後、そのバッチファイル又はプログラムを動かし、
"マクロのフリーソフト"を再スタートする手間は残ります。

もし ストップの検知、ファイル名の書き換え、再スタート まで自動化したいなら、
その"マクロのフリーソフト"の仕様によっては、それ自身を書き換えるか、
あなたが望む機能を持った別のソフトを使う必要があります。
 


208ポイント を手に入れた。

Name: recoba  ..かけだし(1,076ポイント)   Date: 2008/09/11(木) 22:21   No:21191     
Title: Re:教えてください    
フリオ様

フリーソフトは単純なものであり、左クリックを押すまでの間隔

を設定するだけのものです。

つまり1200秒に設定すれば、20分おきに1回左クリックするだけのものです。

すいませんがバッチファイルとはどのようなものでしょうか?

調べてみたのですが、よくわかりません・・・

特別何かダウンロードをする必要はありますか?


66ポイント を手に入れた。

Name: バグ  ..ハッカー(109,525ポイント)   Date: 2008/09/11(木) 23:02   No:21192     
Title: Re:教えてください    
20分間連続で計測ということは、その20分間はエクセルのファイルは触れないという事ですよね。
その加速度センサーは20分間の連続計測が終了したあとは、左クリックされるまでは完全にストップしているという解釈で間違いないですか?
それならば、私の作成したソフトに、加速度センサーの計測用ソフトに対してメッセージを発行してやる機能を追加してやればいけるかもしれません。


151ポイント を手に入れた。

Name: recoba  ..かけだし(1,102ポイント)   Date: 2008/09/11(木) 23:06   No:21194     
Title: Re:教えてください    
バグ様

おっしゃる通りです。



2倍のポイントを手に入れた! 26ポイント を手に入れた。

Name: recoba  ..かけだし(1,244ポイント)   Date: 2008/09/11(木) 23:21   No:21197     
Title: Re:教えてください    
最初の20分の記録が終わり、「full01」がExcelとして

デスクトップ上に記録されたらそれをリネームして「full02」

として変換できるようにしたいです。

以下、03・・・・・100と「full01」をリネームして24時間の測定

ができるようにしたいです。

すいませんがよろしくお願いします。


142ポイント を手に入れた。

Name: フリオ  ..プログラマー(27,543ポイント)   Date: 2008/09/11(木) 23:27   No:21198     
Title: Re:教えてください    
 
>つまり1200秒に設定すれば、20分おきに1回左クリックするだけのものです。

 なら、いちいちファイル名を書き換えなくても、86400秒に設定すれば、24時間計測できるのでは?
 


75ポイント を落としてしまった。

Name: recoba  ..かけだし(1,374ポイント)   Date: 2008/09/11(木) 23:53   No:21199     
Title: Re:教えてください    
フリオ様

センサは20分しか連続で記録ができないので

1日だと24×60÷20=72枚のエクセルシートが必要になってきます。


2倍のポイントを手に入れた! 130ポイント を手に入れた。

Name: バグ  ..ハッカー(109,734ポイント)   Date: 2008/09/11(木) 23:55   No:21200     
Title: Re:教えてください    
>フリオさん
これまでの書き込みを読んだ感じでは、おそらく、加速度センサーの仕様で20分までしか連続で計測できないんじゃないかと思われます。
それで、20分間の計測データを毎回同じ名前で、新規作成or上書き保存してしまうので困っているという事だと解釈しています。
マウスクリックは計測開始の切っ掛けなだけなのだと思います。
ですから、マウスクリックのイベントを別プロセスから発生させてやればいいのかな…と思ったんですが、飛躍させすぎかな?(^_^;)


209ポイント を手に入れた。

Name: recoba  ..かけだし(1,512ポイント)   Date: 2008/09/12(金) 00:12   No:21201     
Title: Re:教えてください    
バグ様のおっしゃる通りです。

毎回同じ名前で記録されるので、上書き保存されてしまうのです・・・

なのでデスクトップ上に最初のエクセルシートが記録されたらリネームをしてほしい

のですが簡単な方法はないものでしょうか・・・?

例えばですが、常に「1」という名前で記録される場合は、「2」にリネーム

次にまた「1」という名前で記録されたら「3」にリネームできるようになれば

24時間の測定が可能かと・・・


138ポイント を手に入れた。

Name: バグ  ..ハッカー(109,753ポイント)   Date: 2008/09/12(金) 08:41   No:21212     
Title: Re:教えてください    
1つ試していただきたいのですが、full01.xlsファイルを消去した状態で計測を開始してみてください。
その時、full01.xlsファイルが作成されるタイミングを見ておいてください。
そして、計測終了時にファイルが作成されるのか、計測開始と同時にファイルが作成されるのかを教えてください。


19ポイント を手に入れた。

Name: たいちう  ..中級者(9,897ポイント)   Date: 2008/09/12(金) 09:27   No:21213     
Title: Re:教えてください    
ちなみにそのフリーソフトが動いている途中で、人力でエクスプローラから
ファイル名を変更することはできるんですよね?

もしも、フリーソフトが20分間の計測中にエクセルファイルをロックしていて、
計測終了後直ちに次の計測に移るのならば、人力でもプログラムからでも
ファイル名の変更は困難(or 不可能)です。
エクスプローラからの挙動を書いてください。

> マクロを使い、自動で再度クリックすることができるようになったので

ひょっとしてエクセルのマクロ?
full01.xlsのVBAの部分がフリーソフト?


というわけで、フリオさんの書く通りなんですよね。

> とにかく、その"マクロのフリーソフト"の仕様と、
> どこまで自動化したいのかを明確にしないと
> 話が進まないんじゃないでしょうか。


219ポイント を手に入れた。

Name: バグ  ..ハッカー(109,965ポイント)   Date: 2008/09/12(金) 09:32   No:21214     
Title: Re:教えてください    
>>もしも、フリーソフトが20分間の計測中にエクセルファイルをロックしていて、
計測終了後直ちに次の計測に移るのならば、人力でもプログラムからでも
ファイル名の変更は困難(or 不可能)です。
エクスプローラからの挙動を書いてください。

そうなんですよ、私が引っかかっていたのも、正にココなんですよ。
もし、計測終了時にファイルを作成して、まとめて書き込むような仕様であれば、全く問題ないんですが、計測ソフト側に20分間ずっと占有されてしまっていては、なかなか難しいかな…と。


212ポイント を手に入れた。

Name: バグ  ..ハッカー(110,045ポイント)   Date: 2008/09/12(金) 09:44   No:21215     
Title: Re:教えてください    
>>recobaさん
あ、それから、『マクロのフリーソフト』の名前を教えてください。
フリーソフトならどこかでダウンロードされたのでしょうから、そのサイトを見ればどのようなものか検討がつくかもしれません。


80ポイント を手に入れた。

Name: recoba  ..かけだし(1,904ポイント)   Date: 2008/09/12(金) 10:44   No:21217     
Title: Re:教えてください    
マクロ
TimerClick Version 1.0.0.0

仕様
・指定した位置を定期的に(自動で)左クリックする為のツールです。
 ・画面のカウントはクリックした回数を表示します。
  →「9999999」を超えると「0」に戻ります。
 ・画面の「クリック間隔」にはミリ秒単位の値を入力します。
使用例
 ・画面の「クリック間隔」に「5000」と入力します。
 ・「開始」ボタンを押下するとともに、
  定期的にクリックしたい箇所に
  すばやくマウスカーソルを移動します。
  (以降、5秒間隔で自動的にクリックされます。)

エクセルへの記録は20分の測定が終わった後です。

測定中はデスクトップへの記録はされません。

よろしくお願いします


2倍のポイントを手に入れた! 392ポイント を手に入れた。

Name: バグ  ..ハッカー(110,435ポイント)   Date: 2008/09/12(金) 12:25   No:21220     
Title: Re:教えてください    
>>recobaさん
マクロというか、全く別のアプリなんですね(^_^;)

>エクセルへの記録は20分の測定が終わった後です。

という事は、そのファイルの生成が終了して、次の計測を行っている間はファイルに触っても問題無さそうですね。

という訳で、ソフトを改良しました。
改良点ですが…

1:別プロセスでファイルを操作している場合は、何もせずに待つようにしました。
2:何が起こっているかを分かりやすくする為に、ログを表示するようにしました。
3:移動させる際にフォルダ内のファイル数を元にファイル名を作成するようにしました。(例:ディレクトリ内にファイルが10個存在する場合は、full01_00011.xlsになります)

改良の3に関しては、recobaさんの希望していたものと少し違いますが、ご容赦ください。
これで試してみてください。


検査間隔はできるだけ短いほうが良いと思います。例えば1秒とかでも全然問題ないです。


390ポイント を手に入れた。

Name: recoba  ..かけだし(1,689ポイント)   Date: 2008/09/12(金) 14:08   No:21224     
Title: Re:教えてください    
バグ様

さっそく使わせていただきましたが、フォルダにexcelシートが移動されませんでした。

私のやり方に問題点がなかったかご指示をいただければ幸いです。

@ソフトを起動させて、検索ファイル名と保存先フォルダと検査間隔を記入
           (full01.xls  a  1)
Aセンサのスタートボタンをクリックする。

この順番でやりましたが、ファイルはデスクトップ上に残っており、上書きされていました。

すいませんがよろしくお願いします。


215ポイント を落としてしまった。

Name: バグ  ..ハッカー(110,487ポイント)   Date: 2008/09/12(金) 14:24   No:21225     
Title: Re:教えてください    
いきなりですが、ごめんなさい。1つ不具合がありました。
修正させていただきましたんで、最新版をお使いください。

ちなみに、やり方は問題ありません。
ログにはなんと表示されていますか?
こちらでは問題無く動いているのですが…?


2ポイント を手に入れた。

Name: バグ  ..ハッカー(110,507ポイント)   Date: 2008/09/12(金) 14:29   No:21226     
Title: Re:教えてください    
普通に動いた際の画像を貼っておきますね。

20ポイント を手に入れた。

Name: recoba  ..かけだし(1,727ポイント)   Date: 2008/09/12(金) 14:36   No:21227     
Title: Re:教えてください    
検索を開始しました

とはでますが、実際にはデスクトップ上に残ったままです・・・

たえず上書きされる状態です・・・


38ポイント を手に入れた。

Name: バグ  ..ハッカー(110,570ポイント)   Date: 2008/09/12(金) 14:42   No:21228     
Title: Re:教えてください    
検索用ソフトの実行ファイルは、デスクトップに置いてありますか?
解凍した際に自動生成されるフォルダの中に入ったままになっていませんか?


63ポイント を手に入れた。

Name: recoba  ..かけだし(1,755ポイント)   Date: 2008/09/12(金) 14:45   No:21229     
Title: Re:教えてください    
できました!!!

バグ様には大変お世話になりました。

ありがとうございますm_m


28ポイント を手に入れた。

Name: recoba  ..かけだし(1,763ポイント)   Date: 2008/09/12(金) 14:46   No:21230 解決!     
Title: Re:教えてください    
解決です

8ポイント を手に入れた。



Name: GPGA  ..熟練のプログラマー(50,158ポイント)   Date: 2008/09/11(木) 12:23   No:21161       
Title: クラスのメンバ変数の宣言と定義とインスタンス化について    
お世話になります。

class Hoge {
int n;
};
 
とした場合、nは変数の定義になると思います。
この n を静的変数にした場合

class Hoge {
static int n;
};
int Hoge::n;
 
のように、クラス外にnの実態を定義する必要があります。

これらを考えると、静的変数でないメンバ変数を、class内に記述した場合
変数の定義として扱われ、静的メンバ変数をclass内に記述した場合
それは宣言であり、class外でのインスタンス化を定義と考えるべきでしょうか?

それとも、class内に記述した静的変数は定義であり
class外の記述は、インスタンス化しただけであると考えるべきでしょうか?


98ポイント を手に入れた。


Name: 御津凪 [URL]  ..中級者(11,697ポイント)   Date: 2008/09/11(木) 12:35   No:21162     
Title: Re:クラスのメンバ変数の宣言と定義とインスタンス化について    
クラス内で静的メンバ変数は宣言として扱われ、
クラス外で定義される、ではないでしょうか。

宣言は存在を表し、
定義はその実体を表す記述を指すのではないでしょうか。

余り自信はありませんが…。


72ポイント を手に入れた。

Name: たかぎ [URL]  ..熟練のプログラマー(58,498ポイント)   Date: 2008/09/11(木) 12:37   No:21163     
Title: Re:クラスのメンバ変数の宣言と定義とインスタンス化について    
> これらを考えると、静的変数でないメンバ変数を、class内に記述した場合
> 変数の定義として扱われ、静的メンバ変数をclass内に記述した場合
> それは宣言であり、class外でのインスタンス化を定義と考えるべきでしょうか?

定義かどうかという意味ではそうですが、インスタンス化という意味では少し違います。

まず、C++では、インスタンス化(この用語も正確とはいえませんが)には二つの意味があります。
一つは、ある型を持つオブジェクトの実体を生成すること。
もう一つは、テンプレートやインライン関数の実体を生成することです。

前者に限った場合でも、
class Hoge {

int n;
};

の実体が生成されるのは、
Hoge hoge;


とか、
Hoge* ptr = new Hoge;


とした場合です。
単にクラスを定義しただけでは実体まではできません。

逆に、静的データメンバの場合、
class Hoge {

static const int n = 123;
};

とすれば、実体まで生成されたと考えることもできます。
ただし、ここでいう実体とは、必ずしも記憶域を占有するものではなく、あくまでも定数としての実体です。


24ポイント を手に入れた。

Name: GPGA  ..熟練のプログラマー(50,771ポイント)   Date: 2008/09/11(木) 13:38   No:21167     
Title: Re:クラスのメンバ変数の宣言と定義とインスタンス化について    
ご返答ありがとうございます。

>>御津凪さん
>宣言は存在を表し、
>定義はその実体を表す記述を指すのではないでしょうか。
グローバル変数や通常の関数の考え方ですと、上記のようになるのですが
クラスの場合、宣言は
class Hoge;
定義は
class Hoge {
・・・
};
と記述します。しかし、たかぎさんも書かれていますが
Hogeを定義しただけでは、実態化はされません。

ただ、staticされた変数というのはHogeというスコープでくくられた
グローバル変数であるという解釈もできます。


>>たかぎさん
つまり、class内の記述==宣言、class外の記述==定義と考えていいということでしょうか?


>>御津凪さん
>>たかぎさん
最初の質問のときに説明足らずでしたので、今ここで補足いたします。
最終的に私が知りたい内容は、classのstatic変数の、C++としての在り方です。

static変数を定義==実態化であるルールの下に存在させるか
定義!=実態化であるクラスのルールの下に存在させるかによって
class内部の記述を宣言とするか、定義とするかが決まってくると考えています。

もっとも、static変数は上記の二つと違い、整数型定数以外は必ず、宣言と定義を
必要とするため、そのどちらにも所属しない第3のルールの下に存在させるということも考えています。
これは、関数はプロトタイプ宣言をしなくても使用する方法はありますし、クラスは、宣言するほうが稀ですが
class内の静的変数は、整数型定数以外は必ず、class内とclass外に記述をしなくてはならないということです。


613ポイント を手に入れた。

Name: ibis  ..中級者(12,846ポイント)   Date: 2008/09/11(木) 14:55   No:21171     
Title: Re:クラスのメンバ変数の宣言と定義とインスタンス化について    
クラス外の宣言を省いたときにリンカエラーで「未定義の外部参照」とか出ますし、
メンバ関数のプロトタイプ宣言-定義と同じ扱いなのでしょうか。
つまりクラス内の宣言は宣言だけで、クラス外の宣言は定義も兼ねると。

ちなみにBCC55とGCC3.8.1で試したら、外部で宣言しなくてもエラーは(というか警告すら)出ませんでした。
それらのコンパイラではクラス内の宣言が定義として扱われてるのでしょうかねぇ?
それでクラス外の宣言は無視?


119ポイント を手に入れた。

Name: たかぎ [URL]  ..熟練のプログラマー(58,774ポイント)   Date: 2008/09/11(木) 17:43   No:21178     
Title: Re:クラスのメンバ変数の宣言と定義とインスタンス化について    
> つまり、class内の記述==宣言、class外の記述==定義と考えていいということでしょうか?

定義というのは、一定の条件を満たす宣言のことです。
そして、JIS X3014:2003の3.1 宣言及び定義では、次のように規定されています。

  宣言は, 次の場合を除いて, 定義(definition)という。
   - 関数本体を指定せずに関数を宣言している場合
   - extern指定子又は《結合指定》を含んでいて, 《初期化子》も《関数本体》も含んでいない場合
   - クラス宣言の中で静的データメンバを宣言している場合
   - 型定義宣言, 《using宣言》又は《using指令》の場合

つまり、クラスの静的データメンバは宣言ですが、非静的データメンバは定義になります。
しかし、定義であることと実体化であることとは別の話です。
例えば、
template <class T> struct A

{
static int a;
};

template <class T>
int A::a;

とした場合、クラスの外に書いたA::aは定義ですが、実体ができるのはテンプレートが具現化された時点です。


276ポイント を手に入れた。

Name: GPGA  ..熟練のプログラマー(51,002ポイント)   Date: 2008/09/12(金) 11:26   No:21218     
Title: Re:クラスのメンバ変数の宣言と定義とインスタンス化について    
>>ibisさん
手元のVC9.0とBCC5.5.1で試してみましたが、どちらもリンクエラーが出ました。
エラーが出なかったのは、プログラム内部で使用しなかったから、消されたとかないですかね?

>>たかぎさん
>宣言は, 次の場合を除いて, 定義(definition)という。
> - 関数本体を指定せずに関数を宣言している場合
> - extern指定子又は《結合指定》を含んでいて, 《初期化子》も《関数本体》も含んでいない場合
> - クラス宣言の中で静的データメンバを宣言している場合
> - 型定義宣言, 《using宣言》又は《using指令》の場合
なるほど、ありがとうございます。


231ポイント を手に入れた。

Name: ibis  ..中級者(12,947ポイント)   Date: 2008/09/12(金) 13:37   No:21221     
Title: Re:クラスのメンバ変数の宣言と定義とインスタンス化について    
>手元のVC9.0とBCC5.5.1で試してみましたが、どちらもリンクエラーが出ました。
>エラーが出なかったのは、プログラム内部で使用しなかったから、消されたとかないですかね?

あー、消されたかもですね。
インスタンスの宣言はしといたんですが、意味のある処理は何もしてないです。


101ポイント を手に入れた。



Name:  ..初心者(8,571ポイント)   Date: 2008/09/12(金) 01:33   No:21202       
Title: 配列について    
こんばんは、早速ですが質問させて頂きたい事があります。

現在課題としてコマンドプロンプト上で動くリバーシを作っているのですが、その作業の最中に配列と構造体で引っかかってしまいました。
質問内容なのですが、


#include <stdio.h>

typedef struct{
int flag;
}STONE;

STONE black[8][8];
STONE white[8][8];

int main(void){
black[3][4].flag=1;
black[4][3].flag=1;
white[3][3].flag=1;
white[4][4].flag=1;

for(int s=0; s<8; s++){
for(int j=0; j<16; j++){
printf(" %d",black[s][j].flag);
}
printf("\n");
}

printf("\n");

for(int s=0; s<8; s++){
for(int j=0; j<16; j++){
printf(" %d",white[s][j].flag);
}
printf("\n");
}
return (0);
}


まず仮にこのようなプログラムがあるとします。
このプログラムを実行した結果が以下になります(目がチカチカしそうな内容ですいません...)

・結果
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0
0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0
0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0
0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0
0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0


この結果を見て、まず疑問に思ったのが配列の要素数が[8][8]にも関わらず、[8][16]まで表示できているという点です。
今までの勝手な認識では、配列というのは宣言した要素数までしか使用出来ず、仮にその要素数を超えるような要素に値が代入・あるいは表示される場合はエラーか警告を返してくれるのだと思っていました。
しかしこの結果を見る限りそうでもないようですので、仕様(?)ということでしょうか……?

それと、
black[3][4].flag=1;
black[4][3].flag=1;
white[3][3].flag=1;
white[4][4].flag=1;
という具合に1を代入しているのですが、結果を見ると変な所にまで1が代入されてしまっています。
憶測ですがアドレスか何かの関係かな? と適当に思ってはみているのですが、よければ解説をお願いしたいです。

最後にもう一つだけ。。。
まず、以下のような構造体と配列があるとします。

1.構造体
typedef struct{
int flag;
}STONE;
STONE black[8][8];
2.配列
int black2[8][8];


配列の場合、初期化されていないので各要素にとんでもない値が代入されているようですが、
構造体の配列(?)であるblackは最初から全て0で初期化されているということを知りました。
ですが、仮に0で初期化したい場合、やはり初期状態で勝手に0が代入されていると言っても
やはり初期化の処理はしておいた方がいいのでしょうか?
こちらのサイトのゲームプログラミングの館などでは初期化を行っているので、
恐らくした方がいいとは思うのですが、一応確認をということで……。
また、構造体の配列の場合0で初期化されているのは仕様というかそんな感じなのでしょうか?

分かりにくい質問かもしれませんが、何かアドバイス頂ければ幸いです。

コンパイラ:BorlandC++ Compiler
開発環境:CPad for Borland C++Compiler
OS:Windows XP


1,255ポイント を手に入れた。


Name: 管理人 [URL]  ..伝説のハッカー(791,003ポイント)   Date: 2008/09/12(金) 01:58   No:21207     
Title: Re:配列(あるいは構造体)について    
それは
STONE black[8][8];
の次に連続したアドレス上に
STONE white[8][8];
が確保されたためでしょう。
int a[10];
で用意した配列に
a[20]=10;
とか用意していない要素に代入してもコンパイルエラーでは教えてくれません。
こういうのをオーバーフローといってバグの原因の一つとして問題とされています。
[ ]の中の数字は単純にそのsizeof(int)バイト目をさしますから、
そこが確保された領域かどうかわかりません。

オーバーフローは非常にやっかいで、例えば
int a[10];
int b=1;
で用意した場合、a[10]=2;とすれば、
bがaに連続したアドレス上に確保された場合b=2;をしたことと同じ意味になりますから
bに2を代入した覚えが無いのに、いつの間にか2が入ってるって事もあります。

#define MAX 10

みたいに定義を用いて配列要素を指定したり、for文の上限を指定したりするのは
変更が楽だというほかにこのようなバグの発生をふせぐ目的もあると思います。

なので、今回[8][16]まで表示できたのではなく、[16][8]まで表示できたという方が感覚的に正しいかもしれません。
また、2次元配列は連続したアドレス上に確保されますから、
こんな事にもなります。


#include <stdio.h>

char str[2][4];

int main( void ){
str[0][0]='y';
str[0][1]='e';
str[1][0]='s';
str[1][1]='!';
int i,j;
for(j=0;j<8;j++){
putchar(str[0][j]);
}
}

実行結果

ye s!

本来2と4で2重ループでわけないといけないはずですが、これで表示できてしまいます。
また、グローバル変数は自動的に中身が0で初期化されますが、
ローカル変数はされませんからこんな事に。

#include <stdio.h>


int main( void ){
char str[2][4];
str[0][0]='y';
str[0][1]='e';
str[1][0]='s';
str[1][1]='!';
int i,j;
for(j=0;j<8;j++){
putchar(str[0][j]);
}
}

実行結果

yeフフs!フフ

 
 


733ポイント を落としてしまった。

Name: 管理人 [URL]  ..伝説のハッカー(791,423ポイント)   Date: 2008/09/12(金) 02:05   No:21208     
Title: Re:配列(あるいは構造体)について    
上の「フフ」という部分は、全角じゃなく、半角です。
文字化け対策の為、掲示板の仕様で自動的に全角に置換されたようです。

また、今回はアドレスと構造体の話が出てきたので、
この辺も押さえておくと良いでしょう。

「構造体 アライメント」でググる。
http://www.google.co.jp/search?hl=ja&q=%E6%A7%8B%E9%80%A0%E4%BD%93+%E3%82%A2%E3%83%A9%E3%82%A4%E3%83%A1%E3%83%B3%E3%83%88&lr=&aq=1&oq=%E6%A7%8B%E9%80%A0%E4%BD%93%E3%80%80%E3%81%82



今、short intが2バイト、intが4バイトだとします。
このshort intとintのセットの構造体は何バイトになるでしょう?
2+4だから6バイトになると思いますが、実は8バイトです。
実際に確かめてみましょう。

#include <stdio.h>

typedef struct{
short int a;
int b;
}ch_t;

int main( void ){
printf("short int = %d\n",sizeof(short int));
printf("int = %d\n",sizeof(int));
printf("ch_t = %d\n",sizeof(ch_t));
}

実行結果

short int = 2
int = 4
ch_t = 8



420ポイント を手に入れた。

Name:  ..中級者(9,412ポイント)   Date: 2008/09/12(金) 09:50   No:21216 解決!     
Title: Re:配列について    
返信ありがとうございます。

なるほど、これがオーバーフローですか。
用意してもいない要素に代入されるとなかなかどこで不具合が起きているのか発見出来なそうですね。
現在作っているリバーシで、途中から変な所に値が代入されるためこのような質問をしましたが、オーバーフローが原因だと分かったので改めてfor文(特に入れ子の部分)辺りと定義の活用方法を考えてみようと思います。

「構造体 アライメント」
と調べて上から2つほどサイトを覗いてみました。
これは全く知りませんでしたね……そもそもint型やdouble型の大きさというのも今まであまり意識せずに使ってきました。このパディングという空間は、必要ではあるのでしょうが、たかが数バイトといえど無駄にメモリを消費してしまっている……とも思いました。ホントにわずか数バイト、それこそ今日市場に出回っているパソコンのメモリ容量なら意識しなくてもいいくらい小さな数字だとは思いますが。

リバーシ作成を通してまだまだCの基礎がなってないと痛感しました。
当初の疑問は解消したので一応解決マークを付けておきます。


841ポイント を手に入れた。



Name: fight  ..ぴよぴよ(964ポイント)   Date: 2008/09/12(金) 01:51   No:21205       
Title: 出力について(2)    
以下のソースプログラムに関して質問したいと思っています。

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main(void){
char bin[100];
char bin2[100];
char *p;
int pcnt;
int error;
int i;
/* 乱数を初期化する */
srand(time(0));
/* データを入力する */
printf("Error Rate (%%) ? "); scanf("%d", &pcnt);
while(1) {
printf("Binary Data ? "); scanf("%s", bin);
p = bin;
/* 入力情報をコピーする */
strcpy(bin2, bin);
/* 実行の打ち切り */
if( *p != '0' && *p != '1') break;
for(i = 1; i <= 100; i++){
/* 入力情報を戻す */
strcpy(bin, bin2);
/* 番地を戻す */
p = bin;
/* 確率pcnt%でのノイズ混入を実行する */
while( *p != '\0' ) {
error = (int)rand()%100 < pcnt;
if( error ) {
if( *p == '0') *p = '1';
else *p = '0';
}
p++;
}
printf("%s\n", bin);
}
}
return 0;
}

このプログラムを実行すると、
Error Rate? 0%(入力)
Binary Data? 00000(入力)
00000
00000
・・・
00000
と出力をするのですが・・・この出力を
0 0 0 0 0
0 0 0 0 0 
・・・ 
0 0 0 0 0
としたいと思ってます。しかし先ほど質問して教えていただいた出力に間隔をあける方法が使えません。
この場合は何か間隔をあける方法はあるのでしょうか?
何かアドバイスを下さい。よろしくお願いします。



687ポイント を落としてしまった。


Name: 管理人 [URL]  ..伝説のハッカー(790,892ポイント)   Date: 2008/09/12(金) 02:22   No:21209     
Title: Re:出力について(2)    
これでどうでしょうか?


#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <string.h>
int main(void){
char bin[100];
char bin2[100];
char *p;
int pcnt;
int error;
int i;
/* 乱数を初期化する */
srand(time(0));
/* データを入力する */
printf("Error Rate (%%) ? "); scanf("%d", &pcnt);
while(1) {
printf("Binary Data ? "); scanf("%99s", bin);
p = bin;
/* 入力情報をコピーする */
strcpy(bin2, bin);
/* 実行の打ち切り */
if( *p != '0' && *p != '1') break;
for(i = 1; i <= 100; i++){
/* 入力情報を戻す */
strcpy(bin, bin2);
/* 番地を戻す */
p = bin;
/* 確率pcnt%でのノイズ混入を実行する */
while( *p != '\0' ) {
error = (int)rand()%100 < pcnt;
if( error ) {
if( *p == '0') *p = '1';
else *p = '0';
}
p++;
}
p = bin;
while( *p != '\0' ){
printf("%c ", *p);
p++;
}
printf("\n");
}
}
return 0;
}

実行結果

Error Rate (%) ? 50
Binary Data ? 0000000000
0 0 0 0 0 1 1 0 1 0
1 0 0 0 0 1 1 0 1 1
0 0 1 1 0 1 1 1 0 0
0 1 0 1 0 1 0 0 1 0
1 1 0 0 0 0 0 0 0 1
0 0 1 1 1 1 1 1 1 0
0 0 1 1 0 0 0 0 1 0
0 1 0 1 0 0 1 1 1 1
0 1 0 0 1 1 0 1 0 0
1 0 0 1 1 1 1 1 0 1
0 0 0 1 0 1 1 0 1 0

・・(略


 
上で修正していますが、\0が見つかるまで延々とループしているため、
\0が確保した要素100個目までに存在しなかったらまずいことになります。
なので、99文字しか入力できないように、上のように%99sとしておくとよいでしょう。


531ポイント を落としてしまった。

Name: fight  ..かけだし(1,028ポイント)   Date: 2008/09/12(金) 02:46   No:21211 解決!     
Title: Re:出力について(2)    
>管理人さん 管理人さんのおかげで問題が解決しました。本当にありがとうございました!!

35ポイント を手に入れた。



Name: fight  ..ぴよぴよ(738ポイント)   Date: 2008/09/11(木) 23:05   No:21193       
Title: 出力について    

#include <stdio.h>

int main(void){

int i;

for(i = 1; i <= 5; i++){

printf("%d", i);

}

return 0;

}

上のソースプログラムを実行すると
12345
と出力されます。この出力を1文字ずつ間隔をあけて
1 2 3 4 5
と出力をさせたいと思っているのですが・・・上手く出来ません。
たいした質問ではないのかもしれませんが、本を調べても分からなかったので質問させていただきました。
よろしくお願いします。


161ポイント を手に入れた。


Name: box  ..ハッカー(125,471ポイント)   Date: 2008/09/11(木) 23:17   No:21196     
Title: Re:出力について    
書式文字列 %d の直後に空白を入れてみたら、どうでしょう。

24ポイント を手に入れた。

Name: fight  ..ぴよぴよ(758ポイント)   Date: 2008/09/12(金) 01:34   No:21203     
Title: Re:出力について    
>boxさん 上手く出来ました!!ありがとうございますm(_ _)m

20ポイント を手に入れた。

Name: fight  ..かけだし(1,651ポイント)   Date: 2008/09/12(金) 01:50   No:21204     
Title: Re:出力について    
以下のソースプログラムに関して質問したいと思っています。

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main(void){
char bin[100];
char bin2[100];
char *p;
int pcnt;
int error;
int i;
/* 乱数を初期化する */
srand(time(0));
/* データを入力する */
printf("Error Rate (%%) ? "); scanf("%d", &pcnt);
while(1) {
printf("Binary Data ? "); scanf("%s", bin);
p = bin;
/* 入力情報をコピーする */
strcpy(bin2, bin);
/* 実行の打ち切り */
if( *p != '0' && *p != '1') break;
for(i = 1; i <= 100; i++){
/* 入力情報を戻す */
strcpy(bin, bin2);
/* 番地を戻す */
p = bin;
/* 確率pcnt%でのノイズ混入を実行する */
while( *p != '\0' ) {
error = (int)rand()%100 < pcnt;
if( error ) {
if( *p == '0') *p = '1';
else *p = '0';
}
p++;
}
printf("%s\n", bin);
}
}
return 0;
}

このプログラムを実行すると、
Error Rate? 0%(入力)
Binary Data? 00000(入力)
00000
00000
・・・
00000
と出力をするのですが・・・この出力を
0 0 0 0 0
0 0 0 0 0 
・・・ 
0 0 0 0 0
としたいと思ってます。しかし先ほど質問した出力に間隔をあける方法が使えません。
この場合は何か間隔をあける方法はあるのでしょうか?
何かアドバイスを下さい。よろしくお願いします。


893ポイント を手に入れた。

Name: fight  ..ぴよぴよ(974ポイント)   Date: 2008/09/12(金) 01:52   No:21206     
Title: Re:出力について    
すみません。新規投稿しようとした文章を間違えて載せてしまいました。

10ポイント を手に入れた。

Name: fight  ..ぴよぴよ(993ポイント)   Date: 2008/09/12(金) 02:44   No:21210 解決!     
Title: Re:出力について    
またまたすみません。問題は解決しました。

19ポイント を手に入れた。



Name: Haru  ..中級者(12,936ポイント)   Date: 2008/09/09(火) 10:51   No:21083       
Title: ワイルドカード    
お久しぶりです。Haruです。
少しだけ、C言語はなれて違う勉強してましたが、戻ってきました...
と言うわけで、実はまだワイルドカードを作ってます...
'*'(0文字から何文字でも)と'?'(1文字)
はそれぞれできるようになったんですが、'*'と'?'を組合わせて
使う事が未だにできません。
どうか、アドバイスをお願いします。

int new_wild(char *entry, char *wild_name)
{
int w_len , e_len, i = 0 , j = 0, g ;
char *start , *start2 , *end , *end2;
char *buf = (char*)malloc(sizeof(char)*(strlen(wild_name + 1)));

if( buf == NULL )
{
free( buf );
return 1;
}

w_len = strlen( wild_name );
e_len = strlen( entry );

if(( wild_name[0] != '*' ) && ( wild_name[0] != '?'))
{
if( wild_name[0] != entry[0]) //検索文字列と検索対象文字列の最初と最後の文字
{               //が、同じか'?'か'*'でなければ不一致                free( buf );            
return -1;
}
}
if((wild_name[ w_len - 1 ] != '*' ) && ( wild_name[ w_len - 1 ] != '?'))
{
if(wild_name[ w_len - 1 ] != entry[ e_len - 1 ])
{
free( buf );
return -1;
}
}
strcpy( buf , wild_name );
start = buf ;
for(i = 0 ; i < w_len; i++)
{
if(wild_name[i] == '*')
{
while( *start)
{
end = strchr( start ,'*' );
if( end )
{
*end = '\0';
}
if(( entry = strstr( entry , start )) == NULL )
{
free( buf );
return -2;
}
entry += strlen( start );
start += strlen( start ) + 1 ;
}
}
if(wild_name[i] == '?')
{
if(wild_name[i] != '*') //検索文字列に*がなかった場合検索文字列と
{            //対象文字列の長さを比較し違っていたら不一致
if(w_len != e_len)
return -1;
}
for( g = 0; g < w_len; g++)
{
if(entry[g] != wild_name[g])
{
if((wild_name[g] != '?') && (wild_name[g] != '*'))
{
return -1;
}
}
}
}
j++;
}
printf("DEBUG i = %d j = %d \n",i,j);
return 0;
}



821ポイント を手に入れた。


Name: Haru  ..中級者(12,947ポイント)   Date: 2008/09/09(火) 16:56   No:21096     
Title: Re:ワイルドカード    
自己解決しました!!

11ポイント を手に入れた。

Name: Haru  ..中級者(12,954ポイント)   Date: 2008/09/09(火) 16:58   No:21097 解決!     
Title: Re:ワイルドカード    
解決にし忘れました(汗


7ポイント を手に入れた。

Name: toyo  ..上級者(17,489ポイント)   Date: 2008/09/09(火) 18:54   No:21102     
Title: Re:ワイルドカード    
質問しようと書き込みながらチェックしてると解決することがありますよね
気づいた点を
”freeを忘れないで”


35ポイント を手に入れた。

Name: Mist  ..上級者(21,453ポイント)   Date: 2008/09/09(火) 19:28   No:21105     
Title: Re:ワイルドカード    
自己解決された場合は、情報の共有として何が悪かったのか、どう直したか等を書いていただきたいです。
そうすることで、これから先Haruさんと似たような疑問をもたれた方がここにこられたとき、わざわざ質問しなくても過去ログを見ることで解決できるようになりますので。


2ポイント を手に入れた。

Name: Haru  ..中級者(13,463ポイント)   Date: 2008/09/10(水) 09:52   No:21116     
Title: Re:ワイルドカード    
>Mistさん 

すいません。このやり方だと無理だと思ったんで、考え方変えて作ってしまったんで、
もし考えてくださった方がいたら逆に申し訳ないな...と思い・・・つい(汗
と、いうのと、まだバグが残っているので...
すいませんでした。

>toyoさん 

ありますね!今回は質問の回答待ち中に、視点を変えて考えてたら、
意外と理論だけならあてはまるかも?と、思い考えたアルゴリズムを元に
作ってみたらうまくいきました!!


#ちなみにバグというのは、検索対象文字が、aaaaaといったような場合
#*aで調べると一文字目のaでマッチしてしまいます。
#同一文字が並んでいる文字列等に対応できません。


int new_wild(char *entry, char *wild_name)
{
int w_len , e_len, i = 0 , j = 0, g , check;
char *start , *start2 , *end , *end2;

w_len = strlen( wild_name );
e_len = strlen( entry );

if(( wild_name[0] != '*' ) && ( wild_name[0] != '?')) //検索文字列と検索対象文字列の最初と最後の文字が一致
{ //または'?'か'*'でなければ不一致
if( wild_name[0] != entry[0])
{
return -1;
}
}
if((wild_name[ w_len - 1 ] != '*' ) && ( wild_name[ w_len - 1 ] != '?'))
{
if(wild_name[ w_len - 1 ] != entry[ e_len - 1 ])
{
return -1;
}
}
do
{
if((j > w_len) || (i > e_len))
{
return -1;
}

//検索文字にwild_card*があった場合は、次の1文字を見る。

if(wild_name[j] == '*')
{
j++;
while(1)
{

//一文字先がワイルドカードでなければ、検索対象文字entryと、wild_cardの*の次の文字が一致するまで一文字づつ比較


if((wild_name[j] != '?') &&(wild_name[j] != '*'))
{
while(wild_name[j] != entry[i])
{
i++;
if(i > e_len)
{
return -1;
}
}
break;
}

//一文字先が?であった場合、?は1文字なので、wild_card、entry共に1文字づつ進む。

else if(wild_name[j] == '?')
{
i++;
j++;
if((j > w_len) || (i > e_len))
{
return -1;
}
}

//一文字先が*であった場合はwild_cardの更に1文字次の文字を見る

else if(wild_name[j] == '*')
{
j++;
if(j > w_len)
{
return -1;
}
}
}
}
//現在見ている文字が、ワイルドカード文字でなければ、比較し、一致していなければ不一致

else if(wild_name[j] != '?')
{
if(wild_name[j] != entry[i])
{
return -1;
}
}
i++;
j++;
}while(i < e_len || j < w_len);
return 0;
}


509ポイント を手に入れた。

Name: フリオ  ..プログラマー(27,374ポイント)   Date: 2008/09/10(水) 16:03   No:21132     
Title: Re:ワイルドカード    
 
 これでどうでしょう。
対象文字列(str)と検索パターン(pat)を頭から順に比較するという
正攻法(力任せ?)で処理しています。

int Match(const char *str, const char *pat)
{
const char *ast = NULL, *stmp;

while(*str){
if(*pat == '*'){
if(!*++ pat) return 1;
ast = pat;
stmp = str;
}
else if(*pat == '?' || *pat == *str){
str ++;
pat ++;
}
else{
if(!ast) return 0;
pat = ast;
str = ++ stmp;
}
}
while(*pat == '*') pat ++;
return !*pat;
}


162ポイント を手に入れた。

Name: Haru  ..中級者(13,597ポイント)   Date: 2008/09/11(木) 10:26   No:21154     
Title: Re:ワイルドカード    
>フリオさん

お返事遅くなってすみません
ありがとうございます。
早速考察してみます!それと、質問なんですが、

else
{
     if(!ast) return 0;
pat = ast;
str = ++ stmp;
}

この文のif(!ast)はどのような略なんでしょうか?


134ポイント を手に入れた。

Name: 御津凪 [URL]  ..中級者(11,595ポイント)   Date: 2008/09/11(木) 10:37   No:21155     
Title: Re:ワイルドカード    
if(!ast)

は、
if(ast == NULL)

と同じです。

ココでは最初のパターンに一致しなかった時のみ 0 を返すはずです。

ちなみに、上の方のコードにも似たような部分があり、
if(!*++ pat)

は、
if(*++pat == NULL)

で、
++pat;

if(*pat == NULL)

と同じ意味です。




156ポイント を手に入れた。

Name: いけやん  ..中級者(13,177ポイント)   Date: 2008/09/11(木) 11:00   No:21156     
Title: Re:ワイルドカード    
もうすでに御津凪さんが、答えられてますが(汗

素人の自分が答えるのも何ですが・・・

if(!ast)は
if(ast == NULL),if(ast == 0)と同じで偽の場合
逆にif(ast)と書けば
if(ast == TRUE),if(ast == 1)と同じで真の意味で使えた様な・・・気がします。



75ポイント を手に入れた。

Name: Haru  ..中級者(13,680ポイント)   Date: 2008/09/11(木) 11:08   No:21157     
Title: Re:ワイルドカード    
>御津凪

解説ありがとうございます!!
こうゆう、略した形を教えてくれるサイトとかって、ないですかね...(^^;
今グーグル先生に聞いてみたんですが、
聞き方が悪かったのか、知らないって言われちゃいました...orz


#2回目のソースpreタグ使い忘れました。見にくくてすいませんでした。


83ポイント を手に入れた。

Name: 御津凪 [URL]  ..中級者(11,625ポイント)   Date: 2008/09/11(木) 11:23   No:21158     
Title: Re:ワイルドカード    
> if(ast == TRUE),if(ast == 1)と同じで真の意味で使えた様な・・・気がします。
真偽の判定基準は 0 か 1 かでは無く、
0 か非 0 かです。(ほとんどの場合)

なので、ココの例では、
if(ast == TRUE) 及び if(ast == 1)では
if(ast) と結果が変わります。

正しくは、
if(ast != NULL)
でしょう。

> こうゆう、略した形を教えてくれるサイトとかって、ないですかね...(^^;
> 今グーグル先生に聞いてみたんですが、
> 聞き方が悪かったのか、知らないって言われちゃいました...orz
確かに入門書でも見かけないですね。
しかし、どういう意味を持つのかを自分で書いて確認することは出来ます。
たとえば、

void show_if_result( int i ){
if(i){printf("if(%d) -> true\n",i);}
else {printf("if(%d) -> false\n",i);}
if(!i){printf("if(!%d) -> true\n",i);}
else {printf("if(!%d) -> false\n",i);}
if(i == 0){printf("if(%d == 0) -> true\n",i);}
else {printf("if(%d == 0) -> false\n",i);}
if(i != 0){printf("if(%d != 0) -> true\n",i);}
else {printf("if(%d != 0) -> false\n",i);}
if(i == TRUE){printf("if(%d == TRUE) -> true\n",i);}
else {printf("if(%d == TRUE) -> false\n",i);}
if(i != TRUE){printf("if(%d != TRUE) -> true\n",i);}
else {printf("if(%d != TRUE) -> false\n",i);}
/* 以下、試してみたい式を追加... */
}

のような関数をつくり、関数に色々な値を渡してみると、
どういう動作なのかが分かるかと思います。
もちろん int の部分を int* 変えて実行すると、今回の動作も分かってくると思います。
(この例ではprintfを使うので、コンソールアプリケーションで実行してください)


30ポイント を手に入れた。

Name: Haru  ..中級者(13,704ポイント)   Date: 2008/09/11(木) 11:36   No:21159     
Title: Re:ワイルドカード    
>御津凪さん

おわっ!!失礼しました!
「さん」をつけ忘れました!!


>...のような関数をつくり、関数に色々な値を渡してみると、
>どういう動作なのかが分かるかと思います。

ありがとうございます!
こんな風にして調べれば良いんですね!!
本当に勉強になります!

>>いけやんさん

入れ違いでレスを読み落としてました。
ありがとうございます!!


24ポイント を手に入れた。

Name: いけやん  ..中級者(13,398ポイント)   Date: 2008/09/11(木) 12:00   No:21160     
Title: Re:ワイルドカード    
御津凪さん。すいません。
>真偽の判定基準は 0 か 1 かでは無く、
>0 か非 0 かです。(ほとんどの場合)
そうですね、0「以外」が返って来るんでしたね。

Haruさんすいません。
>if(ast != NULL)
御津凪さんのを参考に。

>こんな風にして調べれば良いんですね!!
確かに。

>>のような関数をつくり、関数に色々な値を渡してみると、
>>どういう動作なのかが分かるかと思います。
ためになります。


221ポイント を手に入れた。

Name: フリオ  ..プログラマー(27,410ポイント)   Date: 2008/09/11(木) 21:55   No:21189     
Title: Re:ワイルドカード    
 
 一点だけ、

"if(*++pat == NULL)"ではなく、"if(*++pat == '\0')"です。
 


36ポイント を手に入れた。



Name: nirica  ..ぴよぴよ(159ポイント)   Date: 2008/09/11(木) 19:20   No:21180       
Title: こんな自分でもゲームを作れるでしょうか?    
はじめまして、自分は最近C言語を始めた中一です。
(Cの絵本を数ページやっています)

ゲームを作ってみたく、ゲームプログラミングの館を参考にしてやっていました。
ですがゲーム入門編辺りからよく分からなくなってきました。(何度も読み返しています)

こんな自分でもゲームを作れるでしょうか?

文が分かりにくくてすみません



159ポイント を手に入れた。


Name: ouh  ..ぴよぴよ(927ポイント)   Date: 2008/09/11(木) 19:26   No:21181     
Title: Re:こんな自分でもゲームを作れるでしょうか?    
きっと作れますよ。
でもCの絵本をもっと読んでからにしましょう。
あせらない、あせらない。


45ポイント を手に入れた。

Name: 管理人 [URL]  ..伝説のハッカー(791,736ポイント)   Date: 2008/09/11(木) 19:37   No:21182     
Title: Re:こんな自分でもゲームを作れるでしょうか?    
ゲームプログラミングの館を作っている管理人です。

ゲームはガッツさえあれば誰でも作れますよ!
小学校6年生の子からうちのサイトを参考にしてゲームを作りましたとメールをいただいたことがあります。
複雑な軌跡を描くシューティングや、何か難しい計算式を使うものは難しいかもしれませんが、
単純なゲームならすぐに作れるようになると思います。

ただ、ゲームプログラミングの館は、基本的なC言語の知識がある事を前提にしています。
配列や自作関数などについての勉強はもう済んでいますか?

例えば

「Hellow!」という文字列を格納した配列を自作関数に渡し、
最後のビックリマークを除いて文字列を表示させましょう

みたいな問題があったら実装出来ますか?
最低限、配列、ループ、自作関数くらいはバッチリにしておいたほうが良いと思います。

http://www5c.biglobe.ne.jp/~ecb/c/c00.html

こんなサイトでウェブ上でも勉強できます。
このサイトの何章位まで理解していますか?
それによって回答も変わってくると思います。


368ポイント を手に入れた。

Name: nirica  ..ぴよぴよ(246ポイント)   Date: 2008/09/11(木) 19:48   No:21184 解決!     
Title: Re:こんな自分でもゲームを作れるでしょうか?    
ouhさん、管理人さん回答ありがとうございます。

お二方の言われるとおり、ちゃんとCの絵本を熟読してから再チャレンジしてみたいと思います。
管理人さんが紹介してくれたサイトも参考にしたいと思います。

根気よく頑張っていきます。


87ポイント を手に入れた。



Name: konacchi  ..ぴよぴよ(423ポイント)   Date: 2008/09/10(水) 15:35   No:21125       
Title: 当り判定について    
VC++6.0 DirextX9.0 Windows2000

	

D3DXVECTOR3 vStartPoint( 0, 0, 0);//Rayのスタートポイント
D3DXVECTOR3 vEndPoint( 0, -1, 0);//Rayを伸ばす方向
BOOL bHit;//当り判定フラグ
float fDistance;//距離
D3DXVECTOR3 vRayDir;//Rayを伸ばす角度

///////m_MtrxMe-自機用マトリクス  LPD3DXMESH ppMesh-対象Mesh

//*
メッシュのロード、行列演算、描画、各種設定 省略
*//

//--------下RayとMeshの当り判定
D3DXVec3TransformCoord( &vStartPoint, &vStartPoint, &m_MtrxMe );
D3DXVec3TransformCoord( &vEndPoint, &vEndPoint, &m_MtrxMe);
D3DXVec3Subtract( &vRayDir, &vEndPoint, &vStartPoint);
D3DXVec3Normalize( &vRayDir, &vRayDir );
D3DXIntersect(ppMesh, &vStartPoint, &vRayDir, &bHit, NULL, NULL, NULL, &fDistance, NULL, NULL);
if( bHit ){
//-------------- 位置補正 ---------------//
//省略
//-------------- fDistance表示 ---------------//
//省略
}


いつも楽しく拝見させていただいております。
書き込むのは初めてで、プログラミングスキルも拙いので、
質問を巧く皆様に伝えられるかどうか不安ですが、質問させて頂きます。

ただいま上記のようにレイを使って自機とメッシュの当り判定を行っています。
当り判定もメッシュとの距離も希望通り取得する事ができています。

ですが、対象メッシュに移動行列、回転行列、拡大行列を演算すると、
当り判定がうまくいきません。

具体的には、

1.(0,0,0)
↓対象メッシュ移動
2.(10,10,10)
↓当り判定
1.との当り判定が返って来る。

以上の結果になります。
移動だけではなく、拡大、縮小、回転も同じ結果です。

移動、形が変わるものにレイ判定は使用しない方がよろしいでしょうか。
横長になったりもするのでバウンディングスフィアも適応し難いです。
凹凸があったりもしますのでバウンディングボックスも辛いです。

対象メッシュはマップみたいなものを想像していただけると良いかと思われます。
それが斜めになったり細長くなったり動いたりします。

任意で定めた仮座標
(例えば、対象メッシュの範囲内で10pixelごとからレイを飛ばす)
との当り判定だと、メッシュが大きくなったときとかも考慮すると重くなりそうで現実的ではないような・・・。
すべてのポリゴンとの判定もおなじ理由で難しそうです。

何か良い方法はありますでしょうか。
また、同じ理由で困っている人、困った事がある人はいませんか?


423ポイント を手に入れた。


Name: Justy  ..ハッカー(220,914ポイント)   Date: 2008/09/10(水) 16:00   No:21130     
Title: Re:当り判定について    
 D3DXIntersect()はメッシュのローカル座標で判定するので、
レイを飛ばすならレイの座標とベクトルをメッシュのローカル座標系のものに変換してから
使ってみて下さい。


47ポイント を手に入れた。

Name: 御津凪 [URL]  ..中級者(11,241ポイント)   Date: 2008/09/10(水) 16:34   No:21136     
Title: Re:当り判定について    
前にやっていたもので、今は余り覚えていないのですが、
確か、カメラの逆行列を使って算出していたような気がします…。


33ポイント を手に入れた。

Name: konacchi  ..ぴよぴよ(571ポイント)   Date: 2008/09/10(水) 16:42   No:21138     
Title: Re:当り判定について    
Justy様<
ありがとうございます。
私の知識ではいきなりポンと変換できるようなものではなさそうなので色々調べてみます。
できるだけ早く帰ってきます。

御津凪様<
ありがとうございます。
どこかで聞いた事があるような気がします。
調べてみますね。


2倍のポイントを手に入れた! 148ポイント を手に入れた。

Name: konacchi  ..ぴよぴよ(689ポイント)   Date: 2008/09/10(水) 19:35   No:21145     
Title: Re:当り判定について    
途中経過です。

// 視点を計算
m_vec3Eye.x = m_vec3MePos.x + 800 * sinf(m_fCameraAngle);
m_vec3Eye.z = m_vec3MePos.z + 800 * cosf(m_fCameraAngle);
m_vec3Eye.y = m_vec3MePos.y + 400;
// 注視点を計算
m_vec3At.x = m_vec3MePos.x;
m_vec3At.z = m_vec3MePos.z;
m_vec3At.y = m_vec3MePos.y;

//ビュー行列取得
D3DXMatrixLookAtLH(&m_LookAtCamera,&m_vec3Eye,&m_vec3At,&D3DXVECTOR3(0,1,0));

D3DXMATRIX m_LookAtCameraRev;//ビューの逆行列用
//逆行列生成
D3DXMatrixInverse(&m_LookAtCameraRev,NULL,&m_LookAtCamera);

逆行列を生成するところまではできました。
逆行列と自機行列を演算し、
その行列をレイのスタート地点と方向の両方にトランスフォームしました。

が、まだ希望する判定ではないです、訳判らない場所と判定してますので、
引き続き追います。
というよりも全然違う事やっているのかもしれません(苦笑

また進み次第報告致します。
時間がかかって申し訳ございません。


118ポイント を手に入れた。

Name: Justy  ..ハッカー(221,015ポイント)   Date: 2008/09/10(水) 20:16   No:21146     
Title: Re:当り判定について    
 メッシュの逆行列をレイのデータに与えればいいような気がしますが、
どうでしょう?


10ポイント を手に入れた。

Name: konacchi  ..かけだし(1,627ポイント)   Date: 2008/09/11(木) 13:02   No:21164     
Title: Re:当り判定について    
遅くなりましたが実装報告します。


D3DXMATRIX m_MtrxTemp;//一時格納
D3DXMATRIX m_MtrxTargetRev;//逆行列用
D3DXMATRIX m_MtrxTarget;//対象メッシュ用
D3DXMATRIX m_MtrxMe;//自機用
D3DXMATRIX m_MtrxRotX;//回転用
D3DXMATRIX m_MtrxScl;//拡大縮小用
D3DXMATRIX m_MtrxMove;//移動用
D3DXVECTOR3 vStartPoint = vec3MePos;//Rayのスタートポイントを自機に設定
D3DXVECTOR3 vEndPoint( 0, -1, 0);//Rayを伸ばす方向
BOOL bHit;//当り判定フラグ
float fDistance;//距離
D3DXVECTOR3 vRayDir;//Rayを伸ばす角度

//*
メッシュのロード、描画、各種設定 省略
*//

vStartPoint = m_vec3MePos;
//回転行列生成
D3DXMatrixRotationX(&m_MtrxRotX, Rot*PI/180);
//スケール行列生成
D3DXMatrixScaling(&m_MtrxScl,Scl.x,Scl.y,Scl.z);
//移動行列生成
D3DXMatrixTranslation(&m_MtrxMove,Move.x,Move.y,Move.z);
m_MtrxTemp = m_MtrxScl * m_MtrxRotX *m_MtrxMove;//演算

//演算した行列をトランスフォーム
D3DXVec3TransformCoord( &vEndPoint, &vEndPoint, &m_MtrxTemp);
vEndPoint += vStartPoint;//方向決定

//対象メッシュの逆行列を取得
D3DXMatrixTranslation (&m_MtrxTarget,m_vec3Target.x,m_vec3Target.y,m_vec3Target.z);
D3DXMatrixInverse(&m_MtrxTargetRev,NULL,&m_MtrxTarget);
//逆行列をトランスフォーム
D3DXVec3TransformCoord( &vStartPoint, &vStartPoint, &m_MtrxTargetRev );
D3DXVec3TransformCoord( &vEndPoint, &vEndPoint, &m_MtrxTargetRev);

vRayDir = vEndPoint - vStartPoint;
//--------下RayとMeshの当り判定
D3DXIntersect(ppMesh, &vStartPoint, &vRayDir, &bHit, NULL, NULL, NULL, &fDistance, NULL, NULL);
if( bHit ){
//-------------- 位置補正 ---------------//
//省略
//-------------- fDistance表示 ---------------//
//省略
}


正常に当り判定がとれました!!!
教えて頂きありがとうございます。

またお世話になると思いますが宜しくお願いします。
ちょいちょい雑談などにも横槍(笑)を入れていきたいと思います。


カメラの逆行列は ビルボードで使用するっぽいですね。
せっかくカメラの逆行列取得したのでビルボードも実装してみます。


938ポイント を手に入れた。

Name: konacchi  ..かけだし(1,675ポイント)   Date: 2008/09/11(木) 13:08   No:21165 解決!     
Title: Re:当り判定について    
↑記述忘れです。
Justy様の仰る通り、メッシュの逆行列で通りました。

あと解決マークも忘れてました・・・。


48ポイント を手に入れた。



Name: 匿名  ..ぴよぴよ(324ポイント)   Date: 2008/09/09(火) 19:25   No:21104       
Title: 質問    
東方のゲームをやる時にMIDIの方でしか再生されません。WAVで再生するにはWAVを再生する環境を作らなくてはいけないらしいのですが、どうやったらいいのか教えてください。

80ポイント を手に入れた。


Name: 管理人 [URL]  ..伝説のハッカー(788,743ポイント)   Date: 2008/09/09(火) 23:08   No:21107     
Title: Re:質問    
以下XPの方法ですが

コントロールパネル>サウンドとオーディオデバイス>
「オーディオ」タブの「音の再生」の「音量」をクリックして下さい。

WAVEの音が小さくなっているかミュートになってるんじゃないですか?


86ポイント を手に入れた。

Name: ibis  ..中級者(12,727ポイント)   Date: 2008/09/10(水) 14:11   No:21119     
Title: Re:質問    
音量調節はタスクトレイの「音量」でもできますね。

ちなみに花映塚以前は、体験版ではMIDIしか無いですよ。


2倍のポイントを手に入れた! 28ポイント を手に入れた。

Name: J  ..中級者(9,384ポイント)   Date: 2008/09/10(水) 21:45   No:21148     
Title: Re:質問    
何というか東方だけではどの東方なのか分かりません。
まずはゲーム名を教えてください。
紅魔郷、永夜抄...etc


22ポイント を手に入れた。



Name: ヤマ  ..ぴよぴよ(149ポイント)   Date: 2008/09/10(水) 16:29   No:21135       
Title: アルファブレンドについて    
シューティングという事で見てましたが背景とキャラクターを合成するのにアルファブレンドは2Dにおいて最高クラスの機能だと思ってます。

それほど重くもなく、手軽に綺麗な見た目が出せる。
そして、昨今のビデオカードなら大体対応してると思うのですがどう思いますか?

あと、DirectXの描画システムを作ろうと思ってやって居ますが何か参考になるようなことは無いですかね?
以下に箇条書きで大まかに書くとこういった感じです。

1.D3Dオブジェクトの作成。
2.d3dppを投げてデバイスの作成。
3.バックバッファのクリア
4.pDevice->BeginScene();
5.DrawPrimitiveとかで描画
6.pDevice->EndScene();
7.pDevice->Present();


ここで分かりにくいのは4,6,7。
5で描画指示してるのに、何をやっているのですかね?

7.はダブルバッファリングなんで、フリップでもしてるんでしょう。


149ポイント を手に入れた。


Name: 御津凪 [URL]  ..中級者(11,396ポイント)   Date: 2008/09/10(水) 16:49   No:21139     
Title: Re:アルファブレンドについて    
4〜7は、Win32API での WM_PAINT に当たると思います。
ただ、DirectXでは、ダブルバッファリングを行うため、バックバッファに描画するのために、
4、6ではそのバックバッファを固定するためだと思います(推測)。
追加で言えば7は垂直同期をしてテアリング(描画の境目が見える現象)が起こるのを防いでくれます。

もちろん2で(垂直同期)しないようにも出来ますけどね。


> 何か参考になるようなことは無いですかね?
アドバイスするとすれば、各ユーザでリフレッシュレートが違うため、
安定した速度を維持できるような処理が必要です。

たとえば、60Hzと120Hzでは2倍の差があります。
そのまま垂直同期を待つ状態だと、120Hzでは2倍の速度でゲームが進んでしまうので注意してください。


155ポイント を手に入れた。

Name: ヤマ  ..ぴよぴよ(417ポイント)   Date: 2008/09/10(水) 16:52   No:21140 解決!     
Title: Re:アルファブレンドについて    
ありがとうございます。
やっぱ内部で何やってるかが知りたいわけで、聞いてみないとこの辺の情報少ないなぁ。
Beginでエントリー開始して、5.で描画エントリ、Endで描画開始だろうか。
そうするとPresentは描画終了まで待つはずなので、Endの後はCPU処理した方がよさげ?
SetRenderTargetとかで切り替えても平気なんですが、順番と対象は完全に保持されてるのかな。

そんなわけで、効率を考えるなら、
バッファのクリア→Begin→描画→End→更新処理など→Presentがいい気がします。
実際計測したわけじゃないのでなんとも言えないですが。
シェーダーのように描画結果を必要とするものはBegin〜End何度も呼ばないといけないかもしれません。


268ポイント を手に入れた。

Name: 御津凪 [URL]  ..中級者(11,439ポイント)   Date: 2008/09/10(水) 17:03   No:21141     
Title: Re:アルファブレンドについて    
> バッファのクリア→Begin→描画→End→更新処理など→Presentがいい気がします。

シェーダーは使ったことが無いのでそこらへんの効率については分かりませんが、
私の方では、

更新処理など→バッファのクリア→Begin→描画→End→Present

としています。
このとき、更新処理とそれ以外(描画周り)の部分を分けて処理すると、
すっきりとしたコードがかけると思います。
(基礎を構築するのが大変ではありますが)

それと、以下のようにすると、バックバッファではなく、テクスチャに描画することも出来ますよ。

Begin
現在のバックバッファを取得&描画するテクスチャに置き換え
描画
バックバッファを戻す
通常描画
End




43ポイント を手に入れた。

Name: ヤマ  ..ぴよぴよ(487ポイント)   Date: 2008/09/10(水) 17:15   No:21142 解決!     
Title: Re:アルファブレンドについて    
アレコレ試行錯誤した結果プリミティブを増やしてみました。

とりあえず実験した限りでは、今のPC(開発用/かなり高スペック)だと11000個程度まで60fps。
旧PC(Pen4 2.26GHzあたり、グラボもそれなり)だと、3000個ぐらいといった感じ。
ちなみに旧ライブラリが今のPCにおいて、2500個ぐらいで処理落ちを始めます。
一括描画が出来る環境に限定すれば、4倍以上速くなりました。
一括描画出来ないと、きっと2500個程度かそれより劣るでしょう。
ただ、大量に描画するパーティクル等は大抵同じテクスチャになってるはずです。
本格的に弾幕とかで1万発とか出すのは、頂点シェーダーとか使ってるんだろうなぁ。
シェーダー使えば座標変換のためにわざわざバッファをロックしなくても良さそうだし。
とはいえ、市場のグラボが安定してシェーダー対応するまでは中々使いづらいので

そして、一括描画全く使わないでやったら、500個ちょいで処理落ちを始めました。
これじゃどうしようもないので、初期化時にフラグで一括描画するかどうかを選ぶように。
一括描画しない場合はDrawPrimitiveUpで描画を行います。

頂点バッファを何回もロックするのが重いわけで、Up系なら問題なく描画できます。
むしろ、2Dは全部Up系でいいかも?
そこまで極端な差がないし、一括描画自体は使えるので
シンプルな構造を目指すならそういう切捨てはありなのかも。
でもシェーダーとかはだめなのかな?。
頂点バッファを使うかどうかのフラグにした方が正しい気がしてきた。

結論:
頂点バッファは3Dで使うのが効果的であり、
その場合は行列をデバイス経由で渡してやるのが高速。
2D程度はUp系列の関数で大差ない。

つうわけでとりあえず解決にはなりました。


70ポイント を手に入れた。

Name: Justy  ..ハッカー(221,005ポイント)   Date: 2008/09/10(水) 17:18   No:21143     
Title: Re:アルファブレンドについて    
>5.で描画エントリ、Endで描画開始だろうか
 ひょっとすると環境毎に異なるかもしれませんが、イメージとしては
5は描画パケットを GPUに投げて描画(GPUが処理中ならキューへ)じゃないですかね、多分。


>効率を考えるなら、
>バッファのクリア→Begin→描画→End→更新処理など→Presentがいい気がします。
 それをすると、キーの判定から実際に画面に描画されるまでのレーテンシーが
1フレーム遅れませんか?

 単純に考えると CPUが1つしかないのであれば御津凪さんの方法がいいかと思います。
 
 2つ以上ある環境なら、更新処理と描画を別々のスレッドで行うようにすると
[データを更新->次のフレームで描画しつつ、更新を同時に]
という風に描画が1フレーム遅れますが、更新・描画をそれぞれを1フレーム
丸ごと(若干語弊がありますが)かけて処理できるようになりますよ。

 システムの構築がちょっと大変ですけどね。


91ポイント を手に入れた。

Name: ヤマ  ..ぴよぴよ(654ポイント)   Date: 2008/09/10(水) 17:33   No:21144 解決!     
Title: Re:アルファブレンドについて    
まぁいずれにせよアドバイスもさることながら満足できる方向に進めたのでよしとします。

後先日参加したCEDEC2008なんかも理解半分といったところですがいい参考にはなったりしたんでw

某ねずみでお馴染みのゲーム会社で仕事としてプログラムそしてこうした趣味でゲームプログラムなんである意味息抜きにも近いんですが。


とにかくありがとうございました。



167ポイント を手に入れた。



Name: Jack  ..ぴよぴよ(318ポイント)   Date: 2008/09/09(火) 16:06   No:21093       
Title: ストップウォッチとタイマーについて    
はじめまして、Jackと申します。

最近C言語の学習を始めまして現在課題としてストップウォッチとタイマー作成中なのですが難しく。

御質問なのですがC言語を用いてのコマンドプロクプト上で起動するストップウォッチとタイマーの方を作成使用と思いますが難しくステップ数が500以上とという決まりになります。

内容は起動してキーボードからの入力でストップウォッチかタイマーか選択でき、選択後は
ストップウォッチはカウントしてキーを押すと止まる、再度キーを押すと再度スタートするようなものになります。また違うキーを入力するとリセットしましたり、終了する形になります。

タイマーはキーで選択後、時間を数値入力で入力でき、終わったら”終わりました”などとメッセージが出るように作成したいです。

どなたかご教授いただけないでしょうか、よろしくお願いいたします。


318ポイント を手に入れた。


Name: バグ  ..ハッカー(108,865ポイント)   Date: 2008/09/09(火) 16:53   No:21094     
Title: Re:ストップウォッチとタイマーについて    
計測の単位は秒ですか?それともミリ秒ですか?
しかし、ステップ数500も必要なのかなぁ…

それから、自分ではどこまで作ってみました?
出来たところまででいいので、ここに提示してみてください。

もし、何にも分からないというのであれば、JackさんがC言語についてどの程度の理解があるかを知りたいので、どの程度のことを習ったのかを教えてもらえますか?


119ポイント を手に入れた。

Name: バグ  ..ハッカー(108,880ポイント)   Date: 2008/09/09(火) 16:54   No:21095     
Title: Re:ストップウォッチとタイマーについて    
あ、それから開発環境も教えてもらえますか?

15ポイント を手に入れた。

Name: 管理人 [URL]  ..伝説のハッカー(788,867ポイント)   Date: 2008/09/09(火) 17:21   No:21098     
Title: Re:ストップウォッチとタイマーについて    
ステップ数って行数だと思っていいんですかね?
500行も要らないと思いますよ・・。
・・と出題者じゃない方に文句言っても仕方ないですけど、
無駄な処理をダラダラ書いて、「ハイ500行書きました」なんて無意味すぎますよね。
例えば
printf("お");
printf("わ");
printf("り");
printf("ま");
printf("し");
printf("た");
と書けば、普段の6倍の行数がかけるわけですが・・。

そこで、高機能にしてみたらいいんじゃないでしょうか?
無理に無駄な処理を沢山つけて500行にするよりよほど良いと思います。
それにしても500行って結構長いですよね(汗。

とりあえずストップウォッチとタイマーを作ってみましょう。
ググれば沢山サンプルが出てくると思いますが、そちらはご覧になりましたか?

バグさんの仰るように、どこまでやっているのかなどを教えて下さい。
詳しくは規約に書いてあります。


434ポイント を手に入れた。

Name: 管理人 [URL]  ..伝説のハッカー(789,017ポイント)   Date: 2008/09/09(火) 17:42   No:21099     
Title: Re:ストップウォッチとタイマーについて    
作ってみました。
関数わけしても三十数行でした・・。
500行にする為にはよっぽど色んな機能を付けるか、
とんでもなく無駄な処理を沢山書かないと無理そうです。
500行という部分はちょっと出題者に確認取った方がよくないですか??

私はwindows.hやtime.hのライブラリを使いましたけど、
そういうのは使っていいんでしょうか?


150ポイント を手に入れた。

Name: Jack  ..ぴよぴよ(514ポイント)   Date: 2008/09/10(水) 14:59   No:21121     
Title: Re:ストップウォッチとタイマーについて    
たくさんのご回答ありがとうございます。すみません情報不足でした。
自分は開発環境はcpadというソフトを使用しております。

500ステップというのは課題内容が説明文なども入れての行数が500行くらいという内容の課題になりましたのでこのような膨大な行数で作成するのは大変な作業になるのではと感じており、スッテプ数も半数の100行ほどでもよいという結果にできました。あとはほかの処理を記載して行を書くしかありません。

計測単位はストップウォッチはミリ秒単位、タイマーは秒単位になります。

自分はここ最近にC言語を学習し始めて文字配列、関数と配列、ファイルの入出力を学習しました。

ここで課題として500行のプログラムを作成するという課題になりました。

作成物を添付いたします。まだタイマーまでしかできていません。
よろしければご教授の方よろしくお願いいたします。


196ポイント を手に入れた。

Name: 管理人 [URL]  ..伝説のハッカー(789,303ポイント)   Date: 2008/09/10(水) 15:14   No:21122     
Title: Re:ストップウォッチとタイマーについて    
コンパイラは何を使っていますか?
使用してよいライブラリなどの制限はありますか?

あと、プログラムが添付されていないようです。


42ポイント を手に入れた。

Name: バグ  ..ハッカー(109,007ポイント)   Date: 2008/09/10(水) 15:32   No:21123     
Title: Re:ストップウォッチとタイマーについて    
Windowsかそうでないかでも変わってきそうですね。

>>ストップウォッチはカウントしてキーを押すと止まる、再度キーを押すと再度スタートするようなものになります。また違うキーを入力するとリセットしましたり、終了する形になります。

この辺りの処理は完全に環境に依存しそうですし…


127ポイント を手に入れた。

Name: Jack  ..ぴよぴよ(579ポイント)   Date: 2008/09/10(水) 15:33   No:21124     
Title: Re:ストップウォッチとタイマーについて    
申し訳ありません、再度添付いたします。
コンパイラのほうは「bcc32.exe」というものを使用しております。
使用してよいライブラリの制限はないです。
まことによろしくお願いいたします。


65ポイント を手に入れた。

Name: Mist  ..上級者(21,613ポイント)   Date: 2008/09/10(水) 15:50   No:21127     
Title: Re:ストップウォッチとタイマーについて    
タイマーがどうとか言う前にC言語の基本の部分が理解できていないと思います。
(そもそもコンパイルエラーだらけだし^^;)

例えば、

> scanf("%d",&ia);

文字入力をしてもらいたい場合は%dでは無いです。

> if (ia = z);
> }else if (ia = x);

入力された文字をチェックしたいというのはわかりますが、これではだめです。
行の最後が";"で終わっているのも変ですし。

まずは文字入力と入力された文字の判定(ZなのかXなのかそれ以外なのか)から修正されたほうがよいと思います。


160ポイント を手に入れた。

Name: 管理人 [URL]  ..伝説のハッカー(789,539ポイント)   Date: 2008/09/10(水) 15:50   No:21128     
Title: Re:ストップウォッチとタイマーについて    
>まだタイマーまでしかできていません。

という事で、タイマーまでは出来たという解釈でいいんでしょうか。
プログラムはコンパイルを通りませんよね?
まず、きちんとコンパイルが通る形にし、書きかけの部分はコメントアウトにするなどしてみて下さい。

まず、scanfで読み取っているのが%dのint型の値であるのに、文字をいれようとしている部分や、
入力した文字を = z などで比較している部分が違います。

またイコール一つは比較ではなく、代入です。
条件文になっていません。

if文の使い方、scanfの使い方、文字の扱い方など基本的な部分をまずおさらいしてみて下さい。
コンパイルできるコードでもう一度提示して下さい。


236ポイント を手に入れた。

Name: Jack  ..ぴよぴよ(727ポイント)   Date: 2008/09/10(水) 16:05   No:21133     
Title: Re:ストップウォッチとタイマーについて    
大変申し訳ありませんでした。
すみません、タイマーではなくストップウォッチでありました。
コンパイルエラーを見直し、ストップウォッチの再生と一時停止を繰り返すもののみになります。
if文やscanfの使用法を再度見直させていただきます。

再度添付いたしますので申し訳ありませんが再度ご拝見していただけないでしょうか。
まことによろしくお願いいたします。


148ポイント を手に入れた。

Name: Mist  ..上級者(21,494ポイント)   Date: 2008/09/10(水) 16:24   No:21134     
Title: Re:ストップウォッチとタイマーについて    
このソースあなたが作ったものですか?
ここまで出来るなら、タイマーのほうがよっぽど簡単だと思うんですけど。

Elapseの戻り値をチェックして、入力された時間を越えれば終わりとするだけです。
(入力が秒の場合はミリ秒に変換して比較しないといけませんが)


119ポイント を落としてしまった。

Name: レッツ  ..ぴよぴよ(451ポイント)   Date: 2008/09/10(水) 16:34   No:21137     
Title: Re:ストップウォッチとタイマーについて    
これはJackさんが作ったコードですか?
もし違うなら何処まで自分が作ったものか示さないとどこからアドバイスして良いのか解らないと思いますよ。


48ポイント を手に入れた。



Name: 一ノ宮  ..ぴよぴよ(55ポイント)   Date: 2008/09/10(水) 15:49   No:21126       
Title: オープニング画面    
このサンプルゲームの章を一通り見てきましたがゲームの顔とも言えるオープニング画面(スタートやコンフィグ、デモ画面等)のサンプルが紹介されていないのですが今後の為にもそういったものが欲しいのですが・・・

もちろん応用で作成できるとは思いますがゲームの心臓部も大切ですが入り口となるスタート画面のサンプル処理が欲しいです。


55ポイント を手に入れた。


Name: 管理人 [URL]  ..伝説のハッカー(789,916ポイント)   Date: 2008/09/10(水) 15:57   No:21129     
Title: Re:オープニング画面    
わかりました。
ただゲーム本体が完成してからじゃないと章の内容があれこれ変わってしまうので、
そのサンプルはかなり後になってしまうと思います。

なので、以下に作り方をご説明します。

まず、main.cppのメインループでぐるぐる処理がまわっているのはいいですよね。
func_stateという変数でどの関数に処理を渡すか決めています。
今予約済みなのが0,99,100です。

0はロードや最初に行う処理。
99はゲームの初期化・初期設定処理。
100はゲームの処理

ですね。そして

0->99->100となっている流れの中で
0->メニュー->99->100と変更したいわけですね。

ロードが終わったらfunc_stateを10などにし、
10ではメニュー処理などにし、
決定ボタンなどが押されたらfunc_stateを99にすればOKです。

処理は全てこのスイッチ文で制御出来ます。
行いたい処理はここのスイッチ文で分けて下さい。


377ポイント を手に入れた。

Name: 一ノ宮  ..ぴよぴよ(97ポイント)   Date: 2008/09/10(水) 16:01   No:21131 解決!     
Title: Re:オープニング画面    
素早いご回答ありがとうございます。

時間のあるときにでもチャレンジしてみます。



42ポイント を手に入れた。



Name: abc  ..かけだし(2,313ポイント)   Date: 2008/09/09(火) 09:43   No:21080       
Title: デバイスコンテキスト    
VC++6.0のMFCです。

CPaintDC dc(this);でデバイスコンテキストを取得していると思うのですが、
OnPaint()以外の関数でデバイスコンテキストを取得するにはどうすればいいですか?


2倍のポイントを手に入れた! 172ポイント を手に入れた。


Name: 御津凪 [URL]  ..中級者(10,710ポイント)   Date: 2008/09/09(火) 10:15   No:21081     
Title: Re:デバイスコンテキスト    
MFC は使ったこと無いので分かりませんが、
Win32APIであれば、GetDC 関数を使えばデバイスコンテキストが取得できます。

HDC dc = GetDC(hWnd); // hWnd はデバイスコンテキストを取得するウインドウハンドル
// ココで dc を使って描画処理
ReleaseDC(hWnd,dc); // 使用したデバイスコンテキストを開放


ちなみに hWnd が NULL なら、画面全体のデバイスコンテキストを取得出来ます。


129ポイント を手に入れた。

Name: バグ  ..ハッカー(108,641ポイント)   Date: 2008/09/09(火) 10:29   No:21082     
Title: Re:デバイスコンテキスト    
MFCの場合でなおかつダイアログベースアプリならば…


CDC* pDC = GetDC();


↑で取得できます。


ReleaseDC(pDC);


使い終わったら、上記のようにReleaseDC関数で解放するのを忘れないでください。
メモリリークの原因になります。

解放忘れも防ぎやすくなりますし、描画処理はできるだけOnPaint関数の中に固めておいた方がいいですよ。
OnPaint関数の最初でCDCクラスのポインタを取得して、描画用関数にそのポインタを渡し、描画処理を行ったあとに、OnPaint関数の最後でデバイスコンテキストを解放するような感じでしょうか…


109ポイント を手に入れた。

Name: lbfuvab  ..入門者(4,917ポイント)   Date: 2008/09/09(火) 18:40   No:21101     
Title: Re:デバイスコンテキスト    
メッセージループでWM_PAINTを処理するなら

HDC hdc;
PAINTSTRUCT ps;

case WM_PAINT:
  hdc=BeginPaint(hWnd,&ps);
  //描画
  EndPaint(hWnd,&ps);
  break;

ですね。


66ポイント を手に入れた。

Name: abc  ..かけだし(2,331ポイント)   Date: 2008/09/10(水) 14:43   No:21120 解決!     
Title: Re:デバイスコンテキスト    
引数で渡してやればいいんですねありがとうございます(^^)

18ポイント を手に入れた。



Name: ym  ..ぴよぴよ(146ポイント)   Date: 2008/09/02(火) 17:52   No:20867       
Title: ファイル書き込み処理    
"ABC.fil"のファイルの中に入っている数字を小さい順に並び替えて、その内容を"bbb.c"ファイルに書き込みを
行うプログラムなんですけど、コンパイルをして実行をしてみたら、"ABC.fil"の数字の並び替えは
出来たのですが、"bbb.c"ファイルへの書き込みが出来ませんでした。
プログラムの内容のどこが間違っていたのかを教えてください。お願いします。


146ポイント を手に入れた。


Name: 御津凪 [URL]  ..初心者(8,817ポイント)   Date: 2008/09/02(火) 18:03   No:20868     
Title: Re:ファイル書き込み処理    
ファイルから数字を読み出して並び替えるだけでは、ファイルの内容は変化しませんし、
このコードでは、入力ファイルから出力ファイルへ単にコピーしようとしています。
しかし、 rfp は既にファイルの終端を指しているので、コピーされず、出力ファイルには何も書き出されません。

ファイルに書き込みをするところで、並び替えされたテーブル tbl を

fprintf(wfp,"%d\n",tbl[i]);

として書き出せば良いのではないでしょうか。

余談ですが、字下げがおかしいので見づらいです。


253ポイント を手に入れた。

Name: Mist  ..上級者(21,310ポイント)   Date: 2008/09/02(火) 18:51   No:20870     
Title: Re:ファイル書き込み処理    
並び替えの部分も見直されたほうがいいと思います。
"ABC.fil"に20個の数字が書かれている場合は正しく動作しますけど、20未満の場合は不定値が表示されます。

#"ABC.fil"には20個以上の数字が書かれている前提であれば別にいいですけど


112ポイント を手に入れた。

Name: あっちゃん  ..ぴよぴよ(37ポイント)   Date: 2008/09/03(水) 17:25   No:20903     
Title: Re:ファイル書き込み処理    
こちらで回答を受け取った後、わざわざ他のところ(下記URL)で
同じ質問をする理由がさっぱりわからない。

http://www2.realint.com/cgi-bin/tarticles.cgi?pointc+32170


37ポイント を手に入れた。

Name: ym  ..ぴよぴよ(564ポイント)   Date: 2008/09/10(水) 11:39   No:21117     
Title: Re:ファイル書き込み処理    
"ABC.fil"のファイルの中に入っている数字を小さい順に並び替えて、その内容を"DEF.fil"ファイルに書き込みを行うプログラムなんですけど、コンパイルをして実行をしてみたら、"ABC.fil"の数字の並び替えの所で
並び替え前は、先頭の0の数字があったんですけど、並び替え後は先頭の0の数字がなくなった状態で並び替えがされてたんですけど、プログラムの内容の何処が原因で並び替え後、先頭の0の数字がなくなったかを教えてください。
お願いします。





2倍のポイントを手に入れた! 418ポイント を手に入れた。

Name: たかぎ [URL]  ..熟練のプログラマー(58,474ポイント)   Date: 2008/09/10(水) 12:11   No:21118     
Title: Re:ファイル書き込み処理    
マルチポストを指摘されているにも関わらず、放置したまま新たな質問をするのはどう考えても悪質ですね。
規約と使い方を大きな声で7回音読してから出直しましょう。

もし、質問者さんが外国人である場合など、日本語が不自由であれば、その旨告知してください。


98ポイント を手に入れた。



Name: みどり  ..ぴよぴよ(78ポイント)   Date: 2008/09/09(火) 11:26   No:21084       
Title: 超悩み    
みなさんお元気ですか。

残暑はまだまだですね。
さて、長い間悩んできたことあります。

それはC言語においての配列初期化です。
例えば、float型の配列 F[10000]を特定の値, 1.2345で初期化したい場合、
毎回毎回一万回のループを走らせてしなければならない。
ループが文面というより、能率のほうは気になります。

memset()のような内臓関数を使いたいですが、それはint値を対象としているので、
利用できないようです。

何か利用できる其の他の内臓関数ありますか?

宜しくお願いします







78ポイント を手に入れた。


Name: バグ  ..ハッカー(108,746ポイント)   Date: 2008/09/09(火) 11:47   No:21086     
Title: Re:超悩み    
memsetも中ではループ処理を行ってますので、結局は同じことなのではないでしょうか?
下記は、某サイトに掲載されていたmemsetの実装例です。
これを参考にfloat型に対応したmemsetを作られては如何でしょうか?


void *memset(void *s, int c, size_t n)
{
const unsigned char uc = c;
unsigned char *p = (unsigned char *)s;

while (n-- > 0)
*p++ = uc;

return (s);
}


105ポイント を手に入れた。

Name: 御津凪 [URL]  ..中級者(11,190ポイント)   Date: 2008/09/09(火) 11:50   No:21087     
Title: Re:超悩み    
少し強引な方法ですが、下記の方法で強制的に float 型から int 型に変換できます。

float f = 1.2345f;
int i = *((int*)((float*)&f)); // float から int に変換
float f2 = *((float*)((int*)&i)); // int に変換した float 値を戻す
printf("float:%d,int:%d\n",sizeof(float),sizeof(int)); // float と int の型のサイズを確認
printf("f:%f,i:%d,f2:%f\n",f,i,f2); // きちんと変換されているか確認

( float が int 以下であるサイズである場合のみ有効な手段です)
これを利用して、強制変換した i を、

memset(buf,i,sizeof(buf));

とすればOK…ではないです。(今確認しました)
memsetの対象値は int 値でも、セットされる値は 1Byte です。
つまり、上記の処理をしても正しくセットされません。

と、言うわけで、初期化した float 型の配列をもっておいて、
初期化時に、 memcpy を使うと良いでしょう。
(上記の変換方法は今回は意味ありませんがせっかく書いたので載せておきます)

> 内臓関数
なんか生々しい関数ですねw
正しくは標準関数ですよ。



2倍のポイントを手に入れた! 480ポイント を手に入れた。

Name:  ..ぴよぴよ(178ポイント)   Date: 2008/09/09(火) 12:12   No:21088     
Title: Re:超悩み( 訂正 )    
皆さんご返答ありがとうございます。
いろいろ実験中ですが。

====================================
ごめんなさい!
大変大きなミスをしました

> 内臓関数
内蔵関数でした。

memset()のような関数は
そのマシンの一番実行能率のいい機械コードで書かれた関数という記憶ありますが。


またよろしくお願い致します





107ポイント を手に入れた。

Name: ibis  ..中級者(12,699ポイント)   Date: 2008/09/09(火) 13:46   No:21091     
Title: Re:超悩み( 訂正 )    
>内蔵関数

標準ライブラリに含まれる関数は標準関数と言った方が良いかと。
内蔵関数の定義を知らないのですが、少なくとも一般的な表現ではないですよね。
検索してみたら関係ないものばっかり出ますし。



>そのマシンの一番実行能率のいい機械コードで書かれた関数という記憶ありますが。

そうでもないですね。

まず、普通は機械語ですら書かれていません。
汎用性が下がりますし、Cプログラマがそれを読めないことも多々ありますし。

それにメモリや速度のトレードオフがあるので、どのコードが最も能率が良いかというのは一概には決められませんしね。
標準関数である以上、ライブラリの実装とコンパイラの最適化に依存します。

ちなみにVC++には組み込み形式の関数(組み込み関数とも呼ばれるが、一般に「組み込み関数」と呼ばれるものとは違う)もあり、それは通常の関数よりも少し速いですが、最速というわけではないです。



「メモリや速度のトレードオフ」と書きましたが、この場合は以下のように考えればいいでしょうか。
・実行速度を最適化するなら、御津凪さんが仰った、memcpy(又はそれに似た組み込み関数)を使う方法。
 VC++なら、組み込み形式のmemcpyが最速かもしれない。それを使う場合、メモリ使用量はコード中の呼出し回数に応じて増加。
・メモリ使用量を最適化するなら、ループを使う方法。


2倍のポイントを手に入れた! 430ポイント を手に入れた。

Name: Justy  ..ハッカー(220,735ポイント)   Date: 2008/09/10(水) 01:28   No:21110     
Title: Re:超悩み( 訂正 )    

>memset()のような関数は そのマシンの一番実行能率のいい機械コードで書かれた関数

 環境次第なのでそういう傾向がないことはないですが、どういう面から見た
効率なのかは様々でしょう。

 昔某環境で逆アセンブルして見たのだと、渡されたポインタが16byteアライメントに
乗っているときや、残りのサイズ数で分岐してコピー方法を変えている実装のを
見たことがあります。
 ぱっと見た目遅そうなのですが、アライメントに乗った大容量のコピーに
強そうな感じでした。

 逆に言えば、数バイトのコピーに使うには無駄が多いわけで・・・。


290ポイント を手に入れた。

Name: たかぎ [URL]  ..熟練のプログラマー(58,331ポイント)   Date: 2008/09/10(水) 01:57   No:21111     
Title: Re:超悩み( 訂正 )    
>  逆に言えば、数バイトのコピーに使うには無駄が多いわけで・・・。

そういうことです。

最適化性能が高い処理系では、memsetは組み込み関数になるのが普通です。
そして、コンパイル時にサイズが分かるのであれば、それに応じてコンパイル結果を変えます。

例えば、数バイト程度であれば、ループとかではなく、ベタベタに展開した方が効率がよくなります。
ストリング命令、ブロック転送命令などがあるアーキテクチャではそれを使うことでしょう。
いずれにせよ、関数呼び出しに関わるオーバーヘッドを省くことが可能です。

MCUなんかだと、DMA転送とかを使えばもっと高速に実装できる可能性がありますが、型番間の互換性がなくなったり、DMAチャネルを処理系に予約しないといけなかったりするので、使っているのは見たことがありません。
あと、ブロック転送命令があっても、例えばH8のEEPMOVなんかは、実行中に割り込みが入らなくなるので使われないようです。いくら高速でも、どれだけ時間がかかるか(コンパイル時には)わからないので、その間ずっと割り込みを禁止するわけにはいきませんから。

ちなみに今回の件に関しては、C++であればstd::fill_nを使うのが原則です。Cの場合はループで書くしかないでしょう。
効率に関してはどちらも変わりません。

memcpyを使う場合には、レジスタ → メモリだけでなく、メモリ → レジスタの操作も必要なので、単純に考えても倍以上時間がかかります。
一般に、ライトよりリードの方が時間がかかるのです。なぜなら、ライトの場合は(ハード的に)バッファリングが可能ですが、リードの場合はその値を直後から必要とする可能性が高いため、正直に読み込まないといけない上、パイプラインも乱れるからです。


365ポイント を手に入れた。



Name: 自由闊達  ..ぴよぴよ(364ポイント)   Date: 2008/09/08(月) 23:28   No:21071       
Title: 進むスピードを変えずに角度を変える    
ゲームプログラミングの館を参考に、ブロック崩しのゲームを作ろうと思ったのですが
三角関数を使って同じスピードで進む玉の角度を変えようと、
(xv:x座標の速さ yv:y座標の速さ ch.x:玉のx座標 ch.y:玉のy座標 sp:玉のスピード ang:角度)

xv=cos(ang*3.14/180)*speed;
yv=sin(ang*3.14/180)*speed;

ch.x+=xv;
ch.y+=yv;

(ch.x,ch.y)で画像を表示

のようにやってみたら、画像の表示の座標がintであることに気づき行き詰りました。

どうやったらスピードを変えずに角度を変えて進ませる事が出来るのでしょうか?


179ポイント を手に入れた。


Name: 管理人 [URL]  ..伝説のハッカー(789,234ポイント)   Date: 2008/09/08(月) 23:49   No:21075     
Title: Re:進むスピードを変えずに角度を変える    
表示する座標はintでも、計算はdoubleでやればいいのではないでしょうか?

例えば

1.0
1.3
1.6
1.9
2.2
2.5
2.8
3.1

と、0.3ずつ増えるとしてもdoubleで計算すればきちんと計算出来ますし、
(int)にキャストすればint型の座標にも渡せます。
(しなくても出来ます。警告は出ますが)

また、非公開関数で
DrawGraphF
DrawRotaGraphF
というものがあります。
この関数にはfloat型で座標が渡せます。
小数点座標を受け付けてくれるので、
y=10x
のような傾きで進む物体は綺麗に描画出来ます。
関数の仕様は最初の2引数がintからfloatに変わっただけです。
(龍神録プログラミングの館でもこの関数を使っています)


187ポイント を手に入れた。

Name: 管理人 [URL]  ..伝説のハッカー(789,383ポイント)   Date: 2008/09/08(月) 23:55   No:21076     
Title: Re:進むスピードを変えずに角度を変える    
後、3.14は最初にきちんとした値を定義しておいた方が良いと思います。

何処のサイトでも見かける方法で

#define PI 3.141592653589793

としておいて、円周率はプログラム中ではPIとして使用するとよいかと。
詳しい円周率はこんなサイトに書いてあります
http://www.kisaragiweb.jp/pi/pi1m.htm
必要ありませんが・・。


149ポイント を手に入れた。

Name: 御津凪 [URL]  ..中級者(10,517ポイント)   Date: 2008/09/08(月) 23:55   No:21077     
Title: Re:進むスピードを変えずに角度を変える    
座標のほうは管理人さんがおっしゃったとおりです。

角度の 3.14 の部分ですが、精度がいい M_PI マクロ(math.h で定義されている)を使うといいです。
VC++ の場合、そのままだと定義されないらしいので、

// インクルード部
#define _USE_MATH_DEFINES // math.h のマクロ定義を使用する
#include <math.h>

とすることで M_PI マクロが使用可能になるはずです。


183ポイント を手に入れた。

Name: 御津凪 [URL]  ..中級者(10,581ポイント)   Date: 2008/09/09(火) 00:00   No:21078     
Title: Re:進むスピードを変えずに角度を変える    
回答がダブりましたね。
どちらでもいいと思いますが、
math.h の定義では、

#define M_PI 3.14159265358979323846

となっています。


64ポイント を手に入れた。

Name: 自由闊達  ..ぴよぴよ(423ポイント)   Date: 2008/09/09(火) 00:31   No:21079 解決!     
Title: Re:進むスピードを変えずに角度を変える    
こんな早くに回答ありがとうございました。
自分にはまだ早いと思い龍神録プログラミングの館の方を見てなかったので
DrawGraphFの方は知りませんでした。
M_PIの方も初めて知りました、これで作業が進みます、ありがとうございました。


59ポイント を手に入れた。



Name: t.h  ..ぴよぴよ(195ポイント)   Date: 2008/09/08(月) 16:44   No:21051       
Title: Platform SDK のインストール    
C言語のことではないのですが、質問させて下さい。

自分は以前にVisualC++ 2005 Express Edition をインストールしていたので、「ゲ−ムプログラミングの館」の手順に従ってPlatform SDK をインストールしようとしました。ですが、何度やっても
Installer is no longer responding
という表示が出てインストールが途中で止まってしまいます。

User Information の画面では Name の欄だけを埋めて、インストールのタイプはTypical を選びました。インストールする場所はいじってません。 OSは2000を使っています。

何が原因なのでしょうか?
こういう所に質問するのは初めてなので、何か書き足りないことがあればご指摘下さい。


195ポイント を手に入れた。


Name: 御津凪 [URL]  ..中級者(10,174ポイント)   Date: 2008/09/08(月) 16:57   No:21053     
Title: Re:Platform SDK のインストール    
参考にならないかもしれませんが、

http://support.microsoft.com/kb/322722

こちらのページで似たような問題の解決方法が載っているみたいです。

それと、Service Pack は導入済みでしょうか?


88ポイント を手に入れた。

Name: t.h  ..ぴよぴよ(247ポイント)   Date: 2008/09/08(月) 18:52   No:21057     
Title: Re:Platform SDK のインストール    
答えて下さってありがとうございます。

Service Pack というものは導入した覚えがありません。導入したほうがいいものなのですか?


52ポイント を手に入れた。

Name: 御津凪 [URL]  ..中級者(9,937ポイント)   Date: 2008/09/08(月) 19:32   No:21058     
Title: Re:Platform SDK のインストール    
> Service Pack というものは導入した覚えがありません。導入したほうがいいものなのですか?
簡単に言うと、主にシステム部分の機能の改善が得られるものです。
起動が高速になったり、動作が安定したりといった効果が得られます。

入っているかどうかを確認したい場合、「マイ コンピュータ」を右クリックし、
「プロパティ(R)」を選べば、OSの名前が表示されます。
そこに、"Service Pack" という文字が入っていれば、導入されている証拠です。
ただし、続く数字が 4 で無い場合は最新のサービスパックではないので、
下記のURLからダウンロードしてインストールしてください。
(もちろん、バックアップを取ることを忘れずに)
http://www.microsoft.com/downloads/details.aspx?FamilyID=dc27b8c6-2a5a-4399-ad3d-4a97a25f41d9&DisplayLang=ja

サービスパックが入っていなければ、今回の問題もこれで解決するはずです。


237ポイント を落としてしまった。

Name: t.h  ..ぴよぴよ(283ポイント)   Date: 2008/09/08(月) 19:48   No:21060     
Title: Re:Platform SDK のインストール    
ごめんなさい、プロパティの所にしっかり Service Pack4 と書かれていました。
どうやら導入していたのを忘れていたみたいです・・・



36ポイント を手に入れた。

Name: t.h  ..ぴよぴよ(382ポイント)   Date: 2008/09/08(月) 22:02   No:21065     
Title: Re:Platform SDK のインストール    
連続ですみません。
今もう一度インストールしてみてずっと見ていたところ、前回止まった場所とは違う所で止まりました。
結局は同じ英文が出て、完全にはインストール出来なかったわけですけど・・・前回よりは進んでいたように思います。
時間が掛かり過ぎるとインストールが止まってしまったりするのでしょうか?


99ポイント を手に入れた。

Name: 御津凪 [URL]  ..中級者(9,934ポイント)   Date: 2008/09/08(月) 22:27   No:21067     
Title: Re:Platform SDK のインストール    
"Installer is no longer responding"
を和訳すると、
「インストーラーから長時間応答がありません」
です。(間違ってたらすみません)

なので、処理が重い時間が続いたために停止したのだと思うので、
他のアプリケーションを終了して、できるだけ軽くしてから再挑戦してみてください。

あと、いい忘れていたことですが、
ハードディスクの容量は足りているでしょうか?
(約3GB近く空きが無いとインストールできません)



3ポイント を落としてしまった。

Name: t.h  ..ぴよぴよ(500ポイント)   Date: 2008/09/08(月) 23:04   No:21069 解決!     
Title: Re:Platform SDK のインストール    
無事インストール出来ました。
なるほど、重いのが原因だったんですね・・・確かに最初は何窓かしながらインストールしていたような気がします。

もはやどうでもいいことでしょうが、HDの容量は大丈夫です。心配かけてすみません。

御津凪様、至らない質問に答えて下さってありがとうございました。


118ポイント を手に入れた。




 
[ 1 , ... ]
 
 
管理者画面   RSS   + Powered By 21style +