⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 water.cpp

📁 水波演示
💻 CPP
字号:
// Water.cpp : Defines the class behaviors for the application.
//

#include "stdafx.h"
#include "Water.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CWaterApp

BEGIN_MESSAGE_MAP(CWaterApp, CDirectXApp)
	//{{AFX_MSG_MAP(CWaterApp)
	ON_COMMAND(ID_APP_ABOUT, OnAppAbout)
		// NOTE - the ClassWizard will add and remove mapping macros here.
		//    DO NOT EDIT what you see in these blocks of generated code!
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CWaterApp construction

#ifdef _DEBUG
#pragma comment(lib, "DXGuideD.lib")
#else
#pragma comment(lib, "DXGuide.lib")
#endif	// _DEBUG

CWaterApp::CWaterApp(void)
{
	for (int  i = 1; i < __argc; ++ i)
	{
		LPCTSTR	pszParam = __targv[i];
		if ((pszParam[0] == _T('-') || pszParam[0] == _T('/'))
			&& ::lstrlen(pszParam) == 2)
		{
			switch (pszParam[1])
			{
			case _T('f'):
			case _T('F'):
				SetFullScreen(true);
				break;

			default:
				break;
			}
		}
	}

	SetPackFileName(_T("Media"), _T("gui.ff"));

	m_pDDDevice = NULL;
	m_pRenderSurface = NULL;

	m_pBuf1 = m_pBuf2 = NULL;
	m_pTexture = NULL;
	m_pRender = NULL;
}

bool	CWaterApp::GetDXInitSettings(void)
{
	if (m_pDirectSound != NULL)
	{
		if (m_pDirectSound->SelectDSDriver(0) == false)
			return  false;
	}
	
	if (m_pDirectMusic != NULL)
	{
		if (m_pDirectMusic->SelectDefaultDMusPort() == false)
			return  false;
	}

	if (m_pDirectDraw->SelectDDDevice(0) == false)
		return  false;

	if (m_pDirectDraw->GetFirstEnableDevice()->SelectDisplayMode(
		IsFullScreen(), 640, 480, 16) == false)
		return  false;

	return  true;

	//return  CDirectXApp::GetDXInitSettings();
}

bool	CWaterApp::InitDXObjects(void)
{
	m_pDDDevice = GetFirstDDDevice();
	m_pRenderSurface = m_pDDDevice->GetRenderSurface();
	// add your init code here !
	m_pBuf1 = new short[64000];
	m_pBuf2 = new short[64000];
	::ZeroMemory(m_pBuf1, 64000 * sizeof(short));
	::ZeroMemory(m_pBuf2, 64000 * sizeof(short));

	m_pTexture = new  CDDDIBSurface;
	m_pTexture->Create(m_pDDDevice, _T("texture.bmp"), m_pPackFileManager, CDIB::FT_BITMAP, CDDSurface::SURFACEMEM_SYSTEM);

	m_pRender = new  CDDSurface;
	m_pRender->Create(m_pDDDevice, 320, 200, CDDSurface::SURFACEMEM_AUTO);

	return  true;
}

bool	CWaterApp::DestroyDXObjects(void)
{
	// add your destroy code here !
	if (m_pRender != NULL)
	{
		delete  m_pRender;
		m_pRender = NULL;
	}

	if (m_pTexture != NULL)
	{
		delete  m_pTexture;
		m_pTexture = NULL;
	}

	if (m_pBuf1 != NULL)
	{
		delete  []m_pBuf1;
		m_pBuf1 = NULL;
	}

	if (m_pBuf2 != NULL)
	{
		delete  []m_pBuf2;
		m_pBuf2 = NULL;
	}

	m_pRenderSurface = NULL;
	m_pDDDevice = NULL;
	return  CDirectXApp::DestroyDXObjects();
}

CRect	rc1(0, 0, 640, 480);
CRect	rc2(0, 1, 320, 199);
CRect	rc3(160, 141, 480, 339);
bool	CWaterApp::UpdateFrame(void)
{
	// add your code here !
	// add source
	int	r = abs(rand()) << 1;
	r = r > 0xF9FF ? 0xF9FF : r;
	r = r < 320 ? 320 : r;
	m_pBuf1[r] = 32;

	RippleSpread();
	RenderRipple();
	m_pRenderSurface->Blt(&rc1, m_pTexture, &rc1, DDBLT_WAIT, NULL);
	m_pRenderSurface->Blt(&rc3, m_pRender, &rc2, DDBLT_WAIT, NULL);

	return  CDirectXApp::UpdateFrame();
}

/////////////////////////////////////////////////////////////////////////////
// The one and only CWaterApp object

CWaterApp theApp;

// App command to run the dialog
#include "AboutDlg.h"
void CWaterApp::OnAppAbout()
{
	CAboutDlg aboutDlg;
	aboutDlg.DoModal();
}

/////////////////////////////////////////////////////////////////////////////
// CWaterApp commands

void	CWaterApp::RippleSpread(void)
{
	for (int  i = 320; i < 64000 - 320; ++ i)
	{
		// Spread out
		m_pBuf2[i] = short(
			((m_pBuf1[i - 1]
			+ m_pBuf1[i + 1]
			+ m_pBuf1[i - 320]
			+ m_pBuf1[i + 320]) >> 1) - m_pBuf2[i]);

		// Energy damping
		m_pBuf2[i] -= (short)(m_pBuf2[i] >> 5);
	}

	// Swap m_pBuf1 and m_pBuf2
	short*	ptmp = m_pBuf1;
	m_pBuf1 = m_pBuf2;
	m_pBuf2 = ptmp;
}

void CWaterApp::RenderRipple(void)
{
	DDSURFACEDESC2	ddsd;
	ddsd.dwSize = sizeof (DDSURFACEDESC2);
	m_pTexture->Lock(&ddsd);

	DDSURFACEDESC2	ddsd1;
	ddsd1.dwSize = sizeof(DDSURFACEDESC2);
	m_pRender->Lock(&ddsd1);

	int	k = 320;
	for (int  i = 1; i < 199; ++ i)
	{
		for (int  j = 0; j < 320; ++ j)
		{
			// do refraction
			int	xoff = m_pBuf1[k - 1] - m_pBuf1[k + 1];
			int	yoff = m_pBuf1[k - 320] - m_pBuf1[k + 320];
			DWORD	dwPixel = m_pTexture->GetPixel(&ddsd, 160 + j + xoff, 140 + i + yoff);

			// do shading
			int	p = dwPixel & 0x1F;
			p += xoff;
			if (p > 31)
				p = 31;
			if (p < 0)
				p = 0;
			dwPixel = (dwPixel & 0xFFFFFFE0) | p;

			m_pRender->PutPixel(&ddsd1, j, i, dwPixel);
			k ++;
		}
	}

	m_pTexture->Unlock();
	m_pRender->Unlock();
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -