摘要: 代码如下:
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,可是我现在忘了这几个字母如何写,有空学学吧