ロード画面の表示方法について

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

ロード画面の表示方法について

#1

投稿記事 by 猫の湯吞み » 1年前

質問文:
 現在、https://dixq.net/g/sp_06.html さんのコードで非同期読み込みでファイルを読み込んだ際、ロード画面を表示できるようにする方法が判らなく立ち止まっています。

どのように取り組んだか:
main.cppを以下のように変更し

コード:

#include "DxLib.h"
#include "SceneMgr.h"

int LoadCircle;

void LoadScreen() {
	static double count;
	DrawRotaGraph2F(2360,900, 750, 750, 1.0, count, LoadCircle, TRUE);
	count += 0.1;
	
}

int WINAPI WinMain(HINSTANCE,HINSTANCE,LPSTR,int){
    ChangeWindowMode(TRUE), DxLib_Init(), SetDrawScreen( DX_SCREEN_BACK ); //ウィンドウモード変更と初期化と裏画面設定
    LoadCircle = LoadGraph("./Data/img/Load/LoadCircle.png");
	SetUseASyncLoadFlag(TRUE);
    SceneMgr sceneMgr;
    sceneMgr.Initialize();

    while( ScreenFlip()==0 && ProcessMessage()==0 && ClearDrawScreen()==0 ){//画面更新 & メッセージ処理 & 画面消去

    if (GetASyncLoadNum() == 0) {
        sceneMgr.Update();  //更新
        sceneMgr.Draw();    //描画
    }else{
        LoadScreen();
    }
    }

    sceneMgr.Finalize();

    DxLib_End(); // DXライブラリ終了処理
    return 0;
}
Menu.cppでMV1LoadModelを使用し容量の大きいファイルを読み込むと

コード:

#include "Menu.h"
#include "DxLib.h"

static int model;

Menu::Menu(ISceneChanger* changer) : BaseScene(changer) {
}

//初期化
void Menu::Initialize(){
    mImageHandle = LoadGraph("images/Scene_Menu.png");    //画像のロード
    model = MV1LoadModel("model.pmx");
}

//更新
void Menu::Update(){
    if(CheckHitKey(KEY_INPUT_G)!=0){//Gキーが押されていたら
        mSceneChanger->ChangeScene(eScene_Game);//シーンをゲーム画面に変更
    }
    if(CheckHitKey(KEY_INPUT_C)!=0){//Cキーが押されていたら
        mSceneChanger->ChangeScene(eScene_Config);//シーンを設定画面に変更
    }
}

//描画
void Menu::Draw(){
    BaseScene::Draw();//親クラスの描画メソッドを呼ぶ
    DrawString(0, 0,"メニュー画面です。",GetColor(255,255,255));
    DrawString(0,20,"Gキーを押すとゲーム画面に進みます。",GetColor(255,255,255));
    DrawString(0,40,"Cキーを押すと 設定画面に進みます。",GetColor(255,255,255));
}
画面上に一瞬LoadCircleが表示されますが直ぐに消えてしまします。

 環境  
 OS :Windows 11 Pro 22H2
 開発環境 : Microsoft Visual Studio community 2022 Version 17.3.6
 使用しているライブラリ DXライブラリ 3.24

アバター
みけCAT
記事: 6734
登録日時: 13年前
住所: 千葉県
連絡を取る:

Re: ロード画面の表示方法について

#2

投稿記事 by みけCAT » 1年前

単にロードが直ぐに終わっているということではないですか?
当該モデルを同期で読み込むには、どのくらいの時間がかかりますか?
LoadCircleが表示される時間は、モデルの同期読み込みにかかる時間と比べてどうですか?
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

猫の湯呑

Re: ロード画面の表示方法について

#3

投稿記事 by 猫の湯呑 » 1年前

同期読みの場合7.02秒
非同期読み込みの場合7.01秒
読み込みに時間がかかりました。

非同期読み込み時にLoadCircleが表示される時間はLoadCircle()内にprintfを入れて見たところ毎回実行されている様なので正確な時間は分かりませんが0.1~0.2秒ぐらいだと思います

またmain.cppを

コード:

#include "DxLib.h"
#include "SceneMgr.h"

int LoadCircle;
static int model;

void LoadScreen() {
	static double count;
	DrawRotaGraph2F(2360,900, 750, 750, 1.0, count, LoadCircle, TRUE);
	count += 0.1;
	
}

int WINAPI WinMain(HINSTANCE,HINSTANCE,LPSTR,int){
    ChangeWindowMode(TRUE), DxLib_Init(), SetDrawScreen( DX_SCREEN_BACK ); //ウィンドウモード変更と初期化と裏画面設定
    LoadCircle = LoadGraph("./Data/img/Load/LoadCircle.png");
	SetUseASyncLoadFlag(TRUE);
    SceneMgr sceneMgr;
    sceneMgr.Initialize();

    model = MV1LoadModel("model.pmx");

    while( ScreenFlip()==0 && ProcessMessage()==0 && ClearDrawScreen()==0 ){//画面更新 & メッセージ処理 & 画面消去

    if (GetASyncLoadNum() == 0) {
        sceneMgr.Update();  //更新
        sceneMgr.Draw();    //描画
    }else{
        LoadScreen();
    }
    }

    sceneMgr.Finalize();

    DxLib_End(); // DXライブラリ終了処理
    return 0;
}
のようにwhileより前でMV1LoadModelを使用しファイルを読み込むと7秒間はLoadCircleが表示され、その後7秒間ほどは何も表示されなくなります。

アバター
みけCAT
記事: 6734
登録日時: 13年前
住所: 千葉県
連絡を取る:

Re: ロード画面の表示方法について

#4

投稿記事 by みけCAT » 1年前

DXライブラリのデフォルトの画面サイズの640×480に対して
DrawRotaGraph2Fに渡している座標が大きすぎるように見えますが、
画像の内容も含めて適切な設定になっていますか?
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

猫の湯呑

Re: ロード画面の表示方法について

#5

投稿記事 by 猫の湯呑 » 1年前

ここに書き込む際に
 SetGraphMode(2560, 1440, 32, 30);
が抜け落ちていました大変申し訳ありません。

main.cpp

コード:

#include "DxLib.h"
#include "SceneMgr.h"

int LoadCircle;
static int model;

void LoadScreen() {
	static double count;
	DrawRotaGraph2F(2360,900, 750, 750, 1.0, count, LoadCircle, TRUE);
	count += 0.1;
	
}

int WINAPI WinMain(HINSTANCE,HINSTANCE,LPSTR,int){
    ChangeWindowMode(TRUE), DxLib_Init(), SetDrawScreen( DX_SCREEN_BACK ); //ウィンドウモード変更と初期化と裏画面設定
    LoadCircle = LoadGraph("./Data/img/Load/LoadCircle.png");
	SetUseASyncLoadFlag(TRUE);
	SetGraphMode(2560, 1440, 32, 30);
    SceneMgr sceneMgr;
    sceneMgr.Initialize();

    model = MV1LoadModel("model.pmx");

    while( ScreenFlip()==0 && ProcessMessage()==0 && ClearDrawScreen()==0 ){//画面更新 & メッセージ処理 & 画面消去

    if (GetASyncLoadNum() == 0) {
        sceneMgr.Update();  //更新
        sceneMgr.Draw();    //描画
    }else{
        LoadScreen();
    }
    }

    sceneMgr.Finalize();

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

返信

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