スライドショーを作りたい

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

スライドショーを作りたい

#1

投稿記事 by 残念 » 5年前

残念と申します。
スライドショーを作りたく、dxライブラリを使用し、2つの画像の透明度を片方は徐々に上げ、
もう一方を徐々に下げる、といったコードを自分なりに書いたところ、

コード:

#include "DxLib.h"
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
	
	ChangeWindowMode(TRUE);
	SetWindowStyleMode(3);
	SetWindowSizeChangeEnableFlag(TRUE);
	SetAlwaysRunFlag(TRUE);
	if (DxLib_Init() == -1)		// DXライブラリ初期化処理
	{
		return -1;			// エラーが起きたら直ちに終了
	}

	SetDrawScreen(DX_SCREEN_BACK);
	int t = GetNowCount();
	int i = 0,j,k=0;
	int h[100];
	char name[6] = "0.jpg";

	while (LoadGraph(name) !=-1){
		h[i] = LoadGraph(name);
		sprintf(name, "%d.jpg", i + 1);
		i++;
	}
	j = i;
	i = 0;
	while (ProcessMessage() == 0 && CheckHitKey(KEY_INPUT_ESCAPE) == 0){
		
		if ((GetNowCount() - t) / 500 < 9){
		DrawExtendGraph(0, 0, 640 - 1, 480 -1, h[i], TRUE);
		DrawFormatString(0, 0, GetColor(255, 2, 255), "%d  %d", i, (GetNowCount() - t));
		ScreenFlip();
	}
		
		else{
			if (i >= j - 1){
				i = 0;
				for (k = 0; k < 256; k = k + 3){
					SetDrawBlendMode(DX_BLENDMODE_ALPHA, k);
					DrawExtendGraph(0, 0, 640 - 1, 480 - 1, h[0], TRUE);
					SetDrawBlendMode(DX_BLENDMODE_ALPHA, 255 - k);
					DrawExtendGraph(0, 0, 640 - 1, 480 - 1, h[j-1], TRUE);
					DrawFormatString(0, 0, GetColor(255, 2, 255), "%d",k);
					ScreenFlip();
				}k = 0;
				
			}
			else
			{
				i++;
				for (k = 0; k < 256; k = k + 3){
					SetDrawBlendMode(DX_BLENDMODE_ALPHA, k);
					DrawExtendGraph(0, 0, 640 - 1, 480 - 1, h[i], TRUE);
					SetDrawBlendMode(DX_BLENDMODE_ALPHA, 255 - k);
					DrawExtendGraph(0, 0, 640 - 1, 480 - 1, h[i - 1], TRUE);
					DrawFormatString(0, 0, GetColor(255, 2, 255), "%d", k);
					ScreenFlip();
				}
				k = 0;
				
			}


			SetDrawBlendMode(DX_BLENDMODE_NOBLEND, 0);
			DrawBox(0, 0, 640, 480, GetColor(0, 0, 0),TRUE);
			t = GetNowCount();

		}
		
		
	}

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

	return 0;				// ソフトの終了 
}
実行時、画像の黒い部分がすぐに他の画像の色になる、といいますか
均一な透明度にならなかったところがありました。

解決策があったら教えて下さい。

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

Re: スライドショーを作りたい

#2

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

残念 さんが書きました:実行時、画像の黒い部分がすぐに他の画像の色になる、といいますか
均一な透明度にならなかったところがありました。

解決策があったら教えて下さい。
画像の黒い部分、ですね。
とりあえず、DrawExtendGraphの第6引数を全てFALSEにしてみてください。
オフトピック
hはせっかく100要素あるのに、nameの要素数が足りないので、0.jpg~9.jpgが揃っていると範囲外アクセスが起こりそうですね。
また、同じ画像を2回読み込んでいるのも若干気になります。
ScreenFlipが大量にある件は…今回はまあいっか。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

残念
記事: 36
登録日時: 5年前

Re: スライドショーを作りたい

#3

投稿記事 by 残念 » 5年前

みけCATさん、毎回ご指摘ありがとうございます。
問題点が直りました。ありがとうございました
コードはこちらです。
(私の力量不足で、「画像を2回読み込んでいる」部分しか修正できませんでした)

コード:

#include "DxLib.h"




int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
	
	ChangeWindowMode(TRUE);
	SetWindowStyleMode(2);
	SetWindowSizeChangeEnableFlag(TRUE);
	SetAlwaysRunFlag(TRUE);
	if (DxLib_Init() == -1)		// DXライブラリ初期化処理
	{
		return -1;			// エラーが起きたら直ちに終了
	}
	
	SetWindowLongPtr(GetMainWindowHandle(), GWLP_WNDPROC, (LONG_PTR)WndProc);
	SetDrawScreen(DX_SCREEN_BACK);
	int t = GetNowCount();
	int i = 0,j,k=0;
	int h[100];
	char name[6] = "0.jpg";

	while ((h[i] = LoadGraph(name)) != -1){
		
		sprintf(name, "%d.jpg", i + 1);
		i++;
	}
	j = i;
	i = 0;
	while (ProcessMessage() == 0 && CheckHitKey(KEY_INPUT_ESCAPE) == 0){
		
		if ((GetNowCount() - t) / 500 < 9){
			DrawExtendGraph(0, 0, 640 - 1, 480 - 1, h[i], FALSE);
		DrawFormatString(0, 0, GetColor(255, 2, 255), "%d  %d", i, (GetNowCount() - t));
		ScreenFlip();
	}
		
		else{
			if (i >= j - 1){
				i = 0;
				for (k = 0; k < 256; k = k + 3){
					SetDrawBlendMode(DX_BLENDMODE_ALPHA, k);
					DrawExtendGraph(0, 0, 640 - 1, 480 - 1, h[0], FALSE);
					SetDrawBlendMode(DX_BLENDMODE_ALPHA, 255 - k);
					DrawExtendGraph(0, 0, 640 - 1, 480 - 1, h[j - 1], FALSE);
					DrawFormatString(0, 0, GetColor(255, 2, 255), "%d",k);
					ScreenFlip();
				}k = 0;
				
			}
			else
			{
				i++;
				for (k = 0; k < 256; k = k + 3){
					SetDrawBlendMode(DX_BLENDMODE_ALPHA, k);
					DrawExtendGraph(0, 0, 640 - 1, 480 - 1, h[i], FALSE);
					SetDrawBlendMode(DX_BLENDMODE_ALPHA, 255 - k);
					DrawExtendGraph(0, 0, 640 - 1, 480 - 1, h[i - 1], FALSE);
					DrawFormatString(0, 0, GetColor(255, 2, 255), "%d", k);
					ScreenFlip();
				}
				k = 0;
				
			}


			SetDrawBlendMode(DX_BLENDMODE_NOBLEND, 0);
			DrawBox(0, 0, 640, 480, GetColor(0, 0, 0),TRUE);
			t = GetNowCount();

		}
		
		
	}

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

	return 0;				// ソフトの終了 
}
一旦こうなってます。

そして、もう一つ質問をさせて頂きます。
範囲外アクセス防止の方法についてです。
・無理やり余ったものは空のグラフィックハンドルにする
・そもそも、配列の数を読み込ん分だけにする(可変長配列、でしたっけ…恥ずかしいことに
 今まで調べようとしたことがなくって…)
のどちらにすべきでしょうか?(もっといいやり方があれば、できれば教えてください)

>ScreenFlipが大量にある件
…。どうしよう。

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

Re: スライドショーを作りたい

#4

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

残念 さんが書きました:そして、もう一つ質問をさせて頂きます。
範囲外アクセス防止の方法についてです。
・無理やり余ったものは空のグラフィックハンドルにする
・そもそも、配列の数を読み込ん分だけにする(可変長配列、でしたっけ…恥ずかしいことに
 今まで調べようとしたことがなくって…)
のどちらにすべきでしょうか?(もっといいやり方があれば、できれば教えてください)
まず、nameの領域を十分(16~32バイトくらい)確保してください。
そして、hに関しては、
・std::vectorを用い、必要な分の領域を確保する
・リンクリスト(線形リスト)を用い、必要な分の領域を確保する
・あらかじめ確保した領域の数の画像を読み込んだら強制的に読み込みを打ち切る
のどれかがいいでしょう。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

残念
記事: 36
登録日時: 5年前

Re: スライドショーを作りたい

#5

投稿記事 by 残念 » 5年前

みけCATさん、ご回答有難うございました。(返答が遅れて申し訳ありませんでした)
「std::vector」の存在を初めて知りました(笑えない)。
調べてぼちぼち使えるように精進していきます。

閉鎖

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