ページ 11

龍神録プログラミングの館の13章について

Posted: 2008年9月14日(日) 22:46
by 自由闊達
龍神録プログラミングの館を見て勉強しているのですが、13章がわからなくて行き詰ってます

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

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

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

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

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

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

Re:龍神録プログラミングの館の13章について

Posted: 2008年9月14日(日) 23:22
by array
2.
>'SHOT_BULLET_MAX' : 定義されていない識別子です。 と表示される
確か、画面に表示できる敵の弾の最大数だったと思うので。

#defin SHOT_BULLET_MAX 30

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

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

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

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

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

Re:龍神録プログラミングの館の13章について

Posted: 2008年9月14日(日) 23:27
by s
すみません、同じ章で躓いたので便乗で質問させてください
13章なのですが見本を真似て一応エラー0で敵がショットを打つとこまではたどり着けたのですが
ショットの効果音が凄い速さで連打されて常時なり続けている感じになってしまいます

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

Re:龍神録プログラミングの館の13章について

Posted: 2008年9月14日(日) 23:46
by array
> 2.
> >'SHOT_BULLET_MAX' : 定義されていない識別子です。 と表示される
> 確か、画面に表示できる敵の弾の最大数だったと思うので。
>
> #defin SHOT_BULLET_MAX 30
>
> と、画面に表示できる敵弾の数は30個までですよ。ってdefine.hで宣言してあげればいいかもです。

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

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

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

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

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


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

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

Re:龍神録プログラミングの館の13章について

Posted: 2008年9月14日(日) 23:51
by array
>sさん

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

se_flag[0]=1;

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

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

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

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

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

Re:龍神録プログラミングの館の13章について

Posted: 2008年9月14日(日) 23:56
by yuuki++
> 13章なのですが見本を真似て一応エラー0で敵がショットを打つとこまではたどり着けたのですが
> ショットの効果音が凄い速さで連打されて常時なり続けている感じになってしまいます

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

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

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

Re:龍神録プログラミングの館の13章について

Posted: 2008年9月15日(月) 00:21
by 自由闊達
一応、//define.hと//struct.hに
//define.h
//敵1匹が持つ弾の最大数
#define SHOT_BULLET_MAX 1000
//一度に画面に表示できる敵の弾幕の最大数
#define SHOT_MAX 30


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

//ショットに関する構造体
typedef struct{
//フラグ、種類、カウンタ、どの敵から発射されたかの番号
        int flag,knd,cnt,num;
//ベース角度、ベーススピード
        double base_angle[1],base_spd[1];
        bullet_t bullet[SHOT_BULLET_MAX];
}shot_t;
とコピペしたのですが、2.のようなエラーが出てしまいます。
なぜなんでしょう・・・

Re:龍神録プログラミングの館の13章について

Posted: 2008年9月15日(月) 00:57
by yuuki++
>自由闊達さん
まず、このサイトの通りやっていれば、各ソースファイルにはdxlib.hとGV.hがインクルードされていますね?
そしてGV.hの中では、function.h、define.hがインクルードされているはずです。
#define SHOT_BULLET_MAX 1000 などをちゃんと書いているようなので、「定義されていない」と言われるとしたら、インクルードし忘れではないでしょうか?

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

Re:龍神録プログラミングの館の13章について

Posted: 2008年9月15日(月) 01:05
by s
隅々見渡していたら効果音無限ループしている箇所発見でき対処できました
arrayさんyuuki++ありがとうございました

Re:龍神録プログラミングの館の13章について

Posted: 2008年9月15日(月) 01:25
by 自由闊達
一応GV.hの中には
#include "define.h"
#include "function.h"
define.hの中には
#include "struct.h"
を確認しました。あと、補足として上に書いたコピペをする前(12章)までは動いてます


とりあえずdefine.hを貼ってみます
//フィールドの広さ
#define FIELD_MAX_X 384
#define FIELD_MAX_Y 448
//フィールドの左上の座標
#define FIELD_X 32
#define FIELD_Y 16
//パッドキーの最大数
#define PAD_MAX 16

#include "struct.h"

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

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

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

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

Re:龍神録プログラミングの館の13章について

Posted: 2008年9月15日(月) 01:33
by array
#include "struct.h"

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

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

#define SHOT_MAX 30

の下に

#include "struct.h"

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

Re:龍神録プログラミングの館の13章について

Posted: 2008年9月15日(月) 01:35
by yuuki++
んー、それで
>2.二つ目の//define.hと//struct.hと書いてあるものをコピペするも
>error C2065: 'SHOT_BULLET_MAX' : 定義されていない識別子です。
>と表示される
のか・・・

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

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

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

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

Re:龍神録プログラミングの館の13章について

Posted: 2008年9月15日(月) 01:39
by yuuki++
・・・と思ったら先に書いてくれましたね。

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

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

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

Re:龍神録プログラミングの館の13章について

Posted: 2008年9月15日(月) 02:02
by array
今後間違わないように、define.hに「#include "struct.h"」を書くのではなく

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

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

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

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

/* 省略 */


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

Re:龍神録プログラミングの館の13章について

Posted: 2008年9月15日(月) 03:05
by 自由闊達
ありがとうございます!2が解決しました!

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