ページ 1 / 1
画像の描画方法について
Posted: 2012年3月27日(火) 11:41
by ふらっと
画像を描画する際
画像をロードする初期化用の関数を含むソースファイル
画像を描画する描画用関数を含むソースファイル
画像描画関数を呼び出すメインのソースファイル
の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をつけないで変数宣言してみましたが、そんなに単純なものではなさそうで。
よろしくお願いします。
Re: 画像の描画方法について
Posted: 2012年3月27日(火) 11:58
by softya(ソフト屋)
c++などのオブジェクト指向やC言語の構造化プログラミングではデータと処理は1つのクラス/cppファイルに収まっていて出来るだけ外部に公開しないカプセル化が良いとされています。
なので根本的によくない設計なのでは?と思いますが。
ちなみにエラーメッセージやextern参照がどうなっているかわからないと答え様がない質問です。
#include "Initilize.h"
や
#include "Draw.h"
の中身もわかりませんし。
[補足]
「ゲームプログラミングの館」ではデータと処理を1つのファイルにまとめる方式が推奨されているはずなのですが・・・。
「新・C言語 ~ゲームプログラミングの館~ [DXライブラリ] d.3章 ゲームの設計と分割コンパイル(1)」
http://dixq.net/g/d_03.html
Re: 画像の描画方法について
Posted: 2012年3月27日(火) 12:04
by ふらっと
やはり素直にまとめてしまった方が良いですかねぇ。
Re: 画像の描画方法について
Posted: 2012年3月27日(火) 12:17
by softya(ソフト屋)
ふらっと さんが書きました:やはり素直にまとめてしまった方が良いですかねぇ。
グローバル変数の参照の方法を知らないのは後々困るので知っておいたほうが良いのは確かです。
なのでエラーを取ることでグローバル変数と言うものを理解する事は重要だと思いますのでエラーを取ることは行なって下さい。
しかし、それと設計の仕方がマズイのは別の問題です。
Drawと言うファイル名=モジュール名は名前として具体性に欠けると言って良いでしょう。
何をしてくれるモジュールなの?って事が中規模~大規模開発では大変重要で名前も個性的でひと目で機能が分かる名前が付けられているべきです。
これは関数名・変数名にも言えることです。
モジュールが機能を表すのは良いですがDrawという抽象的なものより具体的なモジュールにマトめる事を考えて下さい。
なのでふらっとさんの考える素直が分かりませんが、1つのファイル(あとヘッダ)を開いて必要なモノが全て見渡せる設計のほうが良い設計です。
Re: 画像の描画方法について
Posted: 2012年3月27日(火) 13:47
by ふらっと
今のところエラーは
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;
}
このようにメインのファイルの初めに変数を宣言するだけではだめなんですか?
これだとエラーが消えませんでした。
勉強不足で申し訳ないです。
Re: 画像の描画方法について
Posted: 2012年3月27日(火) 13:50
by softya(ソフト屋)
int Image_Gu, Image_Tyo, Image_Pa;
はグローバルな公開ですが、そのままでは参照できません。
externに付いて調べてみて下さい。
Re: 画像の描画方法について
Posted: 2012年3月27日(火) 13:59
by ふらっと
ありがとうございます。
一応出来るには出来ました。
コード:
//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 );
}
それと、名前をもっと具体的につけた方がいいとアドバイスいただきましたが、具体的にどんな名前をつけるのが良いですか?
Re: 画像の描画方法について
Posted: 2012年3月27日(火) 14:53
by softya(ソフト屋)
まず、
extern int Image_Gu, Image_Tyo, Image_Pa;
をソース毎に書いてますが、これはヘッダで共通化すると楽になります。
そのためのヘッダファイルでもあります。
それと本題ですが、じゃんけんの手と言う英訳というのは悩む所ですがJankenKindとかとしてみましょう。
ファイル名としてJankenKind.hとJankenKind.cppとして
JankenKind_Initilize();
JankenKind_DrawPlayerGu();
JankenKind_DrawPlayerTyoki();
JankenKind_DrawPlayerPa();
などはどうでしょうか?
Re: 画像の描画方法について
Posted: 2012年3月27日(火) 15:14
by ふらっと
そういうことですか。
描画なら、プレイヤーの出し手の描画やCPUIの出し手の描画、結果の描画など、プログラム内の描画全てをまとめて1つのファイルにするのではなく
じゃんけんの手だとかじゃんけんの結果だとかで1つのファイルにして、初期化や描画などをまとめると良いということですね。
Re: 画像の描画方法について
Posted: 2012年3月27日(火) 15:21
by softya(ソフト屋)
ふらっと さんが書きました:そういうことですか。
描画なら、プレイヤーの出し手の描画やCPUIの出し手の描画、結果の描画など、プログラム内の描画全てをまとめて1つのファイルにするのではなく
じゃんけんの手だとかじゃんけんの結果だとかで1つのファイルにして、初期化や描画などをまとめると良いということですね。
そうですね。
じゃんけんの手の表示とゲーム全体の結果表示はそれぞれのソースに分けたほうが良いです。
そうすればじゃんけんの手の画像ハンドルをグローバル変数にして外部公開する必要性もなくなるはずです。
Re: 画像の描画方法について
Posted: 2012年3月27日(火) 15:25
by ふらっと
プログラムの仕方の知識が少し増えました。
少しといっても自分にとって大きな進歩だと思います。
本当にありがとうございました。
今後ともよろしくお願いします。