C言語何でも質問掲示板


必ずお読み下さい → 規約と注意事項  アンケートはこちら  エラーで投稿できない方はこちら  過去ログ検索はこちら

 
   〜から、〜まで   
     ・[35895] MNS 
     ・[35896] チルチル 
     ・[35897] pooka 
     ・[35906] conio 
     ・[35953] ICE 
   a=x%y   
     ・[35905] AS 
     ・[35908] sizuma 
     ・[35910] 亀猫 
     ・[35911] box 
     ・[35912] non 
     ・[35913] MNS 
     ・[35946] 亀猫 
   project.zipのダウンロ ....   
     ・[35936] MNS 
     ・[35938] EZI 
     ・[35939] EZI 
     ・[35940] MNS 
     ・[35943] EZI 
   レーザーにおけるバグ   
     ・[35583] BEMANI 
     ・[35589] niconico 
     ・[35590] niconico 
     ・[35592] niconico 
     ・[35593] ねこ 
     ・[35599] BEMANI 
     ・[35704] niconico 
     ・[35705] niconico 
     ・[35706] pooka 
     ・[35726] niconico 
     ・[35934] niconico 
   クラスの練習で出たエ ....   
     ・[35924] Justy 
     ・[35925] ねこ 
     ・[35926] conio 
     ・[35928] エック 
   ご質問があります。   
     ・[35880] Justy 
     ・[35882] 寺 
     ・[35893] ねこ 
     ・[35900] 寺 
     ・[35901] dic 
     ・[35902] ねこ 
     ・[35921] 寺 
     ・[35922] 寺 
   こんな時どうします・ ....   
     ・[35884] 山崎 
     ・[35886] sizuma 
     ・[35890] Dixq (管理人) 
     ・[35899] sizuma 
     ・[35907] 鈴虫 
   デバッグ関数の最初が ....   
   暗い中、一部分だけ光 ....   
     ・[35845] patei 
     ・[35846] ねこ 
     ・[35848] Libra 
     ・[35851] 山崎 
     ・[35853] yu 
     ・[35859] ねこ 
     ・[35867] チルチル 
     ・[35869] Libra 
     ・[35870] yu 
     ・[35872] 山崎 
     ・[35874] Justy 
     ・[35875] ねこ 
     ・[35876] ねこ 
     ・[35878] ねこ 
     ・[35881] Justy 
     ・[35887] yu 
     ・[35888] 山崎 
     ・[35889] yu 
     ・[35891] 山崎 
     ・[35892] ねこ 
     ・[35898] Justy 
   関数リファレンス   
     ・[35841] ねこ 
     ・[35842] 山崎 
     ・[35843] sizuma 
     ・[35854] 亀猫 
     ・[35855] 山崎 
     ・[35873] sizuma 
   参照渡しとchar*型   
     ・[35849] box 
     ・[35852] bitter_orange 
     ・[35857] box 
     ・[35858] bitter_orange 
     ・[35860] non 
     ・[35861] box 
     ・[35862] bitter_orange 
     ・[35863] non 
     ・[35864] non 
     ・[35865] non 
     ・[35866] bitter_orange 
   ボスのカットインにつ ....   
     ・[35831] Dixq (管理人) 
     ・[35833] yrao 
     ・[35856] yrao 
   無題   
     ・[35428] yu 
     ・[35449] kai 
     ・[35450] yu 
     ・[35453] ksi 
     ・[35774] kai 
     ・[35779] ねこ 
     ・[35814] kai 
     ・[35824] yu 
     ・[35825] yu 
     ・[35827] Justy 
     ・[35834] yu 
     ・[35836] ねこ 
     ・[35839] yu 
   商用利用について   
     ・[35830] Dixq (管理人) 
     ・[35835] チルチル 
   ロード画面   
     ・[35832] Dixq (管理人) 
   二点質問があります。   
     ・[35776] Justy 
     ・[35822] 小栗 
   ポインタに関する質問 ....   
     ・[35682] ねこ 
     ・[35687] non 
     ・[35693] box 
     ・[35694] MNS 
     ・[35696] ねこ 
     ・[35702] たいちう 
     ・[35710] toyo 
     ・[35734] MNS 
     ・[35735] lbfuvab 
     ・[35737] toyo 
     ・[35759] たいちう 
     ・[35773] sizuma 
     ・[35778] たいちう 
     ・[35782] ねこ 
     ・[35783] たいちう 
     ・[35784] たいちう 
     ・[35785] toyo 
     ・[35786] ねこ 
     ・[35787] ねこ 
     ・[35788] ねこ 
     ・[35789] ねこ 
     ・[35818] sizuma 
   プロジェクトをDLして ....   
     ・[35731] Dixq (管理人) 
     ・[35780] デラ初心者 
   龍神録の第13章にて   
     ・[35742] LUNA 
     ・[35744] pooka 
     ・[35745] 天魔 
     ・[35748] pooka 
     ・[35755] 天魔 
     ・[35756] Dixq (管理人) 
     ・[35757] 天魔 
     ・[35758] Dixq (管理人) 
     ・[35761] pooka 
     ・[35762] 天魔 
     ・[35765] 天魔 
     ・[35766] Dixq (管理人) 
     ・[35767] pooka 
     ・[35770] 天魔 
   シューティングゲーム ....   
     ・[35751] Dixq (管理人) 
     ・[35769] ほしつばさ 
   文法本は読んだのです ....   
     ・[35768] Dixq (管理人) 
   C言語プログラミング能 ....   
     ・[35591] Mist 
     ・[35631] Kono 
     ・[35635] たいちう 
     ・[35636] LUNA 
     ・[35637] Kono 
     ・[35638] LUNA 
     ・[35639] LUNA 
     ・[35640] LUNA 
     ・[35641] ねこ 
     ・[35642] LUNA 
     ・[35643] ねこ 
     ・[35644] Mist 
     ・[35645] ねこ 
     ・[35712] Kono 
     ・[35718] LUNA 
     ・[35719] LUNA 
     ・[35723] Kono 
     ・[35729] dic 
     ・[35732] Kono 
     ・[35741] LUNA 
     ・[35747] Kono 
     ・[35749] Hermit 
     ・[35760] sizuma 
     ・[35764] Kono 
   正常にダウンロードで ....   
     ・[35661] dic 
     ・[35750] KKXY 
     ・[35752] Dixq (管理人) 
     ・[35753] KKXY 
     ・[35754] Dixq (管理人) 
   メモリの解放ってする ....   
     ・[35703] Korsakov 
     ・[35709] 山崎 
     ・[35730] dic 
     ・[35733] 通りすがり 
     ・[35746] たかぎ 
   クリックイベント   
     ・[35738] バグ 
     ・[35740] abc 
   ポインタに関する質問 ....   
     ・[35681] ねこ 
     ・[35685] non 
     ・[35707] フリオ 
     ・[35711] ねこ 
   C言語での迷路ゲーム   
     ・[35708] 山崎 
   C言語の配列の大きさに ....   
     ・[35622] たかぎ 
     ・[35674] VBユーザ 
     ・[35678] non 
     ・[35698] 紅葉 
     ・[35699] たかぎ 
   株のプログラムの質問   
     ・[35665] RVD 
     ・[35667] ねこ 
     ・[35695] RVD 
     ・[35697] ねこ 
   strcpyについて   
     ・[35648] ねこ 
     ・[35649] バグ 
     ・[35656] dic 
     ・[35692] non 
   標準ライブラリ関数と ....   
     ・[35543] たかぎ 
     ・[35544] non 
     ・[35554] トウラ 
     ・[35653] トウラ 
     ・[35655] たかぎ 
     ・[35658] toyo 
     ・[35669] tkmakwins15 
     ・[35689] non 
     ・[35691] たかぎ 
   描画されないのですが   
     ・[35662] やそ 
     ・[35676] ひよこ 
     ・[35677] ねこ 
     ・[35683] ひよこ 
     ・[35684] ねこ 
     ・[35686] ひよこ 
   日本語の扱いについて   
     ・[35620] たか 
     ・[35627] non 
     ・[35628] Blue 
     ・[35671] 東 康生 
     ・[35679] non 
   戦略ゲームについて   
     ・[35579] Justy 
     ・[35586] やそ 
     ・[35608] MNS 
     ・[35621] Justy 
     ・[35624] MNS 
     ・[35625] toyo 
     ・[35666] MNS 
   int型変数の画像ロード ....   
     ・[35652] ねこ 
     ・[35654] yskey 
   アイコンの更新ができ ....   
     ・[35615] チルチル 
     ・[35616] pooka 
     ・[35650] チルチル 
   無題   
     ・[35604] non 
     ・[35634] LUNA 
   音ゲー作ってみました   
     ・[35073] ひよこ 
     ・[35075] sizuma 
     ・[35078] ひよこ 
     ・[35079] ひよこ 
     ・[35081] Justy 
     ・[35089] ひよこ 
     ・[35090] ねこ 
     ・[35091] sizuma 
     ・[35092] Justy 
     ・[35102] Tatu 
     ・[35103] ひよこ 
     ・[35105] ねこ 
     ・[35106] sizuma 
     ・[35108] ひよこ 
     ・[35110] Dixq (管理人) 
     ・[35111] ひよこ 
     ・[35114] sizuma 
     ・[35115] ひよこ 
     ・[35116] sizuma 
     ・[35117] Dixq (管理人) 
     ・[35118] Dixq (管理人) 
     ・[35119] ひよこ 
     ・[35120] BEMANI 
     ・[35140] 御津凪 
     ・[35158] ひよこ 
     ・[35222] ひよこ 
     ・[35262] Justy 
     ・[35297] ひよこ 
     ・[35299] ねこ 
     ・[35302] ひよこ 
     ・[35307] ねこ 
     ・[35309] ひよこ 
     ・[35312] ねこ 
     ・[35313] ひよこ 
     ・[35318] ねこ 
     ・[35322] ひよこ 
     ・[35328] ねこ 
     ・[35332] ひよこ 
     ・[35436] ひよこ 
     ・[35505] situmon 
     ・[35507] ひよこ 
     ・[35520] BEMANI 
     ・[35540] situmon 
     ・[35541] ひよこ 
     ・[35548] ねこ 
     ・[35574] ひよこ 
     ・[35582] BEMANI 
     ・[35626] ひよこ 
   自機の場合分け   
     ・[35446] ねこ 
     ・[35451] yrao 
     ・[35456] conio 
     ・[35459] ねこ 
     ・[35467] 紅葉 
     ・[35482] yrao 
     ・[35555] 紅葉 
     ・[35611] yrao 
   private修飾子へのアク ....   
     ・[35598] ねこ 
     ・[35600] たかぎ 
     ・[35601] dic 

Name: ICE  ..ぴよぴよ(261ポイント)   Date: 2009/06/28(日) 12:17   No:35894       
Title: 〜から、〜まで    
はじめまして。最近C言語を習い始めたばかりの初心者ですがお願いします。

今、学校でゲームを作っているのですが「〜から、〜まで」の効率良い作り方がわかりません。
10から15の値を出したいのです。
自分がやった感じは

 int r;
 r = rand()%15;
 printf("ランダム=%d\n",r)



これだと15までの値しかでません。
そこで


 int r;
 r = rand()15;*
 if(r >= 10){
  printf("ランダム=%d\n",r);
 }

という風にif文でやってみました。
こういう風でも良いのですが、*の所で「〜から」というの制御できませんでしょうか?


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


Name: MNS  ..中級者(11,765ポイント)   Date: 2009/06/28(日) 12:27   No:35895     
Title: Re:〜から、〜まで    

int r;
r = rand() % 5 + 10;

で良いのでは?


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

Name: チルチル  ..プログラマー(27,629ポイント)   Date: 2009/06/28(日) 12:29   No:35896     
Title: Re:〜から、〜まで    
よくわかりませんが

10から15までの乱数を出したいなら

0から5までの乱数を出して10を足せば良いんじゃないでしょうか?

あ、被ってしまいましたね・・


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

Name: pooka [URL]  ..初心者(7,935ポイント)   Date: 2009/06/28(日) 12:40   No:35897     
Title: Re:〜から、〜まで    
私も皆さんの方法でやると思いますが、一応参考に
ttp://homepage3.nifty.com/mmgames/c_guide/21-02.html#S3


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

Name: conio [URL]  ..上級者(24,156ポイント)   Date: 2009/06/28(日) 16:13   No:35906     
Title: Re:〜から、〜まで    
----------------------------------
 int r;
 r = rand()%15;
 printf("ランダム=%d\n",r)

これだと15までの値しかでません。
----------------------------------

いや、15の値は出ないですよ。
出るのは、0〜14までの値です。


---------------------
int r;
r = 10 + rand() % 6;
---------------------
10〜15までの値を出したいのであれば、
こうすれば良いと思います。

「10 + 0〜5のどれか」 と考えれば分かりやすいのではないかな、と。


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

Name: ICE  ..ぴよぴよ(313ポイント)   Date: 2009/06/28(日) 23:53   No:35953 解決!     
Title: Re:〜から、〜まで    
MNSさん、チルチルさん、pookaさん、conioさんありがとうございます!
こうすれば良かったのですね。ありがとうございます。

<conioさん
すみません。勘違いをしていました。


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



Name: 亀猫  ..ぴよぴよ(675ポイント)   Date: 2009/06/28(日) 16:03   No:35903       
Title: a=x%y    
再び質問させていただきます・・

ゲームプログラミングの館で、

else if(x%32!=0)
  x++;

という部分を入れるという文があったのですが、理解できません・・。
]座標を32を割って、その余りが0ならば(真ならば?)実行という意味でしょうか?

%について調べたところ a=b%c という計算でbをcで割ってその余りをaに入ると書いてあったのですが

(x%32!=0)では↑の a の役割をする部分がありません・・・。

そのサイトの一部を抜粋↓

int a = 10;
int b = 3;
int c;

c = a % b;

のとき 10 ÷ 3 の余りは 1 ですから c は 1 になります。  


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


Name: AS  ..初心者(6,160ポイント)   Date: 2009/06/28(日) 16:10   No:35905     
Title: Re:a=x%y    
!=は、〜ではなかったら。の意味ですので、
余りが0でないなら実行という意味ですよ。
なのでxが32とか64だったらx++は行われないわけです。


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

Name: sizuma [URL]  ..入門者(3,450ポイント)   Date: 2009/06/28(日) 16:37   No:35908     
Title: Re:a=x%y    
=は代入演算子
左の変数に(左オペランド)右の値(右オペランド)を格納します。
(演算子が作用する対象をオペランドって言って、よくエラーとかで見ますね)


==や!=などは関係演算子
2つの値を比較して真か偽かを返します
他にもあるので、関係演算子で調べてみてください


というわけで、=と==は亀とスッポンくらいの違いがあります。
if文の判定では代入演算子(=)は使わないものです。
JavaやC#だとコンパイルエラーになりますし

亀猫さんも判定式などで等しいか比較するときに=と==の書き間違いには注意してくださいね


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

Name: 亀猫  ..ぴよぴよ(912ポイント)   Date: 2009/06/28(日) 16:55   No:35910     
Title: Re:a=x%y    
返信ありがとうございます。

=が付かないことは理解できたのですが、
この

else if(x%32!=0)
  x++;


の意味が理解できません・・・。

つまり余りが0になるまで X座標に+1させるっていうことですか?

今いる地点のX座標が63だったら  63÷32で余りが出るのでX座標に+1させて 64÷32で余りが0になるので進む距離は→を1回押したので+1させたのと余りが出て+1だから 2ピクセルしか進まない・・? という意味ですか?

それとも、 →を1回押して +1なので 1÷32(少数は余りにならない・・・?)で余りが出るので X座標に+31させて 32÷32で余りが0になるので進む距離は 32ピクセル・・・?という意味でしょうか?


追記:
すみません・・・。C言語は初心者で、どこまで乗せればいいか分からなかったので・・・。

if( Key[ KEY_INPUT_RIGHT ] == 1 ) //右ボタンが押されたら
ch.x++ ; //xの値を1増やす

else if(ch.x%32!=0) //32で割り切れない区間はオートで進む
ch.x++;


です。
多分コレであってると思います・・・。



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

Name: box  ..ハッカー(142,115ポイント)   Date: 2009/06/28(日) 17:07   No:35911     
Title: Re:a=x%y    
当該のif文全体を見せてください。
else 〜
だけを見ても、当該のif文の全体像がわかりません。


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

Name: non  ..熟練のプログラマー(51,474ポイント)   Date: 2009/06/28(日) 17:28   No:35912     
Title: Re:a=x%y    
最近、ゲームプログラミングの館を見ていないから間違っていたらごめんなさい。
mapが32ピクセル区切られていて、方向転換をするタイミングを32ピクセルの倍数の
場所だけチェックするようになっていたのではなかったでしょうか。
32の倍数でない場合は、それまでの方向に直進するようになっていたと思います。



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

Name: MNS  ..中級者(12,166ポイント)   Date: 2009/06/28(日) 17:32   No:35913     
Title: Re:a=x%y    
これは、
キャラがいるx座標が必ず32の倍数になるように調整しているのではないでしょうか?

例えば、キャラの座標が64であったとして、
キーボードから→ボタンの押下を受け付けたとします。

if( Key[ KEY_INPUT_RIGHT ] == 1 )を満たしているので、ch.x++ が行われ、
キャラの座標は、→ボタンを押し続けている限り、1ずつ増えていきます。

ここで、座標が76のときに→ボタンを離したとします。

右ボタンが押されていない、かつ32で割り切れない条件を満たしたので、
else if(ch.x%32!=0) ch.x++; の処理が行われ、座標は1ずつ増えていきます。

そして、キャラの座標が96になったとき、96%32 == 0なので、
どちらの処理も行われなくなります。

言っていることが分かるでしょうか?
これは、キャラが中途半端なところで止まるのを防ぐための処理だと思います。

迷路などゲームで、→ボタンを一回押しただけで、一マスすすむのは、
(仮にボタンを離したとしても、一マス移動するまで動き続けると思います)
このような処理が行われているからです。


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

Name: 亀猫  ..ぴよぴよ(964ポイント)   Date: 2009/06/28(日) 22:48   No:35946 解決!     
Title: Re:a=x%y    
なるほど!理解できました!

ASさま sizuma様 box様 non様 MNS様 詳しく返信して頂きありがとうございます。

プログラムを一つづつ解読していかないと気がすまない性格なので・・・。


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



Name: EZI  ..ぴよぴよ(77ポイント)   Date: 2009/06/28(日) 21:29   No:35933       
Title: project.zipのダウンロード    
http://dixq.net/rp/zip/project.zip
が正常にダウンロードできません。
ダウンロード後343 KB程のproject.zipファイルと
なってしまします。
当然うまく解凍できません。
OSはXPブラウザはIE8です

他の環境でも同様でしょうか?
どなたか試して頂けませんか?



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


Name: MNS  ..中級者(12,206ポイント)   Date: 2009/06/28(日) 21:44   No:35936     
Title: Re:project.zipのダウンロード    
私の環境(IE8)ではダウンロード可能です。

FireFoxなどのブラウザで試してみてはどうでしょう?


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

Name: EZI  ..ぴよぴよ(161ポイント)   Date: 2009/06/28(日) 21:54   No:35938     
Title: Re:project.zipのダウンロード    
ダウンロード後のファイルは
11.6Mになっていますでしょうか?

ダウンロード後のファイルが
343KBとなってしまい
Lhaplusで解凍すると
28章の解凍部分でエラーが出ます。


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

Name: EZI  ..ぴよぴよ(188ポイント)   Date: 2009/06/28(日) 22:00   No:35939     
Title: Re:project.zipのダウンロード    
MNSさん試して頂きありがとうございます。
一応画像も添付しますです。


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

Name: MNS  ..中級者(12,196ポイント)   Date: 2009/06/28(日) 22:01   No:35940     
Title: Re:project.zipのダウンロード    
ええ、ダウンロード完了後のファイルのサイズは11.6Mで、
解凍もエラーなく行え、解凍後のファイルにも問題はないと思います。

もしかしたら、キャッシュの削除などで再度ダウンロードが可能かもしれません。


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

Name: EZI  ..ぴよぴよ(322ポイント)   Date: 2009/06/28(日) 22:17   No:35943 解決!     
Title: Re:project.zipのダウンロード    
むむむ…

Firefoxをインストールして、
Firefoxでダウンロードしてみたら
うまくダウンロードできてしまいました。

んー、IE8の何かが悪いのだろうか…
設定?
キャッシュはクリアしてみたのですが
現状変わらずでした。

とりあえずFirefoxでダウンロードできたので
解決しました。
ブラウザ変えようかな…
MNSさんありがとうございました。


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



Name: niconico  ..入門者(3,078ポイント)   Date: 2009/06/23(火) 01:02   No:35576       
Title: レーザーにおけるバグ    
龍神録を使ってシューティングを作らせてもらってます
ザコ敵にもレーザーを実装してみたところ、バグが発生しました
放置しておけばそのうち治るかと思ったのですが、そうではなさそうで、さらに自分ではわからないので投稿させていただきます

自分の困っているバグはレーザーを出してくる敵を全部殺してしまった場合起こってしまいます。
よく表れる症状はレーザーが細いまま、回転するのが一瞬、などです

殺さなかったら、ちゃんと自分の思った通りのレーザーがでるのでプログラムは間違っていないと思うのですが……

あと、エクセルを使った敵の読み込みもただ敵を消しただけなのに、読み込みエラーが発生したりします

どうやったら解決できるか、よろしくお願いします


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


Name: BEMANI  ..プログラマー(35,555ポイント)   Date: 2009/06/23(火) 06:32   No:35583     
Title: Re:レーザーにおけるバグ    
>>niconicoさん
>ザコ敵にもレーザーを実装してみたところ、バグが発生しました
ザコ敵に実装する前はしっかりレーザーを撃てていたのでしょうか?
前回レーザーで御質問なさった時に、敵が複数いる場合のレーザー発射の問題は
解決したように書かれていましたので気になりました。
あの記事とは別の問題でしょうか。


>よく表れる症状はレーザーが細いまま、回転するのが一瞬、などです
すいませんが、症状がよく解らないです。
文章で書くならもう少し具体的にお願いします;


>殺さなかったら、ちゃんと自分の思った通りのレーザーがでるのでプログラムは間違っていないと思うのですが……
仮に敵を全部倒さないとどうなるのでしょうか。
例えば画面に3匹出てきたとして、3匹がレーザーを撃つとします。
その内の1匹あるいは2匹を倒すとどうなるのでしょうか・・・という事です。

敵を倒した時の初期化を間違えているとか、レーザーを発射するタイミングで敵がいなくなっている
といったプログラムになっていませんか?


>あと、エクセルを使った敵の読み込みもただ敵を消しただけなのに、読み込みエラーが発生したりします
>どうやったら解決できるか、よろしくお願いします
ソースを見ないとなぜかは解りません。
差し支えなければソースを載せて頂けると解決策が見えるかもしれません。


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

Name: niconico  ..入門者(3,640ポイント)   Date: 2009/06/23(火) 13:58   No:35589     
Title: Re:レーザーにおけるバグ    
BEMANIさん、またよろしくお願いします
ホント感謝です

>ザコ敵に実装する前はしっかりレーザーを撃てていたのでしょうか?
>前回レーザーで御質問なさった時に、敵が複数いる場合のレーザー発射の問題は
>解決したように書かれていましたので気になりました。
>あの記事とは別の問題でしょうか。
あのあと、複数の敵がレーザーを撃つことには成功したのですが、実際に普通の敵が出るステージに実装して友達にやらせてみたら、今回のバグを発見しました
うまく行く時はレーザーはちゃんと撃ってくるので、別の問題だと思われます


>すいませんが、症状がよく解らないです。
>文章で書くならもう少し具体的にお願いします;
なんといえば、いいんでしょうか……
数字での説明するならば、

細いままというのは、レーザーを10に設定しているはずなのに、1ぐらいの太さしかない
回転のほうは、100カウントかけて回転するところを1〜10カウントで回転させてる

といったところです


>仮に敵を全部倒さないとどうなるのでしょうか。
>例えば画面に3匹出てきたとして、3匹がレーザーを撃つとします。
>その内の1匹あるいは2匹を倒すとどうなるのでしょうか・・・という事です。
細いレーザーは敵が引っこんでも(本来は画面から消えたら、収束して消えます)しばらく残り続けたのち、消えます
倒した場合でも、そうなってしまいます。
複数だした場合、レーザーが成功する敵としない敵ができます。
試してみたところ、あまり敵同士の関連性はないようです。
成功したやつはちゃんとした動作をしますが、しなかったやつはしません
あと、うまくいかないのはレーザーだけで、敵キャラの動きには問題はないです(一応

初期化に関しては問題ないと思うのですが……調べてみます

>ソースを見ないとなぜかは解りません。
>差し支えなければソースを載せて頂けると解決策が見えるかもしれません。
入りきらなそうなので次にいきます


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

Name: niconico  ..入門者(4,873ポイント)   Date: 2009/06/23(火) 14:01   No:35590     
Title: Re:レーザーにおけるバグ    

//敵の出現情報をエクセルから読み込んで格納する関数
void load_story(){
char *fname;
int n,num,i,fp;
int input[64];
char inputc[64];

switch(stage_number){
case 1:
fname="../dat/csv/storyH0.csv";
break;

case 2:
fname="../dat/csv/storyH0.csv";
break;

case 3:
fname="../dat/csv/storyH0.csv";
break;

case 4:
fname="../dat/csv/11章/storyH0.csv";
break;

case 5:
fname="../dat/csv/11章/storyH0.csv";
break;

case 6:
fname="../dat/csv/11章/storyH0.csv";
break;

default:
printfDx("不明なfunc_state\n");
break;
}

fp = FileRead_open(fname);//ファイル読み込み
if(fp == NULL){
printfDx("read error\n");
return;
}
for(i=0;i<2;i++)//最初の2行読み飛ばす
while(FileRead_getc(fp)!='\n');

n=0 , num=0;
while(1){
for(i=0;i<64;i++){
inputc[i]=input[i]=FileRead_getc(fp);//1文字取得する
if(inputc[i]=='/'){//スラッシュがあれば
while(FileRead_getc(fp)!='\n');//改行までループ
i=-1;//カウンタを最初に戻して
continue;
}
if(input[i]==',' || input[i]=='\n'){//カンマか改行なら
inputc[i]='\0';//そこまでを文字列とし
break;
}
if(input[i]==EOF){//ファイルの終わりなら
goto EXFILE;//終了
}
}
switch(num){
case 0: enemy_order[n].cnt =atoi(inputc);break;
case 1: enemy_order[n].pattern =atoi(inputc);break;
case 2: enemy_order[n].knd =atoi(inputc);break;
case 3: enemy_order[n].x =atof(inputc);break;
case 4: enemy_order[n].y =atof(inputc);break;
case 5: enemy_order[n].sp =atof(inputc);break;
case 6: enemy_order[n].bltime =atoi(inputc);break;
case 7: enemy_order[n].blknd =atoi(inputc);break;
case 8: enemy_order[n].col =atoi(inputc);break;
case 9: enemy_order[n].hp =atoi(inputc);break;
case 10:enemy_order[n].blknd2 =atoi(inputc);break;
case 11:enemy_order[n].wait =atoi(inputc);break;
case 12:enemy_order[n].item_n[0]=atoi(inputc);break;
case 13:enemy_order[n].item_n[1]=atoi(inputc);break;
case 14:enemy_order[n].item_n[2]=atoi(inputc);break;
case 15:enemy_order[n].item_n[3]=atoi(inputc);break;
case 16:enemy_order[n].item_n[4]=atoi(inputc);break;
case 17:enemy_order[n].item_n[5]=atoi(inputc);break;
case 18:enemy_order[n].till =atoi(inputc);break;
}
num++;
if(num==19){
num=0;
n++;
}
}
EXFILE:
FileRead_close(fp);
}


です
最初のcase文はステージごとに変えたかったので、無理やりです
拙い知識とグーグル先生を使って使ったので間違えている可能性が高いです


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

Name: niconico  ..入門者(4,883ポイント)   Date: 2009/06/23(火) 14:11   No:35592     
Title: Re:レーザーにおけるバグ    
ちなみに読み込むファイルはこれです


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

Name: ねこ  ..中級者(10,062ポイント)   Date: 2009/06/23(火) 14:51   No:35593     
Title: Re:レーザーにおけるバグ    
前回の内容があるみたいなので見たのですが思ったより長く把握し切れなかったので軽く推測で。

<よく表れる症状は
という表現から常に起こるわけではないのだと思いますが

<細いままというのは、レーザーを10に設定しているはずなのに、1ぐらいの太さしかない
<回転のほうは、100カウントかけて回転するところを1〜10カウントで回転させてる
との内容から、配列に別の敵情報やショット情報が入ったりしていませんか?
龍神録プロジェクトなら敵やショットを追加する際、存在フラグをチェックしていると思いますので
レーザーに使用する情報なのにどこか上書きされてるか等。
そのあたりにバグが潜んでるのかもしれません。

また、レーザーの変化に関連するのはカウント系だと思います。
ちょっと邪魔になりますが、レーザー配列の0〜必要数分のカウントをリアルタイムに画面に表示し
「予期しない増え方・減り方・停止」をチェックするとバグを起こしている原因が見えてくるかもしれません。


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

Name: BEMANI  ..プログラマー(36,161ポイント)   Date: 2009/06/23(火) 17:25   No:35599     
Title: Re:レーザーにおけるバグ    
>>niconicoさん
御質問の内容に「エクセルを使った敵の読み込みもただ敵を消しただけなのに、読み込みエラーが発生したりします」
と書いてありますが、敵を消しただけなのに読み込みエラーと言うのはどういうことなのでしょうか?
もう少し具体的に書いて頂けると助かります。



まず、読み込みエラーが出る原因を追求していきましょう。
自分が気になったのは三点。

【一つ目】
switch(stage_number){ 〜 }とありますが、この「stage_number」はどこにありますか?
引数で送られてきてるようでもありませんし、load_story()内で宣言・定義している所ははありませんでした。
グローバル変数で取っているのでしょうか?

【二つ目】
例えば case 0の処理ですが、「fname="../dat/csv/storyH0.csv";」と書いてあり、
csvファイルを読み込んでいます。
・・・が、添付されているファイルを見ると .xls とエクセルデータになっています。
csvを読み込むのであればらcsvファイルを出力して下さい。


【三つ目】
case 4 の処理にあります「fname="../dat/csv/11章/storyH0.csv";」ですが、
ファイル名に半角英数字以外(ひらがなや漢字等)を自分が使ったこと無かったのでちょっと疑問に思いましたが
これで読み込めるなら大丈夫です。
もしこれでうまく読み込めていないのなら、半角英数字でファイル名を付けてみては如何でしょうか。


読み込みエラーと言う事はなにかしら原因でうまく読み込めていないという事なので
読み込むデータがきちんと変数に入っているか確認する必要があります。
デバッガを使えるならそれで構いませんし、それはまだ使えないというのであれば
DxLibで、printf的なものがあるかは知らないですが、もしあるならそれを使って画面に出力したりして
変数の中身をトレスしてみて下さい。
(stage_number や enemy_order[n].メンバ など。)


もし画面に出力した段階でうまく出力されているのならば他が間違っていますし、
うまく出力されていないなら読み込む処理が間違っていることになります。


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

Name: niconico  ..初心者(5,652ポイント)   Date: 2009/06/25(木) 01:43   No:35704     
Title: Re:レーザーにおけるバグ    
>>ねこさん

よく表れるというよりは、条件を満たすと出てしまうといった感じですね
なんか敵がバグを出して来ててレーザーが打てないです……
まずは、敵のバグをなんとかしなくちゃいけませんね
それが解決したら、やってみます

ちなみに前の質問ではザコ敵にレーザーを個別の変数を持たせるというものでした

>>BEMANIさん
>御質問の内容に「エクセルを使った敵の読み込みもただ敵を消しただけなのに、読み込みエラーが発生したりします」
>と書いてありますが、敵を消しただけなのに読み込みエラーと言うのはどういうことなのでしょうか?
>もう少し具体的に書いて頂けると助かります。
ホントにそのまんまで、一番下の列を消したら、バグりました

>switch(stage_number){ 〜 }とありますが、この「stage_number」はどこにありますか?
>引数で送られてきてるようでもありませんし、load_story()内で宣言・定義している所ははありませんでした。
>グローバル変数で取っているのでしょうか?
そのとおりです。
グローバル変数で宣言してます。
説明不足ですみません
何ステージ目か表す変数です


>例えば case 0の処理ですが、「fname="../dat/csv/storyH0.csv";」と書いてあり、
>csvファイルを読み込んでいます。
>・・・が、添付されているファイルを見ると .xls とエクセルデータになっています。
>csvを読み込むのであればらcsvファイルを出力して下さい。
こちらではcsvファイルになっているのですが……どういうことなのでしょうか?
一応、../dat/csv/storyH0.xlsにしてみたところ、読み込みエラーと表示されました
csvでよさそうな感じがします

>case 4 の処理にあります「fname="../dat/csv/11章/storyH0.csv";」ですが、
>ファイル名に半角英数字以外(ひらがなや漢字等)を自分が使ったこと無かったのでちょっと疑問に思いましたが
>これで読み込めるなら大丈夫です。
>もしこれでうまく読み込めていないのなら、半角英数字でファイル名を付けてみては如何でしょうか。
半角だけにしても同じことが起こってしまいました



すみません続きがあります


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

Name: niconico  ..初心者(6,608ポイント)   Date: 2009/06/25(木) 01:51   No:35705     
Title: Re:レーザーにおけるバグ    
実は上で書いたload_story関数には続く関数があって


//敵情報を登録
void enemy_enter(){//敵の行動を登録・制御する関数
int i,j,t;
if(boss.flag!=0)return;
for(t=0;t<ENEMY_ORDER_MAX;t++){
if(enemy_order[t].cnt==stage_count){//現在の瞬間がオーダーの瞬間なら
if((i=enemy_num_search())!=-1){
enemy[i].flag =1;//フラグ
enemy[i].cnt =0;//カウンタ
enemy[i].pattern=enemy_order[t].pattern;//移動パターン
enemy[i].muki =1;//向き
enemy[i].knd =enemy_order[t].knd;//敵の種類
enemy[i].x =enemy_order[t].x;//座標
enemy[i].y =enemy_order[t].y;
enemy[i].sp =enemy_order[t].sp;//スピード
enemy[i].bltime =enemy_order[t].bltime;//弾の発射時間
enemy[i].blknd =enemy_order[t].blknd;//弾幕の種類
enemy[i].blknd2 =enemy_order[t].blknd2;//弾の種類
enemy[i].col =enemy_order[t].col;//色
enemy[i].wait =enemy_order[t].wait;//色
enemy[i].hp =enemy_order[t].hp;//体力
enemy[i].hp_max =enemy[i].hp;//体力最大値
enemy[i].back_col=GetRand(4);
enemy[i].vx =0;//水平成分の速度
enemy[i].vy =0;//鉛直成分の速度
enemy[i].ang =0;//角度
for(j=0;j<6;j++)
enemy[i].item_n[j]=enemy_order[t].item_n[j];//落とすアイテム
}
}
}
}



//敵の行動制御
void enemy_act(){
int i;
for(i=0;i<ENEMY_MAX;i++){
if(enemy[i].flag==1){//その敵のフラグがオンになってたら
if(0<=enemy[i].pattern && enemy[i].pattern<ENEMY_PATTERN_MAX){
enemy_pattern[enemy[i].pattern](i);
enemy[i].x+=cos(enemy[i].ang)*enemy[i].sp;
enemy[i].y+=sin(enemy[i].ang)*enemy[i].sp;
enemy[i].x+=enemy[i].vx;
enemy[i].y+=enemy[i].vy;
enemy[i].cnt++;
enemy[i].img=enemy[i].muki*3+(enemy[i].cnt%18)/6;
//敵が画面外に外れたら消す
if(enemy[i].x<-20 || FMX+20<enemy[i].x || enemy[i].y<-20 || FMY+20<enemy[i].y)
enemy[i].flag=0;
if(enemy[i].bltime==enemy[i].cnt)
enter_shot(i);
}
else
printfDx("enemy[i].patternの%d値が不正です。",enemy[i].pattern);
}
}
}



があるのですが、(load_story→enemy_enter→enemy_actの順に読み込みます)、このenemy_actの最後の
printfDx("enemy[i].patternの%d値が不正です。",enemy[i].pattern);
を使ってわかったことなのですが、どうやらロードするのがうまくいっていないみたいです
たとえば、enemy[i].patternにenemy[i].waitの値が入ってしまっているらしいです
調べてみないとわかりませんが、たぶんすべての関数にほしい値が入ってないように思われます
しかも、ずっとenemy[i].patternにenemy[i].waitが入るべき変数が入っているのならわかるんですが、enemy[i].yが入ったりします
正直わけがわからないです……


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

Name: pooka [URL]  ..初心者(7,072ポイント)   Date: 2009/06/25(木) 03:00   No:35706     
Title: Re:レーザーにおけるバグ    
load_story関数に
>case 18:enemy_order[n].till = atoi(inputc);break;
とありますが、添付されたcsvファイル(xlsとなってますが)にはそれに対応する部分の値がないようです。(アイテムまで)
なので次の行の値を読み込んでいき、だんだん対応関係がずれてしまっているようです。


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

Name: niconico  ..初心者(6,689ポイント)   Date: 2009/06/25(木) 15:13   No:35726     
Title: Re:レーザーにおけるバグ    
>>pooka
おお!
できました!
ありがとうございます
まさか、自分の付け足した関数が原因だったとは……


ということでバグを起こしているときの画像です
二体いますが、右側にいる方が正しい動作をしています
ちなみに、同じものを同じ時間に撃ったものです


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

Name: niconico  ..初心者(6,824ポイント)   Date: 2009/06/28(日) 21:41   No:35934     
Title: Re:レーザーにおけるバグ    
>>ねこさん
>龍神録プロジェクトなら敵やショットを追加する際、存在フラグをチェックしていると思いますので
>レーザーに使用する情報なのにどこか上書きされてるか等。
>そのあたりにバグが潜んでるのかもしれません。

ということはなさそうです。他のレーザーをすべて消してやってみましたが、それでもだめでした


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



Name: エック  ..ぴよぴよ(541ポイント)   Date: 2009/06/28(日) 20:45   No:35923       
Title: クラスの練習で出たエラーを解決できません    
はじめまして。
最近C++の勉強を始めた初心者ですが、クラス(コンストラクタ)の練習中にエラーが出て解決できません。
自分なりにコードを見直したり、解決の方法を模索したのですが自力ではどうにもできずご相談させていただく事としました。
Dxライブラリを使っており、おそらく設定のミスではないかと目星をつけたのですが、プロパティを見てもどこが悪いのか分かりませんでした。
------------------------------------------------------------------------------------------------------
--------------環境 Visual C++ 2008 Express Edition
--------------変更した設定
(Dxライブラリ置き場の導入と同じです)
ツール→オプション→インクルードファイル&ライブラリファイルの設定
パス:C:\Program Files\Microsoft Visual Studio 9.0\DxLib_VC

プロジェクトのプロパティの変更
全般→マルチ バイト文字セットを使用する
コード生成→マルチスレッド デバッグ(/MTd)
構成をReleaseに→マルチスレッド(/MT)


----------------ソースコード
-----------------------main.cpp-------------------------
#include<DxLib.h>
#include"object.h"

int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPSTR lpCmdLine, int nCmdShow )
{
// DXライブラリ初期化
if( DxLib_Init() == -1 ) return -1 ;

CObject Test(50,50);
CObject Test2;

// キーの入力待ち
WaitKey() ;


DxLib_End();
return 0;
}


-------------------object.h-------------------------------------------
class CObject{
int ObjectX, ObjectY;

public:
CObject();
CObject(int, int);
void set_ObjectX(int X);
void set_ObjectY(int Y);

int get_ObjectX()const;
int get_ObjectY()const;
}


---------------------object.cpp----------------------------------
#include "object.h"

//コンストラクタ
CObject::CObject(){ObjectX=0; ObjectY=0;}
CObject::CObject(int X, int Y): ObjectX(X), ObjectY(Y){}

void CObject::set_ObjectX(int X){ObjectX=X;}
void CObject::set_ObjectY(int Y){ObjectY=Y;}

int CObject::get_ObjectX()const {return ObjectX;}
int CObject::get_ObjectY()const {return ObjectY;}

------------エラーメッセージ-------------------------------------------------------
------ ビルド開始: プロジェクト: sampleSTG, 構成: Debug Win32 ------
コンパイルしています...
main.cpp
d:\vc\samplestg\samplestg\main.cpp(4) : error C2628: 'CObject' の後に 'int' を続けて記述できません(セミコロン ';' で区切ってあるか確認してください)。
d:\vc\samplestg\samplestg\main.cpp(6) : error C2556: 'CObject WinMain(HINSTANCE,HINSTANCE,LPSTR,int)' : オーバーロード関数は、'int WinMain(HINSTANCE,HINSTANCE,LPSTR,int)' と戻り値の型のみが異なります。
c:\program files\microsoft sdks\windows\v6.0a\include\winbase.h(2560) : 'WinMain' の宣言を確認してください。
d:\vc\samplestg\samplestg\main.cpp(6) : error C2371: 'WinMain' : 再定義されています。異なる基本型です。
c:\program files\microsoft sdks\windows\v6.0a\include\winbase.h(2560) : 'WinMain' の宣言を確認してください。
object.cpp
d:\vc\samplestg\samplestg\object.cpp(5) : error C2533: 'CObject::{ctor}' : コンストラクタの宣言に戻り値の型が含まれています。
コードを生成中...
ビルドログは "file://d:\VC\sampleSTG\sampleSTG\Debug\BuildLog.htm" に保存されました。
sampleSTG - エラー 4、警告 0
========== ビルド: 0 正常終了、1 失敗、0 更新不要、0 スキップ ==========

---------------------------------------------------------------------------------------
以上です
初めての投稿なので見にくいかもしれませんが、よろしくお願いします


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


Name: Justy  ..伝説なるハッカー(381,982ポイント)   Date: 2009/06/28(日) 20:51   No:35924     
Title: Re:クラスの練習で出たエラーを解決できません    
 とりあえず、object.hのクラス定義の最後の }に ;をつけてみてください。

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

Name: ねこ  ..上級者(17,144ポイント)   Date: 2009/06/28(日) 20:51   No:35925     
Title: Re:クラスの練習で出たエラーを解決できません    
パッと見た感じクラスの最後にセミコロンが無いような気がします(打ち損ねでなければ)

後まぁ、無くてもいいんだけどprivate定義が無いのかな。

class CObject{
private:
int ObjectX, ObjectY;

public:
CObject();
CObject(int, int);
void set_ObjectX(int X);
void set_ObjectY(int Y);

int get_ObjectX()const;
int get_ObjectY()const;
};


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

Name: conio [URL]  ..上級者(24,317ポイント)   Date: 2009/06/28(日) 20:52   No:35926     
Title: Re:クラスの練習で出たエラーを解決できません    

見たところ、セミコロンが無いですね。
クラスを囲んでいるカッコのあとにはセミコロンが必要です。
------------------------------------------------------
class CObject{
int ObjectX, ObjectY;

public:
CObject();
CObject(int, int);
void set_ObjectX(int X);
void set_ObjectY(int Y);

int get_ObjectX()const;
int get_ObjectY()const;
};  ←
------------------------------------------------------


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

Name: エック  ..ぴよぴよ(620ポイント)   Date: 2009/06/28(日) 20:56   No:35928 解決!     
Title: Re:クラスの練習で出たエラーを解決できません    
ただいま試してみたところ、うまくビルドすることができました。
本当にありがとうございました。
こんな単純な事に気がつかなかったことが、恥ずかしいです。
以降は、自分で気がつくように精進したいです。


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



Name:  ..ぴよぴよ(68ポイント)   Date: 2009/06/28(日) 02:07   No:35879       
Title: ご質問があります。    
はじめまして。こんにちは。寺といいます。よろしくお願いします。

ご質問があります。

類似既存スレが存在していたらごめんなさい。

つい最近DXライブラリの存在を知り、大学の講義の足しになればと思いいじっているのですが、

DXライブラリ内で定義されてるキーボード入力関連関数、及びその自作関数において

一部のキーの入力を受け付けてくれません。

具体的に

KEY_INPUT_LSHIFT KEY_INPUT_RSHIFT
KEY_INPUT_LCONTROL KEY_INPUT_RCONTROL
KEY_INPUT_ESCAPE KEY_INPUT_SPACE
KEY_INPUT_PGUP KEY_INPUT_PGDN
KEY_INPUT_END KEY_INPUT_HOME
KEY_INPUT_LEFT KEY_INPUT_UP
KEY_INPUT_RIGHT KEY_INPUT_DOWN
KEY_INPUT_INSERT KEY_INPUT_DELETE

の処理を受け付けてくれません。

疑問に思い龍神録のキー処理のプログラムをビルドしてみると(この場合
KEY_INPUT_LEFT KEY_INPUT_UP
KEY_INPUT_RIGHT KEY_INPUT_DOWN )
こちらは正常に機能していました。ソースコードはミスしていなかったのでvisual studioのDXライブラリの初期設定でミスしたのかと思いかれこれ十数時間過ごしたのですが結局わかりません。

コンパイラはvisual studio2008 professional editionです。

visual studioになれていないためこんな初心的な質問をしてすみません。


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


Name: Justy  ..伝説なるハッカー(381,356ポイント)   Date: 2009/06/28(日) 02:19   No:35880     
Title: Re:ご質問があります。    

>ソースコードはミスしていなかったので

 多分そのソースコードにミスがあります。
 しかし、ソースがないので具体体にどこに問題があるのかはわかりません。
 
 察するに ProcessMessage()とか GetHitKeyStateAll()を定期的に呼び出していない、
ってところではないでしょうか。


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

Name:  ..ぴよぴよ(203ポイント)   Date: 2009/06/28(日) 03:21   No:35882     
Title: Re:ご質問があります。    
返信ありがとうございます。

身近な関数でいうと

CheckHitKeyAll  
CheckHitKey  
GetHitKeyStateAll
WaitKey

等を単体で呼びだしてもうまく処理してくれなく

ゲームプログラミングの館のソースコードを使ってもうまくいっていないのでコードのミス以前の問題だと思います。

あと起こっている事象として龍神録のソースコードをコピペしてCheckStatePadを使った場合パッドのほうの操作しか受け付けてくれません。KEY_INPUT_UPをKEY_INPUT_Zとかに変えた場合、ちゃんとZキーの操作を受け付けてくれます。


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

Name: ねこ  ..上級者(16,602ポイント)   Date: 2009/06/28(日) 11:32   No:35893     
Title: Re:ご質問があります。    
ループしている処理の中に以下のソースを加えて、各キーを押しても反応しないということですか?
だとしたらドライバとかの問題になるのかな。。。
そのあたりはDxLib本家のBBSで使用しているOS,キーボード等の情報を添えて管理人さんに聞いてみると良いかもしれません。


// キーの取得
char cKey[ 256 ];
memset( cKey ,0 ,sizeof( cKey ) );
GetHitKeyStateAll( cKey );
if( cKey[ KEY_INPUT_LSHIFT ] )
{
// 左SHIFT
OutputDebugString( "KEY_INPUT_LSHIFT\n" );
}
else if( cKey[ KEY_INPUT_RSHIFT ] )
{
// 右SHIFT
OutputDebugString( "KEY_INPUT_RSHIFT\n" );
}
else if( cKey[ KEY_INPUT_LCONTROL ] )
{
// 左CTRL
OutputDebugString( "KEY_INPUT_LCONTROL\n" );
}
else if( cKey[ KEY_INPUT_RCONTROL ] )
{
// 右CTRL
OutputDebugString( "KEY_INPUT_RCONTROL\n" );
}
else if( cKey[ KEY_INPUT_SPACE ] )
{
// SPACE
OutputDebugString( "KEY_INPUT_SPACE\n" );
}


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

Name:  ..ぴよぴよ(527ポイント)   Date: 2009/06/28(日) 14:31   No:35900     
Title: Re:ご質問があります。    
上記のソースコードをループに加えてみました。

結果としてOutputDebugString関数においてKEY_INPUT_LSHIFTとKEY_INPUT_SPACEは機能しましたが、他のキーは機能しませんでした。

一方

CheckHitKeyAll  
CheckHitKey  
GetHitKeyStateAll
WaitKey

ではSPACEキーは反応しLSHIFTキーは反応しませんでした。

個人的に調べてわかったことが一つあるのですが、龍神録のソースファイル、ヘッダーファイルを全部消して自分の.cpp .hに置き換えてみるとなぜかうまく反応してくれないキーが反応してくれました。そこで以前と何が異なるかvisual studioの各設定、及び機能を模索していると龍神録のソリューション内にあるリソースファイルの存在が異なるので一度ソリューションからリソースファイルを削除し実行してみるといままでどおり一部のキーが機能しなくなりました。つまり原因はDxLibに関する.h .libであるところまではわかりました。

しかしなぜかはまだわかりません。


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

Name: dic  ..プログラマー(25,246ポイント)   Date: 2009/06/28(日) 15:05   No:35901     
Title: Re:ご質問があります。    
似たような体験で
キーボードが壊れてたという経験が私にはあります

コーヒーをキーボードにやっちゃいまして


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

Name: ねこ  ..上級者(17,002ポイント)   Date: 2009/06/28(日) 15:17   No:35902     
Title: Re:ご質問があります。    
以下のサイトあたりから「キーボードの入力キーコード」をチェックしてみてください。
このへんでちゃんと入力が取れていたらDxLib側に何か不具合があるのかもしれませんね。

// 1番上のツール
ttp://www.geocities.co.jp/SiliconValley-Oakland/2489/soft/soft1.htm
// 下の方のFLASH
ttp://hakuhin.hp.infoseek.co.jp/main/as3/key_board.html


また、本来DxLibを使わない場合は以下のようなプロセスでキー入力を取得したりします。
余力あったら試してみても良いかもです。


// ウィンドウプロシージャ
LRESULT CALLBACK WndProc( HWND hWnd, UINT msg, WPARAM wp, LPARAM lp )
{
switch ( msg )
{
case WM_CLOSE:
// ウインドウが閉じられた( アプリケーションを終了する )
PostQuitMessage( 0 );
break;
case WM_KEYDOWN:
// キースクリプト
return 0;
case WM_KEYUP:
// キーアップ
return 0;
}
}



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

Name:  ..ぴよぴよ(789ポイント)   Date: 2009/06/28(日) 20:01   No:35921     
Title: Re:ご質問があります。    
ご返答ありがとうございます。

個人的な問題は残っていますが疑問は解決しました。

まず自身のPCのキー入力は正常でした。

ここで自身の作ったプログラムをOSがXPの別のPC(現在はvista)で実行させてみるとうまく処理されていました。

つまりPCの問題でした。

ただ龍神録のプログラムではうまくいっていたので現在DXライブラリVer2.25bを使っていたのですが今後は別のVerでなんとか今のPCで実行できるよう模索していこうと思います。

思えば現在のPCで龍神録のダウンロード及び龍神録を正常にインストールできなかったんですよね。実行してみるとキー操作がめちゃめちゃのプログラムになってて…しかたなくXPのPCでインストールしたデータを持ってきたんですが…よくPCゲームであるvistaは規格外ってやつなんですかね…

とりあえず現在のPCでの正常起動ができないと個人的に困るんでがんばっていきます。

しかし疑問のほうは解決しました。

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


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

Name:  ..ぴよぴよ(795ポイント)   Date: 2009/06/28(日) 20:02   No:35922 解決!     
Title: Re:ご質問があります。    
解決しました。

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



Name: 鈴虫  ..ぴよぴよ(259ポイント)   Date: 2009/06/28(日) 04:10   No:35883       
Title: こんな時どうします・・・    
はじめまして、鈴虫です。
質問させてもらいます。

プログラミングの館にあった関数GetHitKeyStateAll_2を使います。
だいぶ大まかに書きますが・・・


int Key[256];
int count=0;

GetHitKeyStateAll_2(Key)==0;

if(Key[KEY_INPUT_RETURN] == 1 && count == 0){
処理1
count++;
}
if(Key[KEY_INPUT_RETURN] == 1 && count == 1){
処理2
count++;
}
if(Key[KEY_INPUT_RETURN] == 1 && count == 2){
処理3
count++;
}


というようなプログラムがあるとします。
この場合、エンターを1回押すと、処理3までいってしまいます。
でもエンターを押すごとに1つずつ処理を行わせたいわけです。
皆さんならどうしますか?


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


Name: 山崎  ..上級者(15,528ポイント)   Date: 2009/06/28(日) 08:38   No:35884     
Title: Re:こんな時どうします・・・    
おはようございます。

私もボタン押下の部分をこないだ作っていて、
こういった問題をどうしようか考えていました。

鈴虫さんが提示するようなコードならば、私はこのようにするかと思います。

if(Key[KEY_INPUT_RETURN] == 1)
{
switch(count)
{
case 1:
処理1;
break;
case 2:
処理2;
break;
case 3:
...
}
count++;
}


実際ゲームを作るとしたらコードはもうちょっと複雑になると思うので
その時もこの「if文の中にswitch文」の方式にするかどうかはちょっとわかりませんが、
提示されたコードを書き換えるならこういう感じで差し支えないのでは、と考えます。

実際の場合ですと、おそらくcountの値による分岐の条件が
もうちょっと複雑になるのでしょうなぁ。


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

Name: sizuma [URL]  ..入門者(3,251ポイント)   Date: 2009/06/28(日) 09:14   No:35886     
Title: Re:こんな時どうします・・・    
処理の最後に前回のkeyの状態を保存しておいて、前回のkeyがリリースだったら処理をする
てするかな
簡略化しないでこれだけの処理だったら、2個目のifをelse ifに変えればいいと思いますけど

DXライブラリ使ったことないんで、KEY_REREASE_RETURNみたいにdefineされてるのかはわからないんですが;
・・・ヘッダ覗いてみたらinputしか定義してなかったですね。
&& !pre_key[KEY_INPUT_RETURN]
ですかね


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

Name: Dixq (管理人) [URL]  ..ウィザード(1,039,376ポイント)   Date: 2009/06/28(日) 10:43   No:35890     
Title: Re:こんな時どうします・・・    
最初の
GetHitKeyStateAll_2(Key)==0;
は何を意味しているのでしょう?

後、このようなif文はelseでつなげるといいですよ。

if(){
}
else if(){
}
else if(){
}

とすれば全部の条件を通ってしまう事が防げます。


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

Name: sizuma [URL]  ..入門者(3,395ポイント)   Date: 2009/06/28(日) 13:25   No:35899     
Title: Re:こんな時どうします・・・    
おっと失礼・・・
僕の
>2個目のifをelse ifに

2個目からのifをelse ifでした

素人目からですが。
Enterを押したときだけの処理を記述するなら
CheckHitKeyを使った方がいいのではないかと思いますが


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

Name: 鈴虫  ..ぴよぴよ(298ポイント)   Date: 2009/06/28(日) 16:26   No:35907 解決!     
Title: Re:こんな時どうします・・・    
else if()を使ってやってみたところ、うまくいきました。
アドバイスをくれた皆さん、本当にありがとうございました。

>>GetHitKeyStateAll_2(Key)==0;
>>は何を意味しているのでしょう?

ゲームループ毎に必ず呼び出す関数なので、ループ毎に必ず通るところという意味で、そこで状態を保存しています。
最初に書いたプログラムは関数の一部分で、それが何回か呼び出されています。
説明不足ですみません。


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



Name: AS  ..初心者(6,152ポイント)   Date: 2009/06/28(日) 16:06   No:35904       
Title: デバッグ関数の最初が異様に長い    
以前ここの掲示板でFPSが60にならない症状の相談に来たものです。
http://www.play21.jp/board/formz.cgi?action=res&resno=31322&page=&lognum=97&id=dixq&rln=31674

あの時は垂直同期を取るとFPSが50〜55程度になってしまうので、垂直同期を取らなくして、60に安定させることに成功したがティアリングは発生してしまう。
という結果に落ち着きまして、現在も同じ状態でプログラムしています。

そして最近、デバッグ支援関数を作ってみよう。
の回を参考に、FuncTimeCount関数を実装してみたところ、
垂直同期を取ると「最初」が異様に長いことがわかりました。
垂直同期を取らなければ一変して「待ち時間」が長くなります。

どれぐらいかといいますと、龍神録の実装テスト画面では最初が多くても14ms以下、待ち時間も多少の余裕を持っているようですが、
私は垂直同期を取ると最初が15ms前後、たまに十の位が3を記録するほどです。もちろん待ち時間はほぼ0msです。
垂直同期を取らないと、丁度「最初」と「待ち時間」が反転する感じで、待ち時間が15ms前後となります。

なんとか垂直同期を取った状態でも、60FPSを確保したいのですが、前回のスレ同様、原因はわかりませんでしょうか?


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




Name: 山崎  ..上級者(16,138ポイント)   Date: 2009/06/27(土) 16:09   No:35844       
Title: 暗い中、一部分だけ光っているように表現するには?    
お世話になっております、山崎です。
今回は、一部分だけ光っているように表現する方法について伺いに参りました。

現在、「夜の暗いフィールド上のあるオブジェクトが光を放って、そこだけ丸く明るくなっている」
という表現をしたいと思っています。

私の今作っているゲームの1フレーム中での大きな流れは、
0.ClearDrawScreen()
1.マップデータを元にマップチップを配置し、フィールドを描画する
2.フィールド上にオブジェクトを描画する
3.フィールド上の個々のオブジェクト内の処理をする(移動、当たり判定など)
4.ゲーム内の天気を画面全体に描画
5.ゲーム内の時間によって、画面全体の暗さを変化させる(昼ならそのまま、夜なら黒く)
6.ScreenFlip()
このように、フィールド上のオブジェクトを描画した後、画面全体に対して黒をブレンドし
夜の暗さを表現しております。ブレンドの方式はアルファブレンドを使っています。

夜の暗さの表現は、フィールドとオブジェクトと天気の描画の後、下のコードのように行っています。

if(Night<=Time || Time<Morning)//夜ならば
{
SetDrawBlendMode(DX_BLENDMODE_ALPHA,150);
DrawBox(0,0,640,480,GetColor(0,0,0),TRUE);//画面を暗くする
}


光を放つあるオブジェクトをフィールドに配置して、
夜暗くなってもそのオブジェクトの周りだけ昼間のように明るいままにしたいと考えていますが、
どのようにすればいいのかと悩んでおります。
このとき、オブジェクトの中心に近いほどぼうっと明るく、中心から遠いほど暗い、といった表現にしたいです。
明るいままにしたいというのは、そのオブジェクトの周りだけ丸く、あるいは楕円形に
黒がブレンドされない、という感じです。

SetDrawArea()の使用を考えたのですが、これでは矩形にしか描画領域を設定できません。
マスク処理も考えてはいるのですが、この処理は重いため、
最後の手段にしようと考えています。

どのような手法を使えば、暗い画面の一部分だけ丸く明るく表現できるのでしょうか。


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


Name: patei  ..ぴよぴよ(17ポイント)   Date: 2009/06/27(土) 17:12   No:35845     
Title: Re:暗い中、一部分だけ光っているように表現するには?    
龍神録のEDみたいに一部分だけ明るくってことですか?

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

Name: ねこ  ..中級者(14,867ポイント)   Date: 2009/06/27(土) 17:13   No:35846     
Title: Re:暗い中、一部分だけ光っているように表現するには?    
自己流ですが添付した画像を使用しています。

1.通常の描画を行う。
2.画像の左側を明るい部分の中央に描画
3.画像の右側を明るい部分の中央に描画
4.暗い部分を矩形で黒塗り描画

画像はグラデーションで円を黒で描いたものです。
中央〜中間〜外枠で0%〜0%〜100%で描いています。
本来左右に分けなくてもいい気がするんですが、なんとなく分けてます。
透明度を使えば、段々暗く。という手法も出来ます。
楕円の場合は描画関数のどれかを使ってX方向を延ばす感じで。



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

Name: Libra  ..初心者(8,855ポイント)   Date: 2009/06/27(土) 18:17   No:35848     
Title: Re:暗い中、一部分だけ光っているように表現するには?    
ねこさんの画像の白黒を反転させた画像を用いて、
減算ブレンドを使ってみてはいかがでしょうか?


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

Name: 山崎  ..上級者(16,398ポイント)   Date: 2009/06/27(土) 19:19   No:35851     
Title: Re:暗い中、一部分だけ光っているように表現するには?    
pateiさん、ねこさん、Libraさん、ご返信誠にありがとうございます。

>pateiさん
申し訳ないながら、龍神録は人がプレイしているのを脇から見たことはあるのですが、
自分でプレイしたことがありません。
エンディングがどんな感じなのかわからないので…申し訳ないです。

>ねこさん
ご紹介頂いた画像を用いて試してみたところ、
見事に一部分だけ明るいままにすることに成功しました。
本当にありがとうございます!!
楕円にするやり方も後ほど試していこうと思っています。

これに関してもうひとつ質問したいのですがよろしいでしょうか。
最後に、光っている部分以外の領域を黒で暗くするとき、
光っている部分だけをよけて矩形で画面全体を黒で塗っていくと、
何回かに分けて画面を塗っていかなければいけないですよね。
光っている部分が1つなら4回のDrawBox()で画面全体を塗りつぶすことになります。
もし光っている部分が複数あると、この画面を暗く塗りつぶす作業が大変になると思うのですが、
これを避ける手法はありますでしょうか?
SetDrawArea()が「描画できる領域のセット」ではなく「描画されない領域のセット」
だったら1度の塗りつぶしで光っている部分以外の画面全体を塗りつぶせるのですが…。

ところでもうひとつ、添付していただいた画像についてお伺いしたいのですが、
どのようにすれば、あのような画像を作成・編集できるのでしょうか?
先ほど、ペイントで読み込んで編集しようとしたところ、
画像が全て真っ黒になってしまいました。
また、私は訳あって赤を透過色にしているのですが、
添付していただいた画像は背景部分が白なのに
私のプログラムで読み込んでもちゃんと白い部分が透過されました。
どのようなテクニックを用いているのでしょうか…?

(記事一回編集しました。質問を追加しました。)


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

Name: yu  ..プログラマー(33,466ポイント)   Date: 2009/06/27(土) 19:51   No:35853     
Title: Re:暗い中、一部分だけ光っているように表現するには?    
>>どのようにすれば、あのような画像を作成・編集できるのでしょうか?
>>先ほど、ペイントで読み込んで編集しようとしたところ、
>>画像が全て真っ黒になってしまいました。

pngにはαチャンネルというものがあって
不透明度の値を保存しています。
α値が高いほど不透明です (確か;

windowsに付属で付いているペイントではαチャンネルは確か扱えないので
フリーのペイントソフトで編集するのをお勧めします

自分は Gimp を使っています
フリーですが中々高機能だと思います


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

Name: ねこ  ..上級者(15,238ポイント)   Date: 2009/06/27(土) 20:29   No:35859     
Title: Re:暗い中、一部分だけ光っているように表現するには?    
>山崎さん
<透過
透過はyuさんも言われてますようにαチャンネルという要素があり
上手く説明できないのですが、白い部分は「透明」なので画像を描画しても何も表示されない状態になっています。

<作成・編集
私の作成方法はAdobe FLASH CS4で作画⇒PNGで書き出しという形を取っています。
PNG画像となっているため、書き出した画像から再編集は難しいです。
またグラフィック系ツールはAdobe製品のFLASHとPhotoShopで作業しているため
作成について、フリーで出来るようなものとかがちょっと分かりません。
yuさんの仰るGimpというツールを見てみたところPhotoShopに近い感じなのでいけそうかなぁと。
すいません、確信が持てません(汗)

作業したFLASH CS4には30日無料体験版というのもありますので、
フリーで難しかったらお試しに落として見るのも良いかもしれません。

<複数の場合
すいません、僕もその問題は解決できていません。
理論的には画面全体への黒塗りに対してLibraさんのいうような減算処理を複数加えて、最終的に描画すればいいのだと思うのですが
その方法を見つけるに至っていません。
また、複数の場合は明るい部分が重なった時、添付した画像をそのまま描画すると重なって変な表示になります。複数の場合だと減算処理は最終的に必須になります。





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

Name: チルチル  ..プログラマー(27,537ポイント)   Date: 2009/06/27(土) 22:41   No:35867     
Title: Re:暗い中、一部分だけ光っているように表現するには?    
横から失礼します

>>もし光っている部分が複数あると、この画面を暗く塗りつぶす作業が大変になると思うのですが

流れが良く理解できていないので全然違うことを言ってるかもしれませんが
画面全体を暗くした後にオブジェクトの周りだけ加算ブレンドすれば良いんじゃないでしょうか?


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

Name: Libra  ..初心者(8,976ポイント)   Date: 2009/06/27(土) 23:03   No:35869     
Title: Re:暗い中、一部分だけ光っているように表現するには?    
ペイントで編集するのであれば、自分は「Logo!」
というフリーソフトを使っています。
本来の使い方ではないのですが、背景のグラデーション機能を
使って画像を作ることができます。
左:減算ブレンドすれば、黒い部分が出て見える
右:こんな画像も設定で作れます。
(Windowsペイント編集可)


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

Name: yu  ..プログラマー(33,652ポイント)   Date: 2009/06/27(土) 23:38   No:35870     
Title: Re:暗い中、一部分だけ光っているように表現するには?    
>>オブジェクトの周りだけ加算ブレンドすれば良いんじゃないでしょうか?

加算ブレンドは透明度が高くなるというわけでは無いと思うので
不可能だと思います・・・(間違ったこと言ってたらすみません;)


>>複数の場合

処理負荷を犠牲にしても良いならこんな方法でも一応・・・
ですが、完全な円ではないので荒いです;
後、今即席で作ったので多分どこかでおかしなことをしているかと思います。
実際に使うのなら是非自分で書き直してください;

今思いましたがこの方法なら DrawPolygonBase関数 でやらなくても普通にできそうですね;


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

Name: 山崎  ..上級者(15,820ポイント)   Date: 2009/06/28(日) 00:45   No:35872     
Title: Re:暗い中、一部分だけ光っているように表現するには?    
yuさん、ねこさん、チルチルさん、Libraさん、ご返信誠にありがとうございます。

PNGファイルにもαチャンネルというものがあるんですね。
DXライブラリにαチャンネルという機能が事は知っていましたが、
PNGファイルにももともとその機能があるとは知りませんでした。
かなり役に立ちそうなので、機会があれば積極的に使っていきたいと思います。
お教え頂き本当にありがとうございます。

yuさんにご紹介いただいたGINPというフリーソフト、
早速ダウンロードさせていただきました。
まだ使い方はわかりませんが、これから試しに使っていこうと思います。
グラデーションができるペイントソフトを探していたので、非常に助かりました。

それで本題の明かりの表現なのですが、
画面全体をαブレンドで黒を塗る→オブジェクトの描画→オブジェクト周辺に白で加算ブレンド
画面全体を減算ブレンドで白を塗る→オブジェクトの描画→オブジェクト周辺に白で加算ブレンド
この二つを試してみましたが、どちらも満足のいく結果ではありませんでした。

ちょっと自信がないですが、ここでyuさんやLibraさんやねこさんがおっしゃる方法は、
1.画面にマップとオブジェクトを描画
2.中心が黒で外側が白のグラデーション円を、光らせたい部分に減算ブレンド
3.グラデーション円を描画した部分以外をSetDrawArea()で描画領域に指定
4.画面全体に黒をαブレンド
ということでよろしいでしょうか?
3の処理はやはり避けられないのでしょうか。

yuさんに添付していただいたコードですが、
こちらでビルドしてみたところ
LINK : warning LNK4098: defaultlib 'MSVCRTD' は他のライブラリの使用と競合しています。/NODEFAULTLIB:library を使用してください。
LIBCMTD.lib(dbgheap.obj) : error LNK2005: __CrtSetCheckCount は既に MSVCRTD.lib(MSVCR90D.dll) で定義されています。
など、39個のエラーが出てしまいました。
せっかく考えていただいたのに申し訳ございません・・・。


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

Name: Justy  ..伝説なるハッカー(381,240ポイント)   Date: 2009/06/28(日) 01:36   No:35874     
Title: Re:暗い中、一部分だけ光っているように表現するには?    
# 山崎さん
>夜暗くなってもそのオブジェクトの周りだけ昼間のように明るいままにしたいと考えていますが、
>どのようにすればいいのかと悩んでおります

 こういうのはどうでしょう。
 一応画面全体が暗くなって、10個のライトがうろちょろします。

mod_uploader
ttp://toku.xdisc.net/u/download/1246161160.zip

pass:qwer


----- 説明
・ libディレクトリに DXライブラリ一式を入れて下さい
・ slnは VisualStudio2008 SP1で作られていますので、それ以外の場合は開けないかもしれません。
 その場合はソリューション・プロジェクトを作り直してください。
・ ソースコード上の BUILD_MORE_BRIGHTNESS定義を有効にするともう少し明るくなります。


 具体的な処理は UserLoop()の中で行っているので、その処理を追ってください。
 全体の暗くなる度合いは SetBackgroundColor()で調整出来ます。


2009/06/28 12:26 コードを修正


# チルチルさん
>画面全体を暗くした後にオブジェクトの周りだけ加算ブレンドすれば良いんじゃないでしょうか

 暗くなった画面に対する加算は(薄く暗くしたのならそんなに目立たないのですが)
色の範囲が狭くなった状態に対して加算することになるので、思っていたような絵に
ならない気がします。



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

Name: ねこ  ..上級者(15,893ポイント)   Date: 2009/06/28(日) 01:41   No:35875     
Title: Re:暗い中、一部分だけ光っているように表現するには?    
やりたい事を疑似的に再現してみてました。



// 新画像ハンドル保持用グローバル変数
int g_Handle = -1;
// ===============================================
// [ 初期化時 ]
// 添付の画像を読み込む
int iLight = LoadGraph( ".\\Img\\Temp2.png" );

// 全体を白で塗潰す
DrawBox( 0, 0, 640, 480, RGB_WHITE, TRUE );

// サンプルに2ヵ所程描画する
DrawGraph( 100, 100, iLight );
DrawGraph( 400, 200, iLight );

// 画面の画像を取得
g_Handle = MakeGraph( 640, 480 );
GetDrawScreenGraph( 0, 0, 640, 480, g_Handle );

// スクリーンクリア
ClsDrawScreen();

// ===============================================
// [ 描画時 ]
// 現在で上記で作った画像を描画する
if( g_Handle != -1 )
{
SetDrawBlendMode( DX_BLENDMODE_SUB, 255 );
DrawGraph( 0, 0, g_Handle, TRUE );
SetDrawBlendMode( DX_BLENDMODE_NOBLEND, 0 );
}


山崎さんの作られてるものはスクロールもあると思うのですが、その場合は何枚か用意するって事でここでは割愛させてもらいます。

1.マップ変更時等の初期化処理で白塗りに明かりの箇所に添付した座標を描画しておく
2.明かりの箇所を描画し終えた時点での画面ハンドルを取得する
3.オブジェクト等描画後に「描画処理」の内容を描画する。真っ暗にするなら255、うっすら暗くするなら64等調整する。

スクロールする場合は何枚か作っておいてマップチップのようにずらして表示する。

なおこの処理の場合明かりが消灯する程度なら2枚用意したり出来ますが、
主人公キャラに合わせて変更(主人公キャラ周辺を明るくする)となるとリアルタイムに再取得する必要があるため処理負荷が高くなります。

一応これ使えないかなぁって思ってるのが「DrawBlendGraph」関数なんですが、
あんまり意味分かって無くて試せてません。


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

Name: ねこ  ..上級者(15,910ポイント)   Date: 2009/06/28(日) 01:49   No:35876     
Title: Re:暗い中、一部分だけ光っているように表現するには?    
添付してなかった(汗) 添付します。

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

Name: ねこ  ..上級者(16,003ポイント)   Date: 2009/06/28(日) 02:03   No:35878     
Title: Re:暗い中、一部分だけ光っているように表現するには?    
>Justyさん
スレ主さんじゃないですが感動しました。SetDrawScreenはこんな使い方もできるんですね。
そしてDrawGraphの引数にもなるとは・・・
今ある処理の中でも「手間」になってた処理を簡略化できそうです。大変参考になりました。


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

Name: Justy  ..伝説なるハッカー(381,595ポイント)   Date: 2009/06/28(日) 02:44   No:35881     
Title: Re:暗い中、一部分だけ光っているように表現するには?    

>SetDrawScreenはこんな使い方もできるんですね

 途中で描画先を切り替えられる、というのはいろいろ使いどころがありますよね。

 難を言うなら、MakeScreen()は GPUの性能が低い場合……多分新たなレンダリング先の
バッファが用意できなくて……失敗することがあることでしょうか。
(今時のなら大丈夫だとは思いますが)

 低スペックでも動くように作るならねこさんが書かれたような GetDrawScreenGraph()の方が
いいのかもしれません。


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

Name: yu  ..プログラマー(33,733ポイント)   Date: 2009/06/28(日) 10:24   No:35887     
Title: Re:暗い中、一部分だけ光っているように表現するには?    
>>Justy様

他の画面に暗さとライトを描画してから
その画面を乗算ブレンドで裏画面に描画・・・

ねこ様と同じく、こんな使い方ができたのかと感動しました
非常に参考になりました〜


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

Name: 山崎  ..上級者(16,258ポイント)   Date: 2009/06/28(日) 10:28   No:35888 解決!     
Title: Re:暗い中、一部分だけ光っているように表現するには?    
Justyさん、ねこさん、ご返信誠にありがとうございます。
返答が遅くなって申し訳ございません、Justyさんに紹介頂いたプログラムを読み解いておりました。

>Justyさん
紹介頂いたコードを実行させて頂きました。
まず驚いたのは、丁寧にインデントやコメント、改行が施された見やすいソースコードです。
細部まで見やすくわかりやすいように気遣われていて、う〜んとうなりながら読んでおりました。
教科書にでも載りそうな洗練されたコードだと感じました。

SetBackgroundColor、GetDrawBlendMode、SetDoubleStartValidFlag、MakeScreenなど
見慣れない関数に戸惑いましたが、なんとかプログラムを読み解くことができました。
1.MakeScreenでスクリーンをサブ画面として新たに用意する
2.サブ画面全体を暗く(黒く)塗りつぶし、光の部分だけを白く塗る
3.裏画面に背景やオブジェクトを描画する
4.裏画面にサブ画面を乗算ブレンドする
この処理をすることによって、部分的に明るくして、その部分以外を一度に暗くできるのですね。
大変勉強になりました。
早速この処理を私のゲームに実装させていただきます!
おかげさまで悩んでいたことが解決いたしました、感謝の言葉もございません!

>ねこさん
ねこさんに紹介頂いたコードも、是非とも参考にさせて頂きますね。
画像も添付していただき、本当にありがとうございました。



ところで、先ほど上であげたMakeScreenやSetDoubleStartValidFlagなどの関数なのですが、
これらの関数のリファレンスや説明などはどこかにあるのでしょうか?
DXライブラリのサイトのリファレンスを検索しましたが見当たりませんでした。
記事は今回で「解決!」にさせて頂きますが、
もしご存知の方がいらっしゃいましたら教えて頂けると幸いです。


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

Name: yu  ..プログラマー(33,832ポイント)   Date: 2009/06/28(日) 10:31   No:35889     
Title: Re:暗い中、一部分だけ光っているように表現するには?    
>>これらの関数のリファレンスや説明などはどこかにあるのでしょうか?

非公開関数なのでリファレンスには無いと思います
ヘッダファイルにどのような関数なのかはコメントしてありますよ


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

Name: 山崎  ..上級者(16,440ポイント)   Date: 2009/06/28(日) 10:47   No:35891     
Title: Re:暗い中、一部分だけ光っているように表現するには?    
yuさん、ご返信ありがとうございます。

先ほどDxLib.hの中を確認して参りました。
知らない関数がたくさんありましたが、中には使えそうなものもありました。
お教えいただき、ありがとうございます。



MakeScreenなど、リファレンスには載ってなくても使いどころのありそうな関数を
まとめたサイトやテキストファイルなどがあれば便利そうですね。
…もしかして既にあるのでしょうか。
でも本家のリファレンスに載っていないという事は、やはりあまり多用しない方がいいのでしょうかな。


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

Name: ねこ  ..上級者(16,183ポイント)   Date: 2009/06/28(日) 11:18   No:35892     
Title: Re:暗い中、一部分だけ光っているように表現するには?    
>Justyさん
なるほど、負荷はGPUのメモリにかかっちゃうのですね。気を付けて使ってみようと思います。

>山崎さん
一時DxLibWikiみたいなものがあったようですが、なんか揉めて停止しちゃってますね。
その周辺にDxLib公式にない関数のリファレンスがちょこっとありました。

公式BBSを見ていると、何か要望があって管理人さんが対応した関数を作って
リファレンスには反映していない、というものが多いみたいです。
名前を見て気になる関数があったら、公式BBSで検索してみるとサンプルコード等見つかるかもしれません。


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

Name: Justy  ..伝説なるハッカー(381,838ポイント)   Date: 2009/06/28(日) 13:18   No:35898     
Title: Re:暗い中、一部分だけ光っているように表現するには?    

>おかげさまで悩んでいたことが解決いたしました

 解決して何よりです。


>関数のリファレンスや説明などはどこかにあるのでしょうか

 一覧を見たい場合には使えないのですが、1つの関数の挙動の詳細を知りたい場合は
DxLibMakeの方のソースを追って調べるという手もあります。

 いろいろあちこち飛ぶんで、慣れないと追いづらいんですが、確実です。


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



Name: 亀猫  ..ぴよぴよ(87ポイント)   Date: 2009/06/27(土) 14:25   No:35840       
Title: 関数リファレンス    
こんにちは。初めて質問させていただきます。初心者です。

DXライブラリの関数リファレンスは合ったのですが、VC++2008の関数リファレンスがありません・・。
元からないのでしょうか?
ゲームプログラミングの館で分からない関数が沢山あるので、VC++2008の関数の一覧・意味が書いてあるサイトを教えてください・・・。


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


Name: ねこ  ..中級者(14,744ポイント)   Date: 2009/06/27(土) 14:33   No:35841     
Title: Re:関数リファレンス    
VC++2008のリファレンス、なのかは分かりませんが標準関数の説明としてマイクロソフトにMSDNというページがあります。

ただ、膨大の量のページなので分からない関数名でGoogleとかで検索していった方が一つ一つ理解していくのは早いかもしれません。
オフィシャルではないですが、よく使う関数一覧を説明しているサイトも多くありますので
その中から一つを使うというのも手です。

最初の一歩は「関数名で検索」が良いかと僕は思います。


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

Name: 山崎  ..上級者(15,223ポイント)   Date: 2009/06/27(土) 14:42   No:35842     
Title: Re:関数リファレンス    
こんにちは。

ねこさんのおっしゃるとおり、最初は関数名で検索して、
いろんなリファレンスが載っているページを探してみるのがいいかと思います。

一応、私がよく使っているC++の関数リファレンスのサイトを紹介いたします。
ttp://www.cppll.jp/cppreference/

ちなみに、MSDNのリファレンスは量が多くて、
もう何がなんだかわからなくて私は使っておりません(苦笑)
読んでもよくわからない、というのが正直なところですが…。


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

Name: sizuma [URL]  ..入門者(3,071ポイント)   Date: 2009/06/27(土) 15:18   No:35843     
Title: Re:関数リファレンス    
MSDNは確かにわかりにくいですよね
山崎さんの紹介されてるサイトは見やすそうです。

標準ライブラリで分からない関数が多いのならば、Cの文法もよく分からないのでは?
Cは文法のページも多いので検索すればすぐヒットすると思います・・
猫でもわかるプログラミング とか?

サイトではないですが、僕は独習Cを買いました。
まぁわかりづらいのでオススメはしませんが。安さに目がくらみ。初版だと600円ぐらい
K&Rだとライブラリの説明が充実してるみたいです。
もってないので見たことはない(苦笑

サイトがダメなわけではありませんが、僕は書籍で勉強するのが好きです。
あと先生とよくわからないことについてがっつり話し合う


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

Name: 亀猫  ..ぴよぴよ(171ポイント)   Date: 2009/06/27(土) 19:54   No:35854 解決!     
Title: Re:関数リファレンス    
返信ありがとうございます。
一つ一つ検索しながら理解していきます。
また、山崎さんが紹介しているサイトも参考にしてみます。

まだ中学生で住んでる場所が田舎なので本屋がありません・・・。


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

Name: 山崎  ..上級者(16,461ポイント)   Date: 2009/06/27(土) 20:05   No:35855     
Title: Re:関数リファレンス    
私も田舎出身なんで、田舎の不便さはよく知っているつもりです(苦笑)
本は立ち読みして、良さそうだったら買うってのが一番いいのでしょうけど、
本屋がなくてもネットがあるならアマゾンとかで本を購入してみてはいかがでしょう。
愛読書がひとつ手元にあるっていうのは、かなり役に立つと思いますよ〜!
私は手元にハーバートシルト著の独習C++が置いてあります。
まぁ、愛読書というほど利用してはいませんが…(苦笑)
無ければ無くても大丈夫な人もいらっしゃいますしね。

さて、中学生さんですか。
私も中学生からプログラムの道に進んでいたんで、ちょっと共感してしまいますね。
田舎の不便さに負けず是非ともがんばってください!


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

Name: sizuma [URL]  ..入門者(3,187ポイント)   Date: 2009/06/28(日) 00:46   No:35873     
Title: Re:関数リファレンス    
専門書は大きな本屋じゃないと置いてないですからね。
僕は本屋で中身を物色したあと、ネットの中古品を買います。
授業で使う教科書も自分でamazonとブックオフでそろえましたし。

学校の勉強もあるだろうし、サイトを見るくらいで丁度いいとは思いますけどね^^
パソコンいじりすぎないで、部活や友人と遊ぶのを第一にすることをオススメします(笑


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



Name: bitter_orange  ..入門者(2,639ポイント)   Date: 2009/06/27(土) 18:09   No:35847       
Title: 参照渡しとchar*型    
お世話になっております。
C言語でcsvファイルから文字列(char*)を読み込みそれを参照渡ししたいのですがうまくいきません。
コードは下記の通りです。

#include <stdio.h>
#include <stdlib.h>

#pragma warning (disable:4996)

/* ファイルの読み込み */
static short File_Read(unsigned char* data, long* size)
{

FILE *fp;

if(!(fp = fopen("name.csv", "rb"))){

perror("name.csvが開けません");
return -1;

}

fseek(fp, 0, SEEK_END); // ファイルの最後にポインタを指定する
*size = ftell(fp); // ファイル自体のサイズを調べる
fseek(fp, 0, SEEK_SET); // 読み込むためにファイルの最初にポインタを指定する
data = (unsigned char*)malloc(*size);
fread(&(*data), 1, *size, fp); // 読み込み

fclose(fp); // ファイルを閉じる

return 0;

}

/* メイン */
short main(int argv,char* argc[])
{

long loop = 0, size = 0;
unsigned char* data = NULL;

if(File_Read(&(*data), &size))

return -1;


for(loop = 0; loop < size; loop++)

printf("%s\n", data);


puts("");

free(data);

return 0;

}

どのようにしたら、参照渡しができるのでしょうか?

あと、もう一つ気になったのですが、このプログラムの途中に malloc 関数を使ってますが、
使わないとデバッグエラーが起こります。
思いつきで malloc 関数を使ってみたらうまくいった、という状態なので理由がよくわかりません。
なぜ malloc 関数が必要なのでしょうか?

OSは[Windows Vista]で開発環境は[Microsoft Visual C++ 2008 Express Edition]です。

よろしくお願いします。


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


Name: box  ..ハッカー(141,585ポイント)   Date: 2009/06/27(土) 18:35   No:35849     
Title: Re:参照渡しとchar*型    
本題の前に、ひとつ質問します。

int n = 123;
int *p;

という定義があるとします。
このとき、p が n を指すようにするには、
この後にどういう文を書けばよいでしょうか?


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

Name: bitter_orange  ..入門者(2,687ポイント)   Date: 2009/06/27(土) 19:49   No:35852     
Title: Re:参照渡しとchar*型    
box様
プログラムにしてみました。

#include <stdio.h>

int main(void)
{

int n = 123;
int* p;

p = &n;

printf("%d", *p);

*p *= 10;
printf("%d\n", n);

}

このように
p = &n
だと思います。


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

Name: box  ..ハッカー(141,789ポイント)   Date: 2009/06/27(土) 20:09   No:35857     
Title: Re:参照渡しとchar*型    

では、本題です。

main関数の
> if(File_Read(&(*data), &size))

や、File_Read関数の
> fread(&(*data), 1, *size, fp); // 読み込み

での &(*data) という表記は、単に data と書いたのと同じである、
ということはわかりますか?


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

Name: bitter_orange  ..入門者(2,645ポイント)   Date: 2009/06/27(土) 20:16   No:35858     
Title: Re:参照渡しとchar*型    
はい、わかります。

癖で書いてしまいました・・・

自分なりにポインタに関連しているということをわかりやすくするためにそうしてあります。


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

Name: non  ..熟練のプログラマー(51,018ポイント)   Date: 2009/06/27(土) 20:55   No:35860     
Title: Re:参照渡しとchar*型    
File_Readで読み込んだデータを格納する領域を確保するのにmallocを使っているわけですよね。
そして、その領域の先頭アドレスを返している。

もし、関数側でauto型の変数を用意し、そのアドレスを返しても、関数から戻ったときにその
領域が使えなくなるからです。呼び出し側の関数で領域を確保するか、グローバル変数にするか
このようにmallocしてヒープ領域に確保するか、staticにして静的領域にとるかしないといけない
からです。

さて、もう一つの質問
>C言語でcsvファイルから文字列(char*)を読み込みそれを参照渡ししたいのですがうまくいきません。
どういう意味ですか?
呼び出し側の関数で領域を確保するか、グローバル変数にするかってことですかね?


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

Name: box  ..ハッカー(142,070ポイント)   Date: 2009/06/27(土) 21:08   No:35861     
Title: Re:参照渡しとchar*型    

端的に言いまして、質問者さんのソースは、下記と同じことをしています。
つまり、呼び出された関数の中で行なったことが、呼び出し元に反映できていないのです。
なぜなら、関数を呼び出すときに、中身を変更したい変数(下例ではp)のアドレスを渡していないためです。


#include <stdio.h>
#include <stdlib.h>

void func(char *p)
{
p = malloc(100);
strcpy(p, "xyz");
printf("【func】p=%s\n", p);
}

int main(void)
{
char *p = "abc";

printf("【main】func関数実行前のp=%s\n", p);
func(p);
printf("【main】func関数実行後のp=%s\n", p);

free(p);
return 0;
}



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

Name: bitter_orange  ..入門者(3,232ポイント)   Date: 2009/06/27(土) 21:46   No:35862     
Title: Re:参照渡しとchar*型    
non様
box様
解説ありがとうございます。

non様
確かにauto型なので戻った時におかしくなってします。
そこは気づきませんでした。ご指摘ありがとうございます。
しかし、main関数に戻る前に File_Read 関数の fread 関数でデバッグエラーが起きてしまいます。
(説明不足で申し訳ありません)

>さて、もう一つの質問
>>C言語でcsvファイルから文字列(char*)を読み込みそれを参照渡ししたいのですがうまくいきません。
>どういう意味ですか?
>呼び出し側の関数で領域を確保するか、グローバル変数にするかってことですかね?
下記のように送った先の関数で値をうまく変化させられません。

#include <stdio.h>

void add(int a, int *b)
{

a += 10; // 値渡し
*b += 10; // 参照渡し

}

int main(void)
{

int a = 0, b = 0;

add(a, &b);

printf("%d %d\n", a, b);

}

box様
はい、アドレスが渡せないのはわかっていますが、char* strのようなポインタがあると、
アドレスを渡す方法がよくわかりません。
インターネットで調べても私が見た限り char[100]のような 配列で行っているので、わかりません。
どのようにすればよいのでしょうか?


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

Name: non  ..熟練のプログラマー(51,094ポイント)   Date: 2009/06/27(土) 21:48   No:35863     
Title: Re:参照渡しとchar*型    
ああ、そういうことですか。よくプログラムを見ていませんでした。失礼しました。


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

Name: non  ..熟練のプログラマー(51,112ポイント)   Date: 2009/06/27(土) 21:58   No:35864     
Title: Re:参照渡しとchar*型    
return data
で確保したアドレスを返します。


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

Name: non  ..熟練のプログラマー(51,353ポイント)   Date: 2009/06/27(土) 22:03   No:35865     
Title: Re:参照渡しとchar*型    
ごめんなさい。参照渡しでないといけないのですね。
boxさんのプログラムを使わせてもらうと、

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

void func(char **p)
{
*p = malloc(100);
strcpy(*p, "xyz");
printf("【func】p=%s\n", *p);
}

int main(void)
{
char *p = "abc";

printf("【main】func関数実行前のp=%s\n", p);
func(&p);
printf("【main】func関数実行後のp=%s\n", p);
free(p);
return 0;
}


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

Name: bitter_orange  ..入門者(3,322ポイント)   Date: 2009/06/27(土) 22:38   No:35866 解決!     
Title: Re:参照渡しとchar*型    
non様
サンプルコード等ありがとうございます。
ポインタのポインタの存在は知っていましたがこうやって使うんですね。
正しく表示されました。


box様とnon様、何度も本当にありがとうございました。



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



Name: yrao  ..かけだし(2,034ポイント)   Date: 2009/06/27(土) 00:45   No:35826       
Title: ボスのカットインについて    
こんばんは。


プログラミングの館のプロジェクトを参考にシューティングを作らせていただいてるものです。



ボスのカットインについて質問です。
ボスが特定の段幕を開始する直前に、ボスの画像のカットインを入れたいのですが(東方のスペルカード宣言のような感じです)、どのようなプログラムを書けばいいのか分かりません。
カットインは自機ボムのキャラ絵のエフェクトと共通にしたいと考えています。

御助言頂ければ幸いです。


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


Name: Dixq (管理人) [URL]  ..ウィザード(1,039,065ポイント)   Date: 2009/06/27(土) 07:26   No:35831     
Title: Re:ボスのカットインについて    
そうですね〜、どんなプログラムをかけばいいと言われるとなかなか口だけでは難しいですけど、
龍神録のプログラムには結構便利な機能として
waitandenter関数

//ボスの待機処理
void waitandenter(){
int t=150;
boss.wtime++;
if(boss.wtime>t)//150カウント待機したら弾幕セット
enter_boss_shot();
}

があります。
ここに指定したカウント数だけボスが待機してくれます。
ですから、この数値を好きな数に変更して、この数が最大になるまでにカットインを入れたらいいと思います。


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

Name: yrao  ..かけだし(2,075ポイント)   Date: 2009/06/27(土) 07:48   No:35833     
Title: Re:ボスのカットインについて    
管理人様回答ありがとうございます。


そのようなものがあったのですね(゜▽

この処理は具体的にはどこに書いてやればよいのでしょうか


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

Name: yrao  ..かけだし(2,186ポイント)   Date: 2009/06/27(土) 20:07   No:35856     
Title: Re:ボスのカットインについて    
既に書いてありました…


プログラムもよく読まずに質問してしまってすいませんでした。




特定の弾幕に差し掛かったときのみ、エフェクトを入れたいのですが、どのようなプログラムを書けばよいのでしょうか?


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



Name: kai  ..ぴよぴよ(102ポイント)   Date: 2009/06/20(土) 08:00   No:35427       
Title: 無題    
質問です。
龍神録の館の50章を色々改造して遊んでるのですが
フリーで公開されてる龍神録本家での
魔方陣の色ってカラフルに色が変わりますよね
あんな風にしてみたいのですが、どこのcppにどんなソースを加えればいいのか
ちょっとよく分かりません><
知ってる方がいたら教えてください


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


Name: yu  ..プログラマー(32,006ポイント)   Date: 2009/06/20(土) 09:11   No:35428     
Title: Re:無題    
graph.cppのgraph_boss_effect()関数の中で魔方陣が描画されていますから
この関数の中でSetDrawBright関数を使って魔方陣の色を変化させれば良いと思います

処理をどうすればよいのか分からなかったら
一応自分で書いてみたのでどうぞ(あくまで一例ですので・・・)


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

Name: kai  ..ぴよぴよ(125ポイント)   Date: 2009/06/20(土) 22:22   No:35449     
Title: Re:無題    
yuさん返答ありがとうございます!
ソースを加えてみました。

しかし、魔方陣だけでなく、
画面全体の色が変化してしまいました。
これはいったい・・?どうしたら・・


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

Name: yu  ..プログラマー(32,190ポイント)   Date: 2009/06/20(土) 22:31   No:35450     
Title: Re:無題    
>>画面全体の色が変化してしまいました

Dxライブラリで SetDrawBright()関数で設定した値は
大体のグラフィック描画に影響を及ぼします
もっと適切な説明は本家リファレンスのほうに書かれていまので
そちらも覗いてみては如何でしょうか
http://homepage2.nifty.com/natupaji/DxLib/dxfunc.html

解決策は

SetDrawBright(255,255,255);

をgraph_boss_effect()内の適当な場所に書いてください
ちなみに魔方陣は上からDrawRotaGraphFdF関数2つです
その下はボスの周りをぐるぐる回っているものです


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

Name: ksi  ..ぴよぴよ(66ポイント)   Date: 2009/06/20(土) 23:12   No:35453 解決!     
Title: Re:無題    
おお!なるほど!
SetDrawBright(255,255,255);を書くことをすっかり忘れてましたw
yuさんのアドバイスのおかげで出来ました!
猛烈に感謝です!ありがとうございました!


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

Name: kai  ..ぴよぴよ(259ポイント)   Date: 2009/06/26(金) 00:50   No:35774     
Title: Re:無題    
すみません。ひとつ分からないことがあったので質問させてください。
この色を変える処理を最初からスタートした場合に初期化したいのですが
初期化がうまくいかず、2回目以降、ボスに会うと、いきなり色が変わって困ってます。
どの部分のソースを初期化すればいきなり色が変わらないようになるのか教えてほしいです。
よろしくお願いします。


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

Name: ねこ  ..中級者(12,489ポイント)   Date: 2009/06/26(金) 09:07   No:35779     
Title: Re:無題    
SetDrawBright関数やSetDrawBlendMode関数等は描画処理前に設定し、描画処理後に初期化するのが普通です。

SetDrawBright( R, G, B );
// A描画
// B描画
SetDrawBright( 255, 255, 255 );

もっとちゃんと管理したいなら、1描画処理に対してON/OFFを切り替えます。

SetDrawBright( R, G, B );
// A描画
SetDrawBright( 255, 255, 255 );
SetDrawBright( R, G, B );
// B描画
SetDrawBright( 255, 255, 255 );

と、ここまで書いてて気づいたんですがボスの情報変数のような気がしますね・・・
ボス開始時とかの初期化処理にnum=6を入れたら良さげ?


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

Name: kai  ..ぴよぴよ(289ポイント)   Date: 2009/06/26(金) 20:15   No:35814     
Title: Re:無題    
というと、具体的にどのあたりにnum=6を入れたらいいんでしょうか?

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

Name: yu  ..プログラマー(33,089ポイント)   Date: 2009/06/26(金) 23:37   No:35824     
Title: Re:無題    
>>具体的にどのあたりにnum=6を入れたらいいんでしょうか?

num を 6 にしても期待した動作にならないと思います。
すみません分かりにくいプログラムで・・・

少々強引ですが

if(boss.cnt == 1 && ( boss.knd == 0 || boss.knd == boss.danmaku_num[0] + 1 ))
{
rgb[0] = rgb[1] = rgb[2] = 255;//最初の色は白
cnt = 0;
num = 0;
}



これを SetDrawBright((int)rgb[0],(int)rgb[1],(int)rgb[2]);
の上に書いてやればいいかな・・・

本当はgraph_main()内で書くのは宜しくないので(後々のことを考えて)
boss_shot_main()内の方で色相の数値の処理をして
描画のみをgraph_main()内で行ったほうが良いかもしれません。


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

Name: yu  ..プログラマー(33,113ポイント)   Date: 2009/06/26(金) 23:45   No:35825     
Title: Re:無題    
って今自分のプログラムを見直てみたら
なんでこんな処理をしてるんだろう・・・ orz

すみません;
無駄な処理をしていたので修正してください・・・
まだまだ無駄があると思いますがw


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

Name: Justy  ..伝説なるハッカー(380,569ポイント)   Date: 2009/06/27(土) 01:08   No:35827     
Title: Re:無題    
 個人的な意見ですが、

>SetDrawBright(255,255,255);を書くことをすっかり忘れてました

 一応この処理で元の輝度に戻せますが、変更前に GetDrawBright()を使い、
元の値を保存した上で、その値を使って元に戻した方がいいかと思います。

 これは XXXDrawBrightだけの話ではなく、XXXDrawBlendModeなどの環境を制御する
Set/Get系の多くに当てはまることですが

 例えば、

void DrawA()
{
    DrawGraph(...);
}

void DrawB()
{
    DrawGraph(...);
}

void MainDraw()
{
    SetDrawBright(0, 255, 0);       // 緑
    DrawA();
    DrawB();
    SetDrawBright(255, 255, 255);   // 白に戻す
}

 のようなコードでは DrawA() / DrawB()は緑っぽい輝度で描画されることを
期待して、MainDraw()は書かれていますが、ここで、DrawA()を赤の輝度で描画したいと思い

void DrawA()
{
    SetDrawBright(255, 0, 0);       // 赤
    DrawGraph(...);
    SetDrawBright(255, 255, 255);   // 白に戻す
}

とした場合、元に戻すときに直値で白を指定指定してしまうと DrawB()が影響を
受けてしまいます。

 そこで、GetDrawBright()を使って値を取得、メモリに保存しておき、
元に戻すときはその値を使って戻すと、DrawB()は影響を受けずに済みます。

void DrawA()
{
    int r, g, b;
    GetDrawBright(&r, &g, &b);       // 値を覚えておく
    DrawGraph(...);
    SetDrawBright(r, g, b);          // その値に戻す
}

 
 さらには MainDraw()の方も同様な形にしておけば、MainDrawの呼び出し元の方で、
DrawBright値を変更されていたとしても問題なく動くことが期待できます。


 まぁ、こんな処理も毎回書くのも面倒だと思うので 
GetDrawBright()を使って値をスタック構造で保存する関数を PushEnv_DrawBright()、
最後に保存したときの値で SetDrawBrightしてくれる関数 PopEnv_DrawBright()というのを
作っておけば


void DrawA()
{
    PushEnv_DrawBright();               // この時点の DrawBright値を保存
    {
        SetDrawBright(255, 0, 0);       // 赤
        DrawGraph(...);
    }
    PopEnv_DrawBright();                // 上で保存した値で元に戻す
}

void DrawB()
{
    DrawGraph(...);
}

void MainDraw()
{
    PushEnv_DrawBright();
    {
        SetDrawBright(0, 255, 0);       // 緑
        DrawA();
        DrawB();
    }
    PopEnv_DrawBright();
}

 と書け、だいぶすっきりします。


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

Name: yu  ..プログラマー(33,226ポイント)   Date: 2009/06/27(土) 08:15   No:35834     
Title: Re:無題    
>>Justy様

なるほど・・・
かなり参考になります。ありがとうございます
今見てみると実際に影響が出てしまっています・・・
ボムを打つとボスが暗くなるはずですが
上記の理由によりボスの輝度に影響が出てしまっています;

今回初めてスタック構造というものを知りましたが
非常に便利ですね
データ構造の勉強もしてみようかと思います。


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

Name: ねこ  ..中級者(14,223ポイント)   Date: 2009/06/27(土) 10:09   No:35836     
Title: Re:無題    
うぁ、すいません。配列表示でRGBをループしてたからそこの初期化ミスかと思って6とか書いてしまいました。

ちなみに僕はこんな構造体の描画ステータスで制御してます。


#define RGB_WHITE 0xFFFFFF

typedef struct {
DWORD dwColor;
double dAlpha;
...//他描画ステータス
} DRAW_STATUS;

void DrawGraphSts( int x, int y, int GraphHandle, DRAW_STATUS* pStatus )
{
// 輝度設定
if( pStatus->dwColor != RGB_WHITE )
SetDrawBright( pStatus->dwColor );

// 透明度設定
if( pStatus->dAlpha != 1.0 )
SetDrawBlendMode( DX_BLENDMODE_ALPHA, 255 * pStatus->dAlpha );

// 他色々設定

// 描画
DrawGraph( x, y, GraphHandle );

// 輝度初期化
if( pStatus->dwColor != RGB_WHITE )
SetDrawBright( RGB_WHITE );

// 透明度設定
if( pStatus->dAlpha != 1.0 || 他ブレンド変更してたら )
SetDrawBlendMode( DX_BLENDMODE_NOBLEND, 0 );

// 他色々設定初期化
}


※ SetDrawBright( DWORD dwColor )はRGB値を渡して中でR/G/B値に分解して設定する関数

通常は常に初期状態、ステータスで描画前に設定、描画後に初期化。
DRAW_STATUS構造体を描画対象に持たせる事で他の描画設定は絶対影響しない状態にしてます。


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

Name: yu  ..プログラマー(33,353ポイント)   Date: 2009/06/27(土) 11:47   No:35839     
Title: Re:無題    
DWORD なんて見たこともなかったのですが
unsigned long を typedef したものでした

実際にやったことはないですが8bitずつずらしてRGBの値を所得しているんでしょうか
そうだと一つの変数だけで処理できるので設定の手間が減りますね

一つ一つにステータスを設定するのもいいですね〜
細かい設定が簡単にできそうです。

どちらも非常に参考になりました。ありがとうございます。


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



Name: チルチル  ..プログラマー(27,513ポイント)   Date: 2009/06/26(金) 00:39   No:35772       
Title: 商用利用について    
諸事情により掲示板で質問させていただきます

このサイトで公開されているコードや素材を少し使用したゲームを
コミケで売るのはアリでしょうか?


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


Name: Dixq (管理人) [URL]  ..ウィザード(1,038,857ポイント)   Date: 2009/06/27(土) 07:23   No:35830     
Title: Re:商用利用について    
チルチルさん、こんにちは。
すみませんが、この件についてはメールで聞いていただけないでしょうか?
また、素材は二次使用出来る物と出来ないものがあるのでご注意下さい。


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

Name: チルチル  ..プログラマー(27,521ポイント)   Date: 2009/06/27(土) 09:55   No:35835 解決!     
Title: Re:商用利用について    
ではメールで

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



Name: maki  ..ぴよぴよ(13ポイント)   Date: 2009/06/26(金) 20:22   No:35816       
Title: ロード画面    
龍神録(60章)を改造してるときに気づいたんですが、
本家みたいな最初のロード画面ってどうやって作るんでしょうか?
ロードしながら画面を表示ってのがよくわかりません。
誰か知ってる方がいたら教えてください。
出来れば、どこにこんなソースをつければ可能とか
そんな感じで教えていただけたら非常に分かりやすく助かります。


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


Name: Dixq (管理人) [URL]  ..ウィザード(1,039,304ポイント)   Date: 2009/06/27(土) 07:30   No:35832     
Title: Re:ロード画面    
実はDXライブラリはロードしながら表示という完全なマルチスレッド的処理が出来ません。
しかし、工夫次第でなんちゃってマルチスレッドは出来るかもしれません。

ロード関数と他の関数を同時に呼ぶことが出来ないのですが、
「ロード関数を一つ呼んでは、ロード中画面を表示する関数を呼ぶ」
これを何度も繰り返せばロード時間はながくなりますが、なんちゃってマルチ
(ロードも出来、ロード画面も動くと言う意味で)
になります。

一番良いのはきっと、「ロード中」の画面を表示させておいて、いっきにロード関数を全て呼ぶ方法では無いかと思います。
ロード関数を呼んでいる最中、画面の更新が出来なくても、
前回描画した内容が残っていますから、
「ロード中」を表示させてScreenFlipしてからロード関数を呼んでやればいいと思いますよ。


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



Name: 小栗  ..ぴよぴよ(545ポイント)   Date: 2009/06/26(金) 00:17   No:35771       
Title: 二点質問があります。    
初めまして、小栗と申します。

現在、趣味範囲でですがDXライブラリとサンプルを利用して
ブロック崩しを作っています。

そんな中で、どうしても解決できない現象が二つ発生したため、
質問させていただきます。



一つ目は、プログラムを実行し、しばらくブロックを消していったあと、
ウィンドウを閉じると、「ハンドルされていないWin32の例外が発生しました」と言う
メッセージが表示されてしまいます。

今までも別のプログラムを組んでデバッグを実行した時に同じメッセージが出たことがあり、
その時は、大体がメモリへの不正アクセスだったと思うのですが、
現在のプログラムで、不正アクセスを行っていそうな箇所は見つけられませんでした。

調べてもやり方がまずいのか、解決方法を発見できませんでした。

もしかしたら私の認識が間違っているかもしれないので、どういったメッセージなのか教えていただければ
幸いです。
あと、ソースを添付いたしますので、どこに問題があるかご指摘いただければ幸いです。


二つ目は、ブロックを消すボールが『バーに当たると、時々バーに吸いついたようにバーの上、あるいは下を移動して、再度画面上を移動する』という動きを見せます。
意味が伝わりにくいかもしれないので、添付したソースを実行していただいた方がわかりやすいと思うのですが……

こちらもソース上、自分では上記の現象を発生させる原因を特定できませんでした。

どこが、原因なのかをご指摘をいただけるとありがたいです。



最後に現在のOS、開発環境を記載しておきます。

OS:XP SP3
開発環境:VS2005


以上です。


よろしくお願いいたします。




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


Name: Justy  ..伝説なるハッカー(379,587ポイント)   Date: 2009/06/26(金) 01:25   No:35776     
Title: Re:二点質問があります。    

>ウィンドウを閉じると、「ハンドルされていないWin32の例外が発生しました」と言う
>メッセージが表示されてしまいます

 配列への書き込み時、配列の外に対して書き込みをしているのが
原因ではないかと思われます。
 DeleteChipNum関数で計算した xや y値は Map変数に入れる前に範囲を
チェックした方してみてください。



>『バーに当たると、時々バーに吸いついたようにバーの上、
>あるいは下を移動して、再度画面上を移動する』という動きを見せます

 これは推測ですが、図のようにボールがバーの真横から接触した場合、
ボールは上向きに反転しますが、位置的にはバーの中にありますので
次のフレームで再度接触判定を受け、下向きに反転、それでもまだバーの中なので
次のフレームで……、となっているということだったりしないでしょうか。


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

Name: 小栗  ..ぴよぴよ(745ポイント)   Date: 2009/06/26(金) 23:12   No:35822 解決!     
Title: Re:二点質問があります。    
Justy様

素早いご指摘とイメージをつけくださり、ありがとうございました。

ご指摘いただいた部分はまだ、確認はしておりませんが、配列への書き込みは
可能性を見逃していました。
ありがとうございます。

バーにボールが当たった時の現象も、確かに真横から当たった時に発生していたような気がします。
こちらも正確に動作を確認してから、対策を考えたいと思います。

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


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



Name: そーやー  ..ぴよぴよ(904ポイント)   Date: 2009/06/24(水) 21:01   No:35673       
Title: ポインタに関する質問です2    
こんばんは。もうひとつ教えてください。
これは、なぜ間違いなんですか?

#include <stdio.h>

int main(void){
char test[3][10];
test[0] = "one";
test[1] = "two";
test[2] = "three";
return 0;
}

error C2440: '=' : 'char [4]' から 'char [10]' に変換することはできません。(新しい動作 ; ヘルプを参照)
この変換が可能なコンテキストはありません。
error C2440: '=' : 'char [4]' から 'char [10]' に変換することはできません。(新しい動作 ; ヘルプを参照)
この変換が可能なコンテキストはありません。
error C2440: '=' : 'char [6]' から 'char [10]' に変換することはできません。(新しい動作 ; ヘルプを参照)
この変換が可能なコンテキストはありません。

これは、strcpy関数を使えばいいことはわかるのですが、なぜ間違いなのかがわかりません。
私の解釈としては、
test[0]の先頭アドレスから順に
test[0][1] = 'o';
test[0][2] = 'n';
test[0][3] = 'e';
test[0][4] = '\0';

と代入されていくものであると思うのですが、エラーメッセージの意味すらわかりません。
どなたか、わかりやすく教えてもらえませんか?

Excelマクロと違って、文字列処理が非常に複雑なのですが、C言語は文字列操作等に向いていない言語なのでしょうか?


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


Name: ねこ  ..中級者(12,090ポイント)   Date: 2009/06/24(水) 21:20   No:35682     
Title: Re:ポインタに関する質問です2    
char変数にダブルクォーテーションで囲んだ文字列が代入できるのは宣言時のみです。
下記はいけますが
char a[ 10 ] = "ABC"
char a[ 10 ];
a = "ABC";

宣言時に
test[ 3 ][ 10 ] = { "one", "two", "three" };
とするか、宣言後
strcpy( test[ 0 ], "one" )というようにWinAPI関数を用います。


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

Name: non  ..熟練のプログラマー(50,151ポイント)   Date: 2009/06/24(水) 21:48   No:35687     
Title: Re:ポインタに関する質問です2    
こうすることはできます。
int main(void){
char *test[3];
test[0] = "one";
test[1] = "two";
test[2] = "three";
return 0;
}

test[0] = "one";
は文字列リテラルのアドレスを代入しています。

>C言語は文字列操作等に向いていない言語なのでしょうか?
便利な関数はないけど、自由度はあると思います。





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

Name: box  ..ハッカー(141,504ポイント)   Date: 2009/06/24(水) 22:11   No:35693     
Title: Re:ポインタに関する質問です2    
> 下記はいけますが
> char a[ 10 ];
> a = "ABC";

本当ですか?確認済みですか?

> strcpy( test[ 0 ], "one" )というようにWinAPI関数を用います。

C言語が使える環境であれば、Windowsに限らず、
どこででも使える「標準関数」です。
WinAPIとは無関係です。


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

Name: MNS  ..中級者(11,470ポイント)   Date: 2009/06/24(水) 22:24   No:35694     
Title: Re:ポインタに関する質問です2    
文字列処理を簡単に行いたい、というなら、
標準テンプレートライブラリの「std::string」の使用をお勧めします。
C++の域になりますが、クラスを自作するわけではないので、
それほど難しいものではありません。
(ただし、処理速度はC言語のそれより劣ります)


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

Name: ねこ  ..中級者(12,013ポイント)   Date: 2009/06/24(水) 23:10   No:35696     
Title: Re:ポインタに関する質問です2    
失礼しました。一文抜けてました。

下記はいけますが
char a[ 10 ] = "ABC"
<このようには書けません。
char a[ 10 ];
a = "ABC";

<WinAPI
ごめんなさい。勘違いしておりました。以後気を付けます。


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

Name: たいちう  ..プログラマー(32,192ポイント)   Date: 2009/06/25(木) 00:39   No:35702     
Title: Re:ポインタに関する質問です2    
> (ただし、処理速度はC言語のそれより劣ります)

本当ですか?どの位劣るか示せますか?

今時の賢いコンパイラならばC言語と比べても遜色ないだろうし、
あまり賢くないコンパイラでもせいぜい数パーセント程度しか違わないと思う。
そりゃあ大量の文字列を扱うプログラムを下手に書けば遅いだろうけど、
下手に書いて遅いのはC言語も一緒だし。

「Cと比較して殆ど変わらない」というのは、あまりしっかりした根拠のない
私の主観なので、(できれば定量的な)情報があれば是非伺いたいです。


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

Name: toyo  ..プログラマー(36,517ポイント)   Date: 2009/06/25(木) 08:21   No:35710     
Title: Re:ポインタに関する質問です2    
おっしゃるとおり
C言語は文字列操作には向いていません
Cでは配列の名前は特殊な扱いでその配列の先頭要素のアドレスになります。そしてそのアドレスは変更できません。
char a[ 10 ];
a = "ABC"; // aはa[0]のアドレスで変更できません。代入により変更しようとするとするとエラーになります。


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

Name: MNS  ..中級者(11,691ポイント)   Date: 2009/06/25(木) 18:01   No:35734     
Title: Re:ポインタに関する質問です2    
>たいちうさん
私も、明確な速度の遅さを示すことは出来ません。
(そして、大した根拠もありません・・・。)
しかし、コンマ数パーセントでもstd::stringが遅いのは確かでしょう。

便利だからといって、何でもかんでもstd::stringを使い、
結果的にchar配列は使わなくなる、というのは余りよろしくないでしょう。

確かに、全くプログラムに影響しないほどの速度差かも知れませんが、
便利であることの犠牲に速度も遅くなっていく、ということを知ってほしかっただけです。
(全然伝わらなかったかも知れませんが・・・。)


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

Name: lbfuvab  ..上級者(21,086ポイント)   Date: 2009/06/25(木) 18:31   No:35735     
Title: Re:ポインタに関する質問です2    
ふと思ったのですが、
char *abc[3];

abc[0]="abc"
って不味くないですか?


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

Name: toyo  ..プログラマー(36,549ポイント)   Date: 2009/06/25(木) 18:36   No:35737     
Title: Re:ポインタに関する質問です2    
問題ないですよ
char *abc;
abc = "abc";
の配列バージョンです



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

Name: たいちう  ..プログラマー(32,324ポイント)   Date: 2009/06/25(木) 23:01   No:35759     
Title: Re:ポインタに関する質問です2    
MNSさん

初心者の方も大勢見ている掲示板ですので、先の書き方だと
「std::stringはすごく遅い」という誤解を与えかねないと思い書き込みました。
あと本当ならばもっと詳しく聞けたらluckyと。

> しかし、コンマ数パーセントでもstd::stringが遅いのは確かでしょう。

私にはコンマ数パーセントも遅くなるとは思えないのです。
多くのケースでC言語のものと実質的に同等なバイナリが出来上がると思います。


toyoさん

> おっしゃるとおり
> C言語は文字列操作には向いていません

噛み付いてばかりですが、これもいかがなものかと。
OSを作る言語が文字列操作に向いていないわけがありませんので、
「初心者はC言語の文字列操作で躓きやすい」とか書いた方が適切かと。


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

Name: sizuma [URL]  ..入門者(2,822ポイント)   Date: 2009/06/26(金) 00:49   No:35773     
Title: Re:ポインタに関する質問です2    
ぼくもふと疑問が。
こういう2次元配列で管理するときのアドレスってどうなってるんだ?
って思いました。

確認してみると、あーなるほど、と納得。
最初char*配列のメモリを連番で確保して、そのあとにchar*のメモリを連番で確保するんですね
char*が4バイトっていうのも知らなかった・・・
勉強不足でした


>たいちうさん

>OSを作る言語が文字列操作にむいてないわけありませんので、

OSについて全然わからないから、答えていただいてもわからないかもしれないんですが・・・
OSを開発するときに出てくるCの文字列操作の利点というのはなんなのでしょうか?

やはりメモリを他の言語より細やかに扱えるから??

あと
OSを作る → 文字列操作に向いていないわけがない、という流れがわからないです
OSを作るのってプロセスの管理を作るものだと理解してました

知識がない人には説明しきれないような質問かもしれないんで、
お忙しいときは無視してください。


>噛み付いてばかりですが
いろいろな視点から自分の理解より深い部分を論議してもらうととても勉強になります。
いつも勉強させて頂いてます。


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

Name: たいちう  ..プログラマー(32,486ポイント)   Date: 2009/06/26(金) 08:59   No:35778     
Title: Re:ポインタに関する質問です2    
> OSを作る → 文字列操作に向いていないわけがない、という流れがわからないです
> OSを作るのってプロセスの管理を作るものだと理解してました

OSを作る → 何でもできる → 文字列操作に向いていないわけがない

という程度の意味です。プログラマで例えると、文字列操作もろくに
できないような人がOSを自作できるはずがないと思います。
同様に考えて、文字列操作もろくにできないような言語では、
OSを作れるはずがないでしょう。

ちなみに私は文字列操作は十分できますが、OSを作るレベルには
程遠いプログラマですので、この位の回答で勘弁。


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

Name: ねこ  ..中級者(12,861ポイント)   Date: 2009/06/26(金) 10:22   No:35782     
Title: Re:ポインタに関する質問です2    
何か気になる話題があったので横から顔出してみます。
まず、処理速度に関しては私も「結構遅くなる」と聞いた覚えがあります。
実際どれくらい遅くなるのか把握してなかったので簡単なチェックを行ってみました


// チェック簡略用マクロ( A:ループ回数(平均値計算用), B:ループ回数 )
#define CHECK_TIME_PREV( A, B ) \
{ \
LONG nArrTime[ A ]; \
LONG nCount = A; \
LONG nTotalTime = 0; \
\
LONG nTime1 = 0, nTime2 = 0; \
\
for( LONG ii = 0; ii < nCount; ii++ ) \
{ \
nTime1 = GetNowCount(); \
for( LONG jj = 0; jj < B; jj++ ) \
{

#define CHECK_TIME_AFTER( A ) \
} \
nTime2 = GetNowCount(); \
\
nArrTime[ ii ] = nTime2 - nTime1; \
nTotalTime += nArrTime[ ii ]; \
} \
TRACE2( "%s:AvgTime:%lf", A, (double)nTotalTime / (double)nCount ); \
}
※TRACE2は出力ウィンドウに表示するためのマクロです

// チェック処理
#define AVG_CNT 20
#define DO_CNT 100000

// 定義、サイズ指定無し
CHECK_TIME_PREV( AVG_CNT, DO_CNT );
std::string str1;
CHECK_TIME_AFTER( "std定義1" );

// 定義、サイズ指定無し
CHECK_TIME_PREV( AVG_CNT, DO_CNT );
std::string str1( 64, 'a' );
CHECK_TIME_AFTER( "std定義2" );

// 定義初期化無し
CHECK_TIME_PREV( AVG_CNT, DO_CNT );
char cTemp[ 64 ];
CHECK_TIME_AFTER( "chr定義1" );

// 定義初期化有り
CHECK_TIME_PREV( AVG_CNT, DO_CNT );
char cTemp[ 64 ] = "a";
CHECK_TIME_AFTER( "chr定義2" );

// 代入
std::string str1;
CHECK_TIME_PREV( AVG_CNT, DO_CNT );
str1 = "ABC";
CHECK_TIME_AFTER( "std代入" );

// 代入
char cTemp[ 64 ];
CHECK_TIME_PREV( AVG_CNT, DO_CNT );
strcpy( cTemp, "ABC" );
CHECK_TIME_AFTER( "chr代入" );



<結果> ※投稿時、小数点位置で調整しています。
std定義1:AvgTime: 58.500000
std定義2:AvgTime:708.850000
chr定義1:AvgTime: 0.250000
chr定義2:AvgTime: 1.800000
std代入 :AvgTime: 58.200000
chr代入 :AvgTime: 0.600000

こんなチェックで良いのかな・・・と感じますが
チェックした感じ、結構な差があるように思えます。
どこに負荷があるかは内部ロジックを調べてみないと分かりませんが
それなりに負荷のあるプログラムでは、stringクラスは避けた方が処理効率は上がりそうですね。


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

Name: たいちう  ..プログラマー(32,509ポイント)   Date: 2009/06/26(金) 10:32   No:35783     
Title: Re:ポインタに関する質問です2    
コンパイラとコンパイル条件を書いてください。
まさかデバッグモードではないですよね。


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

Name: たいちう  ..プログラマー(32,519ポイント)   Date: 2009/06/26(金) 10:40   No:35784     
Title: Re:ポインタに関する質問です2    
ソースを読みましたが、多分デバッグモードでの実行結果ですね。
比較対象自体が最適化でなくならないようなコードで、
実行時間で最適化をかけて比較する必要があります。


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

Name: toyo  ..プログラマー(36,554ポイント)   Date: 2009/06/26(金) 10:43   No:35785     
Title: Re:ポインタに関する質問です2    
char cTemp[ 64 ];
で文字数を制限してるのは公平ではないでしょう
char もmallocで確保する処理を入れて比べたほうがいいのでは


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

Name: ねこ  ..中級者(13,018ポイント)   Date: 2009/06/26(金) 10:49   No:35786     
Title: Re:ポインタに関する質問です2    
VC2008 Exp-Releaseです。
他はデフォルトからDXLIBのコンパイルが通るように変更している程度かな。

<まさかデバッグモードではないですよね。
何か結果に疑問でもあるんでしょうか?
仮にデバッグモードだとしても両者の差はそこまで変わらないと思いますが・・・

<ちょっと訂正
ループ数10万⇒100万の間違いでした。結果は大体1/10になっただけですが・・・


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

Name: ねこ  ..中級者(13,121ポイント)   Date: 2009/06/26(金) 10:55   No:35787     
Title: Re:ポインタに関する質問です2    
>toyo様
最初はそうしていたのですが
今回の観点は両者の使い分けと速度にあると思ったので
常にcharをmallocで確保する、という条件は必要無いと感じました。
勿論これは私見ですので、結果に不満等ある場合は別途比較を示していただければと思います。

<文字数制限
デフォルトコンストラクタでどれくらいの文字数文確保されているのかが分かりません。
それが分かると合わす事も出来るんですが・・・


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

Name: ねこ  ..中級者(13,149ポイント)   Date: 2009/06/26(金) 11:01   No:35788     
Title: Re:ポインタに関する質問です2    
すいません、訂正します。
プロジェクトの設定がおかしかったため再度記述します。


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

Name: ねこ  ..中級者(13,639ポイント)   Date: 2009/06/26(金) 11:12   No:35789     
Title: Re:ポインタに関する質問です2    
設定変更後、ウィルスチェックとか監視ソフトとか止めると凄く異なる結果になったので訂正します。


// 定義初期化有り
CHECK_TIME_PREV( AVG_CNT, DO_CNT );
char* cTemp = new char [ 64 ];
CHECK_TIME_AFTER( "chr定義3" );
// 定義初期化有り
CHECK_TIME_PREV( AVG_CNT, DO_CNT );
char* cTemp = (char*)malloc( 64 );
CHECK_TIME_AFTER( "chr定義4" );


std定義1:AvgTime:0.000000
std定義2:AvgTime:65.700000
chr定義1:AvgTime:0.000000
chr定義2:AvgTime:0.000000
chr定義3:AvgTime:112.100000
chr定義4:AvgTime:111.500000
std代入:AvgTime:2.000000
chr代入:AvgTime:0.000000

10万回の結果です。一部ループを何回にしても1以上になりませんでした。

また、文字数を128⇒256にしたところで
<128>
std定義2:AvgTime:65.000000
chr定義3:AvgTime:121.000000
chr定義4:AvgTime:119.000000
<256>
std定義2:AvgTime:367.000000
chr定義3:AvgTime:132.000000
chr定義4:AvgTime:131.000000
このように所要時間が増えました。
デフォルトでは128程度とっているため、それを超えると再度メモリを取得しているのかと予想します。


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

Name: sizuma [URL]  ..入門者(2,885ポイント)   Date: 2009/06/26(金) 21:59   No:35818     
Title: Re:ポインタに関する質問です2    
>たいちうさん

回答ありがとうございます。

OS作りってなんだか魅力的なものみたいですね。
夏休みにでもテキスト買い込んでOSについて勉強してみようと思います

脱線した質問失礼しました



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



Name: デラ初心者  ..ぴよぴよ(51ポイント)   Date: 2009/06/25(木) 17:09   No:35727       
Title: プロジェクトをDLしても10章からしかない    
龍神録プログラミングの館で一括ダウンロードでDLしても
10章からしかありません。
もともと10章からしかないんでしょうか?

あと、まずは実行させてみようのmain.cppってどこに
あるのでしょうか?


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


Name: Dixq (管理人)  ..ウィザード(1,038,402ポイント)   Date: 2009/06/25(木) 17:51   No:35731     
Title: Re:プロジェクトをDLしても10章からしかない    
DLが完了しないブラウザや環境があるようです。
他のブラウザを使うか、DL支援ソフトなどを使ってみてください。


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

Name: デラ初心者  ..ぴよぴよ(38ポイント)   Date: 2009/06/26(金) 09:26   No:35780 解決!     
Title: Re:プロジェクトをDLしても10章からしかない    
解決しました。
おりがとうございました。


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



Name: 天魔  ..ぴよぴよ(39ポイント)   Date: 2009/06/25(木) 19:10   No:35739       
Title: 龍神録の第13章にて    
初めまして。
こちらのサイトのプログラムをコピペしてプログラムを作成していたのですが、13章でデバッグを開始すると各cppファイルにて

「error C2065: 'SHOT_BULLET_MAX' : 定義されていない識別子です。」

さらに、shotH.cppにて、

「error C2084: 関数 'void shot_bullet_H000(int)' は既に本体を持っています。
'shot_bullet_H000' の前の定義を確認してください」

と出てしまいます。

何度見ても私にはどこも間違っているようには見えませんでした。

どこがいけないのでしょうか?
アドバイスをよろしくお願いいたします。


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


Name: LUNA  ..入門者(2,968ポイント)   Date: 2009/06/25(木) 19:46   No:35742     
Title: Re:龍神録の第13章にて    
>「error C2065: 'SHOT_BULLET_MAX' : 定義されていない識別子です。」
これは定数かなんかですかね?
龍神録のプログラムは見てないからわかりませんが、
大体大文字で語尾にMAXってことは定数ってパターンが多いですからね。
たぶんプログラムの中で#defineが抜けてるからだと思いますよ。私的には。
ファイル分けしてます?
ヘッダーの中身を見て

#define SHOT_BULLET_MAX (数値)

ってのがないか探してみるといいですよ。
まぁC初心者の私が偉そうにはいえませんがねww

>「error C2084: 関数 'void shot_bullet_H000(int)' は既に本体を持っています。
>'shot_bullet_H000' の前の定義を確認してください」
これは私にはわかりませんね・・・
一度そのエラーの起きた行を見てみればいいと思います。なんかおかしいかもしれないので。
でもたいていプログラムって先頭のエラーを修正するとあとのエラーも根こそぎ消えていくものですからとりあえずは「error C2065: 'SHOT_BULLET_MAX' : 定義されていない識別子です。」 の部分を修正することを最優先すればいいと思います。





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

Name: pooka [URL]  ..初心者(7,178ポイント)   Date: 2009/06/25(木) 20:10   No:35744     
Title: Re:龍神録の第13章にて    
>「error C2065: 'SHOT_BULLET_MAX' : 定義されていない識別子です。」
define.hに
#define SHOT_BULLET_MAX 1000
があるか確認してみてください。
なければ書いてください。

>「error C2084: 関数 'void shot_bullet_H000(int)' は既に本体を持っています。
>'shot_bullet_H000' の前の定義を確認してください」
おそらくですが、shotH.cppにvoid shot_bullet_H000(int n)と書かれた関数が2つあるのではないでしょうか?


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

Name: 天魔  ..ぴよぴよ(315ポイント)   Date: 2009/06/25(木) 20:24   No:35745     
Title: Re:龍神録の第13章にて    
回答して頂きありがとうございます。

define.h(定義を書くヘッダファイル)を見た所、やはり書いてありました。
なので、#include "struct.h"という行を一番下にもっていったところ、エラーが消えました。

後者の方はおそらくほとんど同じものでしたので片方を消してみたところ、無事起動できました。

しかし、発射する弾が全て同じでした。

描画関係に何か問題があるのでしょうか?


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

Name: pooka [URL]  ..初心者(7,216ポイント)   Date: 2009/06/25(木) 20:52   No:35748     
Title: Re:龍神録の第13章にて    
>しかし、発射する弾が全て同じでした。
csvファイルの弾の色や種類の所を変更してみてください。


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

Name: 天魔  ..ぴよぴよ(489ポイント)   Date: 2009/06/25(木) 21:58   No:35755     
Title: Re:龍神録の第13章にて    
変更してみました。
そうしたところ、弾の種類は変わったのですが一部弾の発射がずれていたり発射されていませんでした。

これはいったいなぜなんでしょうか?
csvを変更する前はきっちりすべて描画されていたようなので描画の方は間違っていないと思われますが・・・。

何度も申し訳ないです。


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

Name: Dixq (管理人) [URL]  ..ウィザード(1,038,623ポイント)   Date: 2009/06/25(木) 22:08   No:35756     
Title: Re:龍神録の第13章にて    
12章はうまくいきました?
13章の解説ページをみながらソースをコピペしていったということでしょうか?

こちらで用意したプロジェクトファイルではうまくいくので、
一括DLに入っているプロジェクトを見比べて、どこが違うのか、確認してみて下さい。

恐らくこちらの記載漏れで、どこか、12章から13章へ追加や修正すべき点を書き損じているのかもしれません。

また、csvファイルの内容もHPで紹介しているものや、DLした素材にはいっているものと同じか確認してみて下さい。
もし何か記載漏れがわかればご報告頂けるとありがたいですm(_ _)m


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

Name: 天魔  ..ぴよぴよ(512ポイント)   Date: 2009/06/25(木) 22:23   No:35757     
Title: Re:龍神録の第13章にて    
> 12章はうまくいきました?
はい、12章の方では問題なく動作できたはずです。
> 13章の解説ページをみながらソースをコピペしていったということでしょうか?
その通りです。

> こちらで用意したプロジェクトファイルではうまくいくので、
> 一括DLに入っているプロジェクトを見比べて、どこが違うのか、確認してみて下さい。
その件なのですが、DLしたファイルを開いてみるとinclude文しか書かれていませんでした・・・。
どういうことなのでしょうか?

質問ばかりで大変恐縮ですが、よろしくお願いします。


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

Name: Dixq (管理人) [URL]  ..ウィザード(1,038,630ポイント)   Date: 2009/06/25(木) 22:28   No:35758     
Title: Re:龍神録の第13章にて    
う〜ん、やはり引越ししないといけませんね・・。
他のトピで「正常にダウンロードできない」のトピをご覧下さい。
それで対応できないでしょうか?


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

Name: pooka [URL]  ..初心者(7,424ポイント)   Date: 2009/06/25(木) 23:08   No:35761     
Title: Re:龍神録の第13章にて    
>弾の種類は変わったのですが一部弾の発射がずれていたり発射されていませんでした。
発射音は鳴っていますか?
鳴っているのであればcsvファイルの弾の種類や色の値がload.cppで書いた値を超えたりしてないか確認してみてください。
LoadDivGraph( "../dat/img/bullet/b0.png" , 5 , 5 , 1 , 76 , 76 , img_bullet[0] ) ;
(この場合、csvファイルの弾の種類が0となっている行の弾の色の値が0〜4になっているかということです。)

>>管理人さん
IEだとやはり正常にダウンロードできないようですね。(10回ほど試してみましたが、駄目でした…)


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

Name: 天魔  ..ぴよぴよ(706ポイント)   Date: 2009/06/25(木) 23:16   No:35762     
Title: Re:龍神録の第13章にて    
> 他のトピで「正常にダウンロードできない」のトピをご覧下さい。
> それで対応できないでしょうか?
そちらのトピックを拝見させていただいたのですが、FireFoxでDLするとよいらしいのですが、FireFoxでもダメでした。・・・というより、今回使ったブラウザがまさにFireFoxなのですが。



それともう一つ、13章でshotH.cppに2回、追加を行っていますが見たところほとんど内容が同じなように見えます。知識の浅い私では、間違いかどうかもわかりませんが、これを文字通り「追加」すると、本体をすでに持っているという旨のエラーを起こします。もし、間違いでなければ、これまでの一連の原因がそこにある可能性も出て来るかもしれません・・・・。偉そうに言ってしまって申し訳ないです・・・。


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

Name: 天魔  ..ぴよぴよ(848ポイント)   Date: 2009/06/25(木) 23:25   No:35765     
Title: Re:龍神録の第13章にて    

> 発射音は鳴っていますか?
> 鳴っているのであればcsvファイルの弾の種類や色の値がload.cppで書いた値を超えたりしてないか確認してみてください。
> LoadDivGraph( "../dat/img/bullet/b0.png" , 5 , 5 , 1 , 76 , 76 , img_bullet[0] ) ;
> (この場合、csvファイルの弾の種類が0となっている行の弾の色の値が0〜4になっているかということです。)
↑のように書かれていましたのでおそらくはあっているはず・・・・?

正確に出ていない弾はb3.pngのいわゆる「ナイフ」の弾です。そちらの行は

LoadDivGraph( "../dat/img/bullet/b3.png" , 5 , 5 , 1 , 19 , 34 , img_bullet[3] ) ;

と表記されています。・・・・何か問題点ありませんか?


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

Name: Dixq (管理人) [URL]  ..ウィザード(1,038,692ポイント)   Date: 2009/06/25(木) 23:32   No:35766     
Title: Re:龍神録の第13章にて    
google chromeやhttp://www.altech-ads.com/product/10001239.htmこんなソフトでもダメでしょうか?
すみませんが、時間も時間なので、明日改めて章の中身を見てみます;


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

Name: pooka [URL]  ..初心者(7,550ポイント)   Date: 2009/06/25(木) 23:33   No:35767     
Title: Re:龍神録の第13章にて    
>正確に出ていない弾はb3.pngのいわゆる「ナイフ」の弾です。そちらの行は
>LoadDivGraph( "../dat/img/bullet/b3.png" , 5 , 5 , 1 , 19 , 34 , img_bullet[3] ) ;
>と表記されています。・・・・何か問題点ありませんか?

いえ、csvファイルのほうです。
csvファイルの弾の種類が3となっているとき、弾の色は0〜4の値になっていますか?
と伝えたかったのです…


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

Name: 天魔  ..ぴよぴよ(892ポイント)   Date: 2009/06/25(木) 23:48   No:35770 解決!     
Title: Re:龍神録の第13章にて    
> いえ、csvファイルのほうです。
> csvファイルの弾の種類が3となっているとき、弾の色は0〜4の値になっていますか?
> と伝えたかったのです…

書かれた内容をよく読まずに・・・すみません・・・。
見たところ、すべての弾の色は0の値となっています。

>管理人さん
どうやらダメみたいです、お手数おかけしますがよろしくお願いいたします。


追記:どうやら、大きな勘違いをしていたようで、よく調べてみたところ、書いてあるものを見つけられました。
   この度はお騒がせしてしまい申し訳ありませんでした・・・。


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



Name: ほしつばさ  ..ぴよぴよ(6ポイント)   Date: 2009/06/24(水) 00:48   No:35619       
Title: シューティングゲームの館の…    
素材がDLできなくなってます
修正お願いします


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


Name: Dixq (管理人) [URL]  ..ウィザード(1,038,543ポイント)   Date: 2009/06/25(木) 21:34   No:35751     
Title: Re:シューティングゲームの館の…    
ほしつばささん、こんばんは。

すみませんが、シューティングゲームの館は本来なら既に消去しているページでして・・。
あり難い話ですが、シューティングの館を消すのはやめて欲しいと言ってくださる方がいらっしゃり、
形だけ置いてあるような状態です。

一応素材はUPしなおしましたが、記載している内容に間違いも多いし、私自身プログラムの内容を忘れてしまった部分もあり、参考にしていただかないほうがいいと思います・・。
シューティングを作りたい場合は龍神録の館の方がまだマシなので、よければそちらをご覧下さい。


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

Name: ほしつばさ  ..ぴよぴよ(57ポイント)   Date: 2009/06/25(木) 23:45   No:35769 解決!     
Title: Re:シューティングゲームの館の…    

簡単なほうから学ぼうかなって思ってたのですが…
そんなの理由があったんですね
ありがとうございました


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



Name: 分布  ..ぴよぴよ(42ポイント)   Date: 2009/06/25(木) 23:20   No:35763       
Title: 文法本は読んだのですが・・・    
C言語の本を読んで文法は一通り納得はしているのですが、全然実践で使えません。
ここの質疑応答で回答しようと思っても出来ないレベルです。

皆さんどうやってレベルを上げていったのですか?
とりあえず、ゲーム作りをはじめてわからないことがあったら聞けばいいという形でしょうか。
Cの文法本は読んでWindows本を読んでいますが、最近飽きてきて、皆さんの勉強方法教えていただきたいと思い質問させていただきました。


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


Name: Dixq (管理人) [URL]  ..ウィザード(1,038,928ポイント)   Date: 2009/06/25(木) 23:37   No:35768     
Title: Re:文法本は読んだのですが・・・    
それはそうでしょう。
プログラムというものは暗記で覚えるものではなく、演習で身に付くものです。
例えるなら、自動車学校に行って、車の乗り方についていくら座学ばかり受けたとしても、
実技無しで、それだけで運転をマスターするなんて出来ないですよね。

プログラムって本で知識を付けたらそのたびにプログラムを書いてみることが大事です。
教科書にあるサンプルを単にうつすだけではなく、学んだ文法や構文、関数を使って、
自分が期待する動作をするようなプログラムを作ってみるのです。

今ゲームが作りたいようですね。
一先ずうちのサイトでよければゲームプログラミングの館でもご覧になり、
何か自分が作りたいゲームモドキを作ってみてはどうでしょう?

いきなりが難しければ最初はキーボードを押したら「ハロー」と出るだけでも充分だと思います。
とにかくドンドン自分でプログラムを作ってみることですね。


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



Name: Kono  ..ぴよぴよ(82ポイント)   Date: 2009/06/23(火) 11:51   No:35585       
Title: C言語プログラミング能力認定試験    
こんにちは。

C言語プログラミング能力認定試験の3級を受けようと思っています。

そこでなのですが
3級で出題される問題はどのくらいのレベルなのでしょうか?

自分はCを独学で勉強し始めて1年たつのですが、そのくらいでも大丈夫でしょうか?


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


Name: Mist  ..熟練のプログラマー(65,316ポイント)   Date: 2009/06/23(火) 14:08   No:35591     
Title: Re:C言語プログラミング能力認定試験    
http://www.sikaku.gr.jp/js/side3/scon04.html

HPからサンプル問題がダウンロードできますからそれを解いてみればいいんじゃないでしょうか。

> 自分はCを独学で勉強し始めて1年たつのですが、そのくらいでも大丈夫でしょうか?

プログラミング能力は時間に比例しないので具体的にどの程度のプログラムが書けるのかがわからないと評価のしようがないですが、サンプル見た限りだと3級は超簡単ですから配列使ったプログラムを書けるなら余裕じゃないでしょうか。


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

Name: Kono  ..ぴよぴよ(127ポイント)   Date: 2009/06/24(水) 10:50   No:35631     
Title: Re:C言語プログラミング能力認定試験    
そうですかー
なんとかいける気がします!

やはり、能力の伸びと時間は比例しないのですね。


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

Name: たいちう  ..プログラマー(32,245ポイント)   Date: 2009/06/24(水) 12:04   No:35635     
Title: Re:C言語プログラミング能力認定試験    
> 自分はCを独学で勉強し始めて1年たつ

これだけでは、その人が1年間どの位やったのか判りません。
以下の両方の人が「自分はCを独学で勉強し始めて1年たつ」と言うかもしれません。

一日8時間、月に20日間真剣にやれば、一年でC言語を極めたといっても過言ではないくらいに
なるかもしれません。一方、週に一回30分程度入門書をながめるだけ、数か月中断あり、
という人は、一年たっても殆どプログラムは書けないでしょう。


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

Name: LUNA  ..かけだし(1,799ポイント)   Date: 2009/06/24(水) 12:21   No:35636     
Title: Re:C言語プログラミング能力認定試験    
毎日8時間くらいみっちり勉強すればCを始めて2ヶ月くらいで大丈夫だと思いますよ。
うちの学校もそんな感じですし。
(↑とある専門学校1年生の体験談)
まぁ、C++初めて2ヶ月くらいで2級受けようとしている人もいますし・・・・。
問題なのは『どれだけやったか?』、じゃなくその受けたい級の出題範囲の内容をどれだけ理解しているかですから。
まぁ3級でしたら、よっぽど試験の2週間前にCを始めたとかじゃない限り大丈夫だと思いますよ。
一度深呼吸して気楽に行きましょう。
緊張とか心配ばかりしていたら受かる物も受かりませんから。




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

Name: Kono  ..ぴよぴよ(147ポイント)   Date: 2009/06/24(水) 13:06   No:35637     
Title: Re:C言語プログラミング能力認定試験    
そうですよね;

現在、学生(高校)なものであまりCを勉強する時間がとれないのですが、1日短くて1時間長くて2時間は書籍を読んだり、ソースをかいたりしています。

どのくらいCを扱えたら「極めた」ことになるのかもわかりません。


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

Name: LUNA  ..かけだし(2,029ポイント)   Date: 2009/06/24(水) 13:13   No:35638     
Title: Re:C言語プログラミング能力認定試験    
一般的にはポインタを完全理解できればC初心者は脱出って言われてた気がする。
まぁ、ポインタは確かに最初はわかりにくいけどある程度わかればあとはすいすい理解していけるから大丈夫だよ。たぶん。
でも3級を受けるんならまずはポインタのことは忘れて配列と初歩的なことを重点的にやったらいいと思う。
自分も今3級に向けてクラスで勉強しているからなぁ・・・

3級の過去問題をやっているとプログラムの問題は得点が高いと思う。1問正解で3〜4点とか。
今日やった3級過去問題で難しかったやつをいくつかピックアップしてみるね。
正解はわかる人、勝手に解いてくださいww(答え書くの忘れそうだし)


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

Name: LUNA  ..かけだし(2,123ポイント)   Date: 2009/06/24(水) 13:21   No:35639     
Title: Re:C言語プログラミング能力認定試験    
問1 C言語の特徴に関する次の記述の正誤を回答群の中から選べ。
回答群 ア、正しい   イ、誤り

(7)C言語はソースプログラムの記述にフリーフォーマット方式を採用しているため、プログラムの部品化が容易である。

(8)C言語はシステム記述用に開発された言語でありUNIXシステムを記述すること以外では使用されない。
(5)浮動小数点をあらわすデータ型はfloatのみである。
(4)C言語は移植性に優れており、ソースプログラムをそのまま他のシステムでコンパイルしても動作する可能性は高い。
(3)C言語は、様々なメーカー仕様があるため、言語仕様の標準化が困難となっている。


*問1はよく考えれば簡単な問題だと思います


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

Name: LUNA  ..かけだし(2,443ポイント)   Date: 2009/06/24(水) 13:30   No:35640     
Title: Re:C言語プログラミング能力認定試験    
プログラミング問題(本当は答えは選択式です)
問4 次のプログラムを実行した際にprintf関数によって表示される結果を記述せよ。ただし半角の空白は△で示すものとする

#include<stdio.h>
int main()
{
char str[] = "Clanguage";
int num = 365;

printf("|%10s|\n",str); //(1)
printf("|%7.6s|\n",str); //(*2)
printf("|%-10s|\n",str); //(*3)
printf("|%010s|\n",num); //(4)
printf("|%x|\n",num); //(5)
}


(数字)←の部分の実行結果をお答えください。
*←付きは私が間違えた問題です。参考までにどうぞ。


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

Name: ねこ  ..中級者(11,100ポイント)   Date: 2009/06/24(水) 13:47   No:35641     
Title: Re:C言語プログラミング能力認定試験    
C検定しか受けてないんで他の検定(あるの?)は知らないんですが
知識問題はなんというか「勉強しないと分からない」って感じです。
普段プログラム主体にやってる人間じゃ気にもしない事多いので。

プログラムはやたら簡単だった気がします。
体感ですがC検定1級で「まぁ、Cちょっと使えるかな」程度だと思います。
1年間プログラムを作っているなら、1級レベルでもあまり触ってない部分を補完するだけで十分でしょう。

まぁCというよりプログラム自体すんなり入る人と入らない人が居ますから、一概に時間とは比例しませんね。
数学の得手不得手に似てるんじゃないかな。



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

Name: LUNA  ..入門者(2,563ポイント)   Date: 2009/06/24(水) 14:31   No:35642     
Title: Re:C言語プログラミング能力認定試験    
> C検定しか受けてないんで他の検定(あるの?)は知らないんですが
> 知識問題はなんというか「勉強しないと分からない」って感じです。

情報技術検定っていうのがありますよ。
内容はプログラムとハードウェアの知識とが混ざった似たようなもので、工業系の高校生が受ける試験です。まぁプログラム問題はC検定よりもかなり簡単でハードの知識がメインの試験ですけどね。私はこっちの検定なら2級まで持っています。
暇があったら受けてみるのも面白いかもしれませんね。
プログラミングの知識だけじゃ受からない試験ですが・・・。


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

Name: ねこ  ..中級者(11,260ポイント)   Date: 2009/06/24(水) 15:15   No:35643     
Title: Re:C言語プログラミング能力認定試験    
あーすいません、JavaとかVBとかCOBOLとかの事を言いたかったんです。
なんかそっちも専門時代に受けた記憶がうっすらありますね。
理系なんで知識系試験は苦手でした。基本情報やソフ開の午前にも苦労しました^^;

社会人になってからあんまり意識しなくなりましたが、こういう話題あると資格に目を向けてみたくなりますね。
シスアドかセキュアドの勉強でも受けてみようかしら


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

Name: Mist  ..熟練のプログラマー(65,378ポイント)   Date: 2009/06/24(水) 15:37   No:35644     
Title: Re:C言語プログラミング能力認定試験    
> シスアドかセキュアドの勉強でも受けてみようかしら

勉強するだけなら関係ないけど、どっちの試験ももうなくなりました。

http://www.jitec.ipa.go.jp/1_11seido/seido_gaiyo.html


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

Name: ねこ  ..中級者(11,387ポイント)   Date: 2009/06/24(水) 16:00   No:35645     
Title: Re:C言語プログラミング能力認定試験    
<勉強するだけなら関係ないけど、どっちの試験ももうなくなりました。
指摘どもです。今の試験と範囲を内容知らないので曖昧に言ってます。というか日本語おかしくなってますorz

上級シスアドか情報セキュアドあたりに該当する試験に向けて勉強して受けてみようか。
と訂正します^^;


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

Name: Kono  ..ぴよぴよ(222ポイント)   Date: 2009/06/25(木) 10:44   No:35712     
Title: Re:C言語プログラミング能力認定試験    
問題ありがとうございます。
まず、1つめ解いてみました。

>問1 C言語の特徴に関する次の記述の正誤を回答群の中から選べ。

(7)A.ア

(8)A.イ

(5)A.イ

(4)A.ア

(3)A.イ

どうでしょうか?


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

Name: LUNA  ..入門者(2,642ポイント)   Date: 2009/06/25(木) 13:53   No:35718     
Title: Re:C言語プログラミング能力認定試験    
> 問題ありがとうございます。
> まず、1つめ解いてみました。
>
> >問1 C言語の特徴に関する次の記述の正誤を回答群の中から選べ。
>
> (7)A.ア
>
> (8)A.イ
>
> (5)A.イ
>
> (4)A.ア
>
> (3)A.イ
>
> どうでしょうか?



う〜ん・・・惜しいです。一問だけ間違ってました。
(7)は「ア」(正しい)です。
なぜそうなるかはちょっと自分で調べてみてください。そのほうが頭にしっかりと入ると思いますから。




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

Name: LUNA  ..入門者(2,679ポイント)   Date: 2009/06/25(木) 13:56   No:35719     
Title: Re:C言語プログラミング能力認定試験    


> う〜ん・・・惜しいです。一問だけ間違ってました。
> (7)は「ア」(正しい)です。
> なぜそうなるかはちょっと自分で調べてみてください。そのほうが頭にしっかりと入ると思いますから。



すみません間違えてしまいました。
正確には(7)は『イ』です。
ややこしい真似してすみません^^;


回答
(7)イ
(8)イ
(5)イ
(4)ア
(3)イ


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

Name: Kono  ..ぴよぴよ(286ポイント)   Date: 2009/06/25(木) 14:20   No:35723     
Title: Re:C言語プログラミング能力認定試験    
採点ありがとうございます。
(7)は自信がなかったのですが、やはり間違えてましたか;

自分なりに調べてみようと思います。


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

Name: dic  ..プログラマー(25,034ポイント)   Date: 2009/06/25(木) 17:32   No:35729     
Title: Re:C言語プログラミング能力認定試験    
3級は基礎的すぎて実践ばかりやってる私では通らないかもしれない試験ですね
2,1級も通るか疑問ですが
精進したいものです


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

Name: Kono  ..ぴよぴよ(427ポイント)   Date: 2009/06/25(木) 17:52   No:35732     
Title: Re:C言語プログラミング能力認定試験    
2つめ解いてみました。

>問4 次のプログラムを実行した際にprintf関数によって表示される結果を記述せよ。ただし半角の空白は△で示すものとする

(1)
|△Clanguage|

(2)
|△Clangu|

(3)
|Clanguage△|

(4)
|△△△△△△△365|

(5)
|16d|

自信ありません^^;


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

Name: LUNA  ..入門者(2,718ポイント)   Date: 2009/06/25(木) 19:39   No:35741     
Title: Re:C言語プログラミング能力認定試験    
すごいですよ!全問正解です。
後は勉強を怠らなければ余裕で3級受かると思いますよ!


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

Name: Kono  ..ぴよぴよ(474ポイント)   Date: 2009/06/25(木) 20:47   No:35747     
Title: Re:C言語プログラミング能力認定試験    
おぉ!
正解でしたか!

どんな問題がでているのかわかりませんでしたが、自信がつきました^^


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

Name: Hermit  ..上級者(23,685ポイント)   Date: 2009/06/25(木) 21:15   No:35749     
Title: Re:C言語プログラミング能力認定試験    
4問目が変だったので、ジョークの問題かと思っていた(^^;

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

Name: sizuma [URL]  ..入門者(2,763ポイント)   Date: 2009/06/25(木) 23:01   No:35760     
Title: Re:C言語プログラミング能力認定試験    
僕も四問目で
へぇ・・フォーマット指定が文字列でも表示できるんだ

って思って走らせてみましたが、実行時エラーになりました。
おそらく%dの書き間違いだと思いますが・・・
VisualC++ExpressEditionだからかな?とも思いましたけど。


資格は受かることよりも、それを目標に知識を身につけるのが目的だと思います。
別に受かったからってなにがあるわけでもありませんしね。

Konoさんも、合格を目標に勉強がんばってくださいね^^
ちなみに、僕はC言語関連の資格はもってません
C言語の知識もないし(笑


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

Name: Kono  ..ぴよぴよ(541ポイント)   Date: 2009/06/25(木) 23:21   No:35764     
Title: Re:C言語プログラミング能力認定試験    
>printf("|%010s|\n",num); //(4)



printf("|%10d|\n",num); //(4)

で大丈夫でした。

>資格は受かることよりも、それを目標に知識を身につけるのが目的だと思います。

そうですよね。
合格も大事だけど、それだけではないと思います。

頑張ります!




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



Name: KKXY  ..ぴよぴよ(110ポイント)   Date: 2009/06/24(水) 19:03   No:35657       
Title: 正常にダウンロードできない    
初めまして、KKXYと申します。
サンプルプログラミングをダウンロードしたいのですがダウンロードできません。
具体的に言いますとダウンロードすると何故か壊れたファイルがダウンロードされます。
一体どうすればよろしいのでしょうか?


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


Name: dic  ..上級者(24,949ポイント)   Date: 2009/06/24(水) 19:53   No:35661     
Title: Re:無題    
ブラウザ変えるとダウンロードできたとか
過去ログにあったような・・・


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

Name: KKXY  ..ぴよぴよ(117ポイント)   Date: 2009/06/25(木) 21:31   No:35750     
Title: Re:無題    
ほかに方法はございますでしょうか?・・・なんというか原因を知りたいんです。どうして壊れたファイルが
ダウンロードされるのか・・・・。ちなみに自分が使っているブラウザはInternet ExplorerでOSはVistaです。
できれば管理人に直接聞ければいいんですが・・・・・。


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

Name: Dixq (管理人) [URL]  ..ウィザード(1,038,791ポイント)   Date: 2009/06/25(木) 21:39   No:35752     
Title: Re:無題    
こんばんは。管理人です。
どうも、うちが借りているサーバーの問題のようです。
tok2というところでレンタルしているのですが、ここは価格が安い分、サービスが悪く・・。
このような問題が発生していることをカスタマーサービスに何度問い合わせても一向に返事が来ません。

・・一度来たのですが、詳しく教えて欲しいと一度言われてまた返事がなくなりました。
安い価格でサービスを提供していると言っても、あんまりな対応です・・。

今のところgoogle chromeやfirefoxなどのブラウザでDLすると正常にDL出来る場合が多いようですのでよければそちらで試していただけないでしょうか。

長期、料金を先払いしたので、出来ればこのまま使いたいのですが、このままでは状況が改善しそうにありません・・。
その反面もう学生ではなくなったので、少々金銭的に余裕が出てきたこともあり、しっかりしたサーバーを借りてもいいかなと思っていたりもします。
どなたかもし良いサービスを提供しているサーバーレンタルのサイトあれば教えて下さいm(_ _)m


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

Name: KKXY  ..ぴよぴよ(132ポイント)   Date: 2009/06/25(木) 21:46   No:35753 解決!     
Title: Re:無題    
原因がわかりました。どうもありがとうございました。

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

Name: Dixq (管理人) [URL]  ..ウィザード(1,038,831ポイント)   Date: 2009/06/25(木) 21:53   No:35754     
Title: Re:無題    
http://www.serverqueen.jp/
ここ安くていいですね。よさそうなら今週の土日にでも引越ししようかな・・。


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



Name: みもり  ..ぴよぴよ(70ポイント)   Date: 2009/06/25(木) 00:36   No:35701       
Title: メモリの解放ってする必要ありますか?    
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

void make_teritory(void);

int main(void){
    make_teritory();
    return 0;
}

void make_teritory(void){
    char *str;
    // charサイズのメモリ領域を5つ作る
    str = (char *)malloc(5 * sizeof(char));
    //
    memset(str, 'A', 5);
    *(str+5) = '\0';
    printf("%s\n", str);
}

上のプログラムのとき、strで取得したメモリ領域は解放する意味ありますか?
make_teritory関数を抜けたときに解放されるものだと思っているのですが、認識が間違っていたら教えてください。


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


Name: Korsakov  ..ぴよぴよ(127ポイント)   Date: 2009/06/25(木) 01:24   No:35703     
Title: Re:メモリの解放ってする必要ありますか?    
関数を抜けても、取得したメモリーは解放されません。
単にローカル変数として使いたいなら、配列を宣言した方良いですよ。

もしデバッガをお持ちなら、デバッグしてみてください。

只、上記のプログラムでは、関数を抜けた後にプログラムが終了しておりますので、
別に解放しなくても良いです。


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

Name: 山崎  ..中級者(14,887ポイント)   Date: 2009/06/25(木) 07:33   No:35709     
Title: Re:メモリの解放ってする必要ありますか?    
おはようございます。

プログラムの規模が大きくなってきますと、メモリ解放は必要不可欠になってきます。
特に、ゲームを作るときなんかはそうですね。
メモリ解放の意味があるか無いかと聞かれますと、「ある」ですね。

ただKorsakovさんもおっしゃるとおり、
提示されているプログラムでは、メモリ解放をしなくてもあまり差し支えはなさそうです。
mallocなどで動的に確保された領域は、プログラム終了と同時に解放されます。
malloc後に関数を抜け、すぐにプログラムを終了しているのでメモリに関する部分では問題は無いと思います。

普通に宣言された変数と、動的に確保された領域の違いは大丈夫でしょうかな?
普通に宣言された変数とは、
char *str; とか
int Value[2]; とかですね(本当は自動変数と言います)。
普通に宣言された変数は、ご存知のとおり関数内で宣言すれば関数を抜けるときに自動的に解放されます。
動的に領域を確保すれば、プログラマが明示的に解放しない限りどこで確保しても自動で解放されません。
(普通の変数でもstaticにすれば自動で解放されなくなったりしますが)

例外はいくつかあったりするんですが、基本はこのくらいの認識でいいのではと考えます。


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

Name: dic  ..プログラマー(25,201ポイント)   Date: 2009/06/25(木) 17:40   No:35730     
Title: Re:メモリの解放ってする必要ありますか?    
メモリの開放は最終的にはOSが行ってくれるんでしたっけ?(ちょっとうる覚えなんで自信ないです
Javaでは自動でメモリを開放してくれるガーベージコレクションがありますが、
ちょっと私の勉強不足で、教えれるレベルにありません

メモリ4G、8G当たり前の時代ですから気にしなくていいかもしれないですが
私は自分で明示的に解放するようにしてます
スレッドにメモリを割り当てて何個もスレッドを生成、何個かスレッド終了して
なんかメモリが残ってるスレッドから、有効な値が変更される可能性などある場合があるんで
開放して、無効にしておきたいからです
例外が発生して止まりますから
まぁ、よほどのことでもやらない限りですが


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

Name: 通りすがり  ..上級者(17,102ポイント)   Date: 2009/06/25(木) 17:55   No:35733     
Title: Re:メモリの解放ってする必要ありますか?    
(誤)うる覚え
(正)うろ覚え


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

Name: たかぎ [URL]  ..ハッカー(106,838ポイント)   Date: 2009/06/25(木) 20:37   No:35746     
Title: Re:メモリの解放ってする必要ありますか?    
> メモリの解放ってする必要ありますか?

そう尋ねられれば、「必要あります」としか回答できません。
どのように振る舞うかを正確に把握できているのであれば、自分の責任において「解放しない」という選択をするのもよいでしょう。

> 上のプログラムのとき、strで取得したメモリ領域は解放する意味ありますか?

これに関しては、「意味がある」ということになります。

> dicさん
> メモリ4G、8G当たり前の時代ですから気にしなくていいかもしれないですが

処理系不明の状況で、そのような過程は無理があります。
アドレス空間が64Kバイト以下のコンピュータも、まだ普通に使われているのですから。
その意味で、OSの存在の有無も含めて、何一つ期待することはできません。

それに、PCだけを考えても、4G、8Gが当たり前というようなことはありません。
現在市販されている最新機種でも、1G程度のメモリしか搭載していないものが普通に存在しています。




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



Name: abc  ..入門者(4,424ポイント)   Date: 2009/06/25(木) 18:35   No:35736       
Title: クリックイベント    
座標を指定して、他アプリのボタンを自動クリックさせたいのですが、どのような方法があるのでしょうか?

言語はC言語かVBでお願いします。OSはXPです。


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


Name: バグ [URL]  ..ハッカー(160,149ポイント)   Date: 2009/06/25(木) 19:03   No:35738     
Title: Re:クリックイベント    
VBは.NETですか?
C#.NETで以前組んだアプリならば、私のHPからダウンロードできますが…
AutoMouseClickかAutoMouseClickProというアプリがそうです。
必要でしたら、ソースをお渡ししましょうか?
VB.NETもC#.NETもそんなに大きくは違わないと思いますので、解析していただければ簡単に移殖できると思いますよ。

ちなみに私が使用した方法は、WINAPIのSendInputを使用しました。


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

Name: abc  ..入門者(4,496ポイント)   Date: 2009/06/25(木) 19:22   No:35740 解決!     
Title: Re:クリックイベント    
バグさんありがとうございます。
VB.NETです。
WINAPIのSendInputこれをちょっと見てみます。
ソースは悪いですからいいですよ(解析できるか分からない為)
ありがとうございました(^^)


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



Name: そーやー  ..ぴよぴよ(502ポイント)   Date: 2009/06/24(水) 21:00   No:35672       
Title: ポインタに関する質問です1    
こんにちは。お世話になっております。
現在ポインタの勉強をしていますがエラーの意味がわからず質問させていただきました。

#include <stdio.h>

int main(void){
    int i, j;
    int ma[3][2];

    for(i=0; i<3; i++){
        for(j=0; j<2; j++){
            printf("ma[%d][%d] = %p\n", i, j, &ma[i][j]);
        }
    }
    printf("\n");
    printf("maのアドレス:%p\n", &ma);

    int *p_ma;
    printf("p_maのアドレス:%p\n", &p_ma);
    // (★)
    p_ma = &ma;
    printf("p_maのアドレス:%p\n", &p_ma);
    return 0;
}

(★)の部分で
error C2440: '=' : 'int (*)[3][2]' から 'int *' に変換することはできません。(新しい動作 ; ヘルプを参照)
指示された型は関連がありません; 変換には reinterpret_cast、 C スタイル キャストまたは関数スタイルのキャストが必要です。
というメッセージが表示され実行に失敗します。
p_maというポインタを宣言しておいて、maの先頭配列をコピーしようとしているだけですのになぜ失敗するのでしょう。

エラーコメントの意味から判断する力もないので、どなたか助けてください。


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


Name: ねこ  ..中級者(11,822ポイント)   Date: 2009/06/24(水) 21:20   No:35681     
Title: Re:ポインタに関する質問です1    
p_maは「int*」です
&maは「int**」です

p_ma = ma;が正しいです。


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

Name: non  ..熟練のプログラマー(50,017ポイント)   Date: 2009/06/24(水) 21:34   No:35685     
Title: Re:ポインタに関する質問です1    
>maの先頭配列をコピーしようとしているだけですのになぜ
>p_ma = &ma;
>printf("p_maのアドレス:%p\n", &p_ma);

何をしたいのかちょっと意味がわかりません。


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

Name: フリオ  ..プログラマー(29,957ポイント)   Date: 2009/06/25(木) 05:53   No:35707     
Title: Re:ポインタに関する質問です1    
 
>p_maは「int*」です
>&maは「int**」です
>p_ma = ma;が正しいです。
 
 ma は、 int (*)[2] 、&ma は、 int (*)[3][2] です。

したがって、

int (*p_ma)[2];
p_ma = ma;

または、

int (*p_ma)[3][2];
p_ma = &ma;

です。
 


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

Name: ねこ  ..中級者(12,139ポイント)   Date: 2009/06/25(木) 09:22   No:35711     
Title: Re:ポインタに関する質問です1    
何か凄い恥ずかしい間違いをしてるorz、一次でもint**じゃなくint *[2]ですよね。
No:35681は無かったことにしてください(汗)


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



Name: てる  ..かけだし(1,250ポイント)   Date: 2009/06/25(木) 00:28   No:35700       
Title: C言語での迷路ゲーム    
極一般的な文字を使った迷路ゲームです。
↓のプログラムなのですが、
実行すると上の画像のように簡単なマップに見える様文字が表示されます
"☆"-現在地
"■"-壁
" "-通路
"●"-スタート地点
"○"-ゴール地点
移動の判定はscanfで数字を入力してもらいdirの値(0-上 1-左 2-下 3-右)に
よって移動方向が変わる、という形にしました。
関数check(dir)で移動先の場所が2(壁)であるか判定しているのですが、
最初スタート地点から下(DOWN)に移動したあと移動できる方向が右(RIGHT)のみになるという
不都合が生じています。
なぜ、右方向以外が壁判定がON(移動不可)になってしまうかが自分なりに数時間検討しましたが
分からなかったので助けを求めての投稿になります。
なぜ壁があると判定されてしまうのか教えていただけると幸いです。
(調べたところ、右方向以外の先は2(壁)の値が帰ってくる様です)

goto文を使ってしまっているのは簡略化のためです、申し訳ない。


#include<stdio.h>

#define TATE 8
#define YOKO 8
#define UP 0
#define LEFT 1
#define DOWN 2
#define RIGHT 3
#define EXIT 0xff
#define START 0xf0

void byouga();
void go(int ido);
void check(int x2);

int map[TATE][YOKO]={
{2,START,2,2,2,2,2 ,2},
{2,1,1,1,1,2,1,2},
{2,1,2,1,2,2,1,2},
{2,1,2,1,2,1,1,2},
{2,1,2,1,1,1,2,2},
{2,2,2,1,2,1,2,2},
{2,1,1,1,2,1,1,2},
{2,2,2,2,2,2,EXIT,2},
};
int moto;
int x=1;
int y=0;
int key;
int dir;
int kabeflg=0;

int main (void)
{
while(map[y][x]!=EXIT){
printf("\n現在地・・・☆\n\n");
printf(" 0\n1 3\n 2\n\n");
moto=map[y][x];
map[y][x]*=0;
byouga();
map[y][x]=moto;
jump:
scanf("%d", &dir);
check(dir);
if(kabeflg==1)
{
printf("壁があります\n");
kabeflg=0;
goto jump;
}
if(dir<=3&&0<=dir)
{
go(dir);
}else{
printf("正しいキー入力をお願いします\n");
goto jump;
}
}
printf("\nゴール!!");
}
void check(int x2)
{
switch(x2){
case UP:
if(map[y-1][x]==2)//壁がある
{
kabeflg=1;
}
break;
case LEFT:
if(map[y][x-1]==2)//壁がある
{
kabeflg=1;
}
break;
case DOWN:
if(map[y+1][x]==2)//壁がある
{
kabeflg=1;
}
break;
case RIGHT:
if(map[y][x+1]==2)//壁がある
{
kabeflg=1;
}
break;
default:
break;
}
}
void byouga()
{
int i,j;
for(i=0;i<TATE;i++){
for(j=0;j<YOKO;j++){
switch(map[i][j]){
case 0:
printf("☆");//現在地
break;
case 1:
printf(" ");//移動可 (通路
break;
case 2:
printf("■");//移動不可(壁
break;
case START:
printf("●");//スタート地点
break;
case EXIT:
printf("○");//ゴール地点
break;
}

}
printf("\n");
}
}
void go(int ido)
{
if (ido == UP )y--; //0
else if(ido == LEFT )x--; //1
else if(ido == DOWN )y++; //2
else if(ido == RIGHT)x++; //3
}


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


Name: 山崎  ..中級者(14,554ポイント)   Date: 2009/06/25(木) 07:13   No:35708     
Title: Re:C言語での迷路ゲーム    
おはようございます。

>最初スタート地点から下(DOWN)に移動したあと移動できる方向が右(RIGHT)のみになるという
不都合が生じています。

とのことですが、こちらのほうでプログラムを試してみたところ、ちゃんと下に動くことができました。
そのときの様子をスクリーンショットにして添付してあります。
ゴールまでは試していませんが、スタート地点周辺は全てちゃんと動けるように見えます。

プログラムをリビルドしたり、パソコンを再起動したりすれば動くようになったりしないでしょうか?



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



Name: VBユーザ  ..ぴよぴよ(204ポイント)   Date: 2009/06/24(水) 00:32   No:35617       
Title: C言語の配列の大きさについて    
こんにちは。
質問させてください。

まず、ある関数内でtest_str配列の大きさを100で定義しておき以下のようなプログラムを組みます。
void test(int n){
    char *test_str[100];
    
    // 開始位置を探索
    int startpoint;
    int endpoint;
    for(i=0; i<n; i++){
        if(strcmp(str[i], "<<●>>")==0){
            startpoint = i;
            break;
        }
    }
    // 終了位置を探索
    for(i=startpoint+1; i<n; i++){
        if(strcmp(str[i], "<</●>>")==0){
            endpoint = i;
            break;
        }
    }
}

ここで、test_str配列のサイズは100もいらず、必要なのは
endpoint - startpoint + 1
だけで済んだとしたとき、このとき、配列の大きさを再定義することはできませんか?
VBではredimに相当することをやりたいのです。

VBから入ったためか、C言語に非常に苦戦しております。
どなたか教えてください。


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


Name: たかぎ [URL]  ..ハッカー(106,413ポイント)   Date: 2009/06/24(水) 05:20   No:35622     
Title: Re:C言語の配列の大きさについて    
念のため確認しますが、test_strとstrは別物ですね?

だとすると、test_strの宣言位置をstartpointとendpointの値が確定した後に移動し、

char *test_str[endpoint - startpoint + 1];

とすればOKです。
ただし、C99に対応していない処理系の場合にはこの方法は無理ですので、reallocでも使ってください。
あるいは、allocaを使える処理系ならそれでもよいでしょう。


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

Name: VBユーザ  ..ぴよぴよ(339ポイント)   Date: 2009/06/24(水) 21:02   No:35674     
Title: Re:C言語の配列の大きさについて    
>たかぎ様

私がやったときの勘違いかなぁと思ったのですが、その方法ではやはり
「定数式が必要です。」
と起こられてしまいました。

書き忘れましたが、Visual C++6.0の開発環境を利用しています。
ReDimやReDim Preserve相当はreallocなど難しい方法でしか実現できませんか?


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

Name: non  ..熟練のプログラマー(49,954ポイント)   Date: 2009/06/24(水) 21:12   No:35678     
Title: Re:C言語の配列の大きさについて    
たかぎさんの疑問にもあるように

char *test_str[100];

str[i]
の関係はどうなっているのでしょうか?



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

Name: 紅葉  ..中級者(11,323ポイント)   Date: 2009/06/24(水) 23:52   No:35698     
Title: Re:C言語の配列の大きさについて    
定数式が必要ですとでるのは定数でないからです。
配列なんで変動する可能性がある変数で作ることはできません。
万一やりたいのでしたらconstをつけた変数を入れてください。


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

Name: たかぎ [URL]  ..ハッカー(106,652ポイント)   Date: 2009/06/25(木) 00:18   No:35699     
Title: Re:C言語の配列の大きさについて    
> 定数式が必要ですとでるのは定数でないからです。
> 配列なんで変動する可能性がある変数で作ることはできません。

元々C99でないとダメなコードなので、エラーが出る理由としては「C99に対応していないから」というのが正確なところです。

> 万一やりたいのでしたらconstをつけた変数を入れてください。

C言語の場合、constを付けても定数式にはできません。


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



Name: RVD  ..ぴよぴよ(3ポイント)   Date: 2009/06/24(水) 19:59   No:35663       
Title: 株のプログラムの質問    
はじめましてRVDと申します。Javaで株の売買プログラム を作っております。
OS:vista コンパイラ:JDK6
1から 4の流れで
1:CSVファイルで自分が気になっている株の情報を入力する(CSVファイルで株情報を入出力するクラス)

2:CSVファイルで購入金額を決め注文をする。(KabuMapクラス)

3:売買判断を行い、結果をファイルに書き出す。(Strategyクラス)

4:株情報を更新する。 

 1から4の流れでやっておりますが、バグがでて困っています。
 http://rg550.hp.infoseek.co.jp/cgi-bin/joyful/img/720.txt  
 
 どなたかアドバイスをください? どうぞ宜しくお願い致します。



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


Name: RVD  ..ぴよぴよ(61ポイント)   Date: 2009/06/24(水) 20:07   No:35665     
Title: Re:株のプログラムの質問    
 すみません。プログラムを載せていませんでした。
 ここまで作ってみました。
 どなたかアドバイスをお願い致します。


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

Name: ねこ  ..中級者(11,754ポイント)   Date: 2009/06/24(水) 20:21   No:35667     
Title: Re:株のプログラムの質問    
とりあえずどこでどんなバグが起こってるのかを教えてください。

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

Name: RVD  ..ぴよぴよ(231ポイント)   Date: 2009/06/24(水) 22:28   No:35695     
Title: Re:株のプログラムの質問    
エラーはこんな感じです。


Exception in thread "main" java.lang.Error: Unresolved compilation problems:
トークンに構文エラーがあります。構成の位置が間違っています
構文エラーがあります。"}" を挿入して ClassBody を完了してください
構文エラーがあります。"}" を挿入して ClassBody を完了してください
構文エラーがあります。"}" を挿入して MethodBody を完了してください

at Kabu.java.Kabu.main(Kabu.java:205)


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

Name: ねこ  ..中級者(12,109ポイント)   Date: 2009/06/24(水) 23:21   No:35697     
Title: Re:株のプログラムの質問    
エラーのまま、クラス定義等で括弧がちゃんと閉じてないです。
インデントを調節する等して、どこが不足しているかチェックしてみてください。

確かEclipseを使うと括弧の文字が強調されてたので便利じゃないかなと。


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



Name: dic  ..上級者(24,775ポイント)   Date: 2009/06/24(水) 16:46   No:35646       
Title: strcpyについて    
strcpy について 第2引数はNULL終端文字列を指定するようにMSDNにかかれてますが
第2引数が0の場合、エラーが起きます
例を下に書きます


#include <stdio.h>
#include <string.h>

int main()
{
char *p = 0;
char buf[256];

strcpy( buf, p );

return -256;
}


この場合、確実にエラーになるのですが、どのようなエラーを避ける方法があるのでしょうか?
知恵を借りたいです


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


Name: ねこ  ..中級者(11,623ポイント)   Date: 2009/06/24(水) 17:18   No:35648     
Title: Re:strcpyについて    
自分で思い付いて使ってるだけなので、危険かもしれないのですが。
デバッグ時に以下のようなマクロを組み込んでいます。


#define strcpy( A, B ) { \
if( A != NULL && B != NULL ) \
strcpy( A, B ); \
}


こうすると第一、第二引数にNULLが来た場合に処理しないようにできます。

実際に使う際にはelseの後で出力ウィンドウにエラー文章を出すような感じです。
DebugStrFunc.hというヘッダファイルによく使う関数を同じように定義して
下記のような記述を各cppから共通でインクルードするヘッダに記述しています。

#define USE_DEBUG_STR_FUNC // 任意にコメントアウト

#ifdef _DEBUG
#ifdef USE_DEBUG_STR_FUNC
#include "DebugStrFunc.h"
#endif
#endif

参考までに^^;


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

Name: バグ  ..ハッカー(159,793ポイント)   Date: 2009/06/24(水) 17:26   No:35649     
Title: Re:strcpyについて    
そもそも、NULLポインタを引数としているのが駄目なのでは?
ですから、MSDNに書かれているように…

「第2引数はNULL終端文字列を指定するように」

すればいいだけだと思います。


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

Name: dic  ..上級者(24,919ポイント)   Date: 2009/06/24(水) 19:02   No:35656 解決!     
Title: Re:strcpyについて    
>ねこさん
なるほど単純にif文使えばいいですね
盲点でした

>バグさん
私の設計が悪いのか、第2引数に0が来る場合もあるんです
それで、どうやって回避しようかと考えてました


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

Name: non  ..熟練のプログラマー(50,357ポイント)   Date: 2009/06/24(水) 22:03   No:35692     
Title: Re:strcpyについて    
dicさんへ
エラーになるんですか?
どうしてだっけ?


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



Name: トウラ  ..かけだし(1,676ポイント)   Date: 2009/06/22(月) 19:06   No:35542       
Title: 標準ライブラリ関数とヘッダファイルの関係    

#include <stdio.h>

int main()
{
int* p = (int*)malloc(sizeof(int));

*p = 5;

printf("%d\n" , *p);

free(p);

return 0;
}

(学校で使っている教科書のソースコードを今回の質問に合わせたものです)

malloc,free関数を使っているのにインクルードしているのがstdio.hだけなので
これを疑問に思い教授に質問してみました。
すると、処理系によるよと答えていただけたのですが、そうなのでしょうか?

私は、処理系によるというのを
処理系によっては標準ライブラリ関数が宣言されているヘッダファイルが違うことがある
と解釈したのですが、こういうことはあるのでしょうか?

とりあえず納得して帰ったのですが、自宅で上記コードをコンパイルしてみると
error C3861: 'malloc': 識別子が見つかりませんでした
error C3861: 'free': 識別子が見つかりませんでした
というエラーが出ました。
(Vista VC++2008EE です)

処理系による、ということはたまたまVC++がコンパイルできないだけ
なのかもしれませんが、やっぱりなんだかすっきりしません。
私なりに調べてみましたが、stdlib.hが必要と書いてあるところばかりでした。
(サイトによってはmalloc.hも)


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


Name: たかぎ [URL]  ..ハッカー(106,131ポイント)   Date: 2009/06/22(月) 19:10   No:35543     
Title: Re:標準ライブラリ関数とヘッダファイルの関係    
mallocやfreeを使うには、<stdlib.h>をインクルードする必要があります。
標準ヘッダでは、勝手に関係のない宣言を行うことはできませんので、非標準処理系か処理系の不具合以外の理由で、<stdio.h>でmallocやfreeが宣言されることはありません。


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

Name: non  ..熟練のプログラマー(49,164ポイント)   Date: 2009/06/22(月) 19:38   No:35544     
Title: Re:標準ライブラリ関数とヘッダファイルの関係    
学校の環境はなんですか?座学だけですか?



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

Name: トウラ  ..かけだし(1,844ポイント)   Date: 2009/06/22(月) 21:02   No:35554     
Title: Re:標準ライブラリ関数とヘッダファイルの関係    
>たかぎさん
回答ありがとうございます。
なるほど、すっきりできました。


>nonさん
>学校の環境はなんですか?座学だけですか?
申し訳ありません。環境は聞いてませんでした。(生徒側がPCを触ることはありません)

なので今まで気にしたことがなかったのであいまいな記憶なのですが
CentOS GCC だと思います。
(明日確認します。)


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

Name: トウラ  ..かけだし(2,010ポイント)   Date: 2009/06/24(水) 18:45   No:35653 解決!     
Title: Re:標準ライブラリ関数とヘッダファイルの関係    
再度質問してみました。

まず、教授持参のPCでもstdlib.hをインクルードしないとコンパイルできなかったようです。
教科書と同じコードを書いているだろうと私が勝手に思い込んでいました。

そして"処理系によるよ"と答えていただいた意味には
・標準に準拠していない処理系もある
・インクルードを省略してもコンパイルできる処理系もある
 (××がインクルードされてないよという警告などが出るがコンパイルは通るそうです)
ということが含まれていたそうです。


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

Name: たかぎ [URL]  ..ハッカー(106,444ポイント)   Date: 2009/06/24(水) 18:52   No:35655     
Title: Re:標準ライブラリ関数とヘッダファイルの関係    
> そして"処理系によるよ"と答えていただいた意味には
> ・標準に準拠していない処理系もある
> ・インクルードを省略してもコンパイルできる処理系もある
>  (××がインクルードされてないよという警告などが出るがコンパイルは通るそうです)
> ということが含まれていたそうです。

おそらくその教授は理解していません。
話半分に聞いておいた方がよいでしょう。


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

Name: toyo  ..プログラマー(36,418ポイント)   Date: 2009/06/24(水) 19:14   No:35658     
Title: Re:標準ライブラリ関数とヘッダファイルの関係    
gcc3だとstdio.hやstdlib.hやstring.hをincludeしなくてもコンパイルできたりします
gcc4では改善?されましたが


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

Name: tkmakwins15  ..比類無きプログラマー(97,742ポイント)   Date: 2009/06/24(水) 20:43   No:35669     
Title: Re:標準ライブラリ関数とヘッダファイルの関係    
確かCではプロトタイプ宣言なしでもコンパイルはできた気がしますが…
C99ではプロトタイプが必要になったんでしたっけ…?


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

Name: non  ..熟練のプログラマー(50,328ポイント)   Date: 2009/06/24(水) 21:53   No:35689     
Title: Re:標準ライブラリ関数とヘッダファイルの関係    
たとえどうあれ、組み込み関数を使うときはそれに対応したヘッダーが必要だと
教えるのが学校の先生の役目だと思うな。


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

Name: たかぎ [URL]  ..ハッカー(106,554ポイント)   Date: 2009/06/24(水) 21:59   No:35691     
Title: Re:標準ライブラリ関数とヘッダファイルの関係    
> たとえどうあれ、組み込み関数を使うときはそれに対応したヘッダーが必要だと
> 教えるのが学校の先生の役目だと思うな。

そういうこと。

処理系の不具合で、どうしても正統な方法が使えないのなら仕方ありませんが、それ以外の理由でおかしな方向に教え子を導くのはダメです。
# そうはいいつつも、いろいろとしがらみがあるのが教育現場の実情ですが...


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



Name: ひよこ  ..熟練のプログラマー(44,325ポイント)   Date: 2009/06/24(水) 19:15   No:35659       
Title: 描画されないのですが    
自分のゲームでデバッグでスペルカードが描画されないのですがどうしたらよいのでしょうか?
龍神録の改造です。



//load.cppから抜粋

void load(){
int t;
SetCreateSoundDataType( DX_SOUNDDATATYPE_MEMPRESS ) ;

t=GetNowCount();
spell.img[0]=LoadGraph("../dat/img/spell/spell0.bmp");

//graph.cppから抜粋

void graph_spell_card(){
//if(boss.flag==0){
/*switch(boss.spell_card[boss.knd]){
case 1:
DrawGraph(500,300,spell.img[0],TRUE);
break;
case 2:
break;
default :
*/ DrawGraph(300,300,spell.img[0],TRUE);
// break;
//}
//}
}

void graph_main(){

if(bright_set.brt!=255)SetDrawBright(bright_set.brt,bright_set.brt,bright_set.brt);

graph_back_main();//背景描画メイン
graph_effect(0);//敵が死ぬエフェクト

if(bright_set.brt!=255)SetDrawBright(255,255,255);

graph_effect(4);//喰らいボムのエフェクト

if(bright_set.brt!=255)SetDrawBright(bright_set.brt,bright_set.brt,bright_set.brt);

graph_child();//ボスのアシスト描画
graph_item();//アイテム描画
graph_boss();//ボス描画
graph_enemy();//敵の描画
graph_cshot();//自機ショットの描画

if(bright_set.brt!=255)SetDrawBright(255,255,255);

graph_ch();//自機の描画

if(bright_set.brt!=255)SetDrawBright(bright_set.brt,bright_set.brt,bright_set.brt);

graph_lazer();//レーザーの描画
graph_bullet();//弾の描画

if(bright_set.brt!=255)SetDrawBright(255,255,255);

graph_effect(1);//ボムのエフェクト
graph_effect(2);//ボム線のエフェクト
graph_effect(3);//ボムキャラのエフェクト
graph_stage_title();//タイトルの表示
graph_board();//ボードの描画
graph_flash();//フラッシュ描画
graph_zanki_enemy();//ボスの残り弾幕
graph_develop();//stage_count
draw_fps(0,465);//fps描画
graph_endtime();//エンドタイム
graph_spell_card();
}


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


Name: やそ  ..比類無きプログラマー(92,055ポイント)   Date: 2009/06/24(水) 19:55   No:35662     
Title: Re:描画されないのですが    
コメントアウトされてるからじゃないですか??

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

Name: ひよこ  ..熟練のプログラマー(44,406ポイント)   Date: 2009/06/24(水) 21:06   No:35676     
Title: Re:描画されないのですが    
VisualC++に貼ると
DrawGraph(300,300,spell.img[0],TRUE);が書かれています。
すみません。いろいろ試しながらやっているので・・・汚いですね。


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

Name: ねこ  ..中級者(11,792ポイント)   Date: 2009/06/24(水) 21:11   No:35677     
Title: Re:描画されないのですが    
graph_endtime関数の後にあるからScreenFlipの後に描画されて、更に背景塗り潰しで消えてるんじゃないですか?

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

Name: ひよこ  ..熟練のプログラマー(45,042ポイント)   Date: 2009/06/24(水) 21:20   No:35683     
Title: Re:描画されないのですが    
背景はgraph_back_main();//背景描画メイン で描画されています。

graph_endtime関数の後にあるからScreenFlipの後に描画されて、
更に背景塗り潰しで消えてるんじゃないですか?
>>よく意味がわかりませんが、
>> 描画>表に表示じゃないのですか?
>>いちおうmain.cppを置いておきます。

//main.cppから抜粋
while(ProcessLoop()==0){//メインループ
music_ini();
switch(func_state){
case 0://初回のみ入る処理
load(); //データロード
first_ini();//初回の初期化
func_state=99;
break;
case 99://STGを始める前に行う初期化
ini();
load_story();
func_state=100;
break;
case 100://通常処理
fantasy_check();
calc_ch();
ch_move();
cshot_main();
enemy_main();
boss_shot_main();
shot_main();
out_main();
effect_main();
calc_main();
graph_main();
bgm_main();
if(boss.flag==0)
stage_count++;
break;
case 103://ラノベ
calc_ch();
ch_move();
calc_cshot();
graph_main();
fantasy_disp();
break;

default:
printfDx("不明なfunc_state\n");
break;
}
music_play();
fps_wait();
if(CheckStateKey(KEY_INPUT_ESCAPE)==1)break;//エスケープが入力されたらブレイク
ScreenFlip();//裏画面反映
count++;

}


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

Name: ねこ  ..中級者(11,921ポイント)   Date: 2009/06/24(水) 21:24   No:35684     
Title: Re:描画されないのですが    
失礼、その関数が描画終了系(ScreenFlipとか)関数を読んでるのかと思いました。

他の画像は表示されてるようなら、
スペカ画像のグラフィックハンドルが-1になってないか(spell.img[0]の中ね)
問答無用で描画するようにしても(switch文の後ろに描画処理を入れてみる)表示されないか等をチェックしてみてください。
もしかしたら画像ファイルに問題があるのやもしれません。


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

Name: ひよこ  ..熟練のプログラマー(45,051ポイント)   Date: 2009/06/24(水) 21:34   No:35686     
Title: Re:描画されないのですが    
スペカ画像のグラフィックハンドルが-1になってないか
>>それって読み込みエラーでしょうか?

switch文自体をコメントにしてます。(もとより普通状態でできないなら無理だと思いました。

LoadGraphScreen(40,50,"../dat/img/spell/spell0.bmp",TRUE);
を入れると画像が描画されました。


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



Name: 東 康生  ..ぴよぴよ(0ポイント)   Date: 2009/06/24(水) 00:35   No:35618       
Title: 日本語の扱いについて    
char *p1 = "My Name Is 東 康生です。";
と初期化して、
EE EEEE EE J JJJJJ
と出力したいです。

やりたいことは、英語と日本語の識別です。
文字列操作をするときに1バイト文字と2バイト文字が複合されていると非常に使いづらいですので、どうにかやる方法はないでしょうか?



Name: たか  ..初心者(7,927ポイント)   Date: 2009/06/24(水) 02:44   No:35620     
Title: Re:日本語の扱いについて    
ユニコードとして処理すると楽じゃないでしょうか?
一文字を2byteで扱うので、英語も日本語も関係なく扱えます。

#include <stdio.h>
#include <string.h>

void trans(wchar_t *s)
{
int len;
int i;

len = wcslen(s);
for( i=0; i < len; i++ )
{
if(s[i] >= L'A' && s[i] <= L'z')
s[i] = L'E';
else if(s[i] == L' ')
s[i] = L' ';
else
s[i] = L'J';
}
}

int main(int argc, char **argv)
{
/* 'L'をつけることで UNICODE になります。 */
wchar_t wstr[] = L"My name is 東 康生です。";

trans(wstr);
wprintf(wstr);

return 0;
}

MinGW + gcc3.4 で動作を確認しました。
上記の文では動きますが、記号や数字が入ると誤認識します。
改良してみてください。


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

Name: non  ..熟練のプログラマー(49,900ポイント)   Date: 2009/06/24(水) 09:46   No:35627     
Title: Re:日本語の扱いについて    
2バイト文字がShift_JISなら、Shift_JISの1バイト目は0x81以上ですので
区別できます。

#include <stdio.h>
#include <string.h>

void trans(char *s1,char *s2)
{
while(*s1!='\0'){
if(*s1==' ')
*s2++=*s1;
else if((unsigned char)*s1>0x80){
*s2++='J';s1++;
}
else
*s2++='E';
s1++;
}
*s2='\0';

}

int main(void)
{
char *p1 = "My name is 東 康生です。";
char str2[256];
trans(p1,str2);
printf(str2);
return 0;
}



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

Name: Blue  ..中級者(10,727ポイント)   Date: 2009/06/24(水) 10:00   No:35628     
Title: Re:日本語の扱いについて    
半角カナは「J」?
全角英字は「E」?
全角空白は「 」?
記号は?

もう少し明確にできませんかね?
文字コードも、環境に依存しますし。


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

Name: 東 康生  ..ぴよぴよ(162ポイント)   Date: 2009/06/24(水) 20:59   No:35671     
Title: Re:日本語の扱いについて    
> たかさん
ありがとうございます。
wchar_t型にしてしまうと、strcpyやstrcmp関数が使えなくなったり不便なので出来る限り使いたくありませんでした。

> nonさん
ありがとうございました。
おっしゃる方法が一番適当なので、当面使わせていただきます。

> Blueさん
環境依存についてよくわかっていませんでした。(今も)
使用環境は学校くらいですので、環境依存は知識については知っていても経験としては全然理解しておりませんので。
すいません。
nonさんの方法では、半角カナや全角英字、全角空白は対応できませんか?

>もう少し明確に・・
後学のためどこまで書けば明確な質問か教えてください。
ちょっと、どこまで質問すれば回答者様にとって回答しやすいかわからないので・・・


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

Name: non  ..ぴよぴよ(374ポイント)   Date: 2009/06/24(水) 21:17   No:35679     
Title: Re:日本語の扱いについて    
>nonさんの方法では、半角カナや全角英字、全角空白は対応できませんか?

半角カナについては触れてなかったのであえて除外しましたが、
正確に言うと2バイト文字は0x81以上だけの条件ではありません。半角カタカナの範囲も
除外されています。SHIFT-JISで検索してコード表を調べればOKです。
全角英字でも、全角空白でもコード表をみればわかるはずです。


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



Name: MNS  ..中級者(10,372ポイント)   Date: 2009/06/22(月) 20:10   No:35546       
Title: 戦略ゲームについて    
現在、戦略シミュレーションゲームを製作しています。
今現在、
・自ユニットの移動範囲を求める処理
・自ユニットの移動処理
・敵ユニットへの攻撃処理
が大方できており、

ユニットの情報として
・HP
・攻撃力
・他ユニットとの相性
・移動力
などがあり、

マップ(1チップ)の情報として
・移動コスト
などがあります。

今現在はゲームシステムとしての基盤の製作がほぼ終わり、
ゲームタイトル⇒ゲームメイン⇒{自分のターン⇔敵のターン}⇒終了
の流れが出来てきたので、
今度は敵AIを作ろうと考えているのですが・・

それの処理が全く思いつきません。
少なくとも、AIを作る上で必要な情報とは何なのでしょうか?
一応、マスの重み付けというものを行おうとして、
クラスを設計しているのですが、

敵AIは複数作ろうと考えているため、
各AIごとにマスの重みを計算していたら、時間がかかりすぎますし、
かといって一度計算してたものをデータとして入れて再利用しようとしても、
メモリの消費が大きすぎると思います。

まず最初に敵AIの移動処理から作っていこうと考えているんですが、
聞きたいことは次のようなことです。
・AIを作る上で必要な情報は何か
・AIはどのような設計にするのが良いか
 (設計というか、どのようなクラスが必要か)
・そもそも、戦略SLGのAIとはどのようにして出来ているのか
ということです。

かなり曖昧な質問になってしまいましたが、回答をお願いします。


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


Name: Justy  ..伝説なるハッカー(378,700ポイント)   Date: 2009/06/23(火) 01:39   No:35579     
Title: Re:戦略ゲームについて    
 今ひとつ質問の意味を正しく読み取れてるか自信がないのですが。
ここで言っている AIというのは移動処理だけの話ですか?

 それとも、移動処理を含めた敵の思考アルゴリズム全般の話でしょうか?

 とりあえず全般ということで話を進めます。



>AIを作る上で必要な情報とは何なのでしょうか?

 AIを作る上で参照するパラメータのことでしょうか?

 であれば、ざっくりと言うなれば、とるべき行動を決めるための判断基準になる
パラ−メータ全て、でしょうか。

 まさに上で上げられている、各ユニットのHP、攻撃力、移動力、位置などなどです。
(勿論、他のユニットの情報をどこまで知ることができるか、の仕様によっては
制限する必要があります)

 たとえば回復行動1つとっても、
・ 敵(といってもプレイヤー側のユニットのことですが)に囲まれていないときは
自分のHPが 1/4以下になったら回復
・ 0〜1回の移動で攻撃圏内に自分が入ってしまう敵が周囲に1体いる場合、
自分のHPが 1/3以下になったら、複数居るようなら 1/2以下になったら回復
・ 特にやることがなく、1回で移動可能な周囲にHPの低い者がいたら、
そこまで移動して回復してあげる

 のように、条件を複雑にすればするほど状況に合わせた行動がとれますが、
必要になるパラメータは増えていきます。

 さらに言えば、その可視情報から導き出される確定した情報や
類推される情報(的外れであってもいい)とかも含まれます。



>各AIごとにマスの重みを計算していたら、時間がかかりすぎますし

 重みというのが移動の話でしたら、移動パスを見つけるのには多少時間は
かかるのは仕方ありません。

 メモリに関しては、その消費量を見てみないとなんとも言えませんが……。



>AIはどのような設計にするのが良いか

 実装的な設計はゲーム毎に違うので、説明するのは難しいです。
 しかしながら、戦略ものは長考になるのは避けがたいので、
スレッドを使って思考することになります。



>そもそも、戦略SLGのAIとはどのようにして出来ているのか

 これもいろいろあるので、一概には言えないのですが、
よくあるタイプの SLGの一例を挙げてみます。


 まずはチーム AIです。ステージの最初の段階で、
チームの戦略、目的、行動の傾向を決めます(ステージの途中で変わることもあります)。

 そのチームの目的が特定目標物の撃破を行うのか、拠点などの防衛を行うのか、
或いは敵を全て殲滅させるのか、撤退するのか等です。

 この何を優先するべきなのかは、チームに所属するユニット全体の優先的な
行動指針となり、各ユニットの判断基準に影響を与えます。


 これを決めた上でキャラクタ AI……各ユニットの行動を決めるのですが、
ここはチーム AIの指針とも照らし合わせつつ、決めます。

 決め方はこれもいろいろあるのですが、単純に優先順に条件チェックして決めてもいいですし、
その選択をとった場合の状況を評価(場全体か、周囲の対象だけを限定してもいいです)し
もっとも高い評価を得られるものを選択してもいいです
(難易度を下げる等の目的で必ずしもそうするとは限りませんが)。

 移動という選択肢に関しては、移動後の攻撃、そして次のターンで受ける相手からの攻撃、
可能なら周囲の敵味方ユニットの状況(敵の射線を避けたり、味方の支援をうけられるかどうか)を
併せて評価値として出して、どこがベストなのか出した方がいいでしょうね。

 後は単一なアクションだけで動いても十分かもしれませんが、
必要なら未行動の味方ユニットの行動を巻き込んでしまってもいい(連携)ですし、
もう一回り大きな指針を立てその指針に沿うように数ターンかけた複数の
アクションに分解して思考するのを混ぜるとよりいい AIになります。

 他にも状況によっては特定の目的を持たせてひたすらそれしかしないのが
居てもいいですね。


 と、まぁざっくりと書きましたが、ちゃんと動けばやればやるほど賢くなりますが、
下手するとドツボにもはまりかねないので、最初はこむずかしいことを考えないで、
もっとずっとシンプルなものを実装するのがいいかと思います。


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

Name: やそ  ..比類無きプログラマー(92,044ポイント)   Date: 2009/06/23(火) 13:02   No:35586     
Title: Re:戦略ゲームについて    
参考になるかもしれない(ならないかもしれない)URL

ttp://www.jyouhoukaiseki.com/index.html


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

Name: MNS  ..中級者(11,149ポイント)   Date: 2009/06/23(火) 21:45   No:35608     
Title: Re:戦略ゲームについて    
>Justyさん

回答ありがとうございます。

はい、移動処理ではなく敵の思考ルーチンについてです。

必要な情報については、ユニットの情報だけで大丈夫と考えてよろしいのでしょうか?
(つまり、AIを設計するにあたり、ユニットに新たな情報を持たせる必要が無い、ということ)

私が知りたかったのは実装面の話なのですが、
私の質問自体、実装に関するものが何も書かれてませんでしたね。すいません。

例えば、Justyさんが言われている回復行動を挙げると、
・ 自ユニットの移動範囲を求める
・ 自ユニットの移動範囲に敵が存在しないか調べる
・ 敵ユニットの攻撃範囲を求め、自ユニットがその範囲に入っていないか調べる
・ 自ユニットの移動範囲に味方ユニットいないか調べ、
  その味方ユニットが敵ユニットの攻撃範囲に入っていない場合、そのユニットを回復する

生真面目に自ユニット数または敵ユニット数×自ユニット数分の
計算をしていたら、莫大な時間がかかることは確かですよね。

私が知りたかった点は、この点を踏まえて、どのような設計にすべきか、ということです。

最初の投稿内容にも書いたとおり、最初はユニットの移動処理について実装しようとしたのですが、
ユニットには敵の攻撃範囲を避けながら移動して欲しいかったので、
各マスごとにコストを付けることが必要だと考えました。

私が考えた構造は次のようなものです。
ターン終了時に全ユニットの攻撃範囲を求め、
その攻撃範囲に入っていたマスのインデックスをキーとし、
コストを値としてstd::mapに入れておく。

ただ、これでは自ユニットの区別が付かないので、
コストを計算したユニットのチームナンバーなどとの構造体として入れることを考えました。
(つまり、チームナンバーが同じであったら、コストを計算しない)

もちろん、これでも攻撃範囲が重なった時に対応できませんし、
複数のターンを考慮したうえでの移動を行うことは不可です。

とりあえず、今はこの点に関しての良いアプローチが知りたいです。
(チームAIなどを考慮した場合であると尚良いのですが・・)

>やそさん
どうもありがとうございます。
少しレベルが高い気もするんですが、
参考にさせてもらいます。


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

Name: Justy  ..伝説なるハッカー(379,199ポイント)   Date: 2009/06/24(水) 02:54   No:35621     
Title: Re:戦略ゲームについて    

>ユニットの情報だけで大丈夫と考えてよろしいのでしょうか
>AIを設計するにあたり、ユニットに新たな情報を持たせる必要が無い

 その判断はこちらではできません。

 でも現在のユニット情報に何があのかや AI仕様によっては
追加で何か持たせる必要は出てくると思いますよ。



>敵ユニット数×自ユニット数分の計算をしていたら
>莫大な時間がかかることは確かですよね

 何百、何千体が一同に会しているような状況だとまともにやるのは
ちょっと辛いどころではなくなりますね。

 でも、2,30体程度であれば、(よほどな AI仕様でもない限り)、
そんなに長大な時間はかからないような。

 それに一気に全ユニットの行動を完全に決めて、表示を行うわけではなく、
どういう行動をとるかを1体1体演出を入れながら見せていくかと思うので、
その裏で次のユニットの行動をどんどん決めていけば、体感的に待たされている感を
軽減させることもできます。

 このあたりは1体あたりの思考時間を調整して、うまくバランスをってあげる
必要がありますね。



>コストを値としてstd::mapに入れておく
>ただ、これでは自ユニットの区別が付かないので

 影響マッピングを行うところまではいいのですが、なぜ両チーム混在データに
なっているのでしょうか?

 別けておけば区別は直ぐですし、重なりも同チーム同士のものだけになります。

 あと、位置から検索するなら mapより vectorの方が速そうな気がします。
 というかこのコストって、地形コストにして加算して使うものではないのでしょうか?


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

Name: MNS  ..中級者(11,167ポイント)   Date: 2009/06/24(水) 06:15   No:35624     
Title: Re:戦略ゲームについて    
>Justy さん
もしかして、私の考えは根本的に間違ってますかね。

std::vectorではなくstd::mapを使ったのは、
std::vectorだとマップの高さ×マップの幅分の要素をとる必要があり、
これではメモリ消費が激しいと考えたからです。

チームごとに分けず、全チーム混在データかというと、
これも、チームごとにコストを分けていたら、
データ量が膨れ上がってメモリの消費が懸念されたから、なのですが

これは私の勝手な先入観なのでしょうか?
そこまで、メモリは消費しないものなのですか?
ユニット数も、多くて数百体になると思うんですが
全ユニット数×全ユニット数回のアクセスくらいは大した時間はかからないんでしょうか?

地形コストに加算するのはそうなんですが、
両チーム混在データだったので・・


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

Name: toyo  ..プログラマー(36,384ポイント)   Date: 2009/06/24(水) 06:38   No:35625     
Title: Re:戦略ゲームについて    
昔の8ビットパソコンとか携帯ゲーム機じゃなければメモリは気にしなくていいのでは
時間は作ってみなければわからないのでまず作ってみて遅ければ考え直すということではだめですか


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

Name: MNS  ..中級者(11,220ポイント)   Date: 2009/06/24(水) 20:10   No:35666 解決!     
Title: Re:戦略ゲームについて    
そうですね。
とりあえず、処理速度やメモリ使用量は考えないで作ってみることにして、
そこで何か問題があったら、再び質問することにします。
どうもありがとうございました!


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



Name: yskey  ..かけだし(1,913ポイント)   Date: 2009/06/24(水) 18:29   No:35651       
Title: int型変数の画像ロードについて    
どうもこんにちは、yskeyです。
DxLibを使っていていまさら思ったのですが。
int型は最近のパソコンなら一つ宣言するとメモリ上に4KB確保されますよね?
DxLibの関数LoadGraphを使用してそのint型変数に画像をロードしたとして、もし画像のサイズが4KBを超えているとメモリ上ではどのようになるんでしょうか?
char型変数にサイズを超えた文字列を入れると、宣言して確保したメモリの用量をオーバーしてしまうのなら、これらの画像のint型変数もメモリ上でオーバーしてしまうんじゃないですか?


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


Name: ねこ  ..中級者(11,677ポイント)   Date: 2009/06/24(水) 18:38   No:35652     
Title: Re:int型変数の画像ロードについて    
LoadGraphで返っているのはグラフィックハンドルというメモリアドレスです。
読みこんだ画像情報等を保持している場所のポインタが返っています。


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

Name: yskey  ..かけだし(1,987ポイント)   Date: 2009/06/24(水) 18:46   No:35654 解決!     
Title: Re:int型変数の画像ロードについて    
ねこさん、返信ありがとうございます。
なるほど。アドレスが返ってくるわけですね。
今までそのままintのあるところに入ってると思っていました。


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



Name: チルチル  ..プログラマー(27,367ポイント)   Date: 2009/06/23(火) 21:01   No:35605       
Title: アイコンの更新ができない・・    
DXライブラリの実行ファイルのアイコンを変更していたのですが
新しいアイコンと差し替えようとして
古いアイコンを上書き→再構築をしたのですが
ウィンドウのアイコンは更新されるんですが
実行ファイルのアイコンが古いままです・・
何か足りない事があるのでしょうか・・

アイコンの変更はDXライブラリ本家の

BorlandC++ Compiler 5.5  の場合

でやっています


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


Name: チルチル  ..プログラマー(27,427ポイント)   Date: 2009/06/24(水) 00:15   No:35615     
Title: Re:アイコンの更新ができない・・    
と思ったらアイコンは変わってるんですが
フォルダの中身が拡大表示されている時は
古いアイコンが表示されているようです・・
これはどう言う事なのでしょうか?


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

Name: pooka [URL]  ..初心者(6,944ポイント)   Date: 2009/06/24(水) 00:32   No:35616     
Title: Re:アイコンの更新ができない・・    
アイコンキャッシュが関係あるのでは?
私もDXライブラリを使ったソフトではないですが、
アイコンを変更しても以前のアイコンが表示されたことが何度かあります。
その時は確かアイコンキャッシュを削除することで正常に表示させることができました。


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

Name: チルチル  ..プログラマー(27,464ポイント)   Date: 2009/06/24(水) 18:09   No:35650 解決!     
Title: Re:アイコンの更新ができない・・    
確かに一度シャットダウンすると正常に表示されました
どうもありがとうございます


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



Name: アキ  ..かけだし(1,110ポイント)   Date: 2009/06/23(火) 19:48   No:35603       
Title: 無題    
初心者です。
これをもっと短縮し、わかりやすくできないでしょうか。
よろしくお願いします。
ちなみに3目並べです。
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

const char stone[][3] = {"‐", "○", "×"};
int board[3][3] = {0};

void print_board()
{
int i, j;
for (i = 0; i < 3; i++) {
for (j = 0; j < 3; j++) {
printf("%s", stone[board[i][j]]);
}
printf("\n");
}
printf("\n");
}

int check_board()
{
int i, j;
int s;

for (i = 0; i < 3; i++) {
s = 3;
for (j = 0; j < 3; j++) s &= board[i][j];
if (s) return s;

s = 3;
for (j = 0; j < 3; j++) s &= board[j][i];
if (s) return s;
}

s = 3;
for (i = 0; i < 3; i++) s &= board[i][i];
if (s) return s;

s = 3;
for (i = 0; i < 3; i++) s &= board[i][2-i];
if (s) return s;

return 0;
}

void input(int s)
{
int x, y;
printf("%sの番\n", stone[s]);
do {
if (s == 1) {
while (scanf("%d %d", &x, &y) != 2) {
rewind(stdin);
}
} else if (s == 2) {
x = rand() % 3;
y = rand() % 3;
} else {
exit(1);
}
} while (x < 0 || 3 <= x || y < 0 || 3 <= y || board[y][x] != 0);

board[y][x] = s;
}

int main()
{
int turn = 0;
int winner;

srand((unsigned int)time(NULL));

while (print_board(), (winner = check_board()) == 0 && turn < 9) {
int s = (turn % 2) + 1;
input(s);
turn++;
}

if (winner == 0) {
printf("引き分け\n");
} else {
printf("%sの勝ち\n", stone[winner]);
}

return 0;
}



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


Name: non  ..熟練のプログラマー(49,619ポイント)   Date: 2009/06/23(火) 20:52   No:35604     
Title: Re:無題    
>これをもっと短縮し、わかりやすくできないでしょうか。
目的はなんでしょうか?自分で作ったのなら、それが一番わかりやすいと
思います。それとも、他人がみてわかりやすくということでしょうか?
よく考えて作ってあると思いますよ。


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

Name: LUNA  ..かけだし(1,660ポイント)   Date: 2009/06/24(水) 12:02   No:35634     
Title: Re:無題    
わかりやすくするだけだったら、注釈文をつければいいのでは?
短縮は、初心者の私にとっては結構コンパクトなプログラムに見えますので何もいえませんw


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



Name: ひよこ  ..プログラマー(39,743ポイント)   Date: 2009/06/14(日) 16:18   No:35072       
Title: 音ゲー作ってみました    
この前作っていたゲームができましたので、(すごい機能とかありませんけど
公開しようと思います。
遊んで感想くださるとうれしいです。
アップローダ様
http://down11.ddo.jp/uploader/download/1244963662/attach/%E3%83%9D%E3%83%83%E3%83%97%E3%83%B3%E3%83%9F%E3%83%A5%E3%83%BC%E3%82%B8%E3%83%83%E3%82%AF.zip
PASSは「hiyoko」です。

(タイトルは管理人により修正されました)


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


Name: ひよこ  ..プログラマー(39,789ポイント)   Date: 2009/06/14(日) 16:19   No:35073     
Title: 音ゲーム作ってみました    
いろいろ考えてたら無題になってしまいました。すみません。
タイトルは「音ゲーム作ってみました」です。


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

Name: sizuma [URL]  ..かけだし(1,941ポイント)   Date: 2009/06/14(日) 17:04   No:35075     
Title: Re:音ゲーム作ってみました    
やってみましたー
お疲れさまです。
工夫してオリジナルの機能を追加していけば面白くできそうですね。

一応気になった点だけ
1、↑がきかない
2、なぜ←だけzなのか?
3、曲の選択で難易度とどんなジャンルかは書いて欲しい
4、一時停止してる間に曲が終わる




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

Name: ひよこ  ..プログラマー(39,954ポイント)   Date: 2009/06/14(日) 17:20   No:35078     
Title: Re:音ゲーム作ってみました    
sizumaさん 遊んでくださりありがとうございます。

sizumaさん  1、↑がきかない
>>Xでききませんでしたか?

3、曲の選択で難易度とどんなジャンルかは書いて欲しい
>>差し替えする時にジャンルを気にしなくてもいいと思ったのです。

4、一時停止してる間に曲が終わる
>>音を止めたら最初からになってしまうだろうとおもうので
 どうすればいいでしょうか?


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

Name: ひよこ  ..プログラマー(39,927ポイント)   Date: 2009/06/14(日) 17:21   No:35079     
Title: Re:音ゲーム作ってみました    
すみません、説明書の間違いでした。
↑はZキーです。


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

Name: Justy  ..伝説なるハッカー(374,958ポイント)   Date: 2009/06/14(日) 17:34   No:35081     
Title: Re:音ゲーム作ってみました    
 遊んでみました。
 
 操作は
← : Zキー
↑ : Xキー
↓ : ↓キー
→ : →キー
 
 のようですね。
 
 曲とボタンを押すタイミングにあまり関連性がないのは
「ポップンミュージック」としてはなかなか斬新です。
 これなら曲はなくてもゲームとして成立しそうです。

 ところで、1つ致命的(?)な問題があります。
 間違ったところでキーを押してもペナルティにならないため、
連打げーになっており簡単に高得点が狙えます。

 これは仕様でしょうか?


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

Name: ひよこ  ..プログラマー(39,848ポイント)   Date: 2009/06/14(日) 19:13   No:35089     
Title: Re:音ゲーム作ってみました    
Justyさん遊んでくださりありがとうございます。

Justyさん 間違ったところでキーを押してもペナルティにならないため
>>今のところ仕様となってます。
>>矢印が消されずに下で消えるときにスコアを減らすっていうのはだめでしょうか?


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

Name: ねこ  ..入門者(4,790ポイント)   Date: 2009/06/14(日) 19:27   No:35090     
Title: Re:音ゲーム作ってみました    
やってみました。

何か曲と譜面が全く合わない上に譜面の途中で終わってしまいました。
実際の音ゲーとはちょっと違った感じなんでしょうか・・・
再生関連によるバグかしら・・・

<一時停止
DXライブラリに現在再生している曲の現在時間を取得する関数と設定する関数があったはずです
GetCurrentMusicMilliSecみたいな感じの ※うろ覚え
ただ別ウィンドウに切り替えても同じようになっちゃうのでウィンドウフォーカスあたりをチェックしないといけないかもですね。

後、毎回フルスクリーンか聞かれるのは1回目のみになると嬉しいなぁなんて思います。


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

Name: sizuma [URL]  ..かけだし(1,943ポイント)   Date: 2009/06/14(日) 19:39   No:35091     
Title: Re:音ゲーム作ってみました    
>音を止めたら最初からになってしまうだろうとおもうので

昔はよく音ゲーをしていたんですが、一時停止機能は普通はついていないと・・・
だから、Escを押したら演奏停止で曲目に戻ってもいいんじゃないかな?と思いますね


>矢印が消されずに下で消えるときにスコアを減らす

それプラス、消えないところでキーを押したらスコアを減らすってすればいいのでは?
これをするついでに連鎖も数えて得点に補正をかけ、一定の連鎖ごとに画面に連鎖数を表示するだけで大分爽快感が違うと思います。


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

Name: Justy  ..伝説なるハッカー(374,893ポイント)   Date: 2009/06/14(日) 19:41   No:35092     
Title: Re:音ゲーム作ってみました    

>今のところ仕様となってます。

 なるほど。
 
 

>矢印が消されずに下で消えるときにスコアを減らすっていうのはだめでしょうか?

 私が気にしているのは、画面の指示など関係なく全キーを激しく連打しても
十分高得点になってしまう、という点です。

 この場合連打が途切れなければ、画面下まで矢印が到達することがないんですよね。

 これを許容するのならば問題はないんですが……。


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

Name: Tatu  ..入門者(3,944ポイント)   Date: 2009/06/14(日) 20:44   No:35102     
Title: Re:音ゲーム作ってみました    
プレイしてみました。

1曲目が一番難しいのはどうかと思います。

操作方法はZX下右ではなくて、
上下左右、ZXCVのどちらでも反応するようにしたらどうでしょうか。

曲と矢印があっていないというのは、矢印が出てきてから、
消すまでにかかる時間を計算していないためだと思います。
(曲に合わせて矢印を消すのではなく、
曲に合わせて矢印が出るようになっている印象を受けました)
また、譜面に矢印が残っているのに曲が終わるのは、
最後の矢印が画面に出たときに終わるようになっているからではないでしょうか。
曲の始まる時間をずらせば、うまくいくと思います。

曲の終りのほうに左向きの矢印(Z)があると
スコアが表示されてもすぐ消してしまうことがあります。
反応するキーを変えるか、曲が終わってウィンドウが
表示されるまで時間を置くなどしてはいかがでしょうか。

一時停止は曲がそんなに長くないのでいらないと思います。
なお、音楽をいったん止めてそのまま再生する方法は曲の最初を
int PlaySoundMem( int SoundHandle, int PlayType, int TopPositionFlag = TRUE )
で始め、止めてから再生するときは
int PlaySoundMem( int SoundHandle, int PlayType, FALSE)
とすればよいはずです。
最後の引数の意味は曲の最初から再生する(TRUE)か、
設定した場所から再生する(FALSE)かということです。
再生場所の設定には
int SetSoundCurrentTime( int Time, int SoundHandle )
再生場所の取得には
int GetSoundCurrentTime( int SoundHandle )
などがありますが、今回はこのふたつはいらないはずです。
この二つを使ったとしてもPlaySoundMemの最後の引数がTRUEなら意味がありません。

スコアは
1.19870
2.22730
3.21340
4.17040
5.6960
6.16140
でした。


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

Name: ひよこ  ..プログラマー(39,917ポイント)   Date: 2009/06/14(日) 20:54   No:35103     
Title: Re:音ゲーム作ってみました    
判定式は
弾が出現していたら>>判定式(その範囲なら弾を消すをやっているのですが、
どこにスコアを減らす処理を書いてみるといいでしょうか?
消えないところでキーを押したら関係ないところにあるのにマイナスになってしまいます。
どういう式を書けばいいのでしょうか?


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

Name: ねこ  ..初心者(5,078ポイント)   Date: 2009/06/14(日) 21:04   No:35105     
Title: Re:音ゲーム作ってみました    
弾・・・もしかしてシューティングのシステムを使ってるんでしょうか。

「その範囲なら弾を消す」って処理に「弾が無かったら」スコアを減らすを加える、でいいんじゃないでしょうか。
内部ソースも分からないのにどこに〜ってのは誰も答えられない気が・・・


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

Name: sizuma [URL]  ..かけだし(2,115ポイント)   Date: 2009/06/14(日) 21:07   No:35106     
Title: Re:音ゲーム作ってみました    

キーを押す(){
  if(範囲内かどうか){
弾をけす
  }else{
       減点もしくは出現フラグの取り消し
       
  }

でいいのではないでしょうか。

>消えないところでキーを押したらマイナスになる
マイナスがだめだったら出現フラグを消せばいいのでは?


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

Name: ひよこ  ..熟練のプログラマー(40,337ポイント)   Date: 2009/06/14(日) 21:41   No:35108     
Title: Re:音ゲーム作ってみました    
Tatuさんあそんでくださりありがとうございます。

Tatuさん 操作方法はZX下右ではなくて、
     上下左右、ZXCVのどちらでも反応するようにしたらどうでしょうか。

>>いいですね。そうなるように改良させていただきます。
  
また、譜面に矢印が残っているのに曲が終わるのは、
最後の矢印が画面に出たときに終わるようになっているからではないでしょうか。
曲の始まる時間をずらせば、うまくいくと思います。

>>再生が終わった時に終わるようにしてます。
>>というより、最後の矢印が画面に出たときに終わるようにするにはどうするのでしょうか?
>>矢印のタイミングが合わないというのは・・
>>表示速度と音楽の再生を考えて無理やり多く矢印を出現させています

ねこさんとsizumaさんJustyさんのおかげでなんとか形ができました。
まだいろいろ変なところがありますので頑張ってみます。


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

Name: Dixq (管理人) [URL]  ..ウィザード(1,027,397ポイント)   Date: 2009/06/14(日) 21:47   No:35110     
Title: Re:音ゲーム作ってみました    
やってみました。
制作お疲れ様です。
しかしこれはポップンじゃなく、DDRでは・・?^^;

ちなみに、矢印を音楽と合わせて入力させるゲームとしてはゲームシステム自体特許として成立しているようなので、配布される際はお気をつけて・・。
していいのかどうか怪しいですが・・。

ただ、多分矢印じゃなきゃいいんだと思います。
(責任は持てませんが)

後やはり音ゲーというからには音に合わせて入力したいなと思ってしまいます。
いつ矢印を出せばいいのかわからなければ、出すタイミングから出現タイミングを逆算するといいですよ。
例えば
10秒23のタイミングで入力させたい時、出現してから入力矢印地点に到達するまで3秒なら、7秒23で出現させればいいわけです。

私も音ゲーが好きで、DDR系は結構やりこみました。音ゲーって面白いですよね。
ただ譜面データ作るのが難しいんですよねぇ・・。
そういうの制作支援ツールとか必要そうです。


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

Name: ひよこ  ..熟練のプログラマー(40,407ポイント)   Date: 2009/06/14(日) 22:02   No:35111     
Title: Re:音ゲーム作ってみました    
Dixqさん 遊んでくださりありがとうございます。

Dixqさん 制作支援ツールとか必要そうです。
>>いいですね。作ってみたくなりました。

ゲームシステムに特許あったんですか、はじめて知りました。
友人がやってたので作ってみたのですが・・・・・
まぁそんなホームページ上に置いて配布なんてできるゲームじゃないので(異様にシンプルですから
ここだけの公開とさせていただきます。



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

Name: sizuma [URL]  ..かけだし(2,371ポイント)   Date: 2009/06/14(日) 22:35   No:35114     
Title: Re:音ゲーム作ってみました    
>特許
アルゴリズムに著作権はないですが、出願して認定されれば特許はとれるみたいです。
たしか特許があるものは、作るだけOKで配布はNGだったと思います。

ま、親告罪なので(訴えられたら罪になる)よほどのことがない限り大丈夫でしょうが。
もし配布する段階になったのならば、作り変えた方がよさそうです。そう手間がかかる作業でもなさそうですしね。
特許は著作権と違って、「そんなの知らなかった」って言ってもダメなんで面倒みたいですよ・・・

面白い機能をいろいろ追加したらまた公開してくださいね
・・・ついでに矢印画像も差し替えて(笑


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

Name: ひよこ  ..熟練のプログラマー(40,435ポイント)   Date: 2009/06/14(日) 22:48   No:35115     
Title: Re:音ゲーム作ってみました    
sizumaさん 作り変えた方がよさそうです
>>それってどういう意味でしょうか?


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

Name: sizuma [URL]  ..かけだし(2,418ポイント)   Date: 2009/06/14(日) 23:14   No:35116     
Title: Re:音ゲーム作ってみました    
管理人さまも書かれていますが、画像が矢印でなければ問題ナシなのでね。
っていうか一般人がそこまで特許について考慮する必要ないか;


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

Name: Dixq (管理人) [URL]  ..ウィザード(1,027,685ポイント)   Date: 2009/06/14(日) 23:18   No:35117     
Title: Re:音ゲーム作ってみました    
先ほども言いましたが、例えば矢印じゃなくするということです。
ゲームシステムは特許を取るのが難しいそうですから、かなり限定された範囲のシステムになると思います。
だから例えば矢印じゃなければそれだけでOKになるとかそういう事がありえると思います。
その辺の詳しい事は解らないので、調べて自己責任でお願いします。

後、特許としては聞いた話ですが、パズルゲーム系に多いようです。
一番特許が取れそうな分野としてはそれ位なんでしょうね。
ゲームシステムにいちいち特許があったら初代のFFもドラクエも同じじゃんってことになりそうですし^^;


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

Name: Dixq (管理人) [URL]  ..ウィザード(1,027,840ポイント)   Date: 2009/06/14(日) 23:21   No:35118     
Title: Re:音ゲーム作ってみました    
のんびり書いてたら被りました、すみません(汗

音ゲーはコナミ以外からも出ていますが、矢印以外ですよね。
音にあわせるゲームというだけで特許は出せないでしょうから、
その辺かなり限定されているんだと思います。

まぁシェアソフトでもないし、そこまで神経質にならなくてもいいかもしれませんが、
一応解っていて防げるトラブルは防いだ方がいいと思いますので。


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

Name: ひよこ  ..熟練のプログラマー(40,507ポイント)   Date: 2009/06/14(日) 23:40   No:35119     
Title: Re:音ゲーム作ってみました    
矢印の画像変えて矢印だったものの数を4つから3つに変える+システムを変化(重なった時には消すけれど
少し変化をくわえてOO風にします。)
これだけすればきっと特許にも最初のゲームにも関係ないようなものになってしまうのでしょうが、
でも自分らしくなると思います。


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

Name: BEMANI  ..プログラマー(33,708ポイント)   Date: 2009/06/15(月) 00:00   No:35120     
Title: Re:音ゲーム作ってみました    
音ゲーと言う事で早速やらせて頂きました。
先の方々が仰ってますが、やはりリズムに合わせて叩きたいです。
また、譜面は毎回ランダムな場所から出てくるのでしょうか。
一曲目の譜面を二回やって、それぞれ場所が違う気がしたので、もし違ったらごめんなさい。

コンボを入れると音ゲーとしていいと思われます。
ただ叩いてるよりは何回叩けてるというのが視覚的にあれば全然違います。



Zキーを押すと曲選択に戻りますが、曲の終了時にZの場所に譜面が流れてきたため
得点部分が一瞬だけ表示されて戻ってしまったので、違うキーに変えてみてはどうでしょうか。


連打ゲーと書かれていたので試してみました。
確かにペナルティないですね〜。
ただ、押した場所で得点の変動が見られました。
最高150点? なのでしょうか・・・120点増えた時もあったので判定ラインみたいなものがあるとみました。
一応ビートマニアと言う音楽ゲームでは、ミスすると得点は加算されずコンボが切れます。

ぴったり押せた、ぴったりではないが惜しい所で押せた、一応押せた事にしとく、微妙にずれてる、完全にミス
と言うように押した瞬間のステータスがカウントされていき最後にリザルト画面でどれだけ綺麗に押せたか
と言うのが表示されるようになってます。(多分音ゲーは基本こんな形になってます)


譜面を作るコツは、まず後ろで流れてるリズム例えばドラムとかキックとかの音源を耳で聞きとり
それをベースにリズム部分に譜面を置くと案外スムーズに作れたりします。
やり方はたくさんあると思うのでこれがいいという訳ではありませんけど;



難易度的な問題ですが自分的にはもっとたくさん降ってきた方が楽しかったりします。
(難易度EASY/NOMAL/HARD等実装するといいかな〜と思いました!)


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

Name: 御津凪 [URL]  ..比類無きプログラマー(94,883ポイント)   Date: 2009/06/15(月) 14:29   No:35140     
Title: Re:音ゲーム作ってみました    
蛇足ですが、こんなものがオープンソースでありますよ。
StepMania
(リンク先は英語ですが、日本語版もあります)

DDR 風の音ゲーです。(デフォルト表示ではDDRとさほど変わらない様子)


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

Name: ひよこ  ..熟練のプログラマー(40,753ポイント)   Date: 2009/06/15(月) 17:35   No:35158     
Title: Re:音ゲーム作ってみました    
BEMANIさん 
やはりリズムに合わせて叩きたいです。
また、譜面は毎回ランダムな場所から出てくるのでしょうか。

>>ちなみに今はリズムに合わせて出てくるようにしてます。
>>ランダムに出るようにして
>>カウンターだけを変えればいろいろ変えられるようにしてみました。

御津凪さん 蛇足ですが、こんなものがオープンソースでありますよ。
>>ありがとうございます。こういうのもいいですね。
>>しかし少し変わった風の音ゲーにさせていただきます。


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

Name: ひよこ  ..熟練のプログラマー(40,861ポイント)   Date: 2009/06/16(火) 17:54   No:35222     
Title: Re:音ゲーム作ってみました    
Justyさん 連打げーになっており簡単に高得点が狙えます。
>>判定は追加しましたが、連打して得点が減ることがたまにあるようになりました。(範囲が広すぎてもとんでもないことになるので
>>というより逆に的が重なったとき下手すると後ろの的のせいでスコアが減ってしまいます。


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

Name: Justy  ..伝説なるハッカー(375,429ポイント)   Date: 2009/06/16(火) 23:35   No:35262     
Title: Re:音ゲーム作ってみました    

>重なったとき下手すると後ろの的のせいでスコアが減ってしまいます。

 よく状況がわかりませんが、ある列に2つ以上のターゲットがあった時
片方はタイミングが一致して得点になっても、もう一方の方は当然タイミングは合わないので
減点となる、ということですか?

 もしそうであれば、各列一番手前のものだけ判定すればいいのではないでしょうか?


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

Name: ひよこ  ..熟練のプログラマー(41,026ポイント)   Date: 2009/06/17(水) 17:07   No:35297     
Title: Re:音ゲーム作ってみました    
どうやって判定をすればいいでしょうか?

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

Name: ねこ  ..初心者(6,510ポイント)   Date: 2009/06/17(水) 18:28   No:35299     
Title: Re:音ゲーム作ってみました    
前レスでも言ったんですが、ひよこさんがどのように処理しているか話さないと誰にも分かりませんってw

予測で書きますが
シューティングでの弾を再利用してる気がするので「上下左右」のフラグと「Y座標」を比較して
「押されたボタンの対応する列」で「一番下にある矢印」だけをチェック対象にすればいいんじゃないでしょうか。


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

Name: ひよこ  ..熟練のプログラマー(41,476ポイント)   Date: 2009/06/17(水) 18:43   No:35302     
Title: Re:音ゲーム作ってみました    
弾の当たり判定処理部のソースをアップします。
「押されたボタンの対応する列」で「一番下にある矢印」ってどういう風に書けばよろしいのでしょうか?
Zなどを押したとき

void bullet_calc(int knd){
int i;
for(i=0;i<BULLET_MAX;i++){
if(bullet[i].knd==knd){
if(bullet[i].flag==1){//その弾のフラグがオンになってたら
if(bullet[i].y>=YAJIRUSI_Y-60 && bullet[i].y<=YAJIRUSI_Y+45){
if(bullet[i].y>YAJIRUSI_Y-50 && bullet[i].y<=YAJIRUSI_Y-40){
atari();
bullet[i].flag=0;
}
/*真ん中の判定*/
if(bullet[i].y>YAJIRUSI_Y-45 && bullet[i].y<=YAJIRUSI_Y-20){
atari();
bullet[i].flag=0;
}
if(bullet[i].y>YAJIRUSI_Y-20 && bullet[i].y<=YAJIRUSI_Y+5){
atari();
bullet[i].flag=0;
}
/*真ん中の下の判定*/
if(bullet[i].y>YAJIRUSI_Y+5 && bullet[i].y<=YAJIRUSI_Y+20){
atari();
bullet[i].flag=0;
}
if(bullet[i].y>YAJIRUSI_Y+20 && bullet[i].y<=YAJIRUSI_Y+40){
atari();
bullet[i].flag=0;
}

if(bullet[i].flag==1){//その弾のフラグがオンになってたら

}

}
}
}
}
}


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

Name: ねこ  ..初心者(7,007ポイント)   Date: 2009/06/17(水) 18:57   No:35307     
Title: Re:音ゲーム作ってみました    
こんな感じでどうでしょ。細部は自己補完でお願いします。


void bullet_calc(int knd){
int i;
int idx = -1;
int minY = 0;

// 押された種別(knd)で一番下の「弾」の配列インデックスを取得
for( i = 0; i < BULLET_MAX; i++ ){
if( bullet[ i ].knd == knd ){
if( bullet[ i ].flag == 1 ){ // その弾のフラグがオンになってたら
if( idx == -1 ) {
idx = i;
minY = bullet[ i ].y;
} else {
if( bullet[ i ].y < minY ) {
idx = i;
minY = bullet[ i ].y;
}
}
}
}
}

// 一番下の矢印だけ対象にする
if( idx != -1 ){
i = idx;
// 現在の判定処理へ( iをidxに置き換える )
}
}


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

Name: ひよこ  ..熟練のプログラマー(41,929ポイント)   Date: 2009/06/17(水) 19:48   No:35309     
Title: Re:音ゲーム作ってみました    
自分で考えてみました。これで連続して消せる?ようになったのですが、
なぜかデバッグ中にフリーズしてしまいます。

void bullet_calc(int knd){
int i;
int idx = -1;
int minY = 0;

// 押された種別(knd)で一番下の「弾」の配列インデックスを取得
for( i = 0; i < BULLET_MAX; i++ ){
if( bullet[ i ].knd == knd ){
if( bullet[ i ].flag == 1 ){ // その弾のフラグがオンになってたら
if( idx == -1 ) {//最初にここをとおる
idx = i;//idxをiの値に
minY = bullet[ i ].y;//minYをbullet[i].yの値に
}
else {//それ以降はここをとおる
if( bullet[ i ].y < minY ) {
idx = i;//idxをiの値に minY = bullet[ i ].y;//minYをbullet[i].yの値に

}
}

// 一番下の矢印だけ対象にする
if( idx != -1 ){
i = idx;
// 現在の判定処理へ( iをidxに置き換える )
if(bullet[i].y>=YAJIRUSI_Y-60 && bullet[i].y<=YAJIRUSI_Y+45){
if(bullet[i].y>YAJIRUSI_Y-50 && bullet[i].y<=YAJIRUSI_Y-40){
atari();
bullet[i].flag=0;
}
/*真ん中の判定*/
if(bullet[i].y>YAJIRUSI_Y-45 && bullet[i].y<=YAJIRUSI_Y-20){
atari();
bullet[i].flag=0;
}
if(bullet[i].y>YAJIRUSI_Y-20 && bullet[i].y<=YAJIRUSI_Y+5){
atari();
bullet[i].flag=0;
}
/*真ん中の下の判定*/
if(bullet[i].y>YAJIRUSI_Y+5 && bullet[i].y<=YAJIRUSI_Y+20){
atari();
bullet[i].flag=0;
}
if(bullet[i].y>YAJIRUSI_Y+20 && bullet[i].y<=YAJIRUSI_Y+40){
atari();
bullet[i].flag=0;
}

if(bullet[i].flag==1){//その弾のフラグがオンになってたら
}
}
}
}
}
}
}


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

Name: ねこ  ..初心者(7,143ポイント)   Date: 2009/06/17(水) 20:02   No:35312     
Title: Re:音ゲーム作ってみました    
なんで外に出してたのにfor文の中へw

この処理はfor文でbullet配列の中で指定の「knd」での一番下の矢印はどれかを求め、
その矢印だけを処理する仕組みなのでfor文の中にあっちゃダメです。

逆に言えば1回ボタンを押した時、判定を行う必要があるのは1個のみです。


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

Name: ひよこ  ..熟練のプログラマー(41,970ポイント)   Date: 2009/06/17(水) 20:15   No:35313     
Title: Re:音ゲーム作ってみました    
// 一番下の矢印だけ対象にするif( idx != -1 ){のときに
i = idx;として、iを限定するので、そのあとに当たりの判定を書けばいいのですか?


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

Name: ねこ  ..初心者(7,199ポイント)   Date: 2009/06/17(水) 21:26   No:35318     
Title: Re:音ゲーム作ってみました    
そゆことです。
判定処理の[i]を[idx]にしても良いんですが、修正が楽なので「i=idx」を加えました。
今見るとコメントに不要なの入ってましたね
// 現在の判定処理へ( iをidxに置き換える )←この括弧内は不要です。


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

Name: ひよこ  ..熟練のプログラマー(42,678ポイント)   Date: 2009/06/17(水) 23:02   No:35322     
Title: Re:音ゲーム作ってみました    
弾がうまく判定されていないようなので、おそらくと思う場所があるので・・・・
ねこさんへ提供してもらったソースに質問があります。

// 押された種別(knd)で一番下の「弾」の配列インデックスを取得
for( i = 0; i < BULLET_MAX; i++ ){
if( bullet[ i ].knd == knd ){
if( bullet[ i ].flag == 1 ){ // その弾のフラグがオンになってたら
if( idx == -1 ) {//最初にここをとおる
idx = i;//idxをiの値に
minY = bullet[ i ].y;//minYをbullet[i].yの値に
}
else {//それ以降はここをとおる
if( bullet[ i ].y < minY ) {
idx = i;//idxをiの値に minY = bullet[ i ].y;//minYをbullet[i].yの値に

}
}


for( i = 0; i < BULLET_MAX; i++ ){
の部分で一度キーを押すと
同じ種類の弾がたくさんあって
例えば0,1,2の順で弾が出現していると最初の0の時キーを押すと
for文がどんどんまわって2のY座標になってしまうのでは?っと思うのですが
それでうまく判定が合わないのでしょうか?


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

Name: ねこ  ..初心者(7,207ポイント)   Date: 2009/06/18(木) 00:21   No:35328     
Title: Re:音ゲーム作ってみました    
あーすいません、比較が逆ですね。
bullet[ i ].y < minY ⇒ bullet[ i ].y > minYでした。
最近3Dばっかりだったのでいつの間にか逆転しておりました。
「一番下の矢印を取得する」という認識で。


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

Name: ひよこ  ..熟練のプログラマー(42,734ポイント)   Date: 2009/06/18(木) 06:49   No:35332     
Title: Re:音ゲーム作ってみました    
こんな処理は考えられなかったです。
ねこさんソースをくださりありがとうございます。


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

Name: ひよこ  ..熟練のプログラマー(42,888ポイント)   Date: 2009/06/20(土) 16:38   No:35436     
Title: Re:音ゲーム作ってみました    
前回のものに、自分がいいと思ったものを付け足してきました。OOOも混ぜてきました。
遊んで感想をくださるとうれしいです。
アップローダ様http://down11.ddo.jp/uploader/download/1245483373/attach/%E3%82%AF%E3%83%AA%E3%82%B9%E3%82%BF%E3%83%AB%E3%83%9F%E3%83%A5%E3%83%BC%E3%82%B8%E3%83%83%E3%82%AF.zip
PASSは「hiyoko」です。よろしくお願いします。


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

Name: situmon  ..プログラマー(31,593ポイント)   Date: 2009/06/21(日) 17:42   No:35505     
Title: Re:音ゲーム作ってみました    
すばらしいですね。早速プレイさせていただきました、
どんなジャンルのゲームも作られてすごいですね。
結構難しかったです・・・(自分にはできない)
またまたですが、曲を作ってみました。
PASS は situmon です。
http://down11.ddo.jp/uploader/download/1245574418/attach/pop.zip

です。
聞いてくださるとうれしいです。


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

Name: ひよこ  ..熟練のプログラマー(42,988ポイント)   Date: 2009/06/21(日) 19:37   No:35507     
Title: Re:音ゲーム作ってみました    
situmonさん すばらしいですね。早速プレイさせていただきました

>>ありがとうございます。単なる音ゲームじゃと思ってSTGも少しってショットだけですけど
>>どうでしょうかね?

結構難しかったです・・・(自分にはできない)

>>1、2曲は簡単になるようにしましたけど難しいですか、
>>簡単にする方法を考えます。

またまたですが、曲を作ってみました。
>>ありがとうございます。ぜひ使わせてもらいます。



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

Name: BEMANI  ..プログラマー(35,027ポイント)   Date: 2009/06/22(月) 00:35   No:35520     
Title: Re:音ゲーム作ってみました    
>>situmonさん
音楽について気になったので質問してみます。
MIDIからWAVEに出力するためにどのようなソフトを使ってるのでしょうか・・・
もし宜しければ教えて頂けないでしょうか。
(オーケストラヒットをはじめ、全体的に音源が自分好みでしたので><)


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

Name: situmon  ..プログラマー(31,599ポイント)   Date: 2009/06/22(月) 18:48   No:35540     
Title: Re:音ゲーム作ってみました    
BEMANIさん

1 http://twsynth.sourceforge.jp/install.html のページにしたがって操作。

2 timw32gというのがあるので開いて 設定→詳細設定→出力→出力設定
でRIFF WAVE Fileにして出力先を設定→自分のMIDIをドラッグ&ドロップ、

以上です!!




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

Name: ひよこ  ..熟練のプログラマー(43,015ポイント)   Date: 2009/06/22(月) 19:00   No:35541     
Title: Re:音ゲーム作ってみました    
できたら遊んでくださった皆様、感想待ってますよ。

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

Name: ねこ  ..中級者(9,214ポイント)   Date: 2009/06/22(月) 20:27   No:35548     
Title: Re:音ゲーム作ってみました    
なんで中央を上にあげたんでしょ?
本家音ゲーにもこういうのありますけど、
いわゆる「色もの」なのでスタンダードにあってもやりずらいだけでした。

前のゲームもそうでしたけどひよこさんのゲームはちょっと敷居が高いw
製作者はデバッグ中に慣れますけど、もうちょっとプレイヤー意識した方が良いっすよ。


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

Name: ひよこ  ..熟練のプログラマー(43,196ポイント)   Date: 2009/06/22(月) 23:33   No:35574     
Title: Re:音ゲーム作ってみました    
ねこさん 遊んでくださりありがとうございます。

なんで中央を上にあげたんでしょ?
>>本家のほうに負けないようにそして
>>さらにショットを混ぜたためにこうなりました。

前のゲームもそうでしたけどひよこさんのゲームはちょっと敷居が高いw
>>このゲームは変えませんけど、
>>次回作から気をつけます。

製作者はデバッグ中に慣れますけど、もうちょっとプレイヤー意識した方が良いっすよ。
>>確かにその通りですね。
>>すばらしい一言ありがとうございます。

他の人も感想待ってます。



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

Name: BEMANI  ..プログラマー(35,084ポイント)   Date: 2009/06/23(火) 06:14   No:35582     
Title: Re:音ゲーム作ってみました    
>>situmonさん
Timidityでしたか。
デフォルトで入ってる音源を使わず、カスタマイズしてたので気づきませんでした。
ありがとうございました^^


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

Name: ひよこ  ..熟練のプログラマー(43,322ポイント)   Date: 2009/06/24(水) 06:49   No:35626 解決!     
Title: Re:音ゲーム作ってみました    
このゲームが皆さんにたくさん遊んでもらえたのでよかったです。
一応ここでこのゲームは終わりにしますが、
感想は待ってます。





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



Name: yrao  ..かけだし(1,596ポイント)   Date: 2009/06/20(土) 20:23   No:35444       
Title: 自機の場合分け    
こんばんは〜

またお世話になります(¨;)


ゲームを始める前に自機選択画面を設け、性能の違う自機を何種類か選べるようにしたいです。


最低でも、
・自機の画像
・自機のショットの画像
・移動速度
・ショットの性質(ホーミング、拡散など)
・ボスのエフェクト
は変えたいと思っています。


今の所、switch構文で、自機別に場合分けし、
自機Aのときは
cshot_main_A();
effect_main_A();




自機Bのときは
cshot_main_B();
effect_main_B();




というようにして、自機別に作ったものを読み込んでいくという方法しか思い付きません。

ですが、これだと後々caseをかなり増やさなければならなくなってしまいます。

もっとすっきりと実装することはできないでしょうか?


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


Name: ねこ  ..初心者(8,077ポイント)   Date: 2009/06/20(土) 21:23   No:35446     
Title: Re:自機の場合分け    
・自機の画像
 グラフィックハンドル
・自機のショット画像
 グラフィックハンドル
・移動速度
 double型変数
・ショットの性質
 ショット種別変数・発射位置配列、個数

上記のように内部に情報を持つ事で対応した分岐になると思います。

・ボスのエフェクト
 これは何なのかよく分かりません。


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

Name: yrao  ..かけだし(1,649ポイント)   Date: 2009/06/20(土) 22:34   No:35451     
Title: Re:自機の場合分け    
ねこさん回答ありがとうございます_^)


ショット種別変数
について詳しく教えていただけませんか?



・ボスのエフェクト

すいません打ち間違えました。
ボムのエフェクトです。


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

Name: conio [URL]  ..上級者(23,891ポイント)   Date: 2009/06/20(土) 23:52   No:35456     
Title: Re:自機の場合分け    

デザインパターンのAbstract Factoryパターンを使ってみではどうでしょう?
(・・・と言っても、自分も勉強途中で きちんと使えている自信はないです)

以下、ソースです。
----------------------------------------------------------------------------
#include<stdio.h>

class MachineDrawType{
public:
virtual void DrawMachine() = 0;

};

class MachineDrawType1 : public MachineDrawType{
virtual void DrawMachine(){
puts("【自機の画像】(タイプ1)");
puts(" ▲");
puts("▲■▲");
puts("■ ■");
}
};
class MachineDrawType2 : public MachineDrawType{
virtual void DrawMachine(){
puts("【自機の画像】(タイプ2)");
puts(" ■");
puts("■■■");
puts("■■■");
}
};

class BulletDrawType{
public:
virtual void DrawBullet() = 0;
};

class BulletDrawType1 : public BulletDrawType{
virtual void DrawBullet(){
puts("【弾の画像】(タイプ1)");
puts(" ●");
puts(" ●");
puts(" ●");
};
};

class BulletDrawType2 : public BulletDrawType{
virtual void DrawBullet(){
puts("【弾の画像】(タイプ2)");
puts(" ■");
puts(" ■");
};
};
class AbstractMachine{
public:
virtual MachineDrawType* CreateMachineDrawType(void) = 0;
virtual BulletDrawType* CreateBulletDrawType(void) = 0;
};

class AbstractMachineType1 : public AbstractMachine
{
public:
virtual MachineDrawType* CreateMachineDrawType() {
return new MachineDrawType1;
}
virtual BulletDrawType* CreateBulletDrawType() {
return new BulletDrawType1;
}
};

class AbstractMachineType2 : public AbstractMachine
{
public:
virtual MachineDrawType* CreateMachineDrawType() {
return new MachineDrawType2;
}
virtual BulletDrawType* CreateBulletDrawType() {
return new BulletDrawType2;
}
};

class Machine
{
private:
MachineDrawType* mMachineDrawType;
BulletDrawType* mBulletDrawType;
public:
Machine():mMachineDrawType(0),mBulletDrawType(0){ }
~Machine(){
delete mMachineDrawType;
mMachineDrawType = 0;
delete mBulletDrawType;
mBulletDrawType = 0;
};
void CreateMachine(AbstractMachine* Abs)
{
mMachineDrawType = Abs->CreateMachineDrawType();
mBulletDrawType = Abs->CreateBulletDrawType();
}
void DrawMachine(){mMachineDrawType->DrawMachine();}
void DrawBullet(){mBulletDrawType->DrawBullet();}
};

int main(void)
{
Machine MyMachine;
AbstractMachineType1 AbsType1;
AbstractMachineType2 AbsType2;
char m_type;
puts("機種を選んで下さい。(1 ~ 2)");
scanf("%c", &m_type);
switch(m_type)
{
case '1':
MyMachine.CreateMachine(&AbsType1);
break;
case '2':
MyMachine.CreateMachine(&AbsType2);
break;
default:break;
}

MyMachine.DrawMachine();
MyMachine.DrawBullet();
}
--------------------------------------------------------------------------------------
ソースファイル1つに纏めてしまったので、必要に応じて分割コンパイルなどしてみて下さい。

とりあえず、どんな自機を作ろうが、全て
-----------------------------------
  MyMachine.DrawMachine();
  MyMachine.DrawBullet();
-----------------------------------
みたいに関数を呼び出せば、自機のタイプに応じて描画してくれます。


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

Name: ねこ  ..初心者(8,222ポイント)   Date: 2009/06/21(日) 01:16   No:35459     
Title: Re:自機の場合分け    
ショット種別は例えば int iShotTypeとでもプレイヤーの構造体の中に作成して
0⇒直線移動
1⇒曲線移動
2⇒ホーミング移動
というように分岐の判断にするだけです。


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

Name: 紅葉  ..中級者(11,073ポイント)   Date: 2009/06/21(日) 04:16   No:35467     
Title: Re:自機の場合分け    
構造体の型をつくり
それを配列で用意してはどうでしょうか?


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

Name: yrao  ..かけだし(1,813ポイント)   Date: 2009/06/21(日) 11:23   No:35482     
Title: Re:自機の場合分け    
たくさんの回答ありがとうございます_^)


>conioさん

そのようなものがあるのですか…

ありがとうございます
詳しく調べてみようと思います(^^ゞ



>ねこさん

理解できました!
どうもです



>紅葉さん

配列で用意する
というのはどういうことをすればいいのでしょうか?


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

Name: 紅葉  ..中級者(11,273ポイント)   Date: 2009/06/22(月) 21:05   No:35555     
Title: Re:自機の場合分け    
情報を構造体でもってそれれの配列を作るということです。


typedef struct{
float Px,Py;
}CHR;

CHR Chr[5];

などと書いてはいかがでしょうかという意味です。


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

Name: yrao  ..かけだし(1,856ポイント)   Date: 2009/06/23(火) 22:34   No:35611     
Title: Re:自機の場合分け    
>紅葉さん


遅れてしまってすいません(+_+)


理解しましたf^_
ありがとうございました!


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



Name: dic  ..上級者(24,638ポイント)   Date: 2009/06/23(火) 16:19   No:35597       
Title: private修飾子へのアクセス手段    
まず以下のコードを見て欲しいです

#include <stdio.h>
#include <string.h>

class A
{
private:
char m_name[256];
public:
char* SetName( char *name );
void Show();
};

char* A::SetName( char *name )
{
strcpy( m_name, name );

printf( "%s にセットしました\n", m_name );

return m_name;
}
void A::Show()
{
printf( "%s\n", m_name );
}

int main()
{
A a;

printf( "%s\n", a.SetName( "hoge" ) );

char *p = a.SetName( "うらしま太郎" );

strcpy( p, "hoge" );

a.Show();

return 83;
}



ここで、クラスAのprivateメンバ変数へのポインタを外部変数に渡すと
簡単にprivate変数の中身が クラスA以外から簡単に壊せます
これはオブジェクト指向では推薦されないやり方で
この場合は SetName は const char* を返すのがいいのでしょうか?


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


Name: ねこ  ..中級者(10,469ポイント)   Date: 2009/06/23(火) 16:57   No:35598     
Title: Re:private修飾子へのアクセス手段    
オブジェクト指向に沿っているかは自信がないのですが
参照用としてconst char*で返すのも有りだとは思いますが、setterの戻り値にあるのは若干違和感が・・・

基本的にsetter関数はvoidで定義するものじゃないでしょうか。
文字列の場合はgetter関数もvoidで、外に渡すのはあくまでコピーかなと。
参照が欲しい時は、明示的な関数を用意する。というのが僕の一意見です。


void A::SetName( char *name ){
strcpy( m_name, name );
printf( "%s にセットしました\n", m_name );
}
void A::GetName( char *name ){
strcpy( name, m_name );
}
const char* A::GetNameP(){
return m_name;
}


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

Name: たかぎ [URL]  ..ハッカー(106,291ポイント)   Date: 2009/06/23(火) 17:46   No:35600     
Title: Re:private修飾子へのアクセス手段    
今回の場合に限っていえば、

class A
{
private:
std::string m_name;
public:
void SetName(const char* name) { m_name = name; }
void SetName(const std::string& name) { m_name = name; }

void Show() const { std::cout << m_name << std::endl; }
void Show(std::ostream& ostr) const { ostr << m_name << std::endl; }
};

といったところでしょうか?


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

Name: dic  ..上級者(24,691ポイント)   Date: 2009/06/23(火) 18:07   No:35601 解決!     
Title: Re:private修飾子へのアクセス手段    
>ねこさん
ゲッターとセッターですか
わかりやすくていいですね

>たかぎさん
より高度化するとそのようになるんですね
参考になります


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




 
[ 1 , ... ]
 
 
管理者画面   RSS   + Powered By 21style +