東方の背景画像

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

東方の背景画像

#1

投稿記事 by とんとん » 3年前

タイトルが合っていない気もしますがこれしか文が考え付きませんでした。

東方風神録の東風谷早苗のスペル背景、朝顔みたいな柄が色が赤や緑や色々に変化するのですが、
どうやったらそのように出来るのでしょうか。
自分は何枚か違う色の画像を用意してそれぞれの透明度をDXライブラリのブレンドモードのALPHAで変化させて
それっぽくしているのですが、完全不透明でなくなる時間が少なからず出来てしまいます。
そうならずに色を変化させる方法はないのでしょうか。

下手な文章ですみません。よろしくおねがいします。

アバター
夢幻ノ月夜
記事: 133
登録日時: 4年前
住所: Stens;Gate世界線

Re: 東方の背景画像

#2

投稿記事 by 夢幻ノ月夜 » 3年前

とんとん さんが書きました:タイトルが合っていない気もしますがこれしか文が考え付きませんでした。

東方風神録の東風谷早苗のスペル背景、朝顔みたいな柄が色が赤や緑や色々に変化するのですが、
どうやったらそのように出来るのでしょうか。
自分は何枚か違う色の画像を用意してそれぞれの透明度をDXライブラリのブレンドモードのALPHAで変化させて
それっぽくしているのですが、完全不透明でなくなる時間が少なからず出来てしまいます。
そうならずに色を変化させる方法はないのでしょうか。

下手な文章ですみません。よろしくおねがいします。
SetDrawBright関数を使ったらそれっぽくならないでしょうかね?
毎回ゲーム作ろうとするたびに壁にぶち当たる

アバター
Hiragi(GKUTH)
記事: 167
登録日時: 9年前
住所: 大阪府
連絡を取る:

Re: 東方の背景画像

#3

投稿記事 by Hiragi(GKUTH) » 3年前

各ピクセルの要素を変えるのであればピクセルシェーダなどを使用することが多いのかなーと思います。
そんなに拘らないのであれば、GraphFilter関数を使用し、最初から用意されているシェーダを利用する手もあります。

http://dxlib.o.oo7.jp/function/dxfunc_graph1.html#R3N26
だいがくせい!

アバター
Hiragi(GKUTH)
記事: 167
登録日時: 9年前
住所: 大阪府
連絡を取る:

Re: 東方の背景画像

#4

投稿記事 by Hiragi(GKUTH) » 3年前

動画を見ても良くわからなかったのでこういうのでいいのか分からないのですが

コード:

#include "DxLib.h"


int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
{
	ChangeWindowMode(TRUE), DxLib_Init(), SetDrawScreen(DX_SCREEN_BACK);

	int gr;
	int i = 0;
	gr = LoadGraph("test.png");
	while (ProcessMessage() == 0)
	{
		i++;
		if(i == 360) i = 0;

		GraphFilter(gr,DX_GRAPH_FILTER_HSB,1,i,0,0);	//フィルタセット

		SetDrawBlendMode(DX_BLENDMODE_ALPHA,128);		//ブレンドモードセット
		DrawGraph(0,0,gr,true);
		SetDrawBlendMode(DX_BLENDMODE_NOBLEND,0);		//戻す

		ScreenFlip();
		ClearDrawScreen();
	}
	
	DxLib_End();
	return 0;
}

こういう感じを目指しているのでしょうか?
間違っていたらすいません。
添付ファイル
test.png
test.png (85.74 KiB) 閲覧数: 746 回
だいがくせい!

アバター
Hiragi(GKUTH)
記事: 167
登録日時: 9年前
住所: 大阪府
連絡を取る:

Re: 東方の背景画像

#5

投稿記事 by Hiragi(GKUTH) » 3年前

ちゃんと見てきましたので、それっぽく再現してみました。
今回は減算ブレンドを使用していますが、別のブレンドモードをいろいろ試してみるのも良いかもしれません。

コード:

#include "DxLib.h"

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
	ChangeWindowMode(true);
	if (DxLib_Init() != 0) return -1;
	SetDrawScreen(DX_SCREEN_BACK);

	int back = LoadGraph("back00.png");
	int gr = LoadGraph("test.png");
	int cnt = 0;

	while (ProcessMessage() == 0 && ScreenFlip() == 0 && ClearDrawScreen() == 0)
	{
		cnt++;

		//色相フィルターをかける
		GraphFilter(gr, DX_GRAPH_FILTER_HSB, 0, 2, 0, 0);

		DrawGraph(0,0,back,true);

		//減算ブレンドさせる
		SetDrawBlendMode(DX_BLENDMODE_SUB, 128);
		//繰り返し描画させる
		for (int i = 0; i < 16;i++)
			for (int k = 0; k < 16;k++)
				DrawGraph(i * 256, k * 256 - (cnt % 256), gr, true);
		SetDrawBlendMode(DX_BLENDMODE_NOBLEND, 0);
	}


	DxLib_End();
	return 0;
}
添付ファイル
test.png
あさがおっぽいの
test.png (51.41 KiB) 閲覧数: 609 回
back00.png
龍神録の背景
だいがくせい!

とんとん
記事: 33
登録日時: 4年前
連絡を取る:

Re: 東方の背景画像

#6

投稿記事 by とんとん » 3年前

夢幻ノ月夜さん、Hiragi(GKUTH)さんから教えていただいた方法、どちらもいい感じに動きました。
今回は単純なコードで済みそうなので夢幻ノ月夜さんから教えていただいた方を使ってみます。

ありがとうございました。

閉鎖

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