難易度を分けようとしているのですが・・・

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
yrao

難易度を分けようとしているのですが・・・

#1

投稿記事 by yrao » 15年前

どうも、ご無沙汰しています。
 
おかげさまで、ボス弾幕の作成のほうも大方終わってきました。

そこで、
HARDのほかにも難易度を設けたいと思い、自分なりに実装を試みたのですが、
エラーが発生してしまい解決方法が分からないので質問させてもらいました。
アドバイスいただければ幸いです。


まず、エラーの内容なのですが
 
func.h(1) : fatal error C1083: include ファイルを開けません。'../GV.h': No such file or directory

boss_shote.cpp(1) : fatal error C1083: include ファイルを開けません。'../include/GV.h': No such file or directory

boss_shotp.cpp(1) : fatal error C1083: include ファイルを開けません。'../include/GV.h': No such file or directory

というものです。
 

難易度を分岐させるために変更したところは、
 

①プロジェクトの boss_shotフォルダ(boss_shot.cpp、boss_shotH.cppが元からあるフォルダです)内に、
新たにboss_shotE.cppとboss_shotP.cppを追加。
boss_shotフォルダを右クリック→新しい項目の追加
で追加しました。
 
②boss_shotE.cpp、boss_shotP.cppに、boss_shotH.cppの内容をコピー&ペースト。
 boss_shot_bulletH○○○(){}の部分は、それぞれ、
 boss_shot_bulletE○○○、
 boss_shot_bulletP○○○に変更

③GV.hで、 GLOBAL int stage_diff;

 難易度選択画面で、
  EASY   なら stage_diff=0
HARD   なら stage_diff=1
PHANTASM なら stage_diff=2
  としてから、ステージ開始処理に移行するようにしています。

④func.hの赤文字部分を追加
#include "../GV.h"
extern void boss_shot_bulletH000();
extern void boss_shot_bulletH001();
extern void boss_shot_bulletH002();
extern void boss_shot_bulletH003();
extern void boss_shot_bulletH004();
extern void boss_shot_bulletH005();
extern void boss_shot_bulletH006();
extern void boss_shot_bulletH007();
extern void boss_shot_bulletH008();
extern void boss_shot_bulletH009();
extern void boss_shot_bulletH010();
extern void boss_shot_bulletH011();
extern void boss_shot_bulletH012();
extern void boss_shot_bulletH013();

extern void boss_shot_bulletE000();
extern void boss_shot_bulletE001();
extern void boss_shot_bulletE002();
extern void boss_shot_bulletE003();
extern void boss_shot_bulletE004();
extern void boss_shot_bulletE005();
extern void boss_shot_bulletE006();
extern void boss_shot_bulletE007();
extern void boss_shot_bulletE008();
extern void boss_shot_bulletE009();
extern void boss_shot_bulletE010();
extern void boss_shot_bulletE011();
extern void boss_shot_bulletE012();
extern void boss_shot_bulletE013();


extern void boss_shot_bulletP000();
extern void boss_shot_bulletP001();
extern void boss_shot_bulletP002();
extern void boss_shot_bulletP003();
extern void boss_shot_bulletP004();
extern void boss_shot_bulletP005();
extern void boss_shot_bulletP006();
extern void boss_shot_bulletP007();
extern void boss_shot_bulletP008();
extern void boss_shot_bulletP009();
extern void boss_shot_bulletP010();
extern void boss_shot_bulletP011();
extern void boss_shot_bulletP012();
extern void boss_shot_bulletP013();


if(stage_diff==0){
    void (*boss_shot_bullet[DANMAKU_MAX])()=
{
    
    
    boss_shot_bulletE001,
    boss_shot_bulletE002,
    boss_shot_bulletE003,

    boss_shot_bulletE004,
    boss_shot_bulletE005,
    boss_shot_bulletE006,
    boss_shot_bulletE007,
    boss_shot_bulletE008,
    boss_shot_bulletE009,
    boss_shot_bulletE010,
    boss_shot_bulletE011,
    boss_shot_bulletE012,
    boss_shot_bulletE013,

    boss_shot_bulletE001


    };
}

if(stage_diff==1){    

void (*boss_shot_bullet[DANMAKU_MAX])()=
{
    
    
    boss_shot_bulletH001,
    boss_shot_bulletH002,
    boss_shot_bulletH003,

    boss_shot_bulletH004,
    boss_shot_bulletH005,
    boss_shot_bulletH006,
    boss_shot_bulletH007,
    boss_shot_bulletH008,
    boss_shot_bulletH009,
    boss_shot_bulletH010,
    boss_shot_bulletH011,
    boss_shot_bulletH012,
    boss_shot_bulletH013,

    boss_shot_bulletH001


    };
}

if(stage_diff==2){    
void (*boss_shot_bullet[DANMAKU_MAX])()=
{
    
    
    boss_shot_bulletP001,
    boss_shot_bulletP002,
    boss_shot_bulletP003,
         boss_shot_bulletP004,
      boss_shot_bulletP005,
    boss_shot_bulletP006,
    boss_shot_bulletP007,
    boss_shot_bulletP008,
    boss_shot_bulletP009,
    boss_shot_bulletP010,
    boss_shot_bulletP011,
    boss_shot_bulletP012,
    boss_shot_bulletP013,

    boss_shot_bulletP001


};
}


以上の部分です
 
フォルダを追加する方法が違ったのでしょうか・・・

自分では原因が全く分からないです;
 
よろしくお願いします。
 
画像

SooA

Re:難易度を分けようとしているのですが・・・

#2

投稿記事 by SooA » 15年前

ざっとしか読んでいませんが、
新しく作成したファイルが他のソースファイルと
同じ場所にあるか確認してください。

別の場所に作成していた場合は移動させて、
プロジェクトへの登録もやり直しましょう。

SooA

Re:難易度を分けようとしているのですが・・・

#3

投稿記事 by SooA » 15年前

読み飛ばしてた func.h が
とんでもないことになってますね。

yrao

Re:難易度を分けようとしているのですが・・・

#4

投稿記事 by yrao » 15年前

おはようございます。

SooAさんどうもですm(__)m
登校中なので、携帯からの書き込みですが、


>ファイルの場所を確認

SooAさんのおっしゃる通り、新たに追加したファイルの場所を確認したところ、違う場所に作成していたことが分かりました。

正しい場所にファイル作成をし直したことで、
boss_shotE
boss_shotP
のエラーは消すことができました。
後はfunc.hのエラーのみです。



>func.hがとんでもないことに

…何か大変な間違いをしているでしょうか…

それとも、単に行数が多いだけ……
……てそんなはずないですね、私の場合恐らく前者だと思います(-.-;
おかしい所を教えてもらえれば幸いですm(__)m

Tatu

Re:難易度を分けようとしているのですが・・・

#5

投稿記事 by Tatu » 15年前

func.hの
#include "../GV.h"は

#include "../include/GV.h"か
#include "GV.h"かのどちらかのつもりだと思いますが、

いずれにしても、龍神録プログラミングの館と同じようにつくっているのであれば、
この文はいらないはずです。

なぜなら、龍神録ではfunc.hはboss_shot.cppにインクルードされていますが、
その直前にGV.hがインクルードされているからです。

そのため、この文をつけた場合
struct.h(17) : error C2371: 'ch_t' : 再定義されています。異なる基本型です。
1>struct.h(17) : 'ch_t' の宣言を確認してください。
のようなエラーが大量に(60章のプロジェクトでこれを行った時、32個)出るはずです。

Dixq (管理人)

Re:難易度を分けようとしているのですが・・・

#6

投稿記事 by Dixq (管理人) » 15年前

関数でもないとこにif文は書けないですよ^_^;

SooA

Re:難易度を分けようとしているのですが・・・

#7

投稿記事 by SooA » 15年前

>func.h

プリプロセス
http://www.geocities.jp/ky_webid/c/020.html
http://www.geocities.jp/ky_webid/c/052.html

この方法で指定範囲をコンパイルする・しないといった制御はできますが、
yraoさんのやろうとしている事はメニューから
Easy,Normal,Hard を選択して対応させるというものなので
この方法は使えません。


実のところ私は、龍神禄プログラムについては深く知りません><
質問があったときに、龍神禄プログラムのソースを眺めている程度
ですので、間違っている部分があるかもしれません。
それを踏まえて以降をお試し下さい。

完全に弾幕を切り替えるタイプなら func.h の boss_shot_bullet を以下のようにして

//------------------------------------------
void (*boss_shot_bullet[3][DANMAKU_MAX])() =
{
{ // EASY
boss_shot_bulletH000,//ノーマル
boss_shot_bulletH002,//スペル~パーフェクトフリーズ~
boss_shot_bulletH001,//ノーマル~サイレントセレナ~
boss_shot_bulletH004,//スペル~ケロちゃん~
boss_shot_bulletH009,//スペル~反魂蝶~
boss_shot_bulletH000,//ぬるぽ回避用(この弾幕は出てこない)
},{ // NORMAL
boss_shot_bulletH000,//ノーマル
boss_shot_bulletH002,//スペル~パーフェクトフリーズ~
boss_shot_bulletH001,//ノーマル~サイレントセレナ~
boss_shot_bulletH004,//スペル~ケロちゃん~
boss_shot_bulletH009,//スペル~反魂蝶~
boss_shot_bulletH000,//ぬるぽ回避用(この弾幕は出てこない)
},{ // HARD
boss_shot_bulletH000,//ノーマル
boss_shot_bulletH002,//スペル~パーフェクトフリーズ~
boss_shot_bulletH001,//ノーマル~サイレントセレナ~
boss_shot_bulletH004,//スペル~ケロちゃん~
boss_shot_bulletH009,//スペル~反魂蝶~
boss_shot_bulletH000,//ぬるぽ回避用(この弾幕は出てこない)
}
};
//------------------------------------------
boss_shot.cpp 内の
boss_shot_bullet[boss.knd]();//弾幕関数へ

boss_shot_bullet[難易度][boss.knd]();//弾幕関数へ
と変更する。

SooA

Re:難易度を分けようとしているのですが・・・

#8

投稿記事 by SooA » 15年前

追記
コピペなので入っている弾幕が全部同じですが難易度別に変更します。

yrao

Re:難易度を分けようとしているのですが・・・

#9

投稿記事 by yrao » 15年前

皆さんありがとうございますm(__)m



>Tatuさん
>Dixqさん

if文使えないんですね(+_+)

当初、"../GV.h" を書かずにこのプログラムを実行したときに、if文のエラーがでたのですが、その時に気が付ければよかったです…
試しに、".//GV.h" を書いてみたところ、if文のエラーは消えたので、未熟なゆえこれでいいものかと思っていました……
……余計に悪化していたとは…(-.-;




>SooAさん


おかげさまで、func.hのエラーを消すことができました。

ですがfunc.hのものの他に、新たにエラーがでてしまいました…

『一つ以上の複数回定義されているシンボルが見つかりました』

というものです。

弾幕簡略化関数(龍神録プログラミングの支館のものです)を、
boss_shotH
boss_shotE
boss_shotP
でそれぞれ宣言しているので、それが問題なのだと思うのですが、どうすればエラーを消すことができるのでしょうか…

SooA

Re:難易度を分けようとしているのですが・・・

#10

投稿記事 by SooA » 15年前

追加したファイル boss_shotE.cpp と boss_shotP.cpp を
プロジェクトから除外して、元?に戻して下さい。

弾幕関数は boss_shotH.cpp に追記した方が良いかと思います。
追加方法が龍神禄プログラムのページに書かれていると
思うのでその方が間違いがないでしょう。

以上を行った上でエラーが無いことを確認し、
No:46048 の方法を導入してみてください。

Tatu

Re:難易度を分けようとしているのですが・・・

#11

投稿記事 by Tatu » 15年前

龍神録プログラミングの館からすこし変更したプロジェクトをコピーして試してみました。
試した内容は
boss_shotH.cppをコピーして、boss_shotE.cppに名前変更し、プロジェクトに追加。
boss_shotE.cpp内の弾幕関数の名前をクイック置換で変更。
func.hでも弾幕関数宣言のコピーと変更を行う。
関数ポインタを
void (*boss_shot_bullet[DANMAKU_MAX])() =
...
から
void (*boss_shot_bullet[2][DANMAKU_MAX])() =
...
へと変更し、初期化の中身をそれに合わせて変更。
boss_shot.cppのboss_shot_bullet[boss.knd]();//弾幕関数へ
と書かれていたところを
boss_shot_bullet[0][boss.knd]();//弾幕関数へ
に変更。

ここまでの変更を行った結果、

1>boss_shotE.obj : error LNK2005:
"void __cdecl boss_bullet_on(引数略)" (?boss_bullet_on@@YAXHHHHNNNNNNHHHH@Z)
は既に boss_shotH.obj で定義されています。

というエラーが自分で用意した関数(弾発射、レーザー発射などの簡略化)の数だけ出て、さらに、

1>Debug\RyuJin.exe : fatal error LNK1169:
1 つ以上の複数回定義されているシンボルが見つかりました。
というエラーが表示されました。

そこで、boss_shotE.cpp内にあるそれらの関数の定義を消去し、
extern宣言にしました。つまり、
void boss_bullet_on(引数略){
...
}
と書いていたところを
extern void boss_bullet_on(引数略);
と変えたということです。
その結果、エラーは現れず、弾幕も特に問題ありませんでした。

しかし、難易度を増やすたびにこの作業を行うのが面倒ならば、
boss_shotH.cppに関数の定義を書き、
function.hに
//boss_shotH.cpp
GLOBAL void boss_bullet_on(引数略);
などと書いて、boss_shotE.cppのextern宣言を消すというようにすればよいと思います。

yrao

Re:難易度を分けようとしているのですが・・・

#12

投稿記事 by yrao » 15年前

>SooAさん
>Tatuさん


ありがとうございます

extern宣言をすれば良かったのですねf^_^;

boss_shotE、boss_shotP
にそれぞれ弾幕関数などをextern宣言したところ、複数定義のエラーを消すことがができました


どうもありがとうございました<(__)>

閉鎖

“C言語何でも質問掲示板” へ戻る