C言語何でも質問掲示板


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

 
   龍神録の館 17章   
     ・[34655] pooka 
     ・[34661] you 
     ・[34662] pooka 
     ・[34663] すずめ 
     ・[34664] you 
   ゲームに向いている言 ....   
     ・[34508] MNS 
     ・[34519] dic 
     ・[34551] nn 
     ・[34552] たかぎ 
     ・[34581] たいちう 
     ・[34585] たかぎ 
     ・[34586] バグ 
     ・[34588] たかぎ 
     ・[34656] nn 
   文字の切り取り   
     ・[34627] MNS 
     ・[34628] たかぎ 
     ・[34638] str 
     ・[34646] MNS 
     ・[34649] str 
     ・[34652] MNS 
     ・[34653] str 
   表示されない・・・   
     ・[34619] yu 
     ・[34650] 与一 
     ・[34651] 与一 
   もしかして・・・   
     ・[34639] 天使 
     ・[34641] ひよこ 
     ・[34643] array 
     ・[34648] ひよこ 
   SHOT_BULLET_MAX   
     ・[34623] BEMANI 
     ・[34630] you 
     ・[34631] MNS 
     ・[34633] you 
     ・[34634] pooka 
     ・[34635] Tatu 
     ・[34636] you 
     ・[34637] pooka 
     ・[34642] you 
   LoadDivGraphで読み込 ....   
     ・[34621] hal 
   #define 疑似命令が上 ....   
     ・[34612] box 
     ・[34613] kazuoni 
     ・[34614] Libra 
     ・[34615] Justy 
     ・[34616] たかぎ 
     ・[34617] チルチル 
   無題   
     ・[34583] ひよこ 
     ・[34589] pooka 
     ・[34590] ひよこ 
     ・[34591] pooka 
     ・[34592] ひよこ 
     ・[34593] pooka 
     ・[34596] ひよこ 
     ・[34597] ひよこ 
     ・[34598] pooka 
     ・[34600] ひよこ 
     ・[34602] pooka 
     ・[34603] ひよこ 
     ・[34605] pooka 
     ・[34608] ひよこ 
     ・[34609] Tatu 
     ・[34611] ひよこ 
   四方向のショット   
     ・[34601] kazuoni 
     ・[34604] き 
     ・[34606] kazuoni 
   誰か教えてください。   
     ・[34550] チルチル 
     ・[34554] 蒼空(初心者) 
     ・[34555] b 
     ・[34556] 蒼空(初心者) 
     ・[34559] b 
     ・[34560] 蒼空(初心者) 
     ・[34562] チルチル 
     ・[34564] 蒼空(初心者) 
     ・[34565] チルチル 
     ・[34566] b 
     ・[34572] b 
     ・[34574] Dixq (管理人) 
     ・[34575] チルチル 
     ・[34576] b 
     ・[34577] チルチル 
     ・[34578] Dixq (管理人) 
     ・[34580] Tatu 
     ・[34584] yu 
     ・[34587] チルチル 
     ・[34595] 蒼空(初心者) 
   高3の卒業課題として   
     ・[34545] non 
     ・[34563] Dixq (管理人) 
     ・[34579] シュウ 
   初心者ですが・・・   
     ・[34557] チルチル 
     ・[34558] たかぎ 
     ・[34561] すかーれっど 
     ・[34567] sizuma 
     ・[34569] すかーれっど 
     ・[34570] すかーれっど 
     ・[34573] Dixq (管理人) 
   実行すると・・・。   
     ・[34535] non 
     ・[34536] non 
     ・[34537] はなたれパンダ 
     ・[34538] はなたれパンダ 
     ・[34539] GPGA 
     ・[34540] 初級者 
     ・[34541] non 
     ・[34542] はなたれ 
     ・[34568] GPGA 
   弾幕避けゲームを作っ ....   
     ・[34194] Tatu 
     ・[34195] 御津凪 
     ・[34196] Tatu 
     ・[34199] pooka 
     ・[34203] kazuoni 
     ・[34207] ひよこ 
     ・[34216] Dixq (管理人) 
     ・[34235] 御津凪 
     ・[34253] チルチル 
     ・[34254] Tatu 
     ・[34255] Dixq (管理人) 
     ・[34257] 御津凪 
     ・[34262] チルチル 
     ・[34263] 御津凪 
     ・[34266] junta 
     ・[34276] BEMANI 
     ・[34278] 御津凪 
     ・[34280] BEMANI 
     ・[34286] チルチル 
     ・[34291] nayo 
     ・[34294] チルチル 
     ・[34297] 御津凪 
     ・[34298] nayo 
     ・[34302] チルチル 
     ・[34359] チルチル 
     ・[34376] 御津凪 
     ・[34433] チルチル 
     ・[34456] 御津凪 
     ・[34460] チルチル 
     ・[34547] Tatu 
   引数が配列の場合の処 ....   
     ・[34241] box 
     ・[34244] たかぎ 
     ・[34249] チルチル 
     ・[34281] box 
     ・[34285] チルチル 
     ・[34287] TKOZ 
     ・[34288] MNS 
     ・[34293] チルチル 
     ・[34299] box 
     ・[34304] チルチル 
     ・[34307] kazuoni 
     ・[34313] チルチル 
     ・[34318] lbfuvab 
     ・[34356] チルチル 
     ・[34431] チルチル 
     ・[34442] Justy 
     ・[34459] チルチル 
     ・[34471] チルチル 
     ・[34509] たいちう 
     ・[34530] たかぎ 
     ・[34533] チルチル 
   include ファイルを開 ....   
     ・[34451] conio 
     ・[34452] ゆず 
     ・[34453] ゆず 
     ・[34454] pooka 
     ・[34531] ゆず 
     ・[34532] ゆず 
   変数の値が急に勝手に ....   
     ・[34511] box 
     ・[34512] ハジ 
     ・[34513] box 
     ・[34514] ハジ 
     ・[34515] dic 
     ・[34516] たいちう 
     ・[34517] nayo 
     ・[34518] dic 
     ・[34520] pooka 
     ・[34522] conio 
     ・[34523] ハジ 
     ・[34524] ハジ 
     ・[34525] pooka 
     ・[34526] conio 
     ・[34527] ハジ 
   無題   
     ・[34426] conio 
     ・[34467] 初級者 
     ・[34521] sizuma 
   カウンタをアドレスに ....   
     ・[34401] non 
     ・[34403] ほのか 
     ・[34469] たいちう 
     ・[34480] Mist 
   APIでデスクトップアク ....   
     ・[34473] スー 
   std::mapでの検索   
     ・[34427] Justy 
     ・[34470] MNS 
   C言語で容量計算   
     ・[34387] toyo 
     ・[34468] もじゃ 
     ・[343721244783902] 俺最高 
   ショットとバレットの ....   
     ・[34457] 司馬司 
     ・[34465] すずめ 
     ・[34466] Dixq (管理人) 
   無題   
     ・[34461] チルチル 
     ・[34464] 御津凪 
   Java(オープンソース ....   
     ・[34429] Mikan 
     ・[34430] hitugi 
     ・[34458] hitugi 
   ゲーム画面の拡大縮小 ....   
     ・[34432] Justy 
     ・[34436] チルチル 
     ・[34438] kazuoni 
     ・[34448] ぬこ 
     ・[34450] バグ 
     ・[34455] 司馬司 
   龍神録に使われてる画 ....   
     ・[34410] Dixq (管理人) 
     ・[34449] 九ワット 
   無題   
     ・[34405] 山崎 
     ・[34406] box 
     ・[34409] ユーリ 
     ・[34421] 山崎 
     ・[34435] ユーリ 
     ・[34437] 山崎 
     ・[34439] ユーリ 
     ・[34440] pooka 
     ・[34441] pooka 
     ・[34443] 山崎 
     ・[34444] ユーリ 
     ・[34445] pooka 
     ・[34447] フリオ 
   順番に表示したのです ....   
     ・[34331] MNS 
     ・[34332] Dixq (管理人) 
     ・[34337] kazuoni 
     ・[34389] cc 
     ・[34400] kazuoni 
     ・[34417] cc 
     ・[34418] kazuoni 
     ・[34420] cc 
     ・[34428] kazuoni 
     ・[34434] cc 
   龍神録の館ついて   
     ・[34391] b 
     ・[34393] toyo 
     ・[34402] ひよこ 
     ・[34411] Dixq (管理人) 
     ・[34412] yu 
     ・[34413] ひよこ 
     ・[34415] ひよこ 
     ・[34416] KY 
     ・[34422] ひよこ 
     ・[34423] すずめ 
     ・[34424] ひよこ 
   40個のエラー   
     ・[34326] ぬかづけ 
     ・[34327] 御津凪 
     ・[34362] ぬかづけ 
     ・[34378] 御津凪 
     ・[34386] toyo 
     ・[34408] むかづけ 
   ファイルのビット操作 ....   
     ・[34396] 御津凪 
     ・[34399] bitter_orange 
   char型の16進数の配列 ....   
     ・[34334] non 
     ・[34335] H 
     ・[34336] non 
     ・[34394] H 
   文字列について   
     ・[34392] non 
   描画系関数の縦の描画 ....   
     ・[34364] Justy 
     ・[34366] チルチル 
     ・[34368] Justy 
     ・[34374] チルチル 
     ・[34379] Justy 
     ・[34383] チルチル 
   文字列にグラデーショ ....   
     ・[34380] Justy 
     ・[34382] チルチル 
   無題   
     ・[34373] BEMANI 
     ・[34381] pic 
   色コードを三成分に分 ....   
     ・[34369] Justy 
     ・[34371] tkmakwins15 
     ・[34375] チルチル 
   pngの変換   
     ・[34160] lbfuvab 
     ・[34363] 餅 
     ・[34370] Justy 
   ポインタを使った比較 ....   
     ・[34200] non 
     ・[34201] arex 
     ・[34204] たかぎ 
     ・[34208] バグ 
     ・[34210] non 
     ・[34211] arex 
     ・[34214] たかぎ 
     ・[34219] arex 
     ・[34223] たかぎ 
     ・[34226] non 
     ・[34228] box 
     ・[34231] たかぎ 
     ・[34273] arex 
     ・[34274] たかぎ 
     ・[34279] arex 
     ・[34283] non 
     ・[34289] arex 
     ・[34295] non 
     ・[34300] arex 
     ・[34308] たかぎ 
     ・[34317] lbfuvab 
     ・[34343] arex 
     ・[34344] non 
     ・[34345] non 
     ・[34358] arex 
   for文 変数宣言 関数 ....   
     ・[34303] yu 
     ・[34306] kazuoni 
     ・[34309] box 
     ・[34310] たいちう 
     ・[34311] チルチル 
     ・[34312] box 
     ・[34314] チルチル 
     ・[34315] たいちう 
     ・[34316] チルチル 
     ・[34319] たいちう 
     ・[34321] たかぎ 
     ・[34324] たいちう 
     ・[34354] チルチル 
   読み捨て処理   
     ・[34347] pooka 
     ・[34348] ほのか 
     ・[34349] pooka 
     ・[34350] ほのか 
     ・[34351] pooka 
     ・[34352] ほのか 
   制限時間の作り方   
     ・[34339] kazuoni 
     ・[34340] meteor 
     ・[34341] kazuoni 
     ・[34342] 夢夢 
   DrawRotaGraph   
     ・[34323] lbfuvab 
     ・[34328] Tom 
   レーザーのミス?   
     ・[34267] あ〜る 
     ・[34269] junta 
     ・[34282] あ〜る 
     ・[34305] junta 
   構造体について質問が ....   
     ・[34272] たかぎ 
     ・[34277] C言語初心者 
     ・[34284] non 
     ・[34290] C言語初心者 
     ・[34292] non 
     ・[34296] C言語初心者 
   t0. セーブデータの作 ....   
     ・[34270] Dixq (管理人) 
     ・[34275] ハジ 
   ゲームを作るために勉 ....   
     ・[34137] 御津凪 
     ・[34197] pupilΔ 
     ・[34202] pupilΔ 
     ・[34252] たいちう 
     ・[34258] たかぎ 
     ・[34259] pupilΔ 
     ・[34271] たいちう 
   CheckHitKeyでの判定   
     ・[34247] チルチル 
     ・[34248] tex 
     ・[34250] チルチル 
     ・[34251] tex 
     ・[34256] チルチル 
     ・[34260] tex 
     ・[34261] チルチル 
   キーダウンイベントの ....   
     ・[34170] BEMANI 
     ・[34174] バグ 
     ・[34246] チルチル 
   スタックについて   
     ・[34217] たかぎ 
     ・[34236] R 
     ・[34237] たかぎ 
     ・[34238] たかぎ 
     ・[34240] lbfuvab 
     ・[34242] たかぎ 
   バッファオーバーラン ....   
     ・[34234] 山崎 
   GV.hで宣言される変数   
     ・[34206] ランド 
     ・[34232] yskey 
   無題   
     ・[34229] non 
     ・[34230] たかぎ 
   ファイル・フォルダの ....   
     ・[34225] たかぎ 
   エラーについて   
     ・[34218] たかぎ 
     ・[34220] あ〜る 
     ・[34221] yuki 
     ・[34222] yuki 
   同名ファイルが同じフ ....   
     ・[34182] Ma 
     ・[34190] Justy 
     ・[34192] Ma 
   レーザーの計算   
     ・[33292] BEMANI 
     ・[33309] niconico 
     ・[33310] niconicp 
     ・[33318] BEMANI 
     ・[33333] niconico 
     ・[33348] BEMANI 
     ・[33361] niconico 
     ・[33368] BEMANI 
     ・[33555] niconico 
     ・[33668] BEMANI 
     ・[33885] niconico 
     ・[33901] BEMANI 
     ・[33953] niconico 
     ・[33964] BEMANI 
     ・[34191] niconico 

Name: you  ..ぴよぴよ(292ポイント)   Date: 2009/06/07(日) 14:51   No:34654       
Title: 龍神録の館 17章    
 こんにちは、すみません、また詰まってしまいました。どなたかお助けください。

17章の自機にショットを撃たせてみようのところの

//ショット登録部
void enter_shot(){
//ショットボタンが押されていたら
if(CheckStatePad(configpad.shot)>0){
ch.shot_cnt++;
if(ch.shot_cnt%3==0){//3カウントに1回

の5、6行目にあるshot_cntのところで、chのメンバーでありませんというエラーがでてしまいます。

これは、struch.hのところのch_tのところでshot_cntを宣言しないといけないのでしょうか?

よろしくお願いします。


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


Name: pooka [URL]  ..初心者(5,045ポイント)   Date: 2009/06/07(日) 15:18   No:34655     
Title: Re:龍神録の館 17章    
struct.hのキャラクターに関する構造体に
int shot_cnt;
を追加してください。


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

Name: you  ..ぴよぴよ(351ポイント)   Date: 2009/06/07(日) 18:13   No:34661     
Title: Re:龍神録の館 17章    
>>pookaさん
回答ありがとうございます。エラーはなくなり、実行できました^^

でも、ショットを撃つ音はするのですけど、弾の画像が表示されていません^^;

これは、graph.cppの方でなにか間違いがあるのでしょうか?


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

Name: pooka [URL]  ..初心者(5,066ポイント)   Date: 2009/06/07(日) 18:37   No:34662     
Title: Re:龍神録の館 17章    
画像の読み込みはできていますか?
load.cppを見直してみてはどうでしょうか。(音が鳴るようなので大丈夫だとは思いますが…)


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

Name: すずめ  ..入門者(2,937ポイント)   Date: 2009/06/07(日) 18:37   No:34663     
Title: Re:龍神録の館 17章    
こんにちは。
私もはじめは同じようなことがありましたが、
解説では、load.cppで
LoadDivGraph( "../dat/img/bullet/b0.png" , 5 , 5 , 1 , 76 , 76 , img_bullet[0] ) ;
となっていましたが、私のプロジェクトでは
LoadDivGraph( "dat/img/bullet/b0.png" , 5, 5, 1, 76, 75, img_bullet[0] ) ;
で無事に画像を表示できるようになりました。

どこが違うかというと
../dat/img/--------
dat/img/-------- です。

ただ、これは私の場合です。


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

Name: you  ..ぴよぴよ(503ポイント)   Date: 2009/06/07(日) 18:47   No:34664 解決!     
Title: Re:龍神録の館 17章    
>>pookaさん
回答ありがとうございます。ご指摘どおり、load.cppの方がおかしかったみたいです^^

>>すずめさん
回答ありがとうございます。僕の場合は逆みたいでした。

最初 : "dat/img/char/bl_00.png"
変更後 : "../dat/img/char/bl_00.png"

にすると画像が表示されました。

pookaさん、すずめさん、お二人とも本当にありがとうございました^^


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



Name: nn  ..ぴよぴよ(94ポイント)   Date: 2009/06/04(木) 20:14   No:34507       
Title: ゲームに向いている言語は?    
市販されているゲームはC++で作られているときいたのですが、
実際のところ、ゲームに向いている言語って何なのでしょうか?
JAVAは作りやすいですが、キーイベントなどが個人的に反応が悪い気がします(特に連打とかしたとき)
CやC++はJAVAに比べると作りにくい(個人的に)と思うのですがJAVAのような不具合がないきがします。
一体、どの言語が一番いいのでしょうか?


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


Name: MNS  ..中級者(9,206ポイント)   Date: 2009/06/04(木) 20:30   No:34508     
Title: Re:ゲームに向いている言語は?    
ほとんどの場合、C,C++がゲーム開発には向いています。
なぜなら、ゲーム開発で重要視されるのは言語速度だからです。
Javaはプログラミング言語の中でも遅い言語の一つです。
あまり速度が求められないゲームを開発する上では、
Javaは悪くないと思います。
(キーイベントなどは自作できるのではないでしょうか?)

市販のゲームなどは、ほとんどがC,C++で開発されているはずです。


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

Name: dic  ..上級者(22,448ポイント)   Date: 2009/06/04(木) 23:48   No:34519     
Title: Re:ゲームに向いている言語は?    
半人前以前の私が言うのもなんですが
ゲームのジャンル次第ですね
処理速度を求めるならC/C++
あまり速度を問わないならVB
ブラウザでゲームさせたいならJAVA
でしょうか

言語にも長所短所はあります
また、開発者の向き不向きもありますので
一概には言えないと私は考えてます


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

Name: nn  ..ぴよぴよ(185ポイント)   Date: 2009/06/05(金) 23:03   No:34551     
Title: Re:ゲームに向いている言語は?    
回答ありがとうございます。
やはりJAVAは処理速度が遅いんですね・・・
ところで疑問に思ったことがあるのですが、
異なる言語で1つの作品をつくることはできないのでしょうか?
例えば、処理速度が求められる部分だけをC++で、それ以外をJAVAでのように。


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

Name: たかぎ [URL]  ..ハッカー(103,564ポイント)   Date: 2009/06/05(金) 23:10   No:34552     
Title: Re:ゲームに向いている言語は?    
> 異なる言語で1つの作品をつくることはできないのでしょうか?
> 例えば、処理速度が求められる部分だけをC++で、それ以外をJAVAでのように。

JNIを使うなどすれば可能です。
ただ、GCレスライブラリを開発するぐらいの覚悟がなければ、思ったほどの効果は得られないかもしれません。


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

Name: たいちう  ..プログラマー(31,118ポイント)   Date: 2009/06/06(土) 11:11   No:34581     
Title: Re:ゲームに向いている言語は?    
「Java 実行速度」でぐぐると色々出てきますが、
初期のJavaが遅かったため、実際以上に「Javaは遅い」という
印象を持っている人が多いように思います。

Javaでの開発を勧めるわけではありませんが、処理速度を理由に
Javaが使い物にならないと結論付けるのはどうかと思う。
遅かったとしてもせいぜい2〜3割程度で
(根拠は特にありません。私の印象です。)、
マシンスペックやプログラムの作りの方がよほど影響が大きいでしょう。


dicさん
> あまり速度を問わないならVB

今現在VBしか知らない人なら別ですが、
VBのメリットは殆どないのではないかと思います。


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

Name: たかぎ [URL]  ..ハッカー(103,983ポイント)   Date: 2009/06/06(土) 12:06   No:34585     
Title: Re:ゲームに向いている言語は?    
> 遅かったとしてもせいぜい2〜3割程度で

起動の遅さは間違いありませんが、走り出せばそんなもんだと思います。
ただし、それはJavaの処理内容と同等のものをC/C++で実装した場合の話です。

C/C++の強みは、高速化のためにエラーチェックなどを"意図的に行わない"ことができるところにあります。
配列の範囲チェックやNULLポインタのチェックなどを勝手に行ってくれれば安全かもしれませんが、エラーが発生しないことをプログラマが適切に保障できるのであれば無駄な処理でしかありませんから。

ある意味、CとC++の関係も似たところがあるのですが、JavaとC++の決定的な違いは、C++は不要な動作をプログラマの意思で除去できるのに対して、Javaはそれが不可能または非常に困難な点にあります。

もう一点、リアルタイム性の問題もあります。
ゲームなので人命に関わるようなことはありませんが、勝手なタイミングでGCが走って露骨な処理落ちが起きるようなものは許せないでしょう。


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

Name: バグ  ..ハッカー(159,400ポイント)   Date: 2009/06/06(土) 12:21   No:34586     
Title: Re:ゲームに向いている言語は?    
トピからズレるので恐縮なのですが…

>たかぎさん
安定した挙動をさせる為に、勝手なGCが起こらないように、プログラマー側で定期的にGCを行なうというのは対策にはならないのでしょうか?


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

Name: たかぎ [URL]  ..ハッカー(104,010ポイント)   Date: 2009/06/06(土) 12:42   No:34588     
Title: Re:ゲームに向いている言語は?    
> 安定した挙動をさせる為に、勝手なGCが起こらないように、プログラマー側で定期的にGCを行なうというのは対策にはならないのでしょうか?

System.gcメソッドの動作はJVMの実装依存ですのでいまいち信用できませんが、ある程度の対策にはなると思います。


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

Name: nn  ..ぴよぴよ(246ポイント)   Date: 2009/06/07(日) 15:25   No:34656 解決!     
Title: Re:ゲームに向いている言語は?    
回答ありがとうございます。
実際、作ることは可能なんですね。
しかし、皆さんのお話を聞いていると自分はまだそのへんのレベルには
至っていないようなので、もっと基礎をしっかり固めようと思いました。
どうもありがとうございました。


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



Name: str  ..ぴよぴよ(45ポイント)   Date: 2009/06/07(日) 04:55   No:34624       
Title: 文字の切り取り    
指定した位置から文字を切り取りたいです。

PHPで以前プログラムを書いていた時にsubstr関数という便利なものがあったのですが

そのような関数はC++かWindowsAPIで用意されていないでしょうか?

char strTest_1[128] = "あいうえお";
char strTest_2[128] = 関数名(str_Test[],2,2);
↑2文字目から2文字切り取るみたいな

これで出力すると「うえ」ないのでしたら
これに似た関数を作りたいのですがどうすればよろしいのでしょうか・・・・?


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


Name: MNS  ..中級者(9,294ポイント)   Date: 2009/06/07(日) 07:34   No:34627     
Title: Re:文字の切り取り    
std::stringには、そのような機能がありますよ。

http://www.geocities.jp/ky_webid/cpp/library/001.html
(こちらのサイトなどをご覧になってみてください。)

具体的には、std::string::substr()という関数を使用します。


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

Name: たかぎ [URL]  ..ハッカー(104,095ポイント)   Date: 2009/06/07(日) 09:29   No:34628     
Title: Re:文字の切り取り    
std::basic_string<...>::substrを使うか、Cスタイルの単純な文字列の場合はstrncpyを使います。


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

Name: str  ..ぴよぴよ(41ポイント)   Date: 2009/06/07(日) 13:01   No:34638     
Title: Re:文字の切り取り    
Cにもあるのですねw


using namespace std;
string str( "あいうえお" );
str.substr(2,1);


これをDrawTextやTextOutなどに渡したら型が違うとエラーが出てしまいました。
表示はどのようにすればよいのでしょうか?


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

Name: MNS  ..中級者(9,387ポイント)   Date: 2009/06/07(日) 13:36   No:34646     
Title: Re:文字の切り取り    
str.c_str() で出来ませんか?
std::string を char* に変換することが出来ます。


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

Name: str  ..ぴよぴよ(169ポイント)   Date: 2009/06/07(日) 13:51   No:34649     
Title: Re:文字の切り取り    

using namespace std;
string str( "あいうえお" );
str.substr(2,1);
str = str.c_str();

TextOut(hMemDC, 100, 100, str, strlen(str));


これでかいてみたのですが変換できないです・・・。

std::string を char* にではなく
char* を std::string に変換ではないでしょうか?


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

Name: MNS  ..中級者(9,469ポイント)   Date: 2009/06/07(日) 14:14   No:34652     
Title: Re:文字の切り取り    
(WinAPIの仕様経験は皆無に等しいので、検討はずれなことをいっているかもしれませんが)
TextOut関数が文字列の引数として取る型はLPCTSTRですよね。
非ユニコード環境で開発されているようですので、
LPCTSTR は const char* と同等です。
なので、std::string を const char* に変換する必要があります。
std::string のメンバ関数である c_str は、const char* として文字列を返します。
よって、
TextOut(hMemDC, 100, 100, str.c_str(), str.length());
で実行できるはずです。
(length関数は文字列の長さを返します。)


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

Name: str  ..ぴよぴよ(295ポイント)   Date: 2009/06/07(日) 14:27   No:34653 解決!     
Title: Re:文字の切り取り    
MNS様
表示できました〜
ありがとうございます。

2バイト文字なので注意が必要みたいですねw

たかぎ様
strncpyでもやってみてできました。

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


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



Name: 与一  ..ぴよぴよ(104ポイント)   Date: 2009/06/07(日) 00:57   No:34618       
Title: 表示されない・・・    
選択肢を選択して、表示させるようなプログラムを作ったんですが、なぜだか表示されません。
ゲームプログラミングの館にあったGetHitKeyStateAll_2という関数を使って作りました。
エンターを一回押すごとに、選択肢を選択して、表示させるというような感じのプログラムです。
よろしくお願いします。


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


Name: yu  ..プログラマー(29,198ポイント)   Date: 2009/06/07(日) 01:11   No:34619     
Title: Re:表示されない・・・    
if(Key[KEY_INPUT_RETURN] == 1){}
の中にDrawFormatStringがあるので
押している時しか描画されないようになってしまっています。

後エンターを押しすぎて、nが増えるとinput[n]でオーバーフローしてしまいますよ。

また、Key配列ですが、静的な変数にしたほうがよいと思います。
今のままではボタンを押していると常に値が1になってしまい、どれぐらいボタンを押しているのかが
判定できないようになってしまっています。
つまり

if(Key[KEY_INPUT_RETURN] == 1){}

でエンターを一回押したつもりでも、押した瞬間だけではなくて
押しているフレームの数だけここの処理が行われてしまいます。



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

Name: 与一  ..ぴよぴよ(132ポイント)   Date: 2009/06/07(日) 14:14   No:34650     
Title: Re:表示されない・・・    
ありがとうございます。
Keyを静的な変数にしたら、うまく表示されました。
yuさん本当にありがとうございました。


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

Name: 与一  ..ぴよぴよ(144ポイント)   Date: 2009/06/07(日) 14:14   No:34651 解決!     
Title: Re:表示されない・・・    
すいません、解決です。

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



Name: ひよこ  ..プログラマー(37,869ポイント)   Date: 2009/06/07(日) 11:26   No:34632       
Title: もしかして・・・    
龍神録の館43章の・・・ fprintf(fp,"%d:%d\n",fps_count,term);のfpって
どこに宣言されているのでしょうか?


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


Name: 天使  ..ぴよぴよ(518ポイント)   Date: 2009/06/07(日) 13:02   No:34639     
Title: Re:もしかして・・・    
ファイルポインタのことですよね?
FILE *fp でなかったでしたっけ?


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

Name: ひよこ  ..プログラマー(37,851ポイント)   Date: 2009/06/07(日) 13:09   No:34641     
Title: Re:もしかして・・・    
FPSにfpって必要なんでしょうか?

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

Name: array [URL]  ..熟練のプログラマー(50,072ポイント)   Date: 2009/06/07(日) 13:32   No:34643     
Title: Re:もしかして・・・    
とくに必要なかったと思います。

確か、FPSがきっちり制御されているか
確認するためのログ出力に使ってた。
―の消し忘れ・・・だったと思います。

43章のプロジェクトで消す場合
赤文字の部分は必要なくなると思います


void fps_wait(){
int term,i,gnt;
static int t=0;
static FILE *fp=fopen("txt.txt","w");
if(fps_count==0){//60フレームの1回目なら
if(t==0)//完全に最初ならまたない
term=0;
else//前回記録した時間を元に計算
term=count0t+1000-GetNowCount();
}
else //待つべき時間=現在あるべき時刻-現在の時刻
term = (int)(count0t+fps_count*(1000.0/FLAME))-GetNowCount();

fprintf(fp,"%d:%d\n",fps_count,term);
if(fps_count==600)
fclose(fp);

if(term>0)//待つべき時間だけ待つ
Sleep(term);
gnt=GetNowCount();
if(fps_count==0)//60フレームに1度基準を作る
count0t=gnt;
f[fps_count]=gnt-t;//1周した時間を記録
t=gnt;
//平均計算
if(fps_count==FLAME-1){
ave=0;
for(i=0;i<FLAME;i++)
ave+=f[i];
ave/=FLAME;
}
fps_count = (++fps_count)%FLAME ;
}


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

Name: ひよこ  ..プログラマー(38,091ポイント)   Date: 2009/06/07(日) 13:47   No:34648     
Title: Re:もしかして・・・    
static int t=0;
static FILE *fp=fopen("txt.txt","w");
ってホームページには
static int t=0;
if(fps_count==0){//60フレームの1回目なら
って書いてあって
static FILE *fp=fopen("txt.txt","w");がないように見えるのですが
みなさんはどうなんでしょうか?


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



Name: you  ..ぴよぴよ(99ポイント)   Date: 2009/06/07(日) 03:33   No:34622       
Title: SHOT_BULLET_MAX    
はじめまして、龍神録の館を見させてもらいながら頑張ってるyouと申します。
13章の「敵にショットを撃たせてみよう」のところで、指示通りプログラムを打ってみて実行したのですが、

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

の,七行目のSHOT_BULLET_MAXが定義されていない識別子ですというエラーが17個ほど発生してしまいます。

打ち直してみたりしても一向に改善されません。

どうしたらいいのでしょうか?よろしくお願いします。


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


Name: BEMANI  ..プログラマー(32,734ポイント)   Date: 2009/06/07(日) 03:51   No:34623     
Title: Re:SHOT_BULLET_MAX    
>>youさん
「SHOT_BULLET_MAX」 が 「bullet_t bullet[SHOT_BULLET_MAX];」 以前に書かれていなければなりません。

今パッと見てきたところ、

--- define.h に以下を追加 ---
//敵1匹が持つ弾の最大数
#define SHOT_BULLET_MAX 1000

と言うのがありました。
「define.h」に #define SHOT_BULLET_MAX 1000 を記述してみて動きますでしょうか。


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

Name: you  ..ぴよぴよ(185ポイント)   Date: 2009/06/07(日) 10:42   No:34630     
Title: Re:SHOT_BULLET_MAX    
>>BENAMIさん
回答ありがとうございます。defineに#define SHOT_BULLET_MAX 1000と記述しましたけど、やはり定義されていない識別子というエラーがでてしまいます。

ほかのSHOT_BULLET_MAXがある行では、エラーがないということがさらによくわからないです。




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

Name: MNS  ..中級者(9,347ポイント)   Date: 2009/06/07(日) 11:04   No:34631     
Title: Re:SHOT_BULLET_MAX    
考えられる可能性としては、
・define.h がインクルードされていない
・SHOT_BULLET_MAXに何か余計なもの(空白)などが入っている
などがありますが、どうでしょうか?


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

Name: you  ..ぴよぴよ(305ポイント)   Date: 2009/06/07(日) 11:31   No:34633     
Title: Re:SHOT_BULLET_MAX    
>>MNSさん
回答ありがとうございます。define.hの中のSHOT_BULLET_MAXの部分をいじると(例SHOT_BULLET_MAのように)、他の行のSHOT_BULLEET_MAXも定義されていないと言われます。つまり、

//ベース角度、ベーススピード
double base_angle[1],base_spd[1];
bullet_t bullet[SHOT_BULLET_MAX];
}shot_t;

この3行目の記述になにか問題があるんでしょうか? 
それとも、define.hをインクルードするためになにか記述しないといけないのでしょうか?
お願いします。


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

Name: pooka [URL]  ..入門者(4,960ポイント)   Date: 2009/06/07(日) 11:50   No:34634     
Title: Re:SHOT_BULLET_MAX    
define.hに
#include "struct.h"
と書かれた行があると思いますが、これは一番下の行にありますか?
なければ一番下に書いてみてください。

(#define SHOT_BULLET_MAX 1000を#include "struct.h"の記述より前に書く)


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

Name: Tatu  ..入門者(2,835ポイント)   Date: 2009/06/07(日) 12:15   No:34635     
Title: Re:SHOT_BULLET_MAX    
龍神録プログラミングの館の
13章を見てみたところ、そのページだけでは
#define SHOT_BULLET_MAX 1000
などの文をdefine.hのどこに追加すべきなのかが
よくわからないようになっていました。

おそらく、youさんのdefine.hは
#include "struct.h"の後に
これらの文が追加されていると思います。
これだとSHOT_BULLET_MAXを定義する前に
struct.hをインクルードしてしまいます。

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

SHOT_BULLET_MAXはまだ定義されていないので
エラーになります。

define.hにかいてある
#define SHOT_BULLET_MAX 1000を
#include "struct.h"の上に書くようにすれば、
このエラーは起きなくなるはずです。


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

Name: you  ..ぴよぴよ(204ポイント)   Date: 2009/06/07(日) 12:28   No:34636     
Title: Re:SHOT_BULLET_MAX    
>>pookaさん
回答ありがとうございます。見事にいけました^^ありがとうございました。m(_)m

実行結果の敵が大玉しか撃ってこないのですが、あの章のプログラムではそれであってるんですかね?^^;

さすがに質問変わったら書くとこ新しくした方がいいのでしょうか?


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

Name: pooka [URL]  ..初心者(5,025ポイント)   Date: 2009/06/07(日) 12:48   No:34637     
Title: Re:SHOT_BULLET_MAX    
>実行結果の敵が大玉しか撃ってこない
csvファイルの弾種類の所を確認してみてください。
11章や12章のままなら全部0になっていると思うので、
その数字を変更してみてください。


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

Name: you  ..ぴよぴよ(6ポイント)   Date: 2009/06/07(日) 13:13   No:34642 解決!     
Title: Re:SHOT_BULLET_MAX    
>>pookaさん
回答ありがとうございます。無事できました。本当にありがとうございました。

>>tatuさん
回答ありがとうございます。見落としてしまっていたようで大変申し訳ありません。わかりやすい説明ありがとうございます^^

>>BEMANIさん
名前間違って表記してしまいました。申し訳ありません。

みなさん本当にありがとうございました^^
頑張って続きやってみます。


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



Name: hal  ..かけだし(1,085ポイント)   Date: 2009/06/07(日) 02:45   No:34620       
Title: LoadDivGraphで読み込んだ画像が表示されない    
こんにちは。龍神録プログラミングの館で勉強させていただいている者です。
龍神録プログラミングでも使われている、関数LoadDivGraphについての質問です。
どうも読み込む画像が一定のサイズ以上になると表示されないようなのです。
LoadDivGraphでボスの画像を読み込もうとしているのですが、380×1140の画像を3つに分割したものは表示できませんでした。
ためしに、もっと小さな画像(288×270を12に分割したもの)に差し替えてみると表示できました。

サイズの制限でもあるのだろうかと思い、まさかと思いDXライブラリを調べてみましたが、やはり見たところそのような記述はなく・・・
なぜこのようなことが起こるのでしょうか?
分かる方がいらっしゃいましたら、ご教授宜しくお願いします。


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


Name: hal  ..かけだし(1,206ポイント)   Date: 2009/06/07(日) 02:53   No:34621 解決!     
Title: Re:LoadDivGraphで読み込んだ画像が表示されない    
すみませんでした。早とちりだったようです。
単に間違えて画像をバックアップ用の方のフォルダに入れていただけでした。
もし読んで、真剣に考えてくださった方いらっしゃいましたら本当にすみませんでした。
以後慌てないように気をつけます・・・。


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



Name: チルチル  ..上級者(23,336ポイント)   Date: 2009/06/06(土) 20:31   No:34610       
Title: #define 疑似命令が上手く行かない    
自作関数の引数が何を意味するのが分かりにくいのでコメントを書こうと思ったのですが

, /*Angle*/PI/8*i );

のように書くと見にくいので

, 'Angle'PI/8*i );

のように書いて「'」を

#define ' /*/

でコメントに置換しようと思ったんですが

「/*」の部分で注釈と認識されて無理でした・・

この処理を実現する方法は無いでしょうか?

「'」で囲んだ部分が無くなれば良いんですが・・

あと「'」は今回のプログラムでは使わないと思うし

「'」じゃないと色が変わらなくて目立たないので

なるべく「'」でお願いします

環境はDXライブラリです


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


Name: box  ..ハッカー(141,074ポイント)   Date: 2009/06/06(土) 21:10   No:34612     
Title: Re:#define 疑似命令が上手く行かない    
> , /*Angle*/PI/8*i );
>
> のように書くと見にくいので
>
> , 'Angle'PI/8*i );
>
> のように書いて「'」を

引数の並びの中にコメントを埋め込もうとすると、
いずれにしても見にくくなりませんか?

ところで、そういう策を講じようとする前の話として、
そのプログラムは正しく動いているのですよね?


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

Name: kazuoni [URL]  ..比類無きプログラマー(89,403ポイント)   Date: 2009/06/06(土) 21:12   No:34613     
Title: Re:#define 疑似命令が上手く行かない    
もし実現できたとしても、見づらいと思いますよ。
素直に、引数ごとに改行したりするなど、他の自分なりの工夫をしたほうがいいと思います。

そもそも、シングルクォーテーションは文字定数で使いますし。

#かぶりました・・・。


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

Name: Libra  ..初心者(8,022ポイント)   Date: 2009/06/06(土) 21:20   No:34614     
Title: Re:#define 疑似命令が上手く行かない    
自分はテンプレ作ってこのような感じで書いてます。
自己流ですが、一例として。


/*============================================
関数名:AngleCalc
機能:起点から目標点の角度(ラジアン)を計算する
返り値:double型 ラジアンの角度
第一引数:double型 起点xの座標
第二引数:double型 起点yの座標
第三引数:double型 目標点のx座標
第四引数:double型 目標点のy座標
============================================*/
double AngleCalc( double base_x ,
double base_y ,
double target_x
double target_y )
{


}



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

Name: Justy  ..伝説なるハッカー(369,257ポイント)   Date: 2009/06/06(土) 21:25   No:34615     
Title: Re:#define 疑似命令が上手く行かない    

>この処理を実現する方法は無いでしょうか

  'Angle'PI/8*i な方法で実現する方法はありません。

 但し、文字数が限られてもいいなら、もしくは 'ではなく "でもよければ
少し記法は変わりますが無くはないです。


void disp1(int angle)
{
    printf("angle = %d\n", angle);
}
void disp2(int angle, float speed)
{
    printf("angle = %d\n", angle);
    printf("speed = %f\n", speed);
}

{   // 使うとき
    disp1(('R', 5));
    disp1(("意味のないコメント", 30));
    disp2(("とりあえず 0にしとこう", 0), ("Speed", 12.f));
}


 お勧めは全くできませんが。



>自作関数の引数が何を意味するのが分かりにくいので

 わかりにくければ、引数に式を書いて1行で済まそうとせず、
値を変数にして名前をつければいいだけです。

    double angle = PI/8*i;
    hoge(angle);

 これなら明確に hoge関数の引数は何かの角度であることは解るはずです。
 ここでは angleとしましたが、回転角度なら rotate_angle とか
具体的な名前をつければ、もっと解りやすくなるはずです。


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

Name: たかぎ [URL]  ..ハッカー(104,066ポイント)   Date: 2009/06/06(土) 21:42   No:34616     
Title: Re:#define 疑似命令が上手く行かない    
C/C++の範囲で実現することはできませんので、お勧めする訳ではないですが、sedやm4などを前処理に使えば、希望通りのことが実現できるかと思います。


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

Name: チルチル  ..上級者(23,374ポイント)   Date: 2009/06/06(土) 22:59   No:34617 解決!     
Title: Re:#define 疑似命令が上手く行かない    
あ〜やっぱり無理ですか・・

仕方ないのであきらめます

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


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



Name: ひよこ  ..プログラマー(36,948ポイント)   Date: 2009/06/06(土) 11:37   No:34582       
Title: 無題    
こんにちはひよこです。
今、音ゲームを作っているのですがデバックでおかしなところが三つあるのですが

一つ目 csvファイルのデータ通りにいかない(実行してみると、秒数が違うのに弾が全部一緒に出てくる)
二つ目 kndの値がおかしく、配列のエラーになってしまう。
三つ目 Zキーを押したときだけ左上に矢印が出てくる(仕様じゃないです。

どうすればいいのかわかりません。どうすればいいでしょうか?


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


Name: ひよこ  ..プログラマー(36,970ポイント)   Date: 2009/06/06(土) 11:39   No:34583     
Title: 音ゲームについて    
すみません、題名入れ忘れました。
「音ゲームについて」です。


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

Name: pooka [URL]  ..入門者(4,721ポイント)   Date: 2009/06/06(土) 12:44   No:34589     
Title: Re:音ゲームについて    
ざっと見ただけなので違うかも知れませんが気になった点を・・・(今の問題と関係ないかも知れませんが)
BULLET_MAXは500なのにbullet[100]となっていて、
bullet.cppなどを見るとbulletの要素数を超えてアクセスしてしまっているようにみえます。
あとbullet_enter関数の
>bullet[i].x=bullet[t].x;
などは、どちらかがbullet_orderだったりしませんか?


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

Name: ひよこ  ..プログラマー(37,111ポイント)   Date: 2009/06/06(土) 13:22   No:34590     
Title: Re:音ゲームについて    
pookaさん
>>左上の矢印は消えたました。
なぜか一番左側がなぜか二つくっついていて
bullet_graph()のなかでDrawGraph(bullet[i].x,bullet[i].y,img_yajirusi[bullet[i].cnt],TRUE);
としたら他の矢印が左以外が消えて
bullet_act()のなかでbullet[i].y+=bullet[i].spd;とファイルから読み込んだスピードにしたら
左側の二つくっついていたのが左上に取り残されてあとひとつが落ちてきました。
csvファイルをひらいたまま実行すると
左上に描画されていました。


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

Name: pooka [URL]  ..入門者(4,732ポイント)   Date: 2009/06/06(土) 14:36   No:34591     
Title: Re:音ゲームについて    
>左上の矢印は消えたました。
ということなのですが
>Zキーを押したときだけ左上に矢印が出てくる
が解決したということでよろしいでしょうか?

他の問題点についてはどうなりましたか?


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

Name: ひよこ  ..プログラマー(37,258ポイント)   Date: 2009/06/06(土) 14:46   No:34592     
Title: Re:音ゲームについて    
pookaさん 左上の矢印は消えました。 ということなのですが
Zキーを押したときだけ左上に矢印が出てくる が解決したということでよろしいでしょうか?

>>cntと同じ時間に出るように(ちゃんと反応しました)なりました、ありがとうございます。

>>うえのような変更したら
>>左上に実行時から矢印が出ていてZキーを押しても出てくるかわからないのです。
>>knd通りに矢印が出ません。




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

Name: pooka [URL]  ..入門者(4,747ポイント)   Date: 2009/06/06(土) 14:58   No:34593     
Title: Re:音ゲームについて    
>knd通りに矢印が出ません。
矢印ひだり.bmp、矢印ひだり1.bmpなどの違いが画像がないのでわかりませんが、
bullet_graph関数の
>DrawGraph(bullet[i].x,bullet[i].y,img_yajirusi[4/*bullet[i].cnt*/],TRUE);

DrawGraph(bullet[i].x,bullet[i].y,img_yajirusi[bullet[i].knd+4],TRUE);
にすればknd通りに表示されると思います。


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

Name: ひよこ  ..プログラマー(37,358ポイント)   Date: 2009/06/06(土) 15:38   No:34596     
Title: Re:音ゲームについて    
DrawGraph(bullet[i].x,bullet[i].y,img_yajirusi[bullet[i].cnt+4],TRUE);
とやってみましたが
矢印の色が変わるだけで左以外が出ません。

管理人さんの画像もまじってますが画像を添付しておきます。


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

Name: ひよこ  ..プログラマー(37,373ポイント)   Date: 2009/06/06(土) 16:58   No:34597     
Title: Re:音ゲームについて    
というかこちらと言ってるとおりの状況になりますでしょうか?

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

Name: pooka [URL]  ..入門者(4,855ポイント)   Date: 2009/06/06(土) 17:18   No:34598     
Title: Re:音ゲームについて    
ようやく
>一番左側がなぜか二つくっついていて
の意味がわかりました。

添付したソースは私の環境だときちんと表示されています。(意図した通りかはわかりませんが)

以下変更した関数
load_gakufu
bullet_enter
bullet_graph
ini
あとGV.h

ini関数のcountの値を1に変更したのでcsvファイルのcntも適当な数字に変更する必要があります。


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

Name: ひよこ  ..プログラマー(37,392ポイント)   Date: 2009/06/06(土) 17:42   No:34600     
Title: Re:音ゲームについて    
動きましたが、具体的にどこが悪かったのでしょうか?

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

Name: pooka [URL]  ..入門者(4,979ポイント)   Date: 2009/06/06(土) 18:05   No:34602     
Title: Re:音ゲームについて    
bullet_orderという構造体の配列を0で初期化しているとして、
countが0だとbullet_enter関数のif(bullet_order[t].cnt==count)の条件を
tの値にかかわらず満たすことになり、flagの値が1になって描画されているようです。
(0で初期化してあるので、xが0の位置で描画されています)

伝わるかな・・・^^;


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

Name: ひよこ  ..プログラマー(37,419ポイント)   Date: 2009/06/06(土) 18:09   No:34603     
Title: Re:音ゲームについて    
かんたんに構造体の配列を0で初期化すると
構造体の中身はすべて0になるということですか?


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

Name: pooka [URL]  ..初心者(5,039ポイント)   Date: 2009/06/06(土) 18:40   No:34605     
Title: Re:音ゲームについて    
簡単にとはどういうことかわかりませんが、
memset(bullet_order,0,sizeof(bullet_order_t)*BULLET_ORDER_MAX);
としているので0になると思います。


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

Name: ひよこ  ..プログラマー(37,459ポイント)   Date: 2009/06/06(土) 20:18   No:34608 解決!     
Title: Re:音ゲームについて    
そうなんですか。pookaさん長い間ありがとうございました。

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

Name: Tatu  ..入門者(2,609ポイント)   Date: 2009/06/06(土) 20:18   No:34609     
Title: Re:音ゲームについて    
pookaさんによるソースの変更と同じ内容かとおもいますが、
私が見て気になったことを書きます。

csvファイルについて
登録カウントはすべて0より大きくしてください。
理由はini.cppのところで書きます。

x座標とy座標を読み込ませる意味はあるのでしょうか?
なぜなら、x座標は矢印の向きで決めることができ、
y座標は矢印の向きにかかわらず一定のはずだからです。

bullet.cppについて
bullet[i].x=bullet[t].x;などと書かれている部分を
bullet[i].x=bullet_order[t].x;のようになおしてください。
登録時に代入するのはcsvファイルから読み込んで
bullet_orderに格納したデータだからです。
初期化されたbulletの情報はすべて0なので意味がありません。

graph.cppおよび画像について
背景の矢印は押されている、押されていないにかかわらず、
DrawRotaGraphF関数で描画したほうが扱いやすいのではないでしょうか?

上から下りてくる矢印の画像はimg_yajirusi[4+bullet[i].knd]です。
矢印のカウントによって画像を変えるわけでないのならば、
bullet[i].cntは無関係です。

矢印たて.bmpは矢印うえ.bmpとしたほうがわかりやすいと思います。

色のついた矢印の色が違っているのが、きになります。
(赤・黄・緑・青のようなものなら、きにしませんが)

ini.cppについて
countが1から始まるようにしてください。
0からだった場合、楽譜読み込み関数(load_gakufu)で、
変更されなかったbullet_orderの情報の全てが0なので、
大量の(重なっているため一つに見える)矢印が、
左上に表示されます。
さっき書いた登録カウントを0より大きくする
というのは、このようにすると、
0だった場合、登録されないようになるからです。

load.cppについて
load_gakufu関数で読み込んだデータはbullet_order構造体に
記録します。そのため
case 0: bullet[n].cnt=atoi(inputc);breakなどと書かれているところを
case 0: bullet_order[n].cnt=atoi(inputc);breakのように直してください。

main.cppについて
コードを見る限り、4つの矢印のうちどれか一つしか反応しないように
なっていますが、同時に2つ以上の矢印を押すことはないのでしょうか?

なぜ矢印に対応するキーが左・上・下・右ではなく、
Z・X・下・右になっているのでしょうか?

define.hについて
大量の矢印(bullet)が同時に出てくるとは思えないので、
BULLET_MAXの値を減らしてもよいのではないでしょうか?

function.hについて
どの関数がどのファイルに書かれているのかということが
わかるようにしたほうがよいのではないでしょうか?

GV.hについて
GLOBAL bullet_t bullet[100]と書かれていますが、
GLOBAL bullet_t bullet[BULLET_MAX]と書きなおしてください。

struct.hについて
bullet_order構造体の移動スピードを表す変数が
spdではなくspになっています。


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

Name: ひよこ  ..プログラマー(37,833ポイント)   Date: 2009/06/06(土) 20:31   No:34611     
Title: Re:音ゲームについて    
Tatuさん >>ご指摘ありがとうございます。

main.cppについて
コードを見る限り、4つの矢印のうちどれか一つしか反応しないように
なっていますが、同時に2つ以上の矢印を押すことはないのでしょうか?

なぜ矢印に対応するキーが左・上・下・右ではなく、
Z・X・下・右になっているのでしょうか?

>>一つしか反応しないのは未だに開発途中という意味で
>>どうすればいいか考えています。
>>キーの割り当てもまだ考え中です。

define.hについて
大量の矢印(bullet)が同時に出てくるとは思えないので、
BULLET_MAXの値を減らしてもよいのではないでしょうか?

>>さすがに500個も画面には出しませんね。

function.hについて
どの関数がどのファイルに書かれているのかということが
わかるようにしたほうがよいのではないでしょうか?

>>たしかにわかりやすいほうがいいですね。

struct.hについて
bullet_order構造体の移動スピードを表す変数が
spdではなくspになっています。

>>さっき気づいてspdにしました。


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



Name:  ..ぴよぴよ(129ポイント)   Date: 2009/06/06(土) 17:30   No:34599       
Title: 四方向のショット    
ボンバーマン風のゲームで敵に四方向に弾を撃たせたいのですが
うまくいきません。

症状:弾を撃ったあとに敵が移動すると弾も敵が移動した方向に一緒に
動いてしまいます。


弾は一度だしたら壁にぶつかるまでまっすぐ飛ばしたいのですがどうしたらいいですか?
宜しくお願いします


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


Name: kazuoni [URL]  ..比類無きプログラマー(89,199ポイント)   Date: 2009/06/06(土) 18:03   No:34601     
Title: Re:四方向のショット    
まず○ンバーマンで弾を打つっという行動が分かりませんが・・・^^;

コードがないので何とも言えないですけど、
一緒に移動するということは、弾、敵の位置を計算する変数が同じになっている
もしくは、関数でそれぞれ計算するとしたら、
弾の座標を渡すところを、敵の座標を渡してしまっている
ぐらいでしょうか。

コードを公開すればもっと良い回答が得られるかも知れません。


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

Name:  ..ぴよぴよ(810ポイント)   Date: 2009/06/06(土) 18:27   No:34604     
Title: Re:四方向のショット    
返信ありがとうございます。
ソースは敵から向きをもらい、その方向に弾を出すという風にしたいのですが・・・


void enemy_shot::hassya(Enemy *date , Map *map , Player *life)
{
for(int i = 0; i < ENEMY ; i++)
{
if(date->enemy[i].tama_flag == 1 &&teki_shot[i].shot_flag == 0)
{
teki_shot[i].x = date->enemy[i].x;
teki_shot[i].y = date->enemy[i].y;
teki_shot[i].shot_flag = 1;
teki_shot[i].shot_move_flag = 1;
}
if(teki_shot[i].shot_flag == 1)
{
if(date->enemy[i].muki == 0 && teki_shot[i].shot_move_flag == 1)
{
teki_shot[i].shot_move_flag = 1;
teki_shot[i].y -= 5;
if(map->map[teki_shot[i].y/32-1][teki_shot[i].x/32] == 2)
{
map->map[teki_shot[i].y/32-1][teki_shot[i].x/32] = 0;
teki_shot[i].shot_flag = 0;
}

if(teki_shot[i].y == life->y && teki_shot[i].x == life->x)
{
life->life--;
}

if(teki_shot[i].y < -80)
{
//date->enemy[i].tama_flag = 0;
teki_shot[i].shot_flag = 0;
teki_shot[i].shot_move_flag = 0;
}
}

if(date->enemy[i].muki == 1 && teki_shot[i].shot_move_flag == 1)
{
teki_shot[i].shot_move_flag = 2;
teki_shot[i].x -= 5;
if(map->map[teki_shot[i].y/32][teki_shot[i].x/32 - 1] == 2)
{
map->map[teki_shot[i].y/32][teki_shot[i].x/32 - 1] = 0;
teki_shot[i].shot_flag = 0;
}

if(teki_shot[i].y == life->y && teki_shot[i].x == life->x)
{
life->life--;
}

if(teki_shot[i].x < -80)
{
//date->enemy[i].tama_flag = 0;
teki_shot[i].shot_flag = 0;
teki_shot[i].shot_move_flag = 0;
}
}

if(date->enemy[i].muki == 2 && teki_shot[i].shot_move_flag == 1)
{
teki_shot[i].shot_move_flag = 3;
teki_shot[i].x += 5;
if(map->map[teki_shot[i].y/32][teki_shot[i].x/32 + 1] == 2)
{
map->map[teki_shot[i].y/32][teki_shot[i].x/32 + 1] = 0;
teki_shot[i].shot_flag = 0;
}

if(teki_shot[i].y == life->y && teki_shot[i].x == life->x)
{
life->life--;
}

if(teki_shot[i].x > 480)
{ teki_shot[i].shot_move_flag = 3;
//date->enemy[i].tama_flag = 0;
teki_shot[i].shot_flag = 0;
}
}

if(date->enemy[i].muki == 3 && teki_shot[i].shot_move_flag == 1)
{
teki_shot[i].shot_move_flag = 4;
teki_shot[i].y += 5;
if(map->map[teki_shot[i].y/32 + 1][teki_shot[i].x/32] == 2)
{
map->map[teki_shot[i].y/32 + 1][teki_shot[i].x/32] = 0;
teki_shot[i].shot_flag = 0;
}
if(teki_shot[i].y == life->y && teki_shot[i].x == life->x)
{
life->life--;
}

if(teki_shot[i].y > 640)
{
teki_shot[i].shot_move_flag = 0;
//date->enemy[i].tama_flag = 0;
teki_shot[i].shot_flag = 0;
}
}
}
}
}


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

Name: kazuoni [URL]  ..比類無きプログラマー(89,349ポイント)   Date: 2009/06/06(土) 18:46   No:34606     
Title: Re:四方向のショット    
コードは規約通り、プレタグで囲ってください。

コードを載せてもらったんですが、何がどうなってるのか、
コメントもないので、余裕のない自分にはどうもできませんが、
プロジェクトごとUPする、
もしくは、デバッガで弾の移動するような所をすべてブレークポイントで止めながら、
一つずつ動作を追っていってください。

後者のが、一番ベストだとは思いますが・・・。




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



Name: 蒼空(初心者)  ..ぴよぴよ(199ポイント)   Date: 2009/06/05(金) 22:35   No:34549       
Title: 誰か教えてください。    
東方風のSTGを作っているんですが、
「東方永夜抄」の夢符「封魔陣」の弾幕を真似したいんですけど、
どうしても、途中で5つの角度に分かれる弾幕の作り方がわからないんです。
弾が5つ重なって真下に下りてきて、途中に真ん中の1つはそのままの角度。
あとの二つは、まっすぐから±45度で、
もう二つは、まっすぐから±22.5度なんですけど、
誰か、教えてください。

環境は、VC++ 2008EEで、XPをつかっています。
知識は、興味本位でやり始めたばっかりなので、
簡単な文は分かるぐらいです。
よろしくお願いします。


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


Name: チルチル  ..上級者(21,989ポイント)   Date: 2009/06/05(金) 22:57   No:34550     
Title: Re:誰か教えてください。    
弾に番号でも渡しておいて移動パターン内で時間が来たら条件分岐すれば良いんじゃないですか?

それとも条件分岐の具体的な内容ですか?


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

Name: 蒼空(初心者)  ..ぴよぴよ(36ポイント)   Date: 2009/06/05(金) 23:32   No:34554     
Title: Re:誰か教えてください。    
うまく説明が出来ないんですけど、
まず、8way弾で、その弾には5つ弾が重なっていて、
発射された後、弾一つ一つに、発射されてある一定時間以上たったなら、
弾の角度を変える。ってやつなんですけど、

一気じゃなくて、弾一つ一つで連続して変化するという弾幕です。

>それとも条件分岐の具体的な内容ですか?

はい、できればそれでお願いします。


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

Name: b  ..ぴよぴよ(66ポイント)   Date: 2009/06/05(金) 23:35   No:34555     
Title: Re:誰か教えてください。    
弾を発射するときに、動く方向の角度と、一定時間経ったときに加算する角度の2つの角度情報を持たせれば条件分岐を使用しなくても実装できると思います。

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

Name: 蒼空(初心者)  ..ぴよぴよ(122ポイント)   Date: 2009/06/05(金) 23:40   No:34556     
Title: Re:誰か教えてください。    
bさん、返答ありがとうございます。

でも、できればソースを載せてほしいです。
正直、自分の知識的にちょっと危ないので、

龍神録のソースを使っていますので、ぜひともお願いします。


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

Name: b  ..ぴよぴよ(124ポイント)   Date: 2009/06/05(金) 23:46   No:34559     
Title: Re:誰か教えてください。    
龍神録のソースは使ってないのでわかりませんが、ぱぱっと書いてみますわ。
その間弾を実装するための設計書とか自分で組んでみてはいかがでしょう?


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

Name: 蒼空(初心者)  ..ぴよぴよ(196ポイント)   Date: 2009/06/05(金) 23:51   No:34560     
Title: Re:誰か教えてください。    
はい、指摘?ありがとうございます。

一応自分でも、軽く分かる範囲で作ってみました。
ですが、やはり知識不足で理想にはぜんぜん遠くて
そのために、投稿しました。良い返答を期待しています。


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

Name: チルチル  ..上級者(22,730ポイント)   Date: 2009/06/06(土) 00:08   No:34562     
Title: Re:誰か教えてください。    
まあ永夜抄やった事があるのでどんな弾幕かはわかりますけどね

封魔陣は二回曲がると思いますけど
一回も二回もそれほど変わらないので省略します

bさんの方法でも良いですがパッと思いついた方法を書きます



まず弾の構造体に角度を格納するAngleと言う変数と
多目的に使えるDATAと言う変数があるとします

弾を一度に五個登録する時にfor文でも使って
DATA変数に何でも良いんですが
とりあえず 0 1 2 3 4 の順番に数値を入れます
それ以外の数値は同じなので
重なって飛んで行きます

そして弾の移動パターンの中で
弾のカウンタが指定した時間になったら
Angle変数に角度を加算します

45度と22.5度を導く効率の良い式が浮かばないので

#define PI 3.1415926535898

と言う宣言が行われているとして

PI=180度なので

45度=PI/180*45
22.5度=PI/180*22.5

で求めます

そして

if( Shot[i].Count==60 ){

if( Shot[i].DATA==0 )Shot[i].Angle+=PI/180*45;

if( Shot[i].DATA==1 )Shot[i].Angle+=PI/180*22.5;

if( Shot[i].DATA==3 )Shot[i].Angle-=PI/180*22.5;

if( Shot[i].DATA==4 )Shot[i].Angle-=PI/180*45;

}

のような処理で実現します

これで発射されてから一秒後に五方向に別れる・・と思う

簡単にするために無駄が多くなってるので
慣れて来たら効率化してみてください

bさんのように登録時に角度を求めて時間になったら
角度に足す事で曲げる事もできます

私は説明では不十分かもしれないので
わからない事があったら言って下さい
サンプルとかも作りますよ


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

Name: 蒼空(初心者)  ..ぴよぴよ(260ポイント)   Date: 2009/06/06(土) 00:11   No:34564     
Title: Re:誰か教えてください。    
チルチルさんどうもありがとうございます。

ぜひ、ソレを参考にさせていただきます。


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

Name: チルチル  ..上級者(22,800ポイント)   Date: 2009/06/06(土) 00:13   No:34565     
Title: Re:誰か教えてください。    
書いている間に更新されましたね

私は龍神録のコードが理解できなかったので
オリジナルのコードを使っています

なのでサンプルを作るのが難しいですが
できる限り善処します


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

Name: b  ..ぴよぴよ(451ポイント)   Date: 2009/06/06(土) 00:14   No:34566     
Title: Re:誰か教えてください。    
簡単に書いてみました。間違いとかあるかもしれませんが(^^;)
さすがに初見で龍神録の変数の仕様とかはわからないので、要所のみ書いてみました。

仕様は封魔陣ノーマルのスぺカを基準で。


//弾の発射フラグ立て=============================
int i , j ;
double angle1 , angle2 ;//第一、第二動作角度
const double addangle1 = 2 * PI / 弾の数(8WAYなら8) ;
const double addangle2 = 弾の間隔の角度(ラジアンで22.5度) ;

angle1 = 起点となる角度、自機狙いなら自機の角度を入れておく

for( i = 0 ; i < 弾の数(8WAYなら8) ; i++ )//すみません、抜けてました
{
angle1 += addangle1 ;

//↓どちらかを使ってください、今回は5Wayということで上の方のみで
//Nway弾が奇数のとき
angle2 = -(double)( nWay / 2 ) * addangle2 ;
//Nway弾が偶数のとき
angle2 = -(double)( nWay - 1 ) / 2.0 * addangle2 ;

for( j = 0 ; j < 弾の数(5方向に弾を分けるなら5) ; j++ )
{
//発射されていない弾のフラグを探す
{
第一動作角度にangle1を代入

第二動作角度にangle2を代入

angle2 += addangle2 ;
}
}
}


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

Name: b  ..ぴよぴよ(662ポイント)   Date: 2009/06/06(土) 00:29   No:34572     
Title: Re:誰か教えてください。    
追記:ちるちるさんの方法ですが、弾の発射個数の分岐が7個に変わった場合にソースを書き換える個所が多数出ると思います。
また、0,1,2,3,4と弾に番号を振っていますが、それが何を指し示すのかわからない数字、マジックナンバーになってしまっているのではないでしょうか?

自分の方法ですと、弾を何個発射するかの変数、const int shotnum = 5 ;とかを弾を発射する関数に用意すれば、その数値を変えるだけで角度調節、発射個数変更が効きます。


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

Name: Dixq (管理人) [URL]  ..ウィザード(1,026,810ポイント)   Date: 2009/06/06(土) 00:33   No:34574     
Title: Re:誰か教えてください。    
龍神録では、弾の「状態」を表すために「.state」が用意してあります。
このstateに好きな数字を入れて、その数字で条件わけしてやればいいと思います。
今、1箇所から同じ方向に5つ弾が出て、途中でその5つが分岐するなら、
その5つに0〜4の数字でもふってやり、その数字に応じてあるカウント数になったら、
角度を変えてみてはどうでしょう?


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

Name: チルチル  ..上級者(23,030ポイント)   Date: 2009/06/06(土) 00:39   No:34575     
Title: Re:誰か教えてください。    
そう言えばそうですね
私は定数項を変更する方法を使う事が多いのでこのような処理にしました

どうも私は例外処理に対して排他的な処理を行ってしまう癖が・・

やはり登録時に変更角度を渡した方が良いかもしれませんね・・

「マジックナンバー」と言う言葉の意味がよく分りませんが確かに脈絡は無いですね・・
私のコードはこんな感じの処理ばっかりですけど
気付かないうちにマジックナンバーだらけになってしまっていたのか・・


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

Name: b  ..ぴよぴよ(685ポイント)   Date: 2009/06/06(土) 00:46   No:34576     
Title: Re:誰か教えてください。    
マジックナンバーとは でググってみるといいですよ

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

Name: チルチル  ..上級者(23,102ポイント)   Date: 2009/06/06(土) 01:01   No:34577     
Title: Re:誰か教えてください。    
そういえば私のコードはスイッチ文の脈絡がわかりにくい事が多い・・
いやそれは関係無いか・・
処理全体がもうマジックナンバーみたいなもんだし・・


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

Name: Dixq (管理人) [URL]  ..ウィザード(1,026,938ポイント)   Date: 2009/06/06(土) 01:16   No:34578     
Title: Re:誰か教えてください。    
よく回答の流れを見ずに書き込んだら思いっきり不適切なコメントしてしまいました(汗

確かにマジックナンバーを多用すると効率が悪くなる場面が多いと思いますが、
まずは弾幕が作れるようになってから、効率面を考えてもいいのでは無いかなと思います。

そして効率面を追及していくと解り易いと思います。
まぁ今回位の規模でしたらどちらでもいいかもしれませんね。


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

Name: Tatu  ..かけだし(1,659ポイント)   Date: 2009/06/06(土) 11:03   No:34580     
Title: Re:封魔陣の作り方    
封魔陣に挑戦してみました。


//弾を発射する関数
void boss_bullet_on(int way,int knd,int col,int flag,double x,double y,double size,double b_angle,double d_angle,double spd,int state,int till){
int i=0,k;
for(i=0;i<way;i++){
if((k=search_boss_shot())!=-1){
boss_shot.bullet[k].knd = knd;//弾の種類
if(knd==7) boss_shot.bullet[k].kaiten=1;
else boss_shot.bullet[k].kaiten=0;
boss_shot.bullet[k].col = col;//弾の色
boss_shot.bullet[k].flag = 1;//flag;1だと当たり判定あり、2だと当たり判定なし
boss_shot.bullet[k].cnt = 0;
boss_shot.bullet[k].x = x;//座標
boss_shot.bullet[k].y = y;
//boss_shot.bullet[k].size = size;弾の大きさ(今は意味なし)
boss_shot.bullet[k].angle = b_angle+d_angle*(i - way/2);//角度:bが基準、dが間隔
boss_shot.bullet[k].spd = spd;//スピード
boss_shot.bullet[k].state = state;//弾の状態
boss_shot.bullet[k].till = till;//弾が画面外に出ても消えない時間
se_flag[0]=1;
}
}
}
//封魔陣のようなもの
void boss_shot_bulletH000(){
int i,t=boss_shot.cnt;
static double ang=PI/16;
if(t==0){
boss.hp_max=150000;
boss.hp =30000;
}
if(t%15==0){
for(i=0;i<5;i++){
boss_bullet_on(8,5,1,1,boss.x,boss.y,1,ang,PI2/8,3,i+1,0);
}
}
if(t>100){
if((t+100)%800<400) ang+=PI/(32*60);
else ang-=PI/(32*60);
if(t%150==0){
boss_bullet_on(32,10,1,1,boss.x,boss.y,1,bossatan2(),PI2/32,6,6,0);
}
if(t%100==0){
boss_bullet_on(16,1,0,1,boss.x,boss.y,1,bossatan2()+PI,PI/16,3,7,0);
}
}
for(i=0;i<BOSS_BULLET_MAX;i++){
if(boss_shot.bullet[i].flag>0){
switch(boss_shot.bullet[i].state){
case 1:
if(boss_shot.bullet[i].cnt==30 || boss_shot.bullet[i].cnt==60)
boss_shot.bullet[i].angle-=PI/4;
break;
case 2:
if(boss_shot.bullet[i].cnt==30 || boss_shot.bullet[i].cnt==60)
boss_shot.bullet[i].angle-=PI/8;
break;
case 4:
if(boss_shot.bullet[i].cnt==30 || boss_shot.bullet[i].cnt==60)
boss_shot.bullet[i].angle+=PI/8;
break;
case 5:
if(boss_shot.bullet[i].cnt==30 || boss_shot.bullet[i].cnt==60)
boss_shot.bullet[i].angle+=PI/4;
break;
case 6:
if(boss_shot.bullet[i].cnt<30){
boss_shot.bullet[i].spd-=0.2;
}
if(boss_shot.bullet[i].cnt==120){
boss_shot.bullet[i].knd=6;
boss_shot.bullet[i].spd=2;
}
break;
//陰陽玉の代わり
//通常時は赤く、当たり判定があるが
//低速時は青く、当たり判定がない
case 7:
if(CheckStatePad(configpad.slow)==0){
boss_shot.bullet[i].flag=1;
boss_shot.bullet[i].col=0;
}
else{
boss_shot.bullet[i].flag=2;//当たり判定がない
boss_shot.bullet[i].col=1;
}
if(boss_shot.bullet[i].cnt<60){
if(cos(boss_shot.bullet[i].angle)>0){
boss_shot.bullet[i].angle+=PI*2/(3*60);
}
else{
boss_shot.bullet[i].angle-=PI*2/(3*60);
}
}
if(boss_shot.bullet[i].x<16 || FMX-16<boss_shot.bullet[i].x){
boss_shot.bullet[i].angle=PI-boss_shot.bullet[i].angle;
}
break;
}
}
}

}


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

Name: yu  ..プログラマー(28,626ポイント)   Date: 2009/06/06(土) 12:05   No:34584     
Title: Re:封魔陣の作り方    

・・・被ってしまいました><
すみません;

自分も作ってみました。
変な処理をしているかもしれませんw
妥協したところが多々有りです・・・

60章を元に作成しました。
boss_shotH.cppにこの関数を追加し、func.hを少し変更すると動くと思います。

後、Tatu様のようにstateはswitchで扱ったほうが良いですね;

どこか分からないところ、おかしなところがあったら言ってください;

#追記
#一部編集しました


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

Name: チルチル  ..上級者(23,123ポイント)   Date: 2009/06/06(土) 12:28   No:34587     
Title: Re:封魔陣の作り方    
なかなかよさそうなサンプルですね
とりあえず私の出る幕は無さそうですね


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

Name: 蒼空(初心者)  ..ぴよぴよ(260ポイント)   Date: 2009/06/06(土) 15:01   No:34595     
Title: Re:封魔陣の作り方    
少し見ぬ間に、いろいろ返信ありがとうございます。

コレを見てもう少しがんばってみます。




Name: シュウ  ..ぴよぴよ(956ポイント)   Date: 2009/06/05(金) 20:19   No:34543       
Title: 高3の卒業課題として    
管理人さんに質問です。

以前から参考にさせていただいていた『龍神録プログラミングの館』を元にして弾幕STGを作ろうと思っているのですが、利用規約を見て、どの程度改変すれば許可がいただけるのか悩んでいます。

弾・雑魚・自機・立ち絵を差し替えて、敵弾幕(雑魚・ボス両方)を自作し、独自のシステム(得点倍率変動システム)を加えられれば卒業制作としての使用を認めていただけますか?

回答をお待ちしています。


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


Name: non  ..熟練のプログラマー(46,651ポイント)   Date: 2009/06/05(金) 20:28   No:34545     
Title: Re:高3の卒業課題として    
卒業研究として認められるかは、担当教官にも了承を得るべきではないでしょうか?
どこまでが他人が作った物かわからないと正当な評価をすることができません。
もちろん、使っていいかは管理人さんの許可が必要ではありますが。


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

Name: Dixq (管理人) [URL]  ..ウィザード(1,026,490ポイント)   Date: 2009/06/06(土) 00:09   No:34563     
Title: Re:高3の卒業課題として    
こんにちは。シュウさん。
卒業課題大変ですね。頑張って下さい。

特に厳しく規約を作りたくは無いのですが、
卒業制作を完全コピーで名前をつけて提出している人がいらっしゃるという報告を何件か受けており、
そういうのは避けて欲しいなと思っています。
私自身こんなプログラムでも人の助けや喜びの一部にでもなれたら嬉しいと思い公開しているものですから、
卒業を楽にさせたくないとか、どれ位変えないと許さないとかそういうことでは無いんですよね。

なので、私としてはご自身と提出先が許せばそれでいいのですが、
やはり似たような卒業制作が提出されるのは避けて欲しいと思いますし、
ただ似たような提出物を出すだけではその人自身面白くないと思います。

もし厳密に私が許可を出すために判断するには、細かい仕様を教えてもらい、テストプレイ後に許可を出す形になってしまいますが、
それでは困りますし、現実的ではないですよね。
なのでそんなことをしてもらうつもりはありません。
規約が存在するといっても、

「いいですか?」>「いいですよ」

というようなやり取りしか出来ず、実際規約は無いに等しいものになっています。
こちらとしてはどうしようもないのです。

ですから、素材さえ差し替えてもらえれば後の判断はシュウさんにお任せします。
ただ是非ゲーム制作の楽しさを味わってもらえたら嬉しいので、
何か解らないことがあれば気軽にお聞きになり、満足のいくゲームを作って下さい。

頑張って下さいね。


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

Name: シュウ  ..かけだし(1,061ポイント)   Date: 2009/06/06(土) 09:23   No:34579 解決!     
Title: Re:高3の卒業課題として    
nonさん、管理人さん、回答ありがとうございます。

基本システム(パワー・グレイズ・スペカ等)、背景、曲、自機、雑魚キャラといった部分をそのままに、
それ以外の部分を極力オリジナルに変更して製作しようと考えています。
(自機と雑魚キャラは配色を変更しようと考えています)

ある程度形になったら是非ともテストしていただきたいので、その折にはまた宜しくお願いします。
どうもありがとうございました。


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



Name: すかーれっど  ..ぴよぴよ(13ポイント)   Date: 2009/06/05(金) 23:22   No:34553       
Title: 初心者ですが・・・    
プログラムについてどの位の知識が必要ですか?
自分プログラムについて全くといっていいほど知らないのですが・・・・


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


Name: チルチル  ..上級者(21,992ポイント)   Date: 2009/06/05(金) 23:44   No:34557     
Title: Re:初心者ですが・・・    
まあ構造体が使える程度の知識があれば問題無いと思いますけど

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

Name: たかぎ [URL]  ..ハッカー(103,596ポイント)   Date: 2009/06/05(金) 23:45   No:34558     
Title: Re:初心者ですが・・・    
> プログラムについてどの位の知識が必要ですか?

プログラミングをしないのであれば、全く知識は必要ではありません。


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

Name: すかーれっど  ..ぴよぴよ(21ポイント)   Date: 2009/06/06(土) 00:00   No:34561     
Title: Re:初心者ですが・・・    
ありがとうございます

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

Name: sizuma  ..ぴよぴよ(572ポイント)   Date: 2009/06/06(土) 00:16   No:34567     
Title: Re:初心者ですが・・・    
(このHPで解説されているゲームが作れるようになるには)プログラミングについてどの位の知識が必要ですか?
ですかね??
括弧部分がなかったらたかぎさんが模範解答なんでしょうけどね。


ゲームが作りたいんだったら市販されてるXNAのテキスト買えば、異常に簡単なゲーム作りが楽しめ(?)ますよ。
僕はIT系専門学校に行ってるんですが、知識ばっかり詰め込まれても、やっぱりコードを自分で書いてみるのが一番上達するんじゃないかなぁと思います。
何か作りながらわからないことを調べていけばいいんじゃないですか?
丁度いいサイトがここにあるわけですし、とりあえず解説どうりにやってみたらいいと思いますけど




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

Name: すかーれっど  ..ぴよぴよ(44ポイント)   Date: 2009/06/06(土) 00:20   No:34569     
Title: Re:初心者ですが・・・    
皆さんありがとうございます
少し勉強してきます


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

Name: すかーれっど  ..ぴよぴよ(33ポイント)   Date: 2009/06/06(土) 00:20   No:34570 解決!     
Title: Re:初心者ですが・・・    
甘く見ていましたw

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

Name: Dixq (管理人) [URL]  ..ウィザード(1,026,645ポイント)   Date: 2009/06/06(土) 00:31   No:34573     
Title: Re:初心者ですが・・・    
まぁまぁ・・
ゲームの館とか龍神録の館とかいたるところに掲示板へのリンクが貼ってあるので、
読んでてわからないことがあったり、疑問があったら、
そのままの勢いで書き込まれることがあると思いますし、
そのことを考えるとsizumaさんの補足が適切ではないでしょうか。

学校での授業などで疑問に思われたり就職試験を前にしてどれ位知識が必要か疑問に思われたのかもしれませんし、それははっきりとはわかりませんけど。

すれーかっどさん、
もう少し状況を詳しく教えていただければ適切な回答が集まると思いますよ。
今何でお悩みでしょうか?



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



Name: はなたれパンダ  ..ぴよぴよ(211ポイント)   Date: 2009/06/05(金) 16:56   No:34534       
Title: 実行すると・・・。    
[1] 質問文
 [1.1] 自分が今行いたい事は何か
    ソースを実行したい

 [1.2] どのように取り組んだか(プログラムコードがある場合記載)

 [1.3] どのようなエラーやトラブルで困っているか(エラーメッセージが解る場合は記載)
  
   警告 W8004 game.cpp 85: 'keikenchi' に代入した値は使われていない(関数 bamen1() )

 [1.4] 今何がわからないのか、知りたいのか
    
  コンパイルして実行するとオープニングメッセージが出て、エンターキーを押すまでは出来るんですが、
  それ以上進まないのですが、警告表示がひとつ出ているのが影響いてるんでしょうか。
  

[2] 環境  
 [2.1] OS : Windows
 [2.2] コンパイラ名 : Borand C++

[3] その他
 
 今回が初めてのソースづくりです。(っていっても本を見てうっただけ・・・。)


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



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


Name: non  ..熟練のプログラマー(46,419ポイント)   Date: 2009/06/05(金) 17:21   No:34535     
Title: Re:実行すると・・・。    
ゲームのルールがわからないので、何が正しいのかは不明ですが、プログラムが先に進まないのは
int ransuu(int i) 関数内の
while((kekka =(double)rand()/RAND_MAX*i) <=i);
に間違いがあります。これでは、このwhileから抜けません。
while((kekka =(double)rand()/RAND_MAX*i) >i);
に、すればとりあえず動くと思います。

警告は
1つめ
int main(void);
int bamen0(void);
int bamen1(void); のように、voidを書きます。
2つめ
main関数の最後に
return 0;
と書きます。
3つめ
int bamen1(void)関数内の
int keikenchi=0 ; は int keikenchi=0; で初期値がいりません。


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

Name: non  ..熟練のプログラマー(46,469ポイント)   Date: 2009/06/05(金) 17:45   No:34536     
Title: Re:実行すると・・・。    
打ち間違えた。
>int keikenchi=0 ; は int keikenchi=0; で初期値がいりません。
int keikenchi=0 ; は int keikenchi; で初期値がいりません。


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

Name: はなたれパンダ  ..ぴよぴよ(235ポイント)   Date: 2009/06/05(金) 17:46   No:34537 解決!     
Title: Re:実行すると・・・。    
ありがとうございます。大変助かりました。
とりあえず実行できました。


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

Name: はなたれパンダ  ..ぴよぴよ(287ポイント)   Date: 2009/06/05(金) 18:01   No:34538     
Title: Re:実行すると・・・。    
とりあえず実行は出来たんですが、
1問目を解くと”おめでとう、何もしないで経験値・・・。”が何回か表示されて
次の問題にいくんですがこれはどうしてですか?



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

Name: GPGA  ..熟練のプログラマー(61,756ポイント)   Date: 2009/06/05(金) 18:27   No:34539     
Title: Re:実行すると・・・。    
>次の問題にいくんですがこれはどうしてですか?
そのようにプログラムが組まれているからです。
そもそも、どういう動作をすることを希望しているのですか?


プログラムに対しての突っ込み

ランダムの計算式がおかしい
i未満の値を出力するのであれば

int ransuu(int i)
{
int kekka ;
kekka = (int)(rand() / (RAND_MAX + 1.0) * i);
return kekka;
}

となる。
+1.0を入れないと(1 / RAND_MAX)の確率でiの値が出てしまう
 


警告にcppファイルあることからこれをC++でコンパイルしているとして
nonさんに突っ込み。


>voidを書きます。
C++では引数を記述しない場合、void型とみなされるので
引数がvoidのときは、何も記述しないのが一般的です。

Cではプロトタイプ宣言時に引数を記述しない場合、引数を省略したとみなされるので
引数がvoidのときは、voidを入れるのが一般的です。


>main関数の最後に
>return 0;
main関数のreturnを省略した場合 return 0が暗黙のうちに実行されることが規格で
決まっているため、必ずreturn 0を入れなければいけないというわけではありません。


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

Name: 初級者  ..初心者(6,122ポイント)   Date: 2009/06/05(金) 18:52   No:34540     
Title: Re:実行すると・・・。    
プログラムは思ったとおりには動きません。
書いたとおりに動きます。


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

Name: non  ..熟練のプログラマー(46,537ポイント)   Date: 2009/06/05(金) 19:40   No:34541     
Title: Re:実行すると・・・。    
>警告にcppファイルあることからこれをC++でコンパイルしているとして
>nonさんに突っ込み。

確かに。でも、プログラムの先頭にプログラム名として game.cって書いてあったよ。




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

Name: はなたれ  ..ぴよぴよ(62ポイント)   Date: 2009/06/05(金) 20:11   No:34542     
Title: Re:実行すると・・・。    
わかりました。
このソースにいったん画面をクリアのするという部分がなかったんですね。
(^-^)/ドモすみませんでした。
また何かあったらよろしくお願いします。


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

Name: GPGA  ..熟練のプログラマー(61,988ポイント)   Date: 2009/06/06(土) 00:20   No:34568     
Title: Re:実行すると・・・。    
>確かに。でも、プログラムの先頭にプログラム名として game.cって書いてあったよ。
つまり、環境が書かれているにもかかわらず、プログラムソースのコメントのほうを優先するというわけですね。
個人的にいかがなことかと思いますが・・・。


さて、Cであったとして
1番に関しては、引数にvoidを入れるべきですが
2番に関しては、C99ではmainがint型を返し、かつreturn文が省略された場合
終了時に0を返す仕様となっているため、returnを省略することが可能です。


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



Name: 御津凪 [URL]  ..比類無きプログラマー(90,175ポイント)   Date: 2009/05/30(土) 06:17   No:34193       
Title: 弾幕避けゲームを作ってみました。    
こちらのサンプルプログラミングの館にて紹介させていただいているゲームをパワーアップさせました。

本当は自作のライブラリのサンプル兼実用チェックとして製作したものですが、
サンプルとは言いがたいほどに規模が大きくなってしまいました…。

これはひとまず遊べる形ということで、各環境でのテストプレイもかねて
遊んでいただけたらなと思います。(ゲームソースも公開してます)

まだスコアの記録等、いくつか未実装の部分がありますが、そこはきちんと完成させていくつもりです。
(このゲームは C++ + DirectX を使用して書かれています。)

ダウンロードページはこちらから。
(ページ一番下の BGSTG090.exe です)

なお、起動前にフルスクリーンモードの選択は出来ますが、
起動中はフルスクリーンの切り替えが出来ませんので、注意してください。
(無理やりやるとゲームが出来なくなるので注意)

以上、感想や報告などをお待ちしております。


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


Name: Tatu  ..ぴよぴよ(24ポイント)   Date: 2009/05/30(土) 09:33   No:34194     
Title: Re:弾幕避けゲームを作ってみました。    
このゲームで遊んでいたところ、リトライを何回もしたあとに画像のように
敵の弾、レーザーが出なくなりました。さらにリトライをくりかえしたとこ
ろ、敵が一切出なくなりました。そのあとは、リトライをしても、リタイア
しても、タイトルに戻っても敵は出ませんでした。もう一度ゲームを起動す
れば、また通常通りになりました。
つかっているOSはwindows vistaです。


Name: 御津凪 [URL]  ..比類無きプログラマー(90,305ポイント)   Date: 2009/05/30(土) 10:25   No:34195     
Title: Re:弾幕避けゲームを作ってみました。    
> Tatu さん

バグの報告、ありがとうございます。
こちらでも確認しようとしていますが、今現在確認が取れていません。

原因が分かり次第修正をしますので、お手数ですが、
それまでの間は再起動で対処をお願いします。

もし、そちらで再度確認できましたらその詳細内容(繰り返し回数等)を
出来るだけお教えください。
原因の究明に役立ちますので。
(恐らく)


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

Name: Tatu  ..ぴよぴよ(253ポイント)   Date: 2009/05/30(土) 11:57   No:34196     
Title: Re:弾幕避けゲームを作ってみました。    
弾と敵の消失について調べてみました。

弾(レーザー含む)の消失について
最初の赤玉が弾を出し切ったときにリトライするようにしたとき
OVERでは6回、HARDでは8回、BESTでは12回で弾がでなくなった。
また、OVERで青玉が弾を7*4*3=84個出しているときにリトライするようにしたとき
24回目で弾が減り、25回目で0になった。(弾の最大数は2048個?)
一方、弾が出ていないときに何回リトライしても弾の数は減らなかった。
リトライするときに表示されていた弾の数だけ発射できる
弾の最大数が減っているようである。

敵の消失について
最初の赤玉が10個でたところでリトライするようにしたとき
13回で出なくなった。(敵の最大数を128体としているのだろうか?)
敵が出ていないときに何回リトライしても敵の数は減らなかった。

またリトライしたとき、最後の敵が画面から消えた時に
クリアとならないことがあった。


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

Name: pooka [URL]  ..入門者(3,984ポイント)   Date: 2009/05/30(土) 12:27   No:34199     
Title: Re:弾幕避けゲームを作ってみました。    
遊んでみました。
まだSafe Levelしか遊んでませんがバグかなと思うことがあったのでご報告を。
最後の敵のときにボムを1回使用するとクリアとなりませんでした。
2回以上だとクリアとなり、またそれ以前にボムを1回使用していてもクリアとなりました。
あとゲーム開始時はPowerは5ですがリトライをすると3になっていました。
私が確認したのはこれぐらいですね。
まだ他のレベルをやっていないので今から遊んでみます(^o^)

追記:
クリアとならなかったのはリトライしてからで、ボムを使用していなくてもなりました。


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

Name: kazuoni [URL]  ..比類無きプログラマー(88,638ポイント)   Date: 2009/05/30(土) 13:00   No:34203     
Title: Re:弾幕避けゲームを作ってみました。    
・・・完成度高くないですか?(笑)

弾幕ゲーム苦手な自分でもステップアップ的にできるので、
サクサク遊べました^^
まだやりこんでないので、バグは発見できてませんが・・・

ちょっと解析試みようとしましたが・・・
ちょっと規模が大きいですねw
時間ができたら、のんびり拝見させていただきます^^
更なる機能の追加、またはステージ性に大いに期待します!

制作お疲れ様でした!


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

Name: ひよこ  ..プログラマー(33,423ポイント)   Date: 2009/05/30(土) 14:28   No:34207     
Title: Re:弾幕避けゲームを作ってみました。    
弾幕STGが大好きで作って参考にと思ったら、BESTモードでボスにやられてしまいました。
難しいですね・・・・
自分はまだ一回しかやってはいないのですがバグはなかったと思います。


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

Name: Dixq (管理人) [URL]  ..ウィザード(1,025,595ポイント)   Date: 2009/05/30(土) 16:52   No:34216     
Title: Re:弾幕避けゲームを作ってみました。    
おぉ、これはすごい!
「自分で全部作った感」がより一層すごさをUPさせてますね!
素材も全て手づくりで、すごいな〜と思いました。
キャラの動きもすごく滑らかですね^^

まだ一度しかプレイ出来ていないので、これからやらせていただこうと思います。
リンクは新しいものに張り替えておきますね。

今後にますます期待します^^


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

Name: 御津凪 [URL]  ..比類無きプログラマー(91,030ポイント)   Date: 2009/05/30(土) 19:43   No:34235     
Title: Re:弾幕避けゲームを作ってみました。    
> Tatu さん

発生の詳細を教えていただきありがとうございます。
確認したところ、弾などを管理しているリストのリセット部分で、
使用中カウンタが初期化されていませんでした。
結果、報告どおりの現象が出ていたようですね。

クリアにならない原因もそれに起因していました。
(全ての敵・弾の使用個数が0になったらクリアとなる条件のため)

おかげで早急に修正することが出来ました。ありがとうございます。
(ダウンロードページを更新しました)


> pooka さん
> あとゲーム開始時はPowerは5ですがリトライをすると3になっていました。

初期化時とリセット(リトライ)時が個別に固定値を指定していたのが原因ですね。
本当は渡された情報でリセットすればよかったのですが、今は応急処理ということで
リトライでも5になるように修正しました。

> kazuoni さん
> 完成度高くないですか?(笑)

作りこみすぎました。サンプルなのに…(笑)

> 弾幕ゲーム苦手な自分でもステップアップ的にできるので、
> サクサク遊べました^^

ありがとうございます。励みになりますm(__)m

> まだやりこんでないので、バグは発見できてませんが・・・

見つけたらどしどし報告してください。
サンプルにバグがあっては価値が半減しますし。

> ちょっと解析試みようとしましたが・・・
> ちょっと規模が大きいですねw

さっき総実行行数を調べたら1万行近くありました。
龍神録プログラミングの館のソースコード(60章)の約3倍という結果に・・・。

あと、書き忘れていましたが、このコードのフルビルドには Ruby (データコンバートに使用)と、
ライブラリが必要です。

> 更なる機能の追加、またはステージ性に大いに期待します!

実は本体をいじらずステージ部分だけ自作・追加できるようになっているので、
やろうと思えば自作出来ますよ。

このゲームは一通りの機能を実装し終えたらそこで一区切りしようと思っています。
次の製作に向けるので。


> ひよこ さん
> 難しいですね・・・・

確かに難しいです。
どれも即席弾幕モノなので、細かな難易度調整はしていませんし、
自分自身 OVER をクリアできてませんw

ただ、ランダム要素は全くないのでパターン避けが可能です。

遊べるのは1ステージだけですし、1つしかないので今はこの程度で良いだろうと思いました。


> 管理人さん
> おぉ、これはすごい!
> 「自分で全部作った感」がより一層すごさをUPさせてますね!
> 素材も全て手づくりで、すごいな〜と思いました。

ありがとうございます。
サンプルという位置づけの元、手作りでないと自由が利かないだろうなと思って製作してきましたが、
規模はすでにサンプルを超えていますね^^;
ただ、ソース・データ一式公開しているので、サンプルとしての役割は果たしていると思います。

恐らく、ゲームとしてのサンプルのほかにも、さまざまな技術が入っているので、
もしかしたらそれらの実装の参考にもなるかもしれません。

> キャラの動きもすごく滑らかですね^^

これは本家を模写しただけで、比べると劣化してますけどね。
でもアニメーションするときれいに見えるから不思議。


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

Name: チルチル  ..上級者(17,891ポイント)   Date: 2009/05/30(土) 21:45   No:34253     
Title: Re:弾幕避けゲームを作ってみました。    
う〜ん恐ろしいほどゲームに説得力がありますね・・
私も早くこのレベルの物が作りたいです

ところで御津凪さんのゲームではレーザーをどのように表示しているんですか?
私は画像をDrawModiGraphF関数で変形させて表示していますが
かなりギザギザしたものになってしまいます・・

一応バイリニア法は使っているのですが、他にギザギザを防ぐ方法はないでしょうか?


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

Name: Tatu  ..ぴよぴよ(218ポイント)   Date: 2009/05/30(土) 21:49   No:34254     
Title: Re:弾幕避けゲームを作ってみました。    
リトライ時のバグが修正されていることを確認しました。

そして、全難易度でのノーミスクリアを達成しました。


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

Name: Dixq (管理人) [URL]  ..ウィザード(1,025,522ポイント)   Date: 2009/05/30(土) 21:56   No:34255     
Title: Re:弾幕避けゲームを作ってみました。    
うは・・・Taruさんうますぎ^^;

私が下手すぎるのかな・・
私は自分で龍神録作っておきながら龍神録ノーミスクリアできません・・(笑


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

Name: 御津凪 [URL]  ..比類無きプログラマー(91,305ポイント)   Date: 2009/05/30(土) 22:14   No:34257     
Title: Re:弾幕避けゲームを作ってみました。    
> チルチルさん
> 私は画像をDrawModiGraphF関数で変形させて表示していますが
> かなりギザギザしたものになってしまいます・・

私の方は DirectX3D を直接使用して構成していますので、
見た目全て2D表示でも、内部的には全てポリゴン描画しています。
DXライブラリでも、D3Dを使用するように行えば、ギザギザは抑えられるかと思いますよ。
(実際使用したことがないので出来るかどうかわかりませんが)

> Tatu さん

修正の確認報告ありがとうございます。
また、ノーミスクリア達成おめでとうございます!

次期バージョンアップにはランク255のステージとか用意してみようかな。


> 管理人さん

大丈夫ですよ。
ゲームプログラマには自分で作っておいて(苦手分野とかで)自分がクリアできないなんてことは
よくあることですから。

そのためのデバッガさん達やテストプレイヤーさん達がいますし。


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

Name: チルチル  ..上級者(17,967ポイント)   Date: 2009/05/30(土) 22:38   No:34262     
Title: Re:弾幕避けゲームを作ってみました。    
あ〜なるほどポリゴンですか
ちなみにD3Dって何ですか?


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

Name: 御津凪 [URL]  ..比類無きプログラマー(91,316ポイント)   Date: 2009/05/30(土) 22:43   No:34263     
Title: Re:弾幕避けゲームを作ってみました。    
D3D は Direct3D の略です。

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

Name: junta  ..ぴよぴよ(709ポイント)   Date: 2009/05/30(土) 23:45   No:34266     
Title: Re:弾幕避けゲームを作ってみました。    
完成度が凄いですね!
このゲームを作れるように目標にしたいと思います!

win2000で、リトライしてたらレーザーが出なくなりました。
windows7にて動作確認


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

Name: BEMANI  ..プログラマー(32,372ポイント)   Date: 2009/05/31(日) 02:18   No:34276     
Title: Re:弾幕避けゲームを作ってみました。    
>>御津凪さん
お久しぶりでございます。
プレイさせて頂きましたが、一番最初のレベルでも難しいと感じてしまいました。(クリアできなかったです;)
難しいですね; 最近のSTGをやる方は結構レベル高い気がします。
(単に下手くそなだけなんですが・・・)

ゲームの方ですが、フルスクリーン後、
Alt+Tabキーで違う画面に変えたあと、もう一度アプリに戻ると正常に描画されておりませんでした。
一応報告しておきます。


御質問宜しいでしょうか?
描画をかける時に使っている関数で、DrawPrimitiveUP ・ DrawIndexedPrimitive ・ DrawIndexedPrimitiveUP
がありましたが、なぜ使い分けているのでしょうか・・・

もうひとつ、テクスチャが256*256等のサイズになっていますが
やはり2のn乗サイズのテクスチャを使うと実行速度に差が出てきたりするのでしょうか。



自分で全てを作れるといいですね〜。
音楽作れる時間があれば音楽も作りたいっす。
こちらも創作意欲が沸いてきたので今のうちに少しでも進めていきます。
ソースコードも超参考になりそうだったので、ゆっくりと拝見させて頂きますね〜。
制作お疲れ様でした〜。


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

Name: 御津凪 [URL]  ..比類無きプログラマー(91,677ポイント)   Date: 2009/05/31(日) 02:58   No:34278     
Title: Re:弾幕避けゲームを作ってみました。    
> BEMANI さん

お久しぶりです。

> Alt+Tabキーで違う画面に変えたあと、もう一度アプリに戻ると正常に描画されておりませんでした。

スクリーン切り替え時のデバイスリセットをすっぽかしたままなので、そうなります。
ライブラリ側からフルスクリーンの切り替えなどのそういった対応をしていなかったので、
次のバージョンには実装する必要がありますね。

> 描画をかける時に使っている関数で、DrawPrimitiveUP ・ DrawIndexedPrimitive ・ DrawIndexedPrimitiveUP
> がありましたが、なぜ使い分けているのでしょうか・・・

DrawIndexedPrimitive は実際には使ってないです。(一応用意しただけ)

このゲームでは、描画するものを一つのオブジェクト(あるいは塊)として、
単体で管理、表示するもの(背景など)は DrawPrimitiveUP を使い、
同じテクスチャ内で多くの描画物を管理、表示するものは DrawIndexedPrimitiveUP を使う、
として、描画を切り分けています。

特に敵や弾などの表示は DrawIndexedPrimitiveUP を一度呼び出すだけで済むようになっています。

> もうひとつ、テクスチャが256*256等のサイズになっていますが
> やはり2のn乗サイズのテクスチャを使うと実行速度に差が出てきたりするのでしょうか。

グラフィックデバイスは、基本 2 の n 乗サイズ、特に 256 * 256 が最も高速に処理されるそうです。
(DirectX のリファレンスに書かれています)
なので、出来るだけ 256 * 256 及び 2 の n 乗のサイズにしています。

ただ、そうしないと著しく速度が低下するというわけではないはずです。

> ソースコードも超参考になりそうだったので、ゆっくりと拝見させて頂きますね〜。

はい。どうぞゆっくりみていってください。


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

Name: BEMANI  ..プログラマー(32,545ポイント)   Date: 2009/05/31(日) 03:42   No:34280     
Title: Re:弾幕避けゲームを作ってみました。    
>>御津凪さん
>このゲームでは、描画するものを一つのオブジェクト(あるいは塊)として、
>単体で管理、表示するもの(背景など)は DrawPrimitiveUP を使い、
>同じテクスチャ内で多くの描画物を管理、表示するものは DrawIndexedPrimitiveUP を使う、
>として、描画を切り分けています。

現在、出来る限り実行速度を上げ、綺麗に描画させることを目標に取り組んでいますが、
そのように組むにはどうすればいいかわからず、
とりあえずDrawPrimitiveUPで一つのオブジェクトに対して一回呼び出す方式にしています。
・・・があまりいい方法ではないようですね;

現在、自分のゲーム?色々な方のPCで動作チェックしているのですが
描画方法が悪いのか、そもそもコード自体に無駄があるのか解らない状態で処理落ちがかかるPCをいくつか発見しました。
性能の低いマシン・高いマシンで比べ、何故か性能の高いマシンの方が遅かったり
PCの性能を見ている感じCPUのコア数や、メモリの容量等も特に関係ない感じで、残るはグラボの性能が違うという所でしょうか・・・

御津凪さんが描画方法を分けていたので何かあるのかな〜と疑問を感じ質問した次第であります。
一つ描画方法と言う事で、出来る限り処理落ちしないように組み直す必要が出てきました。


>グラフィックデバイスは、基本 2 の n 乗サイズ、特に 256 * 256 が最も高速に処理されるそうです。
>(DirectX のリファレンスに書かれています)
それは初耳でした。
現在ほとんど2のn乗から逸れたサイズのテクスチャを使っていますが、それも処理落ちの原因になっているかもしれないです。
なぜか、GeForceのグラボを積んでるPCは処理落ちがほとんど確認されませんでした。
DirectXかなり難しいですね;


貴重な情報、御回答有難う御座います。
次の制作も期待しております^^


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

Name: チルチル  ..上級者(18,399ポイント)   Date: 2009/05/31(日) 13:11   No:34286     
Title: Re:弾幕避けゲームを作ってみました。    
なるほどDirect3Dですか

ところで使われている素材を見させていただきましたが
みんな白黒のようですね
ゲーム内ではちゃんとカラーになっていますが
これはどうやっているんでしょうか?

普通にブレンドしただけでは白い部分も色が付いてしまうんですよね・・


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

Name: nayo  ..中級者(11,364ポイント)   Date: 2009/05/31(日) 15:15   No:34291     
Title: Re:弾幕避けゲームを作ってみました。    
>>チルチルさん

勝手な予測ですけどDirectXのSpriteを使われてるのではないですかね
α値、r値、g値、b値の設定ができるほか、描画深度も設定できるので便利です


プレイしてみましたが、スムーズな動きに感動しました
ステージのデータは.dllファイルで行っているのでしょうか
私はそういったファイルの扱い方を知らないので遠慮していたんですけど便利そうですね


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

Name: チルチル  ..上級者(18,456ポイント)   Date: 2009/05/31(日) 15:27   No:34294     
Title: Re:弾幕避けゲームを作ってみました。    
それは便利そうですね
ところでSpriteとは何でしょうか?
関数ですか?


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

Name: 御津凪 [URL]  ..比類無きプログラマー(91,957ポイント)   Date: 2009/05/31(日) 15:44   No:34297     
Title: Re:弾幕避けゲームを作ってみました。    
> nayo さん
> 勝手な予測ですけどDirectXのSpriteを使われてるのではないですかね

残念ながら DirectX の Sprite は使ってません。
アレを沢山使用すると遅くなるので、
すべてグラフィックデバイスの Draw 系関数で行っています。

> ステージのデータは.dllファイルで行っているのでしょうか

その通りです。
現在はステージ・敵・弾・レーザーの各動きしか DLL に用意されていませんが、
効果音や曲なども外部から読み込めるようにする予定です。


> チルチル さん
> ところでSpriteとは何でしょうか?
> 関数ですか?

ID3DXSprite という補助(インターフェイス)クラスです。
描画に関するめんどくさい処理を DirectX に任せてもらえる便利なものですが、
上記の通り、沢山使うと重くなります。

あと、カラーのブレンドですが、簡単に言うと加算ブレンドを使って黒部分に色づけしてます。


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

Name: nayo  ..中級者(11,446ポイント)   Date: 2009/05/31(日) 16:00   No:34298     
Title: Re:弾幕避けゲームを作ってみました。    
なるほどDrawですか
しかし外部から何でも読み込めると便利そうでいいですね
アップデートなども一部だけ更新すれば良かったり

私も時間ができたら挑戦してみたいですね


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

Name: チルチル  ..上級者(18,701ポイント)   Date: 2009/05/31(日) 17:15   No:34302     
Title: Re:弾幕避けゲームを作ってみました。    
あ〜なるほど加算ブレンドですか
その手があったのを忘れてました


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

Name: チルチル  ..上級者(19,686ポイント)   Date: 2009/06/01(月) 21:36   No:34359     
Title: Re:弾幕避けゲームを作ってみました。    
と思ったのですがうまくいきません・・
具体的にはどのような手順で色を付けているんでしょうか?


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

Name: 御津凪 [URL]  ..比類無きプログラマー(92,383ポイント)   Date: 2009/06/01(月) 23:46   No:34376     
Title: Re:弾幕避けゲームを作ってみました。    
DXライブラリでは 2Dは DirectDraw を使用して描画しているようなので、
DXライブラリを使ったことがないのでやれるかどうかわかりませんが、色づけは、

1.テクスチャ(元絵)に指定の色(を塗りつぶした同サイズの画像)を加算合成して黒色に色を付ける。
 ただし、元絵のα値を考慮しない(処理させないようにしない)と、透明だったところも色が付いてしまいます。
2.色の付けたテクスチャ(加工絵)を使用して描画する。

という形で出来るかと思います。
(1.の元絵のα値を考慮しない処理が出来るかどうかが問題)

このゲームは Direct3D の機能を利用して合成を行っていて、処理としては以下のようになっています。
(GObjectMgr.cpp から抜粋)
dev->SetRenderState( D3DRS_SRCBLEND, D3DBLEND_SRCALPHA );         // 描画元のブレンド係数 : (As, As, As, As)

dev->SetRenderState( D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA ); // 描画先のブレンド係数 : (1 - As, 1 - As, 1 - As, 1 - As)
dev->SetTextureStageState( 0, D3DTSS_COLOROP, D3DTOP_ADDSIGNED ); // テクスチャの色の計算方法 : (Arg1 + Arg2 - 0.5)

(コメントにある括弧内の式はリファレンスから引用)
簡単に説明すると、3行目が 1. に当り、
1、2行目が 2. に当ります。


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

Name: チルチル  ..上級者(20,314ポイント)   Date: 2009/06/03(水) 00:44   No:34433     
Title: Re:弾幕避けゲームを作ってみました。    
>>(1.の元絵のα値を考慮しない処理が出来るかどうかが問題)

確かにこれが問題みたいですね・・
そもそもテクスチャ自体の背景も透過しないといけないし・・
なのでとりあえず同じ画像を2回描画して加算ブレンドしてみましたが
白っぽくなってしまって濃い色になりませんね・・
元絵の暗さが足りないって事じゃないですね・・


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

Name: 御津凪 [URL]  ..比類無きプログラマー(92,809ポイント)   Date: 2009/06/03(水) 16:11   No:34456     
Title: Re:弾幕避けゲームを作ってみました。    
DirectX では、色のブレンド処理の時、
0.0 〜 1.0 の正規化されたベクトル値で計算します。

加算合成の場合、同じ画像を重ねて加算合成した時、
黒の箇所の合成は
0.0 + 0.0 = 0.0
で、変化なしですが、
少しでも色がつくと(0.2の場合)、
0.2 + 0.2 = 0.4
となり、合成結果は元の2倍の明るさになります。
(グレー(0.5)だと白(1.0)になる)

描画時に透明度を設定できれば、この加算量はある程度調整できます。


ともかく、DirectDraw を使っている DXライブラリでは、
Direct3D での処理を移植するのは難しいかもしれませんね。
もし出来たとしても処理が重そうです。


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

Name: チルチル  ..上級者(20,536ポイント)   Date: 2009/06/03(水) 16:21   No:34460     
Title: Re:弾幕避けゲームを作ってみました。    
なるほど黒に黒を重ねるから色が付きにくいんですね
って事は同じ画像じゃなくて明るさを反転させたものや明るさを増したものを重ねれば
色が付きやすくなるかもしれませんね


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

Name: Tatu  ..ぴよぴよ(280ポイント)   Date: 2009/06/05(金) 20:53   No:34547     
Title: スコア更新    
使用ボムを減らせないかどうかやっているうちに、
ボムを撃っている時にも弾にかすれることを発見し、
スコアを大幅に更新することができました。


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



Name: チルチル  ..上級者(17,207ポイント)   Date: 2009/05/30(土) 20:11   No:34239       
Title: 引数が配列の場合の処理    
void data(int data[2]){



}

のような関数に引数を渡したいんですが

色々試した結果

int a[2]={1,2};

data(a);

もしくは

data(0);

という方法でしかコンパイルを通りませんでした

0の場合は数値が必要ない場合だから問題ないんですが

数値が必要な場合は2行にすると見栄えが悪いので

関数の()の中で値を渡す方法はないでしょうか?


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


Name: box  ..ハッカー(140,620ポイント)   Date: 2009/05/30(土) 20:28   No:34241     
Title: Re:引数が配列の場合の処理    
> void data(int data[2]){
> のような関数に引数を渡したいんですが

data[]という配列全体を渡したい(はずな)のに、

> data(0);

こんな風に即値だけを渡すのは、したいこととしていることとがマッチしていない、
ということですね。
渡した値ゼロをNULLポインタとみなし、コンパイルは通るかもしれませんが、
実行時にどうなるかは…。

> data(a);
> 関数の()の中で値を渡す方法はないでしょうか?

この方法は、「配列の先頭要素のアドレス」という「値」を
渡している、正しい方法です。
配列の要素数も渡す方がよいとは思いますけれど…。


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

Name: たかぎ [URL]  ..ハッカー(102,963ポイント)   Date: 2009/05/30(土) 20:32   No:34244     
Title: Re:引数が配列の場合の処理    
次のようにします。

data((int[2]){ 1, 2 });

ただし、最新の規格に対応していないコンパイラでは、この方法は使えない可能性があります。


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

Name: チルチル  ..上級者(17,616ポイント)   Date: 2009/05/30(土) 21:02   No:34249     
Title: Re:引数が配列の場合の処理    
残念、使えませんでした・・

ちなみにdata関数は例えばの場合で

実際は弾を登録する関数の沢山ある引数の最後に加える予定の引数です

弾の構造体の使わない時が多い配列に代入する値を渡します

なので使わない時は0でOKです

まあ配列だから全部0になるんじゃないかな〜

と思ったらフリーズしました・・

使わなければ問題無いとは思いますが・・


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

Name: box  ..ハッカー(140,711ポイント)   Date: 2009/05/31(日) 05:40   No:34281     
Title: Re:引数が配列の場合の処理    
> と思ったらフリーズしました・・

何をしたときにフリーズしましたか?
実行時ですか?

ある関数の引数を配列として、その関数を呼び出しただけで
フリーズするとはちょっと考えにくいです。

もしかすると別の所に原因があるかもしれません。
そこで、関係しそうな箇所のソースを公開するお気持ちはありますか?


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

Name: チルチル  ..上級者(18,323ポイント)   Date: 2009/05/31(日) 12:42   No:34285     
Title: Re:引数が配列の場合の処理    
あ〜すいません説明不足でした

#include "DxLib.h"

int a;

void data(int data[2]){

a=data[0];

}

int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){
ChangeWindowMode(TRUE);SetOutApplicationLogValidFlag( FALSE );
if(DxLib_Init() == -1 || SetDrawScreen( DX_SCREEN_BACK )!=0) return -1;//初期化と裏画面化

data(0);

DxLib_End();
return 0;

}


引数になっている変数を呼び出すだけなら動くんですが
その変数で代入とか比較とかをやるとフリーズするようですね

これだと条件分岐ができませんからやっぱり無理ですね・・
引数の初期化とかも無理でしたし・・

でも引数がNULLにできる関数は沢山ありますよね
一体どうなっているんでしょうか・・


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

Name: TKOZ  ..上級者(23,737ポイント)   Date: 2009/05/31(日) 13:26   No:34287     
Title: Re:引数が配列の場合の処理    
2次元配列が引数の関数に値を渡す時は、


int Tbl[300][20]={0};

int ArrayProc(Tbl[][20])
{
//処理
return 0;
}

でいけます。


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

Name: MNS  ..初心者(8,540ポイント)   Date: 2009/05/31(日) 13:41   No:34288     
Title: Re:引数が配列の場合の処理    
引数に0を渡したということは、
NULLポインタを渡したこととなりますから、
data[0]が指す先のアドレスはNULLになります。
ですので、data[0]へアクセスしようとすると
フリーズするのは、別におかしくはないはずです。


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

Name: チルチル  ..上級者(18,433ポイント)   Date: 2009/05/31(日) 15:25   No:34293     
Title: Re:引数が配列の場合の処理    
う〜ん、これは困りましたね・・
やはり関数の中だけで処理するのは無理なんでしょうか・・


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

Name: box  ..ハッカー(140,809ポイント)   Date: 2009/05/31(日) 16:45   No:34299     
Title: Re:引数が配列の場合の処理    
今一度、当該の関数に何を渡して、当該の関数の中で何をしたいかを
整理してみたらいかがでしょうか。

単にint型1個だけを渡して処理したいのであれば、
わざわざ配列(へのポインタ)を渡す必要はないです。


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

Name: チルチル  ..上級者(18,787ポイント)   Date: 2009/05/31(日) 17:20   No:34304     
Title: Re:引数が配列の場合の処理    
やりたい事をまとめると

@沢山ある引数の最後の引数に配列を渡す

A構造体の配列に代入

B配列だと後から数を変えやすそう?

C使わない時はできるだけ短くしたい
理想は隠し引数のように何も書かなくて良い


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

Name: kazuoni [URL]  ..比類無きプログラマー(88,468ポイント)   Date: 2009/05/31(日) 18:03   No:34307     
Title: Re:引数が配列の場合の処理    
1〜4のつながりがよく分かりません。。

1.は配列の先頭のポインタとサイズを渡せばこの質問の事は済みます。
 boxさんのおっしゃるとおり、1個の要素なら必要ないですが・・・

2.は構造体の配列に何を代入するのですか?
 1.で渡した配列は構造体の配列で、要素をごっそりすべてコピーするということですか?

3.は確かに、配列ならはa[100]→a[1000]とすれば要素数は変えられます。
 引数にするならば、aをint型の配列とすると、引数に(a,sizeof(a)/sizeof(a[0]))を加えれば、
 要素数を変えても、うまいこと配列にアクセスできます。

4.「何を」使わない時は「何を」できるだけ短くしたいのですか?
 隠し引数=可変個引数ということですか?それとも、省略実引数ですか?


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

Name: チルチル  ..上級者(18,943ポイント)   Date: 2009/05/31(日) 19:08   No:34313     
Title: Re:引数が配列の場合の処理    
すいません@〜Cは特に繋がってるわけではありません・・


@は引数の最後を配列にして複数の数値を渡せるように
あと、ならべく少ない手順で渡したい・・

Aは弾の構造体にも同じ要素数の配列があり、引数の配列の数値を構造体の配列に代入

Bは後で要素数が足らなくなった場合に増やしやすいように・・

C弾の構造体の配列は角度とかを記録しておかないと表現できない弾幕を作る時に使うので普段は使いません
なので使わない時まで引数を渡すと見にくくなるので省略したい・・
隠し引数には詳しくないのでよくわかりませんが
描画系関数の反転フラグみたいな感じでしょうか・・


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

Name: lbfuvab  ..上級者(20,845ポイント)   Date: 2009/05/31(日) 20:43   No:34318     
Title: Re:引数が配列の場合の処理    
デフォルト引数なんかで調べてみてはいかがでしょうか。

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

Name: チルチル  ..上級者(19,624ポイント)   Date: 2009/06/01(月) 19:50   No:34356     
Title: Re:引数が配列の場合の処理    
あ〜なるほど、こんな機能あったんですね
初期値の設定はできそうなんだけどな〜
と思ってましたがプロトタイプ宣言時にするとは思いませんでした
まあ関数の方が上なら必要ないようですが

って事は

void DATA(a,b,c,data[5]=0);


みたいな感じですね
あとは()内で引数を渡す方法ですね


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

Name: チルチル  ..上級者(20,360ポイント)   Date: 2009/06/03(水) 00:40   No:34431     
Title: Re:引数が配列の場合の処理    
>>data((int[2]){ 1, 2 });

これはできませんでしたが
こんな感じの方法は他にないでしょうか?


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

Name: Justy  ..伝説なるハッカー(368,757ポイント)   Date: 2009/06/03(水) 01:37   No:34442     
Title: Re:引数が配列の場合の処理    

>こんな感じの方法は他にないでしょうか

 boostが使えるなら



#include <boost/assign/std/vector.hpp>
#include <boost/assign/list_of.hpp>
#include <vector>

// 対象の配列
int arr[5];

// セット関数
void set_vector_data(const std::vector<int> &v)
{
    const std::size_t arr_size = sizeof(arr)/sizeof(arr[0]);
    const std::size_t v_size = v.size();
    const std::size_t copy_size = arr_size < v_size? arr_size: v_size;
    for(std::size_t n=0; n<copy_size; ++n)
        arr[n] = v[n];
}

{   // 使うとき・・・お好みで (数字)(数字)...と繋げる
    using namespace boost::assign;
    set_vector_data(list_of(1));
    set_vector_data(list_of(1)(2));
    set_vector_data(list_of(1)(2)(3));
    set_vector_data(list_of(1)(2)(3)(4));
}



 使えないなら、オーバーロードしてみるのも一興。


// セット関数
void set_data_(int n, int val0, int val1 = 0, int val2 = 0, int val3 = 0)
{
    if(n >= 1)    arr[0] = val0;
    if(n >= 2)    arr[1] = val1;
    if(n >= 3)    arr[2] = val2;
    if(n >= 4)    arr[3] = val3;
}

void set_data(int val0, int val1, int val2, int val3)
{
    set_data_(4, val0, val1, val2, val3);
}
void set_data(int val0, int val1, int val2)
{
    set_data_(3, val0, val1, val2);
}
void set_data(int val0, int val1)
{
    set_data_(2, val0, val1);
}
void set_data(int val)
{
    set_data_(1, val);
}

{   // 使うとき
    set_data(1);
    set_data(1, 2);
    set_data(1, 2, 3);
}




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

Name: チルチル  ..上級者(20,463ポイント)   Date: 2009/06/03(水) 16:15   No:34459     
Title: Re:引数が配列の場合の処理    
何だかすごそうな処理ですね・・
とりあえずboostとかオーバーロードとかを知らないので無理ですね・・
見た感じ値を代入する処理を先に作っているようですが
これだと一行に収まらないのでちょっとまずいですね・・


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

Name: チルチル  ..上級者(20,623ポイント)   Date: 2009/06/03(水) 22:06   No:34471     
Title: Re:引数が配列の場合の処理    
原点に戻りますが

dat[0]=0,dat[1]=1,dat[2]=2,dat[3]=3,dat[4]=4;

DATA(a,b,c,data);

が一番短そうなんですが
dat配列の宣言と初期化を()の中でできないでしょうか?


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

Name: たいちう  ..プログラマー(30,624ポイント)   Date: 2009/06/04(木) 20:46   No:34509     
Title: Re:引数が配列の場合の処理    
不自然な方法で短くことに何のメリットも感じませんが、
どうしてもというなら可変長引数について調べてみてはどうでしょうか。

http://www.kumei.ne.jp/c_lang/intro/no_43.htm

C++でクラスの設計の勉強をするのが一番のお勧めです。


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

Name: たかぎ [URL]  ..ハッカー(103,528ポイント)   Date: 2009/06/05(金) 10:56   No:34530     
Title: Re:引数が配列の場合の処理    
> 不自然な方法で短く(書く)ことに何のメリットも感じませんが、

賛成です。
どうしてもやりたければ、最善の方法はC99に対応したコンパイラに変えることであり、次善策は、

int a[2]={1,2}; data(a);

と1行で書くことです。



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

Name: チルチル  ..上級者(21,827ポイント)   Date: 2009/06/05(金) 16:38   No:34533     
Title: Re:引数が配列の場合の処理    
C99が何かよくわかりませんが
コンパイラの変更は無理ですね・・

可変長引数は「,」の数が増えるのでダメですね・・

よく考えたら
data((int[2]){ 1, 2 });
だって「,」が増えるから意味無いか・・

ここは配列の要素の数だけ隠し引数を用意しておくのがベストかな・・
要素を全部使わない時まで書かなきゃいけなくなる可能性だってあるし・・
増やすの簡単そうだし・・


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



Name: ゆず  ..ぴよぴよ(80ポイント)   Date: 2009/06/03(水) 01:58   No:34446       
Title: include ファイルを開けません・・・    
「龍神録プログラミングの館」の「まずは実行させてみよう」で
実際に実行させようと思ったのですが、

警告 1個
1>cl : コマンド ライン warning D9035 : オプション 'Wp64' の使用は現在推奨されていません。今後のバージョンからは削除されます。

エラー 17個
fatal error C1083: include ファイルを開けません。'../../../include/DxLib.h': No such file or directory

と出てしまいました・・・;
「C言語〜ゲームプログラミングの館」のサンプルプログラムは実行できていたのですが・・・(全部試してはいませんが);

よろしくお願いします;


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


Name: conio [URL]  ..上級者(16,434ポイント)   Date: 2009/06/03(水) 09:55   No:34451     
Title: Re:include ファイルを開けません・・・    
fatal error C1083: include ファイルを開けません。'../../../include/DxLib.h': No such file or directory


これはパスの指定がおかしいのではないしょうか。
(フォルダの構成が違うとか)
-------------------------------------------------
現在のディレクトリの3つ上のフォルダの、
「include」という名前のフォルダの中にあるDxLib.h
-------------------------------------------------
となっているようですが、そこにDxLib.hがあるのか調べてみてください。


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

Name: ゆず  ..ぴよぴよ(477ポイント)   Date: 2009/06/03(水) 11:14   No:34452     
Title: Re:include ファイルを開けません・・・    
回答ありがとうございます。

ちなみに私はVisualC++ 2008 Express Editionを使ってます。

エラー17個の内容なのですが、以下のようになってます。

1>c:\users\パソコンの名前\desktop\project\1章\mydat\include\gv.h(1) : fatal error C1083: include ファイルを開けません。'../../../include/DxLib.h': No such file or directory

3つ上のフォルダというのが良くわからなかったのですが、上の

1>c:\users\パソコンの名前\desktop\project\1章\mydat\include\gv.h(1)
                          ↑


矢印のincludeのことを指していると思い、そのフォルダの中をチェックしました。

確かに「DxLib.h」ヘッダが存在しなかったので、こちらのサイト様でダウンロードできる「DXライブラリ(DxLib_VC)」の
「プロジェクトに追加すべきファイル_VC用」の「DxLib.h」を矢印のincludeのところへ入れました。

しかし
1>c:\users\パソコンの名前\desktop\project\1章\mydat\include\gv.h(1) : fatal error C1083: include ファイルを開けません。'../../../include/DxLib.h': No such file or directory

と出てしまいました。
たびたび申し訳ございません、よろしくお願いします・・・。


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

Name: ゆず  ..ぴよぴよ(531ポイント)   Date: 2009/06/03(水) 12:00   No:34453     
Title: Re:include ファイルを開けません・・・    
すみません矢印の位置がずれてました。
1>c:\users\パソコンの名前\desktop\project\1章\mydat\include\gv.h(1)
                                     ↑


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

Name: pooka [URL]  ..入門者(4,477ポイント)   Date: 2009/06/03(水) 12:10   No:34454     
Title: Re:include ファイルを開けません・・・    
3つ上なのでprojectというフォルダですね。
projectというフォルダにincludeというフォルダはありますか?
なければincludeというフォルダを作成して、
その中に「プロジェクトに追加すべきファイル_VC用」の中身を全部入れてみてください。


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

Name: ゆず  ..ぴよぴよ(537ポイント)   Date: 2009/06/05(金) 12:27   No:34531     
Title: Re:include ファイルを開けません・・・    
返答が遅れて申し訳ありません。

無事実行することが出来ました。
本当に助かりました。
ありがとうございました。


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

Name: ゆず  ..ぴよぴよ(551ポイント)   Date: 2009/06/05(金) 12:28   No:34532 解決!     
Title: Re:include ファイルを開けません・・・    
マーク付けしてませんでした、すみません;

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



Name: ハジ  ..ぴよぴよ(502ポイント)   Date: 2009/06/04(木) 22:37   No:34510       
Title: 変数の値が急に勝手に変わる    
いつもお世話になっております。
このたびは「なんか知らないうちにとある変数が勝手に変わる」という現象を解決したくて描きこませていただきました。

具体的には、メインループの中でswitchを使用しているのですが
その判定に使用している変数(statusという名を使用しています)が
勝手に変わってしまいます。
具体的には"3"から3フレーム後"-65536"に変わります。

原因は不明なので、いたしかたなく無理やりdefault時に正常なstatusを代入していたのですが
今度は別の変数が変わってしまい、一時的な解決にもなりませんでした。

数字的にオーバーフロー?か何かとか思い調べてみたのですが
解決方法&似たような事例を見つけることができませんでした。

もしよろしければ解決法をご教授いただけると幸いです。


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


Name: box  ..ハッカー(140,908ポイント)   Date: 2009/06/04(木) 22:42   No:34511     
Title: Re:変数の値が急に勝手に変わる    
> 具体的には、メインループの中でswitchを使用しているのですが
> その判定に使用している変数(statusという名を使用しています)が
> 勝手に変わってしまいます。
> 具体的には"3"から3フレーム後"-65536"に変わります。

現象だけ教えていただいても、どうにもならないです。
問題が発生している近辺のソースコードが見たいです。


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

Name: ハジ  ..かけだし(1,126ポイント)   Date: 2009/06/04(木) 22:50   No:34512     
Title: Re:変数の値が急に勝手に変わる    
以下がメインループです。


while(ProcessMessage()==0 && ClearDrawScreen()==0 && GetHitKeyStateAll_2(Key)==0 && Key[KEY_INPUT_ESCAPE]==0){
//↑メッセージ処理   ↑画面をクリア     ↑入力状態を保存       ↑ESCが押されていない

switch(status)
{
case 0:
Title();
break;

case 1: //メインゲーム

counters();
scroll();
action();
green_counter();
gravity_up_down();
gravity_change();
drawing();
game_resets();
died();
Gravity_draw();
break;

case 2:

Life_counter();
drawing();
break;

case 3:
Stage_choice();
stage_make();
break;

default:
DxLib_End();
return 0;
break;
}

ScreenFlip();
}

DxLib_End();
return 0;
}


で、問題の現象が起こるcase 3にある関数は以下のものとなります


#include "DxLib.h"
#include "ExternGV.h"
#include "stage01_ex.h"
#include "stage02_ex.h"

void Stage_choice()
{
for(i=0;i<2;i++)
{
DrawFormatString(550,350+(i+1)*50,white,"STAGE 0%d",i+1);
DrawBox(500,350+stage_n*50,518,368+stage_n*50,white,true);
}

if((GetJoypadInputState(DX_INPUT_PAD1) & PAD_INPUT_DOWN) >= 1 && stage_n==1)
{
stage_n=2;
}
if((GetJoypadInputState(DX_INPUT_PAD1) & PAD_INPUT_UP) >= 1 && stage_n==2)
{
stage_n=1;
}
if((GetJoypadInputState(DX_INPUT_PAD1) & PAD_INPUT_C ) >= 1)
{
switch(stage_n)
{
case 1:
for(i=0;i<1024;i++)
{
for(j=0;j<1024;j++)
{
make_block[i][j]=make01_block[i][j];
stage_goal=stage_goal01;
}
}
WaitTimer( 300 ) ;
status=1;
break;

//case 2:
// make_block[i][j]=make02_block[i][j];
// status=1;
// break;

}
}
}

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

#include "DxLib.h"
#include "ExternGV.h"


//ステージ情報より 1 のところにブロックを配置
void stage_make()
{
for(i=0;i<1024;i++)
{
for(j=0;j<1024;j++)
{
if(make_block[i][j]==1)
{
x=j*bl[i].size;
bl[bl_count].x=x;
x=i*bl[i].size-7260;
bl[bl_count].y=x;
bl[bl_count].color=red;
bl_count++;
}
}
}
}


以上となります。


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

Name: box  ..ハッカー(140,997ポイント)   Date: 2009/06/04(木) 23:10   No:34513     
Title: Re:変数の値が急に勝手に変わる    
Stage_choice() の中で、statusに1を代入している箇所があります。
そこを通った結果、メインループのswitch文で今度はcase 1:の箇所を通り、
そこの関数群を実行するうちにstatusの値がおかしくなっている、
というようなことはないですか? ないですよね…。


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

Name: ハジ  ..かけだし(1,352ポイント)   Date: 2009/06/04(木) 23:13   No:34514     
Title: Re:変数の値が急に勝手に変わる    
というか、自分で載せておきながら上記の部分が直接関係していないと思っています。
なぜならばその個所を初回通過したときは問題なくて
ゲームをリセットした後で問題の現象が起こるからです…

なので、とりあえずcppファイルとhファイルをまとめたものを添付させていただきます。
上記の現象は
1.タイトルでENTERを押す
2.ステージ1を選ぶ(ENTER)
3.ゲーム中にリセット(R)
4.タイトルで再びENTERを押す
5.問題の現象が発生します。

以上となります。
詳細を記載しておらず大変申し訳ございませんでした。


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

Name: dic  ..上級者(22,303ポイント)   Date: 2009/06/04(木) 23:29   No:34515     
Title: Re:変数の値が急に勝手に変わる    
使用コンパイラは何でしょうか?
VC++6では変数の値が変更された時にブレークポイントで止まる機能があります
こういった機能を使われてはいかがでしょう?


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

Name: たいちう  ..プログラマー(30,931ポイント)   Date: 2009/06/04(木) 23:30   No:34516     
Title: Re:変数の値が急に勝手に変わる    
デバッグしてくれというのは勘弁。私は。
↓のようなことが起こっていると思うけど。
int main()

{
int before[2];
int x;
int after[2];

printf("%x\n", before);
printf("%x\n", &x);
printf("%x\n", after);

x = 666;
printf("x = %d\n", x);

before[0] = 100;
before[1] = 101;
before[2] = 102;
before[3] = 103;
before[4] = 104;

printf("x = %d\n", x);

after[0] = 200;
after[1] = 201;
after[2] = 202;
after[3] = 203;
after[4] = 204;

printf("x = %d\n", x);

return 0;
}


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

Name: nayo  ..中級者(11,464ポイント)   Date: 2009/06/04(木) 23:37   No:34517     
Title: Re:変数の値が急に勝手に変わる    
ないとは思いますがリリースモードでデバッグしたりとかそんなことはないでしょうか

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

Name: dic  ..上級者(22,369ポイント)   Date: 2009/06/04(木) 23:44   No:34518     
Title: Re:変数の値が急に勝手に変わる    
ソースをコンパイルさせてもらいましたが
>具体的には"3"から3フレーム後"-65536"に変わります
というような現象は起きませんでした


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

Name: pooka [URL]  ..入門者(4,568ポイント)   Date: 2009/06/05(金) 00:34   No:34520     
Title: Re:変数の値が急に勝手に変わる    
デバッグしてみたところ確かに問題の現象が起こりました。
その時stage_make関数のi=75,j=17あたりで、blという構造体の配列?に対して
たいちうさんが書かれているようなことをしているようです。


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

Name: conio  ..上級者(16,592ポイント)   Date: 2009/06/05(金) 00:40   No:34522     
Title: Re:変数の値が急に勝手に変わる    
範囲外のものを書き換えたりしているのではないでしょうか。

パッと見たところstatusには
-----------------------
status = 0;
status = 1;
status = 2;
status = 3;
-----------------------
みたいな記述しかないので、おかしな値が入る事は無いと思います。

考えられるのは下記のように、変な所へ値を入れたりしているのではないかと。
(上記でも指摘がありましたが)
-------------
int temp[5];
temp[7] = 10;
-------------

あと、バグとは別にexternが多いかもしれません。
至る所でexternがあるため、どこのファイルのどの関数(変数)なのか分かりづらくなっているように
思いました。


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

Name: ハジ  ..かけだし(1,725ポイント)   Date: 2009/06/05(金) 01:28   No:34523     
Title: Re:変数の値が急に勝手に変わる    
お世話になっております。

とりあえずpookaさんやたいちうさんがおっしゃっている内容が問題っぽいです…

>-------------
>int temp[5];
>temp[7] = 10;
>-------------

ちなみにこれと似ている行為として

int temp[10];
temp[]={0,1,2,3}
みたいなことをやっております。
なんでこんなことをやっているのかといいますと

temp[]={ここの部分}

「ここの部分」の個数(要素?)が状況によって異なるので
とりあえずint temp[100];としておけばオッケーでしょって感じで作業を進めていました。

やっぱりこれは駄目なのでしょうか?
またダメだとすればどのように対処すればよろしいでしょうか?
(sizeof関数?)

※あとたいちうさんやpookaさんのプログラムがなぜエラーになるかわかんなかったりします。なぜそうなるのでしょうか?


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

Name: ハジ  ..かけだし(1,744ポイント)   Date: 2009/06/05(金) 01:28   No:34524     
Title: Re:変数の値が急に勝手に変わる    
すみません。pookaさんではなくconioさんでした。

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

Name: pooka [URL]  ..入門者(4,694ポイント)   Date: 2009/06/05(金) 01:47   No:34525     
Title: Re:変数の値が急に勝手に変わる    
make_blockという配列をinitialzation関数の中で0で初期化したところ一応大丈夫のようです。

リセットしてもmake_blockという配列に前のデータが残っていて、
stage_make関数のif(make_block[i][j]==1)の条件を満たして、bl_countの値が増えていき、
配列の範囲外にアクセスしたのだと思います。


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

Name: conio  ..上級者(17,153ポイント)   Date: 2009/06/05(金) 02:11   No:34526     
Title: Re:変数の値が急に勝手に変わる    

>>※あとたいちうさんやpookaさんのプログラムがなぜエラーになるかわかんなかったりします。なぜそうなるのでしょうか?
まず、変数などはメモリに割り当てられますよね。

例えば、下記のように3×3の二次元配列を定義します。
----------------------------------------------------
int temp[3][3] = {0};

temp[0][2] = 1;  //値を1に変える

for(int i = 0; i < 3; i++)
{
for(int j = 0; j < 3; j++)
{
if(temp[i][j] == 0)
printf("○");
else if(temp[i][j] == 1)
printf("●");
}
puts(" ");
}
----------------------------------------------------

この場合、メモリ上は下記のように並んでます。
で、途中でtemp[0][2]の値を1に書き換えてます。
----------
┃[0][0]
┃[0][1]
┃[0][2]←1にする
┃[1][0]
┃[1][1]
┃[1][2]
┃[2][0]
┃[2][1]
▼[2][2]
----------
プログラムを実行すると
○○●
○○○
○○○
となります。

では、"temp[0][5] = 1;"にするとどうなるかというと、エラーにはなりません。
実行結果は
○○○
○○●
○○○
となります。この結果から見ても分かるように、メモリ上は下記のようになっているため、
"temp[0][5]とtemp[1][2]は同じ場所を示す"状態になります。
よって、直接いじっていないtemp[1][2]の値が書き換えられてしまった訳です。

----------
┃[0][0]
┃[0][1]
┃[0][2]
┃[1][0]
┃[1][1]
┃[1][2] == [0][5]
┃[2][0]
┃[2][1]
▼[2][2]
----------

上記の例は2次元配列に収まっていました。が、もし収まらなかった場合(temp[2][3] = 1など)
どうなるかと言うと、全く関係ない場所が書き換えられてしまいます。

そこに運悪くstatusがあった場合は、statusの値が変わってしまいます。
(実際は変数の型によって色々と大きさが違うため、訳のわからない値になるかと)
----------
┃[0][0]
┃[0][1]
┃[0][2]
┃[1][0]
┃[1][1]
┃[1][2]
┃[2][0]
┃[2][1]
▼[2][2]
 status = 1
----------


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

Name: ハジ  ..かけだし(1,519ポイント)   Date: 2009/06/05(金) 02:52   No:34527 解決!     
Title: Re:変数の値が急に勝手に変わる    
>pookaさん
解決しました!ありがとうございます。

>リセットしてもmake_blockという配列に前のデータが残っていて、
>stage_make関数のif(make_block[i][j]==1)の条件を満たして、bl_countの値が増えていき、
>配列の範囲外にアクセスしたのだと思います。
bl[1024]がオーバーすることによるエラーなのだということはわかりましたが
なぜbl_countがオーバーしたのでしょうか?bl_countは初期化していたのに…
すみません。知識不足で…

>conioさん
わかりやすい解説誠にありがとうございます!
いわゆるメモリのアドレスの話(?)でしたか…
個人的にはプログラムを始めたばかりなのですが
今回初めてポインタの意味を感じました。
(ポインタを使っていれば、何でエラーがでたかすぐにわかるのですね…)


みなさま深夜までご対応誠にありがとうございました!
これにて解決とさせていただきます!


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



Name: アキ  ..ぴよぴよ(251ポイント)   Date: 2009/06/02(火) 22:37   No:34414       
Title: 無題    
初心者です。
学校の課題で3回勝負のジャンケンのジャンケンの勝敗を判定する関数judge_mentを定義するには、どうすればいいでしょうか。


include <stdio.h
#include <stdlib.h>
#include <time.h>
int main(void)
{
int user, comp, i, uwin = 0, cwin = 0;
printf("じゃんけん3回勝負!\n\n");
srand( (unsigned)time( NULL ) );
for(i = 0; i < 3; i++){
printf("何を出しますか?\n");
printf("1 グー 2 チョキ 3 パー\n");
scanf("%d", &user);
comp = rand() % 3 + 1;
if(comp == 1){
if(user == 1){
printf("あなたはグー。私はグー。ひきわけですね。\n");
}
else if(user == 2){
printf("あなたはチョキ。私はグー。私の勝ちですね。\n");
cwin++;
}
else if(user == 3){
printf("あなたはパー。私はグー。あなたの勝ちです。\n");
uwin++;
}
}
else if(comp == 2){
if(user == 1){
printf("あなたはグー。私はチョキ。あなたの勝ちです。\n");
uwin++;
}
else if(user == 2){
printf("あなたはチョキ。私はチョキ。ひきわけですね。\n");
}
else if(user == 3){
printf("あなたはパー。私はチョキ。私の勝ちですね。\n");
cwin++;
}
}
if(comp == 3){
if(user == 1){
printf("あなたはグー。私はパー。私の勝ちですね。\n");
cwin++;
}
else if(user == 2){
printf("あなたはチョキ。私はパー。あなたの勝ちです。\n");
uwin++;
}
else if(user == 3){
printf("あなたはパー。私はパー。ひきわけですね。\n");
}
}
}
printf("\nあなたの%d勝%d敗%d引き分け\n", uwin, cwin, 3 - uwin - cwin);
return 0;


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


Name: conio  ..上級者(16,288ポイント)   Date: 2009/06/03(水) 00:03   No:34426     
Title: Re:無題    

単純にやると、以下のようになります。
改良の余地はあるので、色々と手を加えてみるのも良いかもしれません。
-----------------------------------------------------------------------------------
int user, comp, i, uwin = 0, cwin = 0;

void judge_ment(void)
{
if(comp == 1){
if(user == 1){
printf("あなたはグー。私はグー。ひきわけですね。\n");
}else if(user == 2){
printf("あなたはチョキ。私はグー。私の勝ちですね。\n");
     cwin++;
}
else if(user == 3){
printf("あなたはパー。私はグー。あなたの勝ちです。\n");
uwin++;
}
}else if(comp == 2){
if(user == 1){
printf("あなたはグー。私はチョキ。あなたの勝ちです。\n");
uwin++;
}else if(user == 2){
printf("あなたはチョキ。私はチョキ。ひきわけですね。\n");
}else if(user == 3){
printf("あなたはパー。私はチョキ。私の勝ちですね。\n");
cwin++;
}
}else if(comp == 3){
if(user == 1){
     printf("あなたはグー。私はパー。私の勝ちですね。\n");
cwin++;
}else if(user == 2){
     printf("あなたはチョキ。私はパー。あなたの勝ちです。\n");
uwin++;
}else if(user == 3){
     printf("あなたはパー。私はパー。ひきわけですね。\n");
}
}
}
int main(void)
{
printf("じゃんけん3回勝負!\n\n");
srand( (unsigned)time( NULL ) );
for(i = 0; i < 3; i++)
{
printf("何を出しますか?\n");
printf("1 グー 2 チョキ 3 パー\n");
scanf("%d", &user);
comp = rand() % 3 + 1;

judge_ment();//判定する関数
}
printf("\nあなたの%d勝%d敗%d引き分け\n", uwin, cwin, 3 - uwin - cwin);
return(0);
}
-----------------------------------------------------------------------------------


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

Name: 初級者  ..初心者(6,088ポイント)   Date: 2009/06/03(水) 19:52   No:34467     
Title: Re:無題    
#include <stdio.h>

#include <stdlib.h>
#include <time.h>

int judge_ment(int u,int c)
{
if (u==c) return 1;
return (u%3+1==c)?0:2;
}

int main(void)
{
char *h[]={"","グー。","チョキ。","パー。"};
char *p[]={"あなたは","私は" };
char *r[]={"あなたの勝ちです。","引分けです。","私の勝ちですね。",};
int c,u,res,cwin=0,uwin=0,i;

srand((unsigned) time(NULL));
printf("じゃんけん3回勝負!\n");
for(i=0;i<3;i++) {
printf("\n何を出しますか?\n");
printf("1 グー 2 チョキ 3 パー\n");
scanf("%d",&u);
c=rand()%3+1;
printf("%s%s",p[1],h[c]);
printf("%s%s",p[0],h[u]);
printf("%s\n",r[res=judge_ment(u,c)]);
if(res==0)uwin++;
if(res==2)cwin++;
}
printf("\nあなたの%d勝%d敗%d引分け\n",uwin,cwin,3-uwin-cwin);
return 0;
}




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

Name: sizuma  ..ぴよぴよ(100ポイント)   Date: 2009/06/05(金) 00:34   No:34521     
Title: Re:無題    
勝敗の判定で同じような処理をしているところがないか考えて、その部分を関数にできないか検討してみては?

僕も初心者で特にCではコードも全然書かないんですが。
やはり最初から他の人が書いた処理を見るよりはできなくても自分で書いてみて、何ができないのかを自分が理解することから始めるべきではないかと思います!


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



Name: ほのか  ..入門者(3,949ポイント)   Date: 2009/06/02(火) 12:04   No:34398 解決!       
Title: カウンタをアドレスに変更する    
いつもお世話になっております。
ソースは添付ファイルにして失礼いたします。

課題担当の方に最初の処理区分の処理の部分等のiCntをポインタ?アドレス?にして処理をするようにと言われたのですが、カウンタをアドレスにする利点とかってあるのでしょうか??
どうしてアドレスに変更する必要があるのかよくわからないので…;


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


Name: non  ..熟練のプログラマー(45,400ポイント)   Date: 2009/06/02(火) 18:11   No:34401     
Title: Re:カウンタをアドレスに変更する    
何のことかよくわかりませんが、
int henkou(Jusyoroku *data,int iCnt);
などを
void henko(Jusyoroku *data,int *iCnt);
で作成しろということではないでしょうか?

利点についてはわかりません。私は、最初の形で何も問題がないと思いますし、
たぶん、最初のように作ると思います。その方が、明確に値を変更していることが
わかりますし、間違いが少ないと思います。解析もしやすいし・・・
どちらがいいかは、プロの方に聞いた方がいいですね。

いずれにしろ、利点は課題担当の方に聞くべきではないでしょうか?そのための課題担当者なんでしょ。





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

Name: ほのか  ..入門者(3,991ポイント)   Date: 2009/06/02(火) 20:18   No:34403     
Title: Re:カウンタをアドレスに変更する    
回答ありがとうございます。
課題担当の方に聞いたのですが、応答がなかったため質問させていただきました;
明日また聞いてみようと思います;


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

Name: たいちう  ..プログラマー(30,516ポイント)   Date: 2009/06/03(水) 20:52   No:34469     
Title: Re:カウンタをアドレスに変更する    
> int henkou(Jusyoroku *data,int iCnt);
> void henko(Jusyoroku *data,int *iCnt);

前者はiCntを呼び出し元が管理するけれど、
後者はiCntの更新も含めて関数側におまかせしています。
どちらがベターとかいうことはなく、関数と関数を呼ぶ側の
役割分担を考えて、どちらがふさわしいか、という事でしょうかね。

大きな違いがあるわけでもないので、
気にしない人の方が多いのではないでしょうか。
この例ではどちらが良いかは判断できません。

初心者には自由に書き換えるのは少し難しいかもしれないので、
その為の課題なのかもしれません。確実に押さえておきたいところです。
あるいは次以降のステップで、出題者の意図が明らかになるのかもしれませんね。


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

Name: Mist  ..熟練のプログラマー(62,526ポイント)   Date: 2009/06/04(木) 09:56   No:34480     
Title: Re:カウンタをアドレスに変更する    
http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1426833834

こっちで解決してるみたいよ。


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



Name: スー  ..初心者(7,302ポイント)   Date: 2009/06/03(水) 22:23   No:34472       
Title: APIでデスクトップアクセサリー作成    
皆さんこんばんは。

自分の力では解決できそうにないので、質問させてください。

今、WindowsAPIでデスクトップアクセサリーを作っています。
とあるキャラの画像と噴出しを表示するというシンプルなデスクトップアクセサリーです。

こんな感じにしたい仕様
・キャラ、噴出しをドラッグしたら動かすことができる。(個別で動く
・キャラ、噴出しを右クリックしたら同じメニューがでてくる。
・メニューの終了を押したら、両方終了する。
これだけだと伝わりにくいので現在できている所までを添付します。

キャラは完成したのですが、噴出しの作成に困っています。
いろいろ試行錯誤して困った点
・キャラを親ウィンドウとして、噴出しをMDIで子ウィンドウを作ったら、キャラの中にしか噴出しが表示されない。
・モニターの大きさの透明な親ウィンドウを作って、キャラ、噴出しを子ウィンドウとして作ったら表示されない。

キャラと噴出しを同時に表示させる方法はないでしょうか?
よろしくお願いします。

環境は
WindowsXP Home
VC++
WindowsAPI
です。



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


Name: スー  ..初心者(7,358ポイント)   Date: 2009/06/03(水) 22:26   No:34473     
Title: Re:APIでデスクトップアクセサリー作成    
すみません。

添付ファイルを忘れていました。
http://down11.ddo.jp/uploader/download/1244035522/attach/mascot.lzh
500kbあったのでこちらのアップローダーをお借りしました。

PASSは"suu"です。


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



Name: MNS  ..中級者(9,002ポイント)   Date: 2009/06/02(火) 23:01   No:34419       
Title: std::mapでの検索    
例えば、あるクラス「Life」があります。
Lifeはint型の変数を一つ持っており、
そのLifeの実体が何百個もある時に、
そのint型の変数で、10の要素を持つLifeを
何でもいいから一つ検索したいとします。

検索しやすくするために、Lifeのデータをstd::mapに入れることにし、
また、そのint型の変数は短時間に多く変動するので、
std::mapのキーとして、そのint型の変数のポインタを入れることにしました。
std::map<int*, Life*>
最終的に、このようなデータ構造になったのですが、
ここで、find関数でキーの検索を行おうとすると、
int*の変数を渡さなければいけませんよね?

私が求めているのは値の検索で、アドレスの検索ではありません。
このような状況で、
Afind関数で、アドレスではなく値を比較することは可能か
Bその他の方法で、なるべく高速に検索するものはあるか
ということを聞きたいです。

わかりにくい文章だとは思いますが、どなたか回答お願いします。


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


Name: Justy  ..伝説なるハッカー(367,185ポイント)   Date: 2009/06/03(水) 00:09   No:34427     
Title: Re:std::mapでの検索    

>find関数で、アドレスではなく値を比較することは可能か

 可能といえば可能です。

struct int_ptr_less
{
    bool operator()(const int* l, const int* r) const
    {
        return (*l < *r);
    }
};

std::map<int *, Life *, int_ptr_less> lifeMap;

でやりたいことはできるはずです。

 が、std::mapの first側の値は変化しないことが前提となっており、
挿入時の値を元に大小関係を見てツリーを構築しますので、
ポインタにして比較する値を途中で変化させてしまうと、破綻します。



>その他の方法で、なるべく高速に検索するものはあるか

 mapの second側もポインタになっていたことから推測すると、実体は別に管理されており、
mapは検索の為だけである、という認識でいいのでしょうか。

 だとすると、たかだか数百程度ですし実体側のリストを手繰った方がいいかと思います。


 それではどうしても遅い、もっと高速にしないと話にならない、ということであれば
ケースバイケースで高速化は可能だと思いますが、具体的には詳細を聞いたりテストしてみないと
なんともいえません。


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

Name: MNS  ..中級者(9,090ポイント)   Date: 2009/06/03(水) 22:04   No:34470 解決!     
Title: Re:std::mapでの検索    
std::mapのキーは変化してはいけないのですね。
SLGのユニット選択の際、クリック地点にユニットがいるかどうか、
std::mapを使えばすばやく調べられるかな、と思ってした質問ですので、
別にそこまで速度は必要ありませんでした。

なので、実体側を直接調べようと思います。
どうもありがとうございました。


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



Name: もじゃ  ..ぴよぴよ(111ポイント)   Date: 2009/06/01(月) 23:29   No:34372       
Title: C言語で容量計算    
LINUXでC言語の勉強をしているのですが
あるディレクトリ配下にあるファイルの総容量を計測するには
どのような処理があるでしょうか?
/home/work/配下にファイルa.txt、b.txt、c.txtがある場合に
この3ファイルの合計容量を求める処理を教えて頂けないでしょうか?


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


Name: toyo  ..プログラマー(35,735ポイント)   Date: 2009/06/02(火) 05:58   No:34387     
Title: Re:C言語で容量計算    
duというコマンドがあります
du /home/work
で表示されると思います
オプション等は検索して調べてください


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

Name: もじゃ  ..ぴよぴよ(46ポイント)   Date: 2009/06/03(水) 20:46   No:34468     
Title: Re:C言語で容量計算    
> duというコマンドがあります
> du /home/work
> で表示されると思います
> オプション等は検索して調べてください
>

コメントありがとうございます。

duコマンドはc言語の文中で使用できるでしょうか?
c言語の処理でduコマンドと同じような結果を出力させる
方法をご存知でしたら教えて頂きたいです。


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

Name: 俺最高   Date: 2009/06/12(金) 14:18   No:343721244783902     
Title: Re:C言語で容量計算    
もう解決したかもしれませんが。

>duコマンドはc言語の文中で使用できるでしょうか?
リナックスコマンドはC言語中では「system(コマンド名)」で使用できます。
ちなみに(コマンド名)は単なる文字列です。
ただし、あくまでもコマンドを実行するだけなので、コンソール中にduの結果を
出して終わります。そのため、リダイレクトを使用したりしてそれなりに編集を
行う必要があります。

>c言語の処理でduコマンドと同じような結果を出力させる
>方法をご存知でしたら教えて頂きたいです。

私の場合はディレクトリの情報を取得できるstat関数を使ってやったことがあります。
これまた確認出来ないので詳しく書けませんが
@#include <sys/stat.h>が必要
Astruct stat 変数名を宣言
Bstat(ディレクトリのパス,Aで宣言した変数名)で、変数に情報が格納されます。
C変数.st_sizeメンバーに、ディレクトリの容量(バイト)が入ると思います。

注意点
@stat関連については、検索エンジンで調べたほうがいいです。(コンパイラ依存だったりするので)
A調べるディレクトリの下にさらにディレクトリがあったりすると、上手く計算しない(と思いました)




Name: にとり  ..ぴよぴよ(24ポイント)   Date: 2009/06/01(月) 23:48   No:34377       
Title: ショットとバレットの違い    
龍神録ではショットとバレットを別々に扱ってますが、違いがよく分かりませんので教えてほしいです。

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


Name: 司馬司 [URL]  ..ぴよぴよ(318ポイント)   Date: 2009/06/03(水) 16:14   No:34457     
Title: Re:ショットとバレットの違い    
ショットは自機の弾でバレットは敵弾じゃないでしょうか?
何となく、ですが。


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

Name: すずめ  ..入門者(2,788ポイント)   Date: 2009/06/03(水) 17:41   No:34465     
Title: Re:ショットとバレットの違い    
私の勝手な解釈ですが、
shotはたとえば機関銃
bulletはその弾
shotのMAXが30で、bulletのMAXが300だったら、
bulletは最大で30X300個。
enemyはそれぞれ好きなshot(弾幕)を一つずつ持つことができる。

ちょっと違うかも知れません。

すいません。名前を書き忘れました。
前の投稿無かったことにしてください。


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

Name: Dixq (管理人)  ..ウィザード(1,026,078ポイント)   Date: 2009/06/03(水) 18:05   No:34466     
Title: Re:ショットとバレットの違い    
すずめさんの言われている通りです。
バレットは弾で、ショットはそれを統括する親です。
補足の必要が無いほど適切な回答だったので特にコメントの必要が無いんですが、
私の設計した意図はすずめさんの言われた通りです。


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



Name: むっち  ..ぴよぴよ(546ポイント)   Date: 2009/06/02(火) 21:08   No:34407       
Title: 無題    
初めまして、

先ほど ここで説明されているシューティングゲームをつくってみようとおもいました、

二章目の まずは実行させよう 

というところでmain.cppに

int Key[256];

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

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

while(ProcessMessage()==0 && ClearDrawScreen()==0 && GetHitKeyStateAll_2(Key)==0 && Key[KEY_INPUT_ESCAPE]==0){
//↑メッセージ処理   ↑画面をクリア     ↑入力状態を保存       ↑ESCが押されていない


//ココ!!



ScreenFlip();
}

DxLib_End();
return 0;
}

を入力(コピー ペースト)してデバッグをしてみたところ、
「プログラム c:\Users\(略)\RyuJin アクセスが拒否されました」

と表示され作業が進みません、

なにかたりないものがあったりするのでしょうか・・

ちなみにVC++を使用しています


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


Name: チルチル  ..上級者(20,589ポイント)   Date: 2009/06/03(水) 16:33   No:34461     
Title: Re:無題    
詳しい事はわかりませんが
原因の1つとしてプログラム周辺に隠しフォルダがあると言うものがあります

あと無題はやめた方が良いですよ・・


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

Name: 御津凪 [URL]  ..比類無きプログラマー(92,908ポイント)   Date: 2009/06/03(水) 17:30   No:34464     
Title: Re:無題    
Vesta では、特殊なフォルダ(Program Files や Users 内)にはアクセス制限がかけられていて、
上記の通り、アクセスが拒否されることがあります。

この場合、プロジェクトの場所を移す必要があります。

ドライブ直下にプロジェクト用のフォルダを作って、そこにおけば回避できると思いますよ。
(PCを複数人で使用しているなら場所的に問題がありますが)


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



Name: hitugi  ..ぴよぴよ(162ポイント)   Date: 2009/06/02(火) 23:51   No:34425       
Title: Java(オープンソースGreenfoot)を用いたシューティング    
はじめまして。
現在こちらのサイトの龍神録の館を参考にJavaでシューティングゲームを作っています。
Javaでの質問ですので場違いでしたら削除いたします。

現在Boss実装まで構築できたのですがかなり重い状況です(Pen4 2.6G メモリ1.5GでFPS30以下)

Javaでシューティングを作るにあたり高速化するコツ等はありますでしょうか?

Bullet[] bu=new Bullet[1000];
としてShotクラス内で動作させているところとJadgeで
Jadge(shot sh,pshot ps,Player pl,enemy en)
とインスタンス生成時に敵味方のデータをコピーして、後は龍神録の館通りに演算し当たり判定を取っているところで敵味方のデータを取ろうすると処理落ちがひどくなります。
多少マルチスレッド的(背景を別のスレッドで動作)に作っている部分があるのでそこが原因かも知れないと思ったのですが関係なかったようです。

どうかよろしくお願いいたします。


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


Name: Mikan [URL]  ..中級者(9,699ポイント)   Date: 2009/06/03(水) 00:21   No:34429     
Title: Re:無題    
タイトルが無題なのは避けたほうが良い回答を得られると思います^^

んで、本題なのですが処理落ちの原因としてクラス内で画像ファイルなどのデータロードなどはしていないでしょうか?

あとは、プレイヤークラスを渡すときにコンストラクタなどで読み込みや重い処理などをしているとか・・・

CとJAVAは似ているので、ソースの提示があればもう少し明確なことを言えると思いますが、提示してみてはいかがでしょうか?

hitugiさんの書いてるスペックではここまで処理落ちするのは、高速化以前にどこかに無駄な処理があるものだとおもわれます。


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

Name: hitugi  ..ぴよぴよ(288ポイント)   Date: 2009/06/03(水) 00:31   No:34430     
Title: Re:無題    
Mikanさんありがとうございます。
ソースの提示ですね…今ソースが学校用PCにありますので本日中に上げてみたいと思います。

あと開発環境がちょっと特殊でして…最近オープンソースになったGreenfootという環境で行っています。
理由はアルバイトで学部生に教える環境がこちらなので私がデモ用に利用してみた形です。

上げるときにGreenfootのAPIのURLも上げたいと思います。


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

Name: hitugi  ..かけだし(1,403ポイント)   Date: 2009/06/03(水) 16:14   No:34458     
Title: Jadgeのソース    
本日いろいろと試した結果、やはり多くの弾が表示されている条件下であたり判定の処理を実装すると重くなるようです。


ですのでJadgeクラスのソースを乗せてみます。よろしくお願いいたします。
<Greenfoot API URL>
http://www.greenfoot.org/doc/javadoc/

<Jadge.class>


import greenfoot.*; // (World, Actor, GreenfootImage, Greenfoot and MouseInfo)

/**
* Write a description of class Judge here.
*
* @author (your name)
* @version (a version number or a date)
*/
public class Judge extends Actor
{
player pl;
enemy[] en;
pShot Ps;
shot[] sh;


int[] enemy_renge={16,30,16,50};//敵当たり判定
double[] eshot_renge={17,4,2.5,2,2,3.5,2,2.5,1.5,2};//敵弾の当たり判定
int Player_renge=3;//プレイヤー当たり判定
int m_baffer,cnt;//無敵、点滅用カウンター
int[] pShot_renge={6,0};//プレイヤーショット当たり判定
boolean muteki=false;//無敵判定
/**
* Act - do whatever the Judge wants to do. This method is called whenever
* the 'Act' or 'Run' button gets pressed in the environment.
*/
public void act()
{
}
// Add your action code here.
Judge(player pl,enemy[] en,pShot Ps,shot [] sh){
this.pl=pl;
this.en=en;
this.Ps=Ps;
this.sh=sh;
}

boolean out_Judge_pShot(int psNum,int eNum){
if(Ps.pbu[psNum].cnt>0){
double x=Ps.pbu[psNum].x-en[eNum].x;
double y=Ps.pbu[psNum].y-en[eNum].y;
double r=pShot_renge[Ps.pbu[psNum].knd]+enemy_renge[en[eNum].knd];
if(x*x+y*y<r*r) return true;
}
return false;

}
boolean out_Judge_eShot(int shNum,int buNum){
if(sh[shNum].ba[buNum].cnt>0){
double x=pl.x-sh[shNum].ba[buNum].x;
double y=pl.y-sh[shNum].ba[buNum].y;
double r=eshot_renge[sh[shNum].knd2]+Player_renge;
if(x*x+y*y<r*r) return true;
}
return false;
}
boolean out_of_ep(int eNum){
if(en[eNum].cnt>0){
double x=pl.x-en[eNum].x;
double y=pl.y-en[eNum].y;
double r=enemy_renge[en[eNum].knd]+Player_renge;

if(x*x+y*y<r*r) return true;

}
return false;
}

void enemy_death_Judge(int eNum){
if(en[eNum].hp<0){
en[eNum].flag=false;
for(int i=0;i<sh.length;i++){
if(eNum==sh[i].num){
sh[i].sflag=true;
System.gc();
break;
}
}

}
}


void Judge_main(){
Ten();//点滅&無敵処理
for(int i=0;i<Ps.pbu.length;i++){
if(Ps.pbu[i].flag){
for(int j=0;j<en.length;j++){
if(en[j].flag){
if(out_Judge_pShot(i,j)){
Ps.pbu[i].flag=false;
Ps.pbu[i].setImage(new GreenfootImage(1,1));
en[j].hp-=Ps.pbu[i].pow;
enemy_death_Judge(j);
}
}
}
}
}
for(int i=0;i<sh.length;i++){
if(sh[i].flag){
for(int j=0;j<sh[i].ba.length;j++){
if(sh[i].ba[j].flag){
if(out_Judge_eShot(i,j)&&!muteki){
cnt=pl.cnt;
m_baffer=pl.cnt;
if(pl.hp>0){
pl.hp-=1;
muteki=true;
}
if(pl.hp==0){
pl.hp=0;
pl.setImage(new GreenfootImage(1,1));//プレイヤーイメージを1;1ピクセル画像に変換
Greenfoot.stop();//ゲーム終了
}
}
}
}
}
}
for(int i=0;i<en.length;i++){
if(en[i].flag){
if(out_of_ep(i)&&!muteki){
cnt=pl.cnt;
m_baffer=pl.cnt;
if(pl.hp>0){
pl.hp-=1;
muteki=true;
}
if(pl.hp==0){
pl.hp=0;
pl.setImage(new GreenfootImage(1,1));//プレイヤーイメージを1;1ピクセル画像に変換
Greenfoot.stop();//ゲーム終了
}

}

}
}
void Ten(){
if(muteki){
pl.flag=!pl.flag;
if(m_baffer!=0) m_baffer++;
if(m_baffer-cnt>100){
muteki=false;
m_baffer=0;
cnt=0;
}
}
else pl.flag=true;
}
}





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



Name: ぬこ  ..ぴよぴよ(770ポイント)   Date: 2009/06/02(火) 05:25   No:34385       
Title: ゲーム画面の拡大縮小について    
こんばんは〜
ちょっとした疑問なのですが、格闘ゲームなんかでよくみられるんですがズームイン、アウトについて質問させてください。
格闘ゲームってキャラ同士が接近するとそれにともないゲーム画面もズームインしたり、
逆にキャラ同士遠くなるとズームアウトされますよね。
あの機能を実装したいのですが上手くいきません。
あれってどのような処理をしてるんでしょうか?

自分でちょっとあれこれ試してみたのですが思ったようになりませんでした。
DXライブラリのDrawExtendGraphを使うと画像の大きさだけ変わるので動きがズレてしまいます。
SetWindowSizeExtendRateをつかってみたところ求めていた機能なのですが、
ウィンドウもいっしょに小さくなってしまいます。

ウィンドウサイズを固定したまま画像だけ拡大縮小する方法はないでしょうか?
自分では一応DrawExtendGraphをつかって動きも縮小率にあわせて変更すればいいのかなっと思いついたのですが、
ドット単位で少しづつ拡大縮小するたびにずれる気がしますorz
他に何か良い方法があるのなら紹介していただけるとうれしいです。

プログラミングは勉強中ですがそんなに得意じゃありません。
もしかしたら見当違いなことをいってるかもしれませんが答えていただけるとありがたいです。



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


Name: Justy  ..伝説なるハッカー(367,546ポイント)   Date: 2009/06/03(水) 00:42   No:34432     
Title: Re:ゲーム画面の拡大縮小について    
 市販のゲームは、というと個々のゲームやハードによって変わってくるのですが、
3次元的に処理すれば簡単にできます。

 キャラは面がカメラの方を向くようにして、カメラを近づければ拡大しますし、
遠ざければ小さくなります。


 全てを2Dで処理する場合でも、本格的に作るなら基本的には似たような……
Z軸の代わりに「拡大率」のようなパラメータとカメラ的な概念と取り入れて、
システム的に内部座標から表示座標を計算して表示する……処理になるでしょう。

 ただ、完全な2Dライブラリではカメラの概念がない場合があるので、
その場合は自作となります。



>DXライブラリのDrawExtendGraphを使うと画像の大きさだけ変わるので動きがズレてしまいます。

 手っ取り早くやるなら、拡大しようとしている画面の中心点から
オブジェクトの中心へのベクトルを求めて、描画する時はスケール値に応じてこのベクトルを
伸縮させた位置に表示すればいいんじゃないかと。

 その場合、DrawExtendGraphより、DrawRotaGraphの方がやりやすいかもしれません。


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

Name: チルチル  ..上級者(20,389ポイント)   Date: 2009/06/03(水) 00:59   No:34436     
Title: Re:ゲーム画面の拡大縮小について    
Justyさんの方法の方が良いとは思いますが

ズームするだけなら普通に描画した後に画面全体をキャプチャして
キャラの距離に応じて拡大して貼り付ければ良いんじゃないでしょうか?

処理が重たくなるかもしれませんが、細かい処理を加える必要が無いので
追加、改良が楽だと思いますが・・


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

Name: kazuoni [URL]  ..比類無きプログラマー(89,057ポイント)   Date: 2009/06/03(水) 01:20   No:34438     
Title: Re:ゲーム画面の拡大縮小について    
>チルチルさん
例えば、ウォー○ーを探せ的なやつで、
見つけたいキャラクタがここにいました!って
いうのはそれで事が足りるのですが、
ゲームの動き(リアルアクション)を考慮するならやはりベクトル概念
もしくはJustyさんのおっしゃるような、カメラは必要かと思います。


2D用カメラ自作してみたいですね。
っというか、具体的にどんな手順を踏めばいいのかが
良く分からないんですが。。
ベクトルなら見通しがつくのですが・・・。


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

Name: ぬこ  ..かけだし(1,097ポイント)   Date: 2009/06/03(水) 04:37   No:34448 解決!     
Title: Re:ゲーム画面の拡大縮小について    
色々と方法を提示していただき皆様ありがとうございました。
参考にして色々と試して見ました。

3Dだとカメラ近づけるだけでズームできるんですね。
考えてみれば当然のことですが、こんな方法全然思いつきませんでした。
ただ試してみようとしたのですが・・・
「Z軸の代わりに「拡大率」のようなパラメータとカメラ的な概念と取り入れて」
↑この辺で断念しました。勉強不足なのかちょっと処理がわかりませんでしたorz

画面全体をキャプチャする方法もカンタンそうなので試してみました。
少し求めていたものと違ったのですがこんな方法もあるんですね。
今後色々と使えそうです。細かい処理がいらないのもお手軽でいいですね。
参考になりました。

とりあえず現状でも手がつけれそうなDrawRotaGraphを使う方法でやってみようと思います。
勉強になりました。答えてくださった皆様ありがとうございます。

うぉ いつのまにか追加されとる。
DrawModiGraphで色々つかってみたところ綺麗にできそうです。
一括でやってなかったからまとめなきゃだけども ちょっとこれでやってみようと思います。
情報ありがとうございました〜。
あとは色々と試しつつがんばってみますね。
力技は得意なのでw あとで後悔することが多いけどもorz


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

Name: バグ  ..ハッカー(159,374ポイント)   Date: 2009/06/03(水) 07:44   No:34450     
Title: Re:ゲーム画面の拡大縮小について    
昔のゲーム機では、拡大・縮小をサポートしていないハードなのに無理矢理に実現させていた作品がありました。

その作品では単純に大きさの違うキャラクターを用意しておいて、状況に応じて書き換えていたようでした。

まぁ、当然ですが、この方法ではスムーズには拡大・縮小はできません。カクカクします(笑)

口で言うのは簡単ですが、この方法は当時のメモリの少ないハードで実現するのは相当に大変だったのではないかと推測します(^_^;)

最適解を求めるのも、もちろん勉強になりますが、例え力技でも自分の思い付くままに色々とテストしてみるのもよろしいかと思いますよ(o^-')b


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

Name: 司馬司 [URL]  ..ぴよぴよ(293ポイント)   Date: 2009/06/03(水) 16:10   No:34455     
Title: Re:ゲーム画面の拡大縮小について    
描画命令を一元的に管理しているという前提が必要ですが、
DrawModiGraphを使うと上手くできるように思いました。

具体的には、まず描画は全てDrawModiGraphを使用し、処理は一点にまとめておきます。
(このとき自分の場合だと、拡大率・輝度・回転角度などを詰めたDrawInfoクラスを引数に渡しています。
 そして、このDrawInfoの情報を元にして4点の座標を計算します)
そうしておけば、全体の平行移動や拡大縮小や回転などはDrawModiGraphの4点の座標を再計算するだけで済みます。
処理速度的には現在のハードウェアであれば他のDraw系命令を呼ぶのと変わらないか、あるいは速いはずです。

なお、描画には等倍であればDrawModiGraphを、等倍でなければDrawModiGraphFを使用するときれいに描画されます。


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



Name: 九ワット  ..ぴよぴよ(43ポイント)   Date: 2009/06/02(火) 11:23   No:34397       
Title: 龍神録に使われてる画像について    
どこで公開してますか?
2面や3面のボスの背景画像等が特に知りたいので
教えてほしいです


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


Name: Dixq (管理人) [URL]  ..ウィザード(1,025,992ポイント)   Date: 2009/06/02(火) 22:10   No:34410     
Title: Re:龍神録に使われてる画像について    
http://www.google.co.jp/search?hl=ja&q=%E5%B9%BB%E6%83%B3%E7%B4%A0%E6%9D%90&meta=lr%3D&aq=f
この辺でヒットする

素材屋 篝火幻燈様
http://ryusyou.fc2web.com/

DreamFactory様
http://www.iriko34.com/

FirstMoon様
http://www.first-moon.com/

が好きでよく拝見します。
この辺をご覧になってみてはいかがでしょうか。


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

Name: 九ワット  ..ぴよぴよ(2ポイント)   Date: 2009/06/03(水) 04:38   No:34449 解決!     
Title: Re:龍神録に使われてる画像について    
Dixq (管理人)様
猛烈にありがとうございます!
参考にさせていただきます!


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



Name: ユーリ  ..ぴよぴよ(694ポイント)   Date: 2009/06/02(火) 20:33   No:34404       
Title: 無題    
キーボードから整数n(2〜20の間)を入力する。割る数をwとして、nの値から始めて1ずつ減らしながら
割る数が1になるまで、割り切れる値をすべて表示する。
という問題なんですがどのようにしたらよいのでしょうか?


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


Name: 山崎  ..中級者(9,277ポイント)   Date: 2009/06/02(火) 20:55   No:34405     
Title: Re:無題    
こんばんは。

う〜ん、学校の課題でしょうか?
とりあえず自分でやってみて、
「このようにやってみたのですが、こんなエラーが出て上手くいかないのですがどうしたらいいのでしょう」
って感じで質問すると答えるほうも心証が良いかもしれませんね。
利用規約の中にあるとおり、学校の課題なのかどうかとか、どのくらいのCの知識があるのかを
明記していただければ、答えるほうも答えやすいですね。
ってすいません、最初から説教じみてしまい…

大まかな流れとしては、

1.変数wを宣言し、初期値を入れておく。
2.キーボードから入力した値を変数nに格納する。
3.繰り返し構文の中で、wと「nを1ずつ減らしていった値」の割り算の余りを求める。
4.その余りが0ならば、割り切れる数として表示する。

って感じでしょうか。
このようにすれば大体できると思います。


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

Name: box  ..ハッカー(140,867ポイント)   Date: 2009/06/02(火) 21:02   No:34406     
Title: Re:無題    
> 割る数が1になるまで、割り切れる値をすべて表示する。

「割り切れる値」の定義は明確ですか?
例えば、6÷2=3のとき、
出力したい値は何ですか?


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

Name: ユーリ  ..ぴよぴよ(940ポイント)   Date: 2009/06/02(火) 22:05   No:34409     
Title: すいませんでした    
これは学校の課題です
それでですね
#include <stdio.h>

main()

{
int a,i,n,w;
printf("nを入力してください\n");
scanf("%d",&n);
scanf("%d",&w);
if(n>=2&&n<=20){
}
else{
printf("error!");
}

for(i=n;n>=2&&n<=20;n--){
a=w%n;
}
if(a==0){
printf("w%n=%d\n",a);
}

return 0;

}
ここまで作ってみたんですがエラーが出てしまいます。
アドバイスの方をお願いします。


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

Name: 山崎  ..中級者(9,954ポイント)   Date: 2009/06/02(火) 23:13   No:34421     
Title: Re:すいませんでした    
う〜ん、コードを貼る時はpreタグでコード部分を囲ったほうが見やすいですね。利用規約のとおりです。
まぁ、この掲示板に初めて来た人なら見落とすこともあるでしょう…次回があればお気をつけください。

まず、メイン関数の最初
int main()
の「int」が抜けてますね。

最初のif文の
if(n>=2 && n<=20)
ですが、ここではキーボードから入力された値が、適正な範囲にあるかどうかを判別したいのですよね。
値が適正な範囲にない場合だけ"error!"を表示すればいいのですから、
このif文は「nが適正な範囲にない」ことを検出するようにしたほうが良いでしょう。
そうすれば、else文を用いなくても、値の範囲が正しければ次の処理に移ることができます。
あと、もし値が適正な範囲にない場合は、"error!"を表示した後にプログラムを終了させるなどの処理をしてはいかがでしょう。

次のfor文ですが、カウンタiの値の範囲が妙なことになってますね。
一応、処理がこのfor文にたどり着くということはnの値が適正な範囲にあるとわかったわけですから、
&&n<=20
は要りません。

このfor文の中で、wと「nを1ずつ減らしていった値」の割り算の余りを求めるといいでしょう。
貼っていただいたコードを見ると、まずw%nの値をaにいったん格納し、
その後aの値が0かどうか判断しているようですね。
これでもいいのですが、w%nの値を直接if文で判別に用いても大丈夫です。

最後のif文の中なのですが、
if(a==0)
printf("w%n=%d\n",a);
これですと、表示されるaの値は0だけになってしまいますが、よろしいのでしょうか?
このif文の中に来るということはa==0が成り立っているのですから、当然表示されるaの値は0です。

いろいろ試行錯誤をしてがんばってみてください、
プログラミングの上達には、失敗が欠かせません。


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

Name: ユーリ  ..ぴよぴよ(998ポイント)   Date: 2009/06/03(水) 00:53   No:34435     
Title: 無題    
割る数をwとして、nの値から始めて1ずつ減らしながら
割る数が1になるまで、割り切れる値をすべて表示する。
この部分がいまいちどうしてもわかりません
ヒントをもらえないでしょうか?


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

Name: 山崎  ..中級者(10,381ポイント)   Date: 2009/06/03(水) 01:18   No:34437     
Title: Re:無題    
がんばってますね〜、その調子です。

「nの値から始めて、nを1ずつ減じながら、n=1になるまで繰り返す」という処理は、

for(i=n ; 1<i ; i--)
{
//ここに繰り返したい処理を書く
}

こんなfor文になります。

「wを割り切るiの値を表示する」には、
まず「iがwを割り切るかどうか」を判定しなければいけません。
iがwを割り切るかどうかは、wからiを割った余りが0になるかどうかである事はわかりますね?
つまりif文で、w÷iの余りが0になるかどうかを判別すればいいわけです。
具体的に書くと、
if(w%i==0)
ですね。
この式が成り立つときにiの値を表示すればいいので、
このif文の中にprintfでiを表示させるとよいでしょう。

このif文をさっきのfor文の{}の中で繰り返せばいいので、


for(i=n ; 1<i ; i--)
{
if(w%i==0)
printf("w=%d を割り切る値は %d\n",w,i);
}


とでもすると良いでしょう。


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

Name: ユーリ  ..かけだし(1,055ポイント)   Date: 2009/06/03(水) 01:29   No:34439 解決!     
Title: ありがとうございました    
ありがとうございました!
ご丁寧に解説していただき、大変助かりました。
今後も頑張っていきたいと思います。


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

Name: pooka [URL]  ..入門者(4,352ポイント)   Date: 2009/06/03(水) 01:30   No:34440     
Title: Re:無題    
wの値はどのように変化するかイメージしてみてください。
nの値から始めるということなのでwの初期値はn、
割る数が1になるまでということはwが1になるまで、1ずつ減らす
これをfor文を使うと例えば
for(w=n;1<=w;w--)
こんな感じになります。
割り切れる値はn%wの値が0になる時なのでそれをif文の条件とします。
そしてその時に割り切れる値、つまりwの値を表示するようにすればいいと思います。


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

Name: pooka [URL]  ..入門者(4,454ポイント)   Date: 2009/06/03(水) 01:37   No:34441     
Title: Re:無題    
すでに解決されたみたいですね・・・

ちょっと思ったんですが
>割る数をwとして、nの値から始めて1ずつ減らしながら割る数が1になるまで
とあるので、
>nの値から始めて、nを1ずつ減じながら、n=1になるまで繰り返す
というのとは違うのではないでしょうか?


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

Name: 山崎  ..中級者(10,469ポイント)   Date: 2009/06/03(水) 01:42   No:34443     
Title: Re:無題    
pookaさん

私もfor(i=n;1<=i;i--)かなぁと最初に思ったのですが、
整数を1で割っても必ず余りは0になるので、
この場合に関してはこの課題は必要としていないのでは?と考えました。
もし、この課題を出した先生がn==1の場合の結果も必要としていたのなら申し訳ないことをしてしまいました。


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

Name: ユーリ  ..かけだし(1,081ポイント)   Date: 2009/06/03(水) 01:54   No:34444     
Title: Re:無題    
みなさんありがとうございます。
詳細は学校で確かめます。
本当にありがとうございました。


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

Name: pooka [URL]  ..入門者(4,583ポイント)   Date: 2009/06/03(水) 01:57   No:34445     
Title: Re:無題    
う〜ん・・・
一応今作ったものを載せてみます。

#include <stdio.h>

int main(){
int n,w;
printf("nの値を入力してください\n");
scanf("%d",&n);

if(2 <= n && n <= 20){
for(w=n;0<w;w--)
if(n%w == 0)
printf("割り切れる数は%dです。\n",w);
}else
printf("入力エラー\n");

return 0;
}


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

Name: フリオ  ..プログラマー(29,503ポイント)   Date: 2009/06/03(水) 02:06   No:34447     
Title: Re:無題    
 
>整数を1で割っても必ず余りは0になるので、
>この場合に関してはこの課題は必要としていないのでは?と考えました。

 約数を全て書き出せ。
ということではないでしょうか。
それなら、1とその数自身も含まれます。
 


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



Name: cc  ..ぴよぴよ(473ポイント)   Date: 2009/06/01(月) 04:27   No:34330       
Title: 順番に表示したのですが    
下のプログラムを改良してエンターを押すごとに
A→AB→ABC→ABCD
という風に順番に表示させたい。
しかし、下のままだと、ABCDというように、1回押すだけで一気に表示されてしまいます。
どうすればよいでしょうか?


#include "DxLib.h"

int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){
ChangeWindowMode(TRUE);
if(DxLib_Init() == -1 || SetDrawScreen( DX_SCREEN_BACK )!=0) return -1;

int col1 = GetColor(255, 255, 255);
char input[4];
int i = 0;

while(ProcessMessage()==0 && CheckHitKey(KEY_INPUT_ESCAPE)==0){
if(CheckHitKey(KEY_INPUT_RETURN)){
switch(i){
case 0:
input[i] = 'A';
break;
case 1:
input[i] = 'B';
break;
case 2:
input[i] = 'C';
break;
case 3:
input[i] = 'D';
break;
}
i++;
}
if(CheckHitKey(KEY_INPUT_SPACE)){
ClearDrawScreen();
DrawString(0, 0, input, col1);
}


ScreenFlip();
}

DxLib_End();
return 0;
}



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


Name: MNS  ..初心者(8,641ポイント)   Date: 2009/06/01(月) 06:15   No:34331     
Title: Re:順番に表示したのですが    
たぶん、エンターキーを押して、すぐ離したとしても、
4回以上はエンターキーが押されたことになってしまってるんだと思います。
適当にインターバルをつけると良いと思います。
int interval = 0;

if(CheckHitKey(KEY_INPUT_RETURN) && interval % 10 == 0)

++interval;
など。


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

Name: Dixq (管理人)  ..ウィザード(1,025,831ポイント)   Date: 2009/06/01(月) 08:23   No:34332     
Title: Re:順番に表示したのですが    
ゲームの館にどれ位キー入力があったか調べる方法が書いてあるのでよければ参考にしてください。

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

Name: kazuoni [URL]  ..比類無きプログラマー(88,650ポイント)   Date: 2009/06/01(月) 13:00   No:34337     
Title: Re:順番に表示したのですが    
CheckHitKey()はキー入力があれば1、なければ0なんで、
MNSさんもおっしゃっていますが、
ループはものすごく速いので、
一回押したつもりでも、プログラムは数十ループぐらいしてます。
(ウェイト機能がなければ)

http://dixq.net/g/#40のキー監査を使うと
キー監査用配列をKey[256]とすると、

if(Key[KEY_INPUT_RETURN]==1)

なんて使えて便利ですよ。



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

Name: cc  ..ぴよぴよ(296ポイント)   Date: 2009/06/02(火) 06:29   No:34389     
Title: Re:順番に表示したのですが    
GetHitKeyStateAll_2を使ったらうまくいきました。
ありがとうございました。

上のプログラムとはまた別の話になってしまうのですが、GetHitKeyStateAll_2の使い方についてです。

int Key[256];

while(GetHitKeyStateAll_2(Key)==0 && Key[KEY_INPUT_ESCAPE]==0){
if(Key[KEY_INPUT_RIGHT]==1) state = 1;
if(Key[KEY_INPUT_RETURN]==1) state = 2;
if(Key[KEY_INPUT_SPACE]==1) state = 3;
}

switch(state){
case 1:
.......
case 2:
.......
case 3:
.......
}

caseのところは省略

上のようなプログラムを作ろうとしているんですが、キーが押されてもなにも処理が行われませんでした。
CheckHitKeyを用いてやってみたらうまくいきました。
GetHitKeyStateAll_2の使い方が間違っていると思うのですが、どこが間違っているのかわかりません。
ご指摘願います。



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

Name: kazuoni [URL]  ..比類無きプログラマー(88,630ポイント)   Date: 2009/06/02(火) 15:35   No:34400     
Title: Re:順番に表示したのですが    
上の記述だと、キーを押しても、
エスケープが押されるまでは永遠とループしているからではないですか?



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

Name: cc  ..ぴよぴよ(365ポイント)   Date: 2009/06/02(火) 22:41   No:34417     
Title: Re:順番に表示したのですが    
while(GetHitKeyStateAll_2(Key)==0 && Key[KEY_INPUT_ESCAPE]==0)
の部分を
if(GetHitKeyStateAll_2(Key)==0)
としたらうまくいったみたいなんですが、どうでしょうか?


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

Name: kazuoni [URL]  ..比類無きプログラマー(88,640ポイント)   Date: 2009/06/02(火) 22:46   No:34418     
Title: Re:順番に表示したのですが    
&&=ANDですので、
GetHitKeyStateAll_2(Key)==0
かつ
Key[KEY_INPUT_ESCAPE]==0
のとき、ループするって意味です。

GetHitKeyStateAll_2の役割によって、エスケープが押されていなければ、
Key[KEY_INPUT_ESCAPE]は常にゼロです。
なので何も起こらなかった
(正確には、永遠とループしていた)
ということが起きていました。

#どんな処理を採用したか分からないですけど、
#GetHitKeyStateAll_2の戻り値は常に0ですので^^;


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

Name: cc  ..ぴよぴよ(500ポイント)   Date: 2009/06/02(火) 23:06   No:34420     
Title: Re:順番に表示したのですが    
すいません。
具体的にどうすればよいのでしょう。
自分には難しすぎて・・・
すみません。


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

Name: kazuoni [URL]  ..比類無きプログラマー(88,937ポイント)   Date: 2009/06/03(水) 00:14   No:34428     
Title: Re:順番に表示したのですが    
もう一度基礎をしっかり復習したほうがいいかもしれませんね。。
以下の挙げる者が分かれば、今回のことは理解できるはずです。
・各演算子のもつ性質
・各条件分岐のフローチャート
・関数(の戻り値)

これらは今後プログラムを組む時には必ず出てきます。
(まだまだたくさんありますが・・・)
急がば回れって事ですかね^^;

ちょっと困っていそうな所を想像で考えてみます^^;
GetHitKeyStateAll_2の置き場っと勝手に判断します。
おそらく、ccさんは管理人さんのゲームプログラミングの館を見てきたんだと思います。
その時に、なんとなくかいつまんでコピペしていたら、
while文の中にキー監査があるから、
これを見習って・・・て感じかもしれないです。
whileの条件にキー監査を記述する理由は(恐らくですが)
「ゲームループ毎に必ず呼び出す関数」
と明示したかったからこの形をしているんだと思います。
なので、GetHitKeyStateAll_2の置く場所はループ毎に必ず通るところなら
どこに記述してもよいです。
ただ、見やすさとしては、管理人さんのサンプルが見やすいとは思いますが。

今回のプログラムのサンプル作ってみましたので、参考にしてみてください。

#話がずれたかも・・・しれないです。勝手に想像しなければよかったorz


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

Name: cc  ..ぴよぴよ(567ポイント)   Date: 2009/06/03(水) 00:52   No:34434 解決!     
Title: Re:順番に表示したのですが    
kazuoniさんの想像通りです。
管理人のプログラムを参考にして作りました。
kazuoniさんにご指摘いただいた3つのことをしっかり復習したいと思います。
本当に丁寧に教えていただいてありがとうございました。


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



Name: ひよこ  ..プログラマー(35,607ポイント)   Date: 2009/06/02(火) 06:30   No:34390       
Title: 龍神録の館ついて    
Dixqさんへ
みょん弾幕をいじってたらきづいたのですが間違いですね。


//みょん弾幕
void shot_bullet_H007(int n){
int t=shot[n].cnt;
int k;
if(t>=0 && t<=150 && t%10==0){
for(int i=0;i<20;i++){
if(shot[n].flag!=2 && (k=shot_search(n))!=-1){
shot[n].bullet[k].knd =7;
shot[n].bullet[k].angle =PI2/20*i;
shot[n].bullet[k].flag =1;
shot[n].bullet[k].x =enemy[shot[n].num].x+cos(PI/2+PI/150*t)*100;
shot[n].bullet[k].y =enemy[shot[n].num].y+sin(PI/2+PI/150*t)*100;
shot[n].bullet[k].col =2;
shot[n].bullet[k].cnt =0;
shot[n].bullet[k].spd =1.2;
}
}
for(int i=0;i<20;i++){
if(shot[n].flag!=2 && (k=shot_search(n))!=-1){
shot[n].bullet[k].knd =7;
shot[n].bullet[k].angle =PI2/20*i;
shot[n].bullet[k].flag =1;
shot[n].bullet[k].x =enemy[shot[n].num].x+cos(PI/2-PI/150*t)*100;
shot[n].bullet[k].y =enemy[shot[n].num].y+sin(PI/2-PI/150*t)*100;
shot[n].bullet[k].col =4;
shot[n].bullet[k].cnt =0;
shot[n].bullet[k].spd =1.2;
se_flag[0]=1;
}
}
}
}

じゃなくて

//みょん弾幕
void shot_bullet_H007(int n){
int t=shot[n].cnt;
int k;
if(t>=0 && t<=150 && t%10==0){
for(int i=0;i<20;i++){
if(shot[n].flag!=2 && (k=shot_search(n))!=-1){
shot[n].bullet[k].knd =7;
shot[n].bullet[k].angle =PI2/20*i;
shot[n].bullet[k].flag =1;
shot[n].bullet[k].x =enemy[shot[n].num].x+cos(PI/2+PI/150*t)*100;
shot[n].bullet[k].y =enemy[shot[n].num].y+sin(PI/2+PI/150*t)*100;
shot[n].bullet[k].col =2;
shot[n].bullet[k].cnt =0;
shot[n].bullet[k].spd =1.2;
}
}
for(int i=0;i<20;i++){
if(shot[n].flag!=2 && (k=shot_search(n))!=-1){
shot[n].bullet[k].knd =7;
shot[n].bullet[k].angle =PI2/20*i;
shot[n].bullet[k].flag =1;
shot[n].bullet[k].x =enemy[shot[n].num].x-cos(PI/2-PI/150*t)*100;
shot[n].bullet[k].y =enemy[shot[n].num].y+sin(PI/2-PI/150*t)*100;
shot[n].bullet[k].col =4;
shot[n].bullet[k].cnt =0;
shot[n].bullet[k].spd =1.2;
se_flag[0]=1;
}
}
}
}

じゃないと実行結果みたいにならないです。


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


Name: b  ..ぴよぴよ(28ポイント)   Date: 2009/06/02(火) 08:44   No:34391     
Title: Re:龍神録の館ついて    
どこが違うのか、ソースだけではなく日本語での説明も加えたほうが親切だと思いますよ。

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

Name: toyo  ..プログラマー(35,824ポイント)   Date: 2009/06/02(火) 09:49   No:34393     
Title: Re:龍神録の館ついて    
私が見比べたところ違うのは
                                shot[n].bullet[k].x     =enemy[shot[n].num].x-cos(PI/2-PI/150*t)*100;

だけでしょうか


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

Name: ひよこ  ..プログラマー(35,677ポイント)   Date: 2009/06/02(火) 18:41   No:34402     
Title: Re:龍神録の館ついて    
わかりづらくてすみません、
shot[n].bullet[k].x =enemy[shot[n].num].x+cos(PI/2-PI/150*t)*100;が二つあって
二つの方向に別れないと言いたいのです。
よって
上のソースみたいになります。


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

Name: Dixq (管理人) [URL]  ..ウィザード(1,026,014ポイント)   Date: 2009/06/02(火) 22:11   No:34411     
Title: Re:龍神録の館ついて    
ありがとうございます。すみません、明日見てみます;

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

Name: yu  ..プログラマー(28,216ポイント)   Date: 2009/06/02(火) 22:25   No:34412     
Title: Re:龍神録の館ついて    
あれ?・・・

回転方向が逆だから別れるのではないでしょうか?


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

Name: ひよこ  ..プログラマー(35,813ポイント)   Date: 2009/06/02(火) 22:34   No:34413     
Title: Re:龍神録の館ついて    
ホームページには
shot[n].bullet[k].x =enemy[shot[n].num].x+cos(PI/2-PI/150*t)*100;が二つあって、
実際には
shot[n].bullet[k].x =enemy[shot[n].num].x+cos(PI/2-PI/150*t)*100;がひとつと
shot[n].bullet[k].x =enemy[shot[n].num].x-cos(PI/2-PI/150*t)*100;がひとつないと
別れないとそういう意味です。


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

Name: ひよこ  ..プログラマー(35,850ポイント)   Date: 2009/06/02(火) 22:37   No:34415     
Title: Re:龍神録の館ついて    
yuさん
>>すみません。きっとわかりづらいでしょうね。
>>ホームページにあるソースを実行すればすぐに答えがわかると思います。


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

Name: KY  ..ぴよぴよ(31ポイント)   Date: 2009/06/02(火) 22:37   No:34416     
Title: Re:龍神録の館ついて    
だからyuさんの言う通り、回転方向が逆だから+で問題無い。
やってみましたけど、コードに間違いはないですね。

それから指摘する時は「間違いですね」じゃなくて「ひょっとしたら間違いでしょうか?」
位の方が常識的ですね。


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

Name: ひよこ  ..プログラマー(36,575ポイント)   Date: 2009/06/02(火) 23:22   No:34422     
Title: Re:龍神録の館ついて    
ソースを見てみるとひょっとしたら間違いでしょうか?
自分が間違いでした。
しかし、上のようにやって(ボスの弾幕にしてみると改造ミスです…
下のようなソースになったので・・・(まあよくいみもわからないまま・・・すみません

void boss_shot_bulletH031(){
#define TM031 200
int i,k,t=boss_shot.cnt%TM030;

if(t>=0 && t<=150 && t%10==0){
for(int i=0;i<20;i++){
if((k=search_boss_shot())!=-1){
boss_shot.bullet[k].col = 2;//弾の色
boss_shot.bullet[k].x = boss.x+cos(PI/2+PI/150*t)*100;//座標
boss_shot.bullet[k].y = boss.y+sin(PI/2+PI/150*t)*100;
boss_shot.bullet[k].knd = 7;//弾の種類
boss_shot.bullet[k].angle = PI2/20*i;//円形60個
boss_shot.bullet[k].flag = 1;
boss_shot.bullet[k].cnt = 0;
boss_shot.bullet[k].spd = 1.2;//スピード
se_flag[0]=1;//発射音鳴らす
}
}
for(int i=0;i<20;i++){
if((k=search_boss_shot())!=-1){
boss_shot.bullet[k].col = 4;//弾の色
boss_shot.bullet[k].x = boss.x-cos(PI/2+PI/150*t)*100;//座標
boss_shot.bullet[k].y = boss.y+sin(PI/2+PI/150*t)*100;
boss_shot.bullet[k].knd = 7;//弾の種類
boss_shot.bullet[k].angle = PI2/20*i;//円形60個
boss_shot.bullet[k].flag = 1;
boss_shot.bullet[k].cnt = 0;
boss_shot.bullet[k].spd = 1.2;//スピード
se_flag[0]=1;
}
}
}
}

あとで簡単に考えてみると計算結果が同じになるようです。
だから同じ動きに見えて・・・
すみませんでした。


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

Name: すずめ  ..入門者(2,544ポイント)   Date: 2009/06/02(火) 23:27   No:34423     
Title: Re:龍神録の館ついて    
ひよこさんのいうようにやってみたら、
左半分しか描画されなかったです。
重なって描画されているんじゃないかと思って
ひとつだけPI/150をPI/140にしたら
みごとに重なって描画されました。
ひよこさんの勘違いみたいですね。


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

Name: ひよこ  ..プログラマー(36,677ポイント)   Date: 2009/06/02(火) 23:39   No:34424 解決!     
Title: Re:龍神録の館ついて    
こんな勘違いで・・・いろいろとありがとうございます。
皆さん、本当にありがとうございました。


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



Name: ぬかづけ  ..かけだし(2,123ポイント)   Date: 2009/06/01(月) 00:35   No:34325       
Title: 40個のエラー    
自分は今、Vsiual C++でDXライブラリを使って
ここのシューティングゲーム館の講座を見ながら
シューティングゲームを作っていたのですが、
40ものエラーと2つの警告がでて困っています。

投稿時にエラーが出てしまいますので、ソースとエラーを分けて投稿します。
ソースは以下の通りです。

#include "DxLib.h"


int counter=0;
int color_white;
char Key[256];

//画像ファイルハンドル
int img_background;
int img_player;

//構造体
typedef struct{
double x,y;
int status,counter;
int shot [11][15];
} BODY_player_t;

BODY_player_t Player;


void img_sound_load(){
img_background = LoadGraph("試作地面.bmp");
img_player = LoadGraph("kame_usiro.bmp");
}

void initialization(){
Player.x=200.0;
Player.y=400.0;
Player.counter=0;
Player.status=0;
} //構造体の初期化

void SetColor(){
color_white = GetColor(255,255,255); //白色ハンドルを取得
}

void Background(){
DrawGraph(0,0,img_background,FALSE); //背景を描画
}

void PlayerControl(){
DrawGraph((int)Player.x,(int)Player.y,img_player,TRUE);//プレイヤーを描画
}


void FpsTimeFanction(){
static int FpsTime[2]={0,},FpsTime_i=0;
static double Fps=0.0;

if(FpsTime_i== 0)
FpsTime[0]=GetNowCount(); //1周目の時間取得
if(FpsTime_i==49){
FpsTime[1]=GetNowCount(); //50周目の時間取得
Fps = 1000.0f / ((FpsTime[1] - FpsTime[0]) / 50.0f);//測定した値からfpsを計算
FpsTime_i=0;
}
else
FpsTime_i++; //現在何周目かカウント
if(Fps != 0)
DrawFormatString(565,460,color_white,"FPS %.1f",Fps); //fpsを表示
return;
}

int WINAPI WinMain( HINSTANCE hInstance,
HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){
int RefreshTime=0;

ChangeWindowMode( TRUE ) ;
if( DxLib_Init() == -1 ) return -1;

SetDrawScreen( DX_SCREEN_BACK ) ; //裏画面を使用する。

img_sound_load(); //画像ファイルをロード
initialization(); //初期化
SetColor(); //色を取得

while(ProcessMessage() == 0 && GetHitKeyStateAll(Key) == 0){
RefreshTime = GetNowCount(); //今の時間を取得
ClearDrawScreen(); //裏画面のデータを全て削除

Background(); //背景描画

PlayerControl(); //プレイヤー描画

FpsTimeFanction(); //FPS計算

ScreenFlip() ; //裏画面データを表画面へ反映

counter++;

if(Key[KEY_INPUT_ESCAPE]==1) break; //Escapeが押されたら終了
while(GetNowCount() - RefreshTime < 17); //1周の処理が17ミリ秒になるまで待つ
}

DxLib_End() ;
return 0 ;
}





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


Name: ぬかづけ  ..入門者(3,564ポイント)   Date: 2009/06/01(月) 00:36   No:34326     
Title: 続40個のエラー    
引き続きエラーと警告です。



<エラー>
error LNK2005: __CrtSetCheckCount は既に MSVCRTD.lib(MSVCR90D.dll) で定義されています。
error LNK2005: _exit は既に MSVCRTD.lib(MSVCR90D.dll) で定義されています。
error LNK2005: __exit は既に MSVCRTD.lib(MSVCR90D.dll) で定義されています。
error LNK2005: __cexit は既に MSVCRTD.lib(MSVCR90D.dll) で定義されています。
error LNK2005: __amsg_exit は既に MSVCRTD.lib(MSVCR90D.dll) で定義されています。
error LNK2005: __initterm_e は既に MSVCRTD.lib(MSVCR90D.dll) で定義されています。
error LNK2005: _fflush は既に MSVCRTD.lib(MSVCR90D.dll) で定義されています。
error LNK2005: __crt_debugger_hook は既に MSVCRTD.lib(MSVCR90D.dll) で定義されています。
error LNK2005: __invoke_watson は既に MSVCRTD.lib(MSVCR90D.dll) で定義されています。
error LNK2005: __configthreadlocale は既に MSVCRTD.lib(MSVCR90D.dll) で定義されています。
error LNK2005: __encode_pointer は既に MSVCRTD.lib(MSVCR90D.dll) で定義されています。
error LNK2005: __decode_pointer は既に MSVCRTD.lib(MSVCR90D.dll) で定義されています。
error LNK2005: _sprintf は既に MSVCRTD.lib(MSVCR90D.dll) で定義されています。
error LNK2005: ___xi_a は既に MSVCRTD.lib(cinitexe.obj) で定義されています。
error LNK2005: ___xi_z は既に MSVCRTD.lib(cinitexe.obj) で定義されています。
error LNK2005: ___xc_a は既に MSVCRTD.lib(cinitexe.obj) で定義されています。
error LNK2005: ___xc_z は既に MSVCRTD.lib(cinitexe.obj) で定義されています。
error LNK2005: "void __cdecl terminate(void)" (?terminate@@YAXXZ) は既に MSVCRTD.lib(MSVCR90D.dll) で定義されています。
error LNK2005: __XcptFilter は既に MSVCRTD.lib(MSVCR90D.dll) で定義されています。
error LNK2005: __lock は既に MSVCRTD.lib(MSVCR90D.dll) で定義されています。
error LNK2005: __unlock は既に MSVCRTD.lib(MSVCR90D.dll) で定義されています。
error LNK2005: _vsprintf は既に MSVCRTD.lib(MSVCR90D.dll) で定義されています。
error LNK2005: ___set_app_type は既に MSVCRTD.lib(MSVCR90D.dll) で定義されています。
error LNK2005: __CrtDbgReportW は既に MSVCRTD.lib(MSVCR90D.dll) で定義されています。
error LNK2005: "public: void __thiscall type_info::_type_info_dtor_internal_method(void)" (?_type_info_dtor_internal_method@type_info@@QAEXXZ) は既に MSVCRTD.lib(MSVCR90D.dll) で定義されています。
error LNK2005: "private: __thiscall type_info::type_info(class type_info const &)" (??0type_info@@AAE@ABV0@@Z) は既に MSVCRTD.lib(ti_inst.obj) で定義されています。
error LNK2005: "private: class type_info & __thiscall type_info::operator=(class type_info const &)" (??4type_info@@AAEAAV0@ABV0@@Z) は既に MSVCRTD.lib(ti_inst.obj) で定義されています。
error LNK2005: _getenv は既に MSVCRTD.lib(MSVCR90D.dll) で定義されています。
error LNK2005: _abort は既に MSVCRTD.lib(MSVCR90D.dll) で定義されています。
error LNK2019: 未解決の外部シンボル _jtransform_execute_transformation が関数 _main で参照されました。
error LNK2019: 未解決の外部シンボル _jcopy_markers_execute が関数 _main で参照されました。
error LNK2019: 未解決の外部シンボル _jtransform_adjust_parameters が関数 _main で参照されました。
error LNK2019: 未解決の外部シンボル _jtransform_request_workspace が関数 _main で参照されました。
error LNK2019: 未解決の外部シンボル _jcopy_markers_setup が関数 _main で参照されました。
error LNK2019: 未解決の外部シンボル _write_stdout が関数 _main で参照されました。
error LNK2019: 未解決の外部シンボル _read_stdin が関数 _main で参照されました。
error LNK2019: 未解決の外部シンボル _read_scan_script が関数 _parse_switches で参照されました。
error LNK2019: 未解決の外部シンボル _keymatch が関数 _parse_switches で参照されました。
fatal error LNK1120: 外部参照 9 が未解決です。



<警告>
warning LNK4098: defaultlib 'MSVCRTD' は他のライブラリの使用と競合しています。/NODEFAULTLIB:library を使用してください。
warning LNK4098: defaultlib 'LIBCMTD' は他のライブラリの使用と競合しています。/NODEFAULTLIB:library を使用してください。


自分はほぼ初心者で、大学のサークルの先輩に聞いてみても分からないと言われてしまいました。
どうやったらエラーが消えるのでしょうか?

※追記
質問文に足らない情報がありましたら、ご指摘お願いします。


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

Name: 御津凪 [URL]  ..比類無きプログラマー(92,091ポイント)   Date: 2009/06/01(月) 00:42   No:34327     
Title: Re:続40個のエラー    
エラー・警告双方とも、プロジェクトの ランタイム ライブラリ の設定が正しくないため発生しています。

DXライブラリの使い方の説明のページで、プロジェクトの設定の項目を見直してください。


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

Name: ぬかづけ  ..入門者(3,588ポイント)   Date: 2009/06/01(月) 22:37   No:34362     
Title: Re:続40個のエラー    
別のDXライブラリを使ったプログラムは動くので
設定はあってると思うのですが…。


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

Name: 御津凪 [URL]  ..比類無きプログラマー(92,462ポイント)   Date: 2009/06/01(月) 23:50   No:34378     
Title: Re:続40個のエラー    
プロジェクトのプロパティで、
C/C++ → コード生成 にある、ランタイム ライブラリの項目がきちんと設定されているでしょうか?

デバッグ版(Debug)では 「マルチスレッド デバッグ (/MTd)」、
リリース版(Release)では 「マルチスレッド (/MT)」

に、なっていなければなりません。


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

Name: toyo  ..プログラマー(35,695ポイント)   Date: 2009/06/02(火) 05:53   No:34386     
Title: Re:続40個のエラー    
>設定はあってると思うのですが…。
新しくプログラムを作るごとに設定が必要です


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

Name: むかづけ  ..ぴよぴよ(29ポイント)   Date: 2009/06/02(火) 21:50   No:34408 解決!     
Title: Re:続40個のエラー    
確認してみたら、プロジェクトの設定が間違ってたようです。
正常に動作しました。
ありがとうございます。
お手数を掛けてすいませんでした。


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



Name: bitter_orange  ..かけだし(1,465ポイント)   Date: 2009/06/02(火) 10:15   No:34395       
Title: ファイルのビット操作について    
お世話になっております。
C言語でゲームを作っていてセーブ機能を作っているときにわからないことがあったので質問させていただきました。
ファイルをfwrite関数やfread関数で読み書きをしていて、セーブをしたい内容をセーブ専用の構造体にいれています。
その後、セーブ専用の構造体を作り、数値を入れ、それをfwrite関数やfread関数でファイル入出力しています。
その時バイナリモードで入出力していますが、念のため暗号化をしようと思いビット操作することにしました。
一番手軽にできそうな構造体の中身を全て反転ビットをさせようと思ったのですが効率的な方法が思いつきません。
もちろん下記のようにすればできるのですがセーブしたい変数の量が多くなってしまった時や入出力したい構造体の変数に
自作の構造体があった時などに非常に大変になってしまうので、できれば避けたいです。
例)
dat.suuti = ~suuti;
dat.abc.suuti2 = ~abc.suuti2;
これ以外の方法でビット操作する方法はないでしょうか?

動作するプログラムをここに書くとあまりにも長くなってしまうためは添付しておきます。

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

よろしくお願いします。


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


Name: 御津凪 [URL]  ..比類無きプログラマー(92,606ポイント)   Date: 2009/06/02(火) 10:55   No:34396     
Title: Re:ファイルのビット操作について    
こんな感じでデータをまとめてビット操作できますよ。
void crypt( void* data, unsigned int size, unsigned char code ){

unsigned char* ch = (unsigned char*)data;
unsigned char* ch_end = ch + size;
while(ch < ch_end){
*ch ^= code;
++ch;
}
}


(暗号化は指定ビットのみ反転できるように code を用意しました)


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

Name: bitter_orange  ..かけだし(1,747ポイント)   Date: 2009/06/02(火) 13:52   No:34399 解決!     
Title: Re:ファイルのビット操作について    
そんな方法があったのですね。
汎用ポインタとunsigned charを使ったことがなかったのでこの考え方はできませんでした。
この方法なら、float型も暗号化して入出力できますし、セーブ構造体の中に構造体があってもmemcpy関数を使うことができますね。
御津凪様ありがとうございました。


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



Name: H  ..ぴよぴよ(14ポイント)   Date: 2009/06/01(月) 09:53   No:34333       
Title: char型の16進数の配列を変換    
[´B´][´4´]の配列を
0XB4 としたいのですがどのようにすれば良いでしょうか?
逆の場合はsprintfを使用し出来ました。

環境
Linux gcc


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


Name: non  ..熟練のプログラマー(44,815ポイント)   Date: 2009/06/01(月) 09:55   No:34334     
Title: Re:char型の16進数の配列を変換    
>[´B´][´4´]の配列を
意味がわかりませんので、補足してください。
文字列 "B4"ではないのですね。



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

Name: H  ..ぴよぴよ(40ポイント)   Date: 2009/06/01(月) 10:04   No:34335     
Title: Re:char型の16進数の配列を変換    
すいません!
文字列゛B4゛という事です。


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

Name: non  ..熟練のプログラマー(44,835ポイント)   Date: 2009/06/01(月) 10:11   No:34336     
Title: Re:char型の16進数の配列を変換    
strtol関数を調べてください。


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

Name: H  ..ぴよぴよ(46ポイント)   Date: 2009/06/02(火) 09:54   No:34394     
Title: Re:char型の16進数の配列を変換    
お礼が遅れました。
nonさん ありがとうございます。



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



Name: a  ..ぴよぴよ(635ポイント)   Date: 2009/06/02(火) 01:53   No:34384       
Title: 文字列について    
文字列を入力してその文字数を出力するプログラムで"for"や"if"を使った方法を教えてください。

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


Name: non  ..熟練のプログラマー(45,274ポイント)   Date: 2009/06/02(火) 08:45   No:34392     
Title: Re:文字列について    
まずは、ここでも読んで勉強してください。
http://www.kumei.ne.jp/c_lang/intro/no_25.htm




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



Name: チルチル  ..上級者(19,864ポイント)   Date: 2009/06/01(月) 22:34   No:34361       
Title: 描画系関数の縦の描画幅を調べる方法?    
DrawString関数
DrawFormatString関数
DrawStringToHandle関数
DrawFormatStringToHandle関数
で文字列を描画した場合の縦の描画幅を調べる方法は無いでしょうか?
見た感じサイズや太さを変えない限り一定に見えるんですが・・

環境はDXライブラリです


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


Name: Justy  ..伝説なるハッカー(366,194ポイント)   Date: 2009/06/01(月) 22:45   No:34364     
Title: Re:描画系関数の縦の描画幅を調べる方法?    
それぞれ

GetDrawStringWidth
GetDrawFormatStringWidth
GetDrawStringWidthToHandle
GetDrawFormatStringWidthToHandle

かな。


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

Name: チルチル  ..上級者(20,136ポイント)   Date: 2009/06/01(月) 22:50   No:34366     
Title: Re:描画系関数の縦の描画幅を調べる方法?    
これらの関数は描画時の横幅を取得する関数だと解釈していましたが
縦幅の取得はどのように行えばよいのでしょうか?


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

Name: Justy  ..伝説なるハッカー(366,283ポイント)   Date: 2009/06/01(月) 23:13   No:34368     
Title: Re:描画系関数の縦の描画幅を調べる方法?    
 あー、縦ですか。
 確認はしていませんんが、フォントサイズは目安になるのではないでしょうか。

GetFontSize( void ) ;
GetFontSizeToHandle( int FontHandle )


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

Name: チルチル  ..上級者(20,192ポイント)   Date: 2009/06/01(月) 23:40   No:34374     
Title: Re:描画系関数の縦の描画幅を調べる方法?    
う〜ん目安だとちょっと問題ありますね・・

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

Name: Justy  ..伝説なるハッカー(366,479ポイント)   Date: 2009/06/01(月) 23:52   No:34379     
Title: Re:描画系関数の縦の描画幅を調べる方法?    
 DXライブラリで横に文字を表示した時の縦のサイズを調べる方法は私は知らないので、
フォントサイズでダメなら、1文字1文字 GetTextMetrics()を使って調べるしかないかな、と思います。

GetTextMetrics 関数
ttp://msdn.microsoft.com/ja-jp/library/cc410403.aspx

文字情報
ttp://phys.cool.ne.jp/physjpn/htextmetric.htm


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

Name: チルチル  ..上級者(20,310ポイント)   Date: 2009/06/02(火) 00:59   No:34383 解決!     
Title: Re:描画系関数の縦の描画幅を調べる方法?    
あ〜これはちょっと無理ですね・・
フォントサイズより少し大きめにしておけば大丈夫かな・・

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


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



Name: チルチル  ..上級者(20,087ポイント)   Date: 2009/06/01(月) 22:47   No:34365       
Title: 文字列にグラデーションを付ける方法?    
隣のトビの内容に近いんですが
文字描画係関数で文字列を描画した場合
文字列全体が同じ色になってしまうので
縦方向にグラデーションを付けようと思ったのですが
どのような方法があるでしょうか?

私が唯一思いついたのは
画像をグニャグニャさせるサンプルのように
一行ずつ色を変化させて描画していく方法です

しかしこの方法は私が想像する限りでは
文字列の縦の描画幅が一定でない場合
効率が悪く関数化しにくいので
もっといい方法は無いでしょうか?

環境はDXライブラリです


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


Name: Justy  ..伝説なるハッカー(366,872ポイント)   Date: 2009/06/02(火) 00:16   No:34380     
Title: Re:文字列にグラデーションを付ける方法?    
いろいろ方法はあると思いますが、1例を挙げますと。



1 文字列を描画するのに十分な縦横のサイズを求める

2 そのサイズと同じ、あるいは以上の空テクスチャを作る(MakeScreen)

3 その空テクスチャをレンダリングターゲットにし(SetDrawScreen)、
背景黒(SetBackgroundColor)でクリア(ClearDrawScreen)後、
文字列を白で描画。
(これで文字が空テクスチャに描き込まれる)

4 乗算ブレンド(SetDrawBlendMode)でグラデーションのかかった
少し大きめのテクスチャを2で作ったテクスチャサイズに合うよう
スケーリングして描画。
(これで文字のところだけグラデーションがかかる)

5 レンダリングターゲットを元に戻し(SetDrawScreen)、
文字列を描いたテクスチャを普通に表示。



ってところでしょうか。

 他にもグラデーションを4でテクスチャで行うのではなく、
5で頂点カラーで行ったりする手もあります。

 要所要所で必要な関数は書いたのであとは適当に検索かけたりして調べてください。


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

Name: チルチル  ..上級者(20,248ポイント)   Date: 2009/06/02(火) 00:49   No:34382 解決!     
Title: Re:文字列にグラデーションを付ける方法?    
SetDrawScreen関数って表画面と裏画面以外も指定できたんですね・・
ちょっとやってみます


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



Name: pic  ..ぴよぴよ(635ポイント)   Date: 2009/06/01(月) 01:37   No:34329       
Title: 無題    
こんばんは。質問させてもらいます。
製作時に音が邪魔だったので、ChangeVolumeSoundMemで0を設定していたのですが、いざ音を出してみようと思い、設定を戻したのですが、音が鳴りません。
龍神録プログラミングの館を参考に作っていますので、中身はあまり変わりません。
試しにmusic_play()関数の下に

void music_play(){
se_flag[0] = 1;
int i;

のように設定して、試してみたところ、se_flag[3]以外音がなりませんでした。
どこが悪いのか探しているのですが、見つからなくて困っています。
どなたかアドバイスをお願いします。


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


Name: BEMANI  ..プログラマー(32,722ポイント)   Date: 2009/06/01(月) 23:30   No:34373     
Title: Re:無題    
>>picさん
どう見つけていいか解らないのでこちらも困ります。
情報が少なすぎるのでソースを載せるなどした方が良いと思います。
勝手に想像して書いてみます。

・フラグの立て忘れ
・音楽の読み込みミス(パスが違う・音楽自体を読み込んでいない等)
・音楽を鳴らす関数を呼んでいない
・サウンドがミュートになっている
・鳴らしている音楽の拡張子のせいでうまく鳴らない


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

Name: pic  ..かけだし(1,053ポイント)   Date: 2009/06/02(火) 00:31   No:34381     
Title: Re:無題    
BEMANIさん。返答ありがとうございます。

フラグは立てています。
音楽の読み込みも大丈夫です。
関数は毎回whileループで呼ばれるので、OKだと思います。
音は聞こえるようにしており、BGMは流れます。
拡張子はwavとmp3を使用しているので、大丈夫だと思います。


先ほど、バグを探すために色々試してみたのですが、
sound_se[SE_MAX] : se_flag[SE_MAX] : SE_MAXは100
これをSE_MAXの値を0 〜 10 くらいにして、フラグなどの状態を確かめてたのですが、
se_flag[3]とse_flag[9]のときは音がなりました。
後、なぜかSE_MAXを5にすると当たり判定がおかしくなります;;

変数sound_seをすべてse_soundに置換してみたらどの添字でも音は出るようになりました。
後、visual C++のブレークポイント?を使いフラグの値のチェックをしてみたところ、flagを立てていない場所に32などの値が入っていました。
値が入ってるにしても、se_flag[0] = 1 などの使い方をしているため、値は1しか入らないと思うのですが、これは関係ありますか?

SE_MAXをいじると当たり判定がおかしくなり、変数置換後も、ある条件下で当たり判定がおかしくなります。
なので、ソースを載せたいのですが、どこを載せたらいいのでしょうか。
一応配列は範囲内で使っております。



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



Name: チルチル  ..上級者(20,182ポイント)   Date: 2009/06/01(月) 22:55   No:34367       
Title: 色コードを三成分に分ける?    
GetColor関数で取得した色コードから
引数に渡した赤、緑、青の数値を知る方法はないでしょうか?

環境はDXライブラリです


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


Name: Justy  ..伝説なるハッカー(366,291ポイント)   Date: 2009/06/01(月) 23:15   No:34369     
Title: Re:色コードを三成分に分ける?    
GetColor2かな?

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

Name: tkmakwins15  ..比類無きプログラマー(96,669ポイント)   Date: 2009/06/01(月) 23:17   No:34371     
Title: Re:色コードを三成分に分ける?    
とりあえず非リファレンス掲載関数なので、プロトタイプを。

int GetColor2( int Color, int *Red, int *Green, int *Blue ) ;// 画面モードに対応した色データ値から個々の3原色データを抜き出す

これで使い方は大丈夫だと思います。


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

Name: チルチル  ..上級者(20,214ポイント)   Date: 2009/06/01(月) 23:41   No:34375 解決!     
Title: Re:色コードを三成分に分ける?    
あ〜こんな関数あったんですね
どうもありがとうございます


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



Name:  ..ぴよぴよ(338ポイント)   Date: 2009/05/28(木) 23:05   No:34159       
Title: pngの変換    

png形式の画像を読みこむ関数を作成しております。

bmpは
hbmp = (HBITMAP)LoadImage(0, name, IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);
的なかんじでできたのですが

このやり方では
png
はできませんよね?

どのように対処すればよいのでしょうか?

WindowsAPIとC++のみで書きたいです。


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


Name: lbfuvab  ..上級者(20,721ポイント)   Date: 2009/05/28(木) 23:12   No:34160     
Title: Re:pngの変換    
http://homepage2.nifty.com/sophia0/png.html

↑が参考になるかと思いますよ。


# 条件から外れますが、libpngを使うと言う手もあります。


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

Name:  ..ぴよぴよ(429ポイント)   Date: 2009/06/01(月) 22:38   No:34363     
Title: Re:pngの変換    
>>lbfuvabさん
自分なりにいろいろなサイトを見てみたのですが
理解できませんでした・・・

APIだけではできないことは理解したのですが
具体的にどうやってけばよろしいのでしょうか?


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

Name: Justy  ..伝説なるハッカー(366,375ポイント)   Date: 2009/06/01(月) 23:16   No:34370     
Title: Re:pngの変換    
libpngとzlib必須ですが。

PNG画像をビットマップとして読み込む
ttp://www.geocities.jp/katayama_hirofumi_mz/win32/loadpng.htm


 あとはこちらが参考になるかと。

JPEGやPNGが読めるLoadImage関数
ttp://naruhodo.television.co.jp/qa4052901.html?ans_count_asc=1


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



Name: arex  ..ぴよぴよ(153ポイント)   Date: 2009/05/30(土) 12:23   No:34198       
Title: ポインタを使った比較プログラム    
ゲームに関係ないプログラムでもOKですかね?
ダメなら消します
今ポインタを使ったプログラムを勉強中です
解かなければならない問題があるのですがよく分からないので教えてください
問題は「キーボードより文字列aと文字列bを入力し、比較する(どちらが辞書並びで先かを表示する)
プログラムを作れ。但し、strcmp関数を用いてはならない」というものです
自分でも考えたのですがどうも分からないので助けてくださいお願いします


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


Name: non  ..熟練のプログラマー(44,086ポイント)   Date: 2009/05/30(土) 12:37   No:34200     
Title: Re:ポインタを使った比較プログラム    
>ゲームに関係ないプログラムでもOKですかね?
もちろん、OKですよ。

ただし、丸投げ禁止ですので、わからないなりに作ってみて、そのうまく動かない
プログラムを添付するようにした方が、みなさんのレスがいいです。
回答例を示すのは簡単ですが、それでは勉強になりませんので。

例えば、strlenと同じ動作をするプログラムは作れますか?


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

Name: arex  ..ぴよぴよ(250ポイント)   Date: 2009/05/30(土) 12:43   No:34201     
Title: Re:ポインタを使った比較プログラム    
なるほど分かりました!
とりあえず一度作ってみますので少々お時間を・・・

え〜とstrlenは確か文字数を数えるやつでしたっけ?
いまひとつうろ覚えなので・・・strlenを使わないやつは以前作ったことがあるような気がします
たぶん作ったと思いますが1年くらい前のことなのではっきりしないです
きっとあるはずなので探してみます


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

Name: たかぎ [URL]  ..ハッカー(102,286ポイント)   Date: 2009/05/30(土) 13:24   No:34204     
Title: Re:ポインタを使った比較プログラム    
この問題は、簡単なようで結構難しいですよ。

ひとつめの難関は、いつも書くことですが、キーボードから直接入力するための標準的な方法がないことです。
環境を明確にすれば、ハードウェアを直接制御できるかもしれません。
あるいは、キーボードからの入力というのは、実は標準入力のことではないでしょうか?

もうひとつは、「辞書並び」でという部分です。
strcmpを使ってはならないという記述が大きなヒントになっています。
strcmpは、文字列を単純比較する関数であって、辞書順に比較するものではありません。
辞書順の比較にはstrcollを使用します。しかし、strcollを使うためには、ロケールを適切に設定しなければなりません。ロケールについて詳しく調べてみてください。また、どんなロケールに設定すべきかも指定されていませんが、どうするつもりでしょうか?


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

Name: バグ  ..ハッカー(159,655ポイント)   Date: 2009/05/30(土) 14:35   No:34208     
Title: Re:ポインタを使った比較プログラム    
あとは、半角文字オンリーなのか、マルチバイト文字も込みなのかで変わってきそうに思いますね。

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

Name: non  ..熟練のプログラマー(44,141ポイント)   Date: 2009/05/30(土) 15:23   No:34210     
Title: Re:ポインタを使った比較プログラム    
そりゃ、皆様方、深読み過ぎっだって。
標準入力の、半角オンリー、アスキー順だと私は、決め打ちです。


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

Name: arex  ..ぴよぴよ(295ポイント)   Date: 2009/05/30(土) 15:38   No:34211     
Title: Re:ポインタを使った比較プログラム    
皆様申し訳ございません説明不足でした
まず使用ツールはVisual Studio2008です
入力は普通に行える方法でよく半角のみとなります


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

Name: たかぎ [URL]  ..ハッカー(102,336ポイント)   Date: 2009/05/30(土) 16:41   No:34214     
Title: Re:ポインタを使った比較プログラム    
> 入力は普通に行える方法でよく

それはDirectInputを使うという意味でしょうか?

> 半角のみとなります

半角に限定した場合でも、'a' と 'B' を辞書順に比較すれば、当然 'a' の方が先ですよね?
'à' や 'ä' はどうでしょうか?


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

Name: arex  ..ぴよぴよ(402ポイント)   Date: 2009/05/30(土) 16:58   No:34219     
Title: Re:ポインタを使った比較プログラム    
入力は単純にscanfなどで問題ないと思います
ここまでの勉強であまり複雑なことはしていないので多分単純に考えても大丈夫かと思います

辞書並びなので大文字小文字は関係ないと思います
なので'a''B'なら'a'が先だと認識されるはずです
特殊な表示のやつに関しては考慮しなくてよいと思われます


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

Name: たかぎ [URL]  ..ハッカー(102,555ポイント)   Date: 2009/05/30(土) 17:12   No:34223     
Title: Re:ポインタを使った比較プログラム    
> 入力は単純にscanfなどで問題ないと思います

では、キーボードから入力するのではなく、標準入力を使うわけですね?

> 辞書並びなので大文字小文字は関係ないと思います
> なので'a''B'なら'a'が先だと認識されるはずです

では、'a' と 'A' ではどちらが先でしょうか? あるいは全く区別しなくてもよいのでしょうか?
また、空白文字、句読点等の記号、制御文字の順序はどうなりますか?

> 特殊な表示のやつに関しては考慮しなくてよいと思われます

何をもって「特殊」とするのでしょうか?
基本実行文字集合以外という意味であれば、'@' や '$' や '`' も特殊になりますが、そういうことでしょうか?
当然半角カナは「特殊」扱いですよね?


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

Name: non  ..熟練のプログラマー(44,177ポイント)   Date: 2009/05/30(土) 17:34   No:34226     
Title: Re:ポインタを使った比較プログラム    
>辞書並びなので大文字小文字は関係ないと思います
>なので'a''B'なら'a'が先だと認識されるはずです

あちゃ〜(^^;)



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

Name: box  ..ハッカー(140,516ポイント)   Date: 2009/05/30(土) 17:48   No:34228     
Title: Re:ポインタを使った比較プログラム    
> そりゃ、皆様方、深読み過ぎっだって。

それはそうだとは思いましたが、

> 標準入力の、半角オンリー、アスキー順だと私は、決め打ちです。

辞書順という大前提のもとでアスキー順と決めうちしたのは
少しまずかったのかもしれません。


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

Name: たかぎ [URL]  ..ハッカー(102,834ポイント)   Date: 2009/05/30(土) 18:01   No:34231     
Title: Re:ポインタを使った比較プログラム    
> > そりゃ、皆様方、深読み過ぎっだって。
> それはそうだとは思いましたが、

そうなのですが、決めつけは危険です。
「キーボードから」と書かれているのに「標準入力」だと考えるのは飛躍し過ぎですし、「辞書順」と書かれているのに「アスキー順」というのも飛躍し過ぎです。

結果的に、標準入力、多バイト文字非考慮、単純比較だったとしても、質問者さん自身がそう明示しない限りは未確定事項として扱うべきです。


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

Name: arex  ..ぴよぴよ(671ポイント)   Date: 2009/05/31(日) 01:12   No:34273     
Title: Re:ポインタを使った比較プログラム    
説明不足なために皆様長々と考えさせてしまい申し訳ございません

入力はあくまで「キーボードから」となっているので
プログラム実行させてから入力することになってます

辞書並びなので'a'と'A'の場合は2番目の文字に依存することになります
例えば'at'と'AB'なら'AB'が先にくるようになります

申し訳ありません特殊というのは言い方が悪かったですね
空白や句読点、'@'や'$'などは考慮する必要はないみたいです
あくまで文字列というか単語の比較なので基本の半角英字のみを考えればよいようです
なので'hello'と'thanks'と入力した場合、出力は「1番目はhello、2番目はthanks」
というようになれば良いみたいです


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

Name: たかぎ [URL]  ..ハッカー(103,242ポイント)   Date: 2009/05/31(日) 01:38   No:34274     
Title: Re:ポインタを使った比較プログラム    
> 入力はあくまで「キーボードから」となっているので

だとすると、scanfでは役不足です。

> 辞書並びなので'a'と'A'の場合は2番目の文字に依存することになります
> 例えば'at'と'AB'なら'AB'が先にくるようになります

要するに、'a' と 'A' は同じと見なせばよい訳ですね。
"Abc" と "aBC" は同じ順序と考えてよいのですね。

> 空白や句読点、'@'や'$'などは考慮する必要はないみたいです

「考慮する必要はない」とは?
それらの文字が決して入力されることがない専用キーボードを使うということでしょうか?


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

Name: arex  ..ぴよぴよ(754ポイント)   Date: 2009/05/31(日) 03:06   No:34279     
Title: Re:ポインタを使った比較プログラム    
'Abc'は'aBC'順序的には同じと考えてしまって構いません
空白などを考慮する必要がないと言ったのは普通の文字列(単語)には使用されないと考えたからです
作ってはいけないわけではないのでそれらがあったほうが楽に作れるならそれでもいいと思います


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

Name: non  ..熟練のプログラマー(44,363ポイント)   Date: 2009/05/31(日) 12:21   No:34283     
Title: Re:ポインタを使った比較プログラム    
学校の課題でしょ?
まだ、ポインタを習ったばっかりぐらいで・・・

先生はキーボードから読み込みと説明したかもしれませんが、標準入力と
いっても学生がわからないから、キーボードと説明しただけではないのですか?
標準入力について説明を受けたことはありますか?

辞書順は、まあ、それでもいいけど、これもアスキーコード順というのを説明するのに
わかりやくつい間違って言ったってことはないのですかね。
こっちの方は、A−Zの範囲だけでいいというのなら、全部大文字に変換して比較すれば
いいので、それはそれでいいのですが。


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

Name: arex  ..ぴよぴよ(621ポイント)   Date: 2009/05/31(日) 13:43   No:34289     
Title: Re:ポインタを使った比較プログラム    
おっしゃるとおり学校の課題です
ポインタを習ったばかりなので分かりやすく言っただけかもしれません
本来こういった場で質問すべきではないのでしょうが分からなかったもので・・・
提出が木曜日なのでそれまでになんとかしなければならないし・・・
つい他の皆様を頼ってしまいましたすいません
ここが課題等の質問禁止なら即刻消しますのでご了承ください


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

Name: non  ..熟練のプログラマー(44,707ポイント)   Date: 2009/05/31(日) 15:29   No:34295     
Title: Re:ポインタを使った比較プログラム    
>ここが課題等の質問禁止なら即刻消しますのでご了承ください

課題の質問は禁止されておりません。丸投げが禁止されているだけです。
したがって、arexさんができるところまで作ってプログラムを載せるのを皆さん
待っているところです。その間に、問題を正確に把握しようと皆さんはしているわけです。
arexさん自体が問題の内容を正確に把握できていないのなら、課題を仕上げることは
できませんよ。
入力は、scanfで行うということで、まず間違いはないと思いますが、
本当に辞書順で間違いないのかは先生に確認した方が(または課題のペーパーが
あるならその原文を確認)したほうが無駄がないと思います。






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

Name: arex  ..ぴよぴよ(742ポイント)   Date: 2009/05/31(日) 17:06   No:34300     
Title: Re:ポインタを使った比較プログラム    
プログラムは現在作っている最中です
質問しているのに長々とお待たせしてしまい本当に申し訳ありません

課題の紙は手元にありますが一番最初に書き込んだ問題文しか書いてありません
なので辞書順か本当はアスキーコード順なのかは判然としてない状況です


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

Name: たかぎ [URL]  ..ハッカー(103,315ポイント)   Date: 2009/05/31(日) 18:24   No:34308     
Title: Re:ポインタを使った比較プログラム    
> なので辞書順か本当はアスキーコード順なのかは判然としてない状況です

分からない点があるのに、なぜ先生に質問しないのかがまったくの謎です。
最初から掲示板で尋ねれば誰かが答えてくれると、高をくくっていたのではないですか?


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

Name: lbfuvab  ..上級者(20,817ポイント)   Date: 2009/05/31(日) 20:41   No:34317     
Title: Re:ポインタを使った比較プログラム    
課題の感じからすると、strcmp関数を自分で組ませたい様に感じますね。

まぁ、あくまで感じですが・・・


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

Name: arex  ..ぴよぴよ(896ポイント)   Date: 2009/06/01(月) 15:23   No:34343     
Title: Re:ポインタを使った比較プログラム    
え〜と今のところ出来てるのはこんな感じです

#include <stdio.h>

int main(void){
char *A[100],*B[100];

printf("文字列A:");scanf("%s",A);
printf("文字列B:");scanf("%s",B);

if(*A<*B)printf("1番目=%s,2番目=%s\n",A,B);
if(*A>*B)printf("1番目=%s,2番目=%s\n",B,A);

return 0;
}
関数を使ってないし、これでは正常に動作しません
3文字以上の文字を打ち込むと順番にならなくなります


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

Name: non  ..熟練のプログラマー(45,246ポイント)   Date: 2009/06/01(月) 15:51   No:34344     
Title: Re:ポインタを使った比較プログラム    
かなり、問題があるようです。

1 char *A[100]
文字列を格納するための配列を用意するのなら、
char A[100] です。
ポインタで解かなくてはいけないので、ポインタを別に用意します。
例えば
char *a;
a=&A[0];

2 先頭の1文字だけを比較しても全体を比較したことになりません。
 1文字目が等しいなら2文字目を比較、2文字目が等しいなら3文字目と比較していきます。
 等しくなくなるか、文字列の最後'\0'になるまでwhileで繰り返します。

3 whileから抜けた後、(抜ける条件は、等しくなくなったか、'\0'になった)
 抜けた原因により、どちらが大きいかまたは等しいか出力します。
 関数にするなら、仕様を決めて例えば-1,0,1をreturnするようにします。

4 課題には関数にしなさいとは書かれていません。

5 アスキー順ならこれでいいのですが、辞書順なら、最低でも小文字を大文字に変換するなどの
処理を付け加える必要があります。




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

Name: non  ..熟練のプログラマー(45,266ポイント)   Date: 2009/06/01(月) 16:02   No:34345     
Title: Re:ポインタを使った比較プログラム    
このままでは木曜までに終わらせるのは困難だと思いましたので、ポインタを使わないで
作ってみました。これを元に、ポインタに書き直してみてはいかがでしょうか?
ただし、アスキー順です。


#include <stdio.h>

int main(void)
{
char A[100],B[100];
int i;
printf("文字列A:");scanf("%s",A);
printf("文字列B:");scanf("%s",B);
i=0;
while(A[i]==B[i] && A[i]!='\0')
i++;
if(A[i]<B[i])
printf("1番目=%s,2番目=%s\n",A,B);
else if(A[i]>B[i])
printf("1番目=%s,2番目=%s\n",B,A);
else
printf("等しい\n");
return 0;
}


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

Name: arex  ..ぴよぴよ(965ポイント)   Date: 2009/06/01(月) 20:29   No:34358 解決!     
Title: Re:ポインタを使った比較プログラム    
non様ありがとうございます!!
これなら何とかなりそうです!あとは何とか頑張ってみます
他の皆様も私程度のために長々とお付き合いくださり本当に感謝しています!
本当に助かりました!ありがとうございました!!


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



Name: チルチル  ..上級者(18,673ポイント)   Date: 2009/05/31(日) 17:11   No:34301       
Title: for文 変数宣言 関数を一行にまとめる?    
当たり前と言えば当たり前なんですが

for( j=-3;j<4;j++ )float Angle=atan2( Player.y-EnemyShot[i].y , Player.x-EnemyShot[i].x ),EnemyShot[i].Angle=atan2( sin(EnemyShot[i].Angle)+sin(Angle)/10 , cos(EnemyShot[i].Angle)+cos(Angle)/10 );


のような処理を書くと

定数式が必要
宣言の構文エラー

と言うようなエラーが出ます
何行かに分ければ大丈夫なんですが
一行にまとめた方が見栄えが良いので
なんとか一行にまとめられないでしょうか?

環境はDXライブラリです


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


Name: yu  ..プログラマー(28,195ポイント)   Date: 2009/05/31(日) 17:18   No:34303     
Title: Re:for文 変数宣言 関数を一行にまとめる?    
for( j=-3;j<4;j++ ){float Angle=atan2( Player.y-EnemyShot[i].y,Player.x-EnemyShot[i].x);EnemyShot[i].Angle=atan2(sin(EnemyShot[i].Angle)+sin(Angle)/10,cos(EnemyShot[i].Angle)+cos(Angle)/10);}

こんな感じでできませんか?

一行に納めたいなら改行しなければ良いです。


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

Name: kazuoni [URL]  ..比類無きプログラマー(88,664ポイント)   Date: 2009/05/31(日) 17:42   No:34306     
Title: Re:for文 変数宣言 関数を一行にまとめる?    
おそらくですけど、分けたほうが管理はしやすいですよ^^;

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

Name: box  ..ハッカー(140,839ポイント)   Date: 2009/05/31(日) 18:25   No:34309     
Title: Re:for文 変数宣言 関数を一行にまとめる?    
ループの制御変数「 j 」に無関係な計算を、
ループの中で毎回繰り返す必要があるのでしょうか?


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

Name: たいちう  ..プログラマー(29,499ポイント)   Date: 2009/05/31(日) 18:48   No:34310     
Title: Re:for文 変数宣言 関数を一行にまとめる?    
それと複数行に書いたほうが見栄えは良いと思う。
1行200文字というのは恥ずかしくて人に見せられないレベルというか。


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

Name: チルチル  ..上級者(18,741ポイント)   Date: 2009/05/31(日) 18:51   No:34311 解決!     
Title: Re:for文 変数宣言 関数を一行にまとめる?    
>>こんな感じでできませんか?

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

>>おそらくですけど、分けたほうが管理はしやすいですよ^^;

確かに一行の内容は見にくくなるんですけど
こう言う式がズラーっと並んでいるので
一行にまとめた方が全体が見やすくなる気がしたんです
一回書いたら多分いじらないと思うし・・

>>ループの制御変数「 j 」に無関係な計算を、

すいませんアレは例えばの話です・・

>> 1行200文字というのは恥ずかしくて人に見せられないレベルというか。

200文字はさすがに無いですけど、描画系関数で疑問演算子を乱用して
凄まじい長さになっている場所がいくつかあるので
一行が長くなるのにあまり抵抗がないんです・・


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

Name: box  ..ハッカー(140,855ポイント)   Date: 2009/05/31(日) 19:00   No:34312     
Title: Re:for文 変数宣言 関数を一行にまとめる?    
> >>ループの制御変数「 j 」に無関係な計算を、
>
> すいませんアレは例えばの話です・・

例えばの話ではなく、現実に書いたコードと
現実に起きたエラーとを突き合わせる必要があります。

あなたのところで「正確に」何が起きているかを説明できるのは、
あなたご自身「だけ」です。


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

Name: チルチル  ..上級者(19,042ポイント)   Date: 2009/05/31(日) 19:18   No:34314     
Title: Re:for文 変数宣言 関数を一行にまとめる?    
え〜とfor文 変数宣言 関数を一行にまとめた式をこれから色々作ろうと思ったので
まとめる方法が知りたかったんです

何が起きているかと言うと、まだ何も起きていません・・
これから何か起きないように前提知識を得たかったんです・・

すいません


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

Name: たいちう  ..プログラマー(29,710ポイント)   Date: 2009/05/31(日) 19:26   No:34315     
Title: Re:for文 変数宣言 関数を一行にまとめる?    
> 200文字はさすがに無いですけど、描画系関数で疑問演算子を乱用して
> 凄まじい長さになっている場所がいくつかあるので
> 一行が長くなるのにあまり抵抗がないんです・・

先のソースコードは197文字あり、forの前に1つでもインデントがあれば
200文字を超えています。これも例えばの話だったのでしょうか。
疑問演算子は三項演算子のことかな?乱用も良くないですよね。

長すぎる関数、長すぎる行というのは、一般に管理が困難です。
「一行にまとめた方が見栄えが良い」というのに引っかかり、
つい書きましたが、これ以上は不毛でしょうね。
プログラムの全体を見ないと何とも言えないし、
個人で好きで書いているのならば文句もないですので。


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

Name: チルチル  ..上級者(19,211ポイント)   Date: 2009/05/31(日) 20:20   No:34316     
Title: Re:for文 変数宣言 関数を一行にまとめる?    
あ〜意外に200文字ぐらいあるんですね・・
コピー&ペーストばっかりだから感覚がマヒしていました・・

気になったのでプログラム全体で一番長い行の文字数を数えてみると623文字ありました・・
長いので10文字ぐらいは誤差があると思いますが、それ以外にも
カウントには入れていませんが前にタブが4回あり後に注釈が8文字あります・・

まあDrawFormatString関数の引数で長くなってるだけですから管理は楽ですけど・・

長い行は平均して200文字ぐらいですが
分けたら縦に長くなるので
縦と横なら横かな〜と思ったんですが・・

疑問演算子はカウンタでフェードイン、通常描画、フェードアウト
という処理を一行にまとめる時などに使っています


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

Name: たいちう  ..プログラマー(30,226ポイント)   Date: 2009/05/31(日) 22:26   No:34319     
Title: Re:for文 変数宣言 関数を一行にまとめる?    
623文字はすごいですね。
一般的と思われる目安を書くと、縦横共にスクロールしなくても
関数全体が見れるのが理想です。
このため、一昔前は一行の文字数は80文字までとかいう目安もありました。
(Delphiの古いバージョンには、80文字目に線が引いてあったり)

画面の解像度が上がるとスクロールせずに表示できる行数・桁数は当然増えますが、
その分ソースコード以外の情報を表示するほうが開発しやすいかなーと
個人的には思っています。マルチモニタとか使わせてもらえないので。

一般的なプログラムは書いたらお終いではなく、デバッグしたり、
数年後に変更したりしますので、常識的な行数・桁数で書くのが無難です。
横を短くしたら縦が長すぎるというのは、そもそも1つの関数に詰め込みすぎでしょう。
関数の機能を少なくすることで、関数の再利用もしやすくなりコピペも減るでしょう。
安易なコピペもやってはいけないことなのですが、知ってますか?

チルチルさんは趣味で書いているのだと思いますので、
好きなように書いて良いわけですが、先人の知恵を学ぶのも無駄にならないと思います。
あえて学ばないんだー、というのもご自由ですが。

最後に、正しい用語を使いましょう。
疑問演算子じゃないってば。


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

Name: たかぎ [URL]  ..ハッカー(103,472ポイント)   Date: 2009/05/31(日) 23:26   No:34321     
Title: Re:for文 変数宣言 関数を一行にまとめる?    
C++でテンプレートを使いだすと、どうしても横長になりますけどね。
例えば、

template <class C, class Traits = std::char_traits<C>, class Allocator = std::allocator<C>, class F>
inline std::basic_ostream<C, Traits>& function_name(std::basic_ostream<C, Traits>& stream, std::basic_string<C, Traits, Allocator> const& str, F filter)
{
...
}

のような感じで...

> 最後に、正しい用語を使いましょう。
> 疑問演算子じゃないってば。

? : のことであれば、正しくは「条件演算子」ですね。


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

Name: たいちう  ..プログラマー(30,291ポイント)   Date: 2009/06/01(月) 00:02   No:34324     
Title: Re:for文 変数宣言 関数を一行にまとめる?    
私への突っ込みですよね、きっと。
Cで唯一の三項演算子が条件演算子ですよね。
そのためか三項演算子と言う(書く)癖がついてしまってます。
チルチルさんに偉そうに言えないな。気をつけます。


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

Name: チルチル  ..上級者(19,467ポイント)   Date: 2009/06/01(月) 19:03   No:34354     
Title: Re:for文 変数宣言 関数を一行にまとめる?    
そうですね、条件演算子ですね・・
って言うか疑問演算子ってどこにも書いて無かったと思うのに
何でそう呼んでるんだろう・・

う〜ん最近、何でもかんでも一つの関数にまとめる癖がついてしまって・・
他の関数ならともかくDrawFormatString関数なので分けると間が統一しにくくて・・

長くなる関数は何かを登録する関数ですね・・
構造体だから引数が多くなるし
引数が条件演算子を多用した式になる場合が多いし・・

やっぱり関数は再利用しやすい方が良いんでしょうかね・・
私の場合は関数の独立性が皆無になってますからね・・


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



Name: ほのか  ..入門者(3,715ポイント)   Date: 2009/06/01(月) 16:05   No:34346       
Title: 読み捨て処理    
いつもお世話になっております。
ソースについては添付ファイルをご覧いただきたいのですが、このたびまたわからないことがあったので質問させていただきます;

処理区分や削除・照会・変更したいデータの番号を入力する処理のことで以前も質問させていただいたのですが、上手くいったと思っていたのですが実際は入力した複数文字が1文字目以降、確保していない領域に書き込まれているということがわかりました。

1文字目以降を配列等に書き込ませるなどして読み捨て処理をするにはどのようにしたら良いのでしょうか??;
それから、課題担当の方にdefineで比較のみ実施する場合は配列等にdefineの値を設定する必要はないと言われたのですが、よく意味がわかりません;


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


Name: pooka [URL]  ..入門者(4,028ポイント)   Date: 2009/06/01(月) 16:24   No:34347     
Title: Re:読み捨て処理    
ぱっと見ですが
>char num;
>scanf("%s",&num);

scanf("%c",&num);
では?


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

Name: ほのか  ..入門者(3,758ポイント)   Date: 2009/06/01(月) 16:30   No:34348     
Title: Re:読み捨て処理    
回答ありがとうございます。
以前%cに変えてみたのですが、この場合「11」と入力しても「1」のデータが表示されたりしてしまいます;


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

Name: pooka [URL]  ..入門者(4,078ポイント)   Date: 2009/06/01(月) 16:45   No:34349     
Title: Re:読み捨て処理    
なら
>char num;
char num[BUFSIZ];

>scanf("%s",&num);
scanf("%s",num);

>no = atoi(&num);
no = atoi(num);
にそれぞれなおしてみてください。


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

Name: ほのか  ..入門者(3,821ポイント)   Date: 2009/06/01(月) 16:54   No:34350     
Title: Re:読み捨て処理    
回答ありがとうございます!
無事修正できました^^ありがとうございました^^

%sの場合、fflushは必要ないのでしょうか??
また、defineの質問についてわかる方いらっしゃいましたらよろしくお願いいたします;


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

Name: pooka  ..入門者(4,166ポイント)   Date: 2009/06/01(月) 17:15   No:34351     
Title: Re:読み捨て処理    
>defineで比較のみ・・・
憶測ですが、例えば#define DANSEI "1"としているのに
shinki関数などでchar dansei[2]= DANSEI;として
strcmp(temp.sei,dansei)
としていることではないでしょうか?
strcmp(temp.sei,DANSEI)
でいいということではないでしょうか?


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

Name: ほのか  ..入門者(3,853ポイント)   Date: 2009/06/01(月) 17:19   No:34352 解決!     
Title: Re:読み捨て処理    
回答ありがとうございます!
やっと理解できました^^
いつも本当にありがとうございます^^


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



Name: meteor  ..ぴよぴよ(86ポイント)   Date: 2009/06/01(月) 13:20   No:34338       
Title: 制限時間の作り方    
1ステージ60秒のゲームを作っているのですが・・
60秒で終了する形にはなったんですけど・・残り時間の表示のさせ方がわかりません。

int StartTime = GetNowCount();

if((GetNowCount() - StartTime) > 60000){ //1ステージの制限時間は60秒
break;
}

こういう風に作っています。
残り時間表示はどのように追加したらいいでしょうか??


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


Name: kazuoni [URL]  ..比類無きプログラマー(88,682ポイント)   Date: 2009/06/01(月) 13:25   No:34339     
Title: Re:制限時間の作り方    
DXライブラリを使っているという条件で・・・
DrawFormatString()
で表示させるだけではダメですか?


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

Name: meteor  ..ぴよぴよ(112ポイント)   Date: 2009/06/01(月) 13:34   No:34340     
Title: Re:制限時間の作り方    
見ました^^でもDrawFormatString() をどのようにプログラムに絡めていけばいいかわかりません。

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

Name: kazuoni [URL]  ..比類無きプログラマー(88,581ポイント)   Date: 2009/06/01(月) 13:53   No:34341     
Title: Re:制限時間の作り方    
絡めるというよりは、ただ一行記述するだけなんですが^^;

とりあえず一度使ってみてはどうでしょうか?
あーでもない、こーでもないってやっていれば
どこに記述するのが一番いいかってすぐにわかるかと。
(どのようにゲームを組んでいるのか分からないのでこれぐらいしか。。)


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

Name: 夢夢  ..ぴよぴよ(21ポイント)   Date: 2009/06/01(月) 14:56   No:34342     
Title: Re:制限時間の作り方    
DrawFormatString(0,0,GetColor(255,255,255),"残り:%d秒",(60000-(GetNowCount()-starttime))/1000);
60000は60秒のこと
GetNowCount()-starttimeで現在の時間から何秒経過しているかが計算されます。
/1000 そのままだと秒以下のミリ秒も表示されてしまうので割っています。
優先順位を考慮して計算式に()を入れています。

参考程度に。


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



Name: Tom  ..ぴよぴよ(28ポイント)   Date: 2009/05/31(日) 23:50   No:34322       
Title: DrawRotaGraph    
DrawGraphの後に同じ座標でDrawRotaGraphを
実行すると位置が左上にずれてしまうのですが
どうにかならないでしょうか。


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


Name: lbfuvab  ..上級者(20,875ポイント)   Date: 2009/06/01(月) 00:00   No:34323     
Title: Re:DrawRotaGraph    
リファレンス読みましたか?
http://homepage2.nifty.com/natupaji/DxLib/function/dxfunc_graph.html#R3N10


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

Name: Tom  ..ぴよぴよ(65ポイント)   Date: 2009/06/01(月) 01:22   No:34328 解決!     
Title: Re:DrawRotaGraph    
すいませんでした。よく読んでいませんでした。
引数の座標を中心に描画するのですね。
ありがとうございました。


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



Name: junta  ..ぴよぴよ(635ポイント)   Date: 2009/05/30(土) 23:40   No:34265       
Title: レーザーのミス?    
またまた質問してすみません。
今度はまた他のシューティングゲームを作り出して(龍神録を改造したようなの)いるのですが、ちょっとした問題がありまして。。。

34章の、「レーザーを作ってみよう。」なのですが、プレイすると、何故か枠の中に当たってもいないのに
被弾してしまいます。(レーザーが出て、赤い枠が出たとたん死にます)
色々見てみたのですが、どうしても直りませんでした・・・どうしたらよいのですか?。お願いします
あと、長くなりますが、out_lazer.cppのコード貼り付けます。

#include "../include/GV.h"
#include <math.h>
#include <stdio.h>

/* 2次元ベクトル */
typedef struct {
double x, y;
} Vector2_t;

/* diff ← ベクトル p - q */
void Vector2Diff(Vector2_t *diff, const Vector2_t *p, const Vector2_t *q){
diff->x = p->x - q->x;
diff->y = p->y - q->y;
}

/* ベクトル p と q の内積 */
double Vector2InnerProduct(const Vector2_t *p, const Vector2_t *q){
return p->x * q->x + p->y * q->y;
}

/* ベクトル p と q の外積 */
double Vector2OuterProduct(const Vector2_t *p, const Vector2_t *q){
return p->x * q->y - p->y * q->x;
}

//点と線分との距離を求める
double get_distance(double x, double y, double x1, double y1,
double x2, double y2){
double dx,dy,a,b,t,tx,ty;
double distance;
dx = (x2 - x1); dy = (y2 - y1);
a = dx*dx + dy*dy;
b = dx * (x1 - x) + dy * (y1 - y);
t = -b / a;
if (t < 0) t = 0;
if (t > 1) t = 1;
tx = x1 + dx * t;
ty = y1 + dy * t;
distance = sqrt((x - tx)*(x - tx) + (y - ty)*(y - ty));
return distance;
}

//点と点との距離を返す
double get_pt_and_pt(pt_t p1, pt_t p2){
return sqrt((p1.x-p2.x)*(p1.x-p2.x)+(p1.y-p2.y)*(p1.y-p2.y));
}

//点が円の中にあるかどうか。0:なし 1:あり
double question_point_and_circle(pt_t p, pt_t rp,double r){
double dx=p.x-rp.x,dy=p.y-rp.y;
if(dx*dx + dy*dy < r*r) return 1;
else return 0;
}

//入れ替え
void swap_double(double *n, double *m){
double t=*m;
*m=*n;*n=t;
}

//3点から角度を返す
double get_sita(pt_t pt0,pt_t pt1,pt_t rpt){
/* ベクトル C→P と C→Q のなす角θおよび回転方向を求める.*/
Vector2_t c, p, q; /* 入力データ */
Vector2_t cp; /* ベクトル C→P */
Vector2_t cq; /* ベクトル C→Q */
double s; /* 外積:(C→P) × (C→Q) */
double t; /* 内積:(C→P) ・ (C→Q) */
double theta; /* θ (ラジアン) */

/* c,p,q を所望の値に設定する.*/
c.x = pt0.x; c.y = pt0.y;
p.x = pt1.x; p.y = pt1.y;
q.x = rpt.x; q.y = rpt.y;

/* 回転方向および角度θを計算する.*/
Vector2Diff(&cp, &p, &c); /* cp ← p - c */
Vector2Diff(&cq, &q, &c); /* cq ← q - c */
s = Vector2OuterProduct(&cp, &cq); /* s ← cp × cq */
t = Vector2InnerProduct(&cp, &cq); /* t ← cp ・ cq */
theta = atan2(s, t);
return theta;
}

//長方形と円との当たりを判定する
int hitjudge_square_and_circle(pt_t pt[4], pt_t rpt, double r){
int i;
double x=rpt.x,y=rpt.y;
double theta,theta2;

/*円の中に長方形の4点のうちどれかがあるかどうか判定*/
for(i=0;i<4;i++){
if(question_point_and_circle(pt[i],rpt,r)==1)
return 1;
}
/*ここまで*/

/*長方形の中に物体が入り込んでいるかどうかを判定判定*/

theta =get_sita(pt[0],pt[1],rpt);//3点の成す角1
theta2=get_sita(pt[2],pt[3],rpt);//3点の成す角2

if(0<=theta && theta<=PI/2 && 0<=theta2 && theta2<=PI/2)
return 1;

/*ここまで*/

/*線分と点との距離を求める*/
for(i=0;i<4;i++){
if(get_distance(rpt.x,rpt.y,pt[i].x,pt[i].y,pt[(i+1)%4].x,pt[(i+1)%4].y)<r)
return 1;
}
/*ここまで*/
return 0;//どこにもヒットしなかったらぶつかっていない
}


int out_lazer(){
int i,j;
pt_t sqrp[4],rpt={ch.x,ch.y};//長方形の4点と円の中心
//レーザー分ループ
for(i=0;i<LAZER_MAX;i++){
//レーザーが登録されていて、当たり判定をする設定なら
if(lazer[i].flag>0 && lazer[i].hantei!=0){
for(j=0;j<4;j++){//レーザーの4点を設定
sqrp[j].x=lazer[i].outpt[j].x;
sqrp[j].y=lazer[i].outpt[j].y;
}
//長方形と円との接触判定
if(hitjudge_square_and_circle(sqrp,rpt,CRANGE))
return 1;
}
}
return 0;
}


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


Name: あ〜る  ..中級者(9,102ポイント)   Date: 2009/05/30(土) 23:47   No:34267     
Title: Re:レーザーのミス?    
使ってるコンパイラは何ですか?

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

Name: junta  ..ぴよぴよ(718ポイント)   Date: 2009/05/30(土) 23:54   No:34269     
Title: Re:レーザーのミス?    
Microsoft Visual C++ 2008 Express Edition
です


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

Name: あ〜る  ..中級者(9,120ポイント)   Date: 2009/05/31(日) 07:34   No:34282     
Title: Re:レーザーのミス?    
そしたら僕の考えてる理由とは違うかもしれません、申し訳無いです…
でも当たり判定を一つ一つコメントアウトして、どの当たり判定が間違ってるのかを調べれば、解答が得やすいかもしれないです
直接の原因がわからずすいません…


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

Name: junta  ..ぴよぴよ(751ポイント)   Date: 2009/05/31(日) 17:28   No:34305 解決!     
Title: Re:レーザーのミス?    
自己解決しました!shot.cppにて色々抜けていたようです。協力してくれた人ありがとうございました

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



Name: C言語初心者  ..かけだし(1,757ポイント)   Date: 2009/05/30(土) 23:53   No:34268       
Title: 構造体について質問があります    
はじめまして。C言語初心者となります。
以下の疑問があり、質問させて頂きました。

以下のST1型の構造体が配列として定義されていた場合、
その配列インデックスの一つにST2型の内容で保存を
行いたい場合にはどのようにすればよいのでしょうか?

構造体としてのサイズは同じなので扱う事は可能(?)と思うの
ですが、キャストすれば良いのでしょうか?
上記の認識が正しい場合、どのようにキャストを行えばよいのでしょうか?

typedef struct st1 {
  unsined short us_data1;
  unsined short us_data2;
  unsined long ul_data3;
} ST1;

typedef struct st2 {
  unsined short us_data5;
  unsined short us_data6;
  void* v_ptr;
} ST2;

初歩的な質問で、誠に恐縮ですが、
お分かりになられる方がいらっしゃいましたら、
ご教授の程、宜しくお願い致します。


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


Name: たかぎ [URL]  ..ハッカー(103,167ポイント)   Date: 2009/05/31(日) 00:39   No:34272     
Title: Re:構造体について質問があります    
> 構造体としてのサイズは同じなので

そう考えるのは危険です。
とりあえず、共用体を利用することを考えましょう。


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

Name: C言語初心者  ..かけだし(1,951ポイント)   Date: 2009/05/31(日) 02:30   No:34277     
Title: Re:構造体について質問があります    
> > 構造体としてのサイズは同じなので
>
> そう考えるのは危険です。
> とりあえず、共用体を利用することを考えましょう。
>

貴重なご意見、本当にありがとうございます。
そうですね、危険ですよね。。。
質問の仕方が悪く、大変申し訳ありません。
本件、課題にて構造体で扱うように指示されており
(サイズ等が変更されることは考えなくてよい)
質問させて頂きました。

大変お手数ですが、お分かりになられる方がいらっしゃいましたら、
ご教授の程、宜しくお願い致します。


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

Name: non  ..熟練のプログラマー(44,402ポイント)   Date: 2009/05/31(日) 12:38   No:34284     
Title: Re:構造体について質問があります    
メンバーを一つずつコピーすればいいのではないでしょうか。
構造体をまとめてコピーは無理なんじゃないでしょうか?たぶん。




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

Name: C言語初心者  ..ぴよぴよ(156ポイント)   Date: 2009/05/31(日) 14:24   No:34290     
Title: Re:構造体について質問があります    
> メンバーを一つずつコピーすればいいのではないでしょうか。
> 構造体をまとめてコピーは無理なんじゃないでしょうか?たぶん。
>
>

ご意見・ご見解頂き、ありがとうございます。
> メンバーを一つずつコピーすればいいのではないでしょうか。
> 構造体をまとめてコピーは無理なんじゃないでしょうか?たぶん。
おっしゃるとおりと思います。

ST1のul_data3にST2のv_ptrを代入する時に 間接参照のレベルが異なる
warning(C4047)となってしまう為、キャストにて回避を考えているのですが、
どのようにキャストを行えばよいのかがわかりません。

どなたかお分かりになられましたら、ご教授、宜しくお願い致します。


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

Name: non  ..熟練のプログラマー(44,431ポイント)   Date: 2009/05/31(日) 15:17   No:34292     
Title: Re:構造体について質問があります    
これでいいのでは?
ST1 s1[10];
ST2 s2;

s1[0].ul_data3=(unsigned long)s2.v_ptr;




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

Name: C言語初心者  ..かけだし(2,144ポイント)   Date: 2009/05/31(日) 15:33   No:34296 解決!     
Title: Re:構造体について質問があります    
> これでいいのでは?
> ST1 s1[10];
> ST2 s2;
>
> s1[0].ul_data3=(unsigned long)s2.v_ptr;
>
>
>

貴重なご意見ありがとうございます。

大変申し訳ありません。本件、根本的に勘違いをしており、
自己解決致しました。
個別のデータ(s2.v_ptr)をキャストして代入するのではなく、
ST1型配列のインデックスのアドレスをST2型ポインタに代入し、
そのポインタにてST1型配列にアクセスすればよかったのですね。。。

拙い質問に答えて下さりました方々、本当にありがとう御座いました。
これからも質問をさせて頂く事もあるかと思いますが、
その際も宜しくお願い致します。


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



Name: ハジ  ..ぴよぴよ(240ポイント)   Date: 2009/05/30(土) 23:28   No:34264       
Title: t0. セーブデータの作り方 に関して    
現在外部ファイルから敵の配置などを読み込むプログラムを作成しています。
その際に「まずは外部ファイルの読み込み方法」を学ぼうとして
「t0. セーブデータの作り方」をコピペすると

1>LIBCMT.lib(wincrt0.obj) : error LNK2019: 未解決の外部シンボル _WinMain@16 が関数 ___tmainCRTStartup で参照されました。
1>.\Release/DxLib.exe : fatal error LNK1120: 外部参照 1 が未解決です。

というエラーが出ます。
どうやらググるとwin32とかコンソールアプリケーションがどうたらあったのですが
理解ができませんでした。

もしよろしければ解決方法をご教授願います…


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


Name: Dixq (管理人) [URL]  ..ウィザード(1,025,759ポイント)   Date: 2009/05/30(土) 23:56   No:34270     
Title: Re:t0. セーブデータの作り方 に関して    
プロジェクトの作り方が違うんだと思います。
このサンプルはコンソールアプロケーション用ですが、
恐らくDXライブラリをコンパイルする為のプロジェクトでコンパイルしようとされているのではないでしょうか?

プロジェクトを作成する時「コンソールアプリケーション」で作成するとこのプログラムがコンパイル出来るようになります。
もしサンプルを実行する必要が無ければ、必要な箇所だけ移せばいいですよ。

例えばfopenとかって関数は別にどんなプロジェクトからでも呼べるわけです。
ただしDXライブラリでは独自のファイル読み取り関数があるので、リファレンスを確認して下さい。

http://homepage2.nifty.com/natupaji/DxLib/function/dxfunc_other.html#R19N1


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

Name: ハジ  ..ぴよぴよ(318ポイント)   Date: 2009/05/31(日) 02:05   No:34275 解決!     
Title: Re:t0. セーブデータの作り方 に関して    
迅速な対応誠にありがとうございます。
とりあえず動作を確認しました。
これからまた再度勉強していきたいと思います。

重ね重ねとなりますが、このたびは誠にありがとうございます。


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



Name: pupilΔ  ..ぴよぴよ(136ポイント)   Date: 2009/05/28(木) 13:46   No:34135       
Title: ゲームを作るために勉強しなければいけないことは何ですか?    
はじめまして、pupilΔと申します。

今年、高校2年にたったので数学Bでベクトルを勉強し終えました。
いぜん、3Dゲームにはベクトルが重要とどこかで読んだことがあるので、
前から思っていた3Dゲームに挑戦していきたいな〜と思っています。

目標は、ピクミン2のようなカワイイ3Dゲームを作りたいと思っています。
参考URL
http://www.youtube.com/watch?v=wM46WF_ILfI&hl=ja

C++コンパイラ等は入手しましたが、何をどこからはじめていいかわかりません。
参考になる、書庫、HPなどご存知であれば教えていただけないでしょうか?
宜しくお願いします。


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


Name: 御津凪 [URL]  ..比類無きプログラマー(89,653ポイント)   Date: 2009/05/28(木) 16:23   No:34137     
Title: Re:ゲームを作るために勉強しなければいけないことは何ですか?    
どこまで根気があるのかわかりませんが、今までプログラミング未経験だった場合は、
いきなり3Dゲームを作るのは厳しいでしょう。

というのも、3Dの構成を知るにはベクトル(行列)のほか、
カメラの概念、テクスチャ、ポリゴン等があり、
さらにDirectX(もしくはOpenGL)のプログラミング能力が必要になります。

とりあえずこれらの解説や作り方など載っているサイトがありますので、
一読してみてください。
http://marupeke296.com/GameMain.html

もし、「これならいける」と思ったならやり方などを覚えながら製作を始めてもいいですし、
難しいと感じたのであれば、基礎をじっくり固めてからチャレンジするか、
他にも容易に3Dゲームを作れるものがありますので、そこからはじめても良いかもしれません。
たとえば、 LGP という3Dゲーム開発言語というものがあります。


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

Name: pupilΔ  ..ぴよぴよ(361ポイント)   Date: 2009/05/30(土) 12:18   No:34197     
Title: Re:ゲームを作るために勉強しなければいけないことは何ですか?    
お返事遅れました。申し訳ありません。

ゲームをつくろー!を拝見させていただきましたが、3Dの話は書いたことがあるので
大体言いたいことは分かりますが、プログラムのほうはさっぱりです;

はじめのうちは、2DでRPGぐらいは作れるようになっておいたほうがよさそうですね^^;
もちろん、c言語の場合ですが;

LGPという言語は面白そうなのでちょっと手を出してみたいと思います。

御津凪さん、とても貴重な情報をありがとうございました。
また、行き詰ったら宜しくお願いいたします。


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

Name: pupilΔ  ..ぴよぴよ(431ポイント)   Date: 2009/05/30(土) 12:46   No:34202     
Title: Re:ゲームを作るために勉強しなければいけないことは何ですか?    
すみません、さっきの質問に補足させてください


LGPについて調べてみたのですが入門サイトが見つかりませんでした
もしご存知であれば、教えてはいただけないでしょうか?
宜しくお願いいたします。


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

Name: たいちう  ..プログラマー(29,423ポイント)   Date: 2009/05/30(土) 21:36   No:34252     
Title: Re:ゲームを作るために勉強しなければいけないことは何ですか?    
こんなのが該当するのではないでしょうか。

http://www.jppass.com/lgp/manual3/manual.htm
http://www.jppass.com/lgp/sample3/sam.htm


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

Name: たかぎ [URL]  ..ハッカー(103,132ポイント)   Date: 2009/05/30(土) 22:18   No:34258     
Title: Re:ゲームを作るために勉強しなければいけないことは何ですか?    
> 今年、高校2年にたったので数学Bでベクトルを勉強し終えました。
> いぜん、3Dゲームにはベクトルが重要とどこかで読んだことがあるので、
> 前から思っていた3Dゲームに挑戦していきたいな〜と思っています。

現在、専門学校で3Dプログラミングを教えています。
今すぐ3Dゲームをやるのは難しいと思いますが、それはそれとして、学校の勉強はちゃんとしておいてください。
三角関数、ベクトル、行列等の数学はもちろん、等加速度運動や運動量保存の法則等の物理も大切です。
そして、最も重要なのが国語です。
それらを集中的に学べる機会は今しかないので、しっかり勉強しておいてください。



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

Name: pupilΔ  ..ぴよぴよ(433ポイント)   Date: 2009/05/30(土) 22:19   No:34259 解決!     
Title: Re:ゲームを作るために勉強しなければいけないことは何ですか?    
なるほど・・・
サイト内のサンプルですか^^
具体的にゲームソースでもあれば違うんでしょうが;
そこに記載されている範囲内で努力してみたいと思います。

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


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

Name: たいちう  ..プログラマー(29,449ポイント)   Date: 2009/05/31(日) 00:12   No:34271     
Title: Re:ゲームを作るために勉強しなければいけないことは何ですか?    
> 具体的にゲームソースでもあれば違うんでしょうが;
> そこに記載されている範囲内で努力してみたいと思います。

ゲームソースって何?
ソースコードのことだとすると、"走る!.txt"等ですが。


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



Name: tex  ..ぴよぴよ(128ポイント)   Date: 2009/05/30(土) 20:33   No:34245       
Title: CheckHitKeyでの判定    
CheckHitKeyでキー判定をし、キーが押されていれば、文字を出力させます。
キーをずっと押していなければ、文字は消えてしまいます。
キーを押したあと、ずっと表示させていたいんですが、どうすればいいですか?
できれば、WaitKeyとかWaitTimerを使わない方法がいいです。
お願いします。


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


Name: チルチル  ..上級者(17,464ポイント)   Date: 2009/05/30(土) 20:48   No:34247     
Title: Re:CheckHitKeyでの判定    
どういう場面かによりますが
キーが押されたらフラグか何かを立てれば良いんじゃないでしょうか?

画面を更新しないという方法もありますが・・


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

Name: tex  ..ぴよぴよ(144ポイント)   Date: 2009/05/30(土) 20:56   No:34248     
Title: Re:CheckHitKeyでの判定    
while(CheckHitKey(KEY_INPUT_ESCAPE) == 0){
if(state == 0){
DrawString(0, 0, "ABC", white);
if(CheckHitKey(KEY_INPUT_RETURN)) state++;
}
if(state == 1){
DrawString(0, 20, "abc", white);
}
}

という風になっているとしたら、どうすればいいのでしょう?
あと、フラグを立てるというのはどういうことですか?
よろしくお願いします。


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

Name: チルチル  ..上級者(17,780ポイント)   Date: 2009/05/30(土) 21:09   No:34250     
Title: Re:CheckHitKeyでの判定    
「スイッチを入れる」みたいな感じでしょうかね・・

キーが押されたらスイッチを入れて
スイッチが入っていたら表示するみたいな感じです

見た感じstate変数がフラグの役割をしているように見えるんですが
最初state変数が0として、0の場合キーが押されたらインクリメントして1になる場合
それ以降は表示する方にしか処理が行かないので、これで完成しているように見えますが?

実際はstateがどこかで0になってたりするんですか?

whiteは色コードですよね?


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

Name: tex  ..ぴよぴよ(203ポイント)   Date: 2009/05/30(土) 21:35   No:34251     
Title: Re:CheckHitKeyでの判定    
すみません。
whileの前に
int white = GetColor(255, 255, 255);
int state = 0;
というのを書き忘れました。

if(state == 1)のあとに表示される文字が、エンターを押しているときは表示されて、エンターを離すと消えてしまいます。
どうしてでしょう?


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

Name: チルチル  ..上級者(17,942ポイント)   Date: 2009/05/30(土) 21:59   No:34256     
Title: Re:CheckHitKeyでの判定    
う〜ん実行してみましたがちゃんと動きますね・・

whileの前ですよね、中ではないんですよね?

短いコードなら、ちょっと全部書いてくれませんか?


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

Name: tex  ..ぴよぴよ(236ポイント)   Date: 2009/05/30(土) 22:23   No:34260 解決!     
Title: Re:CheckHitKeyでの判定    
チルチルさん、すみませんでした。
自分のちょっとした間違いでした。
本当にすみませんでした。


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

Name: チルチル  ..上級者(17,955ポイント)   Date: 2009/05/30(土) 22:34   No:34261     
Title: Re:CheckHitKeyでの判定    
あっそうですか、解決してよかったです

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



Name: イベント  ..ぴよぴよ(162ポイント)   Date: 2009/05/28(木) 22:16   No:34157       
Title: キーダウンイベントの取得方法    


case WM_KEYDOWN:
Key[wp] = TRUE;
break;

case WM_KEYUP:
Key[wp] = FALSE;
break;



という感じでキー情報を取っております。

これだと押した瞬間だけの処理ってできなくないでしょうか?
例えばキーボタンが押したときだけ弾を発射するような処理を入れたい場合
カウンター的な変数を作らなくてはいけません・・・

押した瞬間だけ処理を行うにはどうしたらよいのでしょうか?


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


Name: BEMANI  ..プログラマー(32,095ポイント)   Date: 2009/05/29(金) 01:56   No:34170     
Title: Re:キーダウンイベントの取得方法    
>>イベントさん
今のキー情報と、前回(1フレーム前)のキー情報があれば押した瞬間を判定することができます。
押しっぱなしの処理はこんな感じになります。
「今のキー情報が押されていて、前回のキー情報も押されている」


押した瞬間はこんな感じです。
「今のキー情報が押されていて、前回のキー情報は押されていない」


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

Name: バグ  ..ハッカー(159,616ポイント)   Date: 2009/05/29(金) 08:54   No:34174     
Title: Re:キーダウンイベントの取得方法    
私はGetKeyboardState関数を定期的に呼び出して判定しています。
使いまわしが出来るように、押下判定用のクラスを作成してますが、アプローチが違うので、参考にはならないかもしれませんけど、一応添付しておきますね(^_^;)


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

Name: チルチル  ..上級者(17,457ポイント)   Date: 2009/05/30(土) 20:46   No:34246     
Title: Re:キーダウンイベントの取得方法    
ゲームプログラミングの館のGetHitKeyStateAll_2関数を使うのが良いんじゃないんでしょうか?
これはカウンタを使いますが他の方法だとフレームの進行と噛み合わないと思うので・・
どのくらい押されているかもわかりますし・・

もしくはループの最初で

if(キー入力状態が0)

キーの入力状態を更新

if(キーの入力状態が1になっていたら)

フラグか何かを立てる

のような処理を行えば良いんじゃないでしょうか?

GetHitKeyStateAll_2関数の処理を簡略化しただけですが
入力状態を格納する変数を流用すれば新たに変数を作らなくてもいいですし・・


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



Name: R  ..入門者(3,224ポイント)   Date: 2009/05/30(土) 16:37   No:34213       
Title: スタックについて    
データ構造の勉強中で、スタックを以下のように書いてみました。

#include<stdio.h>
#include<stdlib.h>
#define STACKSIZE 100
typedef struct {
int top;
int data[STACKSIZE];
} stack;

//スタックの初期化
void initstack(stack *s){
s->top = -1;
}
//スタックが空か
int stackempty(stack *s){
return s->top < 0;
}
//スタックにデータをプッシュ
void push(stack *s,int x){
s->top++;
if(s->top >= STACKSIZE){
puts("overflow");
exit(1);}
else
s->data[s->top]=x;
}
//スタックからデータをポップ
int pop(stack *s){
if(s->top<0){
puts("underflow");
exit(1);}
else
return s->data[s->top--];
}
int main(void){
stack S;
initstack(&S);
push(&S,1);
push(&S,2);
push(&S,3);
(1)://printf("%d %d %d",pop(&S),pop(&S),pop(&S)); 出力 1 2 3
(2)/*printf("%d",pop(&S));
printf("%d",pop(&S));
printf("%d",pop(&S));*/
}



このプログラムでは1,2,3とSに積んでいるのでしているので3,2,1とポップしてほしいのですが
(1)で出力すると123、(2)で出力すると321と実行結果がなんでか違ってしまいます。
原因がさっぱりわからないのでどなたか教えていただけないでしょうか


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


Name: たかぎ [URL]  ..ハッカー(102,355ポイント)   Date: 2009/05/30(土) 16:53   No:34217     
Title: Re:スタックについて    
> (1)で出力すると123

関数の実引数の評価順序は不定だからです。


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

Name: R  ..入門者(3,255ポイント)   Date: 2009/05/30(土) 19:48   No:34236 解決!     
Title: Re:スタックについて    
たかぎさん、ありがとうございます。
てっきり前から順に評価されるものだと思っていましたが処理系依存だったのですね・・・。


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

Name: たかぎ [URL]  ..ハッカー(102,841ポイント)   Date: 2009/05/30(土) 19:50   No:34237     
Title: Re:スタックについて    
> 処理系依存だったのですね・・・。

違います。不定です。


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

Name: たかぎ [URL]  ..ハッカー(102,862ポイント)   Date: 2009/05/30(土) 19:53   No:34238     
Title: Re:スタックについて    
すみません、「不定」ではなく「未規定」でした。

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

Name: lbfuvab  ..上級者(20,776ポイント)   Date: 2009/05/30(土) 20:22   No:34240     
Title: Re:スタックについて    
不定や未定義や未規定の違いは何なのでしょうか?
教えて下さい。


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

Name: たかぎ [URL]  ..ハッカー(102,889ポイント)   Date: 2009/05/30(土) 20:28   No:34242     
Title: Re:スタックについて    
> 不定や未定義や未規定の違いは何なのでしょうか?

JIS X3010:2003の3.4.3, 3.4.4, 3.17.2, 3.17.3を参照してください。


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



Name: 山崎  ..初心者(8,898ポイント)   Date: 2009/05/30(土) 19:18   No:34233       
Title: バッファオーバーランについて    
お世話になっております、山崎です。
今回はバッファオーバーランについて伺いに参りました。
OSはXP、エディタはMicrosoft Visual C++ 2008です。

デバッグしていたところ、
FHandle=CreateFontToHandle(NULL,FontSize,1,DX_FONTTYPE_EDGE);
という行を実行したときに「バッファ オーバーランが ○○.exe で発生し、プログラムの内部状態を破損しました。(以降略)」という
メッセージが出て、それ以降の実行ができません。

コードの量が多いため全てのコードを載せることはできませんが、
ある程度の量のメモリを必要とするオブジェクトや構造体はnewで動的確保し、
可能であればintを避けてshort intを使うなど、極力メモリは節約してきたつもりです。

タスクマネージャでこのプログラムのメモリ使用量を見たところ、
バッファオーバーランが起こったのは34732Kのときでした。
今作成中のプログラムはまだまだ大きくなる予定なので、
これ以上このプログラムにメモリを割くことができないとなると致命的です。

このバッファオーバーランとは、どのようなときに起こるのでしょうか?
バッファオーバーランを引き起こしてしまうありがちなミスなどがあれば
是非とも教えていただきたいと思います。


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


Name: 山崎  ..中級者(9,004ポイント)   Date: 2009/05/30(土) 19:26   No:34234 解決!     
Title: Re:バッファオーバーランについて    
申し訳ございません、自己解決いたしました。

ただ単に、FontSizeの初期値を代入する前に
FHandle=CreateFontToHandle(NULL,FontSize,1,DX_FONTTYPE_EDGE);
を呼び出してしまった、というものでした。
この行の前にFontSize=15;を持ってきたところ、エラーを回避できました。

初めてバッファオーバーランというエラーに遭遇したため、
舞い上がってしまいました・・・お騒がせして本当に申し訳ございません。
お恥ずかしい限りです。


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



Name: yskey  ..ぴよぴよ(108ポイント)   Date: 2009/05/30(土) 13:44   No:34205       
Title: GV.hで宣言される変数    
始めましてyskeyです。最近プログラミングを始めたひよっこなのでたくさんわからないことがあり苦戦しています。このサイトにはとてもお世話になっております。
そこで質問なんですが・・・
龍神録プログラミングの館である、「GV.h」というヘッダーファイルで宣言されるint型変数は初期化しなくても値が0になるんですがこれはなぜなんでしょうか?


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


Name: ランド  ..入門者(4,354ポイント)   Date: 2009/05/30(土) 13:58   No:34206     
Title: Re:GV.hで宣言される変数    
GV.hを読んでいないので異なるかもしれませんが、非常にまとまった文章が検索で見つかりました。
以下は引用文です。

ローカルの初期化はちょっと特殊で、
int c[TMAX]={1};
だと、先頭が1で残りがゼロになりますが、
int c[TMAX];
だと、一切初期化されず、不定の値になります。
一方、グローバル変数などは、
int a[TMAX];
static int b[TMAX];
static int d[TMAX];
と、初期化要素を一切書かなくても、ゼロで初期化されることが保証されています。

http://oshiete1.goo.ne.jp/qa4295542.html


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

Name: yskey  ..ぴよぴよ(133ポイント)   Date: 2009/05/30(土) 19:18   No:34232     
Title: Re:GV.hで宣言される変数    
>>ランドさん
ご回答ありがとございます。
グローバルで宣言するとゼロになるんですね。


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



Name: C  ..ぴよぴよ(743ポイント)   Date: 2009/05/30(土) 17:45   No:34227       
Title: 無題    
入力した文字列の文字数を出力するプログラムを教えてください。

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


Name: non  ..熟練のプログラマー(44,178ポイント)   Date: 2009/05/30(土) 17:52   No:34229     
Title: Re:無題    
wcslen関数を使えばよいのでは?


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

Name: たかぎ [URL]  ..ハッカー(102,695ポイント)   Date: 2009/05/30(土) 17:55   No:34230     
Title: Re:無題    

#include <iosfwd>
#include <string>

template <class C, class Traits = std::char_trais<C> >
void foo(std::basic_istream<C, Traits>& istr, std::basic_ostream<C, Traits>& ostr)
{
std::basic_string<C, Traits> str;
istr >> str;
ostr << str.size();
}

こういうことでしょうか?


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



Name: 初心者  ..プログラマー(32,574ポイント)   Date: 2009/05/30(土) 17:21   No:34224       
Title: ファイル・フォルダの検索    
指定したディレクトリの中にある、
ファイルとフォルダの名前を全て取得したいんですけど、
どうしたらいんでしょうか?

環境
VC++とDXライブラリを使っています。

足りないところがありましたら、ご指摘お願いします。


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


Name: たかぎ [URL]  ..ハッカー(102,579ポイント)   Date: 2009/05/30(土) 17:29   No:34225     
Title: Re:ファイル・フォルダの検索    
FindFirstFile, FindNextFile, FindCloseを調べてください。


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



Name: yuki  ..ぴよぴよ(534ポイント)   Date: 2009/05/30(土) 16:52   No:34215       
Title: エラーについて    
メイクしたときに、

program is still running?

というエラーが出ることがあるんですが、どうやってプログラムを止めればいいのでしょうか?


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


Name: たかぎ [URL]  ..ハッカー(102,403ポイント)   Date: 2009/05/30(土) 16:55   No:34218     
Title: Re:エラーについて    
環境も不明ですし、メイクの前に何をやったのかも不明です。

> どうやってプログラムを止めればいいのでしょうか?

これだけの情報量だと、電源を切る以外の方法は見出せません。


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

Name: あ〜る  ..中級者(9,092ポイント)   Date: 2009/05/30(土) 17:02   No:34220     
Title: Re:エラーについて    
多分Ctrl+Alt+Deleteでタスクマネージャー開いて終了させれば大丈夫だった筈です

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

Name: yuki  ..ぴよぴよ(601ポイント)   Date: 2009/05/30(土) 17:04   No:34221     
Title: Re:エラーについて    
環境は
OSはWindows Vista
コンパイラはborland C++
です。

メイク前には、プログラムを実行して、プログラムを修正して、もう一度コンパイルしました。


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

Name: yuki  ..ぴよぴよ(632ポイント)   Date: 2009/05/30(土) 17:11   No:34222     
Title: Re:エラーについて    
タスクマネージャーを開いてやったら、うまくいきました。
ありがとうございました。


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



Name: Ma  ..初心者(8,660ポイント)   Date: 2009/05/29(金) 19:02   No:34181       
Title: 同名ファイルが同じフォルダに存在できる    
DXライブラリのツールにある、アーカイブ機能を使用させてもらっていたのですが、
今回、意味不明な現象が起きたのでお助けお願いします。

画像にあるように、アーカイブファイル(拡張子afにしました。)を作っていたのですが、
突然アーカイブを開けなくなったので何かと思って、古いのをペーストして上書きしてみようと
試みたところ、なぜか上書きされず、違うファイルとして扱われました。

ファイル名が完璧に一致しているとは思うのですが・・・
でも、なぜか古い方のアーカイブのファイル名をコピーして、
(コピーした後に古いほうのファイルは消しました。)
新しいアーカイブ方にペーストしたら直りました。

まるで、ただ単純に私がファイル名を間違えているかのような反応ですが、、、
なぜでしょう?


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


Name: Ma  ..初心者(8,733ポイント)   Date: 2009/05/29(金) 19:18   No:34182 解決!     
Title: Re:同名ファイルが同じフォルダに存在できる    
ファイル拡張子の後に全角スペースが入っていたのでしょうか…
もう直してしまい確認不可能ですが、きっとそうとしか考えられないので解決にしておきます。


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

Name: Justy  ..伝説なるハッカー(365,799ポイント)   Date: 2009/05/30(土) 00:57   No:34190     
Title: Re:同名ファイルが同じフォルダに存在できる    

>ファイル拡張子の後に全角スペースが入っていたのでしょうか

 そのキャプチャ画像をみる限り、一見わかりづらいです読み込まれない方は
"image.af"になっているようです。

 つまり、最後の fの文字が半角の fではなく、全角のfに……。




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

Name: Ma  ..初心者(8,760ポイント)   Date: 2009/05/30(土) 04:46   No:34192 解決!     
Title: Re:同名ファイルが同じフォルダに存在できる    
( ̄ ̄□ ̄ ̄;)!
ぜんぜん見分けがつきませんでしたorz
ありがとうございました。


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



Name: niconico  ..ぴよぴよ(2ポイント)   Date: 2009/05/11(月) 00:12   No:33288       
Title: レーザーの計算    
龍神録のシューティングを改造してるのですが、それでザコ敵が死んでしばらくしてからレーザーを消したいように設定したいのですが、それがうまくいかないのです。
いまのところ、敵が死んでもレーザーの回転の計算はされるのでが、当たり判定などの計算がされていなくて、困っています(shot.cppのlazer_calc関数)
こんなことってあり得るのですか?

これで説明不足のようだったら関数を載せます。ぜひ言ってください!
足りない脳みそを絞っても答えが出そうにないです……
よろしくお願いします!!


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


Name: BEMANI  ..プログラマー(28,294ポイント)   Date: 2009/05/11(月) 02:21   No:33292     
Title: Re:レーザーの計算    
>>niconicoさん
>それでザコ敵が死んでしばらくしてからレーザーを消したいように設定したいのですが、
>それがうまくいかないのです。
>いまのところ、敵が死んでもレーザーの回転の計算はされるのでが、
>当たり判定などの計算がされていなくて、困っています
情報が「当たり判定などの計算がされていないので困っている」だけですので答えようがありません。
どういう処理・計算をしていて、コンパイラ、ライブラリ・・・等々を少なくとも載せてほしいです。
一番はソースを載せるのがいいと思います。


>ザコ敵が死んでしばらくしてからレーザーを消したいように設定したいのですが、
これは、当たり判定がうまくいってないからレーザーが消えていないと言う事だったのでしょうか?
それとも、単にレーザーを消すだけの処理なのでしょうか?
実行時のイメージが今一つ掴めなかったです。

ぱっと思いついたので下の二つです。
・ザコが死んでから何フレームかカウントし、あるカウントまで来たらレーザーを消す
・レーザーを出してから何フレームか経ったら消す


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

Name: niconico  ..ぴよぴよ(0ポイント)   Date: 2009/05/11(月) 16:27   No:33309     
Title: Re:レーザーの計算    
あわててすいません
いろいろ抜けてました
やろうとしているのは、敵が死んでしばらくしたらレーザーが収束し、消えるというものです
自分がとった対策は最後に収束することは決まっているので、最後の収束する時間を早めるというものです
コードは全部載せるととんでもない長さになるので重要なところだけのせます
長くなってしまったので二回に分けます

レーザーの計算

void lazer_calc(){

int i;
for(i=0;i<LAZER_MAX;i++){
//表示位置を設定
lazer[i].disppt[0].x=lazer[i].startpt.x+cos(lazer[i].angle+PI/2)*lazer[i].haba;
lazer[i].disppt[0].y=lazer[i].startpt.y+sin(lazer[i].angle+PI/2)*lazer[i].haba;
lazer[i].disppt[1].x=lazer[i].startpt.x+cos(lazer[i].angle-PI/2)*lazer[i].haba;
lazer[i].disppt[1].y=lazer[i].startpt.y+sin(lazer[i].angle-PI/2)*lazer[i].haba;
lazer[i].disppt[2].x=lazer[i].startpt.x+cos(lazer[i].angle-PI/2)*lazer[i].haba+cos(lazer[i].angle)*lazer[i].length;
lazer[i].disppt[2].y=lazer[i].startpt.y+sin(lazer[i].angle-PI/2)*lazer[i].haba+sin(lazer[i].angle)*lazer[i].length;
lazer[i].disppt[3].x=lazer[i].startpt.x+cos(lazer[i].angle+PI/2)*lazer[i].haba+cos(lazer[i].angle)*lazer[i].length;
lazer[i].disppt[3].y=lazer[i].startpt.y+sin(lazer[i].angle+PI/2)*lazer[i].haba+sin(lazer[i].angle)*lazer[i].length;
//あたり範囲を設定
lazer[i].outpt[0].x=lazer[i].startpt.x+cos(lazer[i].angle+PI/2)*(lazer[i].haba*lazer[i].hantei)+cos(lazer[i].angle)*lazer[i].length*((1-lazer[i].hantei)/2);
lazer[i].outpt[0].y=lazer[i].startpt.y+sin(lazer[i].angle+PI/2)*(lazer[i].haba*lazer[i].hantei)+sin(lazer[i].angle)*lazer[i].length*((1-lazer[i].hantei)/2);
lazer[i].outpt[1].x=lazer[i].startpt.x+cos(lazer[i].angle-PI/2)*(lazer[i].haba*lazer[i].hantei)+cos(lazer[i].angle)*lazer[i].length*((1-lazer[i].hantei)/2);
lazer[i].outpt[1].y=lazer[i].startpt.y+sin(lazer[i].angle-PI/2)*(lazer[i].haba*lazer[i].hantei)+sin(lazer[i].angle)*lazer[i].length*((1-lazer[i].hantei)/2);
lazer[i].outpt[2].x=lazer[i].startpt.x+cos(lazer[i].angle-PI/2)*(lazer[i].haba*lazer[i].hantei)+cos(lazer[i].angle)*lazer[i].length*lazer[i].hantei+cos(lazer[i].angle)*lazer[i].length*((1-lazer[i].hantei)/2);
lazer[i].outpt[2].y=lazer[i].startpt.y+sin(lazer[i].angle-PI/2)*(lazer[i].haba*lazer[i].hantei)+sin(lazer[i].angle)*lazer[i].length*lazer[i].hantei+sin(lazer[i].angle)*lazer[i].length*((1-lazer[i].hantei)/2);
lazer[i].outpt[3].x=lazer[i].startpt.x+cos(lazer[i].angle+PI/2)*(lazer[i].haba*lazer[i].hantei)+cos(lazer[i].angle)*lazer[i].length*lazer[i].hantei+cos(lazer[i].angle)*lazer[i].length*((1-lazer[i].hantei)/2);
lazer[i].outpt[3].y=lazer[i].startpt.y+sin(lazer[i].angle+PI/2)*(lazer[i].haba*lazer[i].hantei)+sin(lazer[i].angle)*lazer[i].length*lazer[i].hantei+sin(lazer[i].angle)*lazer[i].length*((1-lazer[i].hantei)/2);

double ymax=lazer[i].lphy.angle,ty=lazer[i].lphy.time,t=lazer[i].cnt;
double delt=(2*ymax*t/ty - ymax*t*t/(ty*ty));
if(lazer[i].lphy.time!=0)//回転移動時間内なら
lazer[i].angle=lazer[i].lphy.base_ang+delt;//回転する
if(lazer[i].lphy.conv_flag==1){//座標変換をするか
conv_pos0(&lazer[i].startpt.x,&lazer[i].startpt.y,
lazer[i].lphy.conv_x,lazer[i].lphy.conv_y,
lazer[i].lphy.conv_base_x,lazer[i].lphy.conv_base_y,
-delt);
}
if(lazer[i].cnt>lazer[i].lphy.time){//回転時間を過ぎるとやめる
lazer[i].lphy.time=0;
lazer[i].lphy.conv_flag=0;
}
lazer[i].cnt++;
}
}



1,769ポイント を落としてしまった。

Name: niconicp  ..ぴよぴよ(245ポイント)   Date: 2009/05/11(月) 16:27   No:33310     
Title: Re:レーザーの計算    


//敵が死ぬかどうかの決定
void enemy_death_judge(int s){
int i;
se_flag[8]=1;//敵に当たった音
if(enemy[s].hp<0){//敵のHPが0未満になったら
enemy[s].flag=0;//敵を消滅させる
se_flag[1]=1;//敵のピチュリ音
enter_del_effect(s);
for(i=0;i<LAZER_MAX;i++){
if(lazer[i].flag==1){//もし、敵が死んでいるが、レーザーが撃っているのならば
lazer[i].flag=2;
}
}
enter_enemy_item(s);//敵sのアイテムを出現させる(39章)
for(i=0;i<SHOT_MAX;i++){//敵総数分
if(shot[i].flag!=0){//登録されている弾幕データがあれば
if(s==shot[i].num){//その敵が登録した弾幕があれば
shot[i].flag=2;//それ以上弾幕を続けないフラグを立てる
break;
}
}
}
}
}



レーザーの動き
//レーザーの計算っていうコメントのところ、あでは無視してもいいと思いますが、一応のせることにします

void shot_bullet_H009(int n){
#define TM008 420
#define DIST 60
int i,j,k,t=shot[n].cnt%TM008,t2=shot[n].cnt,h=0;
static int num;
if(t2==0)num=4;
if(t==0){
for(j=0;j<2;j++){
for(i=0;i<num;i++){
int plmn=(j ? -1 : 1);
if((k=search_lazer())!=-1){
lazer[k].col = j;//弾の色
lazer[k].knd = 0;//弾の種類
lazer[k].angle = PI2/num*i+PI2/(num*2)*j+PI2/(num*4)*((num+1)%2);//角度
lazer[k].startpt.x= enemy[shot[n].num].x+cos(lazer[k].angle)*DIST;//座標
lazer[k].startpt.y= enemy[shot[n].num].y+sin(lazer[k].angle)*DIST;
lazer[k].flag = 1;
lazer[k].cnt = 0;
lazer[k].haba = 2;//幅
lazer[k].state = j;//ステータス
lazer[k].length = 600;//レーザーの長さ
lazer[k].hantei = 0;
lazer[k].lphy.conv_flag=1;//回転フラグ
lazer[k].lphy.conv_base_x=enemy[shot[n].num].x;//回転基準位置
lazer[k].lphy.conv_base_y=enemy[shot[n].num].y;
lazer[k].lphy.conv_x=lazer[k].startpt.x;//回転元の位置
lazer[k].lphy.conv_y=lazer[k].startpt.y;
input_lphy(&lazer[k],80,PI/num*plmn);//代入
}
}
}
se_flag[33]=1;
}
//レーザー計算
for(i=0;i<LAZER_MAX;i++){
if(lazer[i].flag>0){
if(lazer[i].flag==2){
h=100;
}
int cnt=lazer[i].cnt;
int state=lazer[i].state;
if(state==0 || state==1){
if(cnt==80){
lazer[i].haba=30;//幅を30に
lazer[i].hantei=0.7;//表示幅の半分を判定範囲に
}
if(cnt>=260-h && cnt<=320-h){
if(cnt==280-h)
lazer[i].hantei=0;
lazer[i].haba=10*(60-(cnt-260+h))/60.0;
if(cnt==320-h)
lazer[i].flag=0;
}
}
}
}
if(t==TM008-1)
num=(++num);
}



グラフィックについてはレーザーの幅が0以上ならば描写するようにしてあるので、問題ないと思います



よろしくお願いします


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

Name: BEMANI  ..プログラマー(28,641ポイント)   Date: 2009/05/11(月) 19:53   No:33318     
Title: Re:レーザーの計算    
自分はざっと見るだけなので、的外れなことを言ってたら申し訳ございません。

デバッガを使い、当たり判定に関わる関数・変数の中身をトレスしてみて下さい。
作った本人で見た方が間違いに気づくかなぁ〜と思います。


自分が気になったのは以下の二点。
enemy_death_judgeですが、
当たり判定の計算がされていないのではなく、単に関数が呼ばれていないせいで敵が消えず
当たり判定が行われていないように見えている(実際は当たっているが敵が消えていないだけ)
・・・ということはないですか?


また、lazer_calc の中にある 「//あたり範囲を設定」 のレーザの当たり判定設定部分ですが、
設定だけして当たり判定の関数を呼んでいないことはないですか?
検索したところ何処にも書いてなかったので、もしかしたら呼び忘れなのかなぁ〜と思いました。


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

Name: niconico  ..ぴよぴよ(273ポイント)   Date: 2009/05/12(火) 00:56   No:33333     
Title: Re:レーザーの計算    
enemy_death_judgeが引き金になって音を出したり、敵が消えたりするのでそれは間違いないと思います

あと、実はlazer_calcはレーザーの計算するだけで、当たり判定は別のところで呼び出しているので大丈夫です
今、確認しました

あと、さっき気がついたのですが、このプログラムだとlazer[i].flag=2になるときにすべての敵に対してやっちゃって、最終的にENEMY_MAXの番号の一番最後の敵のレーザー調べてるだけで、別にレーザー出してる敵のことを調べてるわけじゃないんですよね、これ


デバッカですか……
いままで使ったことないのですが、使ってみたいと思います!


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

Name: BEMANI  ..プログラマー(29,035ポイント)   Date: 2009/05/12(火) 16:02   No:33348     
Title: Re:レーザーの計算    
>enemy_death_judgeが引き金になって音を出したり、敵が消えたりするのでそれは間違いないと思います
親記事には「当たり判定などの計算がされていなくて」と書かれていますが、
敵が消えると言う事は当たり判定の計算は出来てるのではないですか?

何が出来ていて、何が出来ていないか混乱してきました;



>あと、さっき気がついたのですが、
>このプログラムだとlazer[i].flag=2になるときにすべての敵に対してやっちゃって、
>最終的にENEMY_MAXの番号の一番最後の敵のレーザー調べてるだけで、
ENEMY_MAX が入った処理は、提示されたソースにはなかったので何とも言えません・・・
もし、それが間違いなら発射している敵に対して調べるコードに直して下さい。


>別にレーザー出してる敵のことを調べてるわけじゃないんですよね、これ
レーザーを発射している敵を調べるのでしたら、
敵がレーザーを発射した時にフラグを立て、検索すればいいと思います。

例えば、敵Aがレーザーを発射したと仮定すると、
敵Aが出現していて、かつ敵Aのレーザー発射フラグが立っているなら、
敵Aがレーザーを発射していることになります。
敵Aが死んだ時や、レーザーを打ち終わった後にレーザー発射フラグを初期化する必要があります。


デバッガは非常に重宝しますので是非使ってみて下さい。


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

Name: niconico  ..ぴよぴよ(329ポイント)   Date: 2009/05/12(火) 22:52   No:33361     
Title: Re:レーザーの計算    
すいません
説明不足でした

レーザーと自機の当たり判定はできているのですが、レーザーの当たり判定の変化(レーザーの縮小)ができてないんですね


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

Name: BEMANI  ..プログラマー(29,739ポイント)   Date: 2009/05/13(水) 03:19   No:33368     
Title: Re:レーザーの計算    
shot_bullet_H009 関数について気になった所を書いておきます。
なお、この関数についても、中でどうしているのかという細かい解析まではしていません。
見当はずれな回答になっている可能性もありますが予め御了承下さい。


shot_bullet_H009 関数の中で

>int i,j,k,t=shot[n].cnt%TM008,t2=shot[n].cnt,h=0


まず、この変数はローカルで宣言(ブロック内で宣言・定義)されているので、
shot_bullet_H009 を抜けた時点で値はなくなります。
つまり、関数が呼ばれる毎にこの変数が作られ、設定した値で初期化されます。

もし、関数を抜けても値を保持したいのであれば static int i 等、こんな感じで宣言・定義するか、
またはグローバル変数にしてください。
static とは関数を抜けても値を保持してくれます。



そして、次はここの部分です。


if(lazer[i].flag==2){
h=100;
}

中略

if(cnt==280-h)
lazer[i].hantei=0;
lazer[i].haba=10*(60-(cnt-260+h))/60.0;

if(cnt==320-h)
lazer[i].flag=0;



h の役割が良く解りませんが、
もし、lazer[i].flag==2 でない時、この h はどういう動きであればいいのでしょうか?

320-h などで計算していますが、今のままだと、初期化した時の 0か、
lazer[i].flag==2 の条件が成立した時に代入される 100 という値のどちらかです。
これは niconicoさんが望む h の値でしょうか?



最後はこの部分です。


if(cnt==280-h)
lazer[i].hantei=0;
lazer[i].haba=10*(60-(cnt-260+h))/60.0;



lazer[i].haba=10*(60-(cnt-260+h))/60.0; この代入は、
(cnt == 280-h)の時に行うものではないですか?

つまり、



if(cnt==280-h){
lazer[i].hantei=0;
lazer[i].haba=10*(60-(cnt-260+h))/60.0;
}

ではないかということです。


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

Name: niconico  ..ぴよぴよ(551ポイント)   Date: 2009/05/17(日) 01:32   No:33555     
Title: Re:レーザーの計算    
すいません
返信遅れました!

グローバル変数ですか
そうですね、試してみる価値はありそうですね
ありがとうございます

hは敵が死んだときに100、生きてるときに0が入ってくれるようにしてほしいですね
最初はcnt+100としていたんですが、うまくいかなかったので、このような形にしました。
敵が死んだときにlazer[i].flag=2になるので、これでいいと思ってます


幅は徐々にすっとなくすようにしてほしいのでそれでいいです



ホントに遅れてすいませんでした




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

Name: BEMANI  ..プログラマー(30,347ポイント)   Date: 2009/05/19(火) 11:39   No:33668     
Title: Re:レーザーの計算    
現状、レーザーが消える時はどうなっていますか?
正直うまくいってないと書かれているだけなので、どう消えていくのかが解りません。
(例えば、幅が徐々に狭くならず突然消えるとか、消えることすらしない等)


>ホントに遅れてすいませんでした
最近忙しいので、自分も返信できない可能性があります。
またしばらく見れないかもしれないので・・・



ライブラリはDxLibを使っているのでしょうか?
自分は DxLib 使ってないのでこの関数で実現できるかはなんとも言えませんが、
DxLib のリファレンスページを見に行った所「グラフィックデータ制御関数」と言う部分がありました。
レーザーを縮小したいようなので「DrawExtendGraph」や「DrawModiGraph」辺りを試してみては如何でしょうか?


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

Name: niconico  ..ぴよぴよ(635ポイント)   Date: 2009/05/23(土) 00:30   No:33885     
Title: Re:レーザーの計算    
グローバル変数を使ったらなんとかできました
しかし!
レーザーが止まりません
ビデオも見てもらったらわかりますが、ひどいです
なんか違うもんだいになってきたので新しくした方がいいんですかね?


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

Name: BEMANI  ..プログラマー(30,851ポイント)   Date: 2009/05/23(土) 12:23   No:33901     
Title: Re:レーザーの計算    
>>niconicoさん
すいません・・・質問する時は出来る限り情報を詳しく載せて頂けるとありがたいです。

>グローバル変数を使ったらなんとかできました
「レーザーの幅を小さくする」というのが出来たという事ですよね?


>レーザーが止まりません
どう止まらないのですか?
グローバル変数に変えた時点でおかしくなったのなら、その変数の中身やレーザーのメンバをトレスしてみて下さい。
何がグローバル変数か解りませんが、そうしたため全ての弾がその変数を参照し、値を書き変えているという可能性があります。
値を見ていけばどのタイミングでレーザーの挙動がおかしくなるか調べられると思います。


>ビデオも見てもらったらわかりますが、ひどいです
ビデオと言うのは何を指しているのでしょうか?


>なんか違うもんだいになってきたので新しくした方がいいんですかね?
記事名である「レーザーの計算」という範囲から逸れていると判断されるのなら新しい記事がいいと思いますが
レーザーの挙動がおかしいみたいなので、多分新記事でなくてもいいと思います。


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

Name: niconico  ..ぴよぴよ(815ポイント)   Date: 2009/05/24(日) 01:08   No:33953 解決!     
Title: Re:レーザーの計算    
今日問題がレーザーに関しては全て完成しました
ホントお世話になりました
完成したのはほとんどBEMANIさんのおかげです


添付していたつもりなんですが、できていなかったようで申し訳なかったです
完成したのを見てもらいかったのですが、重すぎてのせることができないようです


次の問題はレーザーを出す敵を複数同時にだした場合、一体死んだだけなのに、すべての敵のレーザーが収束してしまうことです
本当にありがとうございました
次の問題にもお付き合いしていただけたらありがたいです


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

Name: BEMANI  ..プログラマー(31,132ポイント)   Date: 2009/05/24(日) 04:25   No:33964     
Title: Re:レーザーの計算    
>>niconicoさん
お、ついにいけましたか・・・。
自分がソースを提示した訳でもないので、出来るかどうか不安でした;
もし差し支えがないようであれば、「どういう風に直したら成功した」
というのを載せて頂けると嬉しいかもです。
(他の方が同じような問題で検索した時、直し方が書いてあると質問しなくていい場合がありますので・・・)

提案しといてなんですが、グローバル変数でその症状が直ったのなら、
ローカル変数で動かせるように変更しといたほうがいいですよ;
グローバル変数はどこからでも変数の中身を触れるので、
値を参照しあって書き変えられるというバグが発生する可能性があります。
(管理できるから大丈夫!というのであれば特に問題はないです。)



>次の問題はレーザーを出す敵を複数同時にだした場合、
>一体死んだだけなのに、すべての敵のレーザーが収束してしまうことです
これは上のソースを見ていて思いました。
敵が二体以上出ればどうなるのだろうなぁ〜と・・・。

恐らく原因は、レーザーの配列を敵全てが共有している所にあると思われます。
for文でレーザーの最大数分ループし、その中でレーザーの幅を変更していますが、
これが二匹・・・三匹になっても for文はレーザーの最大数分ループします。


一つ解決策として、敵の構造体を作り、その中にレーザーの配列を入れればいいです。
ざっくりとソースを提示してみます。




// 敵構造体
typedef struct _enemy_data
{
LASER Laser[LASER_MAX];
// レーザー構造体(LASER型の構造体があると想定しています)
bool LaserFlag;
// レーザー発射フラグ(true:発射中)
bool DeadFlag;
// 生きているか死んでいるか(true:死んでいる)
[ 敵に必要そうな情報を随時追加して下さい ]
}ENEMY_DATA;


ENEMY_DATA Enemy[ENEMY_MAX];
// 敵を作成する



// 指定した敵番号のレーザー幅を小さくする関数
// 第一引数 : 敵構造体(参照渡し)

void LaserShrink(ENEMY_DATA& Enemy)
{
for(int i=0; i<LASER_MAX; i++)
{
Enemy.Laser[i].haba を小さくする処理
}
}


// 使う時
敵がレーザーを発射したら、Enemy[レーザーを発射した敵の番号].LaserFlag = true にし、

// こんな感じで、小さくする関数を呼ぶかどうかを判断します
for(int i=0; i<ENEMY_MAX; i++)
{
// 敵がレーザーを発射していて、かつ敵が死んでいる場合幅を小さくする関数を呼ぶ
if(Enemy[i].LaserFlag && Enemy[i].DeadFlag)
{
LaserShrink(Enemy[i]);
}
}



このサンプルは、敵がレーザー発射後に死んだ場合のみ幅を小さくしていきます。
幅が0以下の時の処理やその他諸々は省いています。
多分これで、少なくとも敵全部のレーザーが消えていくという症状は防げると思います。
(ぱっと思いつきで作ったので何か間違ってるかもしれませんが・・・)


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

Name: niconico  ..かけだし(2,454ポイント)   Date: 2009/05/30(土) 02:54   No:34191     
Title: Re:レーザーの計算    
>提案しといてなんですが、グローバル変数でその症状が直ったのなら、
>ローカル変数で動かせるように変更しといたほうがいいですよ;
>グローバル変数はどこからでも変数の中身を触れるので、
>値を参照しあって書き変えられるというバグが発生する可能性があります。
>(管理できるから大丈夫!というのであれば特に問題はないです。)

グローバル関数にしたというよりも、lazerの構造体にdeath_cntというのを加えました



BEMANIさんのおかげで敵のレーザーを分別することができました
まさかここまでやってくれるとは……
本当にありがとうございます
BEMANIさんがいなければできなかったと思います


では、自分の方法を載せたいと思います

まず、BEMANIさんのいったようにenemyの構造体にlazerの構造体をいれます
ついでにlazerの構造体と同じ構造のlazer2を作ります
これがボスのレーザーになります
で、レーザーに関する関数をコピーして片方をenemy[n].lazer[i].……、もう片方をlazer2[i].……という風に作っていきます
ついでにこのとき
graph_lazerの関数if文をlazer[i].haba>0 ||lazer[i].flag!=0という風にわけておきます
if(enemy[h].lazer[i].haba<=0 || enemy[h].lazer[i].flag==0){

enemy[h].lazer[i].flag=0;
enemy[h].lazer[i].cnt=0;
enemy[h].lazer[i].haba=0;
enemy[h].lazer[i].death=0;
}

もいっしょにつけておきます
もしかしたらいらない子かもしれません

最後に問題のshotH.cppの関数
実はこのとき気づいたのですが、lazerはshotに依存しているということ
つまり、shot[n].flag=0にしたら、lazerが消えるということです
よって、このようになりました
ボスのレーザーのサンプルがザコ敵に実装するとこのようになります

//レーザーのサンプル
void shot_bullet_H009(int n){
#define DIST 60
int i,j,k,t=shot[n].cnt,cnt_ctrl=0;
static int num=4;
if(t==0){
for(j=0;j<2;j++){
for(i=0;i<4;i++){
int plmn=(j ? -1 : 1);
if((k=search_lazer(n))!=-1){
enemy[shot[n].num].lazer[k].col = 1;//弾の色
enemy[shot[n].num].lazer[k].knd = 0;//弾の種類
enemy[shot[n].num].lazer[k].angle = PI2/num*i+PI2/(num*2)*j+PI2/(num*4)*((num+1)%2);//角度
enemy[shot[n].num].lazer[k].startpt.x= enemy[shot[n].num].x+cos(enemy[shot[n].num].lazer[k].angle)*DIST;//座標
enemy[shot[n].num].lazer[k].startpt.y= enemy[shot[n].num].y+sin(enemy[shot[n].num].lazer[k].angle)*DIST;
enemy[shot[n].num].lazer[k].flag = 1;
enemy[shot[n].num].lazer[k].cnt = 0;
enemy[shot[n].num].lazer[k].haba = 2;//幅
enemy[shot[n].num].lazer[k].state = 1;//ステータス
enemy[shot[n].num].lazer[k].length = 600;//レーザーの長さ
enemy[shot[n].num].lazer[k].hantei = 0;
enemy[shot[n].num].lazer[k].lphy.conv_flag=1;//回転フラグ
enemy[shot[n].num].lazer[k].lphy.conv_base_x=enemy[shot[n].num].x;//回転基準位置
enemy[shot[n].num].lazer[k].lphy.conv_base_y=enemy[shot[n].num].y;
enemy[shot[n].num].lazer[k].lphy.conv_x=enemy[shot[n].num].lazer[k].startpt.x;//回転元の位置
enemy[shot[n].num].lazer[k].lphy.conv_y=enemy[shot[n].num].lazer[k].startpt.y;
input_lphy(&enemy[shot[n].num].lazer[k],80,PI/num*plmn);//代入
}

}
}

se_flag[33]=1;
}
if(t<=170 && t>=80){
cnt_ctrl=180;
}
if(t<=260 && t>170){
cnt_ctrl=80;
}
if(t>260){
cnt_ctrl=0;
}
//レーザー計算
for(i=0;i<LAZER_MAX;i++){
if(enemy[shot[n].num].lazer[i].flag>0){
int cnt=enemy[shot[n].num].lazer[i].cnt;
if(enemy[shot[n].num].lazer[i].flag==2 || enemy[shot[n].num].flag!=1){
enemy[shot[n].num].lazer[i].death=cnt_ctrl;
enemy[shot[n].num].lazer[i].flag=2;
shot[n].flag=1;
}
int state=enemy[shot[n].num].lazer[i].state;
if(state==0 || state==1){
if(cnt==80){
enemy[shot[n].num].lazer[i].haba=30;//幅を30に
enemy[shot[n].num].lazer[i].hantei=0.9;//表示幅の半分を判定範囲に
}
if(cnt>=260-enemy[shot[n].num].lazer[i].death && cnt<=320-enemy[shot[n].num].lazer[i].death){
if(cnt==280-enemy[shot[n].num].lazer[i].death){
enemy[shot[n].num].lazer[i].hantei=0;
}
enemy[shot[n].num].lazer[i].haba=10*(60-(cnt-260+enemy[shot[n].num].lazer[i].death))/60.0;
}
if(enemy[shot[n].num].lazer[i].haba<=0 || t>320){
enemy[shot[n].num].lazer[i].flag=0;
enemy[shot[n].num].lazer[i].haba=0;
shot[n].flag=0;
}
}
}
}
}


cnt_ctrlが敵のレーザーの収束あいつ消えるか調整しています
関数にしようとしたのですが、よくわからなかったのでちょっと無理やりです
ちなみに、cnt_ctrlのif文のtは収束する時間よりも長くしてください
自分がやったのはこれぐらいですね


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




 
[ 1 , ... ]
 
 
管理者画面   RSS   + Powered By 21style +