シューティングゲームの館での

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

シューティングゲームの館での

#1

投稿記事 by com » 17年前

4.基本的な関数を作る。
のプログラムを自分のやりやすいように変えてやってみると
実行結果のようにはいかず
また、プログラムソースを丸写しでも実行結果と同じようになりませんでした。

やってみた結果はFPSだけが表示されあとは真っ暗なままでした。

解決法はあるでしょうか?
それとも私だけでしょうか?

管理人

Re:シューティングゲームの館での

#2

投稿記事 by 管理人 » 17年前

コンパイラはBorlandでしょうか?
もしそうなら、

void img_sound_load()関数内でロードしているデータは

Debugフォルダに入れなければならないのを入れていないのではないでしょうか。
ゲームプログラミングの館の方ではうまくいきましたか?

com

Re:シューティングゲームの館での

#3

投稿記事 by com » 17年前

素材ファイルの位置がおかしかったようです。

VusualC++を使用していますがご指摘で気づきました。

簡単なミスで申し訳ないです。

ありがとうございます。

com

Re:シューティングゲームの館での

#4

投稿記事 by com » 17年前

続けて質問すみません。
使用はVusualC++です。

5節の分割コンパイルについてですが
同じように組んでいても
error C2039: 'status' : 'CharaData' のメンバではありません。
error C2146: 構文エラー : ';' が、識別子 'status' の前に必要です。



このほかにも(似たようなエラーを)60ぐらいのを吐き出します。
メンバに関してもちゃんと入っているのにこのようなエラーが出て
構文エラーに関しては間違っていないのにこのようなエラーがでます。

他のプログラムの本でも毎回分割コンパイルでつんでしまいます。

どなたか教えてください。

管理人

Re:シューティングゲームの館での

#5

投稿記事 by 管理人 » 17年前

簡単な分割コンパイルなら出来ます?

管理人

Re:シューティングゲームの館での

#6

投稿記事 by 管理人 » 17年前

簡単な分割コンパイルについてやってみましょう。
まず、ゲームプログラミングの館の5節で紹介しているコードを用います。
これです。
#include "DxLib.h"

int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){
        ChangeWindowMode( TRUE ) ; // ウインドウモードに変更
        if( DxLib_Init() == -1 ) return -1; // DXライブラリ初期化処理 エラーが起きたら終了 


        int White,Red,G_Blue;

        White   = GetColor( 255 , 255 , 255 ) ; // 白色の値を取得
        Red     = GetColor( 255 ,   0 ,   0 ) ; // 赤色の値を取得
        G_Blue  = GetColor(   0 , 255 , 255 ) ; // 緑と青の混合色の値を取得

        DrawLine  (  10 ,  10 , 630 ,  10 , White ) ;           // 線を描画
        DrawBox   (  10 ,  50 , 310 , 100 , G_Blue , FALSE) ;   // 四角形を描画
        DrawBox   (  10 , 150 , 310 , 200 , G_Blue , TRUE ) ;   // 四角形を描画(塗りつぶし)
        DrawCircle( 500 , 300 , 100 , Red , TRUE) ;             // 円を描画(塗りつぶし)


        WaitKey() ;                     // キーの入力待ち(『WaitKey』を使用)
        DxLib_End() ;                   // DXライブラリ使用の終了処理
        return 0 ;                      // ソフトの終了
}
 
DXライブラリのサンプル実行用フォルダにあるプロジェクトでいいので、これをコピペしてください。
これを分けてみますね。
真ん中の部分を抜き取って、draw_graph()という関数
void draw_graph(){
        int White,Red,G_Blue;

        White   = GetColor( 255 , 255 , 255 ) ; // 白色の値を取得
        Red     = GetColor( 255 ,   0 ,   0 ) ; // 赤色の値を取得
        G_Blue  = GetColor(   0 , 255 , 255 ) ; // 緑と青の混合色の値を取得

        DrawLine  (  10 ,  10 , 630 ,  10 , White ) ;           // 線を描画
        DrawBox   (  10 ,  50 , 310 , 100 , G_Blue , FALSE) ;   // 四角形を描画
        DrawBox   (  10 , 150 , 310 , 200 , G_Blue , TRUE ) ;   // 四角形を描画(塗りつぶし)
        DrawCircle( 500 , 300 , 100 , Red , TRUE) ;             // 円を描画(塗りつぶし)
}


を作り、他のファイルに移してみましょう。
まず、ソリューションエクスプローラーの
「DxLib_VC2005用」上で右クリックし「追加」>「新しい項目」を選びます。
左側で[コード]が選択されていることを確認し、右側でc++を選択し、名前は適当にtest2とでもしましょう。

出てきたtest2.cppの画面に、先ほど作った関数を書いてみます。
DxLib.hのインクルードはDXライブラリの関数を使うファイルでは全て呼ぶ必要があるので、
test2.cppとtest.cppの記述は以下のようになります。

--------------------test2.cpp--------------------

#include "DxLib.h"

void draw_graph(){
	int White,Red,G_Blue;

    White   = GetColor( 255 , 255 , 255 ) ; // 白色の値を取得
    Red     = GetColor( 255 ,   0 ,   0 ) ; // 赤色の値を取得
    G_Blue  = GetColor(   0 , 255 , 255 ) ; // 緑と青の混合色の値を取得

    DrawLine  (  10 ,  10 , 630 ,  10 , White ) ;           // 線を描画
    DrawBox   (  10 ,  50 , 310 , 100 , G_Blue , FALSE) ;   // 四角形を描画
    DrawBox   (  10 , 150 , 310 , 200 , G_Blue , TRUE ) ;   // 四角形を描画(塗りつぶし)
    DrawCircle( 500 , 300 , 100 , Red , TRUE) ;             // 円を描画(塗りつぶし)
}


--------------------------test.cpp-----------------------------------


#include "DxLib.h"

extern void draw_graph();

int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){
        ChangeWindowMode( TRUE ) ; // ウインドウモードに変更
        if( DxLib_Init() == -1 ) return -1; // DXライブラリ初期化処理 エラーが起きたら終了 


        draw_graph();
		

        WaitKey() ;                     // キーの入力待ち(『WaitKey』を使用)
        DxLib_End() ;                   // DXライブラリ使用の終了処理
        return 0 ;                      // ソフトの終了
}


---------------------------------------------------------------------
 
うまくいきました?

ちなみに、test.cppで書いている
extern void draw_graph();
はエクスターン宣言といって、違いファイルにある関数を違うファイルで呼ぶときに、
「どっかのファイルにこの関数がありますよ」と言うことを示すものです。
関数を呼ぶほうのファイルに書いてください。

com

Re:シューティングゲームの館での

#7

投稿記事 by com » 17年前

もういちど5節の最初の簡単な分割をやってみましたが
できませんでした。;;;

なぜでしょうか?

com

Re:シューティングゲームの館での

#8

投稿記事 by com » 17年前

上に書き込まれたものを試して見ます。
わざわざすみません。

管理人

Re:シューティングゲームの館での

#9

投稿記事 by 管理人 » 17年前

むむむ・・。

上記の手順でどこで躓きます?
上のサンプルを実行したときどんなエラーが出ますか?

管理人

Re:シューティングゲームの館での

#10

投稿記事 by 管理人 » 17年前

なお、
5節では、たったこれだけしか書いていないので
/*test.cpp*/

#include <stdio.h>

char a[30]="hello";

extern void disp();

void main(){

        disp();

}

/* test2.cpp */

#include <stdio.h>

extern char a[30];

void disp(){

        printf("%s",a);

}
 
error C2039: 'status' : 'CharaData' のメンバではありません。
error C2146: 構文エラー : ';' が、識別子 'status' の前に必要です。

のようなエラーが出るのはおかしいです。このような変数は使っていません。
きっと、プロジェクトではない、別のファイルか何かに書き込んでいるのではないでしょうか?

なお、DXライブラリのプロジェクトはコンソールのプロジェクトではないので、
5節はサンプルプログラム実行用フォルダにあるプロジェクトではコンパイル出来ません。
5節をコンパイルするときは、コンソール用のプロジェクトで行ってください。
6節からはDXライブラリ用のプロジェクトでコンパイル可能です。

com

Re:シューティングゲームの館での

#11

投稿記事 by com » 17年前

先ほどのサンプルプログラム試してきました。
どうやらうまくいったようです!

error C2039: 'status' : 'CharaData' のメンバではありません。
error C2146: 構文エラー : ';' が、識別子 'status' の前に必要です。
を書き込んだプログラムは5節ではなく6節のものでした。

となると何がおかしかったのでしょうか?
ライブラリ使用前の設定でしょうか・・・?

管理人

Re:シューティングゲームの館での

#12

投稿記事 by 管理人 » 17年前

うーん、そもそもCharaDataなんて変数は無いと思うのですが・・。
どこかに

CharaData.status

みたいな記述があるんですよね?
どこにCharaDataが書いてありますか?
Ctrl+FでCharaDataで検索すれば見つかります。

最悪の場合
ソースとプロジェクトのダウンロード
で完成したプロジェクトがダウンロードできますので、そちらご利用下さい。

com

Re:シューティングゲームの館での

#13

投稿記事 by com » 17年前

typedef struct{
   double x,y;
   int status,counter;
   int shot [11][15];
} BODY_player_t;

extern BODY_player_t Player;



typedef struct{
  double x,y;
  int status,counter;
  int shot [11][15];
} CharaData;

extern CharaData Player;
に変えています。

com

Re:シューティングゲームの館での

#14

投稿記事 by com » 17年前

しつこいようですみません。

先ほどの何も変えずにそのまま入れたら成功しました。

どういうことでしょうか?
typedef struct{
   double x,y;
   int status,counter;
   int shot [11][15];
} BODY_player_t;

extern BODY_player_t Player;

の[BODY_player_t;]というのは[CharaData]に置き換えることはできないのでしょうか?
含めて[extern BODY_player_t Player;]というのを[CharaData Player;]に変えることがなぜできないのでしょうか?

管理人

Re:シューティングゲームの館での

#15

投稿記事 by 管理人 » 17年前

2つ上の投稿の内容がただしければそれは出来ます。
名前が変わっただけなので。

しかし[extern BODY_player_t Player;]というのを[CharaData Player;]という変更は出来ません。
先ほども書きましたとおり、extern宣言というのは、同一ファイル内で宣言していないものを他のファイルで使用するとき「どっかのファイルに定義があるから探してね」という意味なので、
定義するファイルでは

CharaData Player;

と書きますが、それを利用するほかのファイルでは

extern CharaData Player;

と書かなければいけません。
名前を変えることは出来ます。CharaDataという名前でもかまいません。

管理人

Re:シューティングゲームの館での

#16

投稿記事 by 管理人 » 17年前

また、タグの名前は、他の変数名と混合しないよう、後ろに_tをつけるのが一般的なようです。
別に義務ではないですが、パッとみてすぐタグ名だとわかるので、_tをつけるのがおススメです。

com

Re:シューティングゲームの館での

#17

投稿記事 by com » 17年前

なるほど。こんな質問に時間をかけてしまいすみませんでした。

また何かあったら質問させていただきますがそのときは
よろしくお願いします。

本当にありがとうございました!

閉鎖

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