C言語何でも質問掲示板

Total hit  今日  昨日  



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

 
   csvファイルは読み取っ ....   
     ・[38507] Dixq (管理人) 
     ・[38521] ととろ 
   キャラが動かない   
     ・[38506] Dixq (管理人) 
   クイズゲームを作りま ....   
     ・[38407] チルチル 
     ・[38408] Justy 
     ・[38425] TKOZ 
     ・[38426] TKOZ 
     ・[38429] non 
     ・[38430] ミヤ 
     ・[38432] ようすけ 
     ・[38433] TKOZ 
     ・[38436] TKOZ 
     ・[38438] situmon 
     ・[38472] TKOZ 
     ・[38473] situmon 
     ・[38483] TKOZ 
     ・[38491] situmon 
     ・[38495] TKOZ 
   無題   
     ・[38487] non 
     ・[38488] UKONN 
   storyH0.csvの何かがお ....   
     ・[38479] はね 
     ・[38480] はね 
     ・[38484] 夢夢 
   値の受け渡し   
     ・[38447] kazuoni 
     ・[38449] ととろ 
     ・[38450] kazuoni 
     ・[38456] ととろ 
     ・[38457] kazuoni 
     ・[38459] ととろ 
     ・[38460] ととろ 
   龍神録プログラミング ....   
     ・[38454] ありす 
   メモリ上のビットマッ ....   
     ・[38451] Justy 
     ・[38453] kazuoni 
   無題   
     ・[38442] ととろ 
   無題   
     ・[38421] Mist 
     ・[38422] Mist 
     ・[38431] box 
     ・[38439] SRT 
   環境固有の問題?それ ....   
     ・[38416] toyo 
     ・[38418] Mist 
     ・[38419] non 
     ・[38423] ミヤ 
     ・[38424] non 
     ・[38428] ミヤ 
   メニューからの終了に ....   
     ・[38414] あふぇ 
     ・[38415] toyo 
     ・[38417] tkmakwins15 
   FIELD_MAX_X ・・・・ ....   
     ・[38388] 夢夢 
     ・[38391] SRT 
     ・[38393] 夢夢 
     ・[38411] SRT 
   DxLibでの文字列変数   
     ・[38396] チルチル 
     ・[38397] usami 
     ・[38398] チルチル 
     ・[38400] バグ 
     ・[38401] usami 
     ・[38403] usami 
     ・[38406] バグ 
     ・[38410] usami 
   再生デバイス切替   
     ・[38342] situmon 
     ・[38352] コナコナ 
     ・[38356] Justy 
     ・[38387] コナコナ 
     ・[38409] Justy 
   クラスの設計   
     ・[38228] array 
     ・[38245] dic 
     ・[38271] Justy 
     ・[38404] dic 
   解決したはずが   
     ・[38381] ととろ 
     ・[38382] ととろ 
     ・[38389] 夢夢 
     ・[38394] kazuoni 
     ・[38399] Mist 
   ファイルを読み込み、 ....   
     ・[38313] kazuoni 
     ・[38314] array 
     ・[38323] non 
     ・[38326] デジキャメ 
     ・[38327] 初級者 
     ・[38328] non 
     ・[38385] デジキャメ 
     ・[38386] non 
     ・[38390] デジキャメ 
     ・[38392] kazuoni 
   無題   
     ・[38373] ととろ 
     ・[38374] kazuoni 
     ・[38378] ととろ 
   flagの確認について   
     ・[38376] ねこ 
     ・[38377] あ〜る 
   パッド入力について   
     ・[38357] Justy 
     ・[38371] ととろ 
   インクルードファイル ....   
     ・[38365] Justy 
     ・[38370] bebe 
   スコアボード   
     ・[38359] pooka 
     ・[38369] SGT 
   WINAPI裏描写について   
     ・[38229] Justy 
     ・[38236] kazuoni 
     ・[38250] kazuoni 
     ・[38269] Justy 
     ・[38275] kazuoni 
     ・[38318] Justy 
     ・[38367] kazuoni 
   無題   
     ・[38362] Justy 
   STG改良してきまし ....   
     ・[38338] チルチル 
     ・[38339] ひよこ 
     ・[38340] situmon 
     ・[38344] ひよこ 
     ・[38353] ラグ 
     ・[38354] チルチル 
     ・[38361] ひよこ 
   ボス弾幕について2   
     ・[38332] yrao 
     ・[38333] チルチル 
     ・[38334] yrao 
     ・[38336] チルチル 
     ・[38337] yrao 
     ・[38341] situmon 
     ・[38343] situmon 
     ・[38345] チルチル 
     ・[38346] yrao 
     ・[38347] situmon 
     ・[38350] yrao 
   Windowsプログラミング ....   
     ・[38349] windows 
   シューティングゲーム ....   
     ・[38210] Tatu 
     ・[38214] ねこ 
     ・[38226] situmon 
     ・[38227] situmon 
     ・[38230] situmon 
     ・[38234] ねこ 
     ・[38242] チルチル 
     ・[38244] バグ 
     ・[38246] ねこ 
     ・[38247] situmon 
     ・[38249] ねこ 
     ・[38251] ひよこ 
     ・[38258] situmon 
     ・[38260] チルチル 
     ・[38261] チルチル 
     ・[38262] situmon 
     ・[38263] チルチル 
     ・[38265] ひよこ 
     ・[38277] situmon 
     ・[38286] チルチル 
     ・[38287] situmon 
     ・[38311] array 
     ・[38348] situmon 
   Win32APIについて   
     ・[38301] 御津凪 
     ・[38309] sizuma 
     ・[38320] uwlover 
     ・[38329] バグ 
   C言語 途中で処理が ....   
     ・[38305] ランド 
     ・[38306] sizuma 
     ・[38307] kuz 
     ・[38308] box 
     ・[38310] sizuma 
     ・[38321] non 
     ・[38322] toyo 
     ・[38325] sizuma 
   SAKURAのサーバーへの ....   
     ・[38324] Dixq (管理人) 
   敵の種類を変える方法   
     ・[38312] array 
     ・[38315] kai 
     ・[38316] kai 
     ・[38317] kai 
   無題   
     ・[38297] @ 
     ・[38298] kazuoni 
     ・[38299] Jack 
   無題   
     ・[38283] box 
     ・[38284] さとり 
     ・[38285] box 
     ・[38290] さとり 
     ・[38292] LK 
     ・[38293] box 
     ・[38294] さとり 
     ・[38295] さとり 
   龍神録4章のDrawRotaG ....   
     ・[38289] MNS 
     ・[38291] r 
   ジャンプの考え方1につ ....   
     ・[38274] kazuoni 
     ・[38276] math 
     ・[38278] toyo 
     ・[38279] kazuoni 
     ・[38280] やそ 
     ・[38281] marh 
   龍神録プログラミング ....   
     ・[38270] array 
     ・[38273] 南 
   可搬性   
     ・[38199] array 
     ・[38202] ねこ 
     ・[38203] Haru 
     ・[38205] YuO 
     ・[38267] kamiya 
   描写エフェクト(?)   
     ・[38238] チルチル 
     ・[38240] 初心者 
     ・[38241] チルチル 
     ・[38248] 初心者 
     ・[38257] チルチル 
     ・[38266] 初心者 
   ソースコードの説明に ....   
     ・[38254]  
     ・[38256] 通りすがり 
     ・[38259] やそ 
   DXライブラリの設定   
     ・[38196] Dixq (管理人) 
     ・[38255] 初心者 
   教えてください   
     ・[38243] kazuoni 
   無題   
     ・[38232] mint 
     ・[38239] ksz 
   桁揃え   
     ・[38235] ねこ 
   関数が仕事していない ....   
     ・[38218] non 
     ・[38219] dic 
     ・[38221] owata 
     ・[38222] uwlover 
     ・[38223] uwlover 
     ・[38224] non 
     ・[38225] uwlover 
   テキストを読み込んで ....   
     ・[38208] kazuoni 
     ・[38209] non 
     ・[38211] chocomilk 
     ・[38212] バグ 
     ・[38213] non 
   キーを押したときだけ ....   
     ・[38139] 初級者 
     ・[38140] Libra 
     ・[38179] trx 
     ・[38180] Libra 
     ・[38181] trx 
     ・[38183] kazuoni 
     ・[38188] trx 
     ・[38190] non 
     ・[38191] kazuoni 
     ・[38192] non 
     ・[38194] kazuoni 
     ・[38200] trx 
     ・[38201] Libra 
     ・[38204] kazuoni 
   敵と弾が止まってしま ....   
     ・[38158] pooka 
     ・[38166] ひっさん 
     ・[38173] pooka 
     ・[38197] ひっさん 
   p1. 物体の速さと〜の ....   
     ・[38195] Dixq (管理人) 
   敵の弾がだんだん遅く ....   
     ・[38172] Justy 
     ・[38189] クロウ 
     ・[38193] クロウ 
   龍神録プログラミング ....   
     ・[38184] yu 
     ・[38187] 素人A 
   データを読み込んで計 ....   
     ・[38182] バグ 
     ・[38186] non 
   配列宣言時の要素数の ....   
     ・[38175] Justy 
     ・[38176] たかぎ 
     ・[38177] Justy 
     ・[38185] 山崎 
   DirectX解説本について ....   
     ・[38169] Justy 
     ・[38171] conio 
   VC,netでRedo機能 ....   
     ・[38122] バグ 
     ・[38124] 餅 
     ・[38125] バグ 
     ・[38126] バグ 
     ・[38127] 餅 
     ・[38128] バグ 
     ・[38132] 餅 
     ・[38137] バグ 
     ・[38160] バグ 
     ・[38165] 餅 
     ・[381211252505068] 餅 
   画像の分割読み込みに ....   
     ・[38147] ねこ 
     ・[38148] チルチル 
     ・[38150] ねこ 
     ・[38153] チルチル 
     ・[38155] ねこ 
     ・[38159] チルチル 
     ・[38161] kazuoni 
     ・[38162] Libra 
     ・[38163] チルチル 

Name: ととろ  ..入門者(3,518ポイント)   Date: 2009/08/26(水) 15:32   No:38463       
Title: csvファイルは読み取っているが画像が表示されない    
すみませんが。文章が長すぎでエラーがでたのでテキストを開いて読んでください。

ファイルの続き。

int enemy_num_search(){
for(int i=0;i<ENEMY_MAX;i++){//フラグのたって無いenemyを探す
if(enemy[i].flag==0){
return i;//使用可能番号を返す
}
}
return -1;//全部埋まっていたらエラーを返す
}

//敵の移動パターン0での移動制御

//敵情報を登録
void enemy_enter(){//敵の行動を登録・制御する関数
void load_story();
int n,i,j;
for(n=0;n<ENEMY_ORDER_MAX;n++){
if(enemy_order[n].cnt==stage_count){//現在の瞬間がオーダーの瞬間なら
if((i=enemy_num_search())!=-1){
enemy[i].flag =1;
enemy[i].cnt =0;
enemy[i].pattern=enemy_order[n].pattern;
enemy[i].muki =1;
enemy[i].knd =enemy_order[n].knd;
enemy[i].x =enemy_order[n].x;
enemy[i].y =enemy_order[n].y;
enemy[i].sp =enemy_order[n].sp;
enemy[i].bltime =enemy_order[n].bltime;
enemy[i].blknd =enemy_order[n].blknd;
enemy[i].blknd2 =enemy_order[n].blknd2;
enemy[i].col =enemy_order[n].col;
enemy[i].wait =enemy_order[n].wait;
enemy[i].hp =enemy_order[n].hp;
enemy[i].hp_max =enemy[i].hp;
enemy[i].vx =0;
enemy[i].vy =0;
enemy[i].ang =0;
for(j=0;j<6;j++)
enemy[i].item_n[j]=enemy_order[n].item_n[j];
}
}
}
}

//敵の行動制御
void enemy_act(){

int i;
if((i=enemy_num_search())!=-1){
for(i=0;i<ENEMY_MAX;i++){
if(enemy[i].flag==1){//その敵のフラグがオンになってたら
enemy_pattern0(i);
enemy[i].x+=cos(enemy[i].ang)*enemy[i].sp;
enemy[i].y+=sin(enemy[i].ang)*enemy[i].sp;
enemy[i].x+=enemy[i].vx;
enemy[i].y+=enemy[i].vy;
enemy[i].cnt++;
enemy[i].img=enemy[i].muki*3+(enemy[i].cnt%24)/6;
//敵が画面から外れたら消す
if(enemy[i].x<-20 || FIELD_MAX_X+20<enemy[i].x || enemy[i].y<-20 || FIELD_MAX_Y+20<enemy[i].y)
enemy[i].flag=0;
}
}
}
}

//敵処理メイン
void enemy_main(){
enemy_enter();
enemy_act();
}
//ヘッダーの中身です

GLOBAL enemy_t enemy[ENEMY_MAX];

GLOBAL enemy_order_t enemy_order[ENEMY_ORDER_MAX];//敵の出現情報

#define ENEMY_MAX 30

#define ENEMY_ORDER_MAX 500

GLOBAL void load();

GLOBAL void load_story();



敵情報をcsvファイルで取り込む。龍神録とほぼ同じコトをしているはずなのに、敵が画面に表示されません。
csvファイルは正常に最後まで読み込まれています。
回答お願いします
なおcsvファイルは龍神録11章のをそのまま使っています


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


Name: Dixq (管理人) [URL]  ..ウィザード(1,049,064ポイント)   Date: 2009/08/27(木) 21:33   No:38507     
Title: Re:csvファイルは読み取っているが画像が表示されない    
投稿されたコードを一字一句見てないのですが、
龍神録のサンプルと何か違いがあるのでしょうか?

「ほぼ」と書かれているからにはどこか変更されているのだと思いますが、
どの辺をどう変えたか教えてもらえると回答し易いかと思います。

また、ご自分でも、サンプルとどう違うか、何を変えたからおかしくなったのか見比べたりしてみて下さい。
何か解決の糸口になるかもしれません。


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

Name: ととろ  ..入門者(3,540ポイント)   Date: 2009/08/28(金) 00:46   No:38521 解決!     
Title: Re:csvファイルは読み取っているが画像が表示されない    
はい。ほぼなんて適当な質問すみません。
じっくり見てみます


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



Name: せな  ..ぴよぴよ(24ポイント)   Date: 2009/08/25(火) 14:38   No:38427       
Title: キャラが動かない    
DXライブラリVer 2.24cを使うと↑↓→←キーに反応するんですけど、Ver 2.25bだと反応しません。(Esc,Enterキー)などは反応します。
どうしてでしょうか?


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


Name: Dixq (管理人) [URL]  ..ウィザード(1,048,816ポイント)   Date: 2009/08/27(木) 21:31   No:38506     
Title: Re:キャラが動かない    
せなさん、こんばんは。
う〜ん、ごめんなさい。DXライブラリの内部的なこと、具体的なことは本家の公式掲示板でお聞きになってはいかがでしょうか?
作者様も回答してくださると思います。


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



Name: TKOZ  ..プログラマー(29,499ポイント)   Date: 2009/08/24(月) 21:24   No:38405       
Title: クイズゲームを作りました。    
コマンドプロンプトで動く形式のクイズゲームです。
画面は、しょぼいと思いますが、正解音と不正解音が鳴り、本格的です。

みなさんの意見を聞かせてください。

URLは、下記に書きます。
http://ppup.dip.jp/uploader/download/1251116359.zip/attatch
パスワードは
TKOZ
です。


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


Name: チルチル  ..熟練のプログラマー(42,602ポイント)   Date: 2009/08/24(月) 21:40   No:38407     
Title: Re:クイズゲームを作りました。    
本格的かどうかはわかりませんが
とりあえず数値キーが無いキーボードだと0が押し辛いです
項目が0から始まるのにも少し違和感がありますね・・
0,1,2,3以外を押しても先に進みますが
方向キーを押すと連続で進んだりしますね
あと選択肢は改行した方が見やすいかと


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

Name: Justy  ..伝説なるハッカー(408,132ポイント)   Date: 2009/08/24(月) 21:51   No:38408     
Title: Re:クイズゲームを作りました。    
 遊んでみました。
 問題に懐かしいのとかあって、ちょっと面白かったです。

 さて、気になった点は

・ 同じ問題が出る。

 せめて、全て出題しきるまでは同じ問題は出ないようにするか、
連続で同じ問題を出ないようにするとか、答の選択肢をシャッフルした
方がいいと思います。

・ 問題に答えるとき複数のキーを押したり連打したりすると、
次の出題時に勝手に回答したことになってしまう

 出題してから押したものに限って反応するようにすると誤動作がなくていいかと。
 ついでに、関係ないキー……アルファベットとかは無視するようにしておくと
いいかもしれません。

・ 終わりがない?
 どこかで区切りをつけて、正答数とかコメントとか出してあげると
いいですね。


・ 問題〜CPUは何の略?
 答が違うようです。
 cが1つ多いです。

・ 問題〜ゲームなどの〜APIは?
 OpenGLはゲームにも使われると思うのですが……。

・ 問題の回答の先頭に「・」がついているものと付いていないものとがある
 統一した方がいいですね。

・ 通常マイドキュメントに〜
 この問題はちょっと微妙です。
 通常マイドキュメント以外……デスクトップとか……に保存する人も多いですし、
回答以外の拡張子もマイドキュメントに保存する人は普通にいますので。


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

Name: TKOZ  ..プログラマー(30,280ポイント)   Date: 2009/08/25(火) 14:33   No:38425     
Title: Re:クイズゲームを作りました。    
ネットカフェから書き込みです。

チルチルさんへ
>とりあえず数値キーが無いキーボードだと0が押し辛いです
>項目が0から始まるのにも少し違和感がありますね・・
分かりました。項目を1から始めてみます。
もともと、プログラミングしやすい点で、0番から始めていましたので。

>0,1,2,3以外を押しても先に進みますが
>方向キーを押すと連続で進んだりしますね
そうだったんですか!?
ぜんぜん気がつきませんでした。

>あと選択肢は改行した方が見やすいかと
そうですね。

Justyさんへ
>遊んでみました。
>問題に懐かしいのとかあって、ちょっと面白かったです。
そうですか…作ったかいがありました。


>せめて、全て出題しきるまでは同じ問題は出ないようにするか、
>連続で同じ問題を出ないようにするとか、答の選択肢をシャッフルした
>方がいいと思います。
工夫してみます。

>出題してから押したものに限って反応するようにすると誤動作がなくていいかと。
>ついでに、関係ないキー……アルファベットとかは無視するようにしておくと
>いいかもしれません。
getchでキーの状態を取得しているのですが、どうすればいいか分かりません。

>どこかで区切りをつけて、正答数とかコメントとか出してあげると
>いいですね。
-(マイナス)キーを押すと終了し、正答数と、割合がグラフで表示されます。

>問題〜CPUは何の略?
>答が違うようです。
>cが1つ多いです。
この問題はネットできちんと調べずに、自分の知識だけで作ったんですが、
かなり自信がなかったです。これからは、なるべくネットで調べるようにします。

>問題〜ゲームなどの〜APIは?
>OpenGLはゲームにも使われると思うのですが……。
そうだったんですか、知りませんでした。

>問題の回答の先頭に「・」がついているものと付いていないものとがある
>統一した方がいいですね。
そうですね。

>通常マイドキュメントに〜
>この問題はちょっと微妙です。
>通常マイドキュメント以外……デスクトップとか……に保存する人も多いですし、
>回答以外の拡張子もマイドキュメントに保存する人は普通にいますので。
そうでしたか…僕の場合、マイドキュメントに保存していますので、気がつきませんでした。


そして、このゲームのソースコードとデータ群をアップロードしました。
100行程度のソースコードですが、何やら入り組んでいますので、どこを修正すればいいか
分かりません。
誰か、教えて欲しいです。


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

Name: TKOZ  ..プログラマー(30,323ポイント)   Date: 2009/08/25(火) 14:35   No:38426     
Title: Re:クイズゲームを作りました。    
一番致命的なのが、キーボードの誤動作です。
それを解決したいのですが、どうすればいいか分かりません。


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

Name: non  ..熟練のプログラマー(61,546ポイント)   Date: 2009/08/25(火) 16:29   No:38429     
Title: Re:クイズゲームを作りました。    
最低限の変更です。ただし、環境依存です。

int GetInput(void)
{
char key;

do{
while(kbhit())
getch();
key = getch();
if(key=='0')return 0;
if(key=='1')return 1;
if(key=='2')return 2;
if(key=='3')return 3;
if(key=='-')return 4;
}while(1);
}



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

Name: ミヤ  ..かけだし(1,232ポイント)   Date: 2009/08/25(火) 17:22   No:38430     
Title: Re:クイズゲームを作りました。    
まだかじりはじめなのでなんともいえませんが
いろいろ資料を調べたところではGetInput()を例えば・・ですが、
以下のように書き換えれば....


<ソース>

int GetInput(void)
{
char key;

//バッファクリア
while(kbhit())
getch();

//0,1,2,3,-のいずれかのキーを受けるまで待機
while(1)
{
key = getch();
switch(key)
{
case '0' : return 0;
case '1' : return 1;
case '2' : return 2;
case '3' : return 3;
case '-' : return 4;
}
}
}




<依存関係>
kbhit()はDOS窓限定
'0'〜'3'および'-'は標準ASCIIコードに準拠したOSでのみ


調べながら書いてる間にすでに他の方から回答が出てましたね・・・。



蛇足ながら。。

int DrawBarGraph(int oknum,int ngnum)にreturnが無いのは気のせいでしょうか・・・。


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

Name: ようすけ  ..初心者(5,480ポイント)   Date: 2009/08/25(火) 18:15   No:38432     
Title: Re:クイズゲームを作りました。    
遊ばせてもらいました。

コンソールタイプのゲームは久しぶりにやったので、

かなり新鮮な感じで個人的には楽しかったです☆

これからもがんばって作ってください。


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

Name: TKOZ  ..プログラマー(30,491ポイント)   Date: 2009/08/25(火) 18:36   No:38433     
Title: Re:クイズゲームを作りました。    
nonさん、ミヤさんへ
ありがとうございます。
おかげさまで、キーボードの誤動作はなくなりました。

ようすけさんへ
>遊ばせてもらいました。
>コンソールタイプのゲームは久しぶりにやったので、
>かなり新鮮な感じで個人的には楽しかったです☆
>これからもがんばって作ってください。
嬉しい感想をありがとうございます。
これからもがんばって作るつもりです。


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

Name: TKOZ  ..プログラマー(30,561ポイント)   Date: 2009/08/25(火) 19:59   No:38436     
Title: Re:クイズゲームを作りました。    
ミヤさんへ

>蛇足ながら。。

>int DrawBarGraph(int oknum,int ngnum)にreturnが無いのは気のせいでしょうか・・・。
int DrawBarGraphの最後にreturnはありません。でも、
BorlandC++Compiler5.5だとコンパイルが通るんですね。
古いコンパイラだとこんな事もあるんですね。


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

Name: situmon  ..熟練のプログラマー(40,254ポイント)   Date: 2009/08/25(火) 20:52   No:38438     
Title: Re:クイズゲームを作りました。    
自分はシンプルなのが大好きなので、
シンプルで面白く楽しかったです。
しかし、data.datは簡単に開けてしまいますね。
data.cppにしてひらくと、簡単に開けてしまいますので。。。
やはり開かれるとよくないので、
(今回は見て、へんなところがないか見ましたが。。。嫌だったらすいませんでした)



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

Name: TKOZ  ..プログラマー(30,809ポイント)   Date: 2009/08/26(水) 20:36   No:38472     
Title: Re:クイズゲームを作りました。    
situmonさんへ
>自分はシンプルなのが大好きなので、
>シンプルで面白く楽しかったです。
感想ありがとうございます。

>しかし、data.datは簡単に開けてしまいますね。
メンテナンスのしやすさ(といっても、それ専用のエディタでも作ればいいのですかね)
から、テキスト形式のファイルにしてあります。
元々、評価やバグを探して貰う為にアップロードしたのですから、
へんなところを見つけるのはかまいませんよ。

そして、
新しいバージョンを作りました。ver0.8です。
・キーボード入力もバグがないはずです。
・問題数を30に増やしました。
・効果音を増やしました。
・問題のある問題?は改訂しました。
・問題が出ると、カチカチと音が鳴ります。
(時間を測っている訳ではありませんので、ゆっくりでいいです)
・問題を並び替える機能を付けました。

それでは、どうぞ
http://ppup.dip.jp/uploader/download/1251286233.zip/attatch
パスは、TKOZです。


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

Name: situmon  ..熟練のプログラマー(40,473ポイント)   Date: 2009/08/26(水) 21:24   No:38473     
Title: Re:クイズゲームを作りました。    
おもしろかったです!!
カチカチがあせって。。。時間ははかってないとかいてありますが、
好きです。こんな感じの。。。
あとTKOZさんの代表作をやってみたいのですが。。。


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

Name: TKOZ  ..プログラマー(31,038ポイント)   Date: 2009/08/27(木) 09:26   No:38483     
Title: Re:クイズゲームを作りました。    
ネットカフェから書き込みです。

>おもしろかったです!!
>カチカチがあせって。。。時間ははかってないとかいてありますが、
>好きです。こんな感じの。。。
ありがとうございます。作ったかいがありました。

>あとTKOZさんの代表作をやってみたいのですが。。。
googleで検索すればすぐに出てきますが、これをどうぞ。
http://www.vector.co.jp/soft/win95/game/se471729.html

80年代〜90年代風のレトロシューティングゲームです。
オプションから、難易度を変えたり(Easy,Normal,Hard)、曲とか効果音をテストできます。


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

Name: situmon  ..熟練のプログラマー(41,243ポイント)   Date: 2009/08/27(木) 17:30   No:38491     
Title: Re:クイズゲームを作りました。    
やってみましたが、レトロですね、、、
レトロ調は好きです。
ですが難しかったので。。。
しかし楽しかったです。
どうもありがとうございました。


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

Name: TKOZ  ..プログラマー(31,133ポイント)   Date: 2009/08/27(木) 18:08   No:38495     
Title: Re:クイズゲームを作りました。    
>やってみましたが、レトロですね、、、
>レトロ調は好きです。
どうも、プレイして頂きありがとうございます。

>ですが難しかったので。。。
難しかったですか…、そうですか…

>しかし楽しかったです。
>どうもありがとうございました。
こちらこそ、ありがとうございました。


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



Name: UKONN  ..ぴよぴよ(18ポイント)   Date: 2009/08/27(木) 14:03   No:38486       
Title: 無題    
ゲームプログラム初心者のものです。
こちらに掲載されているゲームプログラミングの館にて作業を進めているのですが

第二章にて、
先ほどダウンロードしたフォルダの中の「サンプルプログラム実行用フォルダ」のフォルダの中の

VisualStdioでしたらDxLib.slnを開き、プログラムが書ける状態にしてください。


「サンプルプログラム実行用フォルダ」のフォルダの中にDxLib.slnが存在しません。
なにが原因でしょうか?
ヒントを下さると助かります。よろしくお願いします。


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


Name: non  ..熟練のプログラマー(61,531ポイント)   Date: 2009/08/27(木) 14:38   No:38487     
Title: Re:無題    
DxLib_VC2008_and_2005用.sln のことです。

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

Name: UKONN  ..ぴよぴよ(34ポイント)   Date: 2009/08/27(木) 14:48   No:38488 解決!     
Title: Re:無題    
初歩的な質問ですいませんでした。ありがとうございます。

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



Name: はね  ..中級者(12,531ポイント)   Date: 2009/08/26(水) 23:20   No:38477       
Title: storyH0.csvの何かがおかしい    
龍神録で敵の種類を増やしたところ
プログラムでは特に問題はないのですが、
storyH0.csvの中の敵の種類の項で
9種類一気に出現させる+実行して自機ショットを
打つと画面がフリーズしてしまうバグが発生してしまいます。
ちなみに、5種類一気に出現させると特に問題ありませんでした。
何が原因なのかが検討つかなくて困ってるのですが、
どこがいけないのでしょうか?

/カウンタ 、移動パターン、敵の種類
/cnt pattern knd
100 0 3
90 0 2
80 0 1
70 0 0
60 0 4
70 0 0
80 0 1
90 0 2
100 0 3
これなら特に問題なし

/カウンタ 、移動パターン、敵の種類
/cnt pattern knd
100 0 0
90 0 1
80 0 2
70 0 3
60 0 4
70 0 5
80 0 6
90 0 7
100 0 8
これだとフリーズしてしまいます


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


Name: はね  ..中級者(12,616ポイント)   Date: 2009/08/27(木) 00:28   No:38479     
Title: Re:storyH0.csvの何かがおかしい    
追伸

敵の種類が5以上だとフリーズすることが分かりました。
また、Xキーを押したときはフリーズしませんでした。
zキーを押して0.2秒後くらいにフリーズしてしいます。
原因はまだ不明です・・


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

Name: はね  ..中級者(12,823ポイント)   Date: 2009/08/27(木) 00:45   No:38480     
Title: Re:storyH0.csvの何かがおかしい    
out.cpp
原因が分かりました

敵の当たり判定範囲
int enemy_range[ENEMY_RANGE_MAX]={16,30,16,50};


ここの部分が4つ分しかなかったから
エラーが発生しました。

ただ、良く分からないのですが
{16,30,16,50}って何を表しているのでしょうか?
龍神録18章を読んでもその辺のことはスルーしていたので
分かりません。解説出来る方がいたら教えてください


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

Name: 夢夢  ..入門者(2,681ポイント)   Date: 2009/08/27(木) 11:46   No:38484 解決!     
Title: Re:storyH0.csvの何かがおかしい    
質問のスレッドにまた違う質問を入れるのはあまりよくありません(タイトルと関係ないので)

>int enemy_range[ENEMY_RANGE_MAX]={16,30,16,50};
ゲームプログラミングの館s11章に詳しく載っています。


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



Name: ととろ  ..入門者(2,657ポイント)   Date: 2009/08/25(火) 22:00   No:38444       
Title: 値の受け渡し    
少しながいですが

load.cpp-----

#include "dxlibp.h"
#include "GV.h"
#include <stdlib.h>

void load_story(){
int n,num,i,fp;
char fname[32]={"dat/storyH0.csv"};
int input[64];
char inputc[64];

fp = FileRead_open(fname);//ファイル読み込み
if(fp == 0){
printfDx("read error\n");
return;}
else {printfDx("OK\n");}


for(i=0;i<2;i++)
//最初の2行読み飛ばす
while(FileRead_getc(fp)!='\n');

n=0 , num=0;
while(1){
int fz =FileRead_open(fname);
for(i=0;i<64;i++){
inputc[i]=input[i]=FileRead_getc(fp);//1文字取得する
if(inputc[i]=='/'){//スラッシュがあれば
while(FileRead_getc(fp)!='\n');//改行までループ
i=-1;//カウンタを最初に戻して
continue;
}
if(input[i]==',' || input[i]=='\n'){//カンマか改行なら
inputc[i]='\0';//そこまでを文字列とし
break;
}
if(fz!=0){//ファイルの終わりなら
printfDx("end\n");
goto EXFILE;//終了
}
}
switch(num){

case 0: enemy_order[n].cnt =atoi(inputc);break;
case 1: enemy_order[n].pattern =atoi(inputc);break;
case 2: enemy_order[n].knd =atoi(inputc);break;
case 3: enemy_order[n].x =atof(inputc);break;
case 4: enemy_order[n].y =atof(inputc);break;
case 5: enemy_order[n].sp =atof(inputc);break;
case 6: enemy_order[n].bltime =atoi(inputc);break;
case 7: enemy_order[n].blknd =atoi(inputc);break;
case 8: enemy_order[n].col =atoi(inputc);break;
case 9: enemy_order[n].hp =atoi(inputc);break;
case 10:enemy_order[n].blknd2 =atoi(inputc);break;
case 11:enemy_order[n].wait =atoi(inputc);break;
case 12:enemy_order[n].item_n[0]=atoi(inputc);break;
case 13:enemy_order[n].item_n[1]=atoi(inputc);break;
case 14:enemy_order[n].item_n[2]=atoi(inputc);break;
case 15:enemy_order[n].item_n[3]=atoi(inputc);break;
case 16:enemy_order[n].item_n[4]=atoi(inputc);break;
case 17:enemy_order[n].item_n[5]=atoi(inputc);break;
}
num++;
if(num==18){
num=0;
n++;

}
}
EXFILE:

FileRead_close(fp);

}



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



load.cppで得られたenemy_order[n]の値をenemy.cppのenemy_order[n]に渡しているですが、
自分はnが別々に宣言されて別々の値が返っているようにしか見えません。
nのあけ渡しえお行っている部分はどの部分でしょうか?。
それともenemy_order[〜〜]とさえなっていれば勝手に同じ値が入るのでしょうか?


2,231ポイント を手に入れた。


Name: kazuoni [URL]  ..ハッカー(100,925ポイント)   Date: 2009/08/25(火) 22:37   No:38447     
Title: Re:値の受け渡し    
今一度、質問内容を見直したほうがよいかもしれないです。

>load.cppで得られたenemy_order[n]の値をenemy.cppのenemy_order[n]に渡しているですが、
誤解があるかと思います。
恐らく、enemy_orderはグローバル変数であるので、
enemy_orderはどこからでも書き換え可能っということであって、
値を渡すとは違うかと思います。

>自分はnが別々に宣言されて別々の値が返っているようにしか見えません。
enemy.cppの関数enemy_enterではnは宣言されていないと思いますが・・・?

>nのあけ渡し


#追記
一度投稿をしてしまう前に、毎回プレビューにチェックを入れて、
投稿内容を確認するとよいと思います。
また、間違えて投稿してしまっていても、編集キーを入れておけば、
投稿後も編集できます。


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

Name: ととろ  ..入門者(3,073ポイント)   Date: 2009/08/25(火) 23:48   No:38449     
Title: Re:値の受け渡し    
返答ありがとうございます。
>load.cppで得られたenemy_order[n]の値をenemy.cppのenemy_order[n]に渡しているですが、
誤解があるかと思います。
恐らく、enemy_orderはグローバル変数であるので、
enemy_orderはどこからでも書き換え可能っということであって、
値を渡すとは違うかと思います。
すみません。考えてたら混乱してしまいましたが、
enemy_order[n]のnに入る値を気にしてもしょうがないですね。
分かりづらいかも知れませんが自分は↓の敵に関する値をenemy[i].〜に持たせるには?というのを言いたかったのです。もし同じコトを聞いていたらすみません。

/カウンタ 移動パターン 敵の種類 x座標 y座標 スピード 発射時間 弾幕種類 弾の色 体力 弾種類 待機時間 アイテム1 2 3 4 5 6
/cnt pattern knd x座標 y座標 sp bltime blknd col hp blknd2 wait item_n[0]
100 0 0 50 -20 0 150 0 0 100 0 120 0 -1 -1 -1 -1 -1
110 0 0 80 -20 0 150 0 0 100 0 120 0 -1 -1 -1 -1 -1
120 0 0 110 -20 0 150 0 0 100 0 120 0 -1 -1 -1 -1 -1
130 0 0 140 -20 0 150 0 0 100 0 120 0 -1 -1 -1 -1 -1
140 0 0 170 -20 0 150 0 0 100 0 120 0 -1 -1 -1 -1 -1
150 0 0 200 -20 0 150 0 0 100 0 120 0 -1 -1 -1 -1 -1
160 0 0 230 -20 0 150 0 0 100 0 120 0 -1 -1 -1 -1 -1
170 0 0 260 -20 0 150 0 0 100 0 120 0 -1 -1 -1 -1 -1
180 0 0 290 -20 0 150 0 0 100 0 120 0 -1 -1 -1 -1 -1
190 0 0 320 -20 0 150 0 0 100 0 120 0 -1 -1 -1 -1 -1


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

Name: kazuoni [URL]  ..ハッカー(100,989ポイント)   Date: 2009/08/26(水) 01:23   No:38450     
Title: Re:値の受け渡し    
前の発言で「enemy.cppの関数enemy_enterではnは宣言されていないと思いますが・・・? 」
って言ってますが、普通にn宣言してありましたねorz
大変申し訳ありませんでした。
ただ、関数enemy_enterでは、nの初期化を行っておらず、
このままこの関数を動かすと、まずいです。


>自分は↓の敵に関する値をenemy[i].〜に持たせるには?というのを言いたかったのです。

nを関数enemy_enterの
for(t=0;t<ENEMY_ORDER_MAX;t++)

で最後でインクリメントすればよいのではないでしょうか?


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

Name: ととろ  ..入門者(3,251ポイント)   Date: 2009/08/26(水) 12:47   No:38456     
Title: Re:値の受け渡し    
すみません。
void ini(){
stage_count=1;
memset(&ch,0,sizeof(ch_t));
ch.x=FIELD_MAX_X/2;
ch.y=FIELD_MAX_Y*3/4;
memset(enemy,0,sizeof(enemy_t)*ENEMY_MAX);
memset(enemy_order,0,sizeof(enemy_order_t)*ENEMY_ORDER_MAX);
}
初期化の部分を忘れていました。

さらに
for(t=0;t<ENEMY_ORDER_MAX;t++)


for(n=0;n<ENEMY_ORDER_MAX;n++)
の間違いです。なんども編集ミスをすみません。
それとインクリメントってなんですか?


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

Name: kazuoni [URL]  ..ハッカー(101,544ポイント)   Date: 2009/08/26(水) 14:00   No:38457     
Title: Re:値の受け渡し    
質問内容を今一度確認したいんですが・・・
「load.cppとenemy.cppで変数enemy_orderを使っているけど、両者は同じものなの?」
ってことでしょうか?
それとも
「自分は↓の敵に関する値をenemy[i].〜に持たせるには?」
でしょうか?

前者ならば、一番最初に自分が書きましたが、
enemy_orderはグローバル変数なので、どこからでも使えます。
(記述してあるヘッダーをインクルードすれば)

後者ならば、http://dixq.net/rp/11.html
を読んでくださいっと言うしかないと思うのですが・・・。

自分は、読解力にかけるので、質問内容が、いまいち分かりません。
この二つのどれでもなければ、他の方からの回答をお待ちください・・・。

#余談1
もしかして、一番上で提示したコード編集してます?
自分で編集できますと書いておきながら言うのもなんですが、
なるべくならコードは編集せずに、新たに現在のコードをレスに張るなり、
テキストファイルをupするなりしないと、このスレを見る人が
混乱してしまうかと思います。

#余談2
インクリメントは
i++;
++i;
のことです。用語はググればすぐ出てきます。


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

Name: ととろ  ..入門者(3,363ポイント)   Date: 2009/08/26(水) 15:11   No:38459     
Title: Re:値の受け渡し    
何度も回答ありがとうございます。
やはり質問の仕方が悪かったですよね。
大変失礼にはなりますが違う形でもう一回質問してみます。


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

Name: ととろ  ..入門者(3,373ポイント)   Date: 2009/08/26(水) 15:12   No:38460 解決!     
Title: Re:値の受け渡し    
解決

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



Name: ありす  ..ぴよぴよ(146ポイント)   Date: 2009/08/26(水) 01:54   No:38452       
Title: 龍神録プログラミングの館:敵の弾について    
龍神録プログラミングの館で公開されているソースを参考にSTGを製作させていただいています。
現在、敵の弾幕を出す関数(元のソースでいうshot_bullet_...関数)のうち、ある一つを使うとその中で生成される弾に自機が被弾しないというバグが出ています。
その弾幕自体は正常な動きをしているし、その弾幕以外の弾幕は正常な当たり判定を持っています。
その弾幕で使用してる弾の当たり判定は間違いなく定義してあります(input_bullet_info関数)。念のため、弾色や弾角度も変数から定数に置換しましたが、そういったものが原因ではないようです。
こういった場合、何が原因と考えられるのでしょうか。または、何が原因か突き止める方法はありますか。
「どんなコードを書いたら被弾しなくなったのか」については分かりません……。気づいたら当たらなくなっていました。


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


Name: ありす  ..ぴよぴよ(123ポイント)   Date: 2009/08/26(水) 03:16   No:38454 解決!     
Title: Re:龍神録プログラミングの館:敵の弾について    
ごめんなさい。自己解決しました。
弾のcntを進めてなかった…… あうあうあー


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



Name: kazuoni [URL]  ..ハッカー(100,794ポイント)   Date: 2009/08/25(火) 19:17   No:38434       
Title: メモリ上のビットマップデータの拡大・縮小コピー    
お邪魔します。

題名の通り、メモリ上のビットマップデータを拡大、縮小をStretchBltを用いて施し、
それを一時保存しようとしています。

ここでソースを書くのはかなり見づらくなるので、プロジェクトごとアップしました。
(画像読み込みには、ルーチェ's Homepage管理人様、ルーチェさんの作成されたimgct.dllを使用しています)
問題となっているのは、Graph.cppの関数DrawRoteです。

自分はビットマップデータをメインビットマップと
マスクビットマップに分けて管理しています。

一連の流れですが、
1.メインビットマップデータを拡大し、StretchBltでtempBmpBfに保存
2.CreatMaskBmpによって、マスクビットマップデータ作成

です。現段階では、描写すると、四角形が赤で塗りつぶされて表示されます。
恐らく、ビットマップデータをtempBmpBfにコピーする段階で
うまく行われていないのですが、自分の知識では、解決できないでいます。。

裏描写用のデバイスコンテキストhdcから
CreateCompatibleDC
CreateCompatibleBitmap
SelectObject
の順で一時保存用のビットマップとそのデバイスコンテキストを生成しているのですが・・・
この段階で既に問題があるのか・・・

説明が足りない部分があるのなら、聞いてください。。
よろしくお願いします。

Ne_60622.zip
http://www1.axfc.net/uploader/Ne/so/60622
DLキー:kazuoni

#補足
なぜ、一時保存しているのかというと、拡大したものを
回転する関数でもあるので、一時拡大したものを保存しておき、
そこから、保存したものを、回転して描写したいというものによります。


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


Name: Justy  ..伝説なるハッカー(409,028ポイント)   Date: 2009/08/26(水) 01:45   No:38451     
Title: Re:メモリ上のビットマップデータの拡大・縮小コピー    
 あんまり深く読みといていないので意図した通りになるかわかりませんが、
こんな感じでしょうか。


    HDC tempMaskBf=0;
    HDC tempBmpBf=CreateCompatibleDC(hdc);
    HBITMAP tempMaskBmp=0;
    HBITMAP tempBmpBmp=CreateCompatibleBitmap(hdc,(int)(this->xSize*ExtX),(int)(this->ySize*ExtY));
    HBITMAP tempMaskPrevBmp=0;
    HBITMAP tempBmpPrevBmp=(HBITMAP)SelectObject(tempBmpBf,tempBmpBmp);

    if( !StretchBlt( tempBmpBf, 0, 0, (int)(this->xSize*ExtX),(int)(this->ySize*ExtY),// 描画先
                     GetBitmap(), cellNum%this->xNum*this->xSize, cellNum/this->xNum*this->ySize,this->xSize, this->ySize, // 描画元
                    
SRCCOPY )
                     ||
        !CreatMaskBmp(hdc,this->colorKey,tempBmpBf,&tempMaskBf,&tempMaskBmp,&tempMaskPrevBmp,(int)(this->xSize*ExtX),(int)(this->ySize*ExtY) )
     )


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

Name: kazuoni [URL]  ..ハッカー(101,230ポイント)   Date: 2009/08/26(水) 02:22   No:38453 解決!     
Title: Re:メモリ上のビットマップデータの拡大・縮小コピー    
Justyさん、ご回答ありがとうございます!

またもズバっと正解でした。。

ラスタオペレーションコード・・・
もろ間違えてますね。。転送先とandしても、まったくの無意味でした。。

CreateCompatibleBitmapの第一引数が
「互換性を取るデバイスコンテキストのハンドル」
ってのは、msdnをみて、分かっていましたが、
互換性っという意味もわからず、つながりのあるハンドル= tempBmpBf
と決め打ちしていました。
(よくみたら、msdnでも下にサンプルが載っていました。。)

ソースを見て、回答していただき、手間をとらせてしまい、
大変申し訳ありませんでした。
とても助かりました。
次回もよろしくお願いします。


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



Name: ととろ  ..ぴよぴよ(549ポイント)   Date: 2009/08/25(火) 21:33   No:38441       
Title: 無題    
 

, num=0;
while(1){
int fz =FileRead_open(fname);
for(i=0;i<64;i++){
inputc[i]=input[i]=FileRead_getc(fp);//1文字取得する
if(inputc[i]=='/'){//スラッシュがあれば
while(FileRead_getc(fp)!='\n');//改行までループ
i=-1;//カウンタを最初に戻して
continue;
}
if(input[i]==',' || input[i]=='\n'){//カンマか改行なら
inputc[i]='\0';//そこまでを文字列とし
break;
}
if(fz!=0){//ファイルの終わり


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


Name: ととろ  ..ぴよぴよ(573ポイント)   Date: 2009/08/25(火) 21:34   No:38442     
Title: Re:無題    
すみませんミスです。気にしないでください


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



Name: SRT  ..かけだし(2,072ポイント)   Date: 2009/08/25(火) 10:37   No:38420       
Title: 無題    
ファイルを読み込んでからフリーズするのか、ファイルを読み込む前からフリーズするのか気になったので
fp = FileRead_open(fname);//ファイル読み込み
if(fp == 0){
printfDx("read error\n");
return;
else
printfDx("read open OK\n");
}
elseを付け加えました。}の位置がおかしいですが、それとは関係の無い新しいエラーが出ました。

#include "dxlibp.h"
#include "GV.h"
#include <stdlib.h>

void load_story(){
int n,num,i,fp;
char fname[32]={"../dat/csv/storyH0.csv"};
int input[64];
char inputc[64];

fp = FileRead_open(fname);//ファイル読み込み
if(fp == 0){
printfDx("read error\n");
return;
else
printfDx("read open OK\n");
}




for(i=0;i<2;i++)
//最初の2行読み飛ばす
while(FileRead_getc(fp)!='\n');

n=0 , num=0;
while(1){
int fz =FileRead_open(fname);
for(i=0;i<64;i++){
inputc[i]=input[i]=FileRead_getc(fp);//1文字取得する
if(inputc[i]=='/'){//スラッシュがあれば
while(FileRead_getc(fp)!='\n');//改行までループ
i=-1;//カウンタを最初に戻して
continue;
}
if(input[i]==',' || input[i]=='\n'){//カンマか改行なら
inputc[i]='\0';//そこまでを文字列とし
break;
}
if(fz!=0){//ファイルの終わりなら
goto EXFILE;//終了
}
}
switch(num){

case 0: enemy_order[n].cnt =atoi(inputc);break;
case 1: enemy_order[n].pattern =atoi(inputc);break;
case 2: enemy_order[n].knd =atoi(inputc);break;
case 3: enemy_order[n].x =atof(inputc);break;
case 4: enemy_order[n].y =atof(inputc);break;
case 5: enemy_order[n].sp =atof(inputc);break;
case 6: enemy_order[n].bltime =atoi(inputc);break;
case 7: enemy_order[n].blknd =atoi(inputc);break;
case 8: enemy_order[n].col =atoi(inputc);break;
case 9: enemy_order[n].hp =atoi(inputc);break;
case 10:enemy_order[n].blknd2 =atoi(inputc);break;
case 11:enemy_order[n].wait =atoi(inputc);break;
case 12:enemy_order[n].item_n[0]=atoi(inputc);break;
case 13:enemy_order[n].item_n[1]=atoi(inputc);break;
case 14:enemy_order[n].item_n[2]=atoi(inputc);break;
case 15:enemy_order[n].item_n[3]=atoi(inputc);break;
case 16:enemy_order[n].item_n[4]=atoi(inputc);break;
case 17:enemy_order[n].item_n[5]=atoi(inputc);break;
}
num++;
if(num==18){
num=0;
n++;

}
}
EXFILE:
FileRead_close(fp);
}

エラー
load.cpp:26: error: expected `}' before 'else'
load.cpp:17: warning: unused variable 'n'
load.cpp:17: warning: unused variable 'num'
load.cpp:17: warning: unused variable 'i'
load.cpp:19: warning: unused variable 'input'
load.cpp:20: warning: unused variable 'inputc'
load.cpp: At global scope:
load.cpp:34: error: expected unqualified-id before 'for'
load.cpp:34: error: expected constructor, destructor, or type conversion before '<' token
load.cpp:34: error: expected constructor, destructor, or type conversion before '++' token
load.cpp:38: error: expected constructor, destructor, or type conversion before '=' token
load.cpp:39: error: expected unqualified-id before 'while'
警告でどの変数も使われていないとでます。もしかして今までもこのエラー・警告があったのでしょうか?(なぜかビルト結果には出なかっただけで)。
しかしload_story内で一回以上使われてますよね。どうしてなのか、回答おねがいします。


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


Name: Mist  ..熟練のプログラマー(65,991ポイント)   Date: 2009/08/25(火) 10:41   No:38421     
Title: Re:無題    
括弧の位置がおかしいとコンパイラはそれ以降を正しく解析できないので、それ以降のワーニングや
エラーがなぜ出るのかを考えるのは無意味です。


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

Name: Mist  ..熟練のプログラマー(65,954ポイント)   Date: 2009/08/25(火) 10:41   No:38422     
Title: Re:無題    
あと、ソースを掲載する場合は規約を守ってpreタグで字下げしてください。

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

Name: box  ..ハッカー(142,893ポイント)   Date: 2009/08/25(火) 17:50   No:38431     
Title: Re:無題    

> elseを付け加えました。}の位置がおかしいですが、それとは関係の無い新しいエラーが出ました。

「それとは関係のない」という判断は誤りです。
当該のif文は、

if(fp == 0){
printfDx("read error\n");
}
return;
else {
printfDx("read open OK\n");
}

と書いたのと同じであることに気づいてください。
「ifがないのにいきなりelseを書いている」というエラーです。



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

Name: SRT  ..かけだし(2,099ポイント)   Date: 2009/08/25(火) 21:02   No:38439 解決!     
Title: Re:無題    
そうですね。エラーは違うところにあるようです。回答ありがとうございます。

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



Name: ミヤ  ..ぴよぴよ(271ポイント)   Date: 2009/08/25(火) 04:18   No:38413       
Title: 環境固有の問題?それとも…    
はじめまして、ミヤともうします。
まだ初心者なのでプログラムではなくて環境等の問題かもしれないのですが、、
どうにも自力で(友人に聞いても)解決できない壁にぶつかったので質問させていただきます。


<問題点>
特定箇所のprintf()関数において%xで表示させる数値が32bit(4バイト)分表示され
変数のサイズを越える部分が'f'で埋められる


<状況>
C言語プログラム(本文末尾に出力結果とともにペースト)をBCC ver.5.5で
コンパイルしてWindows XP Home上のMS-DOSプロンプトで実行すると、
添付画像ならびに文末画面出力2行目の指示して無い文字
("0xffffff80"の"fffff")が出力される。

コンパイルはエラーもなくできます。

sizeof(chr_y)を表示させても1としか表示されない。
変数の型を変更した場合、
(signed char)の場合は0xffffff80
(signed short int)の場合は0xffff8000
といった具合に、単純に変数を表示しているだけなのですが、
どういうわけか符号付整数において先頭(符号)ビットに1が立って
他のビットが0の場合だけに表示がおかしくなるのかな・・・。


'f'ではなく'0'なら"%08x"とかいたかな・・とかわかるのですが。。。


<環境>
WindowsXP Home (SP2) (i386)
BCC32.exe(Version 5.5)


<希望>
勝手に出てくる文字'f'を表示しない方法がお分かりになる方が
いらっしゃいましたらご指南いただきたく思います。

又は、手元の環境では問題が無いという方がいらっしゃいましたら、
参考までに教えていただけますでしょうか?


<以下ソースとか画面に表示される内容>


----プログラムここから----
#include<stdio.h>

//10進と16進で数字を表示するプログラム

int main(void){
signed char chr_x, chr_y;
unsigned char uchr_x, uchr_y;
chr_x = uchr_x = 0x7f;
chr_y = uchr_y = 0x80;
printf("in case of signed char\n");
printf(" 0x%x + 0x01 = 0x%x \n", chr_x, chr_y);
printf(" %d + 1 = %d \n\n", chr_x, chr_y);
printf("in case of unsigned char\n");
printf(" 0x%x + 0x01 = 0x%x \n", uchr_x, uchr_y);
printf(" %d + 1 = %d \n\n", uchr_x, uchr_y);
return(0);
}
----プログラム終わり----

----出力結果ここから-----
in case of signed char
0x7f + 0x01 = 0xffffff80
127 + 1 = -128

in case of unsigned char
0x7f + 0x01 = 0x80
127 + 1 = 128


----出力結果終わり----



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


Name: toyo  ..熟練のプログラマー(40,735ポイント)   Date: 2009/08/25(火) 09:23   No:38416     
Title: Re:環境固有の問題?それとも…    
%xはint型で表示するので必ず4バイト分表示されます
char型を引数にしてもint型に拡張されてから表示されるため負の値の時は拡張されたビットがすべて1
になります。char型の0x80は-128でint型の-128は0xffffff80
フォーマットにhhが使えるコンパイラなら %hhx で表示すれば1バイト分のみ表示できます。


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

Name: Mist  ..熟練のプログラマー(65,944ポイント)   Date: 2009/08/25(火) 09:34   No:38418     
Title: Re:環境固有の問題?それとも…    
表示のときだけunsigendにキャストするのもひとつの方法です。

printf(" 0x%x + 0x01 = 0x%x \n", (unsigned char)chr_x, (unsigned char)chr_y);


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

Name: non  ..熟練のプログラマー(61,226ポイント)   Date: 2009/08/25(火) 09:43   No:38419     
Title: Re:環境固有の問題?それとも…    
こうすることも可。
printf(" 0x%x + 0x01 = 0x%x \n", chr_x, chr_y & 0xff);


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

Name: ミヤ  ..ぴよぴよ(797ポイント)   Date: 2009/08/25(火) 10:57   No:38423     
Title: Re:環境固有の問題?それとも…    
お返事いただいた皆様ありがとうございます。
友人に聞いてももやもやした返答しかえられず困っていたのがこれですっきりいたしました。
大変申し訳ありませんが部分引用にて返信させていただきます。


toyo様
>%xはint型で表示するので必ず4バイト分表示されます
>フォーマットにhhが使えるコンパイラなら %hhx で表示すれば1バイト分のみ表示できます。

早速試してみました。
詰まるところ(int)に型変換して表示している状態だったのですね。
それで左のビットに1が並んでいたのも納得です。
残念ながら手元の環境(Winxp/bcc)においてはご教授いただいた方法では
1バイト分の表示とはなりませんでした。ただし、 %hx で2バイト分の表示に変わりました。
(short int)を扱うときには有効に使えそうなのでぜひ活用させていただきます。



Mist様
>表示のときだけunsigendにキャストするのもひとつの方法です。

早速試してみました。
なるほど、否負の整数であれば値が1となるビットまでの表示を省略するって事なんですね。


non様
>printf(" 0x%x + 0x01 = 0x%x \n", chr_x, chr_y & 0xff); //このようにすることも可

早速試してみました。
出力としては期待した結果を得ることができました。
しかし、理解力が足りないためかもともと1バイト分しかない整数に1バイトとして
明示的にマスクを掛けることで何故期待した表示が得られるのか・・・とても疑問です。


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

Name: non  ..熟練のプログラマー(61,386ポイント)   Date: 2009/08/25(火) 11:21   No:38424     
Title: Re:環境固有の問題?それとも…    
>しかし、理解力が足りないためかもともと1バイト分しかない整数に1バイトとして
>明示的にマスクを掛けることで何故期待した表示が得られるのか・・・とても疑問です。

chr_y & 0xffの計算をする段階でint型(BCCなら4バイト)に変換される。
すなわち、計算は上位の型にあわせられて計算される。(0xffはint型、0x000000ffと同じ)
従って
0xffffff80 & 0x000000ff = 0x00000080 になる。
表示の時、上位の0は表示されないので80のみ表示される。

なお、%hhはC99で拡張された機能なので、BCでは不可。%hはOKです。




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

Name: ミヤ  ..ぴよぴよ(960ポイント)   Date: 2009/08/25(火) 14:52   No:38428 解決!     
Title: Re:環境固有の問題?それとも…    
non様

丁寧な解説ありがとうございます。
char型の負数がint型負数として扱われる際に
1でつめられたビットを0にセットしなおす事で
キャストした際と同じ結果をもたらすということですね。

お手間を掛けてすみませんでした。

また、%hhに関するご指摘を元にキーワード"C99"で調べたところ
コンパイラの準拠するバージョンによる違いがあることが分かり
環境によって依存するソースを書いて、違う環境(学校と自宅の間等)に
持っていったときに期待しない動きにならないように注意するべきと実感いたしました。


ご回答いただいた皆様改めてありがとうございました。

9月から本格的に始まる授業等で分からないことがあったときに、改めて
質問させて頂く事が在ると思いますがなにとぞよろしくお願いいたします。


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



Name: www  ..ぴよぴよ(459ポイント)   Date: 2009/08/25(火) 03:54   No:38412       
Title: メニューからの終了について…    
ツールバーのメニューにExitの項目を作ったのですが

どうやって終了させるか分かりません

だれか教えてぐださい(T_T)
お願いします


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


Name: あふぇ  ..ぴよぴよ(83ポイント)   Date: 2009/08/25(火) 04:20   No:38414     
Title: Re:メニューからの終了について…    
強制終了したいなら、exit関数でいいのでは。
ゲームなら、大体の場合は急に終了させたらメモリリーク(画像やら音やら)があるだろうから、WinMain内のメインループ(while( ... ))をbreakするようにしたらいいんじゃないでしょうか。


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

Name: toyo  ..熟練のプログラマー(40,594ポイント)   Date: 2009/08/25(火) 09:12   No:38415     
Title: Re:メニューからの終了について…    
Windowsの終了は普通は
DestroyWindow()でウィンドウを消去(XボタンだとWM_CLOSEメッセージ経由で自動的に実行される)
WM_DESTROYメッセージが送られるのでPostQuitMessage()実行
WM_QUITメッセージが送られるのでメッセージループから抜ける
WinMain()終了
という流れになると思います


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

Name: tkmakwins15  ..比類無きプログラマー(97,908ポイント)   Date: 2009/08/25(火) 09:25   No:38417     
Title: Re:メニューからの終了について…    
toyoさんの方法以外にも、
PostMessage(hWnd/*メインのウィンドウハンドル*/,WM_CLOSE,0,0);
でもいいと思います。


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



Name: SRT  ..ぴよぴよ(427ポイント)   Date: 2009/08/24(月) 03:29   No:38383       
Title: FIELD_MAX_X ・・・・Y    
PSPでのサイズに合わせて作ってるのですが
define.hの矢印の部分の値を変えても主人公の移動可能範囲が変更されず
ボードの端まで行かないうちに止まる
ボードに隠れるなどとなってしまいます


#include "struct.h"


#define FIELD_MAX_X 224   ←
#define FIELD_MAX_Y 260   ←

#define FIELD_X 26
#define FIELD_Y 6

//パッドキーの最大数
#define PAD_MAX 16

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


graph.cppは


#include "dxlibp.h"
#include "GV.h"




void graph_ch(){
DrawRotaGraphF(ch.x+FIELD_X,ch.y+FIELD_Y,1.0f,0.0f,img_ch[ch.img],TRUE);
}


void graph_board(){
DrawExtendGraph(0 ,0 ,250,6 ,img_board[01],FALSE);
DrawExtendGraph(0 ,6 ,26 ,266,img_board[02],FALSE);
DrawExtendGraph(0 ,266,250,272,img_board[03],FALSE);
DrawExtendGraph(250,0 ,480,272,img_board[04],FALSE);
}

void graph_enemy(){
int i;
for(i=0; i<ENEMY_MAX; i++){
if(enemy[i].flag==1){
DrawRotaGraphF(enemy[i].x+FIELD_X,enemy[i].y+FIELD_Y,1.0f,0.0f,img_enemy[0][enemy[i].img],TRUE);
DrawRotaGraphF(enemy[i].x+FIELD_X,enemy[i].y+FIELD_Y,1.0f,0.0f,img_enemy[1][enemy[i].img],TRUE);
DrawRotaGraphF(enemy[i].x+FIELD_X,enemy[i].y+FIELD_Y,1.0f,0.0f,img_enemy[2][enemy[i].img],TRUE);
}
}
}


void graph_main(){
graph_enemy();
graph_ch();
graph_board();

}



となっています
どうすればいいのでしょうか?


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


Name: 夢夢  ..かけだし(2,483ポイント)   Date: 2009/08/24(月) 11:37   No:38388     
Title: Re:FIELD_MAX_X ・・・・Y    
#define FIELD_MAX_X 224   ←
#define FIELD_MAX_Y 260   ←
この定数を使用しているところはどこですか?
提示されたソースには一度も使っている記述がありません。


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

Name: SRT  ..ぴよぴよ(569ポイント)   Date: 2009/08/24(月) 13:57   No:38391     
Title: Re:FIELD_MAX_X ・・・・Y    
void ini(){
void *memset(void *s, int c, size_t n);
stage_count=1;
ch.x=FIELD_MAX_X/2;←
ch.y=FIELD_MAX_Y*3/4;←
memset(&ch,0,sizeof(ch_t));
memset(enemy_order,0,sizeof(enemy_order_t)*ENEMY_ORDER_MAX);
memset(enemy,0,sizeof(enemy_t)*ENEMY_MAX);
}
こちらです。


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

Name: 夢夢  ..入門者(2,603ポイント)   Date: 2009/08/24(月) 17:27   No:38393     
Title: Re:FIELD_MAX_X ・・・・Y    
移動可能範囲を制御している場所はありますか?

移動可能範囲があるということで、移動できる仕様のようですが、
ch.xとch.yは実行中に変化したりするのでしょうか?


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

Name: SRT  ..ぴよぴよ(577ポイント)   Date: 2009/08/25(火) 01:32   No:38411 解決!     
Title: Re:FIELD_MAX_X ・・・・Y    
すいません解決しました

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



Name: usami  ..ぴよぴよ(867ポイント)   Date: 2009/08/24(月) 18:10   No:38395       
Title: DxLibでの文字列変数    
とても初歩的な質問なのですが、
文字列を格納する便利な変数とかないのですか?
(『”〜”』を格納できる変数)
教えてください。

たとえばプログラムとしてはこんな感じ?

#define STRING "こんにちは"

(←ここ) str;
//char str[i]; だと、文字列の長さの関係で、不具合があるっぽいです。
int color=GetColor(255,255,255);

DrawString(0, 0, str, color);


あるいはDxLibの関数で、
LPCTSTR型を使ったりするのでも、構いません。
Windowsプログラミングだと、フォントとかHDCとか面倒なので、
是非楽ちんがしたいのです。

その他、冴えた方法があれば、是非教えてください。


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


Name: チルチル  ..熟練のプログラマー(42,461ポイント)   Date: 2009/08/24(月) 18:30   No:38396     
Title: Re:DxLibでの文字列変数    
char *型でどうでしょうか?

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

Name: usami  ..ぴよぴよ(908ポイント)   Date: 2009/08/24(月) 18:33   No:38397 解決!     
Title: Re:DxLibでの文字列変数    
ありがとうございます。
うまくいきました。

char* str=STRING;

是非また教えてください。


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

Name: チルチル  ..熟練のプログラマー(42,487ポイント)   Date: 2009/08/24(月) 18:40   No:38398     
Title: Re:DxLibでの文字列変数    
でも冷静に考えたら、これはscanf関数とかには使えないかもしれません・・

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

Name: バグ  ..ハッカー(168,277ポイント)   Date: 2009/08/24(月) 18:51   No:38400     
Title: Re:DxLibでの文字列変数    
std::stringでは駄目なのかな?(^_^;)

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

Name: usami  ..ぴよぴよ(985ポイント)   Date: 2009/08/24(月) 18:56   No:38401     
Title: Re:DxLibでの文字列変数    
…ですか。
でも、とりあえず、現状では、計算結果などを扱う文字列としてでなく、
単純に画面に表示することが目的なので無問題です。

変数に格納できたら、ケース分岐とかで、いろんなところが楽ちんかなー、とか考えていただけなので。


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

Name: usami  ..かけだし(1,026ポイント)   Date: 2009/08/24(月) 19:04   No:38403     
Title: Re:DxLibでの文字列変数    
> std::stringでは駄目なのかな?(^_^;)

C++は勉強不足でよくわからないです。すいません。
どういう風に使うのか詳しく教えていただけたらと思います。



あと、さきの回答が遅れたためちぐはぐになっております、見苦しくてすいません。


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

Name: バグ  ..ハッカー(168,533ポイント)   Date: 2009/08/24(月) 21:34   No:38406     
Title: Re:DxLibでの文字列変数    
std::stringの簡単なサンプルを書いてみました。
慣れるまでは分かりづらいかもしれませんが、便利ですよ。


#include <cstdio>
#include <iostream>
#include <string>

int main(void)
{
// strを"01234"で初期化する
std::string str("01234");

// strをcoutを使用して表示
std::cout << str << std::endl;

// strをprintfを使用して表示
// c_str()関数を使用すると、std::string内の文字列へのポインタ(const char*型)を取得できる
printf("%s\n", str.c_str());

// strの最後尾へ文字列"56"を付け足す
str += "56";
std::cout << str << std::endl;

// 比較用文字列を用意する
std::string cmp("0123456");

// 2つの文字列を比較してみる
if (str == cmp)
{
std::cout << "同じです" << std::endl;
}
else
{
std::cout << "違います" << std::endl;
}

return 0;
}



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

Name: usami  ..かけだし(1,120ポイント)   Date: 2009/08/24(月) 23:45   No:38410     
Title: Re:DxLibでの文字列変数    
丁寧な回答ありがとうございます。
とてもわかりやすかったです。

現状、DxLib=C,Windowsプログラミングをメインにしているので、
なかなかC++までは手が届かないのですが、
今後の参考にさせていただきたいと思います。


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



Name: コナコナ  ..ぴよぴよ(0ポイント)   Date: 2009/08/22(土) 17:50   No:38331       
Title: 再生デバイス切替    
Vista/VC6.0です。

コントロールパネルのサウンドに再生のタブがあり、そこに「既定のデバイス」のチェックがついています。
この「既定のデバイス」はどうやったら切り替えられるのでしょうか?

2つスピーカがついており、1つは音量が出ないようにしています。
音が出ないスピーカが「既定のデバイス」となっているのですが、
ある場合のみwaveファイルを再生し、音を出すようにしたいのです。


回答をお願い致します。



Name: situmon  ..プログラマー(39,913ポイント)   Date: 2009/08/22(土) 21:38   No:38342     
Title: Re:再生デバイス切替    
答えられなかったらすいませんが、
もう少し詳しく画像もつけ他方がわかりやすいと思います。
それは自作の曲ですか?
だったらpanpotで変えられないのでしょうか?
でもほかの方が作った曲ならばpanpotはまちまちですので難しいかもしれません。
panpotとは、
左右どちらのスピーカーで出るかを決めるもの、、、(多分そのはず)
なので・・・
間違えてたらすいません。


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

Name: コナコナ  ..ぴよぴよ(285ポイント)   Date: 2009/08/23(日) 00:00   No:38352     
Title: Re:再生デバイス切替    
situmonさん

回答ありがとうございます。
大変わかりづらい文章で申し訳ありません。

もう少し詳しく説明させていただきます。


今使用している環境ではサウンドデバイス(サウンドカード?)が
複数存在しています。

1つのデバイスからは音が出ない設定になっており、
そのデバイスは「既定のデバイス」となっています
(コントロールパネルのサウンドを見ると)。

また、もう1つのデバイスからは音がでる設定となっています。

waveファイルをmciSendCommandで再生するプログラムを作成したのですが、
音の出ないデバイスが「既定のデバイス」となっている場合、
waveファイルの再生は行うのですが、音がでません。

また、手動でもう一方のデバイスを「既定のデバイス」とした場合には音が出ます。

mciSendCommandのMCI_OPENを実行時、必ず「既定のデバイス」となっている方が
OPENされているような気がします。

やりたいことはデバイスが複数ある場合に、
デバイスを指定してwaveファイルを再生できるようにする事です。


※諸事情により画像は載せることができないですが、
上記説明でわかってもらえると幸いです。



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

Name: Justy  ..伝説なるハッカー(407,743ポイント)   Date: 2009/08/23(日) 01:47   No:38356     
Title: Re:再生デバイス切替    

>やりたいことはデバイスが複数ある場合に、
>デバイスを指定してwaveファイルを再生できるようにする事です

 MCI_WAVE_SET_PARMS構造体の wOutputにデバイスの番号を入れて
MCI_SETでフラグを MCI_WAVE_OUTPUTにすれば良かったような。

mciSendCommand problems : mcisendcommand
ttp://www.experts-exchange.com/Programming/Languages/CPP/Q_11272555.html

MCIコマンド: MCI_SET
ttp://74.125.153.132/search?q=cache:LMgpJQqydIkJ:www.activebasic.com/help_center/Pages/API/Multimedia/MCICommand/MCI_SET.htm+MCI_WAVE_OUTPUT+wOutput&cd=2&hl=ja&ct=clnk&lr=lang_ja


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

Name: コナコナ  ..ぴよぴよ(389ポイント)   Date: 2009/08/24(月) 10:28   No:38387     
Title: Re:再生デバイス切替    
Justyさん

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

>MCI_WAVE_SET_PARMS構造体の wOutputにデバイスの番号を入れて
>MCI_SETでフラグを MCI_WAVE_OUTPUTにすれば良かったような。

ここでwOutputに指定するデバイスの番号は何の番号なのでしょうか?
サウンドカードの番号とすると、どのように取得すれば良いのでしょうか?


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

Name: Justy  ..伝説なるハッカー(408,228ポイント)   Date: 2009/08/24(月) 22:14   No:38409     
Title: Re:再生デバイス切替    

>デバイスの番号は何の番号なのでしょうか?

 0オリジンで何番目だったと思うので、2つデバイスがあるなら、
0か1を指定してみて下さい。


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



Name: dic  ..プログラマー(30,914ポイント)   Date: 2009/08/19(水) 20:12   No:38220       
Title: クラスの設計    
クラスの設計で悩んでいます
というのも弾クラスとプレイヤークラスがあり、
これらのクラスのプライベートメンバ変数に弾の位置、プレイヤーの位置を保持してます
そこで、クラスAとクラスBとにわけて
合計値が3で割り切れたら削除するというプログラムを組みましたが

ソースで表すと以下のようになります

クラスのプライベートな変数へのアクセスを外部に公開してもいいのかと悩んでます

friendクラスを使うか、継承を使うかなど、どのような方法がベストでしょうか?


#include <iostream>
#include <vector>
using namespace std;

class A
{
vector<int> m_a;
public:
vector<int>::iterator GetBegin() { return m_a.begin(); }
vector<int>::iterator GetEnd() { return m_a.end(); }
vector<int>::iterator Erase( vector<int>::iterator e ) { return m_a.erase(e); }
void Init();
};
void A::Init() {
int i;
for( i=0; i<10; i++ )
m_a.push_back(i);
}

class B
{
vector<int> m_b;
public:
vector<int>::iterator GetBegin() { return m_b.begin(); }
vector<int>::iterator GetEnd() { return m_b.end(); }
vector<int>::iterator Erase( vector<int>::iterator e ) { return m_b.erase(e); }
void Init();
};
void B::Init() {
int i;
for( i=0; i<10; i++ )
m_b.push_back(i);
}

int main()
{
A a;
B b;

a.Init();
b.Init();

vector<int>::iterator pa = a.GetBegin();
vector<int>::iterator pb = b.GetBegin();

while( pa != a.GetEnd() )
{
while( pb != b.GetEnd() )
{
int sum;
sum = *pa + *pb;
if( sum % 3 == 0 )
{
printf( "%d + %d = %d(/3==0)\n", *pa, *pb, sum );
pa = a.Erase(pa);
pb = b.Erase(pb);
}
else
pb++;
}
pa++;
}

printf( "--- A::m_a ---\n" );
pa = a.GetBegin();
while( pa != a.GetEnd() ) {
printf( "%d\n", *pa );
pa++;
}
printf( "--- B::m_b ---\n" );
pb = b.GetBegin();
while( pb != b.GetEnd() ) {
printf( "%d\n", *pb );
pb++;
}
return 0;
}


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


Name: array [URL]  ..熟練のプログラマー(55,221ポイント)   Date: 2009/08/19(水) 21:04   No:38228     
Title: Re:クラスの設計    
> クラスのプライベートな変数へのアクセスを外部に公開してもいいのかと悩んでます
> friendクラスを使うか、継承を使うかなど、どのような方法がベストでしょうか?

クラス内ではなく、外部に変数を用意してクラスをインスタンス化(オブジェクト化)する際にクラス内にアドレスを保持して、クラス内ではアドレスを参照して外部の変数の操作をするのが良いと思います。
(C言語の関数内で変数をreturnで返すのではなく、関数を使う際にポインタで引数を取るのと同じ様な考え方です。)

そうすれば、クラスのプライベートな変数へのアクセスを外部に公開しているような矛盾は無くなると思います・・・。


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

Name: dic  ..プログラマー(30,958ポイント)   Date: 2009/08/20(木) 04:42   No:38245 解決!     
Title: Re:クラスの設計    
なるほど そういう方法があったんですね
目から鱗です
ありがとうございました


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

Name: Justy  ..伝説なるハッカー(407,119ポイント)   Date: 2009/08/21(金) 01:06   No:38271     
Title: Re:クラスの設計    
 弾クラス・プレイヤークラスとクラス A・Bの関係とか、
intの値が何なのか、今ひとつよくわからなかったのですが……。

 まぁ、解決しているので1点だけ。

 その二重 whileは危険ではないでしょうか。
 a.Erase(pa)の後、paが終端且つ pbが終端でなかった場合、次の *paで
まずいことになります。


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

Name: dic  ..プログラマー(31,003ポイント)   Date: 2009/08/24(月) 20:41   No:38404     
Title: Re:クラスの設計    
>Justy さん
なんとな〜く、バグが発生するような気もしながらプログラミングしてたんですが、
今回の場合に限り、動いたのでそのままにしておきました

そういう条件の場合、たしかに例外が発生しますね
ご指摘ありがとうございます


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



Name: ととろ  ..ぴよぴよ(261ポイント)   Date: 2009/08/24(月) 02:58   No:38380       
Title: 解決したはずが    
すみません。さっき質問して、stdlibをインクルードした結果エラーはなくなりました。だけど実行すると画面が真っ暗なのです。原因はさっぱりです。説明が少ないですが回答お願いします


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


Name: ととろ  ..ぴよぴよ(280ポイント)   Date: 2009/08/24(月) 03:00   No:38381     
Title: Re:解決したはずが    
さっきの質問は「定義しているはずが」が投稿者のやつです


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

Name: ととろ  ..ぴよぴよ(228ポイント)   Date: 2009/08/24(月) 03:07   No:38382     
Title: Re:解決したはずが    
追記です。
PSPは一度起動するとXMBに戻れなくなります。
あとPSPの場合stdlib.hは何を使えばいいのでしょうか?


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

Name: 夢夢  ..入門者(2,529ポイント)   Date: 2009/08/24(月) 11:39   No:38389     
Title: Re:解決したはずが    
つttp://dxlibp.sourceforge.jp/
こちらに質問した方が回答を得られやすいと思います。


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

Name: kazuoni [URL]  ..ハッカー(100,658ポイント)   Date: 2009/08/24(月) 17:37   No:38394     
Title: Re:解決したはずが    
マルチはまずいです。

ttp://dxlibp.sourceforge.jp/cgi-bin/patio/read.cgi?no=91


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

Name: Mist  ..熟練のプログラマー(65,887ポイント)   Date: 2009/08/24(月) 18:51   No:38399     
Title: Re:解決したはずが    
ここで紹介されてそっちに質問したんだからマルチでは無いんじゃないですか?
こっちを質問をクローズしないのはマナーがよろしくないといえばそうだけど。


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



Name: デジキャメ  ..かけだし(1,981ポイント)   Date: 2009/08/21(金) 23:40   No:38303       
Title: ファイルを読み込み、数字を配列に入れるには?    
ファイルに読み込んだ数字を、配列に入れていく作業に悩んでいます。

(例えば、ファイルに入っている2行の数字の列:1 3 5 7 (ここで改行) 2 4 6 8(ここまで)

 を読み込み、a[0]=1 a[1]=3 ... a[5]=2...のように数字を配列に入れる感じ)

上記の作業を行うにはどうすればいいでしょうか?


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


Name: kazuoni [URL]  ..ハッカー(100,355ポイント)   Date: 2009/08/22(土) 00:50   No:38313     
Title: Re:ファイルを読み込み、数字を配列に入れるには?    
とりあえず、開発環境、言語は明記すべきです。

aの型は何ですか?
a[4]には何が入っているのでしょうか?

そのあたりをはっきりすると、よい回答が得られるかも知れません。


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

Name: array [URL]  ..熟練のプログラマー(55,685ポイント)   Date: 2009/08/22(土) 00:58   No:38314     
Title: Re:ファイルを読み込み、数字を配列に入れるには?    
ついでに、「ファイルに読み込んだ数字」についても明確にしてほしいです。

この数値がCSV形式なのか、プログラムから配列データをそのまま出力したものなのか、数値の数は可変なのか。
この辺りが違うだけで、回答の内容も変わりますし、難易度も変わってくると思います。


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

Name: non  ..熟練のプログラマー(61,132ポイント)   Date: 2009/08/22(土) 09:24   No:38323     
Title: Re:ファイルを読み込み、数字を配列に入れるには?    
kazuoniさんとかぶりますが、再度。
>2行の数字の列:1 3 5 7 (ここで改行) 2 4 6 8
>a[0]=1 a[1]=3 ... a[5]=2...

このデータで、数字だけを配列に格納すると、
a[0]=1 a[1]=3 a[2]=5 a[3]=7 a[4]=2 a[5]=4
になります。ということは、a[4]には改行コードを入れたいということでしょうか?
それとも、単なる間違いか、どっち?


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

Name: デジキャメ  ..かけだし(2,312ポイント)   Date: 2009/08/22(土) 10:34   No:38326     
Title: Re:ファイルを読み込み、数字を配列に入れるには?    
kazumiさん arrayさん nonさん

すみません、説明が不足していましたので詳細を説明します。

開発環境:DirectX
言語:C++

data1.txtの数字
1 3 5 7
2 4 6 8
(数字だけの格納で、数字は可変です)


結果
a[0]=1 a[1]=3 a[2]=5 a[3]=7
a[4]=2 a[5]=4 a[6]=6 a[7]=8
(最終的に表示はしないです)


少し作成しましたが、エラーが発生しました。

include "DxLib.h"
#define P (8)

int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow )
{
int a[10]={0};
char String[256] ;
int FileHandle, y=0, i;

ChangeWindowMode(TRUE);
if( DxLib_Init() == -1 ) return -1;//DXライブラリの初期化
FileHandle = FileRead_open( "data1.txt" );// data1.txt を開く

while( FileRead_eof( FileHandle ) == 0 ){
for(i=0; i<P; i++){
a[i] = FileRead_gets( String, 256, FileHandle ) ;// ここでエラーが発生
}
}
FileRead_close( FileHandle );// ファイルを閉じる
for(i=0; i<P; i++){
DrawString( 0, y, %d, a[i]);// 確認用の描画
      y+20;
}
WaitKey() ;
DxLib_End() ;
return 0 ;
}



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

Name: 初級者  ..初心者(6,573ポイント)   Date: 2009/08/22(土) 11:30   No:38327     
Title: Re:ファイルを読み込み、数字を配列に入れるには?    
わざわざWindowsアプリケーションにしているのは、なぜですか?
今回のテーマでしたら、コンソール・アプリケーションの方が
ずっと楽に作れます。


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

Name: non  ..熟練のプログラマー(61,185ポイント)   Date: 2009/08/22(土) 11:34   No:38328     
Title: Re:ファイルを読み込み、数字を配列に入れるには?    
FileRead_getsは1行読み込む関数です。返却値は文字数ですし。
今回はFileRead_scanfの方がいいですね。
forで回している意味がわからないけど。


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

Name: デジキャメ  ..かけだし(2,437ポイント)   Date: 2009/08/24(月) 09:00   No:38385     
Title: Re:ファイルを読み込み、数字を配列に入れるには?    
>初級者さん nonさん

すみません、返信が遅れました。

この作業全体の流れは、

FileRead_getsで、txtファイルから数字を1つ1つ読み込む
    ↓
配列(完成では2次元配列)に数字を入れることが出来るようにする
    ↓
最終的に既存のピクロス(イラストロジック)の問題を、テキストファイルを用いて

FileRead_getsで、数字を1つ1つ(もしくは1行ずつ)読み込めるように出来ることがねらいです。

for文以外の方法はあるのでしょうか?


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

Name: non  ..熟練のプログラマー(61,191ポイント)   Date: 2009/08/24(月) 09:15   No:38386     
Title: Re:ファイルを読み込み、数字を配列に入れるには?    
>for文以外の方法はあるのでしょうか?

すでに、
while( FileRead_eof( FileHandle ) == 0 ){
これで、繰り返してますよね。


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

Name: デジキャメ  ..入門者(2,747ポイント)   Date: 2009/08/24(月) 13:51   No:38390     
Title: Re:ファイルを読み込み、数字を配列に入れるには?    
#include "DxLib.h"
#define P 8

int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow){

int a[10]={0},FileRead_getc(int FileHandle);
int FileHandle, y=0, i=0, Cr=GetColor(255,255,255);

ChangeWindowMode(TRUE);
if(DxLib_Init() == -1) return -1;
FileHandle = FileRead_open("data1.txt");
int FileRead_getc(int FileHandle);
while(FileRead_eof(FileHandle) == 0){
a[i] = FileRead_getc(FileHandle); i++;
}
FileRead_close(FileHandle);
for(i=0; i<P; i++){
DrawFormatString(0,0,Cr,"a[%d]=%d", i,a[i]); y+20;
}
WaitKey();
DxLib_End();
return 0;
}

これでも作成可能でしょうか?


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

Name: kazuoni [URL]  ..ハッカー(100,634ポイント)   Date: 2009/08/24(月) 17:15   No:38392     
Title: Re:ファイルを読み込み、数字を配列に入れるには?    
>これでも作成可能でしょうか?

自分で実行して、思ったとおりの結果が得られれば、
作成できたことになります。

まず、コンパイルが通るようにしてください。

#ファイル読み込みはC標準関数「fgetc」と同じなので、
ファイルポインタから一文字読み込み、unsigned charからintに変換して返却します。
なので、このプログラムだと自分の期待している動作と異なってるかと思います。
また、半角スペース(空白文字)も読みとっているので、
ファイルの内容によっては、a[10]を超えた領域にアクセスする可能性があります。


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



Name: 定義してるはずですが  ..かけだし(1,881ポイント)   Date: 2009/08/23(日) 21:02   No:38372       
Title: 無題    
エラーがでますatoiもatofも定義してるはずなのですがエラーになります。
原因がよく分かりません。解決法を教えてください
void load_story(){
int n,num,i,fp;
int atoi(const char *s);
double atof(char const *s);
char fname[32]={"../dat/csv/storyH0.csv"};
int input[64];
char inputc[64];

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

n=0 , num=0;
while(1){
int fz =FileRead_open(fname);
for(i=0;i<64;i++){
inputc[i]=input[i]=FileRead_getc(fp);//1文字取得する
if(inputc[i]=='/'){//スラッシュがあれば
while(FileRead_getc(fp)!='\n');//改行までループ
i=-1;//カウンタを最初に戻して
continue;
}
if(input[i]==',' || input[i]=='\n'){//カンマか改行なら
inputc[i]='\0';//そこまでを文字列とし
break;
}
if(fz!=0){//ファイルの終わりなら
goto EXFILE;//終了
}
}
switch(num){

case 0: enemy_order[n].cnt =atoi(inputc);break;
case 1: enemy_order[n].pattern =atoi(inputc);break;
case 2: enemy_order[n].knd =atoi(inputc);break;
case 3: enemy_order[n].x =atof(inputc);break;
case 4: enemy_order[n].y =atof(inputc);break;
case 5: enemy_order[n].sp =atof(inputc);break;
case 6: enemy_order[n].bltime =atoi(inputc);break;
case 7: enemy_order[n].blknd =atoi(inputc);break;
case 8: enemy_order[n].col =atoi(inputc);break;
case 9: enemy_order[n].hp =atoi(inputc);break;
case 10:enemy_order[n].blknd2 =atoi(inputc);break;
case 11:enemy_order[n].wait =atoi(inputc);break;
case 12:enemy_order[n].item_n[0]=atoi(inputc);break;
case 13:enemy_order[n].item_n[1]=atoi(inputc);break;
case 14:enemy_order[n].item_n[2]=atoi(inputc);break;
case 15:enemy_order[n].item_n[3]=atoi(inputc);break;
case 16:enemy_order[n].item_n[4]=atoi(inputc);break;
case 17:enemy_order[n].item_n[5]=atoi(inputc);break;
}
num++;
if(num==18){
num=0;
n++;
}
}
EXFILE:
FileRead_close(fp);
}
↓   ↓ エラーです   ↓
load.cpp:(.text+0x164): undefined reference to `atoi(char const*)'
load.cpp:(.text+0x1d4): undefined reference to `atoi(char const*)'
load.cpp:(.text+0x1e8): undefined reference to `atoi(char const*)'
load.cpp:(.text+0x1fc): undefined reference to `atoi(char const*)'
load.cpp:(.text+0x210): undefined reference to `atoi(char const*)'
load.o:load.cpp:(.text+0x224): more undefined references to `atoi(char const*)' follow
load.o: In function `load_story()':
load.cpp:(.text+0x2b0): undefined reference to `atof(char const*)'
load.cpp:(.text+0x2c8): undefined reference to `atof(char const*)'
load.cpp:(.text+0x2e0): undefined reference to `atof(char const*)'
load.cpp:(.text+0x2f8): undefined reference to `atoi(char const*)'
load.cpp:(.text+0x30c): undefined reference to `atoi(char const*)'
load.cpp:(.text+0x320): undefined reference to `atoi(char const*)'


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


Name: ととろ  ..ぴよぴよ(190ポイント)   Date: 2009/08/23(日) 21:03   No:38373     
Title: Re:無題    
すみません。タイトルが名前になってしまいました

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

Name: kazuoni [URL]  ..ハッカー(100,404ポイント)   Date: 2009/08/23(日) 21:05   No:38374     
Title: Re:無題    
stdlib.hインクルードしてますか?


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

Name: ととろ  ..ぴよぴよ(217ポイント)   Date: 2009/08/24(月) 01:24   No:38378     
Title: Re:無題    
ありがとうございます。無事実行できました



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



Name: あ〜る  ..中級者(11,473ポイント)   Date: 2009/08/23(日) 22:21   No:38375       
Title: flagの確認について    
お久しぶりです
構造体の配列(?)で例えば

typedef struct{
   int flag
   B[5]
}A

typedef struct{
   int flag
}B

雰囲気だけ伝える為に今適当に作ったので微妙にミスってるかも知れませんが、こんな感じの状態の時に、Bのflagが全て0だったらAのflagを0にする、という処理がしたいのですが、for文やif文を使って色々考えたのですが、どうも上手いやり方が思いつきません
1個ずつ確認するというやり方だと、実際のコードではもっとBがいっぱいあるので、コードが汚くなってしまいます…
どうすれば上手く出来るか、どなたかご教授お願いします
構造体には変数を追加しても構いません
環境はBorandC++を使っています


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


Name: ねこ  ..プログラマー(38,007ポイント)   Date: 2009/08/23(日) 23:05   No:38376     
Title: Re:flagの確認について    
memcmp関数という指定の変数(構造体含む)のメモリ内容が同じかチェックする関数があります。
あらかじめ、Aのflagを0にする時のBの設定(今回なら全て0)の構造体CheckBを作っておいて
if( memcmp( A.B, CheckB ) == 0 ) A.flag = 0;

とかする。使う際は構造体をきちんと0で初期化しておかないといけないので注意して下さい。

または全てのフラグをintで定義しておいて

int* pData = (int*)&B;
bool flgSame = true;
for( int ii = 0; ii < sizeof( B ) / sizeof( int ); ii++ )
{
if( *(pData+ii) != 0 )
{
flgSame = false;
break;
}
}

というようにB構造体の中のintデータを総チェックしていく方法があります。

構造体は多様な変数・クラスを宣言できるので一括でチェックしたい場合は
ある程度上記のような(全部intにする)制限が必要となります。


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

Name: あ〜る  ..中級者(11,487ポイント)   Date: 2009/08/23(日) 23:54   No:38377     
Title: Re:flagの確認について    
返信ありがとうございます!!
教えて頂いたmemcmpをちょっと工夫して使ったら、やりたかった事が出来ました!
これで弾切れにもなりません
本当に助かりました!ありがとうございました!


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



Name: ととろ  ..ぴよぴよ(184ポイント)   Date: 2009/08/22(土) 07:59   No:38319       
Title: パッド入力について    
PSPで作っているのでkey入力はいらないですよね?
龍神録の八章をみてもらって
キーボード入力を考えないとするとどこをどう変更・カットすればいいのでしょうか。
その他ミスがあったら教えてくれるとうれしいです

key.cppの一部
pad_t pad;

//引数1と引数2のうち大きい方を引数1に代入する
void input_pad_or_key(int *p, int k){
*p = *p>k ? *p : k;
}

//パッドとキーボードの両方の入力をチェックする関数
void GetHitPadStateAll(){
int i,PadInput,mul=1;
PadInput = GetJoypadInputState( DX_INPUT_PAD1 );//パッドの入力状態を取得
for(i=0;i<16;i++){
if(PadInput & mul) pad.key[i]++;
else pad.key[i]=0;
mul*=2;
}
input_pad_or_key(&pad.key[configpad.left] ,CheckStateKey(KEY_INPUT_LEFT ));
input_pad_or_key(&pad.key[configpad.up] ,CheckStateKey(KEY_INPUT_UP ));
input_pad_or_key(&pad.key[configpad.right] ,CheckStateKey(KEY_INPUT_RIGHT ));
input_pad_or_key(&pad.key[configpad.down] ,CheckStateKey(KEY_INPUT_DOWN ));
input_pad_or_key(&pad.key[configpad.shot] ,CheckStateKey(KEY_INPUT_Z ));
input_pad_or_key(&pad.key[configpad.bom] ,CheckStateKey(KEY_INPUT_X ));
input_pad_or_key(&pad.key[configpad.slow] ,CheckStateKey(KEY_INPUT_LSHIFT ));
input_pad_or_key(&pad.key[configpad.start] ,CheckStateKey(KEY_INPUT_ESCAPE ));
input_pad_or_key(&pad.key[configpad.change] ,CheckStateKey(KEY_INPUT_LCONTROL));
}



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


Name: Justy  ..伝説なるハッカー(407,969ポイント)   Date: 2009/08/23(日) 02:00   No:38357     
Title: Re:パッド入力について    
 テストしていませんが、こんなかんじでどうでしょう?

void GetHitPadStateAll()
{
    for(int i=0; i<16; i++)
        pad.key[i] = 0;
    
    pad.key[configpad.left] = CheckStateKey(KEY_INPUT_LEFT);
    pad.key[configpad.up] = CheckStateKey(KEY_INPUT_UP);
    pad.key[configpad.right] = CheckStateKey(KEY_INPUT_RIGHT);
    pad.key[configpad.down] = CheckStateKey(KEY_INPUT_DOWN);
    pad.key[configpad.shot] = CheckStateKey(KEY_INPUT_Z);
    pad.key[configpad.bom] = CheckStateKey(KEY_INPUT_X);
    pad.key[configpad.slow] = CheckStateKey(KEY_INPUT_LSHIFT);
    pad.key[configpad.start] = CheckStateKey(KEY_INPUT_ESCAPE);
    pad.key[configpad.change] = CheckStateKey(KEY_INPUT_LCONTROL);
}



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

Name: ととろ  ..ぴよぴよ(206ポイント)   Date: 2009/08/23(日) 20:57   No:38371 解決!     
Title: Re:パッド入力について    
ありがとうございます。
おかげでプログラムがすっきりしました



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



Name: bebe  ..ぴよぴよ(196ポイント)   Date: 2009/08/23(日) 13:40   No:38363       
Title: インクルードファイルについて教えてください。    
実行中のグローバル変数によってインクルードする部分を変えたいのですが、どうすればいいのでしょうか?

hoge.h
// Ghogeが0だったら
int hoge[10]={0,1,・・・・};
#define hogeMax 10
// Ghogeが1だったら
int hoge[20]={0,1,・・・・};
#define hogeMax 20
// Ghogeが2だったら
int hoge[30]={0,1,・・・・};
#define hogeMax 30

main.cpp
int Ghoge=0; //グローバル変数
for(i=0 ; i<3 ; i++)
{
hyouji();
Ghoge++;
}
hyouji.cpp
#include "hoge.h"
for(i=0 ; i<hogeMax ; i++)
{
printf("%d",hoge[i]);
}


こんな感じのことがやりたいのですがどうすればいいのでしょうか?


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


Name: Justy  ..伝説なるハッカー(407,596ポイント)   Date: 2009/08/23(日) 14:27   No:38365     
Title: Re:インクルードファイルについて教えてください。    

>実行中のグローバル変数によってインクルードする部分を変えたいのですが、どうすればいいのでしょうか?

 インクルードの処理はコンパイル段階で行われますが、グローバル変数の値の評価は
実行時に行われますので、根本的に無理です。



>こんな感じのことがやりたいのですがどうすればいいのでしょうか?

 インクルードでは無理ですが、それに近いことを行うことは可能です。
 次のような関数を作ります。

・ int GetHogeMax()関数
 グローバル変数 Ghogeの値に応じて、10とか 20とか 30とかの最大の値を返す。

・ int* GetHogeTable()関数

    static int hoge_10[10] = { 0, 1, };
    static int hoge_20[20] = { 0, 1, };
    static int hoge_30[30] = { 0, 1, };

 こんなかんじの変数を作っておき、グローバル変数 Ghogeの値に応じて、
hoge_10か hoge_20か hoge30の配列を返す。


 後は、この2つの関数を使って


    for(i=0 ; i<GetHogeMax(); i++)
    {
        int *hogeTbl = GetHogeTable();
        if(hogeTbl)
            printf("%d",hogeTbl[i]);
    }

とすれば、グローバル変数 Ghogeによって扱う配列を変更することが可能になります。


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

Name: bebe  ..ぴよぴよ(239ポイント)   Date: 2009/08/23(日) 20:09   No:38370 解決!     
Title: Re:インクルードファイルについて教えてください。    
justyさん、わかりやすい説明で助かりました。
関数を利用することでできました。ありがとうございました。


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



Name: SGT  ..ぴよぴよ(570ポイント)   Date: 2009/08/22(土) 23:51   No:38351       
Title: スコアボード    
えーとたぶん龍神録プログラミングの館7章と10章に関する事なのですが
なぜか敵がボードの上を通過してしまいます
他にもボードの上に透過pngで作ったロゴを置こうとしたら背景の部分(真っ黒)が表示されボードの上に表示されてくれません
graph.cppが原因ではないかと思うのですが
非常に困ってますわかる方どうかお願いいたします






void graph_ch(){
DrawRotaGraphF(ch.x+FIELD_X,ch.y+FIELD_Y,1.0f,0.0f,img_ch[ch.img],TRUE);
}


void graph_board(){
DrawExtendGraph(0 ,0 ,250,6 ,img_board[01],FALSE);
DrawExtendGraph(0 ,6 ,26 ,266,img_board[02],FALSE);
DrawExtendGraph(0 ,266,250,272,img_board[03],FALSE);
DrawExtendGraph(250,0 ,480,272,img_board[04],FALSE);
}

void graph_enemy(){
int i;
for(i=0; i<ENEMY_MAX; i++){
if(enemy[i].flag==1){
DrawRotaGraphF(enemy[i].x+FIELD_X,enemy[i].y+FIELD_Y,1.0f,0.0f,img_enemy[0][enemy[i].img],TRUE);
DrawRotaGraphF(enemy[i].x+FIELD_X,enemy[i].y+FIELD_Y,1.0f,0.0f,img_enemy[1][enemy[i].img],TRUE);
DrawRotaGraphF(enemy[i].x+FIELD_X,enemy[i].y+FIELD_Y,1.0f,0.0f,img_enemy[2][enemy[i].img],TRUE);
}
}
}


void graph_main(){
graph_ch();
graph_board();
graph_enemy();
}


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


Name: pooka [URL]  ..中級者(14,380ポイント)   Date: 2009/08/23(日) 02:52   No:38359     
Title: Re:スコアボード    
>なぜか敵がボードの上を通過してしまいます
graph_main関数を見ると
graph_board();
graph_enemy();
とボードを表示した後敵を表示するようになっています。
graph_board関数を最後に呼ぶようにしてみてください。
画像を表示するときは順序にも気をつけてください。


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

Name: SGT  ..ぴよぴよ(591ポイント)   Date: 2009/08/23(日) 18:12   No:38369 解決!     
Title: Re:スコアボード    
回答ありがとうございます!

おかげでちゃんと表示されるようになりました
画像を表示するには順序も関係あるんですね
ありがとうございました。


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



Name: kazuoni [URL]  ..比類無きプログラマー(99,052ポイント)   Date: 2009/08/19(水) 19:51   No:38216       
Title: WINAPI裏描写について    
お邪魔します。

現在WINAPIを使用して、裏描写を行っているのですが、
どうも、画像の残像が残ってしまいます。

言葉では説明できないので、全コードをアップしました。
大変申し訳ないですが、player.bmpを用意してください。。orz
(あるサイトをほぼコピーなので、画像までは添付できry)

表描写のクリアができていないのが原因のような気がするのですが、
自分では特定できずにいます。
WINAPIは全くの初心者なので、これで効率のよい描写ができているかどうか
不安なので、そのあたりも見ていただけると幸いです。。

よろしくおねがいします。


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


Name: Justy  ..伝説なるハッカー(406,264ポイント)   Date: 2009/08/19(水) 21:05   No:38229     
Title: Re:WINAPI裏描写について    
 FillRectとか PatBltで消せるかと。

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

Name: kazuoni [URL]  ..比類無きプログラマー(99,156ポイント)   Date: 2009/08/19(水) 22:30   No:38236     
Title: Re:WINAPI裏描写について    
Justyさん、ご回答ありがとうございます。

上書きすることでよかったのですねorz

裏描写をPatBltによって消す(上書きする)ことで、うまくいきました。

次回もよろしくお願いします。

#WINAPIのみだと、グラフィックの表現の幅で詰みそうな気がしてなりません・・・


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

Name: kazuoni [URL]  ..比類無きプログラマー(99,629ポイント)   Date: 2009/08/20(木) 13:52   No:38250     
Title: Re:WINAPI裏描写について    
解決としてましたが、また分からないところが出ました。。
他の方に参考にならない質問になりますので、続きから追加質問をさせていただきます。

とりあえず、うまく描写はできるようになったのですが、
キー入力が安定していません。(キー入力が原因かも分かりませんが・・・)
添付しているプログラムでは、用意した画像が
方向キーで移動する単純なプログラムです。
恐らく、キー監査、FPS制御ともにうまくできている(はず)のですが、
ある程度長押し(約5,60ループ後)すると、いきなり画像の移動速度が下がります。
離して、再度同じキーを長押ししても、同じこの繰り返しとなります。
FPSは60で変化がないので、FPS制御はうまくいっているようです(60ちょうどっというのが怪しい気がしますが・・・)
また、速度低下後、押しているキーと別のキーを一度押すと、速度は元に戻り、
それ以降は通常の速度で移動してくれます。
FPS制御がうまくできているなら、一ループにかかる処理がキーを押してから5,60ループ後に
重くなっているということになりますが、該当するところがありません(あっても気が付きません。)

修正点がありましたら、アドバイスをよろしくお願いします。


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

Name: Justy  ..伝説なるハッカー(406,971ポイント)   Date: 2009/08/21(金) 00:49   No:38269     
Title: Re:WINAPI裏描写について    

>重くなっているということになりますが、該当するところがありません

 非常に単純な話です。
 
 現在の処理は Windowsメッセージがある場合、1フレームに1つだけ処理をして
次のフレームに移り、メッセージがなければメインの処理を行ない、
UpdateWindow()で描画が行われるようになっています。
 
 この処理の方法では、ウインドウに対して何のアクションも行わなければ
Windowsメッセージは WM_PAINTだけになるので、60fpsで描画されますが、
マウスを動かす、キーを押しつづけるなどメッセージが発生するアクションを起こすと
その個々のメッセージを処理するだけで1フレーム使ってしまい、
メインが2フレームに1回くらいになります。

 試しに右を押しっぱなしにしているときに途中でマウスを動かしてみて下さい。
 多分動きがさらに遅くなるか、完全に止まってしまうのではないでしょうか。



 で、解決方法ですが、手っ取り早い方法としては

    while(PeekMessage(&msg, 0, 0, 0, PM_REMOVE))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);    
    }
    
    BitBlt(g_hBackBuffer, player.x, player.y, player.width, player.height,player.graphic.getMask(), 0, 0, SRCAND);
    ...

tと、こんな感じにメッセージを全部処理してからメインを処理するようにすると
マシンパワーが十分なら前のように遅くはならないはずです。

 ただ、PeekMessageが処理によっては重くなることもあるので、そういうことが
頻発するようならもうちょっと改善が必要になるかもしれません。


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

Name: kazuoni [URL]  ..ハッカー(100,077ポイント)   Date: 2009/08/21(金) 05:14   No:38275     
Title: Re:WINAPI裏描写について    
あ、5,60フレーム=長押しのメッセージが出てきていたんですね^^;
確かにマウスの時も動きは完全に停止でした。
確かにJustyさんのおしゃるとおりに実行したら、問題なく動きました。

>ただ、PeekMessageが処理によっては重くなることもあるので、そういうことが
>頻発するようならもうちょっと改善が必要になるかもしれません。

まだPeekMessageの仕様はmsdnを眺めた程度なので、まったく理解できていませんが、
どのような処理の時に、重い挙動を見せ、
大まかな解決法はどのような道筋でしょうか?
今後の参考までに教えていただけるとありがたいです^^;


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

Name: Justy  ..伝説なるハッカー(407,505ポイント)   Date: 2009/08/22(土) 02:04   No:38318     
Title: Re:WINAPI裏描写について    

>どのような処理の時に、重い挙動を見せ、

 どれがどうとは言えませんが、そもそも自分で定義したプロシージャが重いとか
多くのメッセージが一度に届いた時は上のコードですと全て処理してから
メインを実行しますのでその分重くなります。



>大まかな解決法はどのような道筋でしょうか?

 処理の内容にもよりますが、真っ先に思いつくのはスレッド化でしょうか。

 ウインドウとは別のスレッドでメインの処理を行えば、
最終描画以外はメッセージに引きずられることなく処理できます。

 或いは PeekMessage毎の処理の負荷を見ながらいくつ分の
メッセージの処理を行うか動的に決めて、適度に分散させる、とか。


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

Name: kazuoni [URL]  ..ハッカー(100,394ポイント)   Date: 2009/08/23(日) 16:12   No:38367 解決!     
Title: Re:WINAPI裏描写について    
Justyさん、ご回答ありがとうございます!

マルチスレッドはまだ触ってもないので、これからかと思いますが・・・
もう少ししたら勉強していきたいと思います。

ご回答ありがとうございました。
次回もよろしくお願いします。


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



Name:  ..ぴよぴよ(446ポイント)   Date: 2009/08/23(日) 02:01   No:38358       
Title: 無題    
また質問させてください。

プログラムを作ってコンパイルすると
拡張子がexeになって作成されますよね?

それを実行するとコマンドプロントになります。
でも右上の×ボタンを押すとプログラムが終了してウィンドウを
閉じます。

それをさせずに
最後まで実行しないと
プログラムを消せないようにするにはどうすればいいのでしょう?


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


Name: Justy  ..伝説なるハッカー(408,460ポイント)   Date: 2009/08/23(日) 11:46   No:38362     
Title: Re:無題    

>最後まで実行しないとプログラムを消せないようにするにはどうすればいいのでしょう

 Xボタンだけであれば

    const char * consoleName = "hogehoge";
    SetConsoleTitle(consoleName);
    Sleep(50);
    
    HWND hWnd = FindWindowA(NULL, consoleName);
    if(hWnd)
    {
        HMENU hMenu = GetSystemMenu(hWnd, FALSE);
        RemoveMenu(hMenu, SC_CLOSE, MF_BYCOMMAND);
    }
    else
    {
        // printf("%s\n", "失敗");
    }

なかんじで閉じるボタンを無効にできます。

 ついでに Ctrl + Cも無効にしたいのなら

    SetConsoleCtrlHandler(NULL , TRUE);

 も追加してみて下さい。


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



Name: ひよこ  ..熟練のプログラマー(48,153ポイント)   Date: 2009/08/22(土) 20:17   No:38335       
Title: STG改良してきました〜    
STG改良してきました。
ボムがさらに進化してしまったので・・・・すみません。
EXTRAの弾幕を少し変えました。
遊んで感想をくださるとうれしいです。
アップローダ様
http://down11.ddo.jp/uploader/download/1250939697/attach/Ryusei.zip
PASS「hiyoko」です。よろしくお願いします。


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


Name: チルチル  ..熟練のプログラマー(42,369ポイント)   Date: 2009/08/22(土) 21:05   No:38338     
Title: Re:STG改良してきました〜    
このボムは誰にも止められないですね
とりあえず弾の多い所で使うと処理落ちするので
それを何とかして欲しいですね

壁で自機を狙ってくるのは良さそうですね
最後の弾幕はもう少し規則性が欲しい所ですが・・

制限時間なども付いて基本はできてきたようなので
やはり次はレーザーか3D背景が欲しいですね
特に弾が直線に並んでいる事が多いので
そこをレーザーに置き換えると良いと思います


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

Name: ひよこ  ..熟練のプログラマー(48,196ポイント)   Date: 2009/08/22(土) 21:24   No:38339     
Title: Re:STG改良してきました〜    
チルチルさん
>>さっそく遊んでくださりありがとうございます。
レーザーですか、がんばってみます。
他の人も感想待ってます。


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

Name: situmon  ..プログラマー(39,533ポイント)   Date: 2009/08/22(土) 21:30   No:38340     
Title: Re:STG改良してきました〜    
コンティニュー2回もして(へぼしゅーたーの自分。。。)
やっとEXTRAクリアしました。
とりあえず、EXTRAだけやりましたが、
感想は弾幕がとてもきれいでした。
あとボムの演出もよかったです。
たしか前は玉が白くならなかった気がしますが今回玉がきらきらと白くなって消えましたね!!
でも弾幕は、きれいであるとともに、
簡単によけられる(簡単すぎてもだめですが。。。)というほうがいいので
いうと、ランダム弾の間隔が狭くて速度がはやいので難しいです。(あくまでへぼしゅーたーの意見)
でも弾幕が以前よりきれいでかっこよかったので面白かったです。
製作お疲れ様でした。
これからもがんばってください!!


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

Name: ひよこ  ..熟練のプログラマー(48,420ポイント)   Date: 2009/08/22(土) 21:53   No:38344     
Title: Re:STG改良してきました〜    
situmonさん
>>遊んでくださりありがとうございます。

コンティニュー2回もして(へぼしゅーたーの自分。。。)
やっとEXTRAクリアしました。
>>へぼしゅーたーじゃないですよ。弾幕が難しいだけです。

ランダム弾の間隔が狭くて速度がはやいので難しいです。(あくまでへぼしゅーたーの意見)
>>たしかに狭いですね。参考にいただきます(tを角度の計算式に使っていたからでした。

でも弾幕が以前よりきれいでかっこよかったので面白かったです。
>>ありがとうございます。

他の人も感想待ってます。


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

Name: ラグ  ..入門者(4,312ポイント)   Date: 2009/08/23(日) 00:10   No:38353     
Title: Re:STG改良してきました〜    
やってみました
私には難しかったですw
あと道中曲がすごくいいですね〜かなり気に入りましたw
最初のリフやってるギター(?)がちょっと大きすぎる気がするのと、ループのつなぎがちょっと気になったので、そこをうまくやれればもっと良いと思います

あと、コンティニューしないを選ぶといきなりゲームが終了するので、最初のメニューに戻るようにしたほうがいいんじゃないかなと思いました

とりあえずは以上です
製作頑張ってくださいw


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

Name: チルチル  ..熟練のプログラマー(42,444ポイント)   Date: 2009/08/23(日) 00:13   No:38354     
Title: Re:STG改良してきました〜    
弾幕の事なんですが前から同じ弾幕なので指摘する所が残ってないんですよね・・
2面とかを作ったり1度全部違う弾幕に入れ替えたりすれば見えなかった物が見えてくるかもしれません
それから全方位ばら撒き系の弾幕が多いので全部同じような弾幕に見えてきて印象に残りにくい気がします


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

Name: ひよこ  ..熟練のプログラマー(48,610ポイント)   Date: 2009/08/23(日) 05:49   No:38361     
Title: Re:STG改良してきました〜    
ラグさん
>>遊んでくださりありがとうございます。
コンティニューしないを選ぶといきなりゲームが終了するので、最初のメニューに戻るようにしたほうがいいんじゃないかなと思いました
>>タイトルに行くように直します。

チルチルさん
それから全方位ばら撒き系の弾幕が多いので全部同じような弾幕に見えてきて印象に残りにくい気がします
>>そうなんですか、考えてみます。

他の人も感想を待ってます。


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



Name: yrao  ..入門者(4,329ポイント)   Date: 2009/08/20(木) 17:12   No:38252       
Title: ボス弾幕について2    
こんにちは。
今回もボス弾幕の作り方についてアドバイスを頂きたく質問させてもらいます。

今回は、レーザー弾幕についてです。
東方永夜抄の永淋の「神代の記憶」のような六角形のレーザーを作りたいのですが、レーザーの出し方そのものの理解が不十分なこともあり、作り方がわかりません。
プログラミングの館のレーザー作成の章も見たのですが、いまいち分かりませんでした。。。
レーザーの出し方と、レーザーを六角形にする方法について教えてください。


製作は龍神録プログラムの改造という形で進めています。
アドバイスよろしくお願いします。


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


Name: yrao  ..入門者(4,387ポイント)   Date: 2009/08/22(土) 18:38   No:38332     
Title: Re:ボス弾幕について2    
すみません六角形レーザーは難しそうなのであきらめる事にしました。

レーザー照射についてなのですが、
プログラミングの支館の『弾幕簡略化関数』のような関数を、レーザーでも作ることは可能なのでしょうか?


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

Name: チルチル  ..熟練のプログラマー(41,946ポイント)   Date: 2009/08/22(土) 19:35   No:38333     
Title: Re:ボス弾幕について2    
龍神録のコードを理解していないので何とも言えませんが、レーザーで六角形を作るのはこんな感じですよね

東方のアレは枝分かれする事で六角形に見えているようです

弾幕簡略化関数は見たところ弾の情報を初期化する関数のようですが
レーザーの構造体のような物があるなら作る事は可能だし便利だと思いますよ


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

Name: yrao  ..入門者(4,491ポイント)   Date: 2009/08/22(土) 20:00   No:38334     
Title: Re:ボス弾幕について2    
チルチルさん返答ありがとうございます。



枝別れするレーザーですか…
やはり今の自分には厳しいかもしれませんね…




構造体のようなもの
というのは例えば
lazer[k].angle
のようなものでしょうか?


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

Name: チルチル  ..熟練のプログラマー(42,182ポイント)   Date: 2009/08/22(土) 20:32   No:38336     
Title: Re:ボス弾幕について2    
綺麗に六角形にするのは難しいかもしれませんが、枝分かれならそうですね・・

レーザーが出現した時は長さがゼロで、時間が経つと長さが増えて行くようにして
規定の長さになったら増やすのをやめて、その瞬間にレーザーの先端の座標を計算して
その座標にレーザーの角度から右と左に少し曲げて同じレーザーを出現させる・・

と言う処理を何回か繰り返せば枝分かれしているように見えるかもしれません

構造体はそんな感じですね
引数に渡された値をlazer[k]のメンバに渡して行けば書き忘れが無くて良いと思います


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

Name: yrao  ..入門者(4,683ポイント)   Date: 2009/08/22(土) 21:02   No:38337     
Title: Re:ボス弾幕について2    
なるほど……。

六角形ですと、一定時間進んだあと左右に60゜ずつずらして枝別れさせて、また一定時間進んだら…
という風にやってやればできるかもしれないですね…。

しかし基本的なレーザーが打てないとどうにもならなさそうなので、
まずは弾幕簡略化関数のレーザー版を作る事から始めてみようと思います。


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

Name: situmon  ..プログラマー(39,617ポイント)   Date: 2009/08/22(土) 21:34   No:38341     
Title: Re:ボス弾幕について2    
長さって決められないんですかね・・・
レーザー自体、角度が決められるのでたぶん
枝分かれという方法もありますが、6つのレーザーを出してそれぞれここからここまで、
と長さと角度を計算してやれるのではないでしょうか?


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

Name: situmon  ..プログラマー(39,988ポイント)   Date: 2009/08/22(土) 21:44   No:38343     
Title: Re:ボス弾幕について2    
いちど見てみましたが(スペカ)
枝分かれ・・・というよりは点と点を結ぶような感じでここからここまで、
とやっていますね。
ですが、あれって、レーザーですが、弾を引き伸ばした(多分)レーザーですね。


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

Name: チルチル  ..熟練のプログラマー(42,328ポイント)   Date: 2009/08/22(土) 21:59   No:38345     
Title: Re:ボス弾幕について2    
龍神録の方法では長さを変えられるようですね
最初に全部配置しておいて時間差で伸ばしても良いかもしれません


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

Name: yrao  ..入門者(4,842ポイント)   Date: 2009/08/22(土) 22:17   No:38346     
Title: Re:ボス弾幕について2    
Situmonさんありがとうございます。


弾を引き伸ばしたレーザーですか…

完全に同じように再現したいわけではなく、
ボスを中心に格子状にレーザーが照射されていく
というのが作りたかっただけなので(汗)今回はこのままのレーザーでいきたいと思います。



六本のレーザーを・・・
というのは、六角形の一辺を一本のレーザーで…
という事でしょうか?


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

Name: situmon  ..熟練のプログラマー(40,094ポイント)   Date: 2009/08/22(土) 22:20   No:38347     
Title: Re:ボス弾幕について2    
はいそういうことです。
多少めんどくさいと思いますが、チルチルさんのいったように時間差で・・・
枝分かれはひとつのレーザーで囲むようなかたちで六角形ですよね。
ですがめんどくさいですが、ひとつの辺で一本のレーザーをつくって。。。
なので合計6本で六角形ができます。


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

Name: yrao  ..入門者(4,853ポイント)   Date: 2009/08/22(土) 22:49   No:38350     
Title: Re:ボス弾幕について2    
わかりました〜
やってみたいと思います。


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



Name: Windows  ..ぴよぴよ(45ポイント)   Date: 2009/08/22(土) 16:45   No:38330       
Title: Windowsプログラミング    
スライドコントロール(添付した画像)をプログラム中から設定・取得したいんですけど、
・最大値/最小値の設定
・現在値の取得
どうすればいいでしょうか。
誰か教えてください。

環境:C言語、VC++2008EE


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


Name: windows  ..ぴよぴよ(10ポイント)   Date: 2009/08/22(土) 22:32   No:38349 解決!     
Title: Re:Windowsプログラミング    
自己解決しました。
すいません。


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



Name: situmon  ..プログラマー(38,965ポイント)   Date: 2009/08/19(水) 14:43   No:38206       
Title: シューティングゲームを作りました!3弾目    
シューティングゲームをつくりました。起動できないバグを改良しました。ver1.01
本当にご迷惑をおかけしました。
前作の意見もふくめて作りました。
PASSはsitumonです。
http://ppup.dip.jp/uploader/download/1250683436/attach/Gm15%20ver%201.01.zip
見てほしいところ
弾幕です。。。けっこう不思議なのをつくったつもりです。
難易度
さまざまです。
easyはかなり甘くしました。hardはかなり違う弾幕にして、それはそれでたのしんでいただけるかと・・・
条件によりクリアするとExtraが選択できます。
条件がどうしてもわからなければ具体的にかきますが、被弾をおさえればOKです。
しかしセーブ機能がないので、一度、終了するとまたクリアしないと選択できなくなってしまいますのでご了承ください。


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


Name: Tatu  ..初心者(5,857ポイント)   Date: 2009/08/19(水) 16:52   No:38210     
Title: Re:シューティングゲームを作りました!3弾目    
ダウンロードしましたが、
難易度を選択した所で勝手に終了してしまいます。
何度かダウンロードしなおしてみましたが治りません。
生成されたLog.txtを添付します。
OSはWindows Vistaです。


前作「猫は夏の雪を見る」について

ハードが未だにクリアできません。

竜巻の怒りの前まではノーミスで行けます。
次の二つの弾幕のどちらかでゲームオーバーになるので
これらについて書きます。

竜巻の怒り LEVEL 8/10
泡弾の向きが変わるとき、よける場所が、泡弾一列分くらいと非常に狭く、また
向きの変化がランダムなため、自機のほうに全く来ないこともあれば、
泡弾が自機を閉じ込めるように動くこともあり、運の要素が大きいです。
ボスから一番遠い右下でよけるようにし、左からやってくる泡弾だけでもよけられるようになれば
少しは被弾率を下げられます。
泡弾の速度が下がれば、より上のほうで方向が変わるようにもなり、簡単になると思います。

危険な森の奥底 LEVEL 10/10
ほぼパターンですが、弾が速く、攻撃間隔が短く、全方位弾の隙間が狭い。
回避は不可能ではないが長い時間無駄な動きが許されず、かわしきるのはかなり難しくてできません。
全方位弾の数が半分に減るだけでも相当楽になると思います。


ところで、ボスの位置が真ん中より左にずれているような気がしますが、気のせいでしょうか。

また、大量のランダム弾をばらまく中ボスが弾切れを起こすことがあります。
そういう弾幕なのかと思っていましたが、ミスしたときは最後まで弾を出すので、
確認してください。


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

Name: ねこ  ..プログラマー(37,873ポイント)   Date: 2009/08/19(水) 17:42   No:38214     
Title: Re:シューティングゲームを作りました!3弾目    
<しかしセーブ機能がないので、一度、終了するとまたクリアしないと選択できなくなってしまいますのでご了承ください。
まだプレイしてないんですが、これって苦労して出せても無駄になるのか・・・ってモチベーション下げちゃうと思いますよ。

INIファイルというものを使った凄く簡単な「セーブ方法」を下記に記載してみますので対応する考えがあったら是非に。


<1>
// クリア時にINIファイルを作る
char cExtr[ 32 ] = "";
sprintf_s( cExtr, sizeof( cExtr ), "%d", iExtraFlg);
WritePrivateProfileString( "SYSTEM", "EXTRA", cExtr, "System.ini" );
<2>
// 起動時にINIファイルから読み込む
iExtraFlg = GetPrivateProfileInt( "SYSTEM", "EXTRA", 0, "System.ini" );
<3>
// EXTRAをメニューから選択可能にする処理
if( iExtraFlg == 1 )
{
}


「iExtraFlg」という変数を仮に「EXTRA出現条件フラグ」とします。
1の処理をEXTRA出現時に行う事で「System.ini」というINIファイルというものが作成されます。
2はゲーム起動時常に実行するようにします。INIファイルが無ければ「iExtraFlg」には0が入ります。
3はメニュー時に「iExtraFlg」を見て分岐します。

こんな風にすると比較的容易にセーブ情報を保持する事が出来ます。


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

Name: situmon  ..プログラマー(38,981ポイント)   Date: 2009/08/19(水) 21:02   No:38226     
Title: Re:シューティングゲームを作りました!3弾目    
ねこさん、詳しく教えていただけますか?

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

Name: situmon  ..プログラマー(39,002ポイント)   Date: 2009/08/19(水) 21:03   No:38227     
Title: Re:シューティングゲームを作りました!3弾目    
猫は夏の雪を見る
アップしなおそうか考えてます(改良版)、


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

Name: situmon  ..プログラマー(39,049ポイント)   Date: 2009/08/19(水) 21:11   No:38230     
Title: Re:シューティングゲームを作りました!3弾目    
しかし前作と比べるとかなり違うので自分でもびっくりです。
検討します。ありがとうございます。Tatuさん、
追記
すいません、間違えて最新版のを消してしまったようです・・・
すこし復旧に時間をください。猫は夏の雪を見る のHARDは躊躇せずかなり適当に作ってしまった部分もあり申し訳ないです。


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

Name: ねこ  ..プログラマー(37,947ポイント)   Date: 2009/08/19(水) 22:29   No:38234     
Title: Re:シューティングゲームを作りました!3弾目    
それなりに詳しく・・・書いてるつもりではあるんですがw

「iExtraFlg」をEXTRA出現フラグにでも置き換えれば張り付ければ動くと思いますよ。
とりあえず何が分からないのか分からないのでこれ以上答えられないです。


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

Name: チルチル  ..熟練のプログラマー(40,446ポイント)   Date: 2009/08/19(水) 23:33   No:38242     
Title: Re:シューティングゲームを作りました!3弾目    
特に目立った欠点も無く、ゲームとしては成立していますね

タイトルの項目の順番ですが、EXは真ん中の方が良いんじゃないでしょうか?
あと一番下で下を押したら上に戻ったりすると良いですね

それから場面変化が少し鈍いと言うか遅いですね
やはりフェードインがあるとわかりやすいと思います

前作の反動でしょうか、敵が死ぬのが早いですね
もう少し硬くしてはどうでしょうか?

後は素材をもう少し作りこむと良いと思います

ゲームとしての基本はできてると思うので
次は応用編として3D背景かレーザーに挑戦してはどうでしょうか?
どちらもやってみると意外に簡単ですよ

しかしINIファイルを使った保存の方法もあるんですね、知りませんでした・・


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

Name: バグ  ..ハッカー(168,104ポイント)   Date: 2009/08/20(木) 02:06   No:38244     
Title: Re:シューティングゲームを作りました!3弾目    
INIファイルは御手軽な反面、改竄しやすいので使い処を考えなくてはいけません(^_^;)

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

Name: ねこ  ..プログラマー(38,110ポイント)   Date: 2009/08/20(木) 08:30   No:38246     
Title: Re:シューティングゲームを作りました!3弾目    
>チルチルさん
バグさんもおっしゃられてますがINIファイルは「お手軽セーブ」ってだけなので実際のセーブファイルに使うのはあまり好ましくありません。

今回みたいなケースの場合だと「EXTRAが出るまでファイル自体存在しない」という状態なため、
あらかじめ編集出来たりしないので、ファイルorパラメータが存在しない場合のデフォルト値を上手く使っています。
フラグ解放後にどんどんINIファイルのパラメータを増やす方式なら編集されてもただフラグがON/OFFになるだけになり、フラグ解放後の編集に意味を持たせなくできます。


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

Name: situmon  ..プログラマー(39,183ポイント)   Date: 2009/08/20(木) 09:53   No:38247     
Title: Re:シューティングゲームを作りました!3弾目    
敵のHPって、考えるのが難しくて、弾幕をよけさせつつ倒す快感を残さなきゃいけないので難しいです。
人に言ってもらってはじめてこのくらいとわかるので、、、直してみます。
次回作は3面+EXTRAにしたいとおもいます。
レーザーは無理かもですが、3D背景を少し勉強したいです。
あとセーブ機能についてですが、ゲームプログラミングの館のセーブ方法がわからなかったので、
どなたか教えてほしいのですが・・・INIファイルは変えられやすいのですよね・・・


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

Name: ねこ  ..プログラマー(37,946ポイント)   Date: 2009/08/20(木) 10:46   No:38249     
Title: Re:シューティングゲームを作りました!3弾目    
>situmonさん
例えばハイスコアやプレイ情報等の情報を残す場合だとINIファイルなんかは使ってはいけませんが
EXTRAをプレイするには起動毎にクリアしないといけなくなる、
という状況を回避するための簡易セーブを書いただけです。
暫定で作るならINIで構わないと思いますし、むしろ習作ですからEXTRA最初から出してても良いんじゃないかと。

<セーブ方法がわからない
恐らくですがC言語レベル、構造体やバイナリファイルの扱いについての理解が足りてないんだと思います。
龍神録ベースに作るとそれなりに動くものが出来る反面、プログラムの基礎は勉強しなければ身に付きません。
基礎が身に付けば様々な応用が出来ますので製作と勉強は交互にやると良いかと思います。


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

Name: ひよこ  ..熟練のプログラマー(48,013ポイント)   Date: 2009/08/20(木) 14:33   No:38251     
Title: Re:シューティングゲームを作りました!3弾目    
やってみました。弾幕がとてもきれいでした。絵も上手でしたし、
私はNormalで
「猫が寝る空間」にやられすぎて終了ってことが多かったです。
コンティニュー機能を追加してもらえるとうれしいです。


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

Name: situmon  ..プログラマー(39,281ポイント)   Date: 2009/08/20(木) 18:28   No:38258     
Title: Re:シューティングゲームを作りました!3弾目    
>ひよこさん
「猫が寝る空間」
あれはかなりパターンなので、あとは自機狙い弾をよくみればよけられますよ♪
コンティニュー機能は3回くらいで追加します(次回作)
あとポーズ画面はどうでしたか?
ひよこさんにいわれていたので考えて実装したのですが。。。
>ねこさん
バイナリファイルの扱いが足りてないのだと思います。構造体などは本を読んでいたのですが、
これは・・・勉強します。


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

Name: チルチル  ..熟練のプログラマー(40,535ポイント)   Date: 2009/08/20(木) 18:46   No:38260     
Title: Re:シューティングゲームを作りました!3弾目    
とりあえず私が使っているセーブの方法でサンプルを作ってみました
パッと作ったのでミスが無いか心配ですが・・


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

Name: チルチル  ..熟練のプログラマー(40,618ポイント)   Date: 2009/08/20(木) 19:06   No:38261     
Title: Re:シューティングゲームを作りました!3弾目    
と思ったらchar型なのに1000まで代入できるようにしてしましました・・
セーブと関係はありませんが0〜100ぐらいでお願いします

ポーズですがエスケープを押した時は解除
Xを押した時はタイトルに戻るを選択の方が良いと思います


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

Name: situmon  ..プログラマー(39,316ポイント)   Date: 2009/08/20(木) 19:44   No:38262     
Title: Re:シューティングゲームを作りました!3弾目    
もしよければですが、使わせていただいてよろしいでしょうか、
チルチルさんのコードを使いたいです。


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

Name: チルチル  ..熟練のプログラマー(40,655ポイント)   Date: 2009/08/20(木) 19:47   No:38263     
Title: Re:シューティングゲームを作りました!3弾目    
どうぞ使ってください♪

そういえばセーブとは方法が違いますけど
リプレイ機能なども付けると良いかもしれません


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

Name: ひよこ  ..熟練のプログラマー(48,065ポイント)   Date: 2009/08/20(木) 21:55   No:38265     
Title: Re:シューティングゲームを作りました!3弾目    
situmonさん
>>あとポーズ画面はどうでしたか?
シューティングの画面のままとメニューとなっていてよかったです。


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

Name: situmon  ..プログラマー(39,237ポイント)   Date: 2009/08/21(金) 09:38   No:38277     
Title: Re:シューティングゲームを作りました!3弾目    
>チルチルさん
セーブ機能はできたのですが、リプレイ機能は具体的に・・・どう作ればいいのでしょうか?
あとセーブ機能についてですが、
fopenの宣言を確認してくださいとでてきてしまいますが、
きちんとビルドされ、動作もできているのですが、なぜでしょう。
ぐぐってみましたが、具体的に解決しませんでした。


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

Name: チルチル  ..熟練のプログラマー(41,861ポイント)   Date: 2009/08/21(金) 18:37   No:38286     
Title: Re:シューティングゲームを作りました!3弾目    
「fopenの宣言を確認してください」と言うのは上のサンプルの段階で出るようですね
動作できるという事はエラーではなく警告のようですが
私の環境では何故か警告を出さない設定になっているので
そういう警告が出るとは知りませんでした
なので原因は私にもわからないです、申し訳ありません・・

動作しているので問題は無いと思いますが、警告が出るのは気分が良くないですよね
fopen関数はCの標準関数だったと思うのでstdio.hをインクルードすれば消えるかもしれません

どなたか出ないようにする方法を知っている方がいたら教えてください

リプレイですが私は過去ログのような方法で実装しました、匿名と言うのは私です

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

この頃は私の受け答えが下手だったので、見てもわからない可能性が高いです(今も結構下手ですが・・)
実装してわかったんですが不十分な所もあったので、良かったらサンプルとか作りますよ
諸事情で今は自分のプログラムが進められなくて暇ですし・・

リプレイが難しかったらスナップショットとかでも良いかもしれません
これがあるだけでクオリティが少し高く感じる気がします

ちなみに私の悪い病気(誰かに自分の中途半端なコードを進めたがる病)
が発動中なのでヤバイと思ったら話を斬って下さい
リプレイの処理を進めていながら、もっと効率の良い方法があったら変更しようとか考えてますから・・


2倍のポイントを手に入れた! 1,206ポイント を手に入れた。

Name: situmon  ..プログラマー(39,288ポイント)   Date: 2009/08/21(金) 19:09   No:38287     
Title: Re:シューティングゲームを作りました!3弾目    
>中途半端なコード
いえいえ、参考になるので助かります。
リプレイですが、リファレンスみてみます。


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

Name: array [URL]  ..熟練のプログラマー(55,539ポイント)   Date: 2009/08/22(土) 00:45   No:38311     
Title: Re:シューティングゲームを作りました!3弾目    
どうも、遊ばせてもらいました。とくに感想はいえませんが、毎回ゲームのクオリティーが上がっていくので、バージョンアップ・新作のたびにDLして少しあそばせてもらってます。
頑張って下さい。


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

Name: situmon  ..熟練のプログラマー(40,117ポイント)   Date: 2009/08/22(土) 22:21   No:38348     
Title: Re:シューティングゲームを作りました!3弾目    
クオリティー。。。
でも自分で毎作品ごとに少しずつ、機能がアップしてるのは感じています。
ありがとうございます。


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



Name: uwlover  ..かけだし(1,960ポイント)   Date: 2009/08/21(金) 22:34   No:38300       
Title: Win32APIについて    
Windowsプログラミングを勉強しているのですが、これが難しくてたまりません。
最初のウィンドウ表示のソースコードを読む時点でつっかえまくっています。本当は疑問が次々と大量に湧いて
きているのですが、ここでは質問を本当の初歩に絞って、

int WINAPI WinMain(HINSTANCE hCurInst, HINSTANCE hPrevInst,
LPSTR lpsCmdLine, int nCmdShow)

このC言語ならmain関数に相当するこの関数の引数はどうやって具体的な値が与えられているのでしょうか?
まずそこが分かりません。コマンドライン引数だと考えても、この引数に値を入力することはありませんし。

もう一つ、Windowsプログラミングを勉強するのに参考になる書籍はどんなものがあるのですか?私が持って
いるのは「猫でも分かるWindowsプログラミング」とGAME DEVELOPERシリーズの「Windowsプログラミング」
です。


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


Name: 御津凪 [URL]  ..ハッカー(107,901ポイント)   Date: 2009/08/21(金) 22:55   No:38301     
Title: Re:Win32APIについて    
WinMain 関数では、他のアプリケーションとの連携を想定しているため、
コンソールプログラムにはない引数があります。

それぞれの引数の意味は、

・HINSTANCE hCurInst
 現在のアプリケーション(自分自身のこと)のインスタンスハンドル。
 いくつかの Win32API で使用します。

・HINSTANCE hPrevInst
 アプリケーションの前のインスタンスのハンドル。
 ただし、Win32版では常に NULL 。(互換性のために残されています)

・LPSTR lpsCmdLine
 渡されたコマンドライン引数。
 (main 関数の引数とは違い、全てつながった状態かつプログラム名は除かれて渡されます)

・int nCmdShow
 他のプログラムから起動されたときに渡されるウインドウ表示指定フラグ。
 通常はこのフラグを使用してメインウインドウなどの表示をコントロールします。

因みに、戻り値は main 関数と同じ意味を持ちます。


参考になる書籍は私は「API で学ぶ Windows 徹底理解」(日経ソフトウェア)というものを持っていますが、
結構前のものなので、もしかしたら大型の書店とかにはあるかもしれません。

それと、基本知りたい Win32API 関数の細かな情報は MSDN のサイトにありますよ。
(専門用語があったりして難解かもしれませんが、必要な情報はほぼすべて手に入ります)

「MSDN (関数名)」でググるとほぼ確実に先頭にヒットします。


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

Name: sizuma [URL]  ..中級者(13,785ポイント)   Date: 2009/08/22(土) 00:26   No:38309     
Title: Re:Win32APIについて    
こんにちは

>Windowsプログラミングを勉強しているのですが、これが難しくてたまりません。
同じく難しくて、挫折しそうです。
僕は猫でも分かるゲームプログラミングを持ってます。(まだ全然読んでないですが)
覚えることが多すぎて、
「Win32APIってなんか使う機会あるかな・・・」
って思ってしまいました。
とりあえずもってる参考書は一通り目を通してみようとは思ってますが。

uwloverさんも、よくわからないところはひとまず飛ばして進めていった方がいいのでは?
僕の参考書ではウィンドウを表示するソースがのってる次に
HINSTANCEとかUINTとか見慣れない型が出てきますが今は気にしないでください。
みたいに書いてありますよ


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

Name: uwlover  ..かけだし(2,321ポイント)   Date: 2009/08/22(土) 08:56   No:38320 解決!     
Title: Re:Win32APIについて    
ご回答ありがとうございます。
分からないことは何としても調べ上げないと気がすまない性質でして、(あまりに難しいのなら、そのことが
分かればいいです)読み飛ばすのは苦手なのです。講義とかで質問を講義の最後に持ってこられると困るって
タイプですね。
もっとも、先の質問の引数への具体的な値の与え方はWINAPIが関わっており、まともに語るとマシンコードが
云々という話になるらしいので、こりゃ工学レベルの話だと考えパスすることにしました^^;
他にも、ウィンドウプロシージャはシステムからコールバックされる(コールバックの意味がいまいち掴めない
ですが)関数なのに何故WINAPIを指定しないのか、プロシージャはメッセージを受け取ったときにWinMain内の
コードの実行中に割り込んで自身のコードを実行するものと見てよいのか、などと疑問は尽きませんが、まず
御津凪さんがお勧めしてくれた本を手に入れて勉強することにします。


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

Name: バグ  ..ハッカー(168,262ポイント)   Date: 2009/08/22(土) 12:37   No:38329     
Title: Re:Win32APIについて    
興味をもつのは悪い事ではないですが、Windowsプログラミングを勉強するならば、先人の作った仕組みを信頼して、こういうものだと割り切って使わせてもらうという姿勢も大切かと。
突っ込んだ内容に迫るのは、ある程度使いこなせるようになってからで充分だと思います。その方が、例えなんとなくだとしても、流れや仕組みのようなものを実感できるようになっているでしょうから、結果的に理解が早くなり、効率も上がります。


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



Name: kuz  ..かけだし(1,475ポイント)   Date: 2009/08/21(金) 23:57   No:38304 解決!       
Title: C言語 途中で処理が終わってしまうのですが・・    
こんばんわ。
C言語を始めたばかりの初心者です。
今まで試行錯誤してきて大体のミスとかはカバー出来たんですが、先程コンパイルしたら謎のエラー(?)が起こったので、みなさんに解決して頂きたくてここに書き込みました。

コンパイラとライブラリはVisual C++ Exprees Editionを使用してます。
問題は5人の学生の合計点と各教科の平均点を出せ、という問題があったので、プログラムを組んだのですが、
途中で処理(学生の合計点を出すまで)が終わってしまって平均点が出せなくなりました。

表はこうなってます。



学生 数学 古典 英語
1 50 90 40
2 80 30 50
3 90 89 70
4 100 75 90


組んだプログラム


#include <stdio.h>


main(){

int a, b, total, heikin, goukei;
static int ten[4][3]={{50, 90, 40},
{80, 30, 50},
{90, 89, 70},
{100, 75, 90}};




for(a=0; a<4; a++){
total=0;

for(b=0; b<3; b++){
total+=ten[a][b];
}
printf("%d人目の合計点は%dです。\n", a+1, total);

}

for(b=0; b<3; b++){
heikin=0;
goukei=0;
for(a=0; a<4; a++){
goukei+=ten[a][b];
}
heikin = goukei / a;

switch(b){
case '0': printf("数学の平均点は%dです。", heikin);
break;
case '1': printf("古典の平均点は%dです。", heikin);
break;
case '2': printf("英語の平均点は%dです。", heikin);
break;
}
}

return(0);
}



デバックした結果

1人目の合計点は180です。
2人目の合計点は160です。
3人目の合計点は249です。
4人目の合計点は265です。
続行するには何かキーを押してください...

なぜ平均点を出す所まで行かないで、合計点を出すだけで終わってしまうのでしょうか?
見づらかったらごめんなさい。。。


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


Name: ランド  ..初心者(5,190ポイント)   Date: 2009/08/22(土) 00:04   No:38305     
Title: Re:C言語 途中で処理が終わってしまうのですが・・    
> case '0': printf("数学の平均点は%dです。", heikin);

'0' は 0 とは異なります。

printf("char型の0=%d 整数の0=%d", '0' , 0 ); で確認してみて下さい。

'1' , '2' も同様です。


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

Name: sizuma [URL]  ..中級者(13,569ポイント)   Date: 2009/08/22(土) 00:08   No:38306     
Title: Re:C言語 途中で処理が終わってしまうのですが・・    
>先程コンパイルしたら謎のエラー(?)
バグですね。

最後のswitchでbはint型なのに、charと比べてます。
0と'0'は違いますよ。



#かぶったです。^^;


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

Name: kuz  ..かけだし(1,533ポイント)   Date: 2009/08/22(土) 00:15   No:38307     
Title: Re:C言語 途中で処理が終わってしまうのですが・・    
>>ランドさん
>>sizumaさん
'0'と0とでは全く違ったんですね。
もう一度基本からやり直してみますorz

ご回答ありがとうございましたー!


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

Name: box  ..ハッカー(142,723ポイント)   Date: 2009/08/22(土) 00:23   No:38308     
Title: Re:C言語 途中で処理が終わってしまうのですが・・    
> 最後のswitchでbはint型なのに、charと比べてます。

char型はint型よりも狭い範囲の整数を扱う型です。
今回のケースでは当てはまりませんが、

int b;
の定義で、

switch (b) {
case '0':
/* 以下省略 */
}

と書くことはごく普通です。


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

Name: sizuma [URL]  ..中級者(13,910ポイント)   Date: 2009/08/22(土) 00:33   No:38310     
Title: Re:C言語 途中で処理が終わってしまうのですが・・    
'0'がなんだったか忘れましたが・・・
0x0020だったかな?
↑だとしたら32を表現するときに'0'を使うということでしょうか??
僕は
>char型はint型よりも狭い範囲の整数を扱う型
として使うなら

char b;

switch(b){
case 0:
/*以下省略*/
}

とかくのは普通だと思うんですが、文字コードの数を整数として扱うのは分かりにくいんじゃないかな、と思うんですが。


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

Name: non  ..熟練のプログラマー(61,001ポイント)   Date: 2009/08/22(土) 09:17   No:38321     
Title: Re:C言語 途中で処理が終わってしまうのですが・・    
>文字コードの数を整数として扱うのは分かりにくいんじゃないかな、と思うんですが。
boxさんが言われているのはそうじゃなくて、文字コードをint型で扱うことは普通ですってことです。



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

Name: toyo  ..熟練のプログラマー(40,495ポイント)   Date: 2009/08/22(土) 09:23   No:38322     
Title: Re:C言語 途中で処理が終わってしまうのですが・・    
ここの掲示板で学んだ知識ですが
'0'はC言語ではint型(0x00000030)でC++ではchar型(0x30)になります。
'00'だとC++でもint型になります(値は0x00003030)。


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

Name: sizuma [URL]  ..中級者(14,046ポイント)   Date: 2009/08/22(土) 10:10   No:38325     
Title: Re:C言語 途中で処理が終わってしまうのですが・・    
>>文字コードの数を整数として扱うのは分かりにくいんじゃないかな、と思うんですが。
>boxさんが言われているのはそうじゃなくて、文字コードをint型で扱うことは普通ですってことです
それならありそうですね。失礼しました


>'0'はC言語ではint型(0x00000030)でC++ではchar型(0x30)になります。
>'00'だとC++でもint型になります(値は0x00003030)
文字型なのに'00'っていう表現があるんですね
そして値が0x00003030って・・・
int型で表現できるなら'0000'
とかでもいけるんでしょうね^^;


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


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



Name: Dixq (管理人) [URL]  ..ウィザード(1,048,643ポイント)   Date: 2009/08/20(木) 21:30   No:38264       
Title: SAKURAのサーバーへの移行    
またもやレンタルサーバー移行します。((金が飛んでいく・・^^;

たかぎさんに紹介してもらったので間違いない!今度こそ問題の無いレンタルサーバーSAKURAさんのとこで契約しました。
今日変更手続き申請したので、2〜3日のうちに繁栄されるんじゃ無いかと思います。

例によってトップページの下に書いてある

「引越し後、新サーバー」から「SAKURAのサーバー」に変わります。

今度は龍神録のアンケートも正常に動くはずです(掲示板の方はまだ未対応です)

前回アクセス出来ない日が一日ありましたが、今回もこのような事が無いとは言えません。
万一アクセス出来ないことがありましたら、気長にお待ち下さい(汗


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


Name: Dixq (管理人) [URL]  ..ウィザード(1,048,510ポイント)   Date: 2009/08/22(土) 09:37   No:38324     
Title: Re:SAKURAのサーバーへの移行    
新サーバーに移行が完了したこと確認しました。
今のところ特に不具合はないみたいですね。
掲示板のアンケート、龍神録のアンケートともに正常に動いているようです。
今までご迷惑をおかけしました;

もし何か不具合などありましたら教えていただけると幸いですm(_ _)m


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



Name: kai  ..入門者(4,797ポイント)   Date: 2009/08/21(金) 23:31   No:38302       
Title: 敵の種類を変える方法    
改造龍神録についてです。
まず、load.cppに
LoadDivGraph( "../dat/img/enemy/1.png" , 9 , 3 , 3 , 80 , 60 , img_enemy[1] ) ;
ini.cppに
input_enemy_info(&enemy_info[1],32, 32, 1,15.0);
storyH0.csvの
敵の種類(knd)を新しい敵を出現させたいものに1を

ここまではいいのですが
graph.cpp内のgraph_enemy()の部分で

//敵描画
void graph_enemy(){
int i;
for(i=0;i<ENEMY_MAX;i++){
if(enemy[i].flag==1){
DrawRotaGraphFdF(enemy[i].x,enemy[i].y,1.0f,0.0f,img_enemy[0][enemy[i].img],TRUE);
DrawRotaGraphFdF(enemy[i].x,enemy[i].y,1.0f,0.0f,img_enemy[1][enemy[i].img],TRUE);
}
}
}

こうするとただ単にimg_enemy[0]の上にimg_enemy[1]が上書きされて表示されてしまい
これをkndによって場合分けしたいのですがうまく行かなくて困ってます。
どうしたら敵を一匹一匹種類を変えることができるようになるのでしょうか?
アドバイスお願いします。


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


Name: array [URL]  ..熟練のプログラマー(55,659ポイント)   Date: 2009/08/22(土) 00:48   No:38312     
Title: Re:敵の種類を変える方法    
最近、似たような質問があったのですが、参考にならないでしょうか

http://www.play21.jp/board/formz.cgi?action=res&resno=38268&page=&id=dixq&rln=38273#38270


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

Name: kai  ..入門者(4,851ポイント)   Date: 2009/08/22(土) 01:29   No:38315     
Title: Re:敵の種類を変える方法    
なるほど、enemy[i].kndに変えるだけでよかったのですね
一個一個、
if(enemy[i].knd == 0)
if(enemy[i].knd == 1)
と区切ってたので
おかげでプログラム行数も減ります
arrayさんありがとうございました!


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

Name: kai  ..入門者(4,873ポイント)   Date: 2009/08/22(土) 01:46   No:38316     
Title: Re:敵の種類を変える方法    
と思ったのですが
実際に
DrawRotaGraphFdF(enemy[i].x,enemy[i].y,1.0f,0.0f,img_enemy[enemy[i].knd][enemy[i].img],TRUE);
と実装してみたのですが、描画されませんでした。
何が原因なのでしょうか?


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

Name: kai  ..入門者(4,882ポイント)   Date: 2009/08/22(土) 01:50   No:38317 解決!     
Title: Re:敵の種類を変える方法    
あ、すみません。自己解決しました。

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



Name: さとり  ..かけだし(1,790ポイント)   Date: 2009/08/21(金) 21:34   No:38296       
Title: 無題    
周りの白い部分を読み込まずに東方妖々夢の部分だけ読み込むにはどうしたらいいでしょうか?


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


Name:  ..ぴよぴよ(940ポイント)   Date: 2009/08/21(金) 22:24   No:38297     
Title: Re:無題    
白い部分を透明化すればいいと思います

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

Name: kazuoni [URL]  ..ハッカー(100,292ポイント)   Date: 2009/08/21(金) 22:27   No:38298     
Title: Re:無題    
DXライブラリですか?(前トピからすると・・・)

このあたりが参考になるかと
ゲーム作りで学ぶ! 実践的C言語プログラミング
ttp://karetta.jp/book-node/game-programming/236542

#過去ログでほかの人もみるので、タイトルは内容に合ったタイトルを付けたほうがよいかと思います。


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

Name: Jack  ..ぴよぴよ(873ポイント)   Date: 2009/08/21(金) 22:30   No:38299     
Title: Re:無題    
環境を明記しないとまともな回答は得られませんよ。
あとタイトルをつけて下さい。
ついでに、その画像は他者の著作物のように見えますが著作権的に問題ないのですか?


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



Name: さとり  ..かけだし(1,558ポイント)   Date: 2009/08/21(金) 16:07   No:38282       
Title: 無題    
ほかのところから宣言した座標を呼んでるのになぜかch.x,ch.yに座標が代入されず図が現れません
graph.cpp
extern ch_t ch;
extern int img_ch[12];
extern void first_ini();
void graph_ch(){
DrawRotaGraphF(ch.x+FIELD_X,ch.y+FIELD_Y,1.0f,0.0f,img_ch[5],TRUE);
}

ini.cpp
extern ch_t ch;

void first_ini(){
ch.x=FIELD_MAX_X/2;
ch.y=FIELD_MAX_Y*3/4;
}

load.cpp
LoadDivGraph( "dat/PLAYER00.png" , 12 ,4 , 3, 33, 51, img_ch) ;


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


Name: box  ..ハッカー(142,609ポイント)   Date: 2009/08/21(金) 16:56   No:38283     
Title: Re:無題    
> ほかのところから宣言した座標を呼んでる

提示されたソースコードの、どの部分のことですか?



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

Name: さとり  ..かけだし(1,652ポイント)   Date: 2009/08/21(金) 17:35   No:38284     
Title: Re:無題    
ごめんなさい。編集のときのパスワードってどこでわかりますか?

ちなみにgraphのch.xとch.yです
first_iniの内容をそこに入れてます。
FIELD_X,Yはちゃんと定義できています


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

Name: box  ..ハッカー(142,624ポイント)   Date: 2009/08/21(金) 18:34   No:38285     
Title: Re:無題    
first_ini関数を呼び出しているのは、どこですか?

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

Name: さとり  ..かけだし(1,688ポイント)   Date: 2009/08/21(金) 20:16   No:38290     
Title: Re:無題    
first_iniはini.cppのなかです


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

Name: LK  ..ぴよぴよ(11ポイント)   Date: 2009/08/21(金) 20:49   No:38292     
Title: Re:無題    
first_ini関数を実行している場所がわからないのですが、
もし、first_ini関数が別の場所で正常に実行されているのであれば、
図のパスが間違っているのかもしれません。


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

Name: box  ..ハッカー(142,676ポイント)   Date: 2009/08/21(金) 21:15   No:38293     
Title: Re:無題    
> first_iniはini.cppのなかです

それは、first_ini関数を「定義している」場所ではありませんか?
定義したfirst_int関数を、どこで呼び出していますか?という質問をしています。


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

Name: さとり  ..かけだし(1,737ポイント)   Date: 2009/08/21(金) 21:28   No:38294     
Title: Re:無題    
すみませんでした。くだらないミスでした。FIELD_MAX_Yの値をパソコンに合わせたんで、PSPだとはみ出してしまったようです


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

Name: さとり  ..かけだし(1,743ポイント)   Date: 2009/08/21(金) 21:30   No:38295 解決!     
Title: Re:無題    



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



Name:  ..かけだし(1,098ポイント)   Date: 2009/08/21(金) 19:32   No:38288       
Title: 龍神録4章のDrawRotaGraphFについて    
龍神録4章のgraph.cpp内にあるDrawRotaGraphFという関数についてです
void graph_ch(){

DrawRotaGraphF(ch.x,ch.y,1.0f,0.0f,img_ch[0][ch.img],TRUE);
}

という風に書かれているのですが、この関数の役割はなんなのでしょうか?
DrawRotaGraphFの部分をコメントにしてみると画像が表示されなくなったので、おそらく画像を表示するための関数なんだろうなと思いました。
DXライブラリの関数リファレンスページで探してみると、DrawRotaGraphとDrawRotaGraph2という関数はあったのですが、DrawRotaGraphFという関数は見つからなかったので自作関数なのかなと思いました。
load.cppで既にLoadDivGraph関数をつかって画像をメモリに読み込んでいるので、表示したいのであればDrawGraphを使えば表示できると思うのですが、なぜここではDrawGraphを使わず自作関数のDrawRotaGraphFを使っているのでしょうか・・・?
それ以前になぜDrawRotaGraphFという関数で画像を表示することが可能なのでしょうか?




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


Name: MNS  ..中級者(13,893ポイント)   Date: 2009/08/21(金) 20:12   No:38289     
Title: Re:龍神録4章のDrawRotaGraphFについて    
自作関数ではありません。
確かに、関数リファレンスページには無いかもしれませんが、
DXライブラリに標準で実装されている関数です。
具体的には、DrawRotaGraph関数の引数が、floatになったものです。


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

Name:  ..かけだし(1,124ポイント)   Date: 2009/08/21(金) 20:21   No:38291 解決!     
Title: Re:龍神録4章のDrawRotaGraphFについて    
引数がfloatになっただけだったんですか・・・
教えてくれてありがとうございました


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



Name: math  ..ぴよぴよ(84ポイント)   Date: 2009/08/21(金) 01:41   No:38272       
Title: ジャンプの考え方1について    
ゲームプログラミングの館の27.ジャンプの考え方1のところで、理解できない事があったので説明お願いします。

y = sqrt ( 2.000 * g * y_max) * t - 0.500 * g * t * t;
上の式は理解できたのですが、この式に*448.000 / y_max をして、
y = (int) ((sqrt ( 2.000 * g * y_max) * t - 0.500 * g * t * t) * 448.000 / y_max);
にする意味がわかりません。
また、y_maxを2で定義している理由もわかりません。
y_maxは最高点ですので、縦480ピクセルからキャラ32ピクセルを引いた、448ではないんですか?

詳しい説明お願いします。


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


Name: kazuoni [URL]  ..比類無きプログラマー(99,863ポイント)   Date: 2009/08/21(金) 04:58   No:38274     
Title: Re:ジャンプの考え方1について    
うーん・・・
確かに、変数のパラメータの意味が変わってきているような気がします。
y_maxが空気抵抗
448.000が到達点
みたいな挙動ですね。物理的意味は・・・ちょっと自分にはわかりません^^;
書いた本人ではないので。。

ウィンドウが第四象限であることを踏まえ、
第一象限のように直観的に扱うなら、
y_max 480
y = (int) (sqrt ( 2.000 * g * y_max) * t - 0.500 * g * t * t);
DrawGraph( x , 480-y , image[8] , TRUE );

でジャンプしているように見えます。(スタート地点から480)
重力加速度gをいじれば、ジャンプ時間も調節できます。


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

Name: math  ..ぴよぴよ(118ポイント)   Date: 2009/08/21(金) 09:08   No:38276     
Title: Re:ジャンプの考え方1について    
kazuoniさん回答ありがとうございます。
私も、
y_max 480
y = (int) (sqrt ( 2.000 * g * y_max) * t - 0.500 * g * t * t);
DrawGraph( x , 480-y , image[8] , TRUE );
を考えたのですが、そうするとジャンプする時間を調節するのに、
重力加速度を変えるしかないけれど、重力加速度は定数なので、
変えるのはどうなんだ?と思っています。

* 448.000 / y_max;をしてy_maxに「2」を定義していますが、
この意味が分かる方、詳しく説明お願いします。



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

Name: toyo  ..熟練のプログラマー(40,454ポイント)   Date: 2009/08/21(金) 10:11   No:38278     
Title: Re:ジャンプの考え方1について    
y_max = 2.0の意味は
「2m上まで投げ上げた時の時間とともに変化するy」
で例としてあげてある2メートルのことだと思います

プログラム内での2メートルを画面の448ドットに対応させるため最後に 448.0 / y_max を乗じています


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

Name: kazuoni [URL]  ..ハッカー(100,191ポイント)   Date: 2009/08/21(金) 10:24   No:38279     
Title: Re:ジャンプの考え方1について    
>重力加速度を変えるしかないけれど、重力加速度は定数なので、
>変えるのはどうなんだ?と思っています。

変えたら何かまずいのですか?

>toyoさん

納得できました(笑)
だからmを上げるとゆっくりな投射になってたんですね。


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

Name: やそ  ..比類無きプログラマー(98,761ポイント)   Date: 2009/08/21(金) 13:04   No:38280     
Title: Re:ジャンプの考え方1について    
重力加速度は現実の世界では定数といっていいと思いますが、
こと、ゲームにおいては「それらしく見えればよい」のであり、
変えてもなんら問題ありません。
実際に描写した際の動きが気に入らなければ、自分のゲームのスタイルに合うように
いくらでも変更してよいと思いますよ。

>y_max = 2.0の意味は
2Mだからだよ。・・・とはすぐにわかったけど、
上手い説明が思いつかなかった。
toyoさんGJ!!



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

Name: marh  ..ぴよぴよ(34ポイント)   Date: 2009/08/21(金) 13:44   No:38281 解決!     
Title: Re:ジャンプの考え方1について    
toyoさん回答ありがとうございます。
大変分かりやすい説明で理解することができました。

やそさん回答ありがとうございます。
これからは定数だからとこだわらず、ゲームにあうように変更していきます。


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



Name:  ..ぴよぴよ(803ポイント)   Date: 2009/08/21(金) 00:24   No:38268       
Title: 龍神録プログラミングの館 10章    
こんにちは

上記タイトルの10章で敵の表示を行いますがその際敵の種類のデータ(knd)を増やす処理はどのように記述するのでしょうか?
graph.cpp内の記述を

void graph_enemy(){
int i;
for(i=0;i<ENEMY_MAX;i++){
if(enemy[i].flag==1){
DrawRotaGraphF(enemy[i].x+FIELD_X,enemy[i].y+FIELD_Y,1.0f,0.0f,img_enemy[0][enemy[i].img],TRUE);
}
}
}

以下のように記述
void graph_enemy(){
int i,j;
for(i=0;i<ENEMY_MAX;i++){
if(enemy[i].flag==1){
DrawRotaGraphF(enemy[i].x+FIELD_X,enemy[i].y+FIELD_Y,1.0f,0.0f,img_enemy[0][enemy[i].img],TRUE);
}
}
for(i=0;i<ENEMY_MAX;i++){
if(enemy[j].flag==1){
DrawRotaGraphF(enemy[j].x+FIELD_X,enemy[j].y+FIELD_Y,1.0f,0.0f,img_enemy[1][enemy[j].img],TRUE);
}
}
}

してみたところ敵の種類は確かに増えましたがCSVデーターにある敵の種類のデータ(knd)番号で指定しても反映されずランダムに[0]と[1]の敵が出現してしまいました。
弾の色・弾の種類・弾幕の種類の同様に指定変更させるにはどのようにすべきでしょうか?


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


Name: array [URL]  ..熟練のプログラマー(55,452ポイント)   Date: 2009/08/21(金) 01:02   No:38270     
Title: Re:龍神録プログラミングの館 10章    
多分赤文字の部分を変更するだけで十分だと思います。


void graph_enemy(){
int i,j;
for(i=0;i<ENEMY_MAX;i++){
if(enemy[i].flag==1){
DrawRotaGraphF(enemy[i].x+FIELD_X,enemy[i].y+FIELD_Y,1.0f,0.0f,img_enemy[enemy[i].knd][enemy[i].img],TRUE);
}
}
}


※補足
CSVデーターにある敵の情報は、最終的に「 enemy[値].knd 」の中に情報が格納されますので、その値を使います。
なぜ、配列の一番目を変更すれば良いのかというと、敵の画像は

GLOBAL int img_enemy[3][9];

この様に2次元配列で用意されています。分かりやすく配列の値が何を指すのかというと

img_enemy[敵の種類][アニメーション用]

この様になっているので、配列の一番目を変更すれば良いことになります。


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

Name:  ..ぴよぴよ(826ポイント)   Date: 2009/08/21(金) 03:13   No:38273 解決!     
Title: Re:龍神録プログラミングの館 10章    
ご丁寧に分かりやすい説明ありがとうございます。

とても助かり参考になりました。


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



Name: kamiya  ..ぴよぴよ(463ポイント)   Date: 2009/08/18(火) 23:29   No:38198       
Title: 可搬性    
C言語の参考書を使っていくと所々に
「プログラムは出来るだけ可搬性が高くなるように実現せよ」
というような事が書かれているのですが、この可搬性が高いというのは、
処理系に依存しない。とか、他の言語への移植がしやすい。または互換性がある。
などのように理解すればよいのでしょうか?
また可搬性の重要性についてもご教授していただければ幸いです。
所々で主張されているので重要なことなのだろうとは思うのですが、具体的にどのように重要なのかがいまひとつ掴めません。


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


Name: array [URL]  ..熟練のプログラマー(55,105ポイント)   Date: 2009/08/18(火) 23:57   No:38199     
Title: Re:可搬性    
> 処理系に依存しない。とか、他の言語への移植がしやすい。または互換性がある。

可搬性を辞書で調べたら移植性と出てきたので間違っていないと思います。

個人的なプログラムであれば、そんなに気にしなくても良いと思いますが・・・

可搬性の重要性は、例えば「スーパーファミコン」で使える『ファイナルファンタジー』というゲームが人気があり「プレイステーション」でも発売しようという企画が持ち上がった場合。

「スーパーファミコン」の『ファイナルファンタジー』のプログラムを、「プレイステーション」でも使えるに様にプログラムを少しだけ変える程度ですむのなら簡単に実現します。

しかし、可搬性が低いと、プログラムを最初から最後まで書き直さないといけないという事になるので、とても労力を使うことになります。


多分ですけど、C言語の参考書が初心者レベルなら『汎用性』の事を言ってるのではないでしょうか。
『汎用性』は重視する必要性がありますが、初心者レベルで可搬性を気にする必要はまったく無いと思います。


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

Name: ねこ  ..プログラマー(37,543ポイント)   Date: 2009/08/19(水) 09:10   No:38202     
Title: Re:可搬性    
<この可搬性が高いというのは処理系に依存しない。とか、他の言語への移植がしやすい。または互換性がある。
arrayさんの意見と異なりますが、教本の言いたい事は「他プログラムにコピペしても動くようなもの」ではないでしょうか。
例えば計算用関数や判定関数にはグローバル変数を使わず、コピペした後「呼び出さなくてもコンパイルエラーにはならない」程度の汎用性を持つ事など。
あくまでC言語の範囲での話ではないかな、と。

他言語までの移植性となると、他言語を習得しているという前提になりますし参考書でそのような意図はあまり書かないんじゃないかな、と思います。


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

Name: Haru  ..上級者(24,030ポイント)   Date: 2009/08/19(水) 09:11   No:38203     
Title: Re:可搬性    
私もまだまだ、初心者レベルですので、大した事はいえませんが、
arrayさんのおっしゃるとおり、そこまで気にする必要はないかと思います。

誰が見てもわかりやすい

という事を気にすれば良いかと。


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

Name: YuO  ..プログラマー(33,280ポイント)   Date: 2009/08/19(水) 10:38   No:38205     
Title: Re:可搬性    
可搬性を高く,と言われた場合,非標準の動作や関数にできるだけ依存せずに作る事を考えます。

有名所で,
fflush(stdin);
があります。

可搬性を無視してVisual C++の現行バージョンのみにフォーカスするなら,
MSDN: fflush
http://msdn.microsoft.com/ja-jp/library/9yky46tz(VS.90).aspx
の,
> ストリームが入力用として開いている場合、fflush はバッファの内容を消去します。fflush は、stream に対する前回の ungetc の呼び出しの結果をすべて無効にします。
を期待して記述できます。

ところが,本来fflushを入力ストリームに対して使われた場合,規格上の動作としては未定義とされていますから,上記の記述は可搬性のある記述にはなりません。


まぁ,どうしても処理系に依存する部分は出てくるのは確かですが。
なので,有名ライブラリはどこかに山のような#ifによる処理系差の吸収部分があったりします。


> 他プログラムにコピペしても動くようなもの

違うでしょうね。通常,それを可搬性とは呼びません。
どちらかというと,モジュールの独立性に関わる問題でしょうか。
# コピペすること自体が悪手であることが多いですが。


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

Name: kamiya  ..ぴよぴよ(491ポイント)   Date: 2009/08/20(木) 23:23   No:38267 解決!     
Title: Re:可搬性    
様々な意見をありがとうございました。
とても参考になりました。


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



Name: 初心者  ..プログラマー(35,489ポイント)   Date: 2009/08/19(水) 22:32   No:38237       
Title: 描写エフェクト(?)    
東方をやっていて思ったのですが、ボスキャラの周りが(なんというか、)ゆがんでますよね?
あの感じをDxライブラリで表現したいのですが、出来ますか?

自分の知識ではどうしてもわからないのでどうか教えてください。
お願いします。


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


Name: チルチル  ..熟練のプログラマー(40,310ポイント)   Date: 2009/08/19(水) 22:52   No:38238     
Title: Re:描写エフェクト(?)    
この質問は定期的に出るんですよね・・

とりあえず過去ログを御覧ください

http://www.play21.jp/board/formz.cgi?action=res&resno=37401&page=30&lognum=114&id=dixq&rln=37407


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

Name: 初心者  ..プログラマー(35,512ポイント)   Date: 2009/08/19(水) 23:29   No:38240 解決!     
Title: Re:描写エフェクト(?)    
3Dは訳わからなくてあまりやろうとしてなかったのですが・・・

どうやら通らなくてはいけない道のようですね、
がんばって勉強してきます。


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

Name: チルチル  ..熟練のプログラマー(40,328ポイント)   Date: 2009/08/19(水) 23:33   No:38241     
Title: Re:描写エフェクト(?)    
ん?別に3Dを使わなくてもできると思いますけど・・

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

Name: 初心者  ..プログラマー(35,573ポイント)   Date: 2009/08/20(木) 10:25   No:38248     
Title: Re:描写エフェクト(?)    
3Dを使わなくてもできますか!?

過去ログを読んだのですがいまいち理解できなくて・・
3Dを使うように解釈したのですが


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

Name: チルチル  ..熟練のプログラマー(40,490ポイント)   Date: 2009/08/20(木) 18:07   No:38257     
Title: Re:描写エフェクト(?)    
3Dを使う方法もありますが、使わなくてもできます
歪ませるのは結構簡単なんですが、それっぽく歪ませるのが難しいです

参考までに過去ログの一年前に作ったコードを添付しておきます
あの頃は未熟だったから少し汚いですが・・

aa.pngは適当な画像を使ってください


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

Name: 初心者  ..プログラマー(35,691ポイント)   Date: 2009/08/20(木) 22:58   No:38266 解決!     
Title: Re:描写エフェクト(?)    
すごいです!
3Dを使わなくても出来るんですね!
自分には全く理解が出来ませんが・・

理解できるようがんばります。
ありがとうございました!


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



Name: Re:Re:  ..ぴよぴよ(65ポイント)   Date: 2009/08/20(木) 17:14   No:38253       
Title: ソースコードの説明について    
今までに色々なソースを作ってきました。
ソース毎にそのプログラムがいつ作られて
どんなプログラムかを一番上に書いております(看板)。

この看板なのですが正式な名称があるのでしょうか?
また書いている方にお聞きします。
どのような看板を書いているか張っていただけますと幸いです。


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


Name:  ..ぴよぴよ(208ポイント)   Date: 2009/08/20(木) 17:15   No:38254     
Title: Re:ソースコードの説明について    

連レスすみません。
ちなみに私のものです。
看板
/*//////////////////////////////////////////////////
機能名:
メモ:
作成日:2009/01/01 更新日:2009/01/01
/////////////////////////////////////////////////*/


/*//////////////////////////////////////////////////
機能名:
引数:x → 出力する数字 , y → モード
メモ:
作成日:2009/01/01 更新日:2009/01/01
/////////////////////////////////////////////////*/
void Func(int x,int mode){
〜処理〜
}


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

Name: 通りすがり  ..上級者(17,322ポイント)   Date: 2009/08/20(木) 17:54   No:38256     
Title: Re:ソースコードの説明について    
まぁとりあえず名前位正確に書きましょうや。

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

Name: やそ  ..比類無きプログラマー(98,612ポイント)   Date: 2009/08/20(木) 18:42   No:38259     
Title: Re:ソースコードの説明について    
「コメント」って言うと思うよ^^
基本的に好きなこと書いていいらしいよ。
あると便利だけど、コメントの使いすぎは逆に見づらくなるし、
間違ったコメントはミスリードになるので、注意したほうがいいみたい。

プログラムの先頭に書く場合、そのプログラムを書いた人や
どんな目的のプログラムなのか、いつ書いたのかを書くことが多いんじゃないかな。


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



Name: 初心者  ..プログラマー(35,370ポイント)   Date: 2009/08/17(月) 19:12   No:38164       
Title: DXライブラリの設定    
今回、初めてVisualC++ 2008 Express EditionとDXライブラリを使おうと思い、DXライブラリ本家様の
「VisualC++ 2008 Express Edition を使用した場合のDXライブラリの使い方」
のページにあるサンプルプログラムをコンパイルしたところ、

1>------ ビルド開始: プロジェクト: test2, 構成: Debug Win32 ------
1>コンパイルしています...
1>draw.cpp
1>c:\users\ryo\documents\visual studio 2008\projects\test2\draw.cpp(1) : fatal error C1083: include ファイルを開けません。'DxLib.h': No such file or directory
1>ビルドログは "file://c:\Users\ryo\Documents\Visual Studio 2008\Projects\test2\Debug\BuildLog.htm" に保存されました。
1>test2 - エラー 1、警告 0
========== ビルド: 0 正常終了、1 失敗、0 更新不要、0 スキップ ==========

というエラーが出ました…。
DXライブラリを最初からインストールしたり設定をやり直したりしましたが、上手くいきません。
どうしたら良いのでしょうか…。


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


Name: Dixq (管理人) [URL]  ..ウィザード(1,048,279ポイント)   Date: 2009/08/18(火) 20:29   No:38196     
Title: Re:DXライブラリの設定    
こんばんは。

「'DxLib.h': No such file or directory 」この、エラーの意味は解りますか?

DxLib.hなんかどこにあるのさ〜?
ってコンパイラが困っているのです。

プロジェクトのあるフォルダにその名前のヘッダファイルがあるか確認して下さい。
また、プロジェクトの作り方が良く解らない時は「サンプルプログラム実行用フォルダ」にあるプロジェクトで試してみて下さい。

後、お名前はなるべくユニークな物にして下さい。複数の方と被りますので・・。


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

Name: 初心者  ..プログラマー(35,645ポイント)   Date: 2009/08/20(木) 17:25   No:38255 解決!     
Title: Re:DXライブラリの設定    
返事が遅れてしまい大変申し訳ありません。
解決できました。ありがとうございます!
名前はこれ以降の投稿から変えます。失礼致しました。


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



Name: 初心者です。。  ..ぴよぴよ(324ポイント)   Date: 2009/08/19(水) 19:28   No:38215       
Title: 教えてください    
DXライブラリを使って
ストラックアウトのようなゲーム作成を考えています。

本を見ながら作っているのですが、
見ている本がマップゲーム用なので
どれが必要でどれが必要ではないのから分からず、
必要だと思うものを書くとエラーが出たりします。

考えている内容はボールの動きは
みんなのゴルフのように一回キーを押すと
メーターがあがり、頂点に達したところをパワーMAXとし、
そこでもう一度キーを押すとメーターが下に下がり、
下でタイミングよくキーを押すことにより、
ボールを飛ばすという感じで考えています。

このようなゲームを作成するのに、
役に立ちそうなサイトや本、
もしくわやり方を教えていただけるとうれしいです。

ヨロシクお願いします。


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


Name: kazuoni [URL]  ..比類無きプログラマー(99,364ポイント)   Date: 2009/08/19(水) 23:49   No:38243     
Title: Re:教えてください    
どのような本か分からないですけど、
ゲームの大まかな流れと、グラフィックに関しての解説があれば、
あとは自分の力でゴリゴリ書くしかないかと思います^^;

いきなりすべてをやるのではなく、一個一個作っていったほうが、
モチベーション的にもよいかと思います。
分からないところは、具体的に質問をすれば、よりよい回答が得られるかと思います。
「○○を表現したく、添付ファイルのように組んでみましたが、●●のように動いてしまいます。」
みたいにですね。


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



Name: 桁そろえに・・  ..ぴよぴよ(89ポイント)   Date: 2009/08/19(水) 22:23   No:38231       
Title: 無題    
C言語でprintfを使って出力する際に、%10dなどとすれば桁はそろえられるのでが、

そろえる時に、足りない桁を0と表示させるにはどうすればよいのですか??


イメージしているのは、次のような形式です。よろしくお願いします。

11111111 333
00000001 001
00002222 022


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


Name: mint  ..ぴよぴよ(423ポイント)   Date: 2009/08/19(水) 22:25   No:38232     
Title: 桁揃え・・・    
下の質問と同じですが、タイトルをつけ忘れました。失礼しました。

C言語でprintfを使って出力する際に、%10dなどとすれば桁はそろえられるのでが、

そろえる時に、足りない桁を0と表示させるにはどうすればよいのですか??


イメージしているのは、次のような形式です。よろしくお願いします。

11111111 333
00000001 001
00002222 022


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

Name: ksz  ..ぴよぴよ(4ポイント)   Date: 2009/08/19(水) 23:14   No:38239     
Title: Re:桁揃え・・・    
釣りなのかな・・・。
ゼロサプレスってやつですね。

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


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



Name: mint  ..ぴよぴよ(573ポイント)   Date: 2009/08/19(水) 22:26   No:38233       
Title: 桁揃え    
下の質問と同じですが、タイトルをつけ忘れました。失礼しました。

C言語でprintfを使って出力する際に、%10dなどとすれば桁はそろえられるのでが、

そろえる時に、足りない桁を0と表示させるにはどうすればよいのですか??


イメージしているのは、次のような形式です。よろしくお願いします。

11111111 333
00000001 001
00002222 022



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


Name: ねこ  ..プログラマー(37,955ポイント)   Date: 2009/08/19(水) 22:30   No:38235     
Title: Re:桁揃え    
「%010d」です

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



Name: uwlover  ..かけだし(1,006ポイント)   Date: 2009/08/19(水) 19:53   No:38217       
Title: 関数が仕事していない?    
このような簡単なソースコードなのですが、

#include <iostream>
using namespace std;

void func(int x);

int main()
{
int p = 1234;

cout << p << endl;

func(p);

cout << p << endl;

return 0;
}
void func(int x)
{
x *= 2;
}


関数プロトタイプ宣言の練習を兼ねてわざと関数にint型変数pの値を2倍にするようにした(このぐらいなら
関数に2倍処理してもらう必要ないですからね、普通は)のですが、これで実際にやってみると出力はどっちの出力も1234になってしまいます。つまり、関数で2倍にされておらず、初期化したときのpの値がそのまま出力されていることになります。
しかし、次のようにポインタを使うと、

#include <iostream>
using namespace std;

void func(int *x);

int main()
{
int p = 1234;

cout << p << endl;

func(&p);

cout << p << endl;

return 0;
}
void func(int *x)
{
*x *= 2;
}


こうすると最初の出力は1234に、最後の出力は2468になっています。つまりちゃんと関数が仕事して
います。どうしてこのような違いが生じるのでしょうか?代入の詳しい仕組みに代入は実はコピーである云々と
いう話をどこかで聞いたことがある気がするのですが、その辺が関係しているのかなぁと推察していますが、
やっぱり全然分かりません。


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


Name: non  ..熟練のプログラマー(60,870ポイント)   Date: 2009/08/19(水) 19:57   No:38218     
Title: Re:関数が仕事していない?    
値渡しと参照渡しで検索すると、たくさん説明が出ますので、それを読んで
わからないことを質問してください。


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

Name: dic  ..プログラマー(30,273ポイント)   Date: 2009/08/19(水) 20:05   No:38219     
Title: Re:関数が仕事していない?    
ポインタ関連の質問ですね
最初の方法 void func( int x ) 関数が呼ばれると
void func( int x ) の x には呼び出し時の引数1234がコピーされます
そしてこのコピーは関数void func( int x ) 内のみで有効となります
関数 void func( int x ) を抜けるとこの値は無効になります
具体的に言うと int main() の int p の値だけが void func( int x ) の int x にコピーされます


2番目の方法 void func( int *x ) 関数は
int main() 関数の int p のアドレス値が引数として渡されます
そのアドレスは int *x に代入されます
そして、そのアドレスの内容を2倍しています
なので、関数 void func( int *x ) を抜けてもint main() の int p を変更しているので
2468となります


2番目の方法のやり方を理解しているので分かるかなとは思いますがいかがでしょう?


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

Name: owata  ..ぴよぴよ(6ポイント)   Date: 2009/08/19(水) 20:16   No:38221     
Title: Re:関数が仕事していない?    
func関数の返り値がないだけなのでは?

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

Name: uwlover  ..かけだし(1,345ポイント)   Date: 2009/08/19(水) 20:24   No:38222     
Title: Re:関数が仕事していない?    
どうもありがとうございます、その方面で検索してみました。
先の例で言うと、func(p)の場合は値渡しと言い、funcに渡されるのはpの値のコピーであり、funcで処理
される値はそのコピーされた値だから元の値自体が処理されるわけではない。他方、func(&p)の場合は参照
渡しと言い、funcに渡されるのはpのアドレスだからfuncはアドレスからpの値を取り出すことによってpの
値そのものを処理できる。だからpの値を変更することが出来る。以上のような感じになるんでしょうか?

しかし、そうなると疑問が生じます。コピーのpを処理していた関数の場合、その処理されたpはどういう状態に
なっているんでしょうか?もしかして、放置されたまま結局使われることなくプログラムが終了した、という
ことになるんでしょうか?


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

Name: uwlover  ..かけだし(1,530ポイント)   Date: 2009/08/19(水) 20:32   No:38223 解決!     
Title: Re:関数が仕事していない?    
って、書き込んでいる内にdicさんが疑問の答えにあたる内容を提供してくださっているようですね。
コピーのpはfunc内部でのみ有効な変数だから、値渡しで2468を実現したいのならfunc内で出力すれば
よいってことになりますね。(実行しましたが成功しました)
今回は渡しの仕組みと変数の寿命(?)について勉強になりました。コピーのpはコピー先の関数内でない、
というのも大きなポイントだったように思います。皆さんどうもありがとうございました。


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

Name: non  ..熟練のプログラマー(60,954ポイント)   Date: 2009/08/19(水) 20:33   No:38224     
Title: Re:関数が仕事していない?    
>コピーのpを処理していた関数の場合、その処理されたpはどういう状態に
なっているんでしょうか?

関数が終わったときに、変数は解放されます。したがって、returnなどで返さない限りは
呼び出した側では使えません。


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

Name: uwlover  ..かけだし(1,557ポイント)   Date: 2009/08/19(水) 20:35   No:38225     
Title: Re:関数が仕事していない?    
>コピーのpはコピー先の関数内でない、

一体何を言ってるんだか…コピーのpはコピー先の関数内でしか有効でない、ということです。


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



Name: chocomilk  ..ぴよぴよ(42ポイント)   Date: 2009/08/19(水) 15:46   No:38207       
Title: テキストを読み込んで・・・    
こんにちは。C言語で、data.txtを読み込んでから作業したいのですが、教えてほしいことがあります。

そのテキストの内容は、

00,003131003115,1
01,001205003009,0
02,・・・




のようになっており、各行最初の値は番号です。私は、カンマで区切られた各行のまんなかの値(12桁)を、6桁、6桁に分けて表示したいと思っていますが、方法がわからず困っています。どのようにすれば良いか教えてください。よろしくお願いします。


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


Name: kazuoni [URL]  ..比類無きプログラマー(99,025ポイント)   Date: 2009/08/19(水) 16:35   No:38208     
Title: Re:テキストを読み込んで・・・    
データをどのように読み込んでいるか、コードを挙げてもらうと、
よりよい回答が得られるかと思います。


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

Name: non  ..熟練のプログラマー(60,799ポイント)   Date: 2009/08/19(水) 16:36   No:38209     
Title: Re:テキストを読み込んで・・・    
文字数が決まっているのなら、こんなんでどうでしょう。

while(fgets(str,80,fp)!=NULL){
strncpy(s1,str+3,6);
strncpy(s2,str+9,6);
printf("%s %s\n",s1,s2);
}



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

Name: chocomilk  ..ぴよぴよ(124ポイント)   Date: 2009/08/19(水) 17:07   No:38211     
Title: Re:テキストを読み込んで・・・    
すみません、せっかく書いていただいたのですが、使い方が良く分かりません・・

真ん中の数値(12桁)を、6桁、6桁に分けたあと、足し算するようにしたいのですが。

できますでしょうか。


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

Name: バグ  ..ハッカー(168,079ポイント)   Date: 2009/08/19(水) 17:18   No:38212     
Title: Re:テキストを読み込んで・・・    
できますよ。

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

Name: non  ..熟練のプログラマー(60,824ポイント)   Date: 2009/08/19(水) 17:23   No:38213     
Title: Re:テキストを読み込んで・・・    
足したいなら、
atoi(s1)+atoi(s2)
ですか。


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



Name: trx  ..かけだし(1,272ポイント)   Date: 2009/08/17(月) 05:36   No:38138       
Title: キーを押したときだけに    
単純なことだと思いますが、if文で、キーを押した時の、一度だけ、if文内の文が、実行される用にするにはどうすればよいでしょうか?
今現在あるプログラムだとキーを押しっぱなしにすると何度も文が実行されてしまいます。
BorlandとDxLib、をWindows XP で使っています。


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


Name: 初級者  ..初心者(6,519ポイント)   Date: 2009/08/17(月) 05:50   No:38139     
Title: Re:キーを押したときだけに    
今現在あるプログラムというものを見せてください。


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

Name: Libra  ..中級者(9,189ポイント)   Date: 2009/08/17(月) 06:07   No:38140     
Title: Re:キーを押したときだけに    
GetHitKeyStateAll関数を使ったときの、引数の配列の値は
キーが押されているとき1、押されてない時0が入ります

GetHitKeyStateAll_2関数をつかうとよいでしょう
ゲームプログラムの館の該当項目
http://dixq.net/g/#40


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

Name: trx  ..かけだし(1,244ポイント)   Date: 2009/08/18(火) 04:54   No:38179     
Title: Re:キーを押したときだけに    
GetHitKeyStateAll_2関数を使いながらもKeyBufを使う方法は在りますか?

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

Name: Libra  ..中級者(9,381ポイント)   Date: 2009/08/18(火) 05:33   No:38180     
Title: Re:キーを押したときだけに    
trxさんのソースの中にあるGetHitKeyStateAll関数を
GetHitKeyStateAll_2に書き換えるだけでよいはずです。
KeyBufの配列の値が連続でキーを押していた値になります。
実際の動作は試してください。


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

Name: trx  ..入門者(3,636ポイント)   Date: 2009/08/18(火) 06:29   No:38181     
Title: Re:キーを押したときだけに    
KeyBufをKeyに変えたのしか動きませんでした。

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

Name: kazuoni [URL]  ..比類無きプログラマー(98,535ポイント)   Date: 2009/08/18(火) 09:15   No:38183     
Title: Re:キーを押したときだけに    
× GetHitKeyStateAll_2( Key )

〇 GetHitKeyStateAll_2( KeyBuf )


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

Name: trx  ..かけだし(1,262ポイント)   Date: 2009/08/18(火) 12:45   No:38188     
Title: Re:キーを押したときだけに    
131行目の事ですか?
直しても動きません


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

Name: non  ..熟練のプログラマー(60,599ポイント)   Date: 2009/08/18(火) 17:06   No:38190     
Title: Re:キーを押したときだけに    
int KeyBuf[ 256 ] ;とint Key[256];がありますが、
おのおのの使用目的は何ですか?


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

Name: kazuoni [URL]  ..比類無きプログラマー(98,787ポイント)   Date: 2009/08/18(火) 17:28   No:38191     
Title: Re:キーを押したときだけに    
恐らくですけど、そのような仕様だからじゃないでしょうか?
例えば、
KeyBuf[ KEY_INPUT_X ]  == 1 && KeyBuf[ KEY_INPUT_SPACE ] == 1


ですが、キー監査では、押されていたらKeyBufの該当する要素をインクリメントします。
なので、完全に同じタイミングでないと、両要素とも1にできません。
大きく修正をしたくないならば、キー監査をGetHitKeyStateAll()に戻したほうがよいかと。

どれぐらいの間隔で音を鳴らしたいのか分からないですけど、
「音が鳴りやむまでは次の音を鳴らしたくない」
ならば、キー監査をCheckSoundMemの戻り値で実効するか否かを条件分岐してください。
ただこれだと、DrawGraphが一回しか通らないので、画像は一瞬で消えます。
なので自作再生関数を作成してください。音が鳴っている間は再生を行わないが目的です。
こんな感じで。
void MyPlaySoundMem(int SHandle)

{
if(!CheckSoundMem( SHandle ))
PlaySoundMem( SHandle, DX_PLAYTYPE_BACK );
}


#自分もnonさんと同じことを思っていました。。なんでキー監査用配列が二ついるのかと。
一番最後にアップしたコードは一つに統一されてますが・・・
if文では未だにKey[]が使用されています。
もっといってしまえば、ProcessMessage()も1ループに一回でいいと思いますが・・・。


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

Name: non  ..熟練のプログラマー(60,677ポイント)   Date: 2009/08/18(火) 17:58   No:38192     
Title: Re:キーを押したときだけに    
そ〜ですか。Xとスペースを同時に押したとき一度だけならこうすればいいのでは?
if( (KeyBuf[ KEY_INPUT_X ] == 1 && KeyBuf[ KEY_INPUT_SPACE ] > 0) || (KeyBuf[ KEY_INPUT_X ] > 0 && KeyBuf[ KEY_INPUT_SPACE ] == 1)){



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

Name: kazuoni [URL]  ..比類無きプログラマー(98,829ポイント)   Date: 2009/08/18(火) 19:53   No:38194     
Title: Re:キーを押したときだけに    
あ、nonさんのほうが分かりやすいですね^^;
しかも、すべて毎ループ音なりの監査をすると、音ゲーではあってはならない
処理落ちが出る可能性もありますし・・・。
修正にかかる時間は・・・同じぐらいですかね。

#根本的に監査の方法を見直っ(ry


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

Name: trx  ..かけだし(1,658ポイント)   Date: 2009/08/19(水) 03:12   No:38200     
Title: Re:キーを押したときだけに    
nonさん、kazuoniさん、回答ありがとうございます。
まずは、nonさんの質問に答えたいと思います。
このプログラムは、電子ピアノプログラムです。
ですので、kazuoniさんが、仰ていた、
音が鳴っている間は再生を行わないが目的です。
と言うのの反対です。
それと、お二人の回答を元にして、試してみたのですが、nonさんのやり方だと一瞬しかDrawGraphが出てきませんし音は鳴りません。kazuoniさんのやり方だと音もDrawGraphすら出てきません。



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

Name: Libra  ..中級者(9,693ポイント)   Date: 2009/08/19(水) 04:06   No:38201     
Title: Re:キーを押したときだけに    
>それと、お二人の回答を元にして、試してみたのですが、nonさんのやり方だと一瞬しかDrawGraphが出てきませんし音は鳴りません。kazuoniさんのやり方だと音もDrawGraphすら出てきません。

キーを押した時の音を再生する処理と画像を出す処理を一緒にしているからだと思います。
音は一回再生されれば、止まるまでそのままですが、画像は押した瞬間1フレームしか描画されません。




描画部分と、キーの音の処理を関数で分けて別に処理した方がいいと思います。

自分であればこうします
・キーが押された時判定
・押されたキーに対応する音が鳴っているかを判定
   音が鳴っていない→そのまま音再生
   音が鳴っている→音を停止し、改めて音再生

・別にフラグ変数を用意し、音が鳴った瞬間にフラグを立て、
 以降、音が止まるまで音が鳴っているか監査する
・上記フラグが立っているとき、画像を表示←鳴らした音に関してのみ音の監査を行う



工夫としては、○個以上音が鳴っているとき、それ以上鍵盤を押しても音が鳴らせない、
等をするとkazuoniさんの指摘した処理落ち対策にもなると思います。


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

Name: kazuoni [URL]  ..比類無きプログラマー(98,979ポイント)   Date: 2009/08/19(水) 09:45   No:38204     
Title: Re:キーを押したときだけに    
nonさんは、「なぜキー監査を二つの異なる配列によって監査しているのか?それぞれの用途は?」
が聞きたいことかと思いますが・・・^^;

>音が鳴っている間は再生を行わないが目的です。
>と言うのの反対です。

揚げ足取りになりそうなんですが・・・
反対ということは、(厳密には「裏」といいます。たぶん高校で習うor習ったと思いますが・・・)
「音が鳴っている間は再生を行う」
ならば、元のやつでいいのでは?となってしまいますが^^;

恐らく、ピアノのように、鍵盤は長押ししても、音は初めしかならないって話ですよね^^;
基本的にはLibraさんの提案しているように、
構造を見直したほうが一番かもしれないです。
ただ、電子ピアノは、鍵盤を指から離すまで音がなってるモードもあれば、
グランドピアノのように、デクレッシェンドがかかるモードもあり、
それによって再生方法が変わるので、どうすればいいかは、一概には言えないかと思いますが、
大まかにはLibraさんの方法で大丈夫かと思います。


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



Name: ひっさん  ..かけだし(1,054ポイント)   Date: 2009/08/16(日) 21:07   No:38130       
Title: 敵と弾が止まってしまいます。    
シューティングゲームの館のほうのプログラムをもとに、シューティングゲームを作る練習をしています。

ショットを撃っている敵を倒すと、その後も弾を撃ち続けてしまうのを直そうとしているのですが、うまくいきません。
正確には、弾を撃ち続けるのは直ったのですが、弾と敵が数秒間停止してしまうようになりました。
プレイヤーは動くこともショットを撃つこともできるので、処理が追いついていないわけではなさそうです。

コードを書くとぐちゃぐちゃになってしまうので、
http://hissantwokomi.hp.infoseek.co.jp/shoot.zip
にプロジェクトをアップしました。

コンパイラはVC++2008EEです。

ご指導お願いします。


追記:
作りかけのプレイヤーHPゲージが変な位置に表示されていたり、コンティニュー画面が未完成だったりしますが、そこは気にしないでください。
よろしくお願いします。


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


Name: pooka [URL]  ..中級者(13,421ポイント)   Date: 2009/08/17(月) 16:47   No:38158     
Title: Re:敵と弾が止まってしまいます。    
例えばenemy_shot.cppのEnemyShotPattern2を見ると

if(enemy[EnemyShot[i].E_no].flag==0)
    break;

のようになっていますが、これを以下のようにしてみてください。

void EnemyShotPattern2(int i){
    for(int j=0;j<10;j++){
        if(enemy[EnemyShot[i].E_no].flag==1){
            if(EnemyShot[i].counter==20*j){
                EnemyShot[i].EnemyShots[j].flag=1;
                EnemyShot[i].EnemyShots[j].x=EnemyShot[i].mem_ex;
                EnemyShot[i].EnemyShots[j].y=EnemyShot[i].mem_ey;
                EnemyShot[i].EnemyShots[0].angle = atan2(EnemyShot[i].mem_py-EnemyShot[i].mem_ey,EnemyShot[i].mem_px-EnemyShot[i].mem_ex);
                StopSoundMem(sound_enemy_shot[0]);
                PlaySoundMem(sound_enemy_shot[0],DX_PLAYTYPE_BACK);
            }
        }
        EnemyShot[i].EnemyShots[j].x+=PATTERN1SPEED*cos(EnemyShot[i].EnemyShots[0].angle);
        EnemyShot[i].EnemyShots[j].y+=PATTERN1SPEED*sin(EnemyShot[i].EnemyShots[0].angle);
    }
}

これで止まらないようになると思います。
EnemyShotPattern3以降も変更してみてください。


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

Name: ひっさん  ..かけだし(1,171ポイント)   Date: 2009/08/17(月) 21:18   No:38166     
Title: Re:敵と弾が止まってしまいます。    
回答ありがとうございます。大分解決しました。

if(enemy[EnemyShot[i].E_no].flag==0)
break;

の部分を全て

if(enemy[EnemyShot[i].E_no].flag==1){

}

に変えました。

一時停止してしまうことはなくなりました。

しかし、新たに問題が発生しました。
一時停止することはなくなりましたが、パターン9(乱数ショット)の代わりに数秒間をおいて(もう敵はいないのに)再び弾を撃ちだしてしまうようになりました。

http://hissantwokomi.hp.infoseek.co.jp/shoot.zip
にプロジェクトをアップしなおしましたので、よろしくお願いします。


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

Name: pooka [URL]  ..中級者(14,293ポイント)   Date: 2009/08/17(月) 23:50   No:38173     
Title: Re:敵と弾が止まってしまいます。    
EnemyShot[i].counterを利用することで解決できるかもしれません。(220という値は適宜変更してください)

void EnemyShotPattern9(int i){
    if(enemy[EnemyShot[i].E_no].flag==1 && EnemyShot[i].counter <220){
        for(int j=0;j<120;j++){    
            if(EnemyShot[i].counter==2*j){
                EnemyShot[i].EnemyShots[j].x=EnemyShot[i].mem_ex;
                EnemyShot[i].EnemyShots[j].y=EnemyShot[i].mem_ey;
                EnemyShot[i].EnemyShots[j].flag=1;
                EnemyShot[i].EnemyShots[j].angle = atan2(Player.y-EnemyShot[i].mem_ey,Player.x-EnemyShot[i].mem_ex)+(double)GetRand(1500)/1000.0f-0.75f;
                StopSoundMem(sound_enemy_shot[0]);
                PlaySoundMem(sound_enemy_shot[0],DX_PLAYTYPE_BACK);
            }
        }
    }
    for(int j=0;j<200;j++){
        EnemyShot[i].EnemyShots[j].x+=PATTERN1SPEED*cos(EnemyShot[i].EnemyShots[j].angle);
        EnemyShot[i].EnemyShots[j].y+=PATTERN1SPEED*sin(EnemyShot[i].EnemyShots[j].angle);
    }
}


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

Name: ひっさん  ..かけだし(1,408ポイント)   Date: 2009/08/18(火) 20:45   No:38197 解決!     
Title: Re:敵と弾が止まってしまいます。    
EnemyShot[i].counterを使ってもまだ完全には直らなかったのでいろいろいじくってみたところ、わかったことがありました。
消えた敵が弾を撃ちだしてしまうのは次の敵が出てきた瞬間からだ、ということです。
敵の出現タイミングをいじるとどのパターンでも同じ現象が発生しましたので、間違いありません。
原因は、次の敵が出てくるときに変数iが書き換えられていたことだったようです。

どうも根本からひっくり返ってしまったので、シューティングゲームの館をもとに自分で考えるのは一旦あきらめて、龍神録プログラミングの館を見て勉強しなおそうと思います。


ここまでご指導いただき、ありがとうございました。


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



Name: xyz  ..ぴよぴよ(822ポイント)   Date: 2009/08/16(日) 17:34   No:38119       
Title: p1. 物体の速さと〜の表記ミス?    
毎度お世話になっております。
表記ミスらしきものを見つけたので報告させていただきます。

『ここはわからなくてイイ』というところで

画像のキャラの身長が26ピクセルですから「1メートルはモニタでいう50ピクセル」を実現するためには
このキャラクタの身長が実際にリアル世界にいると170cm=1.7mだとすると
50 : 1 = ? : 1.7
(100ピクセルで1メートルなら何ピクセルで1.7メートル?)
を計算すると、?は85ピクセルであることがわかります。

とありますが、解を85とすると、50ピクセルで1メートルですよね?

それと『ここはわからなくてイイ』の少し上で

image[count%60/20+6]というのは、
まず、imgae[6] , [7] , [8]が右向きの画像であることと

とありますが、右向きの画像は16分割で一章で与えられた画像を使うと
13、14、15でコードはimage[count%60/20+13]じゃないでしょうか?
これはおそらく管理人様が『39. αブレンド(その2)』で用いられた画像を
利用なさったからだと思いますが、切り分け方が16,4,4なので
初めに保存したもので考えたほうがいいかと思います。
あとコードの
DrawRotaGraph( ch_x , 240 , 3.15 , 0.0 , image[count%60/20+6] , TRUE ) ;//6.3倍で描画
はコメントの倍率が間違っていませんか?

毎度ながら長文失礼しました。


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


Name: Dixq (管理人) [URL]  ..ウィザード(1,048,225ポイント)   Date: 2009/08/18(火) 20:22   No:38195     
Title: Re:p1. 物体の速さと〜の表記ミス?    
お返事遅くなりました。
ご報告ありがとうございます。

それにしても自分で言うのも何ですが、、何と言う国語力の無い文章orz
私はもともと国語力が低い上に、HPを作るときは大抵いっきに徹夜で作るのでHPのあっちこっちに変な文章あるんですよね;
いつか全体をもう一度直したいと思いながらも量が多いのでいつも後回しになっています・・。


image画像の件ですが、正しくは

image[count%60/15+12]

でした。以前ゲームプログラミングの館では、16枚のキャラ画ではなく、12枚のキャラ画で紹介していたんですね。
ですので、昔のコードのままになってしまっていたようです。
修正させていただきました。

重なりますが、ご報告ありがとうございました。


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



Name: クロウ  ..中級者(11,665ポイント)   Date: 2009/08/17(月) 22:21   No:38168       
Title: 敵の弾がだんだん遅くなります。。。    
外部データで敵の出現をコントロールできるようになりましたが、今度は
「敵の数で弾の速度が変わる」という現象が起きています。
この弾の速度は敵の数が多いと弾の移動速度が速くなり、敵の数が減るに従って、fpsとは関係なく速度が遅くなってしまいます。

いろいろ探ってみましたが、原因不明で何が悪いのかわかりませんでした。

どこが悪いのか、どうすれば直るのかアドバイスをお願いします。


実際に挙動がどうなっているのか見てほしいのでプロジェクトごと挙げておきました。

http://down11.ddo.jp/uploader/download/1250514460.zip/attatch
パスワードはcrowです。

ソースファイルの内容は以下のようになっています
*mymain.cpp:ゲームのメイン部分
*myhelper.cpp:めんどくさい計算をする関数が書いてある部分
*enemyMain.cpp:敵の行動をまとめる部分
*enemy_1〜4.cpp:それぞれの敵の行動が書いてある部分
(1:動かないで一直線の弾を吐く、2:未実装、3:全方位弾を吐くボス、4:プレイヤーに向かって弾を吐く敵)


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


Name: Justy  ..伝説なるハッカー(405,557ポイント)   Date: 2009/08/17(月) 23:27   No:38172     
Title: Re:敵の弾がだんだん遅くなります。。。    

>敵の数が減るに従って、fpsとは関係なく速度が遅くなってしまいます

 DrawBullet_X系の関数ってそれぞれが全ての弾の移動と表示を担当していると
思うのですが、この関数呼ばれすぎ、もしくは処理が不足しているのではないでしょうか?

 本来は1フレームに1回だけ移動と描画を行うようになっているのが普通ですが、
今の構造ですと、敵の数分だけこれらの関数が呼ばれているような気がします。

 例えば、1と4のパターンの敵の2匹だけがいて g_ebullets[0].usedが TRUEのとき、
g_ebullets[0].bpos.positionは1フレームに DrawBullet_1と DrawBullet_4の2回で
移動が行われる、というふうに。


 つまり敵がいればいるほど、全ての弾における移動と描画を繰り返すことになるので、
移動速度も速くなり(目に見えないけど描画負荷も上がっている)と思われます。

 敵が減れば1フレームの移動が回数が減るので、遅くなる……というより
本来指定した通りの移動速度に戻っているのではないでしょうか。


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

Name: クロウ  ..中級者(11,822ポイント)   Date: 2009/08/18(火) 13:16   No:38189     
Title: Re:敵の弾がだんだん遅くなります。。。    
>Justyさん
つまり、敵が多いときが異常であって、敵が減ってくるに従って正常な挙動に戻っていくということですか?

・・・ということは、弾の構造体にどのタイプの敵から発射したかというインデックスを付けてそれぞれのDrawBullet_Xではそのインデックスが付いているモノのみを処理するようにすればいいのかなぁ・・・・。

アドバイスを参考に修正してみます。



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

Name: クロウ  ..中級者(11,869ポイント)   Date: 2009/08/18(火) 17:58   No:38193 解決!     
Title: Re:敵の弾がだんだん遅くなります。。。    
うまく修正できました。
ありがとうございました。

やはり、関数を呼んでいる場所が問題だったようです。


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



Name: 素人A  ..ぴよぴよ(388ポイント)   Date: 2009/08/17(月) 23:14   No:38170       
Title: 龍神録プログラミングの館 17章    
[1] 質問文
 はじめまして、素人Aと申します。
 初心者すぎて質問していいのか悩んだのですが助けてください。
 17章の「自機にショットをうたせてみよう」が実行できずに困っています。
 //ショット登録部に記述されている、「ch.shot_cntが宣言されていません」 とエラーになります。
 とりあえず構造体ch_tにshot_cntの宣言を追加してビルドすると、エラーにならずに実行されるのですが、
 自機ショットの音は出るけど弾が表示されません。
 コピーしながら16章までは実行できました。
二日間悩んだのですが行き詰りました。
 @ch.shot_cntの宣言する場所。
 A自機の弾の画像が表示されない。
 B他に完成版のソースを見れるところはあるのでしょうか?
 以上の三つです。ご教授お願いします。

[2] 環境  
  OS : Windows Xp sp3
  コンパイラ名 : VC++ 2008EE
[3] その他
 ・どの程度C言語を理解しているか: 始めて1週間程の初心者です。
 ・ライブラリを使っている場合は何を使っているか:DXライブラリ



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


Name: yu  ..プログラマー(37,618ポイント)   Date: 2009/08/18(火) 09:36   No:38184     
Title: Re:龍神録プログラミングの館 17章    
> 1 ch.shot_cntの宣言する場所。
> 2 自機の弾の画像が表示されない。
> 3 他に完成版のソースを見れるところはあるのでしょうか?

1. 合っていると思います

2. ソースを見てみないと詳しい原因は分かりませんが...
  音は鳴るんですね。では弾のグラフィックはロードできていますか?

3. 館の方の各章のソースでしたら下記URLからダウンロードできますよ
  http://dixq.net/rp/zip/project.zip


見比べてみても分かりませんでしたらソースを見せてください


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

Name: 素人A  ..ぴよぴよ(580ポイント)   Date: 2009/08/18(火) 11:45   No:38187 解決!     
Title: Re:龍神録プログラミングの館 17章    
お返事ありがとうございます。
原因がわかりました。
教えていただいた完成版のソースと見比べた結果、館の17章と記述が異なっていました。
完成版は以下のとおりですが、
img_cshot[0]=LoadGraph("../dat/img/char/bl_00.png");
img_cshot[1]=LoadGraph("../dat/img/char/bl_01.png");

館の17章では、
---- load.cpp の load()関数に以下を追加 ----

img_cshot[0]=LoadGraph("dat/img/char/bl_00.png");
img_cshot[1]=LoadGraph("dat/img/char/bl_01.png");

と、なっていました。
弾の画像を読み込めていなかったようです。
修正して実行したら弾の画像がでるようになりました。

これで先へ進めます。大変感謝しております。
ありがとうございました。


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



Name: mint  ..ぴよぴよ(316ポイント)   Date: 2009/08/18(火) 02:41   No:38178       
Title: データを読み込んで計算したいのです    
こんにちは。ホントにプログラム初心者なのですが、急きょ、次のようなプログラムを作らないといけません。助けてください!


データ(data.txt)の内容が、
001,500,40
002,300,40
003,300,20
004,・・・

となっているデータを読み込んで、(この内容は、1列目が点の番号で、2列目がX座標、3列目がY座標となっています)この点どうしの距離をそれぞれ求めたいのです。点は、100まであります。出力は、
001-002=200
001-003=・・


99-100=・・
のようにしたいのですが、プログラム例を示して頂けるとありがたいです。よろしくお願い致します!!




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


Name: バグ  ..ハッカー(168,071ポイント)   Date: 2009/08/18(火) 08:19   No:38182     
Title: Re:データを読み込んで計算したいのです    
せめて、開発環境と開発言語くらいはお願いします。

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

Name: non  ..熟練のプログラマー(60,570ポイント)   Date: 2009/08/18(火) 10:50   No:38186     
Title: Re:データを読み込んで計算したいのです    
とりあえず、ファイルの読み込み部分のみ掲載。
あとは、距離を求めるのですが、求めた値をどうするかによって
作り方が違うような気がするので。ご自分でどうぞ。

#include <stdio.h>
typedef struct {
int no;
int x;
int y;
}DATA;
int main(void)
{
FILE *fp;
DATA data[100];
int i;
if((fp=fopen("data.txt","r"))==NULL){
printf("File Open ERROR!");
return -1;
}
i=0;
while(fscanf(fp,"%d,%d,%d",&data[i].no,&data[i].x,&data[i].y)!=EOF){
printf("%d %03d %d %d\n",i,data[i].no,data[i].x,data[i].y);
i++;
}
fclose(fp);
return 0;
}



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



Name: 山崎  ..上級者(24,050ポイント)   Date: 2009/08/18(火) 00:07   No:38174       
Title: 配列宣言時の要素数の指定について    
毎度お世話になっております、山崎です。
今回は、配列を宣言した時の要素数や、関数の引数に配列を渡すときなどについて質問に参りました。
XPでVisual Stadio2008を使っております。

現在、他人からもらったC言語のプログラムを読み解いています(ゲームとは関係ないのですが)。
その人が言うにはちゃんと動くらしいのですが、私のパソコンでビルドしてもエラーが発生します。
もらったのは.cppではなく.cのファイルをひとつです。
コードを見ると、不思議な配列の宣言のやり方をしていて、私にはどうも理解できません。
その人が作ったプログラムをそのままここにコードを貼る訳には行かないので全てはコピーペーストできませんが、
エラーの起きている行をいくつか挙げてみます。

void func(int a, int pal1[a],float pal2[a],float pal3[a]);
これは関数プロトタイプで、ファイルの最後にこの関数の動作の定義があります。
もちろんaは定数ではありません、この行で初登場です。
引数として配列を渡しているように見えますが、[]内に変数を持ってきて、そんな配列を引数にできるんでしょうか?
「定数式が必要」「サイズが0の配列を割り当てまたは宣言しようとしました」というエラーが出ます。

int Val1[CONST][count+1][5];
CONSTは定数で既に数値として定義されています。countはint型の変数として事前に宣言されています。
int型の3次元配列を宣言しているように見えますが、宣言時には[]内には変数は持ってこれないのでは?
と首を傾げています。
「定数式が必要」「サイズが0の配列を割り当てまたは宣言しようとしました」「添え字がありません」
といったエラーが出ます。

int Val2[(x+1)*(x+1)*CONST][5];
CONSTは定数で既に数値として定義されています。xはint型の変数として事前に宣言されています。
これはint型の2次元配列を宣言しようとしているように見えるのですが、
これも[]内に数式があります。こんなことはできましたっけか…。
「サイズが不明」というエラーが出ています。

なにぶん他人の作ったプログラムなのでそのまま載せられず、前後関係がつかめずわかりにくいとは思いますが…。
これらの行でエラーになるのは当然なのではないだろうかと思うのですが、
これらのコードでもちゃんと実行できることがあるのでしょうか?
VisualStadio以外の特殊な環境や特殊なコンパイラを使えば実行できる、など…。


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


Name: Justy  ..伝説なるハッカー(406,142ポイント)   Date: 2009/08/18(火) 00:59   No:38175     
Title: Re:配列宣言時の要素数の指定について    

>これらのコードでもちゃんと実行できることがあるのでしょうか

 今の Visual C++では出来ませんが、最新の Cの仕様(C99)を満たした
コンパイラなら一応可能です。

プログラミング言語 C の新機能
ttp://seclan.dll.jp/c99d/c99d00.htm


 試しに a.cとしてサンプルを書いて gcc4.2.1でコンパイルしてみました。

#include<stdio.h>

#define CONST 5
int func(int a, int pal1[a],float pal2[a],float pal3[a]);
int main(void)
{
    int count;
    printf("input count > ");
    if(scanf("%d", &count) == 1 && count >= 0)
    {
        int Val1[CONST][count+1][5];
        for(int i=0; i<CONST; ++i)
        {
            for(int j=0; j<count+1; ++j)
            {
                for(int k=0; k<5; ++k)
                    Val1[i][j][k] = i + j + k;
            }
        }
        
        int p[count];
        float f1[count], f2[count];
        printf("count + 1 = %d\n", func(count, p, f1, f2));
    }
    else
        printf("error\n");
    return 0;
}

int func(int a, int pal1[a],float pal2[a],float pal3[a])
{
    return a + 1;
}


 gccのオプションに -std=c99をつける必要はありますが、問題なくコンパイルは通りました。

 もちろん、実行もできました。

input count > 89
count + 1 = 90



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

Name: たかぎ [URL]  ..ハッカー(110,381ポイント)   Date: 2009/08/18(火) 01:09   No:38176     
Title: Re:配列宣言時の要素数の指定について    
> gccのオプションに -std=c99をつける必要はありますが、問題なくコンパイルは通りました。

それは for で宣言しているからです。
GCCはもともと可変長配列を独自拡張としてサポートしています(標準規格がそれに追従したのですから)。
ですので、特にオプションを指定しなくても可変長配列を使えます。ただし、自動記憶域期間を持つ配列の場合だけです。


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

Name: Justy  ..伝説なるハッカー(406,243ポイント)   Date: 2009/08/18(火) 01:18   No:38177     
Title: Re:配列宣言時の要素数の指定について    

>GCCはもともと可変長配列を独自拡張としてサポートしています

 あ、たしかにそうですね、忘れてました。
 -pedanticもつけてあげればいいですかね?


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

Name: 山崎  ..上級者(24,201ポイント)   Date: 2009/08/18(火) 10:28   No:38185 解決!     
Title: Re:配列宣言時の要素数の指定について    
Justyさん、たかぎさん
ご返信、誠にありがとうございます!
gccでコンパイルしたところ、見事に実行ファイルを作ることができました。

しかし、コンパイラの違いでこんなことができてしまうなんて驚きです。
コンパイラの違いなんて、せいぜい警告が出るか出ないかくらいだと思っておりました。
非常に勉強になりました。
…VisualStudioでもできるようになればいいんですけどなぁ…。

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


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



Name: レイ  ..ぴよぴよ(902ポイント)   Date: 2009/08/17(月) 21:33   No:38167       
Title: DirectX解説本について    
ダンジョンゲームを作るために
http://www.amazon.co.jp/%E3%83%80%E3%83%B3%E3%82%B8%E3%83%A7%E3%83%B3%E3%82%B2%E3%83%BC%E3%83%A0%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0-%E6%A3%AE%E5%B1%B1-%E5%BC%98%E6%A8%B9/dp/4797346280/ref=sr_1_12?ie=UTF8&s=books&qid=1250512103&sr=1-12

の本を買おうか迷っております。
ご存知の方がおりましたらご感想を聞きたいです。

またこの本はDXライブラリなどを使っての開発なのでしょうか?


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


Name: Justy  ..伝説なるハッカー(405,250ポイント)   Date: 2009/08/17(月) 22:40   No:38169     
Title: Re:DirectX解説本について    
 持ってもいないですし、読んだこともないのですが、

>この本はDXライブラリなどを使っての開発なのでしょうか?

 表紙の帯には Visual C++ & DirectXと描かれているので違うようですね。


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

Name: conio [URL]  ..プログラマー(39,294ポイント)   Date: 2009/08/17(月) 23:20   No:38171     
Title: Re:DirectX解説本について    

あ、その本持ってますよ。
DXライブラリではなく、DirectXでの開発になります。

初めの方は
●クラス等を用いたC++での設計 (コンソールアプリケーション)

で、途中からは
●DirectX導入。 基本的なルーチンはいじらず、描画の部分だけ差し替えて行く

こんな感じでした。


で、完成するゲームなのですが、
例えばアイテムを取得する処理の場合は
---------------------------------------
@アイテムが落ちている場所まで行く
A'G'キーを押す
B"お薬を拾いますか?"と表示される
C'A'キーを押す
D"お薬を手に入れた"と表示される
---------------------------------------
みたいに、ちょっと処理が煩雑。

敵への攻撃の仕方は「'→'を押した時、右に敵がいたら攻撃したことにする」
みたいな仕様になってます。

そして、マップは'右'を押したとすると、一瞬で画面が【1】から【2】へ遷移します。
(【1】〜【2】へ移動するまでの、なめらかなアニメーションが無い)

【1】
■■■■■
■主  ■
■   ■
■■ ■■

【2】
■■■■
 主 ■
   ■
■ ■■


自分は、
----------------------------------------------
●アイテムを踏んだら自動的に入手した事にする
●攻撃コマンドを入力したら攻撃
●マップはなめらかに移動する
----------------------------------------------
という風にしたかったので、細かい仕様などはあまり参考になりませんでした。

自分が参考にしたのは、下記の様な大まかな考え方の部分だけだったりします。

「ランダムなダンジョンの生成」
「AIの作り方」
「クラスの構築の仕方」
「外部ファイルから、固定マップの読み込み」


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



Name:  ..入門者(3,000ポイント)   Date: 2009/08/16(日) 17:41   No:38121       
Title: VC,netでRedo機能の追加    
度々、質問失礼します。
以前ここの方に回答いただきテキストボックスのUNDO機能の実装ができました。
それから色々やってみたのですがREDO機能ができないです。
Stack型を2種類作って〜みたいにやるらしいのですが
どなたか教えてはいただけないでしょうか?

ttp://d.hatena.ne.jp/Youchan/20081111/1226388917
ttp://www.sunny-grove.net/articles/undoable.html


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


Name: バグ  ..ハッカー(165,842ポイント)   Date: 2009/08/16(日) 18:00   No:38122     
Title: Re:VC,netでRedo機能の追加    
後入れ先出しのStackでは難しいでしょうね。
単純な配列かListで管理すべきでしょう。


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

Name:  ..入門者(3,043ポイント)   Date: 2009/08/16(日) 18:39   No:38124     
Title: Re:VC,netでRedo機能の追加    
>>バグs
Stackではできないのでしょうか?
また配列でやる場合にはどのようにすればよいでしょうか?


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

Name: バグ  ..ハッカー(166,215ポイント)   Date: 2009/08/16(日) 18:59   No:38125     
Title: Re:VC,netでRedo機能の追加    
すみません、前言撤回。
UNDO用のStackとREDO用のStackを2つ用意すればいけますね。
しかも、かなり簡単に。

REDO用のStackへTextBoxのTextを格納してから、UNDOの処理を行えばいいだけでしたね。
Stackの動きは下記を参照ください。




※UNDO用Stackの動き
TextBox UNDO用Stack
A
AB A
ABC AB, A
ABCD ABC, AB, A
ABCDE ABCD, ABC, AB, A



※UNDO操作を行った場合のStackの動き
TextBox UNDO用Stack REDO用Stack
ABCDE ABCD, ABC, AB, A
ABCD ABC, AB, A ABCDE
ABC AB, A ABCD, ABCDE
AB A ABC, ABCD, ABCDE
A AB, ABC, ABCD, ABCDE


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

Name: バグ  ..ハッカー(166,385ポイント)   Date: 2009/08/16(日) 19:02   No:38126     
Title: Re:VC,netでRedo機能の追加    
追記


※REDO操作を行った場合のStackの動き
TextBox UNDO用Stack REDO用Stack
A AB, ABC, ABCD, ABCDE
AB A ABC, ABCD, ABCDE
ABC AB, A ABCD, ABCDE
ABCD ABC, AB, A ABCDE
ABCDE ABCD, ABC, AB, A


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

Name:  ..入門者(3,046ポイント)   Date: 2009/08/16(日) 19:05   No:38127     
Title: Re:VC,netでRedo機能の追加    
>>バグs
原理は理解したのですが書き方がわかりません><
PopとPushがあるらしいのですがイマイチ理解できないです。


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

Name: バグ  ..ハッカー(166,633ポイント)   Date: 2009/08/16(日) 19:20   No:38128     
Title: Re:VC,netでRedo機能の追加    
方法が分からないならまだしも、書き方が分からないなら、入門サイトなりで文法を勉強するしかないのではないかと…。原理は理解したという事ですから、方法は分かっているようですしね。

このスレの冒頭であなたが載せてあるソースは以前私が書いたものですが、かなり細かくコメントを載せてあります。じっくり解読してみてください。そのコメントの内容以上に言える事はないです。UNDOとほとんど同じ方法でREDOも実装できます。

それから、Pushは要素の追加、Popは要素の取り出しです。

Stackでは必ず『後入れ先出し』となりますので、最後にPushで追加された要素がPopで取り出されます。そして、Popで取り出した要素はStackから削除されます。

ちなみにPeekというのもあります。PeekはStackから取り出さずに先頭要素を参照できます。


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

Name:  ..入門者(3,109ポイント)   Date: 2009/08/16(日) 22:07   No:38132     
Title: Re:VC,netでRedo機能の追加    
>>バグさん
理解したというより、どんなことをしているのかと
言うことしかわかっておりません。

どうかサンプルソースをかいてはいただけないでしょうか?


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

Name: バグ  ..ハッカー(166,843ポイント)   Date: 2009/08/17(月) 04:02   No:38137     
Title: Re:VC,netでRedo機能の追加    
どんな事をしているかが分かっているならば、書けると思いますよ?(^_^;)

考え方は既に書き込みましたし、書き方はUndoTextBoxのソースがそのままサンプルになると思います。

ここから先は、数学なんかでいう応用問題みたいなものですね。

自分が必要とする機能は、自分で考えて実装するようにしないと、いつもそのものズバリなサンプルが落ちているとは限りませんから…

今回は、ほぼ要求に近いサンプルがある事ですし、いきなり答えを求めずにそこから発展させる努力位はしてください。

そのうえでの、具体的に的を絞っての質問(こういう風に考えて、こう実装してみましたが、こう動くと思うのに、こういう風に動きます。どうしてでしょうか?…みたいな質問)なら、御答えできるかもしれません。

頑張って♪(・ω・)ノ


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

Name: バグ  ..ハッカー(168,058ポイント)   Date: 2009/08/17(月) 17:36   No:38160     
Title: Re:VC,netでRedo機能の追加    
分かり易い方法で書いてみました。
UNDO回数が無制限(メモリの許す限り)バージョンです。
回数制限したければ適当に修正してください。


#pragma once

public ref class UndoTextBox : public System::Windows::Forms::TextBox
{
private:
System::Collections::Generic::Stack<System::String^> m_redoStack;
System::Collections::Generic::Stack<System::String^> m_undoStack;
bool m_change;

public:
UndoTextBox(void)
{
InitializeComponent();

// メンバの初期化
init();
}

UndoTextBox(System::ComponentModel::IContainer ^container)
{
container->Add(this);
InitializeComponent();

// メンバの初期化
init();
}

protected:
~UndoTextBox()
{
if (components)
{
delete components;
}
}

virtual void OnTextChanged(System::EventArgs^ e) override
{
// フラグがtrueの場合は…
if (this->m_change == true)
{
// UNDOかREDOによってTEXTが変化したので、フラグをfalseにするだけで何もしない
this->m_change = false;
}
else
{
// REDO用Stackの中身を削除する
this->m_redoStack.Clear();

// UNDO用Stackへ最新のTEXTを挿入する
this->m_undoStack.Push(this->Text);
}
TextBox::OnTextChanged(e);
}

virtual void OnKeyDown(System::Windows::Forms::KeyEventArgs^ e) override
{
if (e->Control == true)
{
switch (e->KeyCode)
{
case System::Windows::Forms::Keys::A:
// 全選択
SelectAll();
return;
case System::Windows::Forms::Keys::Z:
// UNDO処理
undo();
return;
case System::Windows::Forms::Keys::Y:
// REDO処理
redo();
return;
}
}
TextBox::OnKeyDown(e);
}

private:
/// <sammary>
/// メンバの初期化
/// <sammary>
void init(void)
{
// Stackの中身を削除する
this->m_redoStack.Clear();
this->m_undoStack.Clear();

// UNDO用Stackの最初の要素として、空文字を挿入しておく
this->m_undoStack.Push(System::String::Empty);

// フラグをfalseで初期化
this->m_change = false;
}

/// <sammary>
/// UNDO
/// <sammary>
void undo(void)
{
// UNDO用のStackが空っぽでなければ…
if (this->m_undoStack.Count > 0)
{
// Stackの先頭要素がTextBox内のTEXTと同じの場合は…
if (this->m_undoStack.Peek() == this->Text)
{
// 一度だけ空読みして先頭要素を削除する
this->m_undoStack.Pop();
}

// UNDOによってTEXTが変化するのでフラグをTRUEにする
this->m_change = true;

// TextBox内のTEXTをREDO用Stackの先頭へ挿入する
this->m_redoStack.Push(this->Text);

// UNDO用のStackの先頭要素をTextBox内のTEXTへコピーする
this->Text = this->m_undoStack.Pop();
}
}

/// <sammary>
/// REDO
/// <sammary>
void redo(void)
{
// REDO用のStackが空っぽでなければ…
if (this->m_redoStack.Count > 0)
{
// REDOによってTEXTが変化するのでフラグをTRUEにする
this->m_change = true;

// TextBox内のTEXTをUNDO用Stackの先頭へ挿入する
this->m_undoStack.Push(this->Text);

// REDO用のStackの先頭要素をTextBox内のTEXTへコピーする
this->Text = this->m_redoStack.Pop();
}
}

private:
System::ComponentModel::Container ^components;

#pragma region Windows Form Designer generated code
void InitializeComponent(void)
{
components = gcnew System::ComponentModel::Container();
}
#pragma endregion
};


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

Name:  ..入門者(3,167ポイント)   Date: 2009/08/17(月) 20:59   No:38165     
Title: Re:VC,netでRedo機能の追加    
>>バグs
サンプルをありがとうございます。
丸投げではおっしゃる通り力になりませんのでこれを基に別のやり方でやってみます。
ご回答ありがとうございました。


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

Name:   Date: 2009/09/09(水) 23:04   No:381211252505068     
Title: Re:VC,netでRedo機能の追加    
if (this->m_redoStack.Count > 0)と書いているのに起動してからすぐに
Ctrl+ZをやるとUndoのスタックがEmptyとエラーが出てしまいます。
またUndo、Redo時にカーソルの位置が0番目になってしまうのですが前回の位置にと直せないでしょうか?

// カーソル操作
this->TextBox1.Focus()
this->TextBox1.Select(番目, 0)

でできるとわかったのですがどこに移動させればいいのかということと
このソースで作ったテキストボックスだと強制的に0番目にカーソルがあってしまいます。



#pragma once

public ref class UndoTextBox : public System::Windows::Forms::TextBox
{
private:
System::Collections::Generic::Stack<System::String^> m_redoStack;
System::Collections::Generic::Stack<System::String^> m_undoStack;
bool m_change;

public:
UndoTextBox(void)
{
InitializeComponent();

// メンバの初期化
init();
}

UndoTextBox(System::ComponentModel::IContainer ^container)
{
container->Add(this);
InitializeComponent();

// メンバの初期化
init();
}

protected:
~UndoTextBox()
{
if (components)
{
delete components;
}
}

virtual void OnTextChanged(System::EventArgs^ e) override
{
// フラグがtrueの場合は…
if (this->m_change == true)
{
// UNDOかREDOによってTEXTが変化したので、フラグをfalseにするだけで何もしない
this->m_change = false;
}
else
{
// REDO用Stackの中身を削除する
this->m_redoStack.Clear();

// UNDO用Stackへ最新のTEXTを挿入する
this->m_undoStack.Push(this->Text);
}
TextBox::OnTextChanged(e);
}

virtual void OnKeyDown(System::Windows::Forms::KeyEventArgs^ e) override
{
if (e->Control == true)
{
switch (e->KeyCode)
{
case System::Windows::Forms::Keys::A:
// 全選択
SelectAll();
return;
case System::Windows::Forms::Keys::Z:
// UNDO処理
undo();
return;
case System::Windows::Forms::Keys::Y:
// REDO処理
redo();
return;
}
}
TextBox::OnKeyDown(e);
}

private:
/// <sammary>
/// メンバの初期化
/// <sammary>
void init(void)
{
// Stackの中身を削除する
this->m_redoStack.Clear();
this->m_undoStack.Clear();

// UNDO用Stackの最初の要素として、空文字を挿入しておく
this->m_undoStack.Push(System::String::Empty);

// フラグをfalseで初期化
this->m_change = false;
}

/// <sammary>
/// UNDO
/// <sammary>
void undo(void)
{
// UNDO用のStackが空っぽでなければ…
if (this->m_undoStack.Count > 0)
{
// Stackの先頭要素がTextBox内のTEXTと同じの場合は…
if (this->m_undoStack.Peek() == this->Text)
{
// 一度だけ空読みして先頭要素を削除する
this->m_undoStack.Pop();
}

// UNDOによってTEXTが変化するのでフラグをTRUEにする
this->m_change = true;

// TextBox内のTEXTをREDO用Stackの先頭へ挿入する
this->m_redoStack.Push(this->Text);

// UNDO用のStackの先頭要素をTextBox内のTEXTへコピーする
this->Text = this->m_undoStack.Pop();
}
}

/// <sammary>
/// REDO
/// <sammary>
void redo(void)
{
// REDO用のStackが空っぽでなければ…
if (this->m_redoStack.Count > 0)
{
// REDOによってTEXTが変化するのでフラグをTRUEにする
this->m_change = true;

// TextBox内のTEXTをUNDO用Stackの先頭へ挿入する
this->m_undoStack.Push(this->Text);

// REDO用のStackの先頭要素をTextBox内のTEXTへコピーする
this->Text = this->m_redoStack.Pop();
}
}

private:
System::ComponentModel::Container ^components;

#pragma region Windows Form Designer generated code
void InitializeComponent(void)
{
components = gcnew System::ComponentModel::Container();
}
#pragma endregion
};



if (this->m_redoStack.Count > 0)




Name: チルチル  ..プログラマー(39,568ポイント)   Date: 2009/08/17(月) 12:31   No:38146       
Title: 画像の分割読み込みについて    
LoadDivGraph関数などを使って画像を読み込む場合の長所は読み込みが早くなるだけなのでしょうか?
何か描画する時の負荷が軽くなったりするのでしょうか?

分割読み込みすると描画する時にゴミがでたりfor文で読み込んだりできないので
特に差が無いなら弾の画像以外はLoadGraph関数とfor文で読み込んでみようと思うのですが・・


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


Name: ねこ  ..プログラマー(37,152ポイント)   Date: 2009/08/17(月) 13:41   No:38147     
Title: Re:画像の分割読み込みについて    
<LoadDivGraph関数などを使って画像を読み込む場合の長所は読み込みが早くなるだけなのでしょうか?
画像を分割してそれらをLoadGraphするのと比較すれば、ディスクアクセス分は最低でも早くなりますが大差ありません。

<何か描画する時の負荷が軽くなったりするのでしょうか?
どちらも最終的にはほぼ同内容のグラフィックデータになるので差はありません。

<分割読み込みすると描画する時にゴミがでたりfor文で読み込んだりできないので
<特に差が無いなら弾の画像以外はLoadGraph関数とfor文で読み込んでみようと思うのですが・・
負荷低い箇所(タイトルとかキャラ選択とか)ならDerivationGraphで手前にメモリ作って描画するので十分です。
シューティング等ならLoadGraph後にDerivationGraphで分割した方が描画は高速です。(直前分割は重い)


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

Name: チルチル  ..プログラマー(39,920ポイント)   Date: 2009/08/17(月) 14:35   No:38148     
Title: Re:画像の分割読み込みについて    
タイトルとかキャラ選択はDrawRectGraph関数を使っています、グラフィックハンドルが少なくてすむので・・
やはり毎回分割するのは重いのでしょうか・・

直前分割と言うのはLoadDivGraph関数の事でしょうか?

メニュー画面の背景などはサイズが同じなので1枚にまとめる事もできますが、それはやりすぎですね・・

今迷っているのはアイテムの画像を分割するかしないかなんですが
現状では大きさが違うので余白を作って1枚にまとめているんですが・・

そういえばLoadDivGraph関数とDrawRectGraph関数とDerivationGraph関数ではどれが速いのでしょうか?

案外、全画像を1枚にまとめてDerivationGraph関数で分割するのが一番速いのでしょうか・・
無駄な余白部分が壮大な量になると思いますが・・


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

Name: ねこ  ..プログラマー(37,259ポイント)   Date: 2009/08/17(月) 15:28   No:38150     
Title: Re:画像の分割読み込みについて    
<やはり毎回分割するのは重いのでしょうか・・
毎回「分割する」のですから余分な処理が出ます。
1回1回はそこまで気にする差でもないですが、流石に弾500とか1000とか出てる所で使うと差は如実に現れます。

<速い
読み込みは別の話です。

使い慣れてないうちは
「よく描画する画像は分割しておく」
「あまり使わない画像は分割しなくても良い(DrawRectGraphを使う)」
程度の認識で良いです。


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

Name: チルチル  ..プログラマー(39,963ポイント)   Date: 2009/08/17(月) 16:03   No:38153     
Title: Re:画像の分割読み込みについて    
なるほど、そういう事だったんですか

ではLoadDivGraph関数とDerivationGraph関数で描画速度に差はあるのでしょうか?


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

Name: ねこ  ..プログラマー(37,433ポイント)   Date: 2009/08/17(月) 16:25   No:38155     
Title: Re:画像の分割読み込みについて    
<ではLoadDivGraph関数とDerivationGraph関数で描画速度に差はあるのでしょうか?
これは二者で作ったグラフィックデータを描画した場合の速度差ということですか?
それだったら差はないです。
気になるなら自身で速度チェックを行えば納得いく結果が出ると思います。


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

Name: チルチル  ..熟練のプログラマー(40,045ポイント)   Date: 2009/08/17(月) 17:10   No:38159     
Title: Re:画像の分割読み込みについて    
なるほど差があるわけではないんですね

ではLoadGraph関数で読み込んだ画像を描画した時と
同じ画像になるように分割したものを描画した時で差はあるんでしょうか?


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

Name: kazuoni [URL]  ..比類無きプログラマー(98,502ポイント)   Date: 2009/08/17(月) 17:48   No:38161     
Title: Re:画像の分割読み込みについて    
>気になるなら自身で速度チェックを行えば納得いく結果が出ると思います。

のとおりです。自分で計ってみては?
とりあえずサンプルを添付してみます。
(時間の違いだけ見れればいいかと思って、適当に単位をつけましたが、違っていたらごめんなさい・・・)

>ではLoadGraph関数で読み込んだ画像を描画した時と
>同じ画像になるように分割したものを描画した時で差はあるんでしょうか?
ほぼ同じでした。

管理人さん、キャラチップ画像を分割してつかっていますが、まずかったら削除よろしくお願いします。


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

Name: Libra  ..中級者(9,303ポイント)   Date: 2009/08/17(月) 17:53   No:38162     
Title: Re:画像の分割読み込みについて    
ちなみに速度にこだわっている理由とかってありますか?
読み込みよりも、むしろ描画の方に気を使った方がいいのではないでしょうか?
描画負荷なら、一箇所でα値を変えた画像を描画等をやると、
結構高スペックなPCでも処理落ちしますね。


>分割読み込みすると描画する時にゴミがでたりfor文で読み込んだりできないので

これは単に画像の作り込みが足りないだけだと思います。


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

Name: チルチル  ..熟練のプログラマー(40,244ポイント)   Date: 2009/08/17(月) 18:51   No:38163 解決!     
Title: Re:画像の分割読み込みについて    
やってみると値が毎回バラバラなので差は無いと思いますが
単位がミリ秒なのかは自信が無いですね
体感時間は約30秒ほどで値の合計は約30ミリ秒ですので・・
そうなると画像を2000回表示するのに30秒かかる事に驚きですが・・

画像の作り込みが足りないわけではないと思います
ゴミと言うより分割するサイズを間違えた時のような現象が起きたり起きなかったりします

しかし元から分割していても関数で分割しても描画速度は変わらないようなので
特に気にしなくても良いようですね・・

お騒がせしてすみません、どうもありがとうございました


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




 
[ 1 , ... ]
 
 
管理者画面   RSS   + Powered By 21style +