C言語何でも質問掲示板

Total hit  今日  昨日  



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

 
   龍神録のC#XNA版 ....   
     ・[39830] Dixq (管理人) 
     ・[39838] zwi 
     ・[39854] zwi 
     ・[39960] softya 
     ・[40013] softya 
     ・[40060] Dixq (管理人) 
     ・[40067] softya 
   PSPにて   
     ・[40011] softya 
     ・[40020] Justy 
     ・[40032] ft 
     ・[40042] toyo 
     ・[40043] toyo 
     ・[40044] softya 
     ・[40045] Mist 
     ・[40046] ちゃお 
     ・[40047] softya 
     ・[40050] toyo 
     ・[40051] GPGA 
     ・[40053] ft 
   マ○オみたいなアクシ ....   
     ・[39994] ひよこ 
     ・[39998] けんたろうちゃん 
     ・[40041] Tatu 
   閏年について   
     ・[40018] b 
     ・[40022] box 
     ・[40029] たかぎ 
   Game()関数で   
     ・[39986] ちゃお 
     ・[40015] ディア 
   ボスのHPについて   
     ・[40003] array 
   地霊殿   
     ・[39980] ちゃお 
     ・[39982] ちゃお 
     ・[39989] あ〜る 
     ・[39996] ちゃお 
   弾幕名の表示   
     ・[39991] yu 
   DDR専用コントローラは ....   
     ・[39985] こめかみ 
   コンストラクタで操作 ....   
     ・[39978] Justy 
     ・[39979] Justy 
     ・[39983] チルチル 
   コンパイラについて   
     ・[39929] Justy 
     ・[39930] たかぎ 
     ・[39931] ネス 
     ・[39975] ネス 
   配列引数のサイズを調 ....   
     ・[39782] box 
     ・[39784] zwi 
     ・[39788] チルチル 
     ・[39789] zwi 
     ・[39790] チルチル 
     ・[39791] zwi 
     ・[39792] チルチル 
     ・[39793] array 
     ・[39794] array 
     ・[39795] チルチル 
     ・[39820] GPGA 
     ・[39823] たかぎ 
     ・[39824] チルチル 
     ・[39829] Justy 
     ・[39831] チルチル 
     ・[39832] 組木紙織 
     ・[39834] チルチル 
     ・[39835] 組木紙織 
     ・[39837] たかぎ 
     ・[39855] チルチル 
     ・[39856] たかぎ 
     ・[39858] チルチル 
     ・[39870] たかぎ 
     ・[39871] チルチル 
     ・[39874] たかぎ 
     ・[39875] チルチル 
     ・[39876] たかぎ 
     ・[39877] チルチル 
     ・[39903] チルチル 
     ・[39973] 組木紙織 
   vector standard head ....   
     ・[39964] 御津凪 
     ・[39965] 山崎 
   リプレイの実装につい ....   
     ・[39869] ラグ 
     ・[39904] Justy 
     ・[39914] ラグ 
     ・[39917] Justy 
     ・[39950] ラグ 
   キャラクターの移動に ....   
     ・[39925] ランド 
     ・[39928] うっそ 
   追尾型オプションのア ....   
     ・[39924] ねこ 
     ・[39926] ちゃお 
     ・[39927] ちゃお 
   templateの宣言部と定 ....   
     ・[39910] たいちう 
     ・[39911] 御津凪 
     ・[39912] array 
     ・[39913] Justy 
     ・[39923] array 
   続 シューティングで ....   
     ・[39775] 田所 
     ・[39796] チルチル 
     ・[39798] ようすけ 
     ・[39818] 信濃川 
     ・[39819] バグ 
     ・[39821] ようすけ 
     ・[39899] Tororo 
     ・[39900] Tororo 
     ・[39902] ようすけ 
     ・[39905] Tororo 
     ・[39909] ようすけ 
     ・[39919] ちゃお 
   名前の入力   
     ・[39897] toyo 
     ・[39918] しなちく 
   東方地霊殿   
     ・[39907] mnkr 
     ・[39908] 6226 
   マップがおかしくなり ....   
     ・[39888] zwi 
     ・[39892] ひよこ 
     ・[39894] toyo 
     ・[39895] zwi 
     ・[39896] ひよこ 
   char *filedについて   
     ・[39851] 御津凪 
     ・[39852] zwi 
     ・[39863] non 
     ・[39885] Ma 
     ・[39890] tama 
     ・[39891] zwi 
   思いつきで出来た弾幕   
   質問です。   
     ・[39881] box 
     ・[39882] YuO 
     ・[39883] テリー 
   拡張子dxa   
     ・[39864] Tororo 
     ・[39865] Tororo 
     ・[39866] tkmakwins15 
     ・[39867] Tororo 
     ・[39872] yussanstar 
     ・[39873] Justy 
   ポOモン「風」のゲー ....   
     ・[39843] 質問者 
     ・[39844] 質問者 
     ・[39845] Q 
     ・[39846] 質問者 
     ・[39847] zwi 
     ・[39848] zwi 
     ・[39849] 質問者 
     ・[39857] 質問者 
     ・[39859] zwi 
     ・[39860] Mist 
     ・[39862] 質問者 
   スプライト処理で読み ....   
     ・[39840] zwi 
   関数のポインタの多数 ....   
     ・[39737] ひよこ 
     ・[39738] yussanstar 
     ・[39740] 御津凪 
     ・[39750] zwi 
     ・[39751] conio 
     ・[39753] toyo 
     ・[39833] yussanstar 
   龍神録のボスを残像さ ....   
     ・[39828] Justy 
   館本編の、サンプルプ ....   
     ・[39827] Justy 
   演算子?実行結果がエ ....   
     ・[39802] Ma 
     ・[39803] チルチル 
     ・[39804] まりも 
     ・[39805] sizuma 
     ・[39807] DVDM 
     ・[39808] base 
     ・[39809] まりも 
     ・[39810] まりも 
     ・[39811] まりも 
     ・[39812] DVDM 
     ・[39815] conio 
     ・[39826] まりも 
   Cの文字列の扱いが得意 ....   
     ・[39777] ランド 
     ・[39778] non 
     ・[39779] usami 
     ・[39781] usami 
     ・[39783] zwi 
     ・[39786] usami 
     ・[39787] zwi 
     ・[39799] usami 
     ・[39816] conio 
   全方向型シューティン ....   
     ・[39772] zwi 
     ・[39797] チルチル 
     ・[39814] DVDM 
   会話シーン   
     ・[39800] Ma 
     ・[39806] sizuma 
     ・[397731255574283] 電気屋 
   超初心者です   
     ・[39618] koburouuu 
     ・[39619] kazuoni 
     ・[39620] koburouuu 
     ・[39626] koburouuu 
     ・[39627] すずめ 
     ・[39630] kazuoni 
     ・[39635] koburouuu 
     ・[39641] koburouuu 
     ・[39642] kazuoni 
     ・[39643] koburouuu 
     ・[39644] koburouuu 
     ・[39645] すずめ 
     ・[39646] kazuoni 
     ・[39663] zwi 
     ・[39698] koburouuu 
     ・[39700] koburouuu 
     ・[39701] koburouuu 
     ・[39708] kazuoni 
     ・[39711] koburouuu 
     ・[39713] zwi 
     ・[39755] koburouuu 
     ・[39774] ディア 
     ・[39785] conio 
   たびたびすいませんが   
     ・[39716] マウ 
     ・[39717] zwi 
     ・[39719] マウ 
     ・[39720] zwi 
     ・[39769] マウ 
     ・[39770] zwi 
   関数のエラー?   
     ・[39766] JK 
     ・[39767] conio 
     ・[39768] zwi 
   メンバ関数の関数ポイ ....   
     ・[39666] MNS 
     ・[39667] チルチル 
     ・[39668] zwi 
     ・[39669] MNS 
     ・[39670] チルチル 
     ・[39671] チルチル 
     ・[39674] zwi 
     ・[39675] チルチル 
     ・[39679] 御津凪 
     ・[39680] MNS 
     ・[39681] チルチル 
     ・[39682] Justy 
     ・[39687] チルチル 
     ・[39688] 御津凪 
     ・[39689] nayo 
     ・[39691] Justy 
     ・[39692] チルチル 
     ・[39697] conio 
     ・[39702] チルチル 
     ・[39703] yu 
     ・[39704] チルチル 
     ・[39707] conio 
     ・[39712] MNS 
     ・[39723] チルチル 
     ・[39725] MNS 
     ・[39727] チルチル 
     ・[39762] チルチル 
   グローバル変数の扱い ....   
     ・[39760] T.C.D 
     ・[39761] さところ 
   風神録のくるくる回る ....   
     ・[39686] チルチル 
     ・[39694] kai 
     ・[39695] チルチル 
     ・[39756] チルチル 
     ・[39757] kai 
     ・[39758] チルチル 
   コンソールアプリケー ....   
     ・[39624] zwi 
     ・[39652] ぬこ 
     ・[39657] zwi 
     ・[39746] ぬこ 
     ・[39749] zwi 
   簡単な数学   
     ・[39730] たいちう 
     ・[39748] F 
   mp3のリソース化   
     ・[39735] lbfuvab 
     ・[39747] 774 
   たびたび失礼します   
     ・[39743] Dixq (管理人) 
     ・[39745] ft 
   初歩すぎて聞き辛いで ....   
     ・[39741] array 
     ・[39742] Dixq (管理人) 
     ・[39744] H 
   これはどうすればいい ....   
     ・[39547] array 
     ・[39549] 小夜 
     ・[39552] Justy 
     ・[39600] ぽよ 
     ・[39729] 小夜 
     ・[39731] mnkr 
     ・[39732] 小夜 
   オプションの動作   
     ・[39721] チルチル 
     ・[39724] ft 
     ・[39726] チルチル 
     ・[39728] ft 
   ソースプログラムファ ....   
     ・[39662] zwi 
     ・[39685] kiki 
     ・[39690] zwi 
     ・[39693] zwi 
     ・[39715] kiki 

Name: zwi  ..初心者(7,019ポイント)   Date: 2009/10/01(木) 10:30   No:39817       
Title: 龍神録のC#XNA版の作成    
実は現在病気療養中で時間がありC#の勉強をしているのですが、C#の練習を兼ねて龍神録のXNA版を作ってみようと思うのですがソースコードとか需要はありますでしょうか?それとも、もう誰か作ったりした人がいます?
とりあえず第7章あたりから始めているのですが。


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


Name: Dixq (管理人) [URL]  ..ウィザード(1,060,618ポイント)   Date: 2009/10/01(木) 22:45   No:39830     
Title: Re:龍神録のC#XNA版の作成    
>zwiさん

こんばんは。
お体大丈夫ですか?
私も今会社がお休みです・・。
お互い体には気をつけて頑張りましょう><

XNAでのゲーム制作されてるんですね!
私も非常に興味あります。
なんたってX-boxで動くというのが素晴らしいですよね。

もし完成されたらリンク張らせて下さい^^


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

Name: zwi  ..初心者(7,366ポイント)   Date: 2009/10/02(金) 08:36   No:39838     
Title: Re:龍神録のC#XNA版の作成    
> Dixqさん
ありがとうございます。
体のほうは来週の手術待ちですが、死ぬような病気では無いので安心してください。
インフルエンザは大丈夫ですか?

XNA版の方は、C#の文法で苦労しています。基本的にはJavaに似ているんですが、C++っぽい所もあります。
Javaはかじった程度なのとC++に慣れているので勘でC++風にコード書くとエラーだらけに・・・。「独習C#」を片手にコード作成中って状況です。
XNAライブラリもよく知らないので調べつつ進めてますので、なかなか進みません。ただ、今のところの感触ではDXライブラリ程度の手間でXNAもプログラムが組めそうです。
書いているコードは龍神録のソースの元の形に最初は似せようと思ったのですが、あまりにもC#らしく無くなりそうなのとコードが読みづらくなりそうなので、きっぱりと諦めてオブジェクト指向に切り替えました。

>なんたってX-boxで動くというのが素晴らしいですよね。
はい、それが私の目的でもあります。
Xbox360で動く3Dのソフト(シミュレータ系)を作りたいんですよね。
PCとは実行時の動きがだいぶ違うみたいなので、実際にXbox360で走らせて見ないとわかんないことが多いみたいですね。しかし、クリエイターズクラブ1年分の9800円は高いです。

>もし完成されたらリンク張らせて下さい^^
はい、よろしくお願いします。


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

Name: zwi  ..初心者(8,643ポイント)   Date: 2009/10/02(金) 17:08   No:39854     
Title: Re:龍神録のC#XNA版の作成    
とりあえず龍神録の第7章のコードは書けました。
VisualC#2008ExpressEdtionとXNA GAME STUDIO3.1(それ以前のバージョンでもソースは使えるはず)で作ってあります。
とりあえず、ソースコードを添付しておきますのでXNAの雰囲気を感じてもらえたらと思います。
プロジェクト、実行ファイル、.NET frameworkの配布方法はこれから研究してみます。

所謂WinMainに相当するものはGame1.csです。


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

Name: softya  ..ぴよぴよ(109ポイント)   Date: 2009/10/04(日) 15:55   No:39960     
Title: Re:龍神録のC#XNA版の作成    
zwi改めsoftyaです。
サイトでの名前に近い名前に改名いたしました(管理人のDixqさんの了承済みです)。
よろしくお願いします。

XNAサイトが出来ましたので、報告いたします。
http://softyasu.net/game/gametop.html
現在は19章の移植を行っております。


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

Name: softya  ..中級者(11,664ポイント)   Date: 2009/10/05(月) 14:19   No:40013     
Title: Re:龍神録のC#XNA版の作成    
Dixqさんに質問です。
音楽とSEと龍の絵は二次使用不可となっていますが、龍神録XNAも同様だと考えてよろしいでしょうか?
もし、使っても良いものがあれば教えていただきたいのですが。
厚かましいお願いで申し訳ないです。たぶん、創作された方との問題だとは思うのですが・・・。


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

Name: Dixq (管理人) [URL]  ..ウィザード(1,062,994ポイント)   Date: 2009/10/06(火) 20:48   No:40060     
Title: Re:龍神録のC#XNA版の作成    
>softyaさん

HP開設おめでとうございます〜^^
そして素晴らしいサイトに私もうれしく思っています。
二次使用の件はこちらから確認を取り、メールでご連絡しますね。

まだ拝見出来ていないのですが、今週末にでも拝見させていただきます^^


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

Name: softya  ..中級者(12,359ポイント)   Date: 2009/10/06(火) 21:36   No:40067     
Title: Re:龍神録のC#XNA版の作成    
>HP開設おめでとうございます〜^^
>そして素晴らしいサイトに私もうれしく思っています。
ありがとうございます。
これから初心者向けの解説も入れて行きたいと思ってます。
19章の時点でC#のクラス、継承、仮想メンバ、staticメンバ、抽象クラス、列挙型、配列、structとか色々使っちゃていますので、解説しないとまずいだろうなと思ってます。

>二次使用の件はこちらから確認を取り、メールでご連絡しますね。
お手数掛けて申し訳ありません。

[現状]
19章は、C#が初めてなのでたいへん手間取ってます。
あと、オブジェクト指向でシューティングが初めてなのでクラス設計でも大層悩み中です。
無理やり作ると見栄えが悪くて、サンプルとしていかがなものかって感じなので修正を繰り返す毎日です。
で、当たり判定とか弾幕の負荷に耐えられないと意味無いですから、そこの所も見栄え良く、かつ負荷の軽い実装を探っております。

そんな訳で手術も明後日となり間に合いそうもないので、来週まで19章はお待ちください。体の調子が戻り次第、開発を再開したいと思います。
明日は、こちらに来れますが、8〜11日ぐらいは来れなさそうです。


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



Name: ft  ..ぴよぴよ(902ポイント)   Date: 2009/10/05(月) 09:49   No:40009       
Title: PSPにて    
DXライブラリportableで龍神録プログラミングの館さんを参考にPSPでの起動を試みております。

現在、第14章と15章あたりなのですが、大量の弾を発射させるとどうも処理落ちしてしまいます。
ソースはほぼそのままです。

一度、弾の描画graph_bullet();をすべて削除して起動させてみてみましたが、
弾が増える箇所で重くなってしまいました。

これは弾の座標計算の量が増えたため起きた現象なのでしょうか?
それとも何か別の要因があるのでしょうか?


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


Name: softya  ..中級者(11,421ポイント)   Date: 2009/10/05(月) 12:40   No:40011     
Title: Re:PSPにて    
PSPについては詳しくありませんが、龍神録ってdoubleとか平気で使ってますがパソコンなら専用演算回路があるので良いのですが、PSPではソフトでdoubleを計算しているのではないでしょうか。そのため劇的に遅くなっているのでは?
PSPのVFPUの浮動点演算速度はすごいと聞きましたが、C言語で普通に組んでいる時は動作していませんよね?
floatとdoubleで、どのぐらい差が有るか調べてみる事をお勧めします。


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

Name: Justy  ..伝説なるハッカー(434,538ポイント)   Date: 2009/10/05(月) 21:04   No:40020     
Title: Re:PSPにて    

>PSPではソフトでdoubleを計算しているのではないでしょうか。そのため劇的に遅くなっているのでは?

 PSPはやったことがないので詳しくはないのですが、それはパフォーマンスに
大きな影響を与えそうですね。


# ftさん
 変数で使用する型は勿論ですが、演算中の定数や数学ライブラリも float版を使うように
しないと doubleが混ざってしまいますので書き換えるのはなかなか大変かもしれません。

 ちなみに -fshort-doubleコンパイルオプションも使えそうですが、使用するライブラリとの
整合性や可変引数での扱いがおかしくなりそうなので、避けた方がいいかもしれません。


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

Name: ft  ..かけだし(1,616ポイント)   Date: 2009/10/06(火) 00:45   No:40032     
Title: Re:PSPにて    
プログラミングについて勉強不足で申し訳ないのです。。。
まず最初にdoubleで宣言しているものをすべてfloatに変えたら動きませんでした。
いろいろ弄っていたのですが、
弾の座標を計算していると思われるshot.c中のshot_calc()の、

   shot[n].bullet[i].x+=cos(shot[n].bullet[i].angle)*shot[n].bullet[i].spd;
   shot[n].bullet[i].y+=sin(shot[n].bullet[i].angle)*shot[n].bullet[i].spd;
という個所を次のように、

shot[n].bullet[i].x+=cos((float)shot[n].bullet[i].angle)*shot[n].bullet[i].spd;
shot[n].bullet[i].y+=sin((float)shot[n].bullet[i].angle)*shot[n].bullet[i].spd;

そしてstruct.c中の

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

という個所を次のように

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

これらの箇所だけ変えたら、今度は弾の描画がなくなってしまいましたが、
処理落ちは確認されませんでした。


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

Name: toyo  ..熟練のプログラマー(41,382ポイント)   Date: 2009/10/06(火) 09:38   No:40042     
Title: Re:PSPにて    
言語は c ですか c++ ですか
Cならcos( f )ではなくてcosf( f )のようにfloat用の関数にしないと結局doubleで計算されます
shot[n].bullet[i].xなどの変数の宣言自体からfloatに変更しましょう


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

Name: toyo  ..熟練のプログラマー(41,469ポイント)   Date: 2009/10/06(火) 09:57   No:40043     
Title: Re:PSPにて    
ちょっと調べたらこんなレスがありました
http://gameurawaza.me.land.to/test/read.cgi/danmaku/1232814877/503
これが本当ならdouble=>floatは効果なさそうですね
単にグラフィック処理が追いつかないだけでしょうか

PSPみたいな組み込みに近いやつで処理速度求めるならライブラリ使わないでゴリゴリ書いた方がいいのかもしれません


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

Name: softya  ..中級者(11,953ポイント)   Date: 2009/10/06(火) 10:48   No:40044     
Title: Re:PSPにて    
そうですね。
doubleとfloatのコアの部分は差は無いかも知れませんが、double→float(計算)→doubleの変換が入っているだけでもロスはロスです。
floatとdoubleをそれぞれ百万回ループで計算速度の差を計測するなど実際に試して実験して見ましょう。なんとなく早くなった気がするってのが後々不幸の元です。正しいデータを取る事の手を抜くと自分にお返しがありますよ。

この手の浮動少数点系の貧弱なハードでは、全てfloatで計算をするのは当たり前としてint→floatやfloat→int変換がなるべく起きないように気をつけてください。この時間ロスも馬鹿に出来ません。
toyoさんも書かれているsinfなどの活用も忘れていはいけませんね。


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

Name: Mist  ..熟練のプログラマー(68,567ポイント)   Date: 2009/10/06(火) 11:11   No:40045     
Title: Re:PSPにて    
> doubleとfloatのコアの部分は差は無いかも知れませんが、double→float(計算)→doubleの変換が入っているだけでもロスはロスです。

toyoさんのリンク先読んだけどPSPには倍精度は存在しなくて単精度しかないってことじゃないの?
double記述はコンパイル時にfloatと同じと解釈されるって読めるけど。
だとすれば実行時のロスはないんじゃないかと。
試してみることは悪いことではないと思いますけど。


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

Name: ちゃお  ..かけだし(1,665ポイント)   Date: 2009/10/06(火) 12:09   No:40046     
Title: Re:PSPにて    
龍神録のプログラムだと当たり判定が、表示している(敵弾と自機)や(敵と自機弾)になってるし、当たり判定をバケット分割式にするとか色々工夫がいるかも。
それで少しは処理落ちを緩和できないかな。


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

Name: softya  ..中級者(12,091ポイント)   Date: 2009/10/06(火) 12:16   No:40047     
Title: Re:PSPにて    
>double記述はコンパイル時にfloatと同じと解釈されるって読めるけど。
floatとdoubleは、sizeofで確認できますので、確認は簡単だと思います。
とりあえずプログラミングで思い込みは間違いの元ですので、試してみるか正式な資料を探すかどちらか無いと思います。試しもせず結論付けるのは、私はアバウトすぎると思うんですけど。
特に処理落ちは、地道に原因となるネックの部分を1つづつ潰して行くことが大事なので怪しいところは全部疑うしかないかと。


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

Name: toyo  ..熟練のプログラマー(41,624ポイント)   Date: 2009/10/06(火) 14:32   No:40050     
Title: Re:PSPにて    
PSPの実行環境があるので試してみましたがsizeof(double)は8でsizeof(float)は4でした。
変数宣言だけでも実行ファイルに違いが出るはずなので先ほどのURLは眉唾ですね。変なの張ってすみません。
無駄な型変換を避ける意味でも変数を float に統一する価値はありそうです。
三角関数がボトルネックならテーブル参照にする方法もありますね。
0-90度のsinかcosだけテーブルにすればすべて変換できますし。


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

Name: GPGA  ..熟練のプログラマー(65,865ポイント)   Date: 2009/10/06(火) 14:50   No:40051     
Title: Re:PSPにて    
PSPを生業としている私としては、解決方法は2つあると思います。

一つはPSPが積んでいるFPUに浮動小数計算をすべて委任すること。
もう一つは浮動小数は使わず全て固定小数で計算すること



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

Name: ft  ..かけだし(1,761ポイント)   Date: 2009/10/06(火) 15:28   No:40053     
Title: Re:PSPにて    
>>toyoさん
dxライブラリportableのサイト
ttp://dxlibp.sourceforge.jp/
のチュートリアルにて、「test.c」を作っていたので.cのままでやっております。
龍神録さんのC++のソースをほぼそのまま移行してたらエラーする箇所もいくつかありました。

あとdouble→floatに変えてみると動かなくなったり、途中で停止してしまうため、
もう一度最初からfloatというのを確認しながら、次はC++で組んでみたいと思います。


また調べていたら読み込んだ画像をPSPのvramに置くとかなんとかという事が書かれていましたが…
この辺はどのようにしたらいけるのか今のところイマイチです。


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



Name: Tatu  ..中級者(10,194ポイント)   Date: 2009/10/04(日) 22:05   No:39992       
Title: マ○オみたいなアクションゲームを作ってみました。    
スーパーマ○オブラザーズのようなアクションゲームを作りました。

名前は「星追う旅人」です。

普通に遊ぶ他、プログラム内にあるエディターを使って、

マップを作ることも可能です。


また、以前配布した「東方靈異伝」風の「星と陰陽玉」(変更はなし)と

八方位シューティングのミニゲームも同梱してあります。

お借りしたアップローダー

http://up2.shinetworks.net/cgi-bin/snup-mini/src/shinemini15572.zip.html


ダウンロードキーは tabibito です。


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


Name: ひよこ  ..熟練のプログラマー(54,271ポイント)   Date: 2009/10/04(日) 22:30   No:39994     
Title: Re:マ○オみたいなアクションゲームを作ってみました。    
さっそく遊ばせてもらいました。
楽しいです。まさか、BGMがないのはTatuさんが作っているからなんですか?
星追う旅人は2面でぼっこぼっこにされました。けっこう難しいです。
八方位シューティングが特に難しくお化けがいつ全滅するか、なんて考えながらやってみました。
どちらも楽しくってよかったです。
制作お疲れ様でした。


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

Name: けんたろうちゃん  ..入門者(4,908ポイント)   Date: 2009/10/04(日) 22:56   No:39998     
Title: Re:マ○オみたいなアクションゲームを作ってみました。    
どれもオリジナリティあふれてすばらしいです
DXライブラリ使用のゲームは東方風STGが多い中、このようなゲームは貴重だと思います


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

Name: Tatu  ..中級者(10,641ポイント)   Date: 2009/10/06(火) 09:30   No:40041     
Title: Re:マ○オみたいなアクションゲームを作ってみました。    
遊んでくださってありがとうございます。


>>ひよこ さん
>>BGMがないのはTatuさんが作っているからなんですか?

ゲームに使っている素材はすべて自分で作っています。

>>2面でぼっこぼこ

ゲームの仕様上、敵を一回倒せば復活しないので、
敵の数を減らせば少しは楽になります。
また、キノコも一度とると復活しないので、
ある程度敵を減らすまではとらないというのも一つの手です。

>>八方位シューティング

自力で連打しなくてもなんとかクリアできるという感じに作ったので、
難しめになっています。

参考:最初のお化けが一番多い時に一回やった記録
自力連打なし:フレーム 9378 (約155秒)/お札 938
連打あり: フレーム 7790 (約130秒)/お札 907


>>けんたろうちゃん
>>DXライブラリ使用のゲームは東方風STGが多い中、このようなゲームは貴重だと思います

龍神録プログラミングの館の内容をみてこれなら工夫すれば、ブロック崩しや
アクションゲームも作れると思ったのが制作の理由です。


暇があれば星追う旅人のエディターにも触れてみてください。



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



Name: slush  ..ぴよぴよ(151ポイント)   Date: 2009/10/05(月) 17:02   No:40016       
Title: 閏年について    
こんにちは。いつもお世話になっています。

閏年を求める問題で以下のような文があったのですが、
(year % 4 == 0 && year % 100 != 0 || year % 400 == 0)
分かったような分からないような感じです。

4で割り切れて、なおかつ100で割り切れない数。この後の(|| year % 400 == 0)が付け足されると
分からなくなります。4で割り切れて、なおかつ100で割り切れないくて、または400で割り切れる数。
うーーーん、しっくりこないのですが、
よろしければ、だれかうまく言葉で説明できる方がいたらよろしくお願いいたします。





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


Name: b  ..かけだし(1,617ポイント)   Date: 2009/10/05(月) 18:35   No:40018     
Title: Re:閏年について    
(1)4で割り切れて、なおかつ100で割り切れない数
(2)400で割り切れる数

(1)と(2)の条件のどちらか一方でも当てはまるとき

2つの条件に当てはまるかを別々に考えるとどうでしょうか?



4で割り切れるが100で割り切れない数、または400で割り切れる数


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

Name: box  ..ハッカー(144,351ポイント)   Date: 2009/10/05(月) 21:28   No:40022     
Title: Re:閏年について    
&& 演算子は || 演算子より優先順位が高いです。
くだんの文は

((year % 4 == 0 && year % 100 != 0) || year % 400 == 0)

と同じ意味です。
別の回答者さんが書かれているとおり、

1)4で割り切れ、かつ100で割り切れない
2)400で割り切れる

の少なくとも一方が成立すればうるう年となります。


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

Name: たかぎ [URL]  ..ハッカー(112,016ポイント)   Date: 2009/10/05(月) 23:43   No:40029     
Title: Re:閏年について    
> よろしければ、だれかうまく言葉で説明できる方がいたらよろしくお願いいたします。

「グレゴリオ暦の定義どおり」です。


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



Name: ディア  ..入門者(3,553ポイント)   Date: 2009/10/02(金) 16:57   No:39853       
Title: Game()関数で    
前回、スレの途中で質問してしまったので、
新しく立てさせていただきました。

前の質問にて、conio 氏に頂いた回答ですが、
私の質問が間違っていました。

改めて質問させていただきます。

添付のソース内で
Game()関数にゲームを開始する処理をさせたいのですが
どういった風に書けばいいのでしょうか?

現在の、メニュー無しでゲームが始まるmain.cpp内は以下の通りです。


#define GLOBAL_INSTANCE
#include "./include/GV.h"

//ループで必ず行う3大処理
int ProcessLoop(){
if(ProcessMessage()!=0)return -1;//プロセス処理がエラーなら-1を返す
if(ClearDrawScreen()!=0)return -1;//画面クリア処理がエラーなら-1を返す
GetHitKeyStateAll_2();//現在のキー入力処理を行う
GetHitPadStateAll(); //現在のパッド入力処理を行う
return 0;
}

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

while(ProcessLoop()==0){//メインループ
music_ini();
switch(func_state){
case 0://初回のみ入る処理
load(); //データロード
first_ini();//初回の初期化
func_state=99;
break;
case 99://STGを始める前に行う初期化
ini();
load_story();
func_state=100;
break;
case 100://通常処理
enter_func_tm("最初");
calc_ch(); enter_func_tm("キャラ計算");
ch_move(); enter_func_tm("キャラ移動");
cshot_main(); enter_func_tm("自機ショットメイン");
enemy_main(); enter_func_tm("敵処理メイン");
boss_shot_main();enter_func_tm("ボスショットメイン");
shot_main(); enter_func_tm("ショットメイン");
out_main(); enter_func_tm("当たり判定");
effect_main(); enter_func_tm("エフェクトメイン");
calc_main(); enter_func_tm("計算メイン");
graph_main(); enter_func_tm("描画メイン");
bgm_main(); enter_func_tm("BGMメイン");
if(boss.flag==0)
stage_count++;
break;
default:
printfDx("不明なfunc_state\n");
break;
}
music_play(); enter_func_tm("音楽再生");
fps_wait(); enter_func_tm("待機した時間",1);
if(CheckStateKey(KEY_INPUT_ESCAPE)==1)break;//エスケープが入力されたらブレイク
ScreenFlip();//裏画面反映
count++;

}
DxLib_End();//DXライブラリ終了処理
return 0;
}




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


Name: ちゃお  ..かけだし(1,490ポイント)   Date: 2009/10/04(日) 20:36   No:39986     
Title: Re:Game()関数で    
music_ini();からcount++までをGame関数の中で記述して、while(ProcessLoop()==0)の枠の中で常に呼び続ければいいんじゃない?

caseごとにオープニングとか作って、あるボタンを押したら、caseが移動していくように処理するプログラムを作れば、いいかなと。
case1:オープニング
case2:キーコンフィグとかサウンドボリュームとかゲームスタートとかメニューを選んで押す画面
case3:画像とかロードする処理
case4:ゲームを遊ぶ処理

case2のところで、あるメニューの位置(ゲームスタートとか)で、あるボタンを押したときにcase3に移って、ロード完了したら、case4に移るような処理必要ですね。

答えになってない?


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

Name: ディア  ..初心者(5,138ポイント)   Date: 2009/10/05(月) 16:22   No:40015     
Title: Re:Game()関数で    


そう考えればよかったんですね・・・

回答有難うございます。
やってみます。


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



Name: ER  ..ぴよぴよ(144ポイント)   Date: 2009/10/04(日) 23:04   No:39999       
Title: ボスのHPについて    
ボスのHPを変更するにはどこの数値を変更すればいいですか?
勉強不足ですいません・・・
こんなくだらない質問ですが、返答してくださればありがたいです。
よろしお願いします<(_ _)>


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


Name: array [URL]  ..熟練のプログラマー(57,593ポイント)   Date: 2009/10/05(月) 00:08   No:40003     
Title: Re:ボスのHPについて    
boss構造体に定義されているので
boss.hpもしくはboss->hpです。


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



Name: 6226  ..ぴよぴよ(42ポイント)   Date: 2009/10/04(日) 16:05   No:39961       
Title: 地霊殿    
地霊殿のまりさ、パチュリーペアの五種類のショットと霊夢、紫ペアの隙間の作り方を教えてください。

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


Name: ちゃお  ..かけだし(1,000ポイント)   Date: 2009/10/04(日) 19:50   No:39980     
Title: Re:地霊殿    
プログラミングが得意では全くありませんが、

まりさとパチュリーのショットは、
if(ショットボタン押してたら && 低速ボタンおしてたら)
オプションフラグ++
みたいにして、オプションフラグの数字ごとに対応したショットとmoveのプログラム書けばいけると思いますよ。
オプションの変更が一周したら、オプションフラグを最初のオプションのショットとmoveに戻すif文も必要ですね。

オプションmove関数をそれぞれ必要な分だけ(5種類)
オプションのショットについてもそれぞれmoveに対応する関数が入りますね。(5種類)

霊夢と紫の方は、
オプションの動きは、Option.ang += PI/6といったようなものを何フレームかごとに呼び出すようにして
sinとcosで回転するようにいじればいけそうです。
あと低速ボタン押したときは、回転速度落としてとか。。
Option.x += cos(Option.ang) * Option[i].sp;
Option.y += sin(Option.ang) * Option[i].sp;
ちなみに中心座標は常にキャラクターの位置を中心として回転させないとダメですね。


龍神録プログラミングの自機にショットを打たせる章を参考にして、オプションの位置から玉を出すようにプログラムすればokだと思います。あとポンポンオプションのソースも参考になると思います。

ソース例とかだと
オプション1個だと下みたいな考え方はありかな。
void Option_shot1()//オプションのショットの種類ごとに関数を用意
{
int k;
if((k=search_Jiki_shot())!=-1)//弾の配列の登録
{
Jiki_shot[k].flag=1;
Jiki_shot[k].cnt=0;
Jiki_shot[k].angle = -PI/2;//ここ変更していろいろ角度調整してください
Jiki_shot[k].spd=10;
Jiki_shot[k].x = Option1.x + Jiki_shot0pos_x1[0];//オプションの位置から
Jiki_shot[k].y = Option1.y + Jiki_shot0pos_y1[0];//オプションの位置から
Jiki_shot[k].power=5;
Jiki_shot[k].knd=0;//ショットの画像の種類
}
}
みたいな風かな。
作ってみてないので、ハッキリしたことはわからないですが、オプションの数が1,2,3,4となるはずなので、オプションの位置ごとに弾の角度とか一つ一つ調整してください。

ちなみにオプションのショットを自機のショットとして判定させれば、当たり判定処理が楽になりそうです。
弾の表示絶対数も上げたほうがよさそうですね。

説明下手ですみません。
頑張ってください。


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

Name: ちゃお  ..かけだし(1,263ポイント)   Date: 2009/10/04(日) 20:04   No:39982     
Title: Re:地霊殿    
霊夢と紫の隙間ってなんぞ?
東方詳しくないので。。

画面の端にいる場合に応じた描画処理をifで作るなり、キャラクター移動ですばやく2回ある方向キー押したら、逆サイドから出てくるようにキャラクターのx座標とy座標を変更するようにすればいいかな。

アクションゲームのキャラクターのダッシュみたいな機能がいりますね。作ったことないんですけど。
方向キー押してるときに方向キーカウントを何カウントかさせて、あるカウントまでにもう一回同じ方向キー押したら、ダッシュするというフラグ立てて、それに対応したif文に入るみたいなことすればいいのかな。
ダッシュを隙間の移動?みたいな解釈してください。

隙間ってなんぞ。
あの移動隙間っていうんすか。


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

Name: あ〜る  ..中級者(12,408ポイント)   Date: 2009/10/04(日) 21:26   No:39989     
Title: Re:地霊殿    
パチュリーのオプションなんですが、ちゃおさんの言ってる条件だと低速移動しながらショットを撃ってると、常にオプションのタイプが切り替わり続けてしまうんで、カウンタを使って条件を
if(一つ前のカウントの時ショットボタンも低速ボタンも押されてなくて&&ショットボタンと低速ボタンが両方押されていたら)
にして下さい
別にカウンタを使わなくても、一つ前のフレームのキーの入力状況がわかれば大丈夫ですけど、まぁとにかくそんな感じです


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

Name: ちゃお  ..かけだし(1,599ポイント)   Date: 2009/10/04(日) 22:44   No:39996     
Title: Re:地霊殿    
> パチュリーのオプションなんですが、ちゃおさんの言ってる条件だと低速移動しながらショットを撃ってると、常にオプションのタイプが切り替わり続けてしまうんで、カウンタを使って条件を
> if(一つ前のカウントの時ショットボタンも低速ボタンも押されてなくて&&ショットボタンと低速ボタンが両方押されていたら)
> にして下さい
> 別にカウンタを使わなくても、一つ前のフレームのキーの入力状況がわかれば大丈夫ですけど、まぁとにかくそんな感じです

あ、すいません。
あ〜るさん、本当ですね〜。
プログラムのバグとかは、その都度作っていくうちに考えながら、修正したり思い描いてます。
なんで、突発的に考えたアドバイスになってしまいました。頭回り来ってませんでしたTT
実際作っていくうちに
そういえば、こうしなきゃいけないな〜っていっつも考えながらやってます〜^^
ご指摘ありがとうございます。

6226さん、頑張ってください。


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



Name: ディア  ..入門者(4,934ポイント)   Date: 2009/10/04(日) 14:46   No:39954       
Title: 弾幕名の表示    
質問してばっかりですみません。

龍神録で、ボスの弾幕時に左上に弾幕名というのでしょうか、
文字が出ています。

あれはどうやったらいいのでしょうか。
各弾幕の関数内にDrawStringで出してみようとしたのですが
うまく表示出来ませんでした。

それと、スペルカード時の文字が一瞬大きくなるのも、
どうやって作ればいいのでしょうか。






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


Name: yu  ..プログラマー(39,814ポイント)   Date: 2009/10/04(日) 22:00   No:39991     
Title: Re:弾幕名の表示    
>各弾幕の関数内にDrawStringで出してみようとしたのですが

弾幕関数内で描画すると背景の下に文字が描画されるので見えなくなってしまいます
graph.cppのgraph_back_main()の後に描画すると見えるようになると思います

弾幕時に変数に文字列(弾幕名)を代入して、描画時にその変数から文字列を得て描画すると良いかもしれません
あくまで一例ですので、良い方法なのかは分かりませんが;


>スペルカード時の文字が一瞬大きくなる

DrawExtendString関数等はどうでしょうか?


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



Name: こめかみ  ..熟練のプログラマー(49,289ポイント)   Date: 2009/10/04(日) 15:03   No:39957       
Title: DDR専用コントローラはDDR以外のソフトでも操作できるのでしょうか?    
ダンスダンスレボリューションも足コントローラについても良く知らないのですが、
音ゲームやリズムゲーム全般、足で操作できたら面白そうだと常々思っていましたら。


こちらの動画を見て、
【ニコニコ動画】【実況】 超魔界村 足でプレイ part1 【DDRコントローラー】

DDR以外のソフトを操作している人を知りました。

DDR専用コントローラはDDR以外のソフトでも操作できるものなのでしょうか?

具体的にはハードは"PS2"で、ソフトはまず"スペースチャンネル5"を遊んで、
足でプレイするゲームについていろいろ試してみようと思い、
DDR専用コントローラで遊べないかな、と考えているのですが。


この動画で実況プレイされている方が魔界村で遊ぶために足コントローラに特別な改造を施しているんじゃないかとか根拠の無い不安もあります。

DDRコントローラを持っているという方や、
他に詳しい方がいらっしゃいましたら意見をお聞きしたいです。
よろしくお願いします。



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


Name: こめかみ  ..熟練のプログラマー(49,440ポイント)   Date: 2009/10/04(日) 20:21   No:39985 解決!     
Title: Re:DDR専用コントローラはDDR以外のソフトでも操作できるのでしょうか?    
【ニコニコ動画】【DDRマットで実況】 スペースチャンネル5 part2 - report1 『うらら再び!』


全く同じ発想で同じ遊び方をしている方を発見しましたので解決とさせていただきます。

キーコンフィグ普通に対応してそうですね。


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



Name: チルチル  ..熟練のプログラマー(55,824ポイント)   Date: 2009/10/04(日) 19:27   No:39976       
Title: コンストラクタで操作音の読み込みに失敗します    
添付ファイルのようなクラスを作って使用してみたのですが操作音が鳴ってくれません
操作音の読み込みはコンストラクタで行っているのですが失敗しているようです

再生するメンバ関数で読み込んでみると成功するので
パスが間違っていると言う事ではないようです

どうもインスタンスを作成する位置が問題のようです
main関数より前でクラスの作成と同時にインスタンス化しているのですが
サウンドファイルはどの段階から読み込む準備が整うのでしょうか?

main関数より前で読み込んでいますがDxLib_Initは先に呼んでいます
画像に関してはコンストラクタで読み込みに成功しています

環境は「Microsoft Visual C++ 2008 Express Edition」です


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


Name: Justy  ..伝説なるハッカー(434,556ポイント)   Date: 2009/10/04(日) 19:48   No:39978     
Title: Re:コンストラクタで操作音の読み込みに失敗します    

>DxLib_Initは先に呼んでいます

 DxLib_Initより後なら大丈夫なはず。
 ちなみにどうやって、Musicクラスのコンストラクタよりも先に
DxLib_Init関数を呼んでいますか?


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

Name: Justy  ..伝説なるハッカー(434,649ポイント)   Date: 2009/10/04(日) 19:50   No:39979     
Title: Re:コンストラクタで操作音の読み込みに失敗します    
 あれ?
 Musicクラスのコンストラクタで、Menuメンバへのアクセスをしていますが、
2つめの for文は配列の要素外にアクセスしていませんか?

 というかこれ、Soundメンバの間違いだったりしません?


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

Name: チルチル  ..熟練のプログラマー(55,988ポイント)   Date: 2009/10/04(日) 20:06   No:39983 解決!     
Title: Re:コンストラクタで操作音の読み込みに失敗します    
>ちなみにどうやって、Musicクラスのコンストラクタよりも先に
>DxLib_Init関数を呼んでいますか?

Musicクラスをインスタンスする前に
Protocolと言うクラスをインスタンスしています
そのコンストラクタの中で呼んでいます

>というかこれ、Soundメンバの間違いだったりしません?

まさに間違いでした・・
Soundに書き直したら動きました
まだ用意していないので上書きされていたようです

うわ〜これは恥ずかしいです
まだまだ修行が足りないですね・・

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


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



Name: ネス  ..ぴよぴよ(289ポイント)   Date: 2009/10/03(土) 21:33   No:39915       
Title: コンパイラについて    
OS:VISTA HOME BASIC
導入コンパイラ:MinGW

このような条件で環境設定を行っています。
環境変数なども市販のテキストどおりに行ったのですが、以下のようなメッセージが出ます。


installation problem, cannot exec `cc1':

一部ですが、どうも怪しいと思える部分は確かこんな感じでした。
Dドライブに入れて、パス指定もそこにしたのですが、何か問題があるのかもと思い、
Cドライブに入れ直しましたが、すべてテキスト通りに行ってもダメでした。

Borlandのコンパイラの導入には成功したので、そちらを今は使っています。
しかしせっかく購入したテキストがMinGWなので、ちょっと残念な感じがあり質問させてもらいました。

Borlandコンパイラはネットで何件も探し回ってどうにか導入に成功しましたが、
MinGWはちょっと手ごわい感じがしております。

皆さんのお力が必要です。






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


Name: Justy  ..伝説なるハッカー(434,441ポイント)   Date: 2009/10/03(土) 23:56   No:39929     
Title: Re:コンパイラについて    
 エラーの内容が最後までないので確実ではないかもしれませんが
何となく cc1.exeのある場所へのパスが通っていないのが原因のような感じがします。
 
 cc1.exeのある場所と PATHの設定を見直してみてはどうでしょうか。

 あと、Vistaと MinGWで検索するといろいろでて来ました。
 参考になれば。

VistaでMinGWとMSYSを使う - スローなキャンパスライフ
ttp://d.hatena.ne.jp/aKiRa/20080303/1204525536

MinGW on Vista - PukiWiki
ttp://www-online.kek.jp/~keibun/pukiwiki/index.php?MinGW%20on%20Vista

片っ端から忘れていけばいいじゃない。 VistaにMinGWを入れる場合の参考資料
ttp://0xc000013a.blog96.fc2.com/blog-entry-11.html

C言語のコンパイル方法がわかりません。 - Yahoo!知恵袋
ttp://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1014246535?fr=rcmd_chie_detail

Installing MinGW with Vista - CodeBlocks
ttp://wiki.codeblocks.org/index.php?title=Installing_MinGW_with_Vista


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

Name: たかぎ [URL]  ..ハッカー(111,973ポイント)   Date: 2009/10/03(土) 23:59   No:39930     
Title: Re:コンパイラについて    
MinGWは本家からダウンロードするといろいろと問題があるので、
http://www.tdragon.net/recentgcc/
のものが結構良い感じです。


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

Name: ネス  ..ぴよぴよ(456ポイント)   Date: 2009/10/04(日) 00:20   No:39931     
Title: Re:コンパイラについて    
お二人、レスありがとうございます。
頂いた情報を参考にさせてもらいます。
解決の報告は少し気長に待って貰えるとありがたいところです。
やりたいこと優先しがちな奴です。


超初心者ですが、ちなみに私が目指しているのは、ドラクエの名前入力画面あたりです。
ユーザーの答えに合わせて性格を言い当てたり、いかにもコンピューターといった感じが好きです。
楽器なんかも経験があるので、それを活かしてBGM化できたらな〜なんて思っています。
機材の知識とかないですけど。

余談になりましたが、情報ありがとうございます。
なお、他にも耳より情報ありましたら、他の皆さんもくださいね〜♪


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

Name: ネス  ..ぴよぴよ(530ポイント)   Date: 2009/10/04(日) 18:49   No:39975 解決!     
Title: Re:コンパイラについて    
とりあえずXPに入れてみたところ、テキスト通りでうまくいきました。

まだ調査不足ですが、今のところVISTAであることが理由の一つでは?と思います。

とはいえテキストではVISTAで説明しているので、そうなると上の部分は理由として足りない気もします。

いずれにせよ、とりあえず導入成功ということで、解決マークをつけさせてもらいました。


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



Name: チルチル  ..熟練のプログラマー(54,713ポイント)   Date: 2009/09/30(水) 20:14   No:39780       
Title: 配列引数のサイズを調べる    
void main(){
int a[20];
int i;

for ( i = 0 ; i < sizeof(a) / sizeof(int) ; i ++ )
a[i] = i;
}

上のように書くと配列の要素数だけループしますよね
しかし関数の引数に配列を渡した場合は先頭のアドレスが渡されるだけなので
sizeof演算子は要素数を返してくれません
何か良い方法は無いでしょうか?


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


Name: box  ..ハッカー(144,186ポイント)   Date: 2009/09/30(水) 20:47   No:39782     
Title: Re:配列引数のサイズを調べる    
要素数も引数に加えてあげてください。

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

Name: zwi  ..初心者(6,851ポイント)   Date: 2009/09/30(水) 20:54   No:39784     
Title: Re:配列引数のサイズを調べる    
こんな感じですかね。
void func(int a[],int size)
{
int i;
for ( i = 0 ; i < size ; i ++ )
a[i] = i;
}
}
int main(){
int a[20];
func(a,sizeof(a) / sizeof(int));
return 0;
}

ちなみに、呼び出しをこうする方法もあります。
#define FUNC(array) func((array),sizeof((array))/sizeof(int))
int main(){
int a[20];
FUNC(a);
return 0;
}


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

Name: チルチル  ..熟練のプログラマー(54,675ポイント)   Date: 2009/09/30(水) 21:22   No:39788     
Title: Re:配列引数のサイズを調べる    
あ〜すいません説明不足でした
要素数を別に渡さなくてもできる方法は無いでしょうか?


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

Name: zwi  ..初心者(6,944ポイント)   Date: 2009/09/30(水) 21:26   No:39789     
Title: Re:配列引数のサイズを調べる    
C言語の引数の受け渡しの仕組みでは無理です。
オブジェクト指向言語のJavaやC#なら言語仕様自体で配列の仕組みが違うので必要ないですが。
C++でもクラスを使えば擬似的には可能です。


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

Name: チルチル  ..熟練のプログラマー(54,696ポイント)   Date: 2009/09/30(水) 21:31   No:39790     
Title: Re:配列引数のサイズを調べる    
う〜ん無理ですか・・
ちなみに擬似的にとはどんな感じでしょうか?


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

Name: zwi  ..初心者(7,007ポイント)   Date: 2009/09/30(水) 21:34   No:39791     
Title: Re:配列引数のサイズを調べる    
STLのvectorを参照渡しで使います。
すいません、いま説明している時間が無いので検索してみてください。
分からなければ、明日またお答えします。


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

Name: チルチル  ..熟練のプログラマー(54,743ポイント)   Date: 2009/09/30(水) 21:43   No:39792     
Title: Re:配列引数のサイズを調べる    
あ〜残念ですが今回のコードはSTLとの相性が最悪なので無理そうですね・・
どうもありがとうございました


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

Name: array [URL]  ..熟練のプログラマー(56,959ポイント)   Date: 2009/09/30(水) 21:49   No:39793     
Title: Re:配列引数のサイズを調べる    
配列の要素数は一般的に以下の形式が多用されてるみたいです。

int main() {
int array[20];

// num は20になる
int num = sizeof( array ) / sizeof( array[0] );

return 0;
}
また、define定義を用いれば

#define array_sizeof(p) ( sizeof( p) / sizeof( (p)[0] ) )

int main() {
int array[20];

// num は20になる
int num = array_sizeof(array);

return 0;
}



これでプログラムがすっきりすると思います。


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

Name: array [URL]  ..熟練のプログラマー(57,086ポイント)   Date: 2009/09/30(水) 21:56   No:39794     
Title: Re:配列引数のサイズを調べる    
本文読み直したら、勘違いしていました^^;

関数に配列を渡しても、要素数は引き継げないっていう話でしたね・・・・申し訳ないです。

関数先にC++のテンプレートを用いれば、要素数も引き継いでくれるのですが、一応解決された
みたいなのでまたの機会に。


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

Name: チルチル  ..熟練のプログラマー(54,783ポイント)   Date: 2009/09/30(水) 21:57   No:39795     
Title: Re:配列引数のサイズを調べる    
これは結構画期的ですね
まあ呼ぶ時には確定しているので定数で行ってみます


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

Name: GPGA  ..熟練のプログラマー(65,961ポイント)   Date: 2009/10/01(木) 14:58   No:39820     
Title: Re:配列引数のサイズを調べる    
C++でtemplateを使用すれば、引数をサイズを渡す必要はありません。

#include <iostream>

template<class T, int N>
void func(T (&ar)[N]) {
for (int i = 0; i < N; ++i) {
std::cout << ar[i] << std::endl;
}
}

int main() {
int data[] = { 0, 1, 2, 3 };
func(data);
}




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

Name: たかぎ [URL]  ..ハッカー(111,311ポイント)   Date: 2009/10/01(木) 17:06   No:39823     
Title: Re:配列引数のサイズを調べる    
C++の次期規格であれば...

template <typename T, std::size_t N>
constexpr std::size_t count(T (&arg)[N])
{
return N;
}

とすれば、定数式として扱うこともできますね。


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

Name: チルチル  ..熟練のプログラマー(55,141ポイント)   Date: 2009/10/01(木) 17:08   No:39824     
Title: Re:配列引数のサイズを調べる    
これも使えそうですね
どういう仕組みになっているのでしょうか?
解説サイトとかあったら教えてください


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

Name: Justy  ..伝説なるハッカー(432,251ポイント)   Date: 2009/10/01(木) 21:30   No:39829     
Title: Re:配列引数のサイズを調べる    

>解説サイトとかあったら教えてください

 少し古い記事ですが

テンプレート引数の一致
ttp://msdn.microsoft.com/ja-jp/library/cc440189(VS.71).aspx


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

Name: チルチル  ..熟練のプログラマー(55,277ポイント)   Date: 2009/10/01(木) 23:17   No:39831     
Title: Re:配列引数のサイズを調べる    
う〜ん良くわかりませんでしたね・・

ちなみに
template<class T, int N>
のclassとintの違いは何でしょうか?

あとTに入る型が全て同じの場合に
Nだけにする事はできないでしょうか?


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

Name: 組木紙織  ..比類無きプログラマー(70,840ポイント)   Date: 2009/10/02(金) 00:04   No:39832     
Title: Re:配列引数のサイズを調べる    
>あとTに入る型が全て同じの場合に
>Nだけにする事はできないでしょうか?

部分特殊化を使えばOK.

#include <iostream>
using namespace std;

//int 型バージョン
template<std::size_t N>
void func(int (&ar)[N])
{
std::cout << "int " << std::endl;
for(int i=0; i<N;++i){
std::cout << ar[i] << std::endl;
}
}

//なんでも型バージョン
template<class T, std::size_t N>
void func(T (&ar)[N]) {
std::cout << "not int" << std::endl;
for (int i = 0; i < N; ++i) {
std::cout << ar[i] << std::endl;
}
}

int main() {
//int型の配列
int data[] = { 0, 1, 2, 3 };
//const int型の配列
const int data2[]={0, 1, 2, 3};
func(data);
func(data2);
return 0;
}



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

Name: チルチル  ..熟練のプログラマー(55,559ポイント)   Date: 2009/10/02(金) 01:32   No:39834     
Title: Re:配列引数のサイズを調べる    
これは良いですね、最初に比べてかなり短くなりました
template<int N>

int Draw(int (&Graph)[N]){
int i;
for( i=0;i<N;i++ );
return i;
}
これは練習で作った関数ですが
どこまで短くできるか気になりますね

そこで
>template<int N>
>(int (&Graph)[N])
ここをもっと短く書けないでしょうか?

あとテンプレートの柔軟性に期待して
関数を呼ぶ前に配列を作成しないで
引数の(と)の中に数値や変数を並べて渡せないでしょうか?

つまり
Draw({1,2,3,4,5});
見たいな事はできないでしょうか?


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

Name: 組木紙織  ..比類無きプログラマー(71,075ポイント)   Date: 2009/10/02(金) 02:55   No:39835     
Title: Re:配列引数のサイズを調べる    
>これは練習で作った関数ですが
>どこまで短くできるか気になりますね
意図が見えないのですが、
ループ回さずにreturn N;
で十分なような気が。。。
テンプレートのところは短くできないです。


>Draw({1,2,3,4,5});
>見たいな事はできないでしょうか?

次期C++ならできるような気もしますが、現在はマクロを併用して擬似的にするしかないのかな、
配列を引数にと考えなければ可長変引数を使えばできますけど、安全性に不安が出てきますね。


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

Name: たかぎ [URL]  ..ハッカー(111,330ポイント)   Date: 2009/10/02(金) 07:40   No:39837     
Title: Re:配列引数のサイズを調べる    
> 部分特殊化を使えばOK.

関数テンプレートの部分特殊化はできないので、これは単なる多重定義ですね。


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

Name: チルチル  ..熟練のプログラマー(55,658ポイント)   Date: 2009/10/02(金) 17:26   No:39855     
Title: Re:配列引数のサイズを調べる    
簡略化はこの辺が限界みたいですね
でも当初の目的は達せたので助かりました

これから実装してみるので少々お待ちください

ちなみに
>現在はマクロを併用して擬似的にするしかないのかな
これはどんな感じでしょうか?


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

Name: たかぎ [URL]  ..ハッカー(111,430ポイント)   Date: 2009/10/02(金) 17:32   No:39856     
Title: Re:配列引数のサイズを調べる    
こんな風にして定数式にすることもできます。

template <typename T, std::size_t N>
char (*count_helper(T (&array)[N]))[N];

#define count(array) sizeof(*count_helper(array))

マクロであること自体も問題点を除けば、結構優れものかもしれません。


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

Name: チルチル  ..熟練のプログラマー(55,674ポイント)   Date: 2009/10/02(金) 17:48   No:39858     
Title: Re:配列引数のサイズを調べる    
う〜ん良くわからないですね・・
どんな感じで使うのでしょうか?


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

Name: たかぎ [URL]  ..ハッカー(111,481ポイント)   Date: 2009/10/02(金) 20:58   No:39870     
Title: Re:配列引数のサイズを調べる    
> どんな感じで使うのでしょうか?

そんなに難しく考える必要はありません。

int a[7];
std::size_t n = count(a);

とすれば、nに7が代入されるはずです。


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

Name: チルチル  ..熟練のプログラマー(55,619ポイント)   Date: 2009/10/02(金) 21:04   No:39871     
Title: Re:配列引数のサイズを調べる    
なるほど、確かにそうなる気がしますね
しかしこれでDraw({1,2,3,4,5});
が擬似的に実現できるのでしょうか?


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

Name: たかぎ [URL]  ..ハッカー(111,583ポイント)   Date: 2009/10/02(金) 21:41   No:39874     
Title: Re:配列引数のサイズを調べる    
> しかしこれでDraw({1,2,3,4,5});
> が擬似的に実現できるのでしょうか?

それを目指したものではありません。

Draw({1, 2, 3, 4, 5})を実現するには、C99かC++の次期標準でなければ無理です。GCCでも何とかなります。
多少シンタックスを変えてもよいなら実現することは可能ですが、オーバーヘッドが大きくなります。


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

Name: チルチル  ..熟練のプログラマー(55,661ポイント)   Date: 2009/10/02(金) 21:48   No:39875     
Title: Re:配列引数のサイズを調べる    
これは無理ですか・・

Draw({1,2,3,4,5});は無理だとしても
予め配列を作成しておかなくても良いような方法は無いでしょうか?


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

Name: たかぎ [URL]  ..ハッカー(111,919ポイント)   Date: 2009/10/02(金) 22:15   No:39876     
Title: Re:配列引数のサイズを調べる    
> Draw({1,2,3,4,5});は無理だとしても
> 予め配列を作成しておかなくても良いような方法は無いでしょうか?

要素数の上限があらかじめ決まっているのであれば、make_tupleを使う方法もありますし、

template <typename T> void Draw(const T& e1);
template <typename T> void Draw(const T& e1, const T& e2);
template <typename T> void Draw(const T& e1, const T& e2, const T& e3);
...

のように、数だけ多重定義しておく方法もあります。

可変個数引数を使う方法もありますが、あまりお勧めはしません。


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

Name: チルチル  ..熟練のプログラマー(55,705ポイント)   Date: 2009/10/02(金) 22:20   No:39877     
Title: Re:配列引数のサイズを調べる    
う〜んこういうのは無理がありそうですね・・

実装しているうちに何か変わるかもしれませんから色々やってみます


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

Name: チルチル  ..熟練のプログラマー(55,721ポイント)   Date: 2009/10/03(土) 16:14   No:39903 解決!     
Title: Re:配列引数のサイズを調べる    
うまく行きました
どうもありがとうございます


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

Name: 組木紙織  ..比類無きプログラマー(71,153ポイント)   Date: 2009/10/04(日) 18:38   No:39973     
Title: Re:配列引数のサイズを調べる    
遅くなってしまいましたが、

>> 部分特殊化を使えばOK.

>関数テンプレートの部分特殊化はできないので、これは単なる多重定義ですね。

正しくないことを書いてしまってすみませんでした。


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



Name: 山崎  ..プログラマー(27,444ポイント)   Date: 2009/10/04(日) 16:22   No:39962       
Title: vector standard header内でのエラー    
毎度お世話になっております。
この度は、vector standard header内でのエラーについてお伺いに参りました。
エディタはVisual Studio2008を使っています。

現在、今までint**に動的にメモリを確保して2次元配列にしてマップにしていたのを、
vectorにマップのデータを格納するように書きなおす作業をしております。

デバッグ中に、
0x7c812afb でハンドルされていない例外が発生しました: Microsoft C++ の例外: std::out_of_range (メモリの場所 0x0012f670)
という見慣れたエラーが発生します。
vectorの要素数よりも大きなインデックスを指定したんだろうなということはわかるんですが、
エラーを出した行がvector standard header内に一気に飛んでしまうので、
自分で作ったどのコードによるエラーなのかがわかりません。
ちなみに、エラー箇所はvector standard headerの
_THROW(out_of_range, "invalid vector<T> subscript");
の行を指しています。
実行してきたコードを逆に一行ずつたどっていく、というような仕組みでもあればいいのですが…。

このマップのデータを格納したvectorはグローバルでいろんな場所で使われていて、
マップを描画するときなどはfor文によって何百回と呼び出されますし、
フィールドに置いてあるたくさんのオブジェクトや敵もこのデータを使って行動しています。
一行ずつステップ実行していってエラー箇所を実行するまで探す、
というのは非常に手間がかかってしまいます。

このvectorによるエラーが自分で作ったコードのどの行で起こったのか、
効率よく調べる方法はあるのでしょうか。
それとも、ステップ実行してエラー箇所を探すなど地道な方法しかないでしょうか。


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


Name: 御津凪 [URL]  ..ハッカー(116,131ポイント)   Date: 2009/10/04(日) 16:33   No:39964     
Title: Re:vector standard header内でのエラー    
エラーが発生し、vector standard header内に飛んだ状態で、
メニューの デバッグ→ウインドウ→呼び出し履歴
を選択する(あるいはショートカットキー Alt+7 を押す)と、
現在の関数の呼び出した履歴が表示されますので、
自分で作ったコードの場所でダブルクリックすればそこに場所が移るので、
そこでエラーが発生した場所を把握できます。
(エラーによっては表示されない場合もあります)


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

Name: 山崎  ..プログラマー(27,309ポイント)   Date: 2009/10/04(日) 16:39   No:39965 解決!     
Title: Re:vector standard header内でのエラー    
>御津凪さん
非常に素早いご返信、本当にありがとうございます。
御津凪さんのおっしゃる通りにやってみたところ、見事にエラーが判明しました。
こんな方法があったのかと感動すると同時に、VisualStudioを分かっていない自分が恥ずかしいです。

本当にどうもありがとうございました。


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



Name: ラグ  ..初心者(6,204ポイント)   Date: 2009/10/02(金) 20:46   No:39868       
Title: リプレイの実装について    
いつもお世話になっております。

龍神録を改造してリプレイを実装しようと思いました。
ttp://www.play21.jp/board/formz.cgi?action=res&resno=22359&page=&lognum=70&id=dixq&rln=22441
などを参考に下記のように組んでみたのですが、いまいちうまく動きません。


まず構造体など。
replay構造体に、録画時に選択した難易度・機体などといった情報を記録します。
replay_key[REPLAY_MAX_TIME]に毎フレームのキー情報を記録します。REPLAY_MAX_TIMEは適当な値を入れておきます。

//リプレイに関する構造体
typedef struct{
int key; //キー保存用
int mode; //リプレイモード
int cnt; //カウント
int difficulty;//難易度
int life,bom_number;//初期ライフ、初期ボム数
int bomknd,charflag,mshotknd; //ボム種類、キャラ種類、メインショット種類
int seed; //乱数の種
}replay_t;

GLOBAL replay_t replay;//リプレイ構造体
GLOBAL unsigned char replay_key[REPLAY_MAX_TIME]; //リプレイキー情報


次にリプレイの録画・再生の関数です。
これをメインループで呼び、reply.cntをインクリメントして毎フレーム毎にreplay_key[replay.cnt]に録画・再生します。
replay.modeが0で録画、1で再生になります。

void replay_main(int mode){
switch(mode){
case 0://録画時
replay_key[replay.cnt] = 0;
if(CheckStatePad(configpad.left)>0) replay_key[replay.cnt] |= 0X01;
if(CheckStatePad(configpad.up)>0) replay_key[replay.cnt] |= 0X02;
if(CheckStatePad(configpad.right)>0) replay_key[replay.cnt] |= 0X04;
if(CheckStatePad(configpad.down)>0) replay_key[replay.cnt] |= 0X08;
if(CheckStatePad(configpad.shot)>0) replay_key[replay.cnt] |= 0X10;
if(CheckStatePad(configpad.bom)>0) replay_key[replay.cnt] |= 0X20;
if(CheckStatePad(configpad.slow)>0) replay_key[replay.cnt] |= 0X40;
break;
case 1://再生時
replay.key=replay_key[replay.cnt];
break;
default:
break;
}
}


ゲーム中に使うボタンは上下左右+ショット+ボム+低速(あとスタートボタン)だけですので、replay_key配列をunsigned char型にし、
各ボタンを押すとそれぞれのビットを立てて、それを記録すればよいのではないかと考えました。
続いてファイルへの書き込み・読み込みです。

char *g_replay = "../dat/replay/replay_data.dat"; // replay_data.dat(リプレイファイル)
FILE *rp;

void replay_load(){
if( ( rp = fopen( g_replay, "rb" ) ) == NULL ) {
printf("ファイルオープンエラー\n");
}
else{
//ファイルからデータを読み込む
fread( &replay, sizeof(replay_t), 1, rp ) ;
fclose( rp );//解放
}
}

void replay_save(){
if((rp = fopen( g_replay, "wb" )) == NULL){
printf("ファイルオープンエラー\n");
}
else{
fwrite( &replay, sizeof(replay_t), 1, rp );
fclose( rp );
}
}

char *k_replay = "../dat/replay/replay.dat"; // replay.dat(リプレイキーファイル)
FILE *kp;

void replaykey_load(){
if( ( kp = fopen( k_replay, "rb" ) ) == NULL ) {
printf("ファイルオープンエラー\n");
}
else{
//ファイルからデータを読み込む
fread( replay_key, sizeof(unsigned char), REPLAY_MAX_TIME, kp ) ;
fclose( kp );//解放
}
}

void replaykey_save(){
if((kp = fopen( k_replay, "wb" )) == NULL){
printf("ファイルオープンエラー\n");
}
else{
fwrite( replay_key, sizeof(unsigned char), REPLAY_MAX_TIME, kp );
fclose( kp );
}
}


この方法だとファイルが二つ必要になりますが、他にうまい方法を見つけられませんでした。
ゲーム開始前に難易度や機体種類などの情報をreplay構造体にそれぞれ入れておき、ゲーム(STG部分)終了時にreplay_save()とreplaykey_save()を呼び出して記録します。
(長すぎると怒られたので次に続きます)


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


Name: ラグ  ..初心者(7,512ポイント)   Date: 2009/10/02(金) 20:48   No:39869     
Title: Re:リプレイの実装について    
(続きです)
そして、リプレイ再生時の初期化の際にreplay_load()とreplaykey_load()を呼び出します。
再生時はreplay_main(int mode)内でreplay_key[replay.cnt]のキー情報をreplay.keyに毎フレーム渡します。
それから、龍神録プログラミングの館8章のGetHitPadStateAll()にリプレイ再生時の場合を追加します。

void GetHitPadStateAll(){
int i,PadInput,mul=1;
if(replay.mode==1 ){//リプレイの再生のフラグが立っている場合は
PadInput = replay.key;

for(i=0;i<16;i++){
if(PadInput & mul) pad.key[i]++;
else pad.key[i]=0;
mul*=2;
}

if(PadInput & 0X01) pad.key[configpad.left];
if(PadInput & 0X02) pad.key[configpad.up];
if(PadInput & 0X04) pad.key[configpad.right];
if(PadInput & 0X08) pad.key[configpad.down];
if(PadInput & 0X10) pad.key[configpad.shot];
if(PadInput & 0X20) pad.key[configpad.bom];
if(PadInput & 0X40) pad.key[configpad.slow];

return;//リプレイの場合ここまで
}

if(replay.mode==0){
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));
}
}


実は、replay_key配列をint型にし、録画時にreplay_key[replay.cnt]=GetJoypadInputState(DX_INPUT_KEY_PAD1);として、
再生時にはGetHitPadStateAll()内でif(replay.mode==1)PadInput = replay.keyとすることで
録画・再生には一応成功しています(怪しい動きも多いですが)。
しかしファイル容量が大きすぎるため、型をunsigned charにして出来ないか色々試しましたが、
うまくいきませんでした。
キー情報を記録する配列をunsugned char型のまま、うまくリプレイを録画・再生出来ないでしょうか。
他にも何かありましたら、是非お教えください。
よろしくお願いします。
環境はXP SP3、VC++2008EE、DXライブラリを使用しています。


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

Name: Justy  ..伝説なるハッカー(432,660ポイント)   Date: 2009/10/03(土) 16:29   No:39904     
Title: Re:リプレイの実装について    

>この方法だとファイルが二つ必要になりますが、


fwrite( &replay, sizeof(replay_t), 1, rp );
    fwrite( replay_key, sizeof(unsigned char), REPLAY_MAX_TIME, kp );

で書き込み、

    fread( &replay, sizeof(replay_t), 1, rp ) ;
    fread( replay_key, sizeof(unsigned char), REPLAY_MAX_TIME, kp )

で読み込みとすればファイルは1つで済みます。




>うまくリプレイを録画・再生出来ないでしょうか

 よくわからないところがあるのですが、 GetHitPadStateAll() replay.mode==1 のとき、
if(PadInput & 0X01) pad.key[configpad.left]; は何をしているのでしょうか?


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

Name: ラグ  ..初心者(8,323ポイント)   Date: 2009/10/03(土) 20:47   No:39914     
Title: Re:リプレイの実装について    
>Justyさん

>
> >この方法だとファイルが二つ必要になりますが、
>

>
> fwrite( &replay, sizeof(replay_t), 1, rp );
>     fwrite( replay_key, sizeof(unsigned char), REPLAY_MAX_TIME, kp );
>

> で書き込み、
>
>     fread( &replay, sizeof(replay_t), 1, rp ) ;
>     fread( replay_key, sizeof(unsigned char), REPLAY_MAX_TIME, kp )
>

> で読み込みとすればファイルは1つで済みます。

すみません、Justyさんが書いて下さったこのコードですが、私が書いたのと同じように見えます。
不勉強なのでよくわからないのですが、これは例えば、


char *g_replay = "../dat/replay/replay_data.dat"; // replay_data.dat(リプレイファイル)
FILE *rp;
char *k_replay = "../dat/replay/replay.dat"; // replay.dat(リプレイファイル)
FILE *kp;

void replay_load(){
//ファイルからデータを読み込む
fread( &replay, sizeof(replay_t), 1, rp ) ;
fread( replay_key, sizeof(unsigned char), REPLAY_MAX_TIME, kp ) ;
fclose( rp );//解放
fclose( kp );//解放
}

void replay_save(){
fwrite( &replay, sizeof(replay_t), 1, rp );
fwrite( replay_key, sizeof(unsigned char), REPLAY_MAX_TIME, kp );
fclose( rp );
fclose( kp );
}


のように、同じ関数内で書き込みもしくは読み込みを行えばよいということでしょうか。
調べてみたのですがやはりわからず…申し訳ないのですが、もっと教えて頂けないでしょうか。


>
> >うまくリプレイを録画・再生出来ないでしょうか
>

>  よくわからないところがあるのですが、 GetHitPadStateAll() replay.mode==1 のとき、
> if(PadInput & 0X01) pad.key[configpad.left]; は何をしているのでしょうか?
>

ここについては、まずreplay.mode==0以下の
input_pad_or_key(&pad.key[configpad.left] ,CheckStateKey(KEY_INPUT_LEFT ));
において、input_pad_or_keyという関数がありまして、これを見てみると


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



と書かれていました。
なので、結局のところキー情報をpad.key[]内に入れれば動いてくれるものと考えました。
また、リプレイ中はパッドやキーボードを触っても、リプレイ中の自機がそれにつられて動いたりしないようにしたいので、 if(PadInput & 0X01) pad.key[configpad.left];
においては、例えばPadInputの第1ビットが立っているなら左に動いて欲しいので、 if(PadInput & 0X01) pad.key[configpad.left];
としました。

ちなみに、同じKey.cpp内でpad構造体が宣言されております。

//パッドに関する構造体
typedef struct{
int key[PAD_MAX];
}pad_t;


PAD_MAXは16になっています。
お手数をおかけしますが、よろしくお願いします。


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

Name: Justy  ..伝説なるハッカー(434,227ポイント)   Date: 2009/10/03(土) 21:47   No:39917     
Title: Re:リプレイの実装について    

>同じ関数内で書き込みもしくは読み込みを行えばよいということでしょうか

 あー、そのままコピペしてたんで少し間違っていました。
 同じ関数内で、というのはその通りですが、FILEポインタは1つです。


static const char replayFilePath[] = "../dat/replay/replay.dat";
void replay_load()
{
    FILE *fp = fopen( replayFilePath, "rb" );
    if(!fp) return;
    
    fread( &replay, sizeof(replay_t), 1, fp ) ;
    fread( replay_key, sizeof(unsigned char), REPLAY_MAX_TIME, fp ) ;
    fclose( fp );
}

void replay_save()
{
    FILE *fp = fopen( replayFilePath, "wb" );
    if(!fp) return;
    
    fwrite( &replay, sizeof(replay_t), 1, fp );
    fwrite( replay_key, sizeof(unsigned char), REPLAY_MAX_TIME, fp );
    fclose( fp );
}

ってところでしょうか。



if(PadInput & 0X01) pad.key[configpad.left];

 この行をよくみてください。
 これは if文が真だったとき、関数を呼び出しているわけでもなく、pad.key[]の中身を
書き換えているわけでもなく、だた配列があるだけです。

 別の例でいうと

    int a[2];
    a[0];
    a[1];

としているようなもので、全く意味がありません。


 龍神録はあまり詳しくはないのですが、リプレイ情報を受けた PadInputから pad.keyに情報を反映するなら

    if(PadInput & 0x01) pad.key[configpad.left]++;
    else                pad.key[configpad.left] = 0;

のようにしないと正しく反映されないと思われます。


 ついでにいえば、

        for(i=0;i<16;i++){
            if(PadInput & mul)  pad.key[i]++;
            else                pad.key[i]=0;
            mul*=2;
        }

このあたりの処理もリプレイ時はまずそうです。

 ここでの pad.key[]への操作はコンフィグ情報を一切考慮していませんし、
同じことをすぐ下のところでやろうとしているはずです(今はうまく動いていませんが)。

 このあたり処理を見直して見た方がいいかと思います。


 とはいえ、これだけで unsugned char型の時うまくリプレイを録画・再生できない現象が直る、
とはいえないので、まずはこれらを直してみて、それでもうまくいかないようでしたら
その時のコードと、どううまくいかなかったのか等を書いて再質問をしてください。


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

Name: ラグ  ..中級者(10,053ポイント)   Date: 2009/10/04(日) 13:26   No:39950 解決!     
Title: Re:リプレイの実装について    
>Justyさん

結論から言いますと、Justyさんの教えてくださった通りに書いたところ、やりたかったように動いてくれました。
Justyさん、ありがとうございます。

まず、ファイルは無事ひとつにまとめることが出来ました。
こんな方法があるとは知らず、とても勉強になりました。

次に、Key.cpp内のvoid GetHitPadStateAll()は下のようになりました。
func_stateというのはメインループ内でゲームの状態を判別するために使用されており、ゲーム(STG部分)メインが100、一時停止が101、コンティニュー状態が102になっています。


void GetHitPadStateAll(){
int i,PadInput,mul=1;
int PadInput2;

if(replay.mode==1 &&
(func_state!=101 || func_state!=102)){//リプレイの再生のフラグが立っている場合は
PadInput = replay.key;
PadInput2= GetJoypadInputState( DX_INPUT_PAD1 );

if(PadInput & 0X01) pad.key[configpad.left]++; else pad.key[configpad.left]=0;
if(PadInput & 0X02) pad.key[configpad.up]++; else pad.key[configpad.up]=0;
if(PadInput & 0X04) pad.key[configpad.right]++; else pad.key[configpad.right]=0;
if(PadInput & 0X08) pad.key[configpad.down]++; else pad.key[configpad.down]=0;
if(PadInput & 0X10) pad.key[configpad.shot]++; else pad.key[configpad.shot]=0;
if(PadInput & 0X20) pad.key[configpad.bom]++; else pad.key[configpad.bom]=0;
if(PadInput & 0X40) pad.key[configpad.slow]++; else pad.key[configpad.slow]=0;

if(PadInput2 & 128) pad.key[configpad.start]++;
else pad.key[configpad.start]=0;
input_pad_or_key(&pad.key[configpad.start] ,CheckStateKey(KEY_INPUT_ESCAPE ));

}

if(replay.mode==0 ||
(replay.mode==1 && func_state==101)){
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));
}
}


Justyさんのご指摘通り、
if(PadInput & 0X01) pad.key[configpad.left];
のような箇所を
if(PadInput & 0X01) pad.key[configpad.left]++; else pad.key[configpad.left]=0;
といったように書き換えたところ、うまくいきました。
pad.key[]に値を入れなければいけなかったようです。
また、リプレイ再生中にも一時停止が出来るよう、

PadInput2= GetJoypadInputState( DX_INPUT_PAD1 );

if(PadInput2 & 128) pad.key[configpad.start]++;
else pad.key[configpad.start]=0;
input_pad_or_key(&pad.key[configpad.start] ,CheckStateKey(KEY_INPUT_ESCAPE ));

という処理をreplay.mode==1のときに追加しました。
これでリプレイ再生中(STG部分)はパッドのスタートボタンとキーボードのEsc以外に反応しなくなり、
その上で一時停止中はちゃんとパッドやキーボードに反応するようになりました。

時々リプレイがずれたり、他にも実装したいリプレイ機能はありますが、これでとりあえずはちゃんと録画・再生されるリプレイが出来ました。
一人で考えていたら全く出来なかったかもしれません。
Justyさんには重ねて御礼申し上げます。
本当にありがとうございました。
これからも勉強していきたいと思います。


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



Name: うっそ  ..かけだし(1,358ポイント)   Date: 2009/10/03(土) 21:46   No:39916       
Title: キャラクターの移動について    
はじめまして、ウッソと申します。

早速ですが、質問の方に。

ゲームプログラミングの館を参考にプログラムの練習を
しているのですが、ゲーム基本編の「キャラをキー入力によって移動させる。」
という項目で、キャラクターが常に一定の速度で動いていますが、
この速度はどうやって決まっているのでしょうか?

関数ScreenFlipの呼び出し回数を2回に1回にしたところ、
キャラクターの移動が早くなりましたが、描画の回数を減らすと
処理速度が上がるということなのでしょうか・・・。


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


Name: ランド  ..初心者(5,538ポイント)   Date: 2009/10/03(土) 23:26   No:39925     
Title: Re:キャラクターの移動について    
> DrawGraph( ch.x , ch.y , ch.img , TRUE ) ;

この関数が、第三引数のハンドル( ch.img )が示す画像を描画する関数ですが、
その位置は第一,第二引数( ch.x , ch.y )で決定されています。

つまり、この数値2つを変化させることで移動を行うことができます。

次に下記の部分で、ch.xを変動させています。

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


この ch.x++ ; の部分を変更すると、速度が変化します。

変更例:
 ch.x = ch.x+2 ; (または ch.x += 2 ;)



> 処理速度が上がるということなのでしょうか・・・。
時間に対する描画処理を半分に減らしたのですから、1ループの平均処理速度は上がります。
もちろん、その分画面の更新速度も遅くなっています。


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

Name: うっそ  ..かけだし(1,400ポイント)   Date: 2009/10/03(土) 23:50   No:39928 解決!     
Title: Re:キャラクターの移動について    
> ランド様
ありがとうございました!

座標の移動を増やせば進む速度が上がりますよね・・・。
単純なことでした。


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



Name: ちゃお  ..ぴよぴよ(261ポイント)   Date: 2009/10/03(土) 22:34   No:39921       
Title: 追尾型オプションのアルゴリズム    
スーパーファミコンのグラディウス3の追尾型オプションで、キャラクターの動きをトレースして動くオプションのアルゴリズムが思いつきません。

自機のx座標、y座標を常にバッファに格納して、そのバッファをオプションが読み込んでいくのだろうと考えていますが、プログラムでは、どのタイミングで読み込んだりしたら、いいのかなど、なかなか思いつきません。

カウント変数を作って、自機が動いたときだけ、バッファに格納して、止まっているときはバッファに格納しないようにするようにカウントを工夫するなどが考えていますが・・・。

ご教授願います。


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


Name: ねこ  ..熟練のプログラマー(43,399ポイント)   Date: 2009/10/03(土) 23:10   No:39924     
Title: Re:追尾型オプションのアルゴリズム    
double arrX[50];
double arrY[50];
というような過去座標を保持する変数を持たせておき

// 0.1ドット以上動いたら
if( fabs( player.x - arrX[0] ) > 0.1 || fabs( player.y - arrY[0] ) > 0.1 ) {
for( int ii = 0; ii < 50; ii++ ){
int idx = 50 - ii - 1;
arrX[ idx ] = arrX[ idx - 1 ];
arrY[ idx ] = arrY[ idx - 1 ];
}
arrX[ 0 ] = player.x;
arrY[ 0 ] = player.y;
}

とりあえず50個分くらい保持しておいて
option1.x = arrX[ 10 ];
option1.y = arrY[ 10 ];
option2.x = arrX[ 20 ];
option2.y = arrY[ 20 ];
みたいな感じにしておくとプレイヤーが動くたびに座標が更新されるのでカウントとか気にしないで済みます。

初期化時は0〜49にプレイヤー座標を詰めるのをお忘れなく。


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

Name: ちゃお  ..ぴよぴよ(332ポイント)   Date: 2009/10/03(土) 23:36   No:39926     
Title: Re:追尾型オプションのアルゴリズム    
ねこさんありがとうございます。

プログラム使わせていただきました。
思ったとおりの動きになりました。
すごいです。

最高です。


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

Name: ちゃお  ..ぴよぴよ(342ポイント)   Date: 2009/10/03(土) 23:37   No:39927 解決!     
Title: Re:追尾型オプションのアルゴリズム    
解決しました。

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



Name: array [URL]  ..熟練のプログラマー(57,402ポイント)   Date: 2009/10/03(土) 16:56   No:39906       
Title: templateの宣言部と定義部を分ける    
C++におけるnamespaceとtemplateを用いて、宣言部と定義部を*.h、*.cppに分けて、*.hをインクルードすれば使えるようにしたいと考えています。

エラーメッセージは以下の通りです。

error LNK2019: 未解決の外部シンボル

エラーについて調べてみると、宣言を定義している.libがリンクされていないのが原因と書いてるのですが
コンパイルテストをしていると、templateを用いて使用するとエラーになっているみたいなので、リンクは
できているみたいです。

とりあえず、意味の無いエラー確認用のプログラムですが、アドバイスもらえるとありがたいです。

main.cpp(実行部) --------------------------------------------------
#include <iostream>
#include "test.h"

int main()
{
int d = 10;

test::Flag( d );

return 0;
}



test.h(宣言部) ----------------------------------------------------
#pragma once

namespace test {
template<typename T> bool Flag( T& target );
};


test.cpp(定義部) --------------------------------------------------
#include <iostream>
#include "test.h"

template<typename T>
bool test::Flag( T& target ) {
return true;
}


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


Name: たいちう  ..プログラマー(33,944ポイント)   Date: 2009/10/03(土) 18:22   No:39910     
Title: Re:templateの宣言部と定義部を分ける    
テンプレートの実装はヘッダーファイルに書きましょう。
それが決まりです。

# と思ったら、ソースファイルに書くことができる場合もあるらしい。
# それでもお勧めはしませんけれど。
# http://d.hatena.ne.jp/ymotongpoo/20080115/1200373530


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

Name: 御津凪 [URL]  ..ハッカー(115,942ポイント)   Date: 2009/10/03(土) 18:23   No:39911     
Title: Re:templateの宣言部と定義部を分ける    
現状のコンパイラではテンプレートを外部に定義(.objに分ける)することは出来ないようです。

それについての詳細などはこちらの記事に載ってます。
ttp://fc2myblog.blog10.fc2.com/blog-entry-78.html


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

Name: array [URL]  ..熟練のプログラマー(57,429ポイント)   Date: 2009/10/03(土) 18:45   No:39912 解決!     
Title: Re:templateの宣言部と定義部を分ける    
たいちうさん、御津凪さん有難うございます。勉強になりました♪

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

Name: Justy  ..伝説なるハッカー(433,026ポイント)   Date: 2009/10/03(土) 19:30   No:39913     
Title: Re:templateの宣言部と定義部を分ける    
 解決済みですが、一応補足を。

 言語的には、その例でいうとtypenameの Tの型にどんな種類があるのか判っているなら、
templateの実装が cpp側にあったとしても明示的に実体化を行うことでリンクを通すこともできます。

 test.cpp側の適当なところに template bool test::Flag(int&); を入れてみてください。

 これで int型に関してはリンクが通ります。
 int型以外の型……例えば floatにも対応するなら、 template bool test::Flag(float&); のように書いていけばうまくいきます。

テンプレート関数の明示的な実体化 - パソコン・メモメモ備忘録
ttp://d.hatena.ne.jp/umonist/20080730/p3


 まぁ実際には事前に使う型が判っていないといけない、というのもあって
使いどころが微妙ですが……。


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

Name: array [URL]  ..熟練のプログラマー(57,482ポイント)   Date: 2009/10/03(土) 22:42   No:39923     
Title: Re:templateの宣言部と定義部を分ける    
Justyさん、補足有難うございます。

URL先にも書いてある通り、ヘッダと定義部を分けないといけない場合が出てくるかもしれないので
覚えておきます


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



Name: ようすけ  ..初心者(5,712ポイント)   Date: 2009/09/30(水) 00:22   No:39763       
Title: 続 シューティングできました!!    
お邪魔します。

以前にこちらのサイトで公開させてもらったシューティングゲームの続編が出来ました。

アップローダさま

http://kissho3.xii.jp/100/src/1kichi12579.zip.html

DLKEY 0111 (全角で)

全3ステージ、難易度的にはボス戦以外はやさしいと思います。

結局CとWINAPIだけで全部作りました(汗)

あと、簡易的ではありますがホームページも作って、
インターネットスコアランキングも実装してみました。

PerlでCGIを自作。
Perl自体まったく知らなかったので、ゼロから勉強してつくりました。

セキュリティの面などはまだまだ改善しますが、
スコアに興味ある人もない人もぜひ一度参加してみてください。

バグやゲームの感想など頂けると幸いです。


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


Name: 田所  ..ぴよぴよ(13ポイント)   Date: 2009/09/30(水) 17:36   No:39775     
Title: Re:続 シューティングできました!!    
やらせてもらいました。
ゲームの感想としてはなかなか楽しかったです。
バグなどは特に見当たらなかったと・・・。

あと、スコアのほうも申請させてもらいました。
リアルタイムで他人と競い合えるのはいい案ですし、
長く遊べると思います。

ただ、二重投稿や違うアップロードファイルなどへの対策を考えておいたほうが
いいかもしれないです。

制作お疲れさまでした。


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

Name: チルチル  ..熟練のプログラマー(54,819ポイント)   Date: 2009/09/30(水) 23:04   No:39796     
Title: Re:続 シューティングできました!!    
WINAPIは独特ですね

ウィンドウの枠とマウスが表示されないのは仕様でしょうか?


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

Name: ようすけ  ..初心者(6,088ポイント)   Date: 2009/10/01(木) 00:20   No:39798     
Title: Re:続 シューティングできました!!    
田所さん、プレイしていただきありがとうございます。

>あと、スコアのほうも申請させてもらいました。
リアルタイムで他人と競い合えるのはいい案ですし、
長く遊べると思います。

スコア見ました。

かなり高いですね☆
STG得意なんですかね?(笑)

>ただ、二重投稿や違うアップロードファイルなどへの対策を考えておいたほうが
いいかもしれないです。

これが一番の問題なんで、今せっせと対策を考えているところです。

チルチルさん
>ウィンドウの枠とマウスが表示されないのは仕様でしょうか?

ウィンドウの枠は私のPCでもたまに表示されなくなりますが、原因はわかりません(汗)

マウスの非表示は仕様です。

フルスクリーンの時だと邪魔になるので、ShowCursor(0)で消しました。









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

Name: 信濃川  ..ぴよぴよ(10ポイント)   Date: 2009/10/01(木) 14:51   No:39818     
Title: Re:続 シューティングできました!!    
遊ばせてもらいました〜。

全体的に面白かったとおもいます。

もう少し敵の耐久力を上げれば倒しがいがあったかもしれないですね〜。

2面の黄色い跳ねる敵はいいですね〜ww


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

Name: バグ  ..ハッカー(170,769ポイント)   Date: 2009/10/01(木) 14:57   No:39819     
Title: Re:続 シューティングできました!!    
真っ白いWindowが表示されて、ゲームが起動しないのは私だけでしょうか…?

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

Name: ようすけ  ..初心者(6,322ポイント)   Date: 2009/10/01(木) 15:34   No:39821     
Title: Re:続 シューティングできました!!    
信濃川さん遊んで頂きありがとうございます。

>もう少し敵の耐久力を上げれば倒しがいがあったかもしれないですね〜。

そうですね、耐久力とかの微調整とか全体のバランスがゲーム作りでは一番難しいです。

バグさん

フルスクリーンでもウィンドウモードでもだめですか?

そういったバグは聞いた事ないので、お手数ですがもう一度ダウンロード
し直してもらうと大丈夫かもしれません。

実行ファイルをクリックしてしばらく画面が白い事はありますが・・・。


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

Name: Tororo  ..ぴよぴよ(549ポイント)   Date: 2009/10/03(土) 13:56   No:39899     
Title: Re:続 シューティングできました!!    
Webページが見つかりませんと出て
プレイできないんですが??何故でしょう?(;◇;)


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

Name: Tororo  ..ぴよぴよ(578ポイント)   Date: 2009/10/03(土) 13:58   No:39900     
Title: Re:続 シューティングできました!!    
MISS↓
サイトが見つからなくてダウソが出来ないんですが
何故でしょうかね?(汗
もう、終わっちゃったのかな??


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

Name: ようすけ  ..初心者(6,389ポイント)   Date: 2009/10/03(土) 15:31   No:39902     
Title: Re:続 シューティングできました!!    
Tororoさん失礼しました。

再度アップしましたので、下記からダウンロードできます。

アップローダさま

http://kissho3.xii.jp/100/src/1kichi12632.zip.html

DLkey 0111 (全角で)

よろしくお願いします。


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

Name: Tororo  ..ぴよぴよ(599ポイント)   Date: 2009/10/03(土) 16:44   No:39905     
Title: Re:続 シューティングできました!!    
プレイしました〜
とても面白かったです〜
ただ自分の目が悪いのか
玉が背景と少し似ているような気がしました(失礼だったらスミマセンm(_ _)m)
ただとても面白かったので続編?なども
期待しています〜
これからも製作がんばってください!


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

Name: ようすけ  ..初心者(6,156ポイント)   Date: 2009/10/03(土) 18:06   No:39909     
Title: Re:続 シューティングできました!!    
Tororoさん遊んで頂きましてありがとうございます。

>ただ自分の目が悪いのか玉が背景と少し似ているような気がしました(失礼だったらスミマセン)

そうですか〜、それは二面の道中と2ボスの弾だったりしますか?

>ただとても面白かったので続編?なども期待しています〜

ありがとうございます。
今後はDirectXで作っていきますので、演出はもちろん、今回の作品のような
BGMだけではなくサウンドエフェクトも実現できるので期待しててください。(笑)



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

Name: ちゃお  ..ぴよぴよ(8ポイント)   Date: 2009/10/03(土) 22:24   No:39919     
Title: Re:続 シューティングできました!!    
テンポらざるを得ない。ばっかで、DLできないです。残念><

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



Name: しなちく  ..ぴよぴよ(39ポイント)   Date: 2009/10/03(土) 11:26   No:39893       
Title: 名前の入力    
こんにちは、今ゲームを作っているのですが詰まってしまいました。
Visual C++2008で開発をしています。

RPGの作成をしていて、仲間の管理をしています。

typedef struct
{
char name[11]; // 名前
int hp; // HP
int mp; // MP
...
} kanri
kanri nakama;

名前は任意の名前を入力させる形にしています。
テキストボックスからなどではなく、選択された文字を nakama.name に一文字ずつ入れていくやり方でやっています。
しかし、一文字戻る 一文字削除 と言ったようないわゆる文字の消し方が分からなくなってしまいました。
例えば、 あいうえお という名前まで選択して、お を消したい場合です。
文字を入れていくなら、strcat_s でできましたが、最後に入力された文字を消すにはどうすればいいのでしょうか。


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


Name: toyo  ..熟練のプログラマー(41,318ポイント)   Date: 2009/10/03(土) 11:56   No:39897     
Title: Re:名前の入力    
charだと文字コードはシフトJISでしょうか
名前に使える文字を2バイト限定にすれば
len = strlen(nakama.name) - 2;
if (len >= 0)
{
nakama.name[len] = '\0';
}
でできそうですが
1バイト文字と2バイト文字が混ざると処理が面倒になります
その場合はUNICODEにしてwchar_tで扱うほうが楽かもしれません


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

Name: しなちく  ..ぴよぴよ(167ポイント)   Date: 2009/10/03(土) 22:20   No:39918 解決!     
Title: Re:名前の入力    
>toyo様
こんなに速くレスを頂いていたのに、返信が遅くなってしまって申し訳ございません。
基本2バイト文字のみでやっております。

len の型はintでよろしいのでしょうか?
そう解釈してtoyo様の記載してくださったコードを書いてみると

error C2440: '=' : 'const char [2]' から 'char' に変換できません。

といったエラーを吐かれてしまいました。
大変お手数かと思いますが、解決策を教えていただけないでしょうか。


--追記
申し訳ございません。
'\0' の部分を "\0" と勘違いしておりました。
結果、見事に動いてくれました。
toyo様ありがとうございました。


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



Name: 6226  ..ぴよぴよ(5ポイント)   Date: 2009/10/03(土) 14:14   No:39901       
Title: 東方地霊殿    
東方地霊殿の二次創作をしたいんですけど、本家の自機の画像がぜんぜん見当たりません、誰かお持ちの方は下さい。

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


Name: mnkr  ..かけだし(2,358ポイント)   Date: 2009/10/03(土) 17:35   No:39907     
Title: Re:東方地霊殿    
ゲームでスナップショットをとるのはどうでしょうか?

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

Name: 6226  ..ぴよぴよ(17ポイント)   Date: 2009/10/03(土) 17:54   No:39908     
Title: Re:東方地霊殿    
それいいですね、ありがとうございます

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



Name: ひよこ  ..熟練のプログラマー(53,939ポイント)   Date: 2009/10/03(土) 09:26   No:39886       
Title: マップがおかしくなります。    
RPGを作っているのですが、
マップ読み込みで変な形になってしまいます。

int Map[15][20];

//マップ情報をエクセルから読み込んで格納する関数
void load_story(){
int n,num,i,fp;
char fname[32];
sprintf(fname,"map%d.csv",0);
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){
for(i=0;i<64;i++){
inputc[i]=input[i]=FileRead_getc(fp);//1文字取得する
if(inputc[i]=='/'){//スラッシュがあれば
while(FileRead_getc(fp)!='\n');//改行までループ
i=-1;//カウンタを最初に戻して
continue;
}
if(input[i]==',' || input[i]=='\n'){//カンマか改行なら
inputc[i]='\0';//そこまでを文字列とし
break;
}
if(input[i]==EOF){//ファイルの終わりなら
goto EXFILE;//終了
}
}

Map[n][num]=atoi(inputc);
num++;

if(num==20){
num=0;
n++;
}
}
EXFILE:
FileRead_close(fp);
}


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


Name: zwi  ..中級者(9,009ポイント)   Date: 2009/10/03(土) 10:00   No:39888     
Title: Re:マップがおかしくなります。    
どう変なのか教えてもらえますか?
気になるのは64バイトしかバッファが無いので3桁の数値が続くと64バイトをオーバーしそうな気がしますが、オーバーしない保障があるならかまいません(私なら2倍以上はバッファの余裕を見ます)。


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

Name: ひよこ  ..熟練のプログラマー(53,977ポイント)   Date: 2009/10/03(土) 11:14   No:39892     
Title: Re:マップがおかしくなります。    
csvで0か1を入れてあるだけなのでオーバーはしないと思います。
わかりずらいと思うので実行結果とcsvを添付しました。


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

Name: toyo  ..熟練のプログラマー(41,233ポイント)   Date: 2009/10/03(土) 11:43   No:39894     
Title: Re:マップがおかしくなります。    

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

最初の2行を読み飛ばしているからではないでしょうか
csvの3行目のデータから読み込むので画像の結果と一致しています



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

Name: zwi  ..中級者(9,547ポイント)   Date: 2009/10/03(土) 11:48   No:39895     
Title: Re:マップがおかしくなります。    
確かに3行目から読んでいるのでそれが原因だと思います。
コメント行のスキップ機能とか、どこかのソースを参考にされたんでしょうか?


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

Name: ひよこ  ..熟練のプログラマー(54,007ポイント)   Date: 2009/10/03(土) 11:56   No:39896 解決!     
Title: Re:マップがおかしくなります。    
あ、本当に3行目から読んでました。
本当に単純なミスでした。
toyoさん、zwiさんありがとうございました。


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



Name: tama  ..ぴよぴよ(59ポイント)   Date: 2009/10/02(金) 16:16   No:39850       
Title: char *filedについて    
こんにちは。
C言語は初心者です。WindowsのVistaを使っています。コンパイラはBorladです。

宣言文で次のように
char *field = "%s\t%s\t%s\t%s\t%s";
とあったのですが、"%s\t%s\t%s\t%s\t%s"の部分が分かりません。
ポインタfieldを宣言して、"%s\t%s\t%s\t%s\t%s"を代入する?

よろしければ、説明お願いします。


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


Name: 御津凪 [URL]  ..ハッカー(115,888ポイント)   Date: 2009/10/02(金) 16:26   No:39851     
Title: Re:char *filedについて    
> ポインタfieldを宣言して、"%s\t%s\t%s\t%s\t%s"を代入する?

それで正しいです。
"%s\t%s\t%s\t%s\t%s" の部分は文字列で、
中に書かれている暗号みたいな文字は printf 関数などで使われる書式文字と、エスケープシーケンスですね。


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

Name: zwi  ..初心者(8,547ポイント)   Date: 2009/10/02(金) 16:48   No:39852     
Title: Re:char *filedについて    
正確に書くと
ポインタfieldを宣言して、文字列"%s\t%s\t%s\t%s\t%s"の先頭ポインタを代入するですかね。


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

Name: non  ..熟練のプログラマー(63,917ポイント)   Date: 2009/10/02(金) 18:53   No:39863     
Title: Re:char *filedについて    
"%s\t%s\t%s\t%s\t%s"という文字列がメモリ上のどこか(恐らく静的領域)に用意されて、
その先頭のアドレスがfieldという変数に代入される。アドレスが入る変数をポインタという。
ポインタには指すという意味があるので、ポインタfieldは文字列"%s\t%s\t%s\t%s\t%s"の
先頭アドレスを指していると考えるとわかりやすい。


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

Name: Ma  ..中級者(11,041ポイント)   Date: 2009/10/03(土) 09:21   No:39885     
Title: Re:char *filedについて    
まだまだ初心者の自分からの説明ですが、

%s は、書式文字で、
\t は、エスケープシーケンスです。

%s は、文字列。
\t は、タブを意味します。(他には、\n で改行など。)

printf(field,"te","st","in","g","now");

とすれば、
出力には、

te	st	in	g	now


と出力されます。


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

Name: tama  ..ぴよぴよ(144ポイント)   Date: 2009/10/03(土) 10:22   No:39890     
Title: Re:char *filedについて    
皆様、解答ありがとうございました。
ポインタfieldには先頭アドレスが入るのですね。

%s,%tはprintf()関数の中で見かけるのですが、
char *field = "%s%t…"; ----@
は初めて見ました。
printf()関数の場合は、%sは文字列を表示しますよね。
@の場合だと%sや%tは何をしているのでしょうか?


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

Name: zwi  ..中級者(9,482ポイント)   Date: 2009/10/03(土) 10:45   No:39891     
Title: Re:char *filedについて    
%tではなく\tですね。
そのほかのことについては、Maさんが解説されている通りです。


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



Name: ディア  ..入門者(4,754ポイント)   Date: 2009/10/03(土) 09:54   No:39887       
Title: 思いつきで出来た弾幕    

void boss_shot_bulletH002(){
#define TM002 650
int i,k,t=boss_shot.cnt%TM002;
double angle;
if(t==0 || t==210){
//40<x<FMX-40 50<y<150 の範囲で100離れた位置に80カウントで移動する
move_boss_pos(40,50,FMX-40,150,100, 80);
}
//最初のランダム発射
if(t<180){
for(i=0;i<2;i++){//1カウントに2回発射
if((k=search_boss_shot())!=-1){
boss_shot.bullet[k].col = GetRand(6);//7種類の色をランダムに
boss_shot.bullet[k].x = boss.x;//発射初期座標はボスの位置
boss_shot.bullet[k].y = boss.y;
boss_shot.bullet[k].knd = 7;//弾の種類
boss_shot.bullet[k].angle = rang(PI2/20)+PI2/10*t;
boss_shot.bullet[k].flag = 1;
boss_shot.bullet[k].cnt = 0;
boss_shot.bullet[k].spd = 3.2+rang(2.1);
boss_shot.bullet[k].state = 0;//弾のステータス
boss_shot.bullet[k].kaiten= 1;//弾を回転するかどうかのフラグ
}
}
if(t%10==0)
se_flag[0]=1;
}
//次のランダム発射
if(t<400){
for(i=0;i<2;i++){//1カウントに2回発射
if((k=search_boss_shot())!=-1){
boss_shot.bullet[k].col = GetRand(6);//7種類の色をランダムに
boss_shot.bullet[k].x = boss.x;//発射初期座標はボスの位置
boss_shot.bullet[k].y = boss.y;
boss_shot.bullet[k].knd = 7;//弾の種類
boss_shot.bullet[k].angle = rang(PI2/20)+PI2/10*t;
boss_shot.bullet[k].flag = 1;
boss_shot.bullet[k].cnt = 0;
boss_shot.bullet[k].spd = 3.2+rang(2.1);
boss_shot.bullet[k].state = 3;//弾のステータス
boss_shot.bullet[k].kaiten= 1;//弾を回転するかどうかのフラグ
}
}
if(t%10==0)
se_flag[0]=1;
}
for(i=0;i<BOSS_BULLET_MAX;i++){
if(boss_shot.bullet[i].flag>0){
//tが190の時に全てストップさせ、白くし、カウントリセット
if(boss_shot.bullet[i].state==0){
if(t==190){
boss_shot.bullet[i].kaiten=0;//弾の回転を止める
boss_shot.bullet[i].spd =0;
boss_shot.bullet[i].col =9;
boss_shot.bullet[i].cnt =0;
boss_shot.bullet[i].state =1;//ステータスを1に
}
}
//ランダムな方向に移動し始める
if(boss_shot.bullet[i].state==1){
if(boss_shot.bullet[i].cnt==200){
boss_shot.bullet[i].angle=rang(PI);//全方向ランダム
boss_shot.bullet[i].kaiten=1;//回転するフラグを立てる
boss_shot.bullet[i].col =0;

}
if(boss_shot.bullet[i].cnt>200)
boss_shot.bullet[i].spd+=0.01;//段々加速
}
}
}
for(i=0;i<BOSS_BULLET_MAX;i++){
if(boss_shot.bullet[i].flag>0){
//tが220の時に全てストップさせ、白くし、カウントリセット
if(boss_shot.bullet[i].state==3){
if(t==410){
boss_shot.bullet[i].kaiten=0;//弾の回転を止める
boss_shot.bullet[i].spd =0;
boss_shot.bullet[i].col =9;
boss_shot.bullet[i].cnt =0;
boss_shot.bullet[i].state =4;//ステータスを4に
}
}
//ランダムな方向に移動し始める
if(boss_shot.bullet[i].state==4){
if(boss_shot.bullet[i].cnt==200){
boss_shot.bullet[i].angle=rang(PI);//全方向ランダム
boss_shot.bullet[i].kaiten=1;//回転するフラグを立てる
boss_shot.bullet[i].col =1;
}
if(boss_shot.bullet[i].cnt>200)
boss_shot.bullet[i].spd+=0.01;//段々加速
}
}
}
}


思いつきでつくりました。
パーフェクトフリーズの上からパーフェクトフリーズを
重ねるっていう、実装難易度は低くても
攻略難易度は高めのものです。


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




Name: テリー  ..ぴよぴよ(133ポイント)   Date: 2009/10/03(土) 01:08   No:39880       
Title: 質問です。    
(管理人による記述:規約違反があった為、記事を元に戻しました。不都合がある場合、お問い合わせください)


学校の宿題なんですが問題の意味がよくわかりません。
問題.マラソンの5キロのラップタイムからゴールタイムを予測するプログラムを作れ。
入力データは距離(5キロ単位)、それまでの所要時間hh時間mm分ss秒、直前の5キロのラップタイムmm分ss秒とする。
これが問題なんですが、距離までの所要時間がわかるなら、それがゴールタイムじゃないのか?と思ってしまいます。どう考えるかだけでも教えてくれたら幸いです。初歩的ですいません。


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


Name: box  ..ハッカー(144,308ポイント)   Date: 2009/10/03(土) 01:22   No:39881     
Title: Re:質問です。    
>それまでの所要時間hh時間mm分ss秒、直前の5キロのラップタイムmm分ss秒

これ、どちらか片方だけでじゅうぶんではないかと思います。
5キロ、10キロ、…の所要時間を与えるのですから、
5キロ〜10キロのラップタイムは引き算すれば求まりますよね。
出題者の意図がどのあたりにあるのかわかりませんが…。

まあそれはさておくとして、5キロごとの所要時間がわかれば、
そのペースで42.195キロを走ったときにどれだけかかるかを
計算すればよいのではないでしょうか。


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

Name: YuO  ..プログラマー(33,901ポイント)   Date: 2009/10/03(土) 01:33   No:39882     
Title: Re:質問です。    
> >それまでの所要時間hh時間mm分ss秒、直前の5キロのラップタイムmm分ss秒
> これ、どちらか片方だけでじゅうぶんではないかと思います。

両方必要でしょう。
15km地点で
・0km-15kmにかかった時間:所要時間
・10km-15kmにかかった時間 (ラップタイム)
の両方がわかるので,そこから15km-42.195kmの時間を計算し,それを所要時間に加算したものがゴールタイムになりますから。

つまり,現実的な値ではないですが,
0km - 40kmにかかった時間が8時間
35km - 40kmにかかった時間が30分
だったとすると,ラップタイムからだけ計算するといままでかかった時間より短い時間が誤った解として出てしまいます。


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

Name: テリー  ..ぴよぴよ(145ポイント)   Date: 2009/10/03(土) 01:57   No:39883     
Title: Re:質問です。    
お二人ともありがとうございます。非常に分かりやすかったです。

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



Name: yussanstar  ..かけだし(1,673ポイント)   Date: 2009/10/02(金) 18:28   No:39861       
Title: 拡張子dxa    
タイトルまんまの質問
拡張子がdxaのファイルを見るにはどうすればいいですか。


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


Name: Tororo  ..ぴよぴよ(448ポイント)   Date: 2009/10/02(金) 19:48   No:39864     
Title: Re:拡張子dxa    
初めて答えてみます
それが画像ファイルなら拡張子を.bmp .pngだったりに変えれば見れるはずです
テキストファイルなら.txtに変えればいいと思いますよ


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

Name: Tororo  ..ぴよぴよ(492ポイント)   Date: 2009/10/02(金) 19:50   No:39865     
Title: Re:拡張子dxa    
あっもしかしたら圧縮されてる?かもしれないので
だめかもしれません・・・・ゴメンナサイm(_ _)m


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

Name: tkmakwins15  ..比類無きプログラマー(98,018ポイント)   Date: 2009/10/02(金) 19:58   No:39866     
Title: Re:拡張子dxa    
dxaはDXライブラリのファイルアーカイブです。Dxライブラリ付属のDxaDecode.exeにドラッグすれば解凍できます。

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

Name: Tororo  ..ぴよぴよ(514ポイント)   Date: 2009/10/02(金) 20:03   No:39867     
Title: Re:拡張子dxa    
ごめんなさい
勘違いしてましたm(_ _)m


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

Name: yussanstar  ..かけだし(1,766ポイント)   Date: 2009/10/02(金) 21:23   No:39872     
Title: Re:拡張子dxa    
DxaDecode.exeを使って、なんとかdxaファイルを開くことに成功しましたが、新たな壁にぶつかってしまいました。
dxaファイルをDxaDecode.exeから開くと、新しいファイルが作成されるのですが、その中が、からなのです。
一体どういうことでしょう。dxaファイルにはちゃんと○○MBという風にサイズがあるのですが・・・。


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

Name: Justy  ..伝説なるハッカー(432,171ポイント)   Date: 2009/10/02(金) 21:31   No:39873     
Title: Re:拡張子dxa    

>その中が、からなのです

 パスワードが設定されているのかもしれません。
 パスワードがわかっているのであれば、マニュアルにも書いてありますが、
-Kオプションを使うことで展開できます。


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



Name: 質問者  ..ぴよぴよ(117ポイント)   Date: 2009/10/02(金) 13:50   No:39842       
Title: ポOモン「風」のゲームを作りたいので質問です。    
はじめまして。
初めてなので右も左もわからない素人です。
実は前からポケモン風のゲームを作ってみたかったのですが、サイトのほうを最後まで見ましたが、
全然わかりません。バトルとか捕獲とかは、まだいいんです。
フィールドワークだけでもやってみたいのですが、どこをどうしたらいいかさっぱりです。
サイト内のやつを「コピペして実行する」はできます。
画像を改変して歩かせたりはできますが、フィールドとフィールドの間とか、
できればバトルとかも、できるようになるにはいったいどうすればいいのでしょうか?
質問とかも慣れてないので、至らないところはあるとは思いますが、どうかよろしくお願いします。


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


Name: 質問者  ..ぴよぴよ(38ポイント)   Date: 2009/10/02(金) 14:04   No:39843     
Title: Re:ポOモン「風」のゲームを作りたいので質問です。    
「画像を改変して歩かせた」
ではなくて
「画像を変えて別の人が歩いているようにした」
でした。
変えた画像って言うのは、添付します。
まだ途中ですが、駄目なところとかあればどうすればいいのか教えてください。


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

Name: 質問者  ..ぴよぴよ(265ポイント)   Date: 2009/10/02(金) 14:24   No:39844     
Title: Re:ポOモン「風」のゲームを作りたいので質問です。    
誰も答えてくれないのは質問が意味不明だからでしょうか?
テンプレートのやつかきました。

[1] 質問文
 [1.1] 自分はポケモン風のゲームをつくりたいです。
 [1.2] サイトに書いてあるとおりにコピーしてた部分の画像を改変してやってみた
 [1.3] エラーは今のところないです。
 [1.4] ヒントだけでもいいので、ポケモン風のゲームの作り方を教えてください

[2] 環境  
 [2.1] OS :WindowsXPです。
 [2.2] コンパイラ名 :Visual C++ 2008 Express Edition

[3] その他
 ・どの程度C言語を理解しているか : 小学1年生が2年生でならう漢字をみた程度…かな…
 ・ライブラリを使っている場合は何を使っているか


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

Name:  ..ぴよぴよ(184ポイント)   Date: 2009/10/02(金) 14:42   No:39845     
Title: Re:ポOモン「風」のゲームを作りたいので質問です。    
>誰も答えてくれないのは質問が意味不明だからでしょうか
慌てないで気長に待ちましょうよ。
普通の人はこの時間学校行っているか会社で働いてるわけですし。


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

Name: 質問者  ..ぴよぴよ(368ポイント)   Date: 2009/10/02(金) 14:48   No:39846     
Title: Re:ポOモン「風」のゲームを作りたいので質問です。    
Qさん
お答えありがとうございます。
気長に待ちます。
でも僕は学校から帰ってきて書き込んでいます。
場所とか学年によってはあれですし。

でも誰か見ていてくれてるってわかっただけでもうれしいです。ありがとうございます。


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

Name: zwi  ..初心者(8,443ポイント)   Date: 2009/10/02(金) 15:23   No:39847     
Title: Re:ポOモン「風」のゲームを作りたいので質問です。    
RPGはアクションゲームやシューティングゲームよりシステムが複雑なので初心者には難易度が高いもののひとつです。なのでいっぺんに色々と作ろうとせず一つ一つ完成させていってください。
ドラクエ1程度でもかなり大変なので、最初はすごく小規模に作りましょう。ポケモンなどとんでもないです。

>フィールドとフィールドの間とか、
画面の端に来たら、次のマップをロードしてキャラクタの位置をいかにも次のマップに出現しましたって位置に移動してやるだけですが、実は先々の事を考えてちゃんと作ると色々面倒だったりします。

「TEAM NAVA分室 ゲーム製作講座 RPG」と言うサイトです。
http://inu.harisen.jp/top.html
途中までしか完成していませんが、フィールドの参考にはなると思います(マップ間の移動が無いですが)。
注意点としては、ただコピペしただけでは理解した事になりませんので、出来れば考え方だけ読んでソースコードを見ずにプログラムを組むことに挑戦してみて欲しいです。ソースコードを見るとしても参考程度で。
フィールド間移動もここまで出来たなら説明したいと思います。

>できればバトルとかも、できるようになるにはいったいどうすればいいのでしょうか?
まだ早いと思いますので、とりあえずフィールドを完成させましょう。
RPGと言えばバトルも肝ですが、イベントやら町や家、町人やらショップやらフィールドの方が作るものは多いです。他のものを作っている間にバトルをどうすれば良いかも見えてきますよ。


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

Name: zwi  ..初心者(8,521ポイント)   Date: 2009/10/02(金) 15:31   No:39848     
Title: Re:ポOモン「風」のゲームを作りたいので質問です。    
ここでRPGに必要なものを整理しておきましょう。
まず、必要な部品など。
・当然ながらプログラム
・シナリオ。
・シナリオを実行するスクリプトコード。
・フィールド(マップ)CGデータ。
・主人公や町人などのフィールド・キャラクタCGデータ
・戦闘背景CGデータ。
・戦闘キャラクタCGデータ。
・戦闘エフェクトCGデータ。
・音楽や効果音データ。
・アイテムや主人公側キャラ、敵キャラなどのデータ、パラメータ。
などが必要です。

プログラム作業としては大きく分けて
・フィールド処理。
→マップを作成するツールも必要。フリーソフトがあります。
・バトル処理。
・成長システムの処理。
・アイテムや装備などの処理
・ショップなどの処理
・シナリオを実行するスクリプト処理
・メニューやセーブロードなど。
ざっと書きましたが、実は全部かなり面倒です。


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

Name: 質問者  ..ぴよぴよ(561ポイント)   Date: 2009/10/02(金) 15:38   No:39849     
Title: Re:ポOモン「風」のゲームを作りたいので質問です。    
zwiさん
お返事ありがとうございます!
必要なことのまとめがすごく参考になりました。
地道にコツコツ、がんばってみます。

まずは必要なマップのグラフィックを作ってみようと思います。
本当にありがとうございます。
またわからなくなったら質問するかもしれないのでそのときもできればよろしくお願いします。

コードもちょっとずつ勉強します。
では作ってみます。
あ、ポケモンはしばらく我慢します。
ドラクエはやったことありませんが自作のRPG作ってみます。


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

Name: 質問者  ..ぴよぴよ(653ポイント)   Date: 2009/10/02(金) 17:47   No:39857     
Title: Help me    
DxLib_VC2008用.exe の 0x006fb1de でハンドルされていない例外が発生しました: 0xC0000005: 場所 0x00000020 を読み込み中にアクセス違反が発生しました。

こんなエラーが出てしまいました。
まったく意味がわかりません。だれか助けてください


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

Name: zwi  ..初心者(8,946ポイント)   Date: 2009/10/02(金) 18:00   No:39859     
Title: Re:Help me    
>DxLib_VC2008用.exe の 0x006fb1de でハンドルされていない例外が発生しました: 0xC0000005: 場所 0x00000020 を読み込み中にアクセス違反が発生しました。
よく出る実行エラーですので、対処法を覚えてくださいね。
「アクセス違反」と書かれている通りプログラムがやってはいけないことをしたときにこのエラーが出ます。
どういう違反かと言うとOSの領域などに「読み込み中に」ってことは読み込みを行ったって事です。
アプリはOSのメモリを参照する事は基本的に禁止されていますので、これが怒られた原因となります。
で、大体はポインタに正しい値を入れ忘れたとか、そもそもポインタじゃないものを使ったとか、使う構造体を間違ったとか基本的なミスになります。
DxLib内で問題が起こっていますので、DxLib関数に渡したパラメータが間違っていた可能性が高いです。
ソースコードを見せてくださいね。


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

Name: Mist  ..熟練のプログラマー(68,427ポイント)   Date: 2009/10/02(金) 18:00   No:39860     
Title: Re:Help me    
アプリケーションが参照してはいけないメモリをリードしたという意味です。
あなたが改造したところをよく見直しましょう。


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

Name: 質問者  ..ぴよぴよ(682ポイント)   Date: 2009/10/02(金) 18:32   No:39862     
Title: Re:Help me    
zwiさんとMistさん

つまりいじくってはいけないところに触れてしまったって事ですね
って考えて一回消してもう一回やったら難なく起動しました。
ありがとうございます!!!


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



Name: C修行中  ..ぴよぴよ(613ポイント)   Date: 2009/10/02(金) 10:17   No:39839       
Title: スプライト処理で読み込んだ画像が表示されない    
お世話になっております。
スプライト処理で読み込んだ画像が表示されず困っております。
ご教授願います。

環境はWindowsXP、
Visual C++ 2008 EE です。

void MakeSprite(){

IDirect3DSurface9 *pSurface = NULL;
LPD3DXSPRITE g_pSprite = NULL;
D3DXCreateSprite( g_pd3dDevice,&pSprite );

//パラメータウィンドウの位置

const D3DRECT rect2 = {480, 0, 640, 480};


if (createstatus == 0){

g_pd3dDevice->Clear( 1,
&rect2,
D3DCLEAR_TARGET,
D3DCOLOR_XRGB(8,8,8),
1.0f,
0);

D3DXCreateTextureFromFileEx(g_pd3dDevice,
L"back02.jpg",
D3DX_DEFAULT,
D3DX_DEFAULT,
D3DX_DEFAULT,
D3DX_DEFAULT,
D3DFMT_UNKNOWN,
D3DPOOL_DEFAULT,
D3DX_FILTER_NONE,
D3DX_DEFAULT,
0xFF000000,
NULL,
NULL,
&pTexture);
createstatus = 1;
}

if(SUCCEEDED(g_pd3dDevice->BeginScene())){
pSprite->Begin(D3DXSPRITE_ALPHABLEND);

pSprite->Draw( pTexture,
NULL,
NULL,
NULL,
0xFFFFFFFF);

pSprite->End();
g_pd3dDevice->EndScene();
}
g_pd3dDevice->Present( NULL,
NULL,
NULL,
NULL);

// スプライトの破棄
if (pTexture != NULL)
pTexture->Release();
pTexture = NULL;
if (pSprite != NULL)
pSprite->Release();

}


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


Name: zwi  ..初心者(7,505ポイント)   Date: 2009/10/02(金) 10:30   No:39840     
Title: Re:スプライト処理で読み込んだ画像が表示されない    
D3DXCreateTextureFromFileExの戻り値のエラーチェックをしていないので、ほんとに読み込まれたのか保証が無いのと、Present後に描画するのにすぐスプライトを捨てちゃだめでしょう。少なくとも1フレーム後に捨ててください。
このコードは短くしたコードだと思いますが、読み込み、描画、破棄は一連の流れにしちゃダメです。メインループにあるのは描画だけで、読み込みはループ前、破棄はループ後にしてください。


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



Name: yussanstar  ..かけだし(1,566ポイント)   Date: 2009/09/28(月) 20:03   No:39733       
Title: 関数のポインタの多数使用    
ゲームプログラミングの館の「s1.関数ポインタの基本」に関して、
サンプルプログラムのように、

void (*ShotFunction[])( void ) =
{
ShotType2, //この順番で配列に格納される
ShotType1, //[0],[1],[2]の順番で使用すると
ShotType3, //2,1,3の順番で処理される。
} ;

と、関数名をすべて列挙していたのでは、関数の数が何百個と存在するとき(たとえばRPGで、何百個とあるアイテムの効果を関数にする時)にいちいち面倒です。
何かうまい方法はありませんか?



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


Name: ひよこ  ..熟練のプログラマー(53,381ポイント)   Date: 2009/09/28(月) 22:25   No:39737     
Title: Re:関数のポインタの多数使用    
何百個とあるアイテムの効果を関数にする時
>>スイッチ文がシンプルでいいと思います。
こんな感じでいいと思います。

void get_item(int アイテムの種類){//引数のアイテムの効果を使う。
switch(アイテムの種類){
case 回復1:
..........;
break;
case 回復2:
..........;
break;
case 回復3:
..........;
break;
}
}



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

Name: yussanstar  ..かけだし(1,630ポイント)   Date: 2009/09/28(月) 22:57   No:39738     
Title: Re:関数のポインタの多数使用    
ひよこさん、すいませんけど、RPGの話はあくまで例であって、自分が本当に知りたいのはアイテムに効果を持たせる方法ではありません。
どうぞ、引き続きよろしくお願いします。


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

Name: 御津凪 [URL]  ..ハッカー(115,881ポイント)   Date: 2009/09/28(月) 23:17   No:39740     
Title: Re:関数のポインタの多数使用    
使い方によりますが、たとえば次に移動する関数を指定していくというような設計はどうでしょうか?
#include <stdio.h>


// 関数型定義
typedef void* (*TASKFUNC)( void );

// 終了を示す値
#define TERMFUNC ((void*)0xffffffff)

// 関数宣言
void* step1( void );
void* step2( void );
void* step3( void );

// グローバル変数
int gData = 0;

// 関数定義
void* step1( void ){
++gData;
printf("step1:%d\n", gData);
if(gData >= 3) return step2;
return NULL;
}
void* step2( void ){
++gData;
printf("step2:%d\n", gData);
if(gData >= 6) return step3;
return NULL;
}
void* step3( void ){
++gData;
printf("step3:%d\n", gData);
if(gData >= 9) return TERMFUNC;
return NULL;
}

// メイン関数
int main( void ){
TASKFUNC func = step1; // 開始関数の指定

while(func != TERMFUNC){ // func が TERMFUNC になるまで
TASKFUNC f = (TASKFUNC)func();
if(f != NULL) func = f;
// ここに更新処理とか入れる
}
printf("end:%d\n", gData);
getchar(); // 表示の確認用
return 0;
}


関数名の列挙の方法(yussanstar さんの提示している方法)も一般的にも使用される方法なので、状況に応じて使い分けるのがいいでしょうね。


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

Name: zwi  ..初心者(5,864ポイント)   Date: 2009/09/29(火) 08:06   No:39750     
Title: Re:関数のポインタの多数使用    
>関数名をすべて列挙していたのでは、関数の数が何百個と存在するとき(たとえばRPGで、何百個とあるアイテムの効果を関数にする時)にいちいち面倒です。

基本的にRPGのアイテムでもシューティングの弾幕でも関数が何百個になることは無いわけですが(あるとしたら設計がまずいです)。理由はメンテナンス性が悪くなるからです。
どんなプログラムでもですが、少し動作内容が違うだけ関数を幾つも作るのは間違っています。
私なら使う関数の種類と与えるパラメータをセットにしてテーブル化しますが、それではダメなのでしょうか?


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

Name: conio [URL]  ..熟練のプログラマー(51,876ポイント)   Date: 2009/09/29(火) 10:20   No:39751     
Title: Re:関数のポインタの多数使用    
まず、関数が何百、何千とあるような状況を
改善できないかを考えた方が良いと思います。

例えば、
--------------------------------------------------
【1】敵と、主人公との当たり判定をする関数
【2】敵の弾と、主人公との当たり判定をする関数
【3】敵と、主人公の弾との当たり判定をする関数
【4】敵の弾と、主人公の弾との当たり判定をする関数
【5】敵と、敵との当たり判定をする関数
--------------------------------------------------
これらの関数があった場合、無駄が多いと分かると思います。

しかし、
「オブジェクトAとオブジェクトBの当たり判定をする関数」というものを作れば、上記の全てに対応できます。
関数がひとつになる訳です。

あとアイテムの例ですが、関数を何個も作るのではなく、「アイテム関連の処理をする関数」を作っておいて、
その中で内容に応じて処理を分岐させたりすれば良いと思います。

他にも 敵Aを作る関数、敵Bを作る関数、敵Cを作る関数・・・という構造があった場合、
敵のデータは全部 テキストファイルやcsvファイルなんかに書いてしまっておいて、
「パラメータを読み込みセットする」という関数を一つだけ作っておけばOK、とか。


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

Name: toyo  ..熟練のプログラマー(41,027ポイント)   Date: 2009/09/29(火) 11:41   No:39753     
Title: Re:関数のポインタの多数使用    
必要があれば面倒でも列挙しますね
添付のはCPUのエミュレータの一部ですがオペコード=>関数を256個の関数ポインタの配列にしています
これをこれ以上うまく処理する方法は思いつきません(if や switch に比べるとかなりうまい処理ではあると思います)


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

Name: yussanstar  ..かけだし(1,669ポイント)   Date: 2009/10/02(金) 00:17   No:39833     
Title: Re:関数のポインタの多数使用    
色々とありがとうございました。
いわゆる「ベストアンサー」は、ひよこさんにしたいと思います。


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



Name: kai  ..初心者(6,714ポイント)   Date: 2009/10/01(木) 16:36   No:39822       
Title: 龍神録のボスを残像させる方法    

サンプルデータを参考にして

//**************ここからサンプル**************
// 残像処理基本
#include "DxLib.h"

// 残像データの数
#define AFTIMAGENUM 65

int PlayerX[ AFTIMAGENUM ], PlayerY[ AFTIMAGENUM ] ;

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

// 画面モードのセット
SetGraphMode( 640 , 480 , 16 ) ;
if( DxLib_Init() == -1 ) // DXライブラリ初期化処理
{
return -1; // エラーが起きたら直ちに終了
}

// 描画先画面を裏画面にセット
SetDrawScreen( DX_SCREEN_BACK ) ;

// キャラクターの初期位置をセット
for( i = 0 ; i < AFTIMAGENUM ; i ++ )
{
PlayerX[ i ] = 0 ;
PlayerY[ i ] = 0 ;
}

// ループ
while( ProcessMessage() == 0 && CheckHitKey( KEY_INPUT_ESCAPE ) == 0 )
{
// キー入力取得
Key = GetJoypadInputState( DX_INPUT_KEY_PAD1 ) ;

// 上を押していたら上に進む
if( Key & PAD_INPUT_UP ) PlayerY[0] -= 3 ;

// 下を押していたら下に進む
if( Key & PAD_INPUT_DOWN ) PlayerY[0] += 3 ;

// 右を押していたら右に進む
if( Key & PAD_INPUT_RIGHT ) PlayerX[0] += 3 ;

// 左を押していたら左に進む
if( Key & PAD_INPUT_LEFT ) PlayerX[0] -= 3 ;

// 画面を初期化する
ClearDrawScreen() ;

// プレイヤーを描画する
for( i = AFTIMAGENUM - 1 ; i >= 0 ; i -= 8 )
DrawBox( PlayerX[i] , PlayerY[i] , PlayerX[i] + 32 , PlayerY[i] + 32 ,
GetColor( 0 , 255 - 255 * i / AFTIMAGENUM , 0 ) , TRUE ) ;

// 裏画面の内容を表画面に反映させる
ScreenFlip() ;

// 残像データを一つづつずらす
for( i = AFTIMAGENUM - 1 ; i > 0 ; i -- )
{
PlayerX[ i ] = PlayerX[ i - 1 ] ;
PlayerY[ i ] = PlayerY[ i - 1 ] ;
}
}

DxLib_End() ; // DXライブラリ使用の終了処理

return 0 ; // ソフトの終了
}
//**************ここまで**************

改造龍神録のボスを残像させてみたいと思い、
実装してみたのですが、うまくいきません><
どうしたらボスが残像するようになるでしょうか?


graph_boss()内

int i;
#define AFTIMAGENUM 65

for(i = AFTIMAGENUM - 1 ; i >= 0 ; i -= 8 ){
SetDrawBlendMode( DX_BLENDMODE_ALPHA, 255 - 255 * i / AFTIMAGENUM) ;//αブレンドする
DrawRotaGraphFdF(boss.dx,boss.dy,//ボスを描画
1.0f,0.0f,img_dot_boss01[0],TRUE);
SetDrawBlendMode( DX_BLENDMODE_NOBLEND, 0 );//ブレンドモードをリセットする。
}

// 残像データを一つづつずらす
for( i = AFTIMAGENUM - 1 ; i > 0 ; i -- ){
boss.dx = boss.dx-i ;
boss.dy = boss.dy-i ;
}






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


Name: Justy  ..伝説なるハッカー(432,150ポイント)   Date: 2009/10/01(木) 21:20   No:39828     
Title: Re:龍神録のボスを残像させる方法    

>どうしたらボスが残像するようになるでしょうか?

 察するにサンプルプログラムの残像の原理を理解していないように思えます。
 
 kaiさんが書かれた graph_boss()内のコードは雰囲気にはコードは似通っていますが
何回も同じところにキャラを書いてみたり、同じ変数に対し何度も引き算を繰り返してみたりと
あまり意味のあるコードになっていないようです。

 まずは、サンプルプログラムがどうやって残像を実現しているか考え、理解に努めてみて下さい。


 ヒントとしては、残像の基本は何フレーム、或いは何十フレーム以上に渡る
キャラクターが移動した過去の座標を参照して、(時には補完しながら)表示を行うのが
基本となります。

 その為、サンプルにおける PlayerXや PlayerYは配列になっており、
現在の座標が配列の先頭に、1フレーム前の座標が配列の2番目に
入るようになっています。

 残念ながら、graph_boss()内の boss.dxは配列ではないので、過去の座標を記録することは
出来ません。

 まずこのあたりから直す必要があるでしょう。


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



Name: sood  ..かけだし(2,351ポイント)   Date: 2009/10/01(木) 17:12   No:39825       
Title: 館本編の、サンプルプログラム11章でエラーが起きます。    
コピペしたので移し間違えはないと思います。
グラフcppにエラーがあり、
ほかにも競合するらしいです。。

1>.\mydat\source\graph.cpp(7) : warning C4244: '引数' : 'double' から 'float' への変換です。データが失われる可能性があります。
1>LINK : warning LNK4098: defaultlib 'LIBCMT' は他のライブラリの使用と競合していす。/NODEFAULTLIB:library を使用してください。

此方の環境は
visualC++2008

ちなみに、サンプル開いて変換ウィザード⇒リソースで実行という感じです。
自分の環境が悪いんでしょうか?
といってもこれだけじゃわかりませんよね。。

それとも、別の関係のないプロジェクトとライブラリが競合とかするのでしょうか?


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


Name: Justy  ..伝説なるハッカー(431,799ポイント)   Date: 2009/10/01(木) 21:00   No:39827     
Title: Re:館本編の、サンプルプログラム11章でエラーが起きます。    

>グラフcppにエラーがあり、

 エラーではなく、警告ですね。
 警告になる理由はそこに書かれている通り、double型から float型への変換は
情報が劣化する可能性があるからです。

コンパイラの警告 (レベル 2) C4244 (C++)
ttp://msdn.microsoft.com/ja-jp/library/2d7604yb(VS.80).aspx

 通常警告は無視するべきではありませんが、graph.cppのこの問題に関しては
無視しても構わないと思います。

 どうしても気になるようでしたら、明示的に float型にキャスト型にするか、
37章で解決が図られているのでそれを参考にして下さい。

龍神録プログラミングの館
ttp://dixq.net/rp/37.html



>ほかにも競合するらしいです

 プロジェクトの設定に問題があるからです。
 こちらに一応回避策が載っています。

C言語何でも質問掲示板
ttp://www.play21.jp/board/formz.cgi?action=res&resno=20874&page=&lognum=66&id=dixq&rln=20924



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



Name: まりも  ..ぴよぴよ(329ポイント)   Date: 2009/10/01(木) 00:28   No:39801       
Title: 演算子?実行結果がエンドレスになる    
C言語歴(と言っていいのかな?)1週間です。
for文をやってます。
四則演算は学生時代に習った算数と同じだと理解しています。
サンプルソースを実行後、数字の部分を色々変化させて、どういう実行結果になるのか
試していたのですが、途中でエンドレスの実行結果が出てしまい、なぜそうなってしまうのか
わからなくて困ってます。(参考書に見当たりませんでした;;)
きっと初歩的な事だと思うんですが、誰か教えて頂けないでしょうか?(泣)

下記がそのソースコードです。

#include <stdio.h>
main() {

int num ;
for ( num = 2 ; num >= 10 ; num*2)
{
printf("%d\n",num);
}
}
  ◆実行結果◆
 2
 2
 2
 2
 ・・・・・とエンドレスで2が出てきます。


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


Name: Ma  ..中級者(11,029ポイント)   Date: 2009/10/01(木) 00:34   No:39802     
Title: Re:演算子?実行結果がエンドレスになる    

#include <stdio.h>
main() {
for (int num = 2 ; num <= 10 ; num *= 2){
printf("%d\n",num);
}
}


こういうことがやりたいのかな。


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

Name: チルチル  ..熟練のプログラマー(55,092ポイント)   Date: 2009/10/01(木) 00:41   No:39803     
Title: Re:演算子?実行結果がエンドレスになる    
見た感じfor文は1回も実行されないように見えるんですけどね・・
エンドレスになるのはmain関数に問題があるのかもしれません
おそらく10以下の時にループしたいんだと思いますが
私もコードを書くとこんな感じでしょうかね・・

#include <stdio.h>
int main(void){
int num;
for ( num=2;num<=10;num*2 ){
printf("%d\n",num);
}
return 0;
}


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

Name: まりも  ..ぴよぴよ(383ポイント)   Date: 2009/10/01(木) 00:53   No:39804     
Title: Re:演算子?実行結果がエンドレスになる    
Maさん、真夜中に返答ありがとうございます。^^

num*2  で 表示すると 実行結果がエンドレスになってしまうのに
 num *= 2 だと      実行結果が 2・4・8 でちゃんと終了しました。

   ・・・・・なんででしょう??

  今はこういう実行結果を出したい!という視点ではなく(レベルでも無く・・・;;)
  どんなきまりで計算(実行?)するんだろう?
  って実行結果を見て確認しながら、理解を深めていっている段階です。 

  num*2 と num *= 2 はどう意味が違うんでしょう????
  (違うんだなって事だけわかりました。^^)

  
   


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

Name: sizuma  ..上級者(15,943ポイント)   Date: 2009/10/01(木) 01:03   No:39805     
Title: Re:演算子?実行結果がエンドレスになる    
num *= 2
これは
num = num * 2
ですよ。


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

Name: DVDM [URL]  ..入門者(3,223ポイント)   Date: 2009/10/01(木) 01:10   No:39807     
Title: Re:演算子?実行結果がエンドレスになる    
>>まりもさん
num*2 は単に値を二倍しているだけです。
numを2、4、8・・・としたいのであれば
この二倍したnumをnumに格納する必要があります。
(num*=2 は num=num*2 と同じ意味です)

つまり、for文でnumを倍にするという流れはこうなります。

■num*=2 または、num=num*2の場合
numの初期値が2ですので、
num *= 2 → num = num(2) * 2; ここでnumが4になります。
次のループで
num *= 2 → num = num(4) * 2; ここでnumが8になります。
次のループで
num *= 2 → num = num(8) * 2; ここでnumが16になり、num<=10の条件から外れますので
printfは呼ばれずに終了です。


■num*2の場合
numの初期値が2ですので、
num * 2 → num(2) * 2; numを二倍します。
次のループで
num * 2 → num(2) * 2; numを二倍します。
次のループで
num * 2 → num(2) * 2; numを二倍します。
これがずっと続くため、「num<=10」の条件を満たし続けているため無限ループになります。



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

Name: base  ..ぴよぴよ(14ポイント)   Date: 2009/10/01(木) 01:13   No:39808     
Title: Re:演算子?実行結果がエンドレスになる    
それはforの増分のところがnum*2になっているとnum*2はただ計算されて=ではないのでnumに代入されないためだと思います。

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

Name: まりも  ..ぴよぴよ(821ポイント)   Date: 2009/10/01(木) 01:14   No:39809     
Title: Re:演算子?実行結果がエンドレスになる    
チルチルさん回答ありがとうございます。
回答頂けて、とってもうれしいです。

さっそく書いてもらったコードの通りに打ちなおしてみました。

でも結果が・・・・エンドレスに!!;;(なんで?どうしてなんだろう???)

main関数はまだ全然勉強してないので、
(今使用の参考書には ”とりあえずおまじないと覚えててください”と説明)
おいおい調べていきたいと思います。

ちなみにコンパイラは gcc というものを使用しています。

私の四則演算の理解がまだまだ足りないなのかなぁ・・・。
でも・・こうやって、答えてくれる人がいるだけで、頑張るエネルギーがもらえます。
ありがとうです。


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

Name: まりも  ..ぴよぴよ(899ポイント)   Date: 2009/10/01(木) 01:33   No:39810     
Title: Re:演算子?実行結果がエンドレスになる    
DVDMさんへ
「きゃあああ〜」って思わず叫びたくなる位、わかりやすい回答でした。
 「なんでエンドレスになっちゃうの????」にしっかり答えてくれて感激です。
baseさんが答えてくれた中の言葉「代入」と
DVDMさんの「格納」はたぶん同じ意味だと思うのですが、
今回のエンドレス解決のキーワードは
まさしくこの「格納」「代入」の概念でした。!!

 = ・・・⇒ってすごい大事なキーワードだったんですねー!(しみじみ・・)
 まだ始めたばっかりですが、進んだり、戻ったりしつつ 理解していきますね♪

  問題がすっきり解決しました。
  超初歩的な質問に答えて頂いてありがとうございました。
  


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

Name: まりも  ..ぴよぴよ(969ポイント)   Date: 2009/10/01(木) 01:45   No:39811     
Title: Re:演算子?実行結果がエンドレスになる    
・・・・またまた超初心者の質問でごめんなさい><

問題解決したので終了(解決マークを出)したいのですが、
ど・・どーしたらいいんでしょう??

初めて投稿したのでやり方がわかりません。・・・orz

ごめんなさい・・・。


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

Name: DVDM [URL]  ..入門者(3,494ポイント)   Date: 2009/10/01(木) 04:15   No:39812     
Title: Re:演算子?実行結果がエンドレスになる    
>>まりもさん
コメントを掲示板に投稿する時に、下の方にあります
マーク □解決!
の所にチェックを入れたあと 「投稿」 ボタンを押すと解決マークが付きます。


>baseさんが答えてくれた中の言葉「代入」と
>DVDMさんの「格納」はたぶん同じ意味だと思うのですが、

私の中で変数は箱のイメージがあるため、
そこにモノ(値)を格納するという意味合いでこの言葉を使っています・・・
わかりにくい表現で申し訳ないです;
代入という意味で捉えて頂ければOKです。


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

Name: conio [URL]  ..熟練のプログラマー(52,853ポイント)   Date: 2009/10/01(木) 08:03   No:39815     
Title: Re:演算子?実行結果がエンドレスになる    

>>チルチルさん
>>見た感じfor文は1回も実行されないように見えるんですけどね・・
>>エンドレスになるのはmain関数に問題があるのかもしれません

>>私もコードを書くとこんな感じでしょうかね・・

#include <stdio.h>
int main(void){
int num;
for ( num=2;num<=10;num*2 ){
printf("%d\n",num);
}
return 0;
}

今回の場合はmain関数が問題ではないですし、for文も実行されています。
原因はnumの値が変化しないので無限ループになっていることです。

コードもこう修正するべきでしょう。
------------------------------------------------------------
for ( num=2;num<=10;num*2 ){

for ( num=2;num<=10;num*=2 ){
------------------------------------------------------------

【追記】
まりもさんが一番初めに書かれたコードではnum >= 10となっていて、
for文の中身は実行されないようになっていました。
失礼しました。
ただ、「無限ループになっていた」との事なので、継続条件の所は記述ミスなのかな と思ったり。


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

Name: まりも  ..かけだし(1,005ポイント)   Date: 2009/10/01(木) 19:56   No:39826 解決!     
Title: Re:演算子?実行結果がエンドレスになる    
DVDMさん
またまた 終了の仕方を教えてくれて感謝です。アリ(´・ω・)(´_ _)ガト♪

conioさん

おっしゃる通り 継続条件の所 num >= 10 は記述ミスでした。
               num <= 10 が実際のコードです。

  果てしなく繰り返し計算されちゃうこの状態を「無限ループ」って言うんですねぇ・・。
  まだまだ知らない言葉がイッパイで「???」状態ですが、
  一個一個用語を覚えていくのも、今は新鮮で楽しいです。

  これからも頑張って楽しくC言語理解してこうと思います。

  回答をくださった皆様ありがとうございました。
  これにて〆ます。


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



Name: usami  ..入門者(4,348ポイント)   Date: 2009/09/30(水) 19:36   No:39776       
Title: Cの文字列の扱いが得意な人へ、質問です    
たびたびお世話になっております。

DxLib現在簡単なゲームを作っているのですが、
ファイルからキャラクターのパラメータを読み込み、
それを変数へ反映させようとして、トラぶっています。

コードはこんな感じ↓

{
int file=FileRead_open("ファイル名");
int parm[6];   //パラメータ格納用。
char str[50];

FileRead_gets(str, sizeof(str), file);
     //一行読み込み、仮に"000,001,002,003,004,005,";
str2[6][3];

for(int i=0;i<6;i++){
memcpy(&str2[i],&str[i*4],sizeof(str2[0]));

parm[i]=atoi(str[i]);
}


原因は、memcpyの扱い方だと思うのですが、
たとえば
str2[0][0],str2[0][1],str2[0][3],
ここについては、きちんと=0,=0,=0
と格納されているのですが、
str2[0]全体の値は、
"0x0012e5ac "000001002003004005006フフフフフフフフフフフフフフフフフフフフフフフ…(中略)"
とか、なっている。
で、結局parmには、全然意図してない、値が入ってしまう。
parm[0]=atoi(str2[0][0])*100+atoi(str2[0][1])*10+atoi(str[0][2]);
とかでは、
数が増えてきたとき、面倒そうなので、
なにかすっきりした、解決策を思いつく方は教えてください。


PS:
前回の質問は、メモリについてどんなものなのか、
まったく認識しておらず(今でも漠然)、
トンチンカンなコメントをしたように思います。
ご迷惑をおかけしました。


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


Name: ランド  ..初心者(5,251ポイント)   Date: 2009/09/30(水) 19:46   No:39777     
Title: Re:Cの文字列の扱いが得意な人へ、質問です    
文章の終わりを示す、NULL('\0')が含まれていないからではないでしょうか。
char型の配列に1文字分の余裕を持たせる必要があると思います。

# memcpyを使ったことがないほど、文字列の扱いが不十分なので曖昧な回答ですが・・・

# 追記
検索してみたところ、memcpyは空文字('\0')を付加せず、
また、途中に空文字が含まれていてもコピーを続ける関数だそうです。


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

Name: non  ..熟練のプログラマー(63,635ポイント)   Date: 2009/09/30(水) 20:01   No:39778     
Title: Re:Cの文字列の扱いが得意な人へ、質問です    
プログラムの意味がわかりません。

>int file="ファイル名";
これはエラーでしょう。

>FileRead_gets(std, sizeof(std), file);
stdって何ですか?strかな?

>str2[6][3];
"000"を入れるなら4バイト必要では?

>//一行読み込み、仮に"000,001,002,003,004,005,006,";
データは7個あるみたいだけど?

データが1行にカンマ区切りで7個ある数値をファイルから読みたいという
ことなのでしょうか?
必ずこうだというのなら
int parm[7];
sprintf(str,"%d,%d,%d,%d,%d,%d,%d",&parm[0],&parm[1],&parm[2],&parm[3],&parm[4],&parm[5],&parm[6]);
でよいのでは。









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

Name: usami  ..入門者(4,448ポイント)   Date: 2009/09/30(水) 20:07   No:39779 解決!     
Title: Re:Cの文字列の扱いが得意な人へ、質問です    
その通りでした。


str2[6][3];

for(int i=0;i<6;i++){
memcpy(&str2[i],&str[i*4],sizeof(str2[0][0]*2));
str2[i][2]='\0';
parm[i]=atoi(str[i]);
}

……一瞬で解決(!_!)

すごく簡単な質問で、逆に申しわけなかったです。
ランドさんありがとうございました。


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

Name: usami  ..入門者(4,618ポイント)   Date: 2009/09/30(水) 20:26   No:39781     
Title: Re:Cの文字列の扱いが得意な人へ、質問です    
non さんのご指摘とおりです。

コードは、即興で書かせてもらったものなので、
誤植が多々あったようです。
修正しておきましょう。


今回、フォーマットについては、
未だ制作途中(仮データ)なので、
あまり考えていないのですが、
フォーマットを決定した場合は、
参考にさせていただきたいと思います。

non さん、
ご意見ありがとうございます。


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

Name: zwi  ..初心者(6,722ポイント)   Date: 2009/09/30(水) 20:48   No:39783     
Title: Re:Cの文字列の扱いが得意な人へ、質問です    
for(int i=0;i<6;i++){
memcpy(&str2[i],&str[i*4],sizeof(str2[0][0]*2));
str2[i][2]='\0';
parm[i]=atoi(str[i]);
}
↑かなり間違ってます。3桁の数字なのに先頭2文字づつ処理でよいのかとか。

まず、理解して欲しいのは文字列は必ず'\0'で終わないといけません。
なので、"000"は実際は4バイトです。
コピーするときは'\0'も含めてコピーするか、元に無い場合は自分で追加で書き込んでやる必要があります。

下記サイトの初級篇の文字列処理までを読んでみてください。
http://www.nurs.or.jp/~sug/soft/tora/index.htm

いくつか文字列と配列やポインタのサイトを載せますのでまず読んでみてください。
http://www2.netf.org/pointer3.html
http://www005.upp.so-net.ne.jp/h-masuda/cl/CStrPnt/c1030.html
http://www9.plala.or.jp/sgwr-t/c/sec10-3.html
http://itpro.nikkeibp.co.jp/article/COLUMN/20061031/252216/
ここで、ちゃんと文字列を理解する事から始めましょう。


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

Name: usami  ..入門者(4,626ポイント)   Date: 2009/09/30(水) 20:56   No:39786     
Title: Re:Cの文字列の扱いが得意な人へ、質問です    
失礼しました。

実は現在、作成している方のパラメータが、
2桁の数字だったので、
そのコードと混乱して、
違う方を乗せてしまったようなのです。

もちろんおっしゃる通りです。
上記のコードに倣うなら、このように書くべきなのかな?
誤解をさせて申し訳ありません。

str2[6][4];

for(int i=0;i<6;i++){
memcpy(&str2[i],&str[i*4],sizeof(str2[0][0]*3));
str2[i][2]='\0';
parm[i]=atoi(str[i]);
}


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

Name: zwi  ..初心者(6,940ポイント)   Date: 2009/09/30(水) 21:18   No:39787     
Title: Re:Cの文字列の扱いが得意な人へ、質問です    
ちなみにスマートに処理するには、こんな方法もあります。

char *token;
int i;
i=0;
token = strtok(str,",");
while( token!=NULL ) {
parm[i]=atoi(token);
i++;
token = strtok(NULL,",");
}



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

Name: usami  ..入門者(4,718ポイント)   Date: 2009/10/01(木) 00:21   No:39799     
Title: Re:Cの文字列の扱いが得意な人へ、質問です    
zwi さん、コメントありがとうございます。

トークン切り出しはわかりやすくていい思います。


あと、いろいろ考えて一番単純なのは、nonさんの、

sscanf(),ssprintf();

の利用だと思いました。

プログラムは単純であるほど、冴えていると思うので、
こうしてみると、
七面倒なやり方してたなぁと、
思いますね。

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


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

Name: conio [URL]  ..熟練のプログラマー(53,511ポイント)   Date: 2009/10/01(木) 09:06   No:39816     
Title: Re:Cの文字列の扱いが得意な人へ、質問です    
------------------------------------------------
もちろんおっしゃる通りです。
上記のコードに倣うなら、このように書くべきなのかな?
誤解をさせて申し訳ありません。

str2[6][4];

for(int i=0;i<6;i++){
memcpy(&str2[i],&str[i*4],sizeof(str2[0][0]*3));
str2[i][2]='\0';
parm[i]=atoi(str[i]);
}
------------------------------------------------
これも違うと思います。
3文字の後にナル文字を付加させるのであれば、str2[i][3]='\0';だと思いますし、
atoi関数は文字列を渡さないといけないので、str[i]だと文字列ではないのでエラーになるかと。
atoi関数のところは、parm[i]=atoi(str2[i]);としてみてはどうでしょうか。

あとchar型は1バイトで確定しているので、sizeofは使わなくても、
普通に3文字であれば 3 と書いて問題ないはずです。


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



Name: 電気屋  ..ぴよぴよ(856ポイント)   Date: 2009/09/30(水) 13:35   No:39771       
Title: 全方向型シューティングゲーム2    
前回のアドバイスに「プログラムをのせると解説しやすい」とかかれていたので乗せます。

/方向キー入力で変数mukiに0〜3を入れる
if( Key[ KEY_INPUT_UP ]==1)
muki=0;
if( Key[ KEY_INPUT_LEFT ]==1)
muki=1;
if( Key[ KEY_INPUT_DOWN ]==1)
muki=2;
if( Key[ KEY_INPUT_RIGHT ]==1)
muki=3;


//         yを減らす
//           ↑
//           ↑
//           ↑
//   xを減らす ←←←★→→→ xを増やす
//           ↓
//           ↓
//           ↓
//         yを増やす
// 



switch (muki){
case 0://キャラクターが上を向いていたら
for(i=0;i<SHOTMAX;i++){
if(tama[i].flag==1){ //発射している玉なら
tama[i].y-=SHOTSPEED; //y座標を減らす
DrawGraph( tama[i].x , tama[i].y , image[muki] , TRUE );//玉を描画
if(tama[i].y < -32){ //もし画面外まで来たら
tama[i].x=320; //初期値に戻し
tama[i].y=240;
tama[i].flag=0; //発射フラグを戻す
}
}
}
break;

このような感じで4方に打てるようにがんばっているのですが、うまくいかないのでアドバイスお願いします。
また、弾は始点から発射されたらその場所から画面の端まで方向を変えず、進むようにしたいと思っています。


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


Name: zwi  ..初心者(6,318ポイント)   Date: 2009/09/30(水) 14:01   No:39772     
Title: Re:全方向型シューティングゲーム2    
弾の構造体に方向を持っていないと、常にカーソルの押されている方向になっちゃいますね。
1.まずカーソルの押された方向では無く常に自機の向きを覚えている変数を作る事。
2.カーソルを押されたら自機の向きを覚えている変数を更新する事。
3.弾の構造体に弾の向きを覚える変数を追加する事。
4.弾の発射時に、自機の向きを弾の向きにコピーする事。
5.弾の移動処理の移動方向は弾の向きを見て行う事。

弾の移動処理はこんな感じで。

for(i=0;i<SHOTMAX;i++){
switch (tama[i].muki){
case 0://弾が上を向いていたら
if(tama[i].flag==1){ //発射している玉なら
tama[i].y-=SHOTSPEED; //y座標を減らす
if(tama[i].y < -32){ //もし画面外まで来たら
tama[i].x=320; //初期値に戻し
tama[i].y=240;
tama[i].flag=0; //発射フラグを戻す
} else {
DrawGraph( tama[i].x , tama[i].y , image[muki] , TRUE );//玉を描画
}
}
break;
case 1:



}
}




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

Name: チルチル  ..熟練のプログラマー(55,031ポイント)   Date: 2009/09/30(水) 23:21   No:39797     
Title: Re:全方向型シューティングゲーム2    
少し気になったんですが弾は4方向にしか撃てないのでしょうか?
右と上を押したら右上に撃てたりする方が便利だと思うのですが・・

あと方向より角度の方が簡単ではないでしょうか?
mukiでスイッチ文を行う必要も無くなりますし・・

tama[i].x=320; //初期値に戻し
tama[i].y=240;
↑これって必要なんでしょうか?
弾が自機から出ても中心から出ても登録時に初期化すれば良いような気がするのですが・・

tama[i].y-=SHOTSPEED; //y座標を減らす
↑弾の速度って不変なんでしょうか?
色々な速度の弾があった方が良いような気もしますが・・

DrawGraph( tama[i].x , tama[i].y , image[muki] , TRUE );//玉を描画
↑これも角度使った方が効率良くないでしょうか?


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

Name: DVDM [URL]  ..入門者(3,555ポイント)   Date: 2009/10/01(木) 07:15   No:39814     
Title: Re:全方向型シューティングゲーム2    
弾の移動処理ですが、弾を打ち出す角度(ラジアン)と弾の速さを与えてやることで
このように書くことができます。

弾のX座標 += 弾の速さ * cos(打ち出したい角度);
弾のY座標 += 弾の速さ * sin(打ち出したい角度);

角度はラジアンです。
ラジアンの求め方は、「角度*円周率PI/180」で求められます。
また、cos、sin は「#include <math.h>」 が必要です。


■速度5で、90度(下)の方向に打ちたい場合
弾のX座標 += 5 * cos(90*3.14/180);
弾のY座標 += 5 * sin(90*3.14/180);


■速度3で、225度(左上)の方向に打ちたい場合
弾のX座標 += 3 * cos(225*3.14/180);
弾のY座標 += 3 * sin(225*3.14/180);


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



Name: 電気屋  ..ぴよぴよ(986ポイント)   Date: 2009/09/30(水) 14:51   No:39773       
Title: 会話シーン    
どうも、たびたび書かせてもらう電気屋です。
今回は、会話シーンの作成についてですが、たぶん過去にも同じような質問をした方がいたと思ったのですが、なかなか見つかりません。どなたか質問をしましたか?
もし、自分の勘違いなら、作成の方法を聞きたいと思っています。そのときは、このページを削除して新規で作成します。


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


Name: Ma  ..中級者(10,971ポイント)   Date: 2009/10/01(木) 00:28   No:39800     
Title: Re:会話シーン    
>会話シーンの作成
何がしたいのかまったく分かりませんが、とりあえず会話文の文章表示は以下参考
(DXライブラリと仮定)

s2. サウンドノベル風文字列表示法1
http://dixq.net/g/#s2


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

Name: sizuma  ..上級者(15,955ポイント)   Date: 2009/10/01(木) 01:05   No:39806     
Title: Re:会話シーン    
上のほうのリンクから過去ログが検索できますよ。

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

Name: 電気屋   Date: 2009/10/15(木) 11:38   No:397731255574283 解決!     
Title: Re:会話シーン    
どうも、お手数をかけます




Name: koburouuu [URL]  ..ぴよぴよ(449ポイント)   Date: 2009/09/25(金) 22:49   No:39616       
Title: 超初心者です    
また、立てました疑問があったら書くのでよろしくお願いします。kazuoniさん、何度も回答してくださってありがとうございます。

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


Name: koburouuu [URL]  ..ぴよぴよ(507ポイント)   Date: 2009/09/26(土) 00:34   No:39618     
Title: Re:超初心者です    
33章からゲーム本題やロードに飛ぶにはどのような関数でつなげればいいのでしょうか?34章が近いのでしょうか。

それと、WinMainが複数あり一つだけにしたい場合
WinMainの一行を消した後どのようにソースをくっつければいいのでしょうか?


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

Name: kazuoni [URL]  ..ハッカー(108,768ポイント)   Date: 2009/09/26(土) 00:49   No:39619     
Title: Re:超初心者です    
>どのような関数
その機能を実装した関数ですね。
分岐の仕方は34章みたいな感じですね。

>それと、WinMainが複数あり一つだけにしたい場合
>WinMainの一行を消した後どのようにソースをくっつければいいのでしょうか?
恐らくまだ関数の意味が理解できていないのでは?
一度入門サイトの関数のあたりを見直されることをお勧めします。


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

Name: koburouuu [URL]  ..ぴよぴよ(516ポイント)   Date: 2009/09/26(土) 01:12   No:39620     
Title: Re:超初心者です    
分かりました入門サイトをみてみたいと思います。
それでも、分からない場合ここで質問します。


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

Name: koburouuu [URL]  ..ぴよぴよ(626ポイント)   Date: 2009/09/26(土) 10:45   No:39626     
Title: Re:超初心者です    
やはり調べてもよくわかりません。
WinMainの代わりに何かを入れるのでしょうか?
何かのかたちを変えるのでしょうか?

説明が長くなり、どこかのサイトを見れば
私に分かりそうな文がのっているならば
urlを書いてください。


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

Name: すずめ  ..入門者(3,838ポイント)   Date: 2009/09/26(土) 12:04   No:39627     
Title: Re:超初心者です    
WinMainというのは
int WINAPI WinMain(HINSTANCE hInstance........のことですか?

これはmain.cppに一つだけあるもので、なぜ二つあるのか?
あと一つはどのcppファイルにあるのか?
興味があるので教えてください。


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

Name: kazuoni [URL]  ..ハッカー(108,835ポイント)   Date: 2009/09/26(土) 13:15   No:39630     
Title: Re:超初心者です    
なるべく原型をとどめました。
セーブなどの関数は組んでいません。
フローだけを書きました。
あとは、自分で関数を作成していってください。


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

Name: koburouuu [URL]  ..ぴよぴよ(713ポイント)   Date: 2009/09/26(土) 21:32   No:39635     
Title: Re:超初心者です    
ありがとうございます!kazuoniさん

それと、すずめさん
int WINAPI...のことです。
一つのファイルにこれを二つ入れてはいけないということは分かったのですが、これを二つから一つにするときに  int WINAPI...の一文を消したあとの処理が分からなくて質問しました。


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

Name: koburouuu [URL]  ..ぴよぴよ(744ポイント)   Date: 2009/09/26(土) 23:50   No:39641     
Title: Re:超初心者です    
NO.39630のkazuoniさん
アップされたテキストにWinMainが入っていたのですが、、、
あのint WINAPIを消したかったんですが。


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

Name: kazuoni [URL]  ..ハッカー(109,326ポイント)   Date: 2009/09/27(日) 00:03   No:39642     
Title: Re:超初心者です    
>アップされたテキストにWinMainが入っていたのですが、、、

これは必須です^^;
以前にアップされたコードにはWinMainが複数個所に見られました。
自分もあまり詳しくないので、大それたことは言えませんが、
とりあえず、1つのプロジェクトに1つのWinMainと覚えておいてください。
C言語もそうですよね。


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

Name: koburouuu [URL]  ..ぴよぴよ(782ポイント)   Date: 2009/09/27(日) 00:14   No:39643     
Title: Re:超初心者です    
画像で説明したいのですがup出来ませんでした。
メールなど送っていただけませんか?
mail欄にはアドレスを書きましたので、、、


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

Name: koburouuu [URL]  ..ぴよぴよ(809ポイント)   Date: 2009/09/27(日) 00:34   No:39644     
Title: Re:超初心者です    
もしかして、cppファイルは複数でも一つのプログラムになるのでしょうか?

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

Name: すずめ  ..入門者(4,023ポイント)   Date: 2009/09/27(日) 00:38   No:39645     
Title: Re:超初心者です    
ゲームプログラミングの館は、たとえば33章と34章は別物で
33章のサンプルが実行できたら33章はそれで終わりですので、
34章をやるときは新たなプロジェクトを作り直す必要があります。
または33章のサンプルを全部消して、34章のサンプルをコピペしても
いいと思います。

私も初心者ですが、まずシューティングゲームの館を勉強してから
龍神録の館に進みました。
ゲームプログラミングの館は特別な技が必要なときに
参考にしています。


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

Name: kazuoni [URL]  ..ハッカー(109,382ポイント)   Date: 2009/09/27(日) 01:03   No:39646     
Title: Re:超初心者です    
画像はアップローダーにアップしたほうがいいですよ。
添付ファイルには容量制限ありますし。

>もしかして、cppファイルは複数でも一つのプログラムになるのでしょうか?

「分割コンパイル」と検索してみてください。


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

Name: zwi  ..初心者(5,612ポイント)   Date: 2009/09/27(日) 12:39   No:39663     
Title: Re:超初心者です    
>もしかして、cppファイルは複数でも一つのプログラムになるのでしょうか?

1つのプログラム(exe)には、1つのWinMainしか許されませんね。
そのプログラムが1つのcppであるか、複数のcppであるかには関係ないんです。
2つもあったら、どっちのWinMainを実行してよいか分から無いからって事です。


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

Name: koburouuu [URL]  ..ぴよぴよ(873ポイント)   Date: 2009/09/27(日) 23:22   No:39698     
Title: Re:超初心者です    
では、一つにするにはどうやればいいのでしょうか。
前の私の別の投稿にcppファイルがあるので、見てください。

それと、kazuoniさん
なぜか、
up出来ないんです!!

この返信や投稿は全てpspでやっているので不安定だということもあるのですが、、、

BMPファイルをupしようとしたらファイルのサイズと英文が出てきて
up出来ません。
的なことになります。


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

Name: koburouuu [URL]  ..ぴよぴよ(948ポイント)   Date: 2009/09/27(日) 23:36   No:39700     
Title: Re:超初心者です    
senduitというアップローダーを新しく見つけたので来てください。
url::
http://senduit.com/4529fc
です。一日たったら消えるので注意してください。
拡張子はBMPビットマップです。


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

Name: koburouuu [URL]  ..かけだし(1,196ポイント)   Date: 2009/09/27(日) 23:58   No:39701     
Title: Re:超初心者です    
WinMainのことについてかきます。
今の状態だと一つのプログラムに2回WinMainを呼び出しています。
なので一つにしようと最初のほうの呼び出しは残しておいてあとの呼び出しをすべて削除しました。
すると、指令全体の構造・つながりがぐちゃぐちゃになってしまいます。
こんな状態です。
kazuoniさんが上の方にupしてくれたのですが、
あの指令の中にWinMainが入っていました。
当然ですが、あのひと固まりだけで動かすにはWinMainが必要です。
しかし、私はあのひと固まりを既にWinMainのあるファイルに入れようと思っています。
なので、二回呼び出すことになってしまいます。


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

Name: kazuoni [URL]  ..ハッカー(109,634ポイント)   Date: 2009/09/28(月) 01:42   No:39708     
Title: Re:超初心者です    
まず、自分がNo:39630であげたコードが
最低限のフローを書いたものなので、
koburouuuさんのものに組み込む必要はありません。
とりあえず、No:39630で挙げたコードだけで動きますので。

あと、C言語でいいので、総復習されたほうがいいかと思います。
まだ、関数が理解できていないようなので・・・。


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

Name: koburouuu [URL]  ..かけだし(1,251ポイント)   Date: 2009/09/28(月) 06:57   No:39711     
Title: Re:超初心者です    
出来るだけ自分で探しますが、、、
いいサイトは無いですか?


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

Name: zwi  ..初心者(5,720ポイント)   Date: 2009/09/28(月) 08:02   No:39713     
Title: Re:超初心者です    
C言語の基本がちゃんとしてないと早晩に行き詰まります。現状がそうかもしれませんが。
お勧めのサイトをいくつか紹介しておきますので参考にしてください。どれかメインサイトを決めて、他のサイトは悩んだときに比べてみると理解の手助けになると思います。
http://homepage3.nifty.com/mmgames/c_guide/
http://www5c.biglobe.ne.jp/~ecb/c/c00.html
http://www.geocities.jp/ky_webid/c/index.html

お勧めの本。
「Cの絵本」メインの参考図書にはなりませんが分かりやすいので。
http://www3.ank.co.jp/books/2002/c_ehon.html
「明解C言語入門編」
http://www.bohyoh.com/Books/MeikaiC01/


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

Name: koburouuu [URL]  ..かけだし(1,272ポイント)   Date: 2009/09/29(火) 16:54   No:39755     
Title: Re:超初心者です    
返信遅れてすいません

ありがとうございます


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

Name: ディア  ..かけだし(2,478ポイント)   Date: 2009/09/30(水) 16:06   No:39774     
Title: Re:超初心者です    
自分も同じような状態だったので、見させていただいてました。

質問なのですが、Game()関数やSave()関数にはどんなことを書いたらいいのでしょうか?


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

Name: conio [URL]  ..熟練のプログラマー(52,576ポイント)   Date: 2009/09/30(水) 20:55   No:39785     
Title: Re:超初心者です    
>>質問なのですが、Game()関数やSave()関数にはどんなことを書いたらいいのでしょうか?
それはディアさん次第です。


何を作ろうとして、その為にどんな関数があって、どういう処理をしなければならないのか?
を考えて、それに応じてコードを書いていけばいいと思います。

別にセーブ機能を付けようと思わなければSave関数は必要ないですし、
関数名が自分にとって分かりにくいのであれば、RankingDataSave()みたいに関数の名前を変更しても良いですし、
セーブ機能を付けたいのなら、セーブに必要な具体的な処理(テキストファイルを開いてデータを書き出す等)を
関数の中に書いていけばいいでしょう。

別に共同制作などでなければ、
プログラムの構造や、関数、処理内容等は、すべて自分自身で決めて行くことになるかと。


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



Name: マウ  ..入門者(3,757ポイント)   Date: 2009/09/24(木) 12:06   No:39573       
Title: たびたびすいませんが    
VC++からVBのslnを起動させるにはどのようにすればいいのでしょうか。

項目(例スタート)を選択し決定したらVBを起動するようにしたいのですが・・・


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


Name: マウ  ..入門者(3,757ポイント)   Date: 2009/09/28(月) 10:12   No:39716     
Title: Re:たびたびすいませんが    
VC++からVBで作ったものを起動することはできるのでしょうか?

Name: zwi  ..初心者(5,954ポイント)   Date: 2009/09/28(月) 10:27   No:39717     
Title: Re:たびたびすいませんが    
>VC++からVBのslnを起動させるにはどのようにすればいいのでしょうか。
StandardEdtion以上ならslnは開けるとは思います。ExpressEdtionは試した事が無いので分かりません。

>VC++からVBで作ったものを起動することはできるのでしょうか?
VBで作ったexeファイルなら起動できます。
リンクしたいと言う意味なら、CからVBを呼ぶ事はたぶん出来なかったと思います。Cで作ったDLLをVBから呼び出す事は出来ます。C#なら面倒ですがリンクできない事は無いみたいです(やった事は無いのですが)。


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

Name: マウ  ..入門者(3,793ポイント)   Date: 2009/09/28(月) 14:39   No:39719     
Title: Re:たびたびすいませんが    
ありがとうございました。

もう一つお聞きしたいのですが、EXEを起動する際に必要なプログラムは

どのようなものなんでしょうか。


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

Name: zwi  ..初心者(6,035ポイント)   Date: 2009/09/28(月) 15:51   No:39720     
Title: Re:たびたびすいませんが    
いくつか方法があります。下記サイトをみてください。C++とサイト名はなってますがC言語です。
http://www11.plala.or.jp/studyhall/cpp/system.html
どれも起動できるだけでコントロールする事は出来ません。



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

Name: マウ  ..入門者(3,849ポイント)   Date: 2009/09/30(水) 11:56   No:39769     
Title: Re:たびたびすいませんが    
ありがとうございました。無事できました。

そして次の段階でまたつまずいてしまったのですが、

起動したVBのEXEをVCの中で表示することはできますでしょうか?



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

Name: zwi  ..初心者(6,147ポイント)   Date: 2009/09/30(水) 12:40   No:39770     
Title: Re:たびたびすいませんが    
それは簡単には無理ですね。別のプログラムですし。
ウィンドウ同士だから強引にVC側のウィンドウに貼り付ける事は出来る気がするんですが、私はやった事がありませんので具体的な方法を知りません。
イメージ的には、VBの親ウィンドウをサーチしてハンドルを得ます。
で、VBの親ウィンドウを子ウィンドウ化してVC側の親ウィンドウに貼り付けます。
って感じできると思うのですが、やった事が無いので出来ると断言する自信はありません。
WindowsOSのウィンドウの仕様とWindowsAPIで出来る事を自力で沢山調べて色々とやってみていただくしか無いかと思います。サンプルサイトもたぶん見つからない可能性が高いのですね。



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



Name: JK  ..かけだし(1,826ポイント)   Date: 2009/09/30(水) 04:37   No:39765       
Title: 関数のエラー?    
こんばんは このたびVC++でシューティングゲームのプログラムを組んでいるのですが

img、BG、Playerそれぞれ 識別子は引数依存の照合を使用しても見つかりません。と出ます。Cは基礎は抑えてますがあまり詳しい事は存じてません。
OSはXPです。Microsoft Visual Stdio.NET 2003を使用してます。

以下ソースです。
SHOOTクラス

public SHOOT class{


char Key[256];
int white, BGimg;

typedef struct{
double x,y; //座標
int shot [11][15];
} BODY_player; //double型のx,yのメンバを持つ構造体、別名BODY_player

BODY_player Player;

void img(){
BGimg = LoadGraph("image/back.bmp"); //imgフォルダにあるback.pngを読み出す

layerImg = LoadGraph("image/Player.bmp");

}

void BG(){
DrawGraph(0,0, BGimg, FALSE); //背景 FALSEは透過処理を行わない

}
void color(){
white = GetColor(255,255,255); 

}

void Player(){
if(Key[KEY_INPUT_LEFT]==1){ //左キーが押されたらPlayer.xの値を引く

Player.x-4.0; //X軸-4動かす

if(Player.x<10.0) //画面の端に行き過ぎないための処理

Player.x=10.0; //画面の端に行き過ぎてたらXを10にする

}


if(Key[KEY_INPUT_RIGHT]==1){ //左キーが押されたらPlayer.xの値をたす
Player.x+4.0; //X軸+4動かす

if(Player.x>450.0) //画面の端に行き過ぎないための処理

Player.x=450.0; //画面の端に行き過ぎてたらXを450にする

}


if(Key[KEY_INPUT_UP]==1){ //左キーが押されたらPlayer.xの値をたす
Player.y+4.0; //Y軸+4動かす

if(Player.x<20.0) //画面の端に行き過ぎないための処理

Player.x=20.0; //画面の端に行き過ぎてたらYを20にする

}

if(Key[KEY_INPUT_RIGHT]==1){ //左キーが押されたらPlayer.xの値を引く
Player.x+4.0; //Y軸-4動かす

if(Player.y>470.0) //画面の端に行き過ぎないための処理

Player.x=470.0; //画面の端に行き過ぎてたらYを470にする

}

DrawGraph((int)Player.x-15, (int)Player.y-24, PlayerImg, TRUE); //プレイヤー TRUEは透過処理を行う
}

void Coordinates(){
Player.x=200.0;

Player.y=400.0;

}


以下cpp


#include "DxLib.h"
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){


char Key[256];

ChangeWindowMode( TRUE ) ;//ウィンドウモードに変更する関数
if( DxLib_Init() == -1 ) return -1;//初期化処理する関数

int FPS = 0;


SetDrawScreen( DX_SCREEN_BACK ) ; //画面裏設定

while(ProcessMessage() == 0 && GetHitKeyStateAll(Key) == 0){ //GetHitKesStateAllはキーボードのすべてのキーの押下状態を取得する


FPS = GetNowCount(); //現在の時間を取得

ClearDrawScreen(); //画面裏すべて削除

img();
BG();
Player();
ScreenFlip(); //裏画面データを表へ

if(Key[KEY_INPUT_ESCAPE]==1) break; //もしESCが押されたら終了
while(GetNowCount() - FPS <17);



}
WaitKey();

DxLib_End() ;//終了処理をする関数
return 0 ;

}

長文ですいませんがどなたか原因が分かる方がいらっしゃいましたら教えていただけると幸いです。
よろしくお願いいたします。


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


Name: JK  ..かけだし(1,900ポイント)   Date: 2009/09/30(水) 04:40   No:39766     
Title: Re:関数のエラー?    
申し訳ありません。削除キーを入れ忘れてしまいました上にタグの使い方を誤っていたようです。
大変ご迷惑をおかけしました。この場を借りて謝罪させていただきます。

大変厚かましいと思いますがもし原因が分かる方がいらっしゃったら教えていただけますでしょうか
お願いいたします


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

Name: conio [URL]  ..熟練のプログラマー(52,349ポイント)   Date: 2009/09/30(水) 08:15   No:39767     
Title: Re:関数のエラー?    
これは、こうじゃないですか?
--------------------------
public SHOOT class{

class SHOOT{
--------------------------
それと、クラスの中で関数の定義を書いてますが、関数の宣言部と実装部は分けたほうが良いと思います。
で、クラスの閉じカッコが見当たらないんですけども、コピペミスですか?

WinMain関数内で、img();とか関数を読んでますけども、
C++のクラスはアクセス指定子をつけないと基本private属性になるのでアクセス出来ません。
というより、呼び出し方もおかしいです。

クラス型のオブジェクトを作り、メンバアクセス演算子 . で呼び出したりします。
------------
SHOOT st;
st.img();
------------


あと、クラス内部についてですが、
LoadGraph()やGetColor()はコンストラクタ内でやってしまった方がいいのではないでしょうか?

Player関数については、操作と描画を両方行っていますが 操作と描画は分けたほうが良いと思います。
その前に、構造体"BODY_player"のPlayer と、メンバ関数のPlayer()、名前が同じなので恐らく 多重定義の
エラーも出ると思います。
名前が被らないようにしてください。


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

Name: zwi  ..初心者(5,985ポイント)   Date: 2009/09/30(水) 09:48   No:39768     
Title: Re:関数のエラー?    
そもそも疑問なんですが、C言語の基礎しか終わっていないと言われてますのでC++言語は理解されていないんですよね?クラスのインスタンスも作られていませんし。それなのになぜC++の機能であるクラスを使われているのでしょうか?
DXライブラリを使うならC言語だけで組めますし、C++を使うならC++を勉強する必要がありますが。
C++を更に覚えるのは大変ですよ。

まず、クラス宣言を外してください。それでC言語の文法になります。
public SHOOT class{
}
それで同じソース内にWinMainがあるならコンパイルが通ると思います。


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



Name: チルチル  ..熟練のプログラマー(52,272ポイント)   Date: 2009/09/27(日) 16:04   No:39665       
Title: メンバ関数の関数ポインタ    
void(*Menu[])(void)={

Title,
Protocol,
Scene.Number,
Loop.End,
};
Menu[i]();

C++で上のような感じの関数ポインタを作りたいのですが
関数のポインタとメンバ関数のポインタが混在していたり
メンバ関数のポインタだけでもエラーが出ます
書き方が間違っているのでしょうか?

環境は「Microsoft Visual C++ 2008 Express Edition」です


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


Name: MNS  ..上級者(17,178ポイント)   Date: 2009/09/27(日) 16:15   No:39666     
Title: Re:メンバ関数の関数ポインタ    
どの関数がメンバ関数でしょうか?

メンバ関数のポインタを取得するには、
そのメンバ関数をクラス名で修飾し、&演算子を使う必要があります。
また、関数ポインタはいわゆる「メンバ関数ポインタ」というものとなり、
クラスの参照が必要となります。

例:

class TestClass
{
public:
void func(){}
};

int main()
{
void (TestClass::*pfunc)() = &TestClass::func;
//以下のようにして呼び出す
TestClass tc;
(tc.*pfunc)();
}


メンバ関数が静的メンバならば、
void (*pfunc)() = &TestClass::func;
このように、通常の関数ポインタとしても利用できます。


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

Name: チルチル  ..熟練のプログラマー(52,577ポイント)   Date: 2009/09/27(日) 17:04   No:39667     
Title: Re:メンバ関数の関数ポインタ    
void(*Menu[])(void)={

Title,//Title関数
Protocol,//Protocol関数
Scene.Number,//SceneクラスのNumber関数
Loop.End,//LoopクラスのEnd関数
};

見たいな感じです

使用する時にインスタンス名を書く必要があるんですね・・
それだとMenu[i]();のように書けないから
配列にする意味が無いですね・・

予定ではオブジェクト1つにつきインスタンスが複数作成される事は無いので
メンバ関数が静的でも問題は無いと思いますが

End関数にstaticを付けると
「静的でないメンバ 'Loop::flag' への参照が正しくありません。」と出ます

End関数の中身は

static void End(void){
flag=0;
}

となっているのですが
メンバ変数flagが問題なんでしょうか・・


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

Name: zwi  ..初心者(5,540ポイント)   Date: 2009/09/27(日) 17:17   No:39668     
Title: Re:メンバ関数の関数ポインタ    
静的メンバは、静的メンバ変数しかアクセスできません。
なのでflagもstaticである必要があります。
しかし、ここまでくるとクラス化する意義があるかは疑問ですね。


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

Name: MNS  ..上級者(17,309ポイント)   Date: 2009/09/27(日) 17:20   No:39669     
Title: Re:メンバ関数の関数ポインタ    
カプセル化の原則より、静的メンバ関数が静的でないメンバにアクセスすることは出来ません。
flagを静的メンバにすればアクセスすることは出来ます。

チルチルさんが何を行おうとしているのかは私には分からないので、あまりはっきりしたことはいえませんが、
一回クラスの設計を見直してみてはいかがでしょう。関数ポインタ配列で一まとめにしようとしているところをみると、
その関数の間に何らかの繋がりがあるはずです。
一回、それらの関数を一つのクラスでまとめることも考えてみてはいかかでしょうか?


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

Name: チルチル  ..熟練のプログラマー(52,696ポイント)   Date: 2009/09/27(日) 17:26   No:39670     
Title: Re:メンバ関数の関数ポインタ    
複数宣言しないのにクラスを使うのもアレですが
関数だと無駄が多すぎるんですよね・・
flagをstaticにしてみると
「外部シンボル ""private: static bool Loop::flag" (?flag@Loop@@0_NA)" は未解決です。」
「外部参照 1 が未解決です。」と出てしまいます・・


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

Name: チルチル  ..熟練のプログラマー(52,817ポイント)   Date: 2009/09/27(日) 17:31   No:39671     
Title: Re:メンバ関数の関数ポインタ    
何をやろうとしているかと言うと
メインループでswitch文を使って処理を分けるのを
関数ポインタで実現しようとしています
その処理は関数であったりメンバ関数であったりします
1つのクラスにまとめると結局switch文を使う事になるので無理です


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

Name: zwi  ..初心者(5,547ポイント)   Date: 2009/09/27(日) 18:03   No:39674     
Title: Re:メンバ関数の関数ポインタ    
あっ、すいません言い忘れてました。
flagはprivateではなく、publicにしてください。


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

Name: チルチル  ..熟練のプログラマー(52,851ポイント)   Date: 2009/09/27(日) 18:21   No:39675     
Title: Re:メンバ関数の関数ポインタ    
public:

static bool flag;

としてみましたが特に変化は無いですね・・

bool Loop::flag;

を後に追加すると一応動いたんですが
これからクラスが増えていくので
クラス宣言の外側に何か書くと
物凄く見栄えが悪くなって
管理しづらいので気が進まないですね・・
なんとかならないでしょうか?


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

Name: 御津凪 [URL]  ..ハッカー(115,309ポイント)   Date: 2009/09/27(日) 19:08   No:39679     
Title: Re:メンバ関数の関数ポインタ    
要望に答えられそうなコードを用意してみたら、なんだかすごいことになってしまいました。
#include <stdio.h>


// 関数バインドクラス群
class FuncBind {
typedef void (FuncBind::*CallFuncType)( void );
protected:
template<class T>
FuncBind( void (T::*func)( void ) ):CallFuncPtr(reinterpret_cast<CallFuncType>(func)){ }
public:
void operator()( void ){
(this->*CallFuncPtr)();
}
protected:
void* FuncPtr;
void* ClassPtr;
private:
CallFuncType CallFuncPtr;
};
class GlobalFuncBind : public FuncBind {
public:
GlobalFuncBind( void (*f)( void ) ):FuncBind(&GlobalFuncBind::CallFunc){ FuncPtr = f; }
void CallFunc( void ){
((void (*)( void ))FuncPtr)();
}
};
template<class T>
class ClassFuncBind : public FuncBind {
typedef void (T::*FuncType)( void );
public:
ClassFuncBind( T* cls, FuncType f ):FuncBind(&ClassFuncBind::CallFunc){
void* p;
__asm { // C++ 上では FuncType から void* に代入できないのでアセンブラで強引に
mov eax, f
mov p, eax
}
FuncPtr = p;
ClassPtr = cls;
}
void CallFunc( void ){
FuncType func;
void* p = FuncPtr;
__asm { // C++ 上では void* から FuncType に代入できないのでアセンブラで強引に
mov eax, p
mov func, eax
}
(((T*)ClassPtr)->*func)();
}
};

// 呼び出しクラス
class Scene {
public:
void Number( void ){ printf("Scene::Number\n"); }
};
class Loop {
public:
void End( void ){ printf("Loop::End\n"); }
};

// 呼び出しグローバル関数
void Title( void ){ printf("Title\n"); }
void Protocol( void ){ printf("Protocol\n"); }

// 静的変数群
static Scene sScene;
static Loop sLoop;

static FuncBind MenuFuncs[] = {
GlobalFuncBind(Title),
GlobalFuncBind(Protocol),
ClassFuncBind<Scene>(&sScene, &Scene::Number),
ClassFuncBind<Loop>(&sLoop, &Loop::End),
};

// メイン関数
int main( int argc, char* argv[] ){
for(int i = 0, n = sizeof(MenuFuncs) / sizeof(MenuFuncs[0]);i < n;++i){
MenuFuncs[i]();
}
getchar();
return 0;
}


上記のコードはそのままコピペで動くはずです。(VC++でしか動かないかも)


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

Name: MNS  ..上級者(17,783ポイント)   Date: 2009/09/27(日) 19:12   No:39680     
Title: Re:メンバ関数の関数ポインタ    
そのようなことをしたければ、関数ポインタ以外を使うのも手です。
オブジェクト指向プログラミングの機能の一つとして、多態性というものがあります。
詳しく話すと非常に長くなってしまい、説明は出来ないのですが、
こういうものである、というプログラムの例を示します。

#include <iostream>

class State
{
public:
virtual void Update() = 0;
};

class Title :public State
{
public:
void Update()
{
std::cout << "タイトル\n";
}
};

class Menu :public State
{
public:
void Update()
{
std::cout << "メニュー\n";
}
};

class End :public State
{
public:
void Update()
{
std::cout << "エンド\n";
}
};

int main()
{
State* state[3];
state[0] = new Title();
state[1] = new Menu();
state[2] = new End();

int s = 0;

state[s]->Update();
++s;
state[s]->Update();
++s;
state[s]->Update();

for(int i = 0; i < 3; ++i)
{
delete state[i];
}
};



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

Name: チルチル  ..熟練のプログラマー(52,886ポイント)   Date: 2009/09/27(日) 19:14   No:39681     
Title: Re:メンバ関数の関数ポインタ    
コードを作って頂いてありがとうございます
しかし外部宣言するより管理しづらいですね・・
少し考えます、ちょっと待って下さい


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

Name: Justy  ..伝説なるハッカー(431,504ポイント)   Date: 2009/09/27(日) 19:43   No:39682     
Title: Re:メンバ関数の関数ポインタ    
 VisualStudio2008 SP1なら

#include <functional>

typedef std::tr1::function<void ()> MenuFuncType;
const MenuFuncType Menu[]=
{
    Title,
    Protocol,
    std::tr1::bind(&SceneClass::Number, &Scene),
    std::tr1::bind(&LoopClass::End, &Loop),
};

int main()
{
    for(int n=0; n < sizeof(Menu)/sizeof(Menu[0]); ++n)
        Menu[n]();
    return 0;
}

で、関数ポインタとメンバ関数ポインタを混在させた配列を作ることが出来ますが、
設計的にそういう状況そのものがかなりどうかと。



# 御津凪さん

>上記のコードはそのままコピペで動くはずです

 そのコードのままでしたら大丈夫かもしれませんが、
ClassFuncBindで sizeof(FuncType)が sizeof(void*)より
大きくなっても大丈夫ですか?


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

Name: チルチル  ..熟練のプログラマー(52,893ポイント)   Date: 2009/09/27(日) 20:04   No:39687     
Title: Re:メンバ関数の関数ポインタ    
<functional>と言うライブラリは知りませんでしたね・・
自分で実装できるか試してみます
少々お待ちください・・


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

Name: 御津凪 [URL]  ..ハッカー(115,389ポイント)   Date: 2009/09/27(日) 20:11   No:39688     
Title: Re:メンバ関数の関数ポインタ    
> Justy さん
> ClassFuncBindで sizeof(FuncType)が sizeof(void*)より
> 大きくなっても大丈夫ですか?

そこは想定していないので、「動く"はず"」と書きました。
そもそも一から STL も使わずに書いたらああなったので。

そういう意味では Justy さんの方法がコード的に簡潔かつ安全です。


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

Name: nayo  ..中級者(13,794ポイント)   Date: 2009/09/27(日) 20:18   No:39689     
Title: Re:メンバ関数の関数ポインタ    
こちらのようなものを使ってみてはどうでしょうか
クラス内メソッド遷移からswitch〜caseを消すMethodExecテンプレート

ゲーム管理クラスのようなものを用意する必要がありますが


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

Name: Justy  ..伝説なるハッカー(431,490ポイント)   Date: 2009/09/27(日) 20:26   No:39691     
Title: Re:メンバ関数の関数ポインタ    

>そこは想定していないので、「動く"はず"」と書きました。
>そもそも一から STL も使わずに書いたらああなったので。

 なるほど、失礼しました。


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

Name: チルチル  ..熟練のプログラマー(52,979ポイント)   Date: 2009/09/27(日) 20:46   No:39692     
Title: Re:メンバ関数の関数ポインタ    
>こちらのようなものを使ってみてはどうでしょうか
読んで見ましたが理解できませんでした・・

><functional>
一応動きましたがオブジェクトとインスタンスが同名だとエラーになりますね・・
「std::tr1::」のあたりがよくわからないです


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

Name: conio [URL]  ..熟練のプログラマー(50,574ポイント)   Date: 2009/09/27(日) 23:11   No:39697     
Title: Re:メンバ関数の関数ポインタ    

こんな感じで、クラス内状態遷移ができれば良いのでしょうか?
(下記のは、単純にメンバ関数を呼び出してるだけですが)
--------------------------------------------------------------------------
#include<stdio.h>
class Test{
public:
Test();
~Test();
void Top(void);
private:
typedef void(Test::*Func)();
Func fc[7];

void FuncA(void);
void FuncB(void);
void FuncC(void);
void FuncD(void);
void FuncE(void);
void FuncF(void);
void FuncG(void);
};

Test::Test()
{
fc[0] = &Test::FuncA;
fc[1] = &Test::FuncB;
fc[2] = &Test::FuncC;
fc[3] = &Test::FuncD;
fc[4] = &Test::FuncE;
fc[5] = &Test::FuncF;
fc[6] = &Test::FuncG;
}

Test::~Test()
{

}

void Test::Top(void)
{
for(int i = 0; i < 7; i++)
(this->*fc[i])();
}

void Test::FuncA(void)
{
printf("お茶\n");
}

void Test::FuncB(void)
{
printf("ほうじ茶\n");
}

void Test::FuncC(void)
{
printf("はと麦茶\n");
}

void Test::FuncD(void)
{
printf("プーアール茶\n");
}

void Test::FuncE(void)
{
printf("シルベスタギムネマ茶\n");
}

void Test::FuncF(void)
{
printf("梅こぶ茶\n");
}

void Test::FuncG(void)
{
printf("玉露\n");
}

int main(void)
{
Test test;
test.Top();

return(0);
}
--------------------------------------------------------------------------



【追記】
「様々な別のクラスへ遷移する」ものを作ろうとしてたのですね。
解釈を間違えてました。

それならば、基底クラスから複数の派生クラスを作り、
基底クラス型のポインタに派生クラスを入れて遷移させるようにしてみてはどうでしょう?


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

Name: チルチル  ..熟練のプログラマー(53,373ポイント)   Date: 2009/09/28(月) 00:22   No:39702     
Title: Re:メンバ関数の関数ポインタ    
>それならば、基底クラスから複数の派生クラスを作り

基準となるクラスを他のクラスが継承すると言う事でしょうか?
構造が全く違うようなクラスを添え字で使い分けたいので無理そうですね・・

あと普通の関数が入る事は無さそうです
なので色々なクラスのメンバ関数を集めた関数ポインタが作りたいです
戻り値と引数は全てvoidで統一しています

例えると次のような機能を関数ポインタで再現したいです

switch(i){
case 1: A.Run(); break;
case 2: B.Run(); break;
case 3: C.Run(); break;
}

A,B,Cは全て別のクラスのインスタンスです
名前は同じですがRunの中身は違います
しかし戻り値と引数は全てvoidです


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

Name: yu  ..プログラマー(39,523ポイント)   Date: 2009/09/28(月) 00:34   No:39703     
Title: Re:メンバ関数の関数ポインタ    
そういうことなら
No:39680 の MNS様 の記事を参考にすると良いと思います
関数ポインタでは無いですが・・・

同じ機能を親クラスに纏めて、親クラスを派生させれば良いです

今の場合だと Runメソッド を仮想関数にして親クラスに書けばいいです


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

Name: チルチル  ..熟練のプログラマー(53,453ポイント)   Date: 2009/09/28(月) 00:45   No:39704     
Title: Re:メンバ関数の関数ポインタ    
う〜ん使えそうではありますが
メンバ関数名が全て同じとは限らないし
継承はならべく使いたくないですね・・
それからクラスの作成と同時にインスタンス化したいので
newは少しマズイですね・・


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

Name: conio [URL]  ..熟練のプログラマー(51,423ポイント)   Date: 2009/09/28(月) 01:13   No:39707     
Title: Re:メンバ関数の関数ポインタ    

予め、どこのクラスのメンバ関数(全て同名)を実行するかを配列で定義しておくのならば、
こんな感じでどうでしょうか。

無理やり一つの.cppに纏めてしまったので、ちょっと見づらいと思います。
クラスごとに複数のヘッダファイルやソースファイルに分割すればよいかと。
-----------------------------------------------------------------------------
#include<stdio.h>
#define SAFE_DELETE(p) { if (p) { delete (p); (p)=NULL; } }

class Child{
public:
virtual void Exec( void ) = 0;
virtual ~Child(){ }
};

class ChildC : public Child{
public:
ChildC(){ };
~ChildC(){ };
void Exec( void );
};

void ChildC::Exec(void)
{
printf("ChildC::Execです。\n");
}

class ChildB : public Child{
public:
ChildB(){ };
~ChildB(){ };
void Exec( void );
};

void ChildB::Exec(void)
{
printf("ChildB::Execです。\n");
}

class ChildA : public Child{
public:
ChildA(){ };
~ChildA(){ };
void Exec( void );
};

void ChildA::Exec(void)
{
printf("ChildA::Execです。\n");
}

class Parent{
public:
Parent();
~Parent();
void Run(void);
private:
Child* mChild[3];
int ChildNum;
};

Parent::Parent()
{
mChild[0] = new ChildA;
mChild[1] = new ChildB;
mChild[2] = new ChildC;
ChildNum = sizeof(mChild)/sizeof(mChild[0]);
}

Parent::~Parent()
{
for(int i = 0; i < ChildNum; i++)
SAFE_DELETE(mChild[i]);
}

void Parent::Run(void)
{
for(int i = 0; i < ChildNum; i++)
mChild[i]->Exec();
}

int main(void)
{
Parent p;
p.Run();

return(0);
}
-----------------------------------------------------------------------------

【追記】
後で気付きましたが、既にMNSさんが記述して下さってました。


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

Name: MNS  ..上級者(17,678ポイント)   Date: 2009/09/28(月) 06:58   No:39712     
Title: Re:メンバ関数の関数ポインタ    
>メンバ関数名が全て同じとは限らないし
>継承はならべく使いたくないですね・・
>それからクラスの作成と同時にインスタンス化したいので

そうすると、なぜクラスを使用しているのか疑問です。
使用しなければならない何らかの理由が無いのなら、
いっそクラスを使わないのも一つの手だと思います。


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

Name: チルチル  ..熟練のプログラマー(53,585ポイント)   Date: 2009/09/28(月) 17:25   No:39723     
Title: Re:メンバ関数の関数ポインタ    
クラスを使う理由はコンストラクタがあるからですね
関数内で使う画像を読み込みます

関数はstaticで何とかなるかもしれませんが
起動時にローディングしてくれないので困りますね

インスタンスに&を使えばできるかもしれませんが
ローディング関係を除けば関数の方が良いので迷いますね・・


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

Name: MNS  ..上級者(17,574ポイント)   Date: 2009/09/28(月) 17:50   No:39725     
Title: Re:メンバ関数の関数ポインタ    
それは、画像を読み込む関数を作成し、起動時に呼び出す、という形ではいけないのでしょうか?
それとも、クラスのカプセル化の機能を使いたいということでしょうか?

いずれにせよ、staticにした時点でクラスの非静的メンバにはアクセスできなくなりますから、
結局のところコンストラクタは意味をなさなくなるかと思います。


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

Name: チルチル  ..熟練のプログラマー(54,145ポイント)   Date: 2009/09/28(月) 18:01   No:39727     
Title: Re:メンバ関数の関数ポインタ    
クラスのカプセル化が目的ですね

なので一番近いのは仮想関数を継承する事みたいです
画像を必要としないクラスも存在しますが
一貫性を上げるためにはアリだと思います

なので仮想関数の継承を試して見ます

皆さんが今まで出してくれた方法でも実現できるんですが
実装するとコードの見栄えが悪くなるので模索中です・・


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

Name: チルチル  ..熟練のプログラマー(54,563ポイント)   Date: 2009/09/29(火) 21:38   No:39762 解決!     
Title: Re:メンバ関数の関数ポインタ    
仮想関数の継承でうまく行きました
皆さんありがとうございます


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



Name: さところ  ..ぴよぴよ(513ポイント)   Date: 2009/09/29(火) 19:31   No:39759       
Title: グローバル変数の扱いに気を使ってみようについて    
DXライブラリをつかってやっていったのですが
なんどやってもここでエラーが起きてしまいます
vistaでvisual c++ 2008です


これがビルドログです
コマンド ライン 一時ファイル "c:\Users\Ryu\Desktop\game\Debug\RSP00004744086336.rsp" を作成しています。内容 :
[
/Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /Gm /EHsc /RTC1 /MTd /Fo"Debug\\" /Fd"Debug\vc90.pdb" /W3 /c /ZI /TP .\main.cpp
]
コマンド ライン "cl.exe @c:\Users\Ryu\Desktop\game\Debug\RSP00004744086336.rsp /nologo /errorReport:prompt" を作成しています。
一時ファイル "c:\Users\Ryu\Desktop\game\Debug\RSP00004844086336.rsp" を作成しています。内容 :
[
/Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /Gm /EHsc /RTC1 /MTd /Fo"Debug\\" /Fd"Debug\vc90.pdb" /W3 /c /Wp64 /ZI /TP .\key.cpp
]
コマンド ライン "cl.exe @c:\Users\Ryu\Desktop\game\Debug\RSP00004844086336.rsp /nologo /errorReport:prompt" を作成しています。
出力ウィンドウ コンパイルしています...
main.cpp
c1xx : fatal error C1083: ソース ファイルを開けません。'.\main.cpp': No such file or directory
結果 ビルドログは "file://c:\Users\Ryu\Desktop\game\Debug\BuildLog.htm" に保存されました。
game - エラー 1、警告 0


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


Name: T.C.D  ..かけだし(1,426ポイント)   Date: 2009/09/29(火) 19:40   No:39760     
Title: Re:グローバル変数の扱いに気を使ってみようについて    
>ソース ファイルを開けません。'.\main.cpp': No such file or directory
これからはmain.cppというファイルが、プロジェクト内に存在しないためと思います。

一度プロジェクトのあるフォルダを見て、確認してみてください。


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

Name: さところ  ..ぴよぴよ(548ポイント)   Date: 2009/09/29(火) 21:00   No:39761     
Title: Re:グローバル変数の扱いに気を使ってみようについて    
しかし、「まずは実行してみよう」ではちゃんと動いたんですが
関係ありませんかね?


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



Name: kai  ..初心者(5,449ポイント)   Date: 2009/09/27(日) 18:42   No:39677       
Title: 風神録のくるくる回る背景を再現    
改造している龍神録で
東方風神録の6面の最後のスペルカードあたりに
登場してくる円形で不思議な動きをする6個の背景の動きを再現してみたいのですが
これはどういったsincosを使って表現しているのでしょうか?
誰か解明した方、または分かる方がいたら教えてください><


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


Name: チルチル  ..熟練のプログラマー(52,819ポイント)   Date: 2009/09/27(日) 19:58   No:39686     
Title: Re:風神録のくるくる回る背景を再現    
アレって背景って言うんでしょうかね・・

計算式の例としてはこんな感じではないでしょうか?
待たせては悪いと思ってかなり雑に作ってしまいましたが
時間が掛かっても良いならもっとちゃんとしたコードを書きますが・・


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

Name: kai  ..初心者(5,477ポイント)   Date: 2009/09/27(日) 21:26   No:39694     
Title: Re:風神録のくるくる回る背景を再現    
よろしくお願いします

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

Name: チルチル  ..熟練のプログラマー(53,131ポイント)   Date: 2009/09/27(日) 22:04   No:39695     
Title: Re:風神録のくるくる回る背景を再現    
では作るのでちょっと待って下さい
明日の夜ぐらいには完成すると思います

動きは上のコードの計算式で
表示数は三色セットで動的か2個まで
逆回転や速度化変なども可能に
周りから中心に集まるのにも対応

こんな感じで行きましょうかね


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

Name: チルチル  ..熟練のプログラマー(54,073ポイント)   Date: 2009/09/29(火) 18:09   No:39756     
Title: Re:風神録のくるくる回る背景を再現    
すみません少しハプニングがあって遅れてしまいました
可読性を上げるために少しクオリティが下がっていますが
あくまでサンプルですのでご容赦ください


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

Name: kai  ..初心者(5,566ポイント)   Date: 2009/09/29(火) 18:54   No:39757 解決!     
Title: Re:風神録のくるくる回る背景を再現    
おおおおおおおおお!
凄すぎて思わず涙が出ました。
かなり高い完成度ですね。勉強させてもらいます。
ありがとうございます!

一つ聞きたいのですが、こういうのって、
どうやったら計算式が思い浮かぶのでしょうか?
ちょっと自分には未知の段階で分からないのですが、何かコツとかってあるんでしょうか?


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

Name: チルチル  ..熟練のプログラマー(54,521ポイント)   Date: 2009/09/29(火) 19:25   No:39758     
Title: Re:風神録のくるくる回る背景を再現    
>かなり高い完成度ですね

いやいやそんな事は無いですよ
大きな声では言えませんが
作った時は諸事情でクタクタに疲れていたので
円背景がチカチカする機能とかを省略しましたからね
冷静に考えたら描画関数を一行加えるだけで付けられたんですけど・・

>どうやったら計算式が思い浮かぶのでしょうか?

座標を変化させる場合の計算式は三角関数を使っている事が多そうなので
三角関数を使い慣れていれば思い付きやすくなると思います

あとは一回で座標を求めようとしないで何回かに分けて求めると良いと思います
今回の計算式では大回転で回転軸から三方向に座標を求めて
その座標を回転軸にして小回転で描画する座標を求めています
遊園地のコーヒーカップみたいな感じですね

最初に投稿を見た時はうろ覚えだったので
円移動しながら半径を変化させてるのかなと思ったんですが
ゲームで確認すると円移動しながら回転軸自体も円移動しているんだなと思いました

円背景は3個あるのでわかりにくいですが
どれか1個の動きをじっくり見れば何となくわかると思います

それから作っている時に思ったんですが円背景の計算式を応用すると
「マウンテン・オブ・フェイス」の弾の配置が再現できるかもしれません


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



Name: ぬこ  ..かけだし(2,115ポイント)   Date: 2009/09/26(土) 02:11   No:39621       
Title: コンソールアプリケーション→ Windowsアプリケーション    
ちょっとわからないことがあるので質問させてください。
現在winsock2をつかってネットワークプログラミングをしています。
MS-DOSプロンプト上で動くプログラムはだいぶできるようになったので、
今度はMS-DOSプロンプトではなくDXライブラリをつかってWindowsアプリケーションとして動作するようにしたいのですが、ここで詰まってしまいました。

基本的に問題なく動くのですがソケットをbindしようとするとなぜかその部分だけ動作が非常に重くなり止まってしまいます。
コンパイル自体は普通にできます。
bind部分でエラーコードを表示させてみたのですが何故エラーをはいているのかよくわかりません。
MS-DOSプロンプト上で動いてたプログラムと構成をまったく変えていないのですが何故なのでしょうか。

コンソールアプリケーション→ Windowsアプリケーションにすることで問題が発生しているとは思うのですが・・・
一応自分でもしらべてコンソールアプリケーションでしか使えないような関数は全部排除したつもりです。
どなたかわかる方、知恵を貸していただけないでしょうかorz


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


Name: zwi  ..入門者(4,901ポイント)   Date: 2009/09/26(土) 08:52   No:39624     
Title: Re:コンソールアプリケーション→ Windowsアプリケーション    
私はMFCを使ったWindowsアプリケーションでwinsock2を使っていますが、これと言った問題も無く使えていますので別の問題点があるんじゃないかと思います。
エラーコードは、Visual C++エラールックアップ等で確認されてますよね?
それでも不明なエラーでしたらソースコード自体を貼っていただけると何かコメントできるかもしれません。



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

Name: ぬこ  ..入門者(2,874ポイント)   Date: 2009/09/27(日) 03:07   No:39652     
Title: Re:コンソールアプリケーション→ Windowsアプリケーション    
zwiさん返答ありがとうございます。
Visual Studioについてるツールでエラーコード検索はしてたんですが内容を書き忘れていました。
説明不足で申し訳ないです

無効な引数が提供されました。
という結果になります。

sockの引数自体はコンソールアプリケーションの時と変えていません。
socket関数についても調べてみたのですがちょっとわかりません。
引き続きご教授をお願いします。


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

Name: zwi  ..初心者(5,545ポイント)   Date: 2009/09/27(日) 09:32   No:39657     
Title: Re:コンソールアプリケーション→ Windowsアプリケーション    
ソースコードを見る限り2回bindしてますが、まずここが問題だと思います。やってもちゃんと動くかもしれませんが意味が無いですね。
それと表示ループの中にあるのは絶対だめです。それと途中でソケット閉じちゃてますのでループすると確実にエラーになりますよ。
このソケット受信ってウィンドウが開いている間、何度もする必要があるんでしょうか?もしあるなら、ループの中にあるべきはrecv()関数だけで他はループ外にあるべきだと思いますね。
とりあえず、winsockの理解不足が原因だと思いますので、winsockの1つ1つの関数の役割を理解するのが先決かなと思います。入門者向けの「猫でもわかるネットワークプログラミング」あたりを読まれるか、サイトを参考にしてください。いくつか紹介しておきます。
http://www.geekpage.jp/programming/winsock/
http://x68000.q-e-d.net/~68user/net/

winsock自体がプログラミングの初心者向けではないため親切なページが少ないのは否めませんので、ご容赦ください。


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

Name: ぬこ  ..入門者(2,909ポイント)   Date: 2009/09/29(火) 02:05   No:39746     
Title: Re:コンソールアプリケーション→ Windowsアプリケーション    
zwiさんご返答ありがとうございます。
とりあえず指摘された箇所を直してみました。
結果として動きませんでした。
1回bindだと途中で処理が止まってしまうみたいです。
2回だとなぜか動きました・・・なんでだろうorz

とりあえずご紹介いただいた書籍を注文してきました
勉強しつつもうちょっとかんがえてみよーと思います。


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

Name: zwi  ..初心者(6,056ポイント)   Date: 2009/09/29(火) 07:50   No:39749     
Title: Re:コンソールアプリケーション→ Windowsアプリケーション    
>1回bindだと途中で処理が止まってしまうみたいです。
>2回だとなぜか動きました・・・なんでだろうorz

とりあえず調べるとしたら、1回目のバインドのエラーコードをチェックしてみてください。
同じ事を2回する必要はまったく無いはずです。
あとはパケットキャプチャ(wiresharkなど)で、どんなパケットがやり取りされているか確認するのも重要です。
通信関係は地道なチェックをしないと不安定な通信ソフトが出来上がります。念のための動作確認は大事ですのでなんとなく動いたからOKってのはダメですよ。


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



Name: F  ..入門者(3,067ポイント)   Date: 2009/09/28(月) 17:11   No:39722       
Title: 簡単な数学    
揃えて消すパズル
サメガメというジャンルのスコア処理の所ですが

2つ揃い消えると2点 (2*0)+2
3つ揃い消えると4点 (2*0)+(2*1)+2
4つ揃い消えると8点 (2*0)+(2*1)+(2*2)+2
5つ揃い消えると14点 (2*0)+(2*1)+(2*2)+(2*3)+2
と増えて行きます
Cで書くとこうなると思うんですが、簡単な方法がありましたら教えて頂けないでしょうか?

int score(int num){
num --;
int ret = 0;
for(int i=0;i<num;i++){
ret += 2*i;
}
ret+=2;
return ret;
}


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


Name: たいちう  ..プログラマー(33,863ポイント)   Date: 2009/09/28(月) 19:08   No:39730     
Title: Re:簡単な数学    
お好きな方をどうぞ。
int score(int num)

{
int i, ret = 2;
for (i = 1; i <= num - 2; i++)
ret += 2 * i;
return ret;
}

int score(int num)
{
return 2 + 2 * (num - 2) * (num - 1) / 2;
}


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

Name: F  ..入門者(3,142ポイント)   Date: 2009/09/29(火) 03:49   No:39748 解決!     
Title: Re:簡単な数学    
1行で掛けるんですか。
動作確認しました。見てもどういう計算しているか分からないですが、分解しながら見てみようと思います。
本当にありがとう御座います。


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



Name: 774  ..かけだし(1,007ポイント)   Date: 2009/09/28(月) 20:16   No:39734       
Title: mp3のリソース化    
こんにちは

.bmpや.mp3をリソースファイルにして直接さわれないように
したいのですが、mp3ファイルのリソース化の方法がよくわかりません。

画像ファイルは.rcファイルに定義、LoadGraphToResource関数およびDrawGraph関数で
表示がうまくいっていることを確認しています。

環境はbccです。


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


Name: lbfuvab  ..上級者(22,047ポイント)   Date: 2009/09/28(月) 21:11   No:39735     
Title: Re:mp3のリソース化    
mp3ならカスタムリソースとして登録したら良さそうです。

Google:カスタムリソース

リソース上のmp3をDxLibを使って読み込むには

int LoadSoundMemByResource( const char *ResourceName, const char *ResourceType, int BufferNum = 1 ) ; // サウンドをリソースから読み込む

で良さそうです。


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

Name: 774  ..かけだし(1,007ポイント)   Date: 2009/09/29(火) 03:14   No:39747     
Title: Re:mp3のリソース化    
ありがとうございます
もう少し調べればなんとかなりそうです




Name: ft  ..ぴよぴよ(649ポイント)   Date: 2009/09/28(月) 23:14   No:39739       
Title: たびたび失礼します    
龍神録38章のタイトル描画ですが、
手を加えてタイトルを上からスーっと降ろして
あるところで止めようかと思い以下のように組みました。

//タイトルの表示
void graph_stage_title(){
int i=0;
if(stage_title.flag>0){
for(i=0;i<300;i++){
SetDrawScreen( DX_SCREEN_BACK ) ;
SetDrawBlendMode( DX_BLENDMODE_ALPHA, stage_title.brt );
DrawGraph(60+FX,-10+FY+(i/2)+dn.y,stage_title.img,TRUE);
}
SetDrawBlendMode( DX_BLENDMODE_NOBLEND, 0 );
}
}

このようにした場合ゲームプログラミングの館「12. 画像を動かす。」のように
残像が残ってしまいます。
そこで次章のように裏処理をしたら今度はすべての画像が消えてしまいます。
この場合どのようにしたら良いのでしょうか?


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


Name: Dixq (管理人) [URL]  ..ウィザード(1,060,500ポイント)   Date: 2009/09/29(火) 00:41   No:39743     
Title: Re:たびたび失礼します    
メッセージ処理や画面を消す処理、裏画面を反映する処理などがありません。
300回一瞬で上書きして終了しています。
また、描画先を設定する関数SetDrawScreenは何度も呼ぶ必要がありません。

しかし、このループ内にそれらの処理を書くべきではありません。

まず、DXライブラリの基本的な使い方を学ばれてからの方がわかりやすいと思います。

書いたら消す必要があり、消す関数はClearDrawScreenです。
書いた裏画面を表に反映する為にはScreenFlipが必要です。

まずはゲームの館を一通りご覧になり、DXライブラリ本家のほうも一通りお読みになることをお勧めします。

また、タイトルは質問の内容がわかるような名前を付けて頂けると幸いです。


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

Name: ft  ..ぴよぴよ(710ポイント)   Date: 2009/09/29(火) 01:35   No:39745 解決!     
Title: Re:たびたび失礼します    
なんか勘違いしていたようで、
希望通りの動作を得ることができました!

タイトルの方もすみませんでした、以後気をつけます。


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



Name: H  ..ぴよぴよ(312ポイント)   Date: 2009/09/28(月) 22:00   No:39736       
Title: 初歩すぎて聞き辛いですが質問です    
はじめまして、よろしくお願いします。

プログラムでソフトを作りたくて、勉強を始めたのですが
どうしてもわからないことがあります。

プログラムを作りたい、と思ったときは
役割を果たすであろうソースコードを調べ、組み合わせて作るものだと思っているのですが、違うのでしょうか

自身でコードを書く必要があるならば、コードを辞書のように一覧表示しているような本、または検索サイトがなければ、すごく大変だと思います

しかし、そのような本、サイトの情報はまったく見られず、耳にも入ってきません
私が想定しているような作り方は、そもそも根本的に違っているのでしょうか?

ソフトを作られている方は、まず最初に何をするのかを教えていただければ幸いです
よろしくお願いします。


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


Name: array [URL]  ..熟練のプログラマー(56,764ポイント)   Date: 2009/09/29(火) 00:19   No:39741     
Title: Re:初歩すぎて聞き辛いですが質問です    
ソフトを作りたいという事ですが、多分基本のC言語から勉強していかないと難しいと思います。
私も、ソフトを作りたいなと思ってプログラムを勉強して、そろそろ1〜2年たつのですが
いまだに、作り方の詳しい方法が分かっていないので大したアドバイスはできません。なので、ツールとキーワードの紹介だけ。

プログラミング知識必須ですが、一応便利なツールとしてマイクロソフト社のコンパイラでVisualStdioなど使いやすさとしてはVisual C++があります。
これから、調べるキーワードとして
・フォームアプリケーション
・GUIアプリケーション
・windowsアプリケーション
などで検索すれば、それらしいサイトが見つかると思います。

「フォームアプリケーション」googleトップ:
http://mcn-www.jwu.ac.jp/~yokamoto/openwww/cpp/introvcppg/


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

Name: Dixq (管理人) [URL]  ..ウィザード(1,060,257ポイント)   Date: 2009/09/29(火) 00:33   No:39742     
Title: Re:初歩すぎて聞き辛いですが質問です    
今どの程度C言語の勉強をされているのかわかりませんが、
どれ位なら自力で(参考サイトを見て回りながらでも完成すればOK)作ることが出来ますか?

たとえばファイルAに連続して書かれている数値データとファイルBに連続して書かれている数値データを足し合わせてファイルCに書き出すようなプログラムも
実験をおこなうような研究で使用する際は立派なツールになると思います。
そのようなツールなら作れるでしょうか?

まず、経験も無しに最初から大きなソフトを自力で作れるような人などいません。
プログラムを勉強し、小さなソフトを作りながらソフトの作り方を覚え、大きなソフトが作れるようになるものだと思います。

>プログラムを作りたい、と思ったときは役割を果たすであろうソースコードを調べ、組み合わせて作るものだと思っているのですが、違うのでしょうか

そのような丁度よいソースコードがあればいいですが、まぁまず無いですよね。
ライブラリだとか、何らかの汎用的なモジュールだとかを利用することはあるでしょうけど、
何から何までどこかのサイトにあるコードを組み合わせるだけでできるようなソフトはほぼ無いと思います。

私は既存ライブラリや以前自分で作ったライブラリやモジュールを利用することを除けば毎回1から10まで作ります。
というか私に限らず皆さんそうだと思いますが。

おそらく質問者さんは何か一つソフトを作った経験が無く、イメージが掴めないといったところではないかと思います。
まずは小さなツールのようなものでいいから作ってみてはいかがでしょうか?
小さなツールが出来たらもう少し規模を大きくし、それを繰り返すことでソフトの作り方がわかってくるのではないかと思います。

とりあえず、今質問者さんがどの程度Cについてご存じかわからないと正確な回答は難しいです。


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

Name: H  ..ぴよぴよ(565ポイント)   Date: 2009/09/29(火) 01:16   No:39744     
Title: Re:初歩すぎて聞き辛いですが質問です    
>>array様

フォームアプリケーションのリンク、参考になりました。
キーボードでひたすらコードを打ち込むのがプログラムだと思っていましたが
物を置いて作っていくようなやり方があるのですね。
まずはそこから挑戦してみたいと思います、ありがとうございました。

>>Dixg様(管理人様)

ご指摘のとおりです。ソフトを作った経験がまったくありません(><;
参考書には、コードor命令文がずら〜っと掲載されているので、それが作り方だと思っていました。
イメージが掴めないまま個人的に調べ続け、Cの世界での辞書はライブラリかなと思いましたが…どうでしょう。
おっしゃるように、簡単なソフトから取り組んでみたいと思います。ありがとうございました。


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



Name: 小夜  ..初心者(7,285ポイント)   Date: 2009/09/23(水) 22:30   No:39546       
Title: これはどうすればいいのでしょうか?    
こんばんは。
つまずきまくっているので、一度プロジェクトを削除し、一からやり始めています。
前回の経験と、皆様のご回答を活かして 順調に11章まで行けたのですが、
12章でまたつまずいてしまいました……;
ビルドすると、

1>c:\users\○○\desktop\○○\project\11章\mydat\source\enemy_act_pattern.cpp(143) : error C2065: 'PI' : 定義されていない識別子です。
1>c:\users\○○\desktop\○○\project\11章\mydat\source\enemy_act_pattern.cpp(143) : error C2065: 'PI' : 定義されていない識別子です。

というようなメッセージが「出力先の表示」に出て来ます。
これは何処に問題があり、どうすれば良いのでしょうか?

回答、お待ちしております!


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


Name: array [URL]  ..熟練のプログラマー(55,835ポイント)   Date: 2009/09/23(水) 22:47   No:39547     
Title: Re:これはどうすればいいのでしょうか?    
enemy_act_pattern.cpp---
このファイル内をPIで検索したらヒットすると思うのですが、メッセージ内容はPIがどの様な内容を示しているのか、コンピュータ(コンパイラ)が分からない―というエラーメッセージです。

とりあえず解決する方法として同ファイル内のインクルード宣言の下に
#define PI (3.141592)

と宣言しておけば、エラーは消えます。

しかし龍神録だと、
"define.h"
があったと思うので、define.h内に記述しておけば大丈夫です。


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

Name: 小夜  ..初心者(7,355ポイント)   Date: 2009/09/23(水) 23:13   No:39549     
Title: Re:これはどうすればいいのでしょうか?    
やってみましたがなぜだか出来ません…
ソースが間違っているのでしょうか……
良ければ、12章の時に貼るソースを貼ってくださいませんか?
すいません;;


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

Name: Justy  ..伝説なるハッカー(429,125ポイント)   Date: 2009/09/23(水) 23:26   No:39552     
Title: Re:これはどうすればいいのでしょうか?    

>ソースが間違っているのでしょうか

 間違っているからエラーが出ている訳です。
 察するに、コピペが足りてません。何かを忘れてます。



>良ければ、12章の時に貼るソースを貼ってくださいませんか?

 いや、このページに修正点が全部書いてあるし、そもそもソースコードを
プロジェクトごとDLできるじゃないですか・・・


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

Name: ぽよ  ..ぴよぴよ(373ポイント)   Date: 2009/09/25(金) 01:48   No:39600     
Title: Re:これはどうすればいいのでしょうか?    
>良ければ、12章の時に貼るソースを貼ってくださいませんか?
 龍神録プログラミングの館の「全ての章のプロジェクトを一括ダウンロードする」の所からダウンロードしたものを解凍すると「project」というフォルダが出てきます。
その中の「12章」というフォルダの中に12章でのソースがあります。
その内容を安易にコピーせずに、まず12章の中にあるRyuJin.slnをダブルクリックし、2窓状態にして現在のソースと見比べてみてはどうでしょうか。
何がどう違ってその結果どうなるのかを少しずつ理解していくべきと思います。
それはここで聞く前に出来ることであると考えます。
(一連の流れからダウンロードした12章に違うファイルが入ってる可能性も考え、12章のとおりに実行してみましたが問題ありませんでした)

 実際にやってみた方はわかると思うのですが「龍神録プログラミングの館」の内容どおりにやっても動きません。
ところどころにコピペだけでは足りない部分が出てきます。
変数宣言がいくつか省略されている場合が多いようです。
それについても、どうしてもわからない場合には各章ごとの「解答ソース」があるため、見比べる事で解決出来ると思います。
しかし、今回の質問についてはarrayさんがおっしゃっているとおりの内容で

--define.hに以下を追加--

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

↑ときちんと書かれていますので、今のところ12章でつまずく理由は思い当たりません



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

Name: 小夜  ..初心者(7,583ポイント)   Date: 2009/09/28(月) 18:37   No:39729     
Title: Re:これはどうすればいいのでしょうか?    
すみません、私がしていることが間違っているかもしれません。

私がやっていたのは、
プロジェクトをダウンロード→解凍→開いて「二章」→二章に一章の内容をコピペ(main.cpp等に)
としていました。
龍神録プログラミングの館は二章からソースの説明?をしていたので、
一章ズレるのかなと勘違いしておりました。
(試しに30章あたりを変換し、何もイジらず開くと説明通りに動きました。)
これは新しく自分で作成するのでしょうか?
それとも、只 開く場所を間違えていただけなのでしょうか?
かなり初歩的な質問になってしまい、申し訳ありません。

ちなみに、つまづいていた12章も何も触らずビルドすると正常に動きました。


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

Name: mnkr  ..かけだし(2,330ポイント)   Date: 2009/09/28(月) 19:35   No:39731     
Title: Re:これはどうすればいいのでしょうか?    
解凍して出来た12章フォルダには、12章の講座の内容を反映させて完成されたものが入っています。
12章の講座の内容をコピー&ペーストして作りたいなら、
一つ前の11章フォルダのデータにコピー&ペーストしていけば良いと思います。

いま20章くらいまで進みましたが、
15章あたりを過ぎたところから
講座に記載されていない修正箇所が時々あったので。。。

講座の内容をコピー&ペースト→コンパイル→コンパイル失敗→
現在勉強している講座フォルダの完成されたソースと、自分のつくったソースの見比べ→違う部分を修正
で動くようになると思います。


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

Name: 小夜  ..初心者(7,987ポイント)   Date: 2009/09/28(月) 19:45   No:39732 解決!     
Title: Re:これはどうすればいいのでしょうか?    
mnkrさん>
回答ありがとうございます!

そうなんですか!?
ソースをコピペする所は間違ってなかったんですね^^;
ホッとしました。
なるほど、反映させたものが入っているんですか〜。
勉強になりました!
見比べながら進んでいこうと思います。
わからなかったらまた質問させて頂きますので、その時は また助けてくださいね(^_^;)

mnkrさんはもちろん、皆様もありがとうございました!


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



Name: ft  ..ぴよぴよ(127ポイント)   Date: 2009/09/28(月) 12:13   No:39718       
Title: オプションの動作    
キャラに付随しているオプションの事なのですが、
通常時と低速時に位置が変わる際に移動する間も描写したいのですが
どのようにすればいいでしょうか?



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


Name: チルチル  ..熟練のプログラマー(53,471ポイント)   Date: 2009/09/28(月) 16:34   No:39721     
Title: Re:オプションの動作    
シフトキーが押されている時間から座標を求めれば良いんじゃないでしょうか?

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

Name: ft  ..ぴよぴよ(338ポイント)   Date: 2009/09/28(月) 17:27   No:39724     
Title: Re:オプションの動作    
シフトキーが押されている時間を使って、通常→スローの場合の描写はうまくいきました。
ありがとうございます!
しかし、スロー→通常の際にはシフトキーは押されていないため、
何かうまくカウントを取る方法がないでしょうか?

もしくは、オプションの現在位置を示していると思われるsx,syを用いて
sx++;
sy++;
などのような計算で、目標座標との差分をなくすように変化させようと思ったのですが、
エラーが出てしまい困っております。


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

Name: チルチル  ..熟練のプログラマー(53,839ポイント)   Date: 2009/09/28(月) 17:51   No:39726     
Title: Re:オプションの動作    
私の使っている方法だと自機の構造体に
unsigned char Shift;//低速移動成分
のような変数を追加します

オプションの移動を10カウントで行うとして
Shiftが0〜10まで変化するようにします
0の時は通常
10の時は低速
1〜9の時は変化中です

龍神録などで入力状態を取得している方法はよく知りませんが
ゲームプログラミングの館で言うと

if( Key[KEY_INPUT_LSHIFT]>0 ){if( Player.Shift<10 )++Player.Shift;}//低速移動成分を増やす

else{if( Player.Shift>0 )--Player.Shift;}//低速移動成分を減らす

こんな感じです

通常時の座標に低速時の座標までの距離を10で割ってShiftをかけた値を足せば移動すると思います

しかし等速で移動すると不自然なので物理的移動を使った方が良いと思います


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

Name: ft  ..ぴよぴよ(382ポイント)   Date: 2009/09/28(月) 18:31   No:39728 解決!     
Title: Re:オプションの動作    
細かいアドバイスありがとうございます!
おかげできちんと描写する事ができました!


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



Name: kiki  ..ぴよぴよ(29ポイント)   Date: 2009/09/27(日) 11:43   No:39660       
Title: ソースプログラムファイルの変数検索    
Cで、ある別のソースプログラムファイルの中で定義されている変数のその型と出現する行番号をすべて出力するということは可能でしょうか?
main関数の前には、他のユーザー関数は置かない。
外部変数は無視で、同じ変数名はないものとして、変数名は英小文字と数字のみ。
char,int,long,float,doubleの五つのみの検索。

どのようにその変数かどうかを判断すればよいのか、助言またはソースを書いて頂けないでしょうか?
よろしくお願いします。


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


Name: zwi  ..初心者(5,469ポイント)   Date: 2009/09/27(日) 12:25   No:39662     
Title: Re:ソースプログラムファイルの変数検索    
単に検索だけならGrepソフトで正規表現を使うほうが話が早いです。
ある程度構文解析する場合は、ここに書き出せる量のソースコードではなくなる気がします。

気になる事。
・構造体に含まれる場合は?
・定義だけで参照側は表示しなくて良いのか?


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

Name: kiki  ..ぴよぴよ(50ポイント)   Date: 2009/09/27(日) 19:56   No:39685     
Title: Re:ソースプログラムファイルの変数検索    
正規表現を使ったことがないので、よく分かりません。

> ・構造体に含まれる場合は?
構造体は無視して、やりたいです。

> ・定義だけで参照側は表示しなくて良いのか?
例えば、このようなソースプログラムファイルがあったとすると、このソースプログラムファイルを全て表示してから、

1:#include <stidio.h>
2:
3:int main()
4:{
5: int d=0;
6:
7: printf("%d",d);
8: return(0);
9:}
10:

[定義されている変数]
d(int)・・・5,7

のように表示したいと思っています。

> ある程度構文解析する場合は、ここに書き出せる量のソースコードではなくなる気がします。
やはりそうですよね・・・
正規表現、調べてみたいと思います。


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

Name: zwi  ..初心者(5,600ポイント)   Date: 2009/09/27(日) 20:20   No:39690     
Title: Re:ソースプログラムファイルの変数検索    
ご要望に沿うものを作ると簡易な構文解析が必要ですね。
ある程度正規表現を使えたほうが楽そうなので、私ならPerlかVBScriptで作ると思います。
Cだけで作るとなると、ちょっと面倒ですね。

いや、strtok()だけでもある程度できるかな?
ちと考えてみます。


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

Name: zwi  ..初心者(5,614ポイント)   Date: 2009/09/27(日) 20:47   No:39693     
Title: Re:ソースプログラムファイルの変数検索    
うーん。Cだけだと、やはり辛いですね。

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

Name: kiki  ..ぴよぴよ(84ポイント)   Date: 2009/09/28(月) 09:13   No:39715 解決!     
Title: Re:ソースプログラムファイルの変数検索    
zwiさん、ありがとうございます。

なんとか自分で頑張ってみたいと思います。


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




 
[ 1 , ... ]
 
 
管理者画面   RSS   + Powered By 21style +