龍神録にロード画面を実装する方法

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

龍神録にロード画面を実装する方法

#1

投稿記事 by miyaza » 15年前

昔、どなたかが
▼以下のロードのサンプルを作った▼

#include "Lib/DxLib.h"

//毎回しないといけない処理
int LoopProcess(){
if(ScreenFlip())//裏画面反映
return -1;
if(ProcessMessage())//メッセージ処理
return -1;
if(ClearDrawScreen())//画面クリア
return -1;
if(CheckHitKey(KEY_INPUT_ESCAPE))//ESCキーが押されていると終了
return -1;
return 0;
}

//読み込み個数(GraphLoadが呼ばれる回数)
#define NUM 120
//何回呼ばれたかカウントする変数
int LoadNum;

//ロード状態を描画
void GraphLoad(){
DrawFormatString(300,400,GetColor(0,255,255),"%d%",LoadNum*100/NUM);
DrawBox( 20, 440, 20+600* NUM/NUM, 460, GetColor(0,255,255), FALSE );//枠描画
DrawBox( 20, 440, 20+600*LoadNum/NUM, 460, GetColor(0,255,255), TRUE );//中身描画
LoadNum++;
}

//データのロードと描画関数の呼び出し
int MyLoadGraph(char *st){
GraphLoad();
return LoadGraph( st );
}

//データのロード
void Load( int GraphHandle[NUM] ){
int i;
for(i=0;i<NUM;i++){
LoopProcess();
GraphHandle = MyLoadGraph("Image.png");
}
}

int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){
int n=0;
int GraphHandle[NUM];//画像ハンドル
if( ChangeWindowMode(TRUE) || DxLib_Init() || SetDrawScreen( DX_SCREEN_BACK ) ) return -1;

Load( GraphHandle );//データのロード
while( !LoopProcess() ){

//通常ここに処理を追加

}

DxLib_End();
return 0;
}


これを利用して龍神録にロード画面を表示させる方法を実装してみたいのですが、
画像ハンドルが例えば
img_board[10] = LoadGraph("../dat/img/board/10.png");
img_board[11] = LoadGraph("../dat/img/board/11.png");
img_board[12] = LoadGraph("../dat/img/board/12.png");
img_etc[1] = LoadGraph( "../dat/img/enemy/hp.png" );
img_etc[2] = LoadGraph( "../dat/img/enemy/bossback.png" );
img_etc[5] = LoadGraph( "../dat/img/enemy/bossback3.png" );
LoadDivGraph( "../dat/img/bullet/b0.png" , 5 , 5 , 1 , 76 , 76 , img_bullet[0] ) ;
LoadDivGraph( "../dat/img/bullet/b1.png" , 6 , 6 , 1 , 22 , 22 , img_bullet[1] ) ;
LoadDivGraph( "../dat/img/bullet/b2.png" , 10 , 10 , 1 , 5 , 120 , img_bullet[2] ) ;
sound_se[0]=LoadSoundMem("../dat/se/enemy_shot.wav");
sound_se[1]=LoadSoundMem("../dat/se/enemy_death.wav");
sound_se[2]=LoadSoundMem("../dat/se/cshot.wav");
color[0] = GetColor(255,255,255);//白
color[1] = GetColor( 0, 0, 0);//黒
color[2] = GetColor(255, 0, 0);//赤
みたいにバラバラで、どうもロードの仕方が分かりません。
どうしたら上手くいくか分かる方がいましたら教えてください。
よろしくお願いします。

dic

Re:龍神録にロード画面を実装する方法

#2

投稿記事 by dic » 15年前

継承を使ってみてはどうでしょう?
#include <iostream>

class    Image
{
public:
    Image();
};
Image::Image() { }

class    Sound
{
public:
    Sound();
};
Sound::Sound() { }


class Data
{
public:
    virtual void    Load( char *filename, Image *image ) = 0;
    virtual    void    Load( char *filename, Sound *sound ) = 0;
};

class    DataLoad    :    public    Data
{
public:
    void    Load( char *filename, Image *image );
    void    Load( char *filename, Sound *sound );
};

void    DataLoad::Load( char *filename, Image *image )
{
    //    ロード処理
    //    image = Load( filename );
    printf( "Image Loaded.\n" );
}

void    DataLoad::Load( char *filename, Sound *sound )
{
    //    ロード処理
    //sound = Load( filename );
    printf( "Sound Loaded.\n" );
}

int main()
{
    DataLoad    *manager = new DataLoad();
    Image    image;
    Sound    sound;

    manager->Load( "test.jpg", &image );
    manager->Load( "test.wav", &sound );

    delete manager;

    return 0;
}

dic

Re:龍神録にロード画面を実装する方法

#3

投稿記事 by dic » 15年前

自分で自分にレスするのもなんですが
Load( char *filename, Image *image );
Load( char *filename, Sound *sound );
とありますが、これってテンプレート化できたらやったほうがいい気がしてきた

組木紙織

Re:龍神録にロード画面を実装する方法

#4

投稿記事 by 組木紙織 » 15年前

>とありますが、これってテンプレート化できたらやったほうがいい気がしてきた
テンプレート化してみました。


#include <iostream>
#include <vector>
#include <algorithm>
#include <iterator>
#include <functional>
class Image
{
public:
bool run();
};
bool Image::run() {std::cout <<"image"<<std::endl; return true;}

class Sound
{
public:
bool run();
};
bool Sound::run(){std::cout << "sound" <<std::endl; return true;}

class base
{
base* thisPtr;
public:
virtual bool run()=0;
};

template<typename T>
class Data: public base
{
private:
T t;
public:
bool run(){return t.run();}
bool load(char*filename);
// コンストラクタ
Data(char*filename){std::cout << "open " << filename << std::endl; }
Data(){thisPrt=this;}
};

struct f : public std::unary_function<base*,bool>
{
bool operator()(base *b)
{
return b->run();
}

};

int main()
{
Data<Image> dataImage("image");
Data<Sound> dataSound("sound");

std::vector<base*> vec;
vec.push_back(&dataImage);
vec.push_back(&dataSound);
std::for_each(vec.begin(),vec.end(),f());

return 0;
}

miyaza

Re:龍神録にロード画面を実装する方法

#5

投稿記事 by miyaza » 15年前

つまり、どうすればよろしいのでしょうか?

Ma

Re:龍神録にロード画面を実装する方法

#6

投稿記事 by Ma » 15年前

すべての変数をポインタ化して、そのポインタとファイル名を構造体にする。
それを配列にすれば、サンプルの方法でできます。


struct pointer_file{
int* soundHand;
std::string fileName;
}

pointer_file graphInitList[100] = {
{&graph_enemy[0],"fweagweag.jpg"},
{&graph_anime[1],"fwgeawg.jpg"},
}



もうひとつの方法は、グラフハンドルはすべてひとつの配列にしてしまう。
区別の仕方はインデックスにする値を#define することで、わかりやすくなる。

graphs[100];

#define G_BULLET1 (0)

graphs[G_BULLET1] = LoadGraph(...


*注意:テンプレートがどうのこうのってところはまったく読んでないです。

*追記注意
LoadDivGraph は、このようにはいかないので、もうひと工夫が必要です。
最初の質問と最初の過去のサンプルをみて答えました。 画像

dic

Re:龍神録にロード画面を実装する方法

#7

投稿記事 by dic » 15年前

む?
miyazaさんは
バラバラで、どうもロードの仕方が分かりません。
どうしたら上手くいくか分かる方がいましたら教えてください。
とおっしゃってたので
統一した形式でロード処理のソースを書きたいのかなと思い
継承を使った場合をサンプルで書いてみました

継承がわからないのか、関数のオーバーロードがわからないのか
関数の組み方がわからないのか、どうやっていいのかまったくわからないのか

どこらへんでつまづいてます?

Maさんのサンプルもありますので、私だけのやりかたにこだわらなくていいですけど

閉鎖

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