這是設(shè)計(jì)的蓋莫游戲引擎2.1.2的demo例子小試
interface設(shè)計(jì)如下:
以后還會(huì)修改之
///////////////////////////////////////////////////////////
/// 定義渲染到紋理對(duì)象
///////////////////////////////////////////////////////////
class G_DLL_API RenderToTexture : public Renderable
{
public:
////////////////////////////////////////////////////////
//! 構(gòu)造,析構(gòu)渲染到紋理
////////////////////////////////////////////////////////
RenderToTexture();
virtual ~RenderToTexture();
public:
////////////////////////////////////////////////////////
//! 設(shè)置渲染回調(diào)函數(shù)
////////////////////////////////////////////////////////
virtual void SetRenderCallBack(RenderCallBack rendertexture) = 0;
////////////////////////////////////////////////////////
//! 設(shè)置渲染到紋理參數(shù)
////////////////////////////////////////////////////////
virtual void SetPara(float fov,float near,float far) = 0;
////////////////////////////////////////////////////////
//! 設(shè)置紋理清屏色,fbo色
////////////////////////////////////////////////////////
virtual void SetClearColor(const Color& color) = 0;
virtual void SetFboColor(const Color& color) = 0;
DECLARE_OBJECT(RenderToTexture)
};
}
#endif
//! ccsdu2004
測(cè)試代碼如下:
#include <GEngine/Gaimo.hpp>
using namespace std;
using namespace core;
RefPtr<Texture> boxtexture = NULL;
RefPtr<Camera> camera = NULL;
//! 獲取引擎視頻驅(qū)動(dòng)器
RefPtr<VideoDriver> videodriver = NULL;
//! 立方體繪制
void _RenderCube_(float color[6][4]);
float color[6][4];
float yaw_angle = 0.0f;
float pitch_angle = 0.0f;
void InitClearColor()
{
for(int i = 0; i < 6; i++)
for(int j = 0; j < 4; j++)
color[i][j] = 0.8f;
color[0][0] = 0.5f;
color[1][1] = 0.5f;
color[2][2] = 0.5f;
color[3][0] = 0.5f;
color[3][1] = 0.5f;
color[4][1] = 0.5f;
color[4][2] = 0.5f;
color[5][0] = 0.5f;
}
void G_CALL draw()
{
videodriver->SetPilotView(0.0f,0.0f,5.0f,-55.0f,-pitch_angle,-yaw_angle);
_RenderCube_(color);
}
int main(int argc, char **argv)
{
//! 初始化引擎設(shè)備并得到設(shè)備指針
RefPtr<Device> device = core::InitDevice("渲染到紋理");
//! 得到引擎場(chǎng)景指針
RefPtr<SceneManager> scenemanager = device->GetSceneManager();
//! 得到引擎資源指針
RefPtr<ResourceManager> resourcemanager = device->GetResourceManager();
//! 獲取引擎紋理管理器指針
RefPtr<TextureManager> texturemanager = resourcemanager->GetTextureManager();
//! 獲取光管理器指針
RefPtr<LightManager> lightmanager = resourcemanager->GetLightManager();
//! 獲取引擎圖形管理器
RefPtr<ImageManager> imagemanager = resourcemanager->GetImageManager();
//! 獲取引擎視頻驅(qū)動(dòng)器
videodriver = device->GetVideoDriver();
glEnable(GL_TEXTURE_2D);
//! 啟用環(huán)境光
lightmanager->RenderGlobalAmbient(false);
//! 啟用光源
lightmanager->EnableLight();
//! 獲取光指針
RefPtr<Light> light = lightmanager->CreateObject("rttlight","..\\script//rtt.lua","light");
//! 獲取全局?jǐn)z像機(jī),設(shè)置攝像機(jī)參數(shù)
camera = scenemanager->GetActiveCamera();
camera->SetPosition(Vector3f(0,0,18));
camera->SetView(Vector3f(0,0,0));
camera->SetDirection(Vector3f(0,1,0));
camera->SetViewPort(Recti(0,0,640,480));
camera->SetPerspective(50.0f,640.0f/480.0f,1.0f,100.0f);
InitClearColor();
RefPtr<RenderToTexture> rtt = device->GetRenderer()->GetRenderToTexture(&draw);
rtt->SetClearColor(Color(0.2f,0.2f,0.7f,0.5f));
rtt->SetFboColor(Color(1.0f,0.9f,0.7f,0.6f));
light->Render();
BEGIN_LOOP(device)
//camera->Render();
yaw_angle += 0.3f;
pitch_angle += 0.21f;
rtt->Render();
END_LOOP(device)
//delete fbo;
return 0;
}
//! 立方體繪制
void _RenderCube_(float color[6][4])
{
//! draw cube
glEnable(GL_COLOR_MATERIAL);
glColor4fv(color[0]);
glBegin(GL_TRIANGLE_STRIP);
glNormal3f(0.0f, 0.0f, -1.0f);
glTexCoord2f(0.0f, 0.0f);
glVertex3f(-1.0f, -1.0f, -1.0f);
glTexCoord2f(1.0f, 0.0f);
glVertex3f(1.0f, -1.0f, -1.0f);
glTexCoord2f(0.0f, 1.0f);
glVertex3f(-1.0f, 1.0f, -1.0f);
glTexCoord2f(1.0f, 1.0f);
glVertex3f(1.0f, 1.0f, -1.0f);
glEnd();
glColor4fv(color[1]);
glBegin(GL_TRIANGLE_STRIP);
glNormal3f(1.0f, 0.0f, 0.0f);
glTexCoord2f(0.0f, 0.0f);
glVertex3f(1.0f, -1.0f, -1.0f);
glTexCoord2f(1.0f, 0.0f);
glVertex3f(1.0f, -1.0f, 1.0f);
glTexCoord2f(0.0f, 1.0f);
glVertex3f(1.0f, 1.0f, -1.0f);
glTexCoord2f(1.0f, 1.0f);
glVertex3f(1.0f, 1.0f, 1.0f);
glEnd();
glColor4fv(color[2]);
glBegin(GL_TRIANGLE_STRIP);
glNormal3f(0.0f, 0.0f, 1.0f);
glTexCoord2f(0.0f, 0.0f);
glVertex3f(1.0f, -1.0f, 1.0f);
glTexCoord2f(1.0f, 0.0f);
glVertex3f(-1.0f, -1.0f, 1.0f);
glTexCoord2f(0.0f, 1.0f);
glVertex3f(1.0f, 1.0f, 1.0f);
glTexCoord2f(1.0f, 1.0f);
glVertex3f(-1.0f, 1.0f, 1.0f);
glEnd();
glColor4fv(color[3]);
glBegin(GL_TRIANGLE_STRIP);
glNormal3f(-1.0f, 0.0f, 0.0f);
glTexCoord2f(0.0f, 0.0f);
glVertex3f(-1.0f, -1.0f, 1.0f);
glTexCoord2f(1.0f, 0.0f);
glVertex3f(-1.0f, -1.0f, -1.0f);
glTexCoord2f(0.0f, 1.0f);
glVertex3f(-1.0f, 1.0f, 1.0f);
glTexCoord2f(1.0f, 1.0f);
glVertex3f(-1.0f, 1.0f, -1.0f);
glEnd();
glColor4fv(color[4]);
glBegin(GL_TRIANGLE_STRIP);
glNormal3f(0.0f, -1.0f, 0.0f);
glTexCoord2f(0.0f, 0.0f);
glVertex3f(-1.0f, -1.0f, 1.0f);
glTexCoord2f(1.0f, 0.0f);
glVertex3f(1.0f, -1.0f, 1.0f);
glTexCoord2f(0.0f, 1.0f);
glVertex3f(-1.0f, -1.0f, -1.0f);
glTexCoord2f(1.0f, 1.0f);
glVertex3f(1.0f, -1.0f, -1.0f);
glEnd();
glColor4fv(color[5]);
glBegin(GL_TRIANGLE_STRIP);
glNormal3f(0.0f, 1.0f, 0.0f);
glTexCoord2f(0.0f, 0.0f);
glVertex3f(-1.0f, 1.0f, -1.0f);
glTexCoord2f(1.0f, 0.0f);
glVertex3f(1.0f, 1.0f, -1.0f);
glTexCoord2f(0.0f, 1.0f);
glVertex3f(-1.0f, 1.0f, 1.0f);
glTexCoord2f(1.0f, 1.0f);
glVertex3f(1.0f, 1.0f, 1.0f);
glEnd();
}
貼圖為:

.

....................................................................................................................................................................
繼續(xù).
這是蓋莫游戲引擎2.1.2中GUI之2-GUI刷子
該對(duì)象提供對(duì)2d基本圖元的繪制和操作
提供以下功能
1.點(diǎn)繪制
2.線段繪制
3.矩形繪制
4.三角形繪制
5.紋理渲染
以后還會(huì)加入更多的功能
其功能大致相當(dāng)于UI lib中的Graphics,
Glooery中的Renderer
以及GUI Chart中的Graphics!
其接口如下:
////////////////////////////////////////////////////////////
/// 定義引擎GUI刷子(提供簡(jiǎn)單的幾何體繪制操作)
////////////////////////////////////////////////////////////
class G_DLL_API GuiBrush : public Object
{
public:
////////////////////////////////////////////////////////
/// GUI刷子構(gòu)造,析構(gòu)
////////////////////////////////////////////////////////
GuiBrush();
virtual ~GuiBrush();
public:
////////////////////////////////////////////////////////
/// 設(shè)置GUI刷子顏色
////////////////////////////////////////////////////////
virtual void SetBrushColor(const Color& color) = 0;
//////////////////////////////////////////////////////////
/// 設(shè)置刷子線寬
//////////////////////////////////////////////////////////
virtual void SetLineWidth(float width) = 0;
virtual float GetMaxLineWidth()const = 0;
virtual float GetLineWidth()const = 0;
//////////////////////////////////////////////////////////
/// 繪制一個(gè)點(diǎn)
//////////////////////////////////////////////////////////
virtual void RenderPoint(const Point& point) = 0;
virtual void RenderPoint(const Vector2f& point) = 0;
virtual void RenderPoint(int x,int y) = 0;
virtual void RenderPoint(float x,float y) = 0;
////////////////////////////////////////////////////////
/// 繪制一個(gè)線段
////////////////////////////////////////////////////////
virtual void RenderLine(const Vector2f& from, const Vector2f& to) = 0;
virtual void RenderLine(const Point& from, const Point& to) = 0;
////////////////////////////////////////////////////////
/// 繪制一個(gè)矩陣框(填充與否)
////////////////////////////////////////////////////////
virtual void RenderRect(const Recti& rect, bool fill = true) = 0;
virtual void RenderRect(const Rectf& rect, bool fill = true) = 0;
////////////////////////////////////////////////////////
/// 繪制一個(gè)三角形
////////////////////////////////////////////////////////
virtual void RenderTriangle(const Vector2f& p1,const Vector2f& p2,const Vector2f& p3, bool fill = true) = 0;
virtual void RenderTriangle(const Point& p1,const Point& p2,const Point& p3, bool fill = true) = 0;
//////////////////////////////////////////////////////////
/// 繪制一個(gè)園,園扇(segments為邊數(shù))
//////////////////////////////////////////////////////////
virtual void RenderCircle(const Vector2f& center,float radius,int segments = 32) = 0;
virtual void RenderCircleSegment(const Vector2f& center,float radius,float angle1,float angle2,int segments = 32,bool filled = true) = 0;
////////////////////////////////////////////////////////
/// 渲染紋理
////////////////////////////////////////////////////////
virtual void RenderTexture(float x,float y,float w,float h) = 0;
virtual void RenderTexture(const Rectf& rect) = 0;
DECLARE_OBJECT(GuiBrush)
};
可以看出比較簡(jiǎn)單 沒(méi)有什么復(fù)雜的東西!
在GUI部分
引擎還會(huì)陸續(xù)加入以下對(duì)象
1.Widget 基本控件單元
2.Border 控件裝飾器
3.Layout 控件布局管理器
4.UIManager UI管理器
5.UIEvent UI消息事件
6.WidgetSort 提供對(duì)控件的深度排序
可能還會(huì)加入U(xiǎn)ISurface以提供對(duì)控件表面的裝飾效果
引擎UI需要達(dá)到的高度
1.控件組動(dòng)態(tài)生成(要求源于xml config file)
2.控件自布局
3.靈活簡(jiǎn)單易用
4.UI引擎和引擎的低聚合
.....
這是剛寫的渲染到紋理代碼 還有點(diǎn)問(wèn)題 以后慢慢修改吧
先上interface
///////////////////////////////////////////////////////////
/// 定義渲染到紋理對(duì)象
///////////////////////////////////////////////////////////
class G_DLL_API RenderToTexture : public Renderable
{
public:
////////////////////////////////////////////////////////
//! 構(gòu)造,析構(gòu)渲染到紋理
////////////////////////////////////////////////////////
RenderToTexture();
virtual ~RenderToTexture();
public:
////////////////////////////////////////////////////////
//! 設(shè)置渲染紋理,目標(biāo)回調(diào)函數(shù)
////////////////////////////////////////////////////////
virtual void SetRenderTexture(RenderCallBack rendertexture) = 0;
virtual void SetRenderTarget(RenderCallBack rendertarget) = 0;
////////////////////////////////////////////////////////
//! 設(shè)置渲染攝像機(jī)透視參數(shù)
////////////////////////////////////////////////////////
virtual void SetRenderPara(float fov,float near,float far) = 0;
////////////////////////////////////////////////////////
//! 設(shè)置紋理清屏色
////////////////////////////////////////////////////////
virtual void SetClearColor(const Color& color) = 0;
DECLARE_OBJECT(RenderToTexture)
};
下面是測(cè)試的例子代碼:
#include <GEngine/Gaimo.hpp>
using namespace std;
using namespace core;
RefPtr<Texture> boxtexture = NULL;
RefPtr<Camera> camera = NULL;
//! 獲取引擎視頻驅(qū)動(dòng)器
RefPtr<VideoDriver> videodriver = NULL;
///////////////////////////////////////////////////////////////////////////////
// 渲染回調(diào)函數(shù)
///////////////////////////////////////////////////////////////////////////////
void G_CALL Render()
{
glBegin(GL_QUADS);
glTexCoord2f(1, 1);
glVertex2f( 1, 1);
glTexCoord2f(0, 1);
glVertex2f(-5, 1);
glTexCoord2f(0, 0);
glVertex2f(-5,-5);
glTexCoord2f(1, 0);
glVertex2f( 1,-5);
glTexCoord2f(1, 1);
glVertex2f(3, 3);
glTexCoord2f(0, 1);
glVertex2f(-3,3);
glTexCoord2f(0, 0);
glVertex2f(-3,-3);
glTexCoord2f(1, 0);
glVertex2f(3,-3);
glEnd();
}
///////////////////////////////////////////////////////////////////////////////
//
///////////////////////////////////////////////////////////////////////////////
void G_CALL RenderTexture()
{
boxtexture->AttachRenderTarget();
glBegin(GL_QUADS);
glTexCoord2f(1, 1);
glVertex2f(0,0);
glTexCoord2f(0, 1);
glVertex2f(-8,0);
glTexCoord2f(0, 0);
glVertex2f(-8,-8);
glTexCoord2f(1, 0);
glVertex2f(0,-8);
glEnd();
}
int main(int argc, char **argv)
{
//! 初始化引擎設(shè)備并得到設(shè)備指針
RefPtr<Device> device = core::InitDevice("渲染到紋理");
//! 得到引擎場(chǎng)景指針
RefPtr<SceneManager> scenemanager = device->GetSceneManager();
//! 得到引擎資源指針
RefPtr<ResourceManager> resourcemanager = device->GetResourceManager();
//! 獲取引擎紋理管理器指針
RefPtr<TextureManager> texturemanager = resourcemanager->GetTextureManager();
//! 獲取引擎圖形管理器
RefPtr<ImageManager> imagemanager = resourcemanager->GetImageManager();
//! 獲取引擎視頻驅(qū)動(dòng)器
videodriver = device->GetVideoDriver();
//! 得到tile圖形和其紋理
core::RefPtr<Image> box = imagemanager->CreateObject("cube","..\\image//logo.bmp");
boxtexture = texturemanager->CreateObject("cube",box);
boxtexture->Generate();
//! 獲取全局?jǐn)z像機(jī),設(shè)置攝像機(jī)參數(shù)
camera = scenemanager->GetActiveCamera();
camera->SetPosition(Vector3f(0,0,18));
camera->SetView(Vector3f(0,0,0));
camera->SetDirection(Vector3f(0,1,0));
camera->SetViewPort(Recti(0,0,640,480));
camera->SetPerspective(50.0f,640.0f/480.0f,1.0f,100.0f);
videodriver->EnableCulling();
//! 獲取渲染到紋理指針
RefPtr<RenderToTexture> render = device->GetRenderer()->GetRenderToTexture(256,256);
render->SetRenderTexture(&RenderTexture);
render->SetRenderTarget(&Render);
render->SetClearColor(Color::Blue);
render->SetRenderPara(45.0f,1.0f,100.0f);
BEGIN_LOOP(device)
camera->Render();
render->Render();
END_LOOP(device)
return 0;
}
貼圖比較簡(jiǎn)單就不上了 這個(gè)以后還要修改之!
這是蓋莫游戲引擎2.1.2的游標(biāo)控制類
該類主要負(fù)責(zé)游標(biāo)圖形 游標(biāo)顯示和設(shè)置游標(biāo)位置
比較簡(jiǎn)單直接上代碼不說(shuō)啥了
namespace core
{
////////////////////////////////////////////////////////////
/// 定義引擎游標(biāo)控制類(當(dāng)前最大支持8個(gè)光標(biāo))(當(dāng)前僅對(duì)win32有效)
////////////////////////////////////////////////////////////
class G_DLL_API CursorControl : public Object
{
public:
////////////////////////////////////////////////////////
/// 構(gòu)造,析構(gòu)游標(biāo)控制
////////////////////////////////////////////////////////
CursorControl();
virtual ~CursorControl();
public:
////////////////////////////////////////////////////////
/// 載入光標(biāo)文件(win32下可載入.cur,.ani,.ico格式)(返回光標(biāo)索引)
////////////////////////////////////////////////////////
virtual int OpenCursor(const engine_string& cursor) = 0;
////////////////////////////////////////////////////////
/// 設(shè)置給定索引的光標(biāo)
////////////////////////////////////////////////////////
virtual bool SetCursor(int cursor) = 0;
////////////////////////////////////////////////////////
/// 光標(biāo)的顯示和隱藏
////////////////////////////////////////////////////////
virtual void ShowCursor(bool show) = 0;
////////////////////////////////////////////////////////
/// 設(shè)置光標(biāo)位置
////////////////////////////////////////////////////////
virtual void SetCursotPosition(int x, int y) = 0;
DECLARE_OBJECT(CursorControl)
};
摘要: 好幾天沒(méi)寫博客了接著以前寫的Loki系列來(lái)首先Loki Factory設(shè)計(jì)的目的就是讓對(duì)象功能按名生成!該文主要涉及Loki/Factory.h文件首先上工廠異常類如下:
/** * \defgroup FactoryErrorPoliciesGroup Factory Error Policies&...
閱讀全文
摘要: 蓋莫音頻引擎1.2.8的上次發(fā)布版本為1.1.2版本當(dāng)前發(fā)布版本增加功能如下:1.對(duì)音頻錄入的支持2.對(duì)xm,mod,it,s3m的支持3.修改了一些內(nèi)部實(shí)現(xiàn)總的說(shuō)來(lái)本引擎(API)功能如下:1.支持ogg,mp3,wav,xm,it,s3m,mod格式2.基于多線程流式播放音頻3.真3d音效4.支持低通,次級(jí)音效本音頻引擎完全勝任游戲開(kāi)發(fā),嵌入式設(shè)備等商業(yè)應(yīng)用!本音頻引擎使用于商業(yè)用途只需要付出...
閱讀全文
剛做完了蓋莫音頻引擎1.2.8的音頻錄入功能
這個(gè)比較簡(jiǎn)單
就是把聽(tīng)到的音頻保存為一定格式的音頻文件(當(dāng)前只設(shè)計(jì)了保存為wav文件)
接口很簡(jiǎn)單
如下:
////////////////////////////////////////////////////////////
/// 定義音頻錄入類接口
////////////////////////////////////////////////////////////
class AudioCapture : public Object
{
public:
/////////////////////////////////////////////////////////
//! 構(gòu)造,析構(gòu)音頻錄入
/////////////////////////////////////////////////////////
AudioCapture();
virtual ~AudioCapture();
/////////////////////////////////////////////////////////
//! 捕獲,停止捕獲音頻數(shù)據(jù)
/////////////////////////////////////////////////////////
virtual void CaptureData() = 0;
virtual void StopCapture() = 0;
DECLARE_OBJECT(AudioCapture)
};
只有2個(gè)函數(shù)
一個(gè)是音頻數(shù)據(jù)分批錄入
一個(gè)就是停止錄入音頻數(shù)據(jù)
那么該指針從哪里獲取呢?
當(dāng)然是AudioDevice了
如下(這是蓋莫音頻引擎的中樞)
/////////////////////////////////////////////////////////
//! 定義音頻設(shè)備基類
/////////////////////////////////////////////////////////
class AudioDevice : public Object
{
public:
/////////////////////////////////////////////////////////
//! 初始化,卸載音頻設(shè)備
/////////////////////////////////////////////////////////
virtual bool Init(const engine_string &devicename,
uint16 eax_effect_num,
uint output_freq) = 0;
virtual bool Deinit() = 0;
/////////////////////////////////////////////////////////
//! 獲取音頻引擎版本號(hào)
/////////////////////////////////////////////////////////
virtual const char* GetVerson() const = 0;
/////////////////////////////////////////////////////////
//! 獲取音頻引擎作者
/////////////////////////////////////////////////////////
virtual const char* GetMaker() const = 0;
/////////////////////////////////////////////////////////
//! 查詢音頻設(shè)備是否支持指定格式的音頻文件
/////////////////////////////////////////////////////////
virtual bool IsSupport(const AudioFileType& type) = 0;
/////////////////////////////////////////////////////////
//! 抓取音頻音源指針(最大可獲取255個(gè)音源)
/////////////////////////////////////////////////////////
virtual AudioSource* GetAudioSource() = 0;
/////////////////////////////////////////////////////////
//! 獲取聽(tīng)者指針
/////////////////////////////////////////////////////////
virtual AudioListener* GetAudioListener() = 0;
/////////////////////////////////////////////////////////
//! 獲取音頻捕獲設(shè)備指針(參數(shù)為音頻名字)(當(dāng)前僅僅支持wav格式)(全局唯一)
/////////////////////////////////////////////////////////
virtual RefPtr<AudioCapture> GetAudioCapture(const engine_string& name = "capture")const = 0;
/////////////////////////////////////////////////////////
//! 獲取音頻設(shè)備列表個(gè)數(shù)
/////////////////////////////////////////////////////////
virtual uint16 GetAudioDeviceNumber() = 0;
virtual engine_string GetDeviceByIndex(uint8 index) = 0;
/////////////////////////////////////////////////////////
//! 獲取默認(rèn)設(shè)備名
/////////////////////////////////////////////////////////
virtual engine_string GetDefaultDeviceName()const = 0;
DECLARE_OBJECT(AudioDevice)
};
那么如何使用蓋莫音頻引擎錄入音頻呢?
如下:
/*!==========================================================================
*
* 蓋莫游戲引擎(GaiMo Game Engine)
*
* 版權(quán)所有 (C) 2009-2009 成都蓋莫軟件技術(shù)工作室 保留所有權(quán)利
* Copyright (C) 成都蓋莫軟件技術(shù)工作室. All Rights Reserved.
*
* 了解更多情況,請(qǐng)?jiān)L問(wèn) http://www.gaimo.net
****************************************************************************/
#include <GEngine/Gaimo.hpp>
//! 使用蓋莫游戲引擎內(nèi)核命名空間
using namespace core;
using namespace std;
int Main()
{
RefPtr<Device> device = InitDevice("音頻捕獲");
//! 獲取音頻設(shè)備指針
RefPtr<core::AudioDevice> audiodevice = device->GetAudioDevice();
//! 獲取音頻設(shè)備個(gè)數(shù)
uint16 number = audiodevice->GetAudioDeviceNumber();
for(int i = 0; i < number ; i++)
{
std::cout<<audiodevice->GetDeviceByIndex(i)<<std::endl;
}
//! 初始化音頻設(shè)備
engine_string audiodeviceinde = audiodevice->GetDeviceByIndex(0);
cout<<"初始化音頻設(shè)備"<<audiodevice->Init(audiodeviceinde,4,0)<<endl;
//! 獲取音頻錄入指針
RefPtr<AudioCapture> audiocapture = audiodevice->GetAudioCapture("capture");
//! 獲取錄制開(kāi)始時(shí)間
float time = device->GetTime();
BEGIN_LOOP(device)
//! 錄制時(shí)間10秒
if(device->GetTime() > time +10)
break;
audiocapture->CaptureData();
END_LOOP(device)
audiocapture->StopCapture();
return EXIT_SUCCESS;
}
步驟就是從設(shè)備指針獲取音頻管理器指針
從音頻管理器指針獲取音頻錄入指針
然后在錄入過(guò)程中調(diào)用數(shù)據(jù)錄入函數(shù)
停止錄入的時(shí)候調(diào)用StopAudioCapture即可!
當(dāng)然這是基于蓋莫游戲引擎的音頻錄入
過(guò)些天我要發(fā)布一個(gè)單獨(dú)的蓋莫音頻引擎sdk(第三次發(fā)布)
題外話
在蓋莫游戲引擎2.1.2中音頻部分需要增加的功能就是對(duì)midi,mid.mod系列音樂(lè)文件的支持了
(不過(guò)聽(tīng)人說(shuō)這個(gè)解碼似乎不太好處理)
到時(shí)候歡迎下載啊
順手翻了下3d游戲引擎設(shè)計(jì)實(shí)時(shí)計(jì)算機(jī)圖形學(xué)的應(yīng)用方法這本書(英文本第二版)
在其800page.18.4章的
template<class T>
class Stack中這兒有一個(gè)小錯(cuò)誤
就是
在函數(shù)
bool Push..
中間 其判斷條件是錯(cuò)誤的
對(duì)于這個(gè)類模板
我把它成了了蓋莫引擎死板的風(fēng)格
如下:
///////////////////////////////////////////////////////////
/// 定義引擎棧模板類
///////////////////////////////////////////////////////////
template<class T>
class Stack : NonCopyable
{
public:
///////////////////////////////////////////////////////
/// 構(gòu)造,析構(gòu)棧模板
///////////////////////////////////////////////////////
Stack(int maxsize);
~Stack();
public:
///////////////////////////////////////////////////////
/// 數(shù)據(jù)入棧
///////////////////////////////////////////////////////
bool Push(const T& element);
///////////////////////////////////////////////////////
/// 數(shù)據(jù)出棧
///////////////////////////////////////////////////////
bool Pop(T& element);
//////////////////////////////////////////////////////////
/// 獲取棧頂元素
//////////////////////////////////////////////////////////
bool GetTop(T& element)const;
///////////////////////////////////////////////////////
/// 檢查棧是否為空棧,滿棧
///////////////////////////////////////////////////////
bool IsEmpty()const;
bool IsFull()const;
private:
int maxsize;
int top;
T* data;
};
#include <GEngine/Template/Stack.inl>
in stack.inl
///////////////////////////////////////////////////////
/// 構(gòu)造,析構(gòu)棧模板
///////////////////////////////////////////////////////
template<class T>
Stack<T>::Stack(int maxsize):
top(-1)
{
ASSERT(maxsize > 0);
this->maxsize = maxsize;
data = new T[this->maxsize];
}
template<class T>
Stack<T>::~Stack()
{
CHECK_PTR_ARRAY_AND_DELETE(data);
}
///////////////////////////////////////////////////////
/// 數(shù)據(jù)入棧
///////////////////////////////////////////////////////
template<class T>
inline bool Stack<T>::Push(const T& element)
{
if(top < maxsize-1)
{
data[++top] = element;
return true;
}
return false;
}
///////////////////////////////////////////////////////
/// 數(shù)據(jù)出棧
///////////////////////////////////////////////////////
template<class T>
inline bool Stack<T>::Pop(T& element)
{
if(top >=0)
{
element = data[top--];
return true;
}
return false;
}
//////////////////////////////////////////////////////////
/// 獲取棧頂元素
//////////////////////////////////////////////////////////
template<class T>
inline bool Stack<T>::GetTop(T& element)const
{
if(top >= 0)
{
element = data[top];
return true;
}
return false;
}
///////////////////////////////////////////////////////
/// 檢查棧是否為空棧,滿棧
///////////////////////////////////////////////////////
template<class T>
inline bool Stack<T>::IsEmpty()const
{
return top == -1;
}
template<class T>
inline bool Stack<T>::IsFull()const
{
return top == maxsize-1;
}
從2008年年底我就一直想設(shè)計(jì)一套基于OpenGL的游戲?qū)S肎UI系統(tǒng)出來(lái)
當(dāng)然有人說(shuō)現(xiàn)在不是有現(xiàn)成的嗎?CEGUI...
使用這個(gè)當(dāng)然沒(méi)什么問(wèn)題
但是覺(jué)得自己開(kāi)發(fā)的游戲引擎還是配備一個(gè)套自行開(kāi)發(fā)的GUI系統(tǒng)比較好(比如irr)
當(dāng)然在下面使用若干子庫(kù)(比如freetype,sigc++等等)還是沒(méi)有問(wèn)題的
也是從那個(gè)時(shí)候看了很多GUI系統(tǒng),比如CEGUI,MyGUI,GLOOEY,UFO GUI,UI LIB 等等
之后我開(kāi)始設(shè)計(jì)了一個(gè)套GUI系統(tǒng)但是感覺(jué)問(wèn)題多多
一個(gè)主要的問(wèn)題就是沒(méi)有處理好事件
現(xiàn)在重新看UI系統(tǒng)
設(shè)計(jì)她的前置條件有
1.良好的字體渲染器
2.對(duì)象系列化
3.中文輸入.
4.其它
UI系統(tǒng)應(yīng)該包括的內(nèi)容(個(gè)人感覺(jué))
1.UI事件
2.UI工廠(或者管理器)
3.UI控件對(duì)象(按鍵,組合框等等)
4.UI邊框(裝飾器)
5.UI布局管理器
6.其它
故從蓋莫引擎2.1.2版本起我會(huì)逐步加入新設(shè)計(jì)的GUI引擎
下面是我的開(kāi)胃菜
GUI主題色
設(shè)置這個(gè)的目的是為了統(tǒng)一GUI控件顏色而不需要一個(gè)一個(gè)設(shè)計(jì)它
下面是實(shí)現(xiàn)很簡(jiǎn)單的!
class G_DLL_API UIThemeColor : public Object
{
public:
////////////////////////////////////////////////////////
/// 獲取默認(rèn)主題色
////////////////////////////////////////////////////////
static UIThemeColor GetDefaultTheme();
public:
////////////////////////////////////////////////////////
/// 構(gòu)造,析構(gòu)主題色
////////////////////////////////////////////////////////
UIThemeColor();
UIThemeColor(const Color &normal,const Color &disable,const Color &focus,const Color &tagged);
UIThemeColor(UIThemeColor &theme);
~UIThemeColor(){}
////////////////////////////////////////////////////////
/// 使用默認(rèn)主題色
////////////////////////////////////////////////////////
void UseDefaultTheme();
////////////////////////////////////////////////////////
/// 重新設(shè)置,獲取主題色
////////////////////////////////////////////////////////
void SetThemeColor(const Color &normal,const Color &disable,const Color &focus,const Color &tagged);
void GetThemeColor(Color &normal,Color &disable,Color &focus,Color &tagged);
////////////////////////////////////////////////////////
/// 設(shè)置,獲取主題正常色
////////////////////////////////////////////////////////
void SetNormalColor(const Color &color){this->color[0] = color;}
Color GetNormalColor()const{return color[0];}
////////////////////////////////////////////////////////
/// 設(shè)置,獲取主題不可用色
////////////////////////////////////////////////////////
void SetDisableColor(const Color &color){this->color[1] = color;}
Color GetDisableColor()const{return color[0];}
////////////////////////////////////////////////////////
/// 設(shè)置,獲取主題聚焦顏色
////////////////////////////////////////////////////////
void SetFocusColor(const Color &color){this->color[2] = color;}
Color GetFocusColor()const{return color[2];}
////////////////////////////////////////////////////////
/// 設(shè)置,獲取主題(被選中的)顏色
////////////////////////////////////////////////////////
void SetTaggedColor(const Color &color){this->color[3] = color;}
Color GetTaggedColor()const{return color[3];}
private:
static UIThemeColor themecolor;
//! 當(dāng)前保留一個(gè)空的顏色值
static const int themecolor_number = 5;
Color color[themecolor_number];
然后每個(gè)控件包含一個(gè)主題色對(duì)象
(當(dāng)前這里認(rèn)為控件有4個(gè)狀態(tài).正常,禁止,聚焦,選中)
這是使用蓋莫游戲引擎2.1.2測(cè)試環(huán)境映射的demo
對(duì)opengl而言
環(huán)境映射主要就圍繞函數(shù)glTexEnv工作的
但是其實(shí)現(xiàn)起來(lái)不是那么容易
該測(cè)試?yán)釉从?.1.1版本demo中的球面映射一例
增加的代碼為:
RefPtr<TexEnv> texenv = reflect->GetTexEnv();
texenv->SetEnvColor(Color::Blue);
texenv->SetMode(TEXTURE_ENV_MODE_BLEND);
texenv->SetLodBias(0.2f);
texenv->SetPointSpriteCoordReplace(true);
texenv->SetRGBScale(1.2f);
texenv->SetAlphaScale(0.8f);
texenv->SetCombineMode(TEXTURE_ENV_MODE_INTERPOLATE);
texenv->SetEnvSource0(TEXTURE_ENV_SOURCE_TEXTURE0);
texenv->SetEnvSource1(TEXTURE_ENV_SOURCE_TEXTURE1);
texenv->SetEnvSource2(TEXTURE_ENV_SOURCE_TEXTURE2);
環(huán)境映射的操作模式就是從紋理中獲取對(duì)應(yīng)的環(huán)境映射指針并設(shè)置合適的參數(shù)數(shù)值
全demo源碼為:
/*!==========================================================================
*
* 蓋莫游戲引擎(GaiMo Game Engine)
*
* 版權(quán)所有 (C) 2009-2009 成都蓋莫軟件技術(shù)工作室 保留所有權(quán)利
* Copyright (C) 成都蓋莫軟件技術(shù)工作室. All Rights Reserved.
*
* 了解更多情況,請(qǐng)?jiān)L問(wèn) http://www.gaimo.net
****************************************************************************/
#include <GEngine/Gaimo.hpp>
using namespace std;
using namespace core;
int main(int argc, char **argv)
{
//! 初始化引擎設(shè)備并得到設(shè)備指針
RefPtr<Device> device = core::InitDevice("環(huán)境映射");
//! 得到引擎場(chǎng)景指針
RefPtr<SceneManager> scenemanager = device->GetSceneManager();
//! 得到引擎資源指針
RefPtr<ResourceManager> resourcemanager = device->GetResourceManager();
//! 獲取引擎紋理管理器指針
RefPtr<TextureManager> texturemanager = resourcemanager->GetTextureManager();
//! 獲取引擎圖形管理器
RefPtr<ImageManager> imagemanager = resourcemanager->GetImageManager();
//! 獲取引擎視頻驅(qū)動(dòng)器
RefPtr<VideoDriver> videodriver = device->GetVideoDriver();
//! 得到圖形和其紋理
RefPtr<Image> image1 = imagemanager->CreateObject("background","..\\image//spheremap//tree.jpg");
RefPtr<Texture> background = texturemanager->CreateObject("background",image1);
background->Generate();
RefPtr<Image> image2 = imagemanager->CreateObject("reflect","..\\image//spheremap//tree1.jpg");
RefPtr<Texture> reflect = texturemanager->CreateSphereMap("reflect",image2);
RefPtr<TexEnv> texenv = reflect->GetTexEnv();
texenv->SetEnvColor(Color::Blue);
texenv->SetMode(TEXTURE_ENV_MODE_BLEND);
texenv->SetLodBias(0.2f);
texenv->SetPointSpriteCoordReplace(true);
texenv->SetRGBScale(1.2f);
texenv->SetAlphaScale(0.8f);
texenv->SetCombineMode(TEXTURE_ENV_MODE_INTERPOLATE);
texenv->SetEnvSource0(TEXTURE_ENV_SOURCE_TEXTURE0);
texenv->SetEnvSource1(TEXTURE_ENV_SOURCE_TEXTURE1);
texenv->SetEnvSource2(TEXTURE_ENV_SOURCE_TEXTURE2);
reflect->Generate();
//! 獲取全局?jǐn)z像機(jī),設(shè)置攝像機(jī)參數(shù)
core::RefPtr<core::Camera> camera = scenemanager->GetActiveCamera();
camera->SetPosition(Vector3f(0,0,30));
camera->SetView(Vector3f(0,0,0));
camera->SetDirection(Vector3f(0,1,0));
camera->SetViewPort(Recti(0,0,640,480));
camera->SetPerspective(50.0f,640.0f/480.0f,0.1f,300.0f);
videodriver->EnableCulling();
BEGIN_LOOP(device)
videodriver->SetClearBuffer(ENGINE_CLEAR_COLOR | ENGINE_CLEAR_DEPTH);
videodriver->SetClearColor(core::Color::Blue);
camera->Render();
background->AttachRenderTarget();
glBegin(GL_QUADS);
glNormal3f( 0.0f, 0.0f, 1.0f);
glTexCoord2f(0.0f, 0.0f); glVertex3f(-13.0f, -12.0f, 10.0f);
glTexCoord2f(1.0f, 0.0f); glVertex3f( 13.0f, -12.0f, 10.0f);
glTexCoord2f(1.0f, 1.0f); glVertex3f( 13.0f, 12.0f, 10.0f);
glTexCoord2f(0.0f, 1.0f); glVertex3f(-13.0f, 12.0f, 10.0f);
glEnd();
reflect->AttachRenderTarget();
videodriver->RenderSphere(12,32,32);
videodriver->RenderSphere(9,32,32);
videodriver->RenderSphere(6,32,32);
reflect->Destroy();
END_LOOP(device)
return 0;
}
當(dāng)前測(cè)試?yán)釉O(shè)置環(huán)境映射模式為渲染模式
則其效果為:

再貼一次對(duì)應(yīng)的無(wú)環(huán)境映射的圖片如下:

可以看出蓋莫游戲引擎一直在不斷完善ing.