構成
ブラー処理させよう
参考ページ
https://dixq.net/forum/viewtopic.php?t=3768
させました。ドン!(構造体にした以外参考ページのまんま)
#pragma once
#ifndef _BLURSCREEN_HPP
#define _BLURSCREEN_HPP
#include "DxLib.h"
struct BlurScreen
{
private:
int m_screen[2];
int m_current;
int m_alpha;
int m_screenWidth, m_screenHeight;
int m_offsetX1, m_offsetX2, m_offsetY1, offsetY2;
int m_notBlendDraw;
public:
BlurScreen()
{
m_screen[0] = 0;
m_screen[1] = 0;
m_current = 0;
m_alpha = 0;
m_screenWidth = 0;
m_screenHeight = 0;
m_offsetX1 = 0;
m_offsetX2 = 0;
m_offsetY1 = 0;
offsetY2 = 0;
m_notBlendDraw = 0;
}
~BlurScreen() {}
void Init(int alpha, int offsetX1, int offsetY1, int offsetX2, int offsetY2);
void ReplayInit();
void Release();
void PreRenderBlurScreen();
void PostRenderBlurScreen();
};
#endif // !_BLURSCREEN_HPP
#include "BlurScreen.hpp"
/// ------------------------------------------------------------------------------------------------------------
void BlurScreen::Init(int t_alpha, int t_offsetX1, int t_offsetY1, int t_offsetX2, int t_offsetY2)
{
m_screenWidth = 1920;
m_screenHeight = 1080;
for (int i = 0; i < 2; ++i)
{
m_screen[i] = -1;
m_screen[i] = MakeScreen(m_screenWidth, m_screenHeight);
}
m_current = 0;
m_alpha = t_alpha;
m_offsetX1 = t_offsetX1;
m_offsetX2 = t_offsetX2;
m_offsetY1 = t_offsetY1;
offsetY2 = t_offsetY2;
m_notBlendDraw = 0;
}
/// ------------------------------------------------------------------------------------------------------------
void BlurScreen::ReplayInit()
{
for (int i = 0; i < 2; ++i)
{
if (m_screen[i] != -1) DeleteGraph(m_screen[i]);
m_screen[i] = MakeScreen(m_screenWidth, m_screenHeight);
}
m_current = 0;
m_notBlendDraw = 0;
}
/// ------------------------------------------------------------------------------------------------------------
void BlurScreen::Release()
{
for (int i = 0; i < 2; ++i)
{
if (m_screen[i] != -1) DeleteGraph(m_screen[i]);
}
}
/// ------------------------------------------------------------------------------------------------------------
void BlurScreen::PreRenderBlurScreen()
{
SetDrawScreen(m_screen[m_current]);
ClearDrawScreen();
}
/// ------------------------------------------------------------------------------------------------------------
void BlurScreen::PostRenderBlurScreen()
{
int drawMode = GetDrawMode();
SetDrawMode(DX_DRAWMODE_BILINEAR);
int blendMode, param;
GetDrawBlendMode(&blendMode, ¶m);
SetDrawBlendMode(DX_BLENDMODE_ALPHA, m_alpha);
if (m_notBlendDraw++ > 2)
{
DrawExtendGraph(m_offsetX1, m_offsetY1, m_screenWidth + m_offsetX2, m_screenHeight + offsetY2, m_screen[1 - m_current], false);
}
SetDrawBlendMode(blendMode, param);
SetDrawMode(drawMode);
SetDrawScreen(DX_SCREEN_BACK);
DrawGraph(0, 0, m_screen[m_current], false);
m_current = 1 - m_current;
}
ReplayInit()がある理由としては、開始時に初期化が必要だったため。
あとは行うところで描画の最前にPreRenderBlurScreen()を読んで最後にPostRenderBlurScreen()を呼ぶだけ。