ページ 11

背景について(初歩的な質問です)

Posted: 2011年12月25日(日) 18:23
by mizuki
C言語の入門書を一通り終わらせた程度の者です。
ゲームを作るのは今回初めてです。
過去のトピックも探して設定の間違いなど確認してみたのですが解決しないので投稿させていただきます。
まず背景を出そうと思って挑戦していたのですが以下のエラーが出てしまいます。

1>main.obj : error LNK2019: 未解決の外部シンボル "void __cdecl Back_Finalize(struct Back_t)" (?Back_Finalize@@YAXUBack_t@@@Z) が関数 _WinMain@16 で参照されました。
1>main.obj : error LNK2019: 未解決の外部シンボル "void __cdecl Back_Graph(struct Back_t)" (?Back_Graph@@YAXUBack_t@@@Z) が関数 _WinMain@16 で参照されました。
1>C:\visual studio 2010\Projects\test\Debug\test.exe : fatal error LNK1120: 外部参照 2 が未解決です。


ソースは長くなりますが以下の通りです。
サイトのPlayerのプログラムを参考にして作りました。
この方法だと難しいのでしょうか?

コード:

/* main.cpp*/

#include "DxLib.h"
#include "Player.h"
#include "Keyboard.h"
#include "background.h"


// プログラムは WinMain から始まります
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow )
{
	ChangeWindowMode(TRUE);

	if( DxLib_Init() == -1 )		// DXライブラリ初期化処理
	{
		return -1 ;			// エラーが起きたら直ちに終了
	}

	Player_t Player1, Player2;
             Player_Initialize( &Player1,   0 );// 初期化
             Player_Initialize( &Player2, 200 );// 初期化

	 Back_t Title;
	 Back_Initialize(&Title);

        while( ScreenFlip()==0 && ProcessMessage()==0){

	Back_Graph(Title);//背景
	
	Keyboard_Update();

             Player_Calc( &Player1 );        // 計算
             Player_Calc( &Player2 );        // 計算

             Player_Graph( Player1 );        // 描画
             Player_Graph( Player2 );        // 描画

			
        }

        Player_Finalize( Player1 );  // 終了処理
        Player_Finalize( Player2 );  // 終了処理

		Back_Finalize(Title);
	


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

	return 0 ;				// ソフトの終了 
}


コード:

/* background.cpp */

#include "DxLib.h"
#include "Background.h"

void Back_Initialize(Back_t *Back){
	Back->Image = LoadGraph("画像/titleback.png");
}

void Background_Gragh(Back_t Back){
	DrawGraph( 0, 0, Back.Image, TRUE );
}

void Background_Finalize( Back_t Back ){
        DeleteGraph( Back.Image );
}

コード:

/* background.h */

#ifndef DEF_BACK_H //二重include防止

#define DEF_BACK_H

typedef struct{
        int Image;
} Back_t;

// 初期化をする
void Back_Initialize(Back_t *Back);

// 描画する
void Back_Graph(Back_t Back);

// 終了処理をする
void Back_Finalize( Back_t Back );

#endif 

コード:

/* Player.cpp */

#include "DxLib.h"
#include "Keyboard.h"
#include "player.h"


// 初期化をする
void Player_Initialize( Player_t *Player, int y ){
        Player->Image = LoadGraph("画像/キャラクタ01.png");
        Player->y     = y;
}

// 動きを計算する
void Player_Calc( Player_t *Player ){
        if( Keyboard_Get( KEY_INPUT_UP   ) > 0 ){
                Player->y--;
        }
        if( Keyboard_Get( KEY_INPUT_DOWN ) > 0 ){
                Player->y++;
        }
}

// 描画する
void Player_Graph( Player_t Player ){
        DrawGraph( 0, Player.y, Player.Image, TRUE );
}

// 終了処理をする
void Player_Finalize( Player_t Player ){
        DeleteGraph( Player.Image );
} 

コード:


/* Player.h */

#ifndef DEF_PLAYER_H //二重include防止

#define DEF_PLAYER_H

typedef struct{
        int Image;
        int y;
} Player_t;

// 初期化をする
void Player_Initialize( Player_t *Player, int y );

// 動きを計算する
void Player_Calc( Player_t *Player );

// 描画する
void Player_Graph( Player_t Player );

// 終了処理をする
void Player_Finalize( Player_t Player );

#endif 

Re: 背景について(初歩的な質問です)

Posted: 2011年12月25日(日) 18:37
by softya(ソフト屋)
Background_Gragh()とBack_Graph()と名前が食い違っています。Back_Finalizeも同様です。

[補足]
このエラーはリンク時に関数の実体が見つからないときに出るエラーです。
名前が食い違うと出るエラーですので覚えておいてください。

Re: 背景について(初歩的な質問です)

Posted: 2011年12月25日(日) 18:54
by mizuki
ほんと初歩的な間違いでした・・・。
ありがとうございます!
エラーについてはまだよくわからない部分が多いのでとてもありがたいです。


とおることはできましたが、黒い画面から抜け出すことができません。
サイトを一通りやるとwhileで黒画面になるようにループされていると知って消したのですが、それだけでは背景は黒いままなのでしょうか?

Re: 背景について(初歩的な質問です)

Posted: 2011年12月25日(日) 19:03
by softya(ソフト屋)
mizuki さんが書きました:とおることはできましたが、黒い画面から抜け出すことができません。
サイトを一通りやるとwhileで黒画面になるようにループされていると知って消したのですが、それだけでは背景は黒いままなのでしょうか?
ClearDrawScreen()は消してはいけません。ゲームでは毎フレーム全部描画しなおすのがスタンダードですので、ClearDrawScreen()しても問題有りません。
実行時に出来るLog.txtに問題があればエラーが残っているはずですので確認してみてください。

Re: 背景について(初歩的な質問です)

Posted: 2011年12月25日(日) 19:12
by mizuki
setなんとかだけだったんですね・・・
whileにClearDrawScreen() == 0を追加したところ、うまくできました!
くだらない質問にお付き合いいただきありがとうございました。