摘要: 代碼如下:
Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/-->class lmmsStyle : public QPlastiqueStyle{public: lmm...
閱讀全文
終于把SmartGUi庫寫了一半,基本的架子算是搭起來了
現在我打算編寫博客邊做開發
雖然說之前也做過GUI,但是這次還是想把這個做好點(要是一不小心和CEGUI或者MYGUI起名那就不錯了哈哈)
先說GUI字體接口吧
需要說在的 這個庫的定位是與具體渲染機器無關
那么我們就需要一個與具體渲染有關的插件了
很顯然,對于GUI來說主要有3個部分
1.紋理/位圖
2.字體
3.基本圖元的繪制
當然還有其他...
下面這是基本字體的抽象基類
CORE_BEGIN_NAMESPACE
class GUI_EXPORT GFont : public Object
{
public:
const static int LEFT = -1;
const static int TOP = -1;
const static int CENTER = 0;
const static int RIGHT = 1;
const static int BOTTOM = 1;
public:
virtual ~GFont();
virtual gstring GetFileName()const = 0;
virtual int GetFontSize() = 0;
virtual int GetLineHeight() const = 0;
virtual int GetWidth(const gstring& text) const = 0;
virtual int GetHitCharIndex(const gstring& text,float offset)const = 0;
virtual void Render(const gstring& text,const Recti& area,\
int halignment = CENTER,\
int valignment = CENTER,\
bool oneline = true) = 0;
DECLARE_OBJECT(GFont)
};
CORE_END_NAMESPACE
函數功能基本都看的懂
需要說明的是
1.GetHitCharIndex是本文給定偏移對于的字符標號
2.這里并沒有提供一個渲染給定文本在給定位置的功能,反而提供了一個更為貼心的Render渲染文本于給定矩形-可以指定對其方式和是否為多行渲染
3.這里還沒有提供一些更為復雜的字體性質,比如斜體,下劃線,粗體等等
一個相關的字體工廠對象如下:
CORE_BEGIN_NAMESPACE
class GUI_EXPORT GFontFactory : public Object
{
public:
virtual ~GFontFactory();
virtual boost::shared_ptr<GFont> CreateFont(const gstring& font,int size) = 0;
DECLARE_OBJECT(GFontFactory)
};
CORE_END_NAMESPACE
這個沒什么說的,根據字體文件和字體大小生成字體指針一枚
還有一個相關對象是FontManager
接口如下:
CORE_BEGIN_NAMESPACE
class GUI_EXPORT GFontManager:
public Manager<boost::shared_ptr<GFont> >,
public GSerializer
{
public:
bool AddFont(const gstring& name,const gstring& font,int size,bool del = false);
gstring GetSerializerTag(){return "fontlist";}
bool Load(boost::shared_ptr<XMLNode> node);
bool Save(boost::shared_ptr<XMLDocument> doc,boost::shared_ptr<XMLNode>& node);
apiuse
void SetFontFactory(boost::shared_ptr<GFontFactory> factory);
private:
boost::shared_ptr<GFontFactory> factory;
DEFINE_SINGLETON(GFontManager)
};
CORE_END_NAMESPACE
1.顯然字體管理器是一個單件
2.函數SetFontFactory()是提供給插件設置具體的字體工廠的,所以這里有一個標記apiuse
3.函數GetSerializerTag,Load,Save是從對那象GSerializer繼承來的,目的就是提供字體的序列化和反序列化動作-我們的GUI是要盡可能做到自動化的
在SmartGUI中,字體系統基本上就由這三個對象,以后樣子改動不會太大了,也許只會增加函數接口而已
另外這個字體系統從設計模式的角度看是很容易理解的
----------------------------------------------------------標記
接口總比實現重要些.
源于lmms
代碼如下:
#include <QtCore/QSemaphore>
template<typename T>
class fifoBuffer
{
public:
fifoBuffer( int _size ) :
m_reader_sem( _size ),
m_writer_sem( _size ),
m_reader_index( 0 ),
m_writer_index( 0 ),
m_size( _size )
{
m_buffer = new T[_size];
m_reader_sem.acquire( _size );
}
~fifoBuffer()
{
delete[] m_buffer;
m_reader_sem.release( m_size );
}
void write( T _element )
{
m_writer_sem.acquire();
m_buffer[m_writer_index++] = _element;
m_writer_index %= m_size;
m_reader_sem.release();
}
T read()
{
m_reader_sem.acquire();
T element = m_buffer[m_reader_index++];
m_reader_index %= m_size;
m_writer_sem.release();
return( element );
}
bool available()
{
return( m_reader_sem.available() );
}
private:
QSemaphore m_reader_sem;
QSemaphore m_writer_sem;
int m_reader_index;
int m_writer_index;
int m_size;
T * m_buffer;
} ;
先解釋下啥是SmartGUI?
SmartGUI是我打算做,也做了一周多的一個Game GUI LIB
其基本的特點包括,但不限于以下幾項
1.跨平臺
2.支持DX,GL
以上2項似乎不大能引起別人的注意
3.全腳本化支持
載入配置即可自動生成控件,外觀并顯示出來
你所要做的只是設置必要的邏輯關系即可(至少現在我還沒有合適的方案來支持腳本配置UI邏輯關系,不過未來未必)
這點貌似比較吸引人吧
不過還有一點
4.開源
這將是我第一個開源項目,在動手之前我吸收了大量android,QT編程的養分
SmartGUI最大的特點只要2個
1為易用
2為界面配置協調
--------------------------------------------------------------------
當然性能不會差到哪里去
附注:幾天前才開始,爭取端午截止前放上第一份源碼
各位同學給一個好的開源站點吧
Android中的ListActivity涉及2類點擊事件
1個是短按點擊
1個是長按點擊
對于短按點擊
只需要重載下面的函數即可
void onListItemClick(ListView arg0, View arg1, int pos, long id)對于長按
則需要繼承接口OnItemLongClickListener并實現
getListView().setOnItemLongClickListener(new OnItemLongCLickListener(){
public boolean onItemLongClick(AdapterView parent, View view, int position,
long id)
{
return true;
}
}); 其方法即可
Echo是聲音的反射,是指人直接聽到聲音之后,其反射音又被聽到。
一個真正意義上的Echo是單反射的。其時間間隔就是聲音的速率
很顯然一般的Echo具有2個參數
一個是延遲,一個是衰減
在某一時刻,人聽到的聲音是此時音源聲音和延遲前音源聲音的混合音。
顯然一個簡單的表達式是:
data+=data_prev*decay
這就是Echo音效基本的函數表達式
這是第四篇關于音效處理的文檔
其他類似音效不打算再寫了
需要說的就是 實際編程并沒有想象中的那么復雜!
在音頻這塊喔已經做完了
1.acc格式編解碼
2.wma編解碼
3.fadein,fadeout,echo,reverb等音效算法
4.音頻頻譜分析
5.EQ設置
有空整理下哈
這是音效系列編程之三:FadeOut和FadeIn音效
二者都分別控制音樂的淡出和淡入
解釋下淡出效果的含義:就在是音樂播放即將結束之前通過一定的手法控制音樂響度-直至結束。
很顯然,使用線性關系基本可以達到目的
假定數據關系為y = kx + b;
另外需要控制淡出的坡度,或者直接說需要知道從結束之前多少個數據開始需要使用FadeOut音效。所以我們需要一個參數len。
假定我們使用下列的一句話算法來說明問題:
for(int i = 0; i != len ;i++)
bufer[i]*= (a-i)*b;
其中a,b為待定參數
因為有一個前提:當i = len-1的時候buffer[len-1] = 0;
所以有a=len-1
另外當fadeout發揮作用之前buffer數據并未變化,故有
b=(len-1)
故基本的Fadeout核心算法就是一句:
y=y*(1-t/k)
簡單吧。
理所當然
基本的FadeIn核心算法就是
y*=(t/k-1)
雖然在具體場合,算法有所變形,但是基本的原理就是這個樣子
PS:基本的函數關系雖然簡單,但是比較實用
以后有空還會講Echo,Reverb,Treble Booster,Compressor,High Filter等音效原理
。只是研究音效的同志們不多。沒的討論
啥是門面模式?
按照我的理解就是:給一系列子對象或者系統提高一個統一的接口
在使用過程中該接口把客戶端發送來的要求傳遞到各個可能的子系統中去。
一句話:門面模式是為了簡化客戶端操作而產生的
一個簡單的例子是:
之前我要看電視,只需要打開電視機即可
但是現在有了機頂盒這個東西,要看電視需要2個步驟:打開電視機,打開機頂盒,反而繁瑣了。
做個夢,如果一天我想看電視我只要說一句-我要看電視,然后自動打開電視機和機頂盒。那該多好。
可以看出,在實際開發過程中,對于那些沒有學過設計模式滴淫,他們也可能使用過該模式,只不過不知道名字罷了
門面模式的一個例子:
很簡單滴:
class A;
class B;
class C;
class Op
{
A* a;
B* b;
C* c;
void Call()
{
a->Call();
b->Call();
c->Call();
}
}
注意這里A,B,C不具有共同基類
不管什么模式,都是為了應用服務的,如果但是將復雜化,高深化,那是不可取的。想想當時買了設計模式一書,看的稀里糊涂的。
PS:門面模式=簡化客戶端操作(統一包裝)
本文給出當前我使用過的Android 調試橋方法
要使用調試橋首先需要 切換目錄到Android SDK下的tools目錄或者設置下路徑
常見的使用方法如下:
1.把本地apk文件推入真機
adb push name.apk system/app
2.卸載真機apk程序
adb uninstall packagename
比如
adb uninstall cm.android.game
3.如果adb push 失敗
則需要執行
adb remount
4.如果執行
adb uninstall .
失敗
則可以嘗試
adb shell
切換到app目錄 cd system/app
執行ls查看當前所有應用列表
然后使用rm 名字移除apk包
比如rm game.apk
不過這樣做有一個壞處就是
只是簡單刪除了應用程序并沒有刪除程序數據
嗯 GUI庫應該分為幾個大的模塊呢? :)我想
這次的GUI庫我會采用類似GUICHAN的方式,具體的GUI并不依賴于特定的圖形接口,而是采取插件的方式動態加載,這樣有助于提高其使用的廣度
應該包含一個GUIRender
另外GUI庫涉及面比較廣,需要有大量附加的數據結構比如XML,圖形處理,向量,插件,基本對象,日志等。我們應該再加一個輔助庫
于是有一個叫做Util的東西
其次我們主要的GUI庫類
這個是核心
我暫時給他起個名字叫coregui吧
這個是這個GUi的核心
其功能除了一般的GUI控件對象之后還應該有控件工廠,控件池(管理器),控件數據串行化,控件布局,控件編輯,控件動態加載,腳本處理等功能(想想功能還比較多-不過總比之前做的游戲引擎量要小很多)
分塊就這么幾個了
在開發過程中,我會一個一個GUI對象都貼上來,然后說明為什么要這樣做,并附上可能對應的設計模式(要活學活用(⊙v⊙)?)
PS:其實一個比較好的辦法是借助于UML,可是我現在忘了這幾個字母如何寫,有空學學吧