Posts Tagged ‘ DirectX

CEGUI,OIS和DirectX的結合

這裡所說的OIS是指Object-Oriented Input System,一個可以跨平台的開源輸入系統。

網路上面搜索OIS的使用教程,基本都是和Ogre引擎結合的,而Aquilae 2是使DirectX 10的,所以在這裡直接寫個OIS以及CEGUI在DirectX環境下面的使用.

首先來看OIS:

先來這裡下載:http://sourceforge.net/projects/wgois/ 然後編譯成一個lib.

在自己的project裡面include”OIS.h”即可,然後在鏈接到那個編譯好的lib.

這裡木有包含遊戲桿的設備初始化,只有鍵盤和鼠標:

OIS::InputManager        *m_pInputManager;      //OIS輸入管理員
OIS::Mouse                *m_pMouse;              //OIS輸入鼠標器
OIS::Keyboard            *m_pKeyboard;          //OIS輸入鍵盤

InputManager對象是必須的,她負責整個輸入系統下面的運作。

接著再進行OIS的創建和初始化:

m_pInputManager = OIS::InputManager::createInputSystem((size_t)m_Hwnd);
m_pKeyboard = static_cast(m_pInputManager->createInputObject( OIS::OISKeyboard, true ));
m_pMouse = static_cast(m_pInputManager->createInputObject( OIS::OISMouse, true));

其中,m_Hwnd是窗口的句柄。createInputObject( OIS::OISMouse, true)這裡面參數true的意思是使用緩衝模式,如果你想使用監聽器來監聽輸入設備,那麼這裡的true參數是必須的。

下面我們開始說輸入設備的監聽器:

這裡的監聽器同時負責鼠標和鍵盤的監聽,所以得繼承來自兩個類:

class InputDeviceListener
	:public OIS::MouseListener,public OIS::KeyListener
{
public:
	//----------------------------------------------------------------------------------
	//構造函式
	//----------------------------------------------------------------------------------
	InputDeviceListener();
	//----------------------------------------------------------------------------------
	//析構函式
	//----------------------------------------------------------------------------------
	~InputDeviceListener();
public:
	//----------------------------------------------------------------------------------
	//鼠標按下
	//----------------------------------------------------------------------------------
	bool mousePressed(const OIS::MouseEvent &evt, OIS::MouseButtonID id);
	//----------------------------------------------------------------------------------
	//鼠標釋放
	//----------------------------------------------------------------------------------
	bool mouseReleased(const OIS::MouseEvent &evt, OIS::MouseButtonID id);
	//----------------------------------------------------------------------------------
	//鼠標移動
	//----------------------------------------------------------------------------------
	bool mouseMoved(const OIS::MouseEvent &evt);
	//----------------------------------------------------------------------------------
	//鍵盤按下
	//----------------------------------------------------------------------------------
	bool keyReleased(const OIS::KeyEvent &evt );
	//----------------------------------------------------------------------------------
	//鍵盤按下
	//----------------------------------------------------------------------------------
	bool keyPressed(const OIS::KeyEvent &evt );
};

Read more

Aquilae 2 啟動

Aquilae Demo再次嘗試了,在Aquilae 2裡面講不會再使用Ogre引擎,而改稱了DirectX 10,畢竟也只是想練手用,好給自己打磨一下圖形基礎.

UI部分將可能不再使用CEGUI,有可能改稱MyGUI.

物理引擎部分將會繼續使用PhysX,現在PhysX 3也出來了,變化和PhysX 2蠻大的,Aquilae使用PhysX 2還是PhysX 3還在考慮之中.

目前正在搭建框架ing…

敬請期待.

Aquilae:添加了播放MP3音频类CMP3Player

搁置多天的Aquilae终于又开始向前了,今天添加了一个MP3音频播放的,用于播放MP3音频,这个是用DirectShow做的,CMP3Player类.

这个类还是直接从别人那里拷贝来的,因为我没有看过DirectShow.

在编译这个代码的时候,我发现在DirectX SDK里面并没有找到Dshow.h这个头档,与网上说的去DirectX SDK里面找dshow.h档不合.

后来发现其实在最新版本的Windows SDK里面就自带Dshow.h这个头档.

说说这个CMP3Player类吧,非常容易使用.

class CMP3Player
{
public:
	void stop();
	void play();
	void init(char * fileName);
	CMP3Player();
	virtual ~CMP3Player();

private:
	IGraphBuilder*     pGBuilder;     // 媒体播放设备对象
	IMediaControl*     pMControl;     // 负责媒体的播放控制对象
	IMediaPosition*    pMPos;         // 负责媒体的播放位置设定

};

Init就是初始化,载入音频,Play播放,stop停止.

就是这么简单.

Aquilae:糟透了

突然觉得Aquilae的代码写的糟透了,到现在也不清楚具体Aquilae能做成什么样子.

一个游戏的工作量很大,一个人承担要很多努力.

加油吧!

Aquilae:完成第一个PhysX类立方体堆

终于,尽管对PhysX还有非常非常多的不熟悉,但是现在终于还是写出了第一个PhysX类.

这个类的作用是创建一个立方体堆,然后可以在碰撞的时候用上演示.

发泄一下今天怎么这网路环境打开米国的网站是如此的慢哇~

#pragma once

#include "includes.h"

#define BOX_CLASS_L 5.0  //立方体堆的长度
#define BOX_CLASS_H 10.0   //立方体堆的高度
#define BOX_CLASS_W 5.0  //立方体堆的宽度
#define BOX_CLASS_NUM 180  //一个立方体堆所包含的立方体数目
#define BOX_SIZE pow((BOX_CLASS_H*BOX_CLASS_L*BOX_CLASS_W)/BOX_CLASS_NUM,1.0/3.0)  //小立方体边长

class NvPhysX
{
public:
	void Init(LPDIRECT3DDEVICE9 device,const NxVec3 &pos);  //初始化
	void RenderActor();  //渲染函式
	void CreateBoxClass(const NxVec3 &pos);  //创建一个立方体堆
	bool CalculateBoxSite(const NxVec3 &pos);  //计算各个立方体坐标点
	NxActor* CreateBox(const NxVec3 &pos);
	void Quit();  //退出
public:
	NxPhysicsSDK   *gPhysicsSDK; //PhysX SDK实例对象
	NxScene   *gScene;  //场景对象
	NxSceneDesc sceneDesc; //场景表述表对象
	NxActor *Box_Class[BOX_CLASS_NUM];
	ID3DXMesh *BoxMesh;
	NxVec3 boxSite[BOX_CLASS_NUM];
	float boxsize;  //每个立方体的大小
};

Read more

Aquilae:用PhysX做方块堆

蒽,方块堆,就是一堆立方体的,好累了现在,直接先贴代码吧,还有一些小问题.

我想睡觉了,晚安.

void NvPhysX::CreateBoxClass(const NxVec3 &pos)
{
 for (int i=0;i<BOX_CLASS_NUM;i++)
 {
 Box_Class[i]=CreateBox(NxVec3(0.0f, (i * 3) + 5.0f, 0.0f));
 }
}

NxActor* NvPhysX::CreateBox(const NxVec3 &pos)
{
 // Set the box starting height to 3.5m so box starts off falling onto the ground
 NxReal boxStartHeight = 3.5; 

 // Add a single-shape actor to the scene
 NxActorDesc actorDesc;
 NxBodyDesc bodyDesc;

 // The actor has one shape, a box, 1m on a side
 NxBoxShapeDesc boxDesc;
 boxDesc.dimensions.set(0.5,0.5,0.5);
 boxDesc.localPose.t =NxVec3(0, 0, 0);  //初始位置
 actorDesc.shapes.pushBack(&boxDesc);

 actorDesc.body            = &bodyDesc;
 actorDesc.density        = 10.0f;
 actorDesc.globalPose.t    = pos;
 assert(actorDesc.isValid());
 NxActor *pActor = gScene->createActor(actorDesc);    
 assert(pActor);

 return pActor;
}

return top