当前位置: 首页 > 工具软件 > Irrlicht > 使用案例 >

Irrlicht例程05:创造一个有声世界(下)

糜鸿风
2023-12-01

这是“创造一个有声世界(上)”的后续部分。

将例程02(点击这里跳转)与例程04(点击这里跳转)组合在一起就是本文的全部代码:

#include <Windows.h>
#include <irrlicht.h>
#include <irrKlang.h>
using namespace irr;
using namespace core;
using namespace video;
using namespace scene;
using namespace irrklang;

#pragma comment(lib,"irrlicht.lib")
#pragma comment(lib,"irrKlang.lib")

HWND InitMainWindow(HINSTANCE hInst);
void IrrlichtMusiLang(const char* pszFileName);

INT APIENTRY WinMain(
	HINSTANCE hInstance,
	HINSTANCE hPrevInstance, 
	LPSTR lpCmdLine, 
	int nCmdShow)
{
	//创建并初始化主窗口
	HWND hWnd = InitMainWindow(hInstance); 
	ShowWindow(hWnd, SW_HIDE); //隐藏主窗口
	SetCursor(NULL); //影藏光标
	UpdateWindow(hWnd);

	try
	{
		IrrlichtMusiLang("Assets/IWaitSilently.mp3");
	}
	catch (PSTR except)
	{
		MessageBox(hWnd, except, TEXT("Exception"), MB_OK);
	}

	DestroyWindow(hWnd);
	return 0;
}

HWND InitMainWindow(HINSTANCE hInst)
{
	LPCSTR pszWin = "HidenMainWindow";
	LPCSTR pszClx = "MainWindowClass";

	WNDCLASS wndClx;
	wndClx.hInstance = hInst;
	wndClx.lpszClassName = pszClx;
	wndClx.lpfnWndProc = DefWindowProc; // 默认消息处理回调函数

	RegisterClass(&wndClx);

	return CreateWindow(pszClx, pszWin, WS_POPUP, 0, 0, 100, 100, NULL, NULL, hInst, NULL);
}

void IrrlichtMusiLang(const char* pszFileName)
{
	IrrlichtDevice* device = createDevice(EDT_DIRECT3D9, dimension2d<u32>(800, 600), 32U);
	if (device == NULL) throw("Failed to create device!!");

	
	// Play Music
	ISoundEngine* engine = createIrrKlangDevice();
	if (engine == NULL) throw ("An error ocurred in \'createIrrKlangDevice\'");
	ISound* music = engine->play2D(pszFileName, true, false, true, ESM_AUTO_DETECT, true);
	if (music == NULL) throw ("An error ocurred in \'play2DMusic\'");
	ISoundEffectControl* fx = fx = music->getSoundEffectControl();
	if (fx == NULL) throw("This device or sound does not support sound effects.");
	fx->enableWavesReverbSoundEffect();
	// Play Music
	

	device->setWindowCaption(L"MuisLang");
	IVideoDriver* driver = device->getVideoDriver();
	ITimer* timer = device->getTimer();
	f32 bg_r = 255.0f;
	f32 bg_g = 0.0f;
	f32 bg_b = 255.0f;
	bool fadeOut = true;
	int lastFPS = -1;
	u32 then = timer->getTime();
	const f32 fadeRate = 0.05f;

	while (device->run())
	{
		const u32 now = timer->getTime();
		const f32 frameDeltaTime = (f32)(now - then);
		then = now;
		if (bg_r <= 0.0f) fadeOut = false;
		else if (bg_r >= 255.0f) fadeOut = true;

		if (fadeOut)
		{
			bg_r -= fadeRate * frameDeltaTime;
			bg_g += fadeRate * frameDeltaTime;
			bg_b -= fadeRate * frameDeltaTime;
		}
		else
		{
			bg_r += fadeRate * frameDeltaTime;
			bg_g -= fadeRate * frameDeltaTime;
			bg_b += fadeRate * frameDeltaTime;
		}

		driver->beginScene(true, true, SColor(255, (u32)bg_r, (u32)bg_g, (u32)bg_b));

		driver->endScene();
	}

	music->drop(); // 释放资源
	engine->drop(); // 撤出引擎
	device->drop();
}

这样组合起来,是不是很容易呢?

如果你第一眼看到“鬼火(irrlicht)的复燃”这篇文章里的示例觉得太过复杂,那么从例程01到例程05走过来,然后

综合一下,是不是感觉思路更明晰了呢?

C++程序设计的魅力之一就是模块化,当一个复杂(而庞大)的系统摆在我们眼前,我们也许不知所以,但是

如果现在有一位庖丁(也就是所谓的“教程”)为你解牛,通过循序渐进的学习,你就会慢慢琢磨透这个复杂

系统的大致结构。

学习这写内容是一个漫长的过程,不可能一蹴而就。


=========================================

(以下废话不看也罢)

有时候我们回听说某某人通过研究某某大型系统的源码终于“大彻大悟,飞升成仙”,其实那些都是需要基础的。

就如同练功一样,首先都要学习入门心法,甚至要从打坐这样的繁缛做起。你可以跳过这些步骤(也不是不可以)

而直接从上层开始,但是这样你的知识建筑基础不牢固漏洞太多很容易被一些小问题缠住。

现在智能化发展迅速,RAD(Rapid App Dev快速应用开发)等等模式被广泛使用,许多基础原理渐渐淡出我们的视线,只有那些沉得住气的人才会耐心钻研,从基础做起。你会是这样的人吗?

至于我,我只是一个做事浅尝辄止的二货罢了,很多东西知其然却不知其所以然。汗

========================================================

点此领取楼主

http://blog.csdn.net/fengyhack/article/details/38305019

转载于:https://www.cnblogs.com/fengyhack/p/10603733.html

 类似资料: