画像の描画方法について

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
ふらっと
記事: 13
登録日時: 13年前

画像の描画方法について

#1

投稿記事 by ふらっと » 13年前

画像を描画する際
画像をロードする初期化用の関数を含むソースファイル
画像を描画する描画用関数を含むソースファイル
画像描画関数を呼び出すメインのソースファイル
の3つに分けて行いたいんですが、それが上手くいかないのでアドバイスお願いします。

下に自分でやってみたソースコードを載せておきます。

コード:

// Initilize.cpp
#include "DxLib.h"
#include "Initilize.h"


int Image_Gu, Image_Tyo, Image_Pa;

void Draw_Initilize(){
	Image_Gu  = LoadGraph("画像/ぐー.png");
	Image_Tyo = LoadGraph("画像/ちょき.png");
	Image_Pa  = LoadGraph("画像/ぱー.png");
}


// Draw.cpp
#include "DxLib.h"
#include "Draw.h"


void Draw_Player_Gu(){
	DrawGraph( 0, 0, Image_Gu, TRUE);
}


// 呼び出し側
Draw_Player_Gu();
Initilize.ccpでstaticをつけないで変数宣言してみましたが、そんなに単純なものではなさそうで。

よろしくお願いします。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

Re: 画像の描画方法について

#2

投稿記事 by softya(ソフト屋) » 13年前

c++などのオブジェクト指向やC言語の構造化プログラミングではデータと処理は1つのクラス/cppファイルに収まっていて出来るだけ外部に公開しないカプセル化が良いとされています。
なので根本的によくない設計なのでは?と思いますが。

ちなみにエラーメッセージやextern参照がどうなっているかわからないと答え様がない質問です。
#include "Initilize.h"

#include "Draw.h"
の中身もわかりませんし。

[補足]
「ゲームプログラミングの館」ではデータと処理を1つのファイルにまとめる方式が推奨されているはずなのですが・・・。

「新・C言語 ~ゲームプログラミングの館~ [DXライブラリ] d.3章 ゲームの設計と分割コンパイル(1)」
http://dixq.net/g/d_03.html
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

ふらっと
記事: 13
登録日時: 13年前

Re: 画像の描画方法について

#3

投稿記事 by ふらっと » 13年前

やはり素直にまとめてしまった方が良いですかねぇ。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

Re: 画像の描画方法について

#4

投稿記事 by softya(ソフト屋) » 13年前

ふらっと さんが書きました:やはり素直にまとめてしまった方が良いですかねぇ。
グローバル変数の参照の方法を知らないのは後々困るので知っておいたほうが良いのは確かです。
なのでエラーを取ることでグローバル変数と言うものを理解する事は重要だと思いますのでエラーを取ることは行なって下さい。

しかし、それと設計の仕方がマズイのは別の問題です。
Drawと言うファイル名=モジュール名は名前として具体性に欠けると言って良いでしょう。
何をしてくれるモジュールなの?って事が中規模~大規模開発では大変重要で名前も個性的でひと目で機能が分かる名前が付けられているべきです。
これは関数名・変数名にも言えることです。

モジュールが機能を表すのは良いですがDrawという抽象的なものより具体的なモジュールにマトめる事を考えて下さい。
なのでふらっとさんの考える素直が分かりませんが、1つのファイル(あとヘッダ)を開いて必要なモノが全て見渡せる設計のほうが良い設計です。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

ふらっと
記事: 13
登録日時: 13年前

Re: 画像の描画方法について

#5

投稿記事 by ふらっと » 13年前

今のところエラーは
error C2065: 'Image_Gu' : 定義されていない識別子です。
error C2065: 'Image_Tyo' : 定義されていない識別子です。
error C2065: 'Image_Pa' : 定義されていない識別子です。
が出ているので、これらの変数をグローバルに出来れば一応エラーは消えると思うんですが

コード:

#include "DxLib.h"
#include "Initilize.h"
#include "Draw.h"

int Image_Gu, Image_Tyo, Image_Pa;


int WINAPI WinMain(HINSTANCE,HINSTANCE,LPSTR,int){
        ChangeWindowMode(TRUE), DxLib_Init(), SetDrawScreen( DX_SCREEN_BACK ); //ウィンドウモード変更と初期化と裏画面設定

		

        // while(裏画面を表画面に反映, メッセージ処理, 画面クリア, キーの更新)
	while( ScreenFlip()==0 && ProcessMessage()==0 && ClearDrawScreen()==0 ){

		Draw_Initilize();

		Draw_Player_Gu();

	}

	DxLib_End(); // DXライブラリ終了処理
	return 0;
}
このようにメインのファイルの初めに変数を宣言するだけではだめなんですか?
これだとエラーが消えませんでした。
勉強不足で申し訳ないです。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

Re: 画像の描画方法について

#6

投稿記事 by softya(ソフト屋) » 13年前

int Image_Gu, Image_Tyo, Image_Pa;
はグローバルな公開ですが、そのままでは参照できません。
externに付いて調べてみて下さい。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

ふらっと
記事: 13
登録日時: 13年前

Re: 画像の描画方法について

#7

投稿記事 by ふらっと » 13年前

ありがとうございます。
一応出来るには出来ました。

コード:

//main.cpp

#include "DxLib.h"
#include "Initilize.h"
#include "Draw.h"

int Image_Gu, Image_Tyo, Image_Pa;


int WINAPI WinMain(HINSTANCE,HINSTANCE,LPSTR,int){
        ChangeWindowMode(TRUE), DxLib_Init(), SetDrawScreen( DX_SCREEN_BACK ); //ウィンドウモード変更と初期化と裏画面設定

		

        // while(裏画面を表画面に反映, メッセージ処理, 画面クリア, キーの更新)
	while( ScreenFlip()==0 && ProcessMessage()==0 && ClearDrawScreen()==0 ){

		Draw_Initilize();

		Draw_Player_Gu();

	}

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

//Initilize.cpp
#include "DxLib.h"
#include "Initilize.h"


extern int Image_Gu, Image_Tyo, Image_Pa;

void Draw_Initilize(){
	Image_Gu  = LoadGraph("画像/ぐー.png");
	Image_Tyo = LoadGraph("画像/ちょき.png");
	Image_Pa  = LoadGraph("画像/ぱー.png");
}


//Draw.cpp
#include "DxLib.h"
#include "Draw.h"


extern int Image_Gu, Image_Tyo, Image_Pa;

void Draw_Player_Gu(){
	DrawGraph( 0, 0, Image_Gu, TRUE );
}

void Draw_Player_Tyo(){
	DrawGraph( 0, 0, Image_Tyo, TRUE );
}

void Draw_Player_Pa(){
	DrawGraph( 0, 0, Image_Pa, TRUE );
}

それと、名前をもっと具体的につけた方がいいとアドバイスいただきましたが、具体的にどんな名前をつけるのが良いですか?

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

Re: 画像の描画方法について

#8

投稿記事 by softya(ソフト屋) » 13年前

まず、
extern int Image_Gu, Image_Tyo, Image_Pa;
をソース毎に書いてますが、これはヘッダで共通化すると楽になります。
そのためのヘッダファイルでもあります。

それと本題ですが、じゃんけんの手と言う英訳というのは悩む所ですがJankenKindとかとしてみましょう。

ファイル名としてJankenKind.hとJankenKind.cppとして
JankenKind_Initilize();
JankenKind_DrawPlayerGu();
JankenKind_DrawPlayerTyoki();
JankenKind_DrawPlayerPa();
などはどうでしょうか?
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

ふらっと
記事: 13
登録日時: 13年前

Re: 画像の描画方法について

#9

投稿記事 by ふらっと » 13年前

そういうことですか。
描画なら、プレイヤーの出し手の描画やCPUIの出し手の描画、結果の描画など、プログラム内の描画全てをまとめて1つのファイルにするのではなく
じゃんけんの手だとかじゃんけんの結果だとかで1つのファイルにして、初期化や描画などをまとめると良いということですね。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

Re: 画像の描画方法について

#10

投稿記事 by softya(ソフト屋) » 13年前

ふらっと さんが書きました:そういうことですか。
描画なら、プレイヤーの出し手の描画やCPUIの出し手の描画、結果の描画など、プログラム内の描画全てをまとめて1つのファイルにするのではなく
じゃんけんの手だとかじゃんけんの結果だとかで1つのファイルにして、初期化や描画などをまとめると良いということですね。
そうですね。
じゃんけんの手の表示とゲーム全体の結果表示はそれぞれのソースに分けたほうが良いです。
そうすればじゃんけんの手の画像ハンドルをグローバル変数にして外部公開する必要性もなくなるはずです。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

ふらっと
記事: 13
登録日時: 13年前

Re: 画像の描画方法について

#11

投稿記事 by ふらっと » 13年前

プログラムの仕方の知識が少し増えました。
少しといっても自分にとって大きな進歩だと思います。

本当にありがとうございました。
今後ともよろしくお願いします。

閉鎖

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