一般来说 原型方法主要使用于快速生成和已存在对象基本一致的对象。
一般典型的例子是细胞分裂和孙悟空变换出N的小猴子
不过我这里举一个在GUI设计过程的例子
假如一个面板上的同质按钮,他们仅文本不同,代表的逻辑不同,其他信息是完全一致的,比如皮肤,边框,大小等
按照一般方法可能会这样构造面板
Button* btn1 = new Button();
btn1->SetSize(..);
btn1->SetBorder(..);
btn1->SetListener(..);
btn1->SetVisible(true);
btn1->SetParent(panel);
btn1->SetColor()
Button* btn2 =..
当然还有其他按钮:)
是不是很烦?
借助原型模式
可以大大的简化!
比如:
Button *btn1 = new Button(panel);
Button *btn2= btn1->Clone();
Button *btn3= btn1->Clone();
Button *btn4= btn1->Clone();
然后只要设置各个按钮对应的文本即可
为了使用原型方法我们需要做的仅仅是
给对象增加Clone接口和其实现即可
比如:
class AbstractWidget
{
public:
virtual AbstractWidget* Clone() = 0;
};
需要说明的是原型一般使用的是浅拷贝
今天晚上试着在个人电脑上搭建了Android就说说具体的步骤吧
1.首先下载eclipse包。地址:http://download.actuatechina.com/eclipse/technology/epp/downloads/release/helios/SR2/eclipse-java-helios-SR2-win32.zip
2.解压,点击eclipse.exe 出现错误提示没有安装java包
3.下载java包。地址:http://download.oracle.com/otn-pub/java/jdk/6u25-b06/jdk-6u25-windows-i586.exe
4.点击安装。完成后启动eclipse
5.点击菜单Help->install new software 增加新的repository,名字随便起个
地址为:https://dl-ssl.google.com/android/eclipse/
安装ADT
6.安装完成后restart eclipse会发现window菜单多了一栏:Android SDK and AVD Manager
7.下载 Android sdk 地址为:http://dl.google.com/android/android-sdk_r08-windows.zip
8.解压,点击其中的SDK Manager.exe 下载其他关键包
9.点击eclipse window perfercences 中的android设置android sdk路径
成功后下面的列表框会出现安装信息比如:Target name,Vendor 和 Paltform API
10.点击Apply
11.最后还需要设置模拟器 具体为打开Android SDK and AVD Manager 点击左侧的Virtual Devices
然后点击右侧的New按键 按照要求填入信息即可
12.现在就可以编写Android程序并在模拟器上跑了
不过模拟器启动很慢 一般都是在真机上做测试
早在2008年底我就想做一套完整的GUI库,搞笑的是当时我以为游戏中的所有控件都是
使用win32做的。看了Opengl游戏编程附带的代码,才搞清楚了不是这个样子的滴(感觉当时很肤浅哈哈)
之后我就打算自己开发一个玩玩,尽管我很努力,但是水平太菜,做不出来(不过我有一个特点就是说干就干,这点很赞)
大致到了2009年年底,技术积累达到了一定的高度,也查看了很多的gui库,基本上能够做出来成型的GUI了(至于能不能用,这是一个问题)
去年中期,才拿出了一个成套的GUI,虽然不是特别好,但是基本能用,另外对GUI各块机理也有了很好的认识(比如字体渲染,控件架构,对象序列化,事件处理等)
但是这块有几个问题:
1。对象序列化是基于模板的,这块有益处也有弊端
2。只能支持控件换肤,不能支持完备的控件序列化
3。.做出来的控件太丑了-不具有漂亮的脸蛋
现在决定做一个独立,开源,完备,漂亮,方便,易用,容扩展的一个GUI
说他独立:是考虑把这个做成一个类似于个人做的音频引擎,不依赖于游戏引擎
说他开源:这个好解释
说他漂亮:就是做出来的界面一定要美观,否则就是一坨屎
说他易用:是指容易使用,包括支持控件资源皮肤资源等
说他易扩展:是指其由若干模块构成,容易增加新的接口,不依赖于具体渲染API和平台
当然编辑器也应该有的
在开发过程中将详细讲解GUI开发中遇到的各类问题,包括所有控件,接口,事件处理,对象布局,设计的设计模式等细节
同时尽可能得附上代码
如果感觉写的不对请随时指正
另外:今年看了大量的QT和Android例子,吸收了不少养分
关于开发时间:慢慢来吧,兴趣所致,走走看吧
之前开发的引擎不打算再做了,涉及面太大,精力太少
在可预见的时间内,我想继续维护音频API,GUI库和另外一个软件
接上文:设计模式
-简单工厂 http://www.cppblog.com/gaimor/archive/2011/05/02/145498.html 简单工厂是根据传入要求决定生产那类产品,其工厂只有一个
在简单工厂基础之上,如果一个工厂对应一个产品则形成了工厂方法
interface Product
{
public void Call();
};
public class Product1 implements Product
{
public void Call()
{}
};
public class Product2 implements Product
{
public void Call()
{}
};
interface ProductFactory
{
public Product GetProduct();
};
public class ProductFactory1 implements ProductFactory
{
public Product GetProduct()
{
return new Product1();
}
}
public class ProductFactory2 implements ProductFactory
{
public Product GetProduct()
{
return new Product2();
}
}
这样使用
ProductFactory factory1 = new ProductFactory1();
Product p1 = factory1.GetProduct();
ProductFactory factory2 = new ProductFactory2();
Product p2 = factory2.GetProduct();
可以看出工厂方法中工厂和产品总是一一对应的
一个工厂只能生产一个产品
很显然工厂方法最大的弊端就在这里.
使用的场合:
一个对象希望由子对象来指定它所创建的对象时,可以使用工厂方法PS:系统那个总结下设计模式
这段时间在学习Android,也要学点jav方面的编程知识
乘着这个机会,俺就总结下学过和使用过的设计模式,并使用java写下
先说简单工厂
简单工厂属于工厂模式的一种,不过似乎不在GOF模式之列.
一句话描述:简单工厂就是根据给定要求生成给定对象
简单的java版本代码如下:
public interface Product
{
abstract public void Call();
};
public Pen implements Product
{
public void Call()
{
}
};
public Book implements Product
{
public void Call()
{
}
};
public clas Factory
{
public Product CreateProducrt(String name)
{
if(name.equals("Pen"))
return Pen.class.newInstance();
else if(name.equals("Book"))
return Book.class.newInstance();
return null;
}
};
简单工厂就是根据输入标签返回给定的对象实例
很显然,简单工厂的主要缺陷就在于:如果需要增加一个新的产品那就需要修改其产品生成函数
另外,如果把工厂和产品对象合二为一就变成了如下的形式:
public class Object
{
public static ObjectCreateObject(String name);
other function.
};
这类似于MFC中CObject
简单工厂的一个使用例子如下(之前我写的GUI):
class WidgetFactory
{
public:
Widget* CreateWidgetByName(const std::string& name);
};
在这里如果传入Spin则返回一个new Spin,传入一个Slider则返回一个new Slider对象
如果我增加一个新的Widget对象,则需要把CreateWidgetByName函数修改下(当然可以使用Object::CreateObject(name)函数,只是返回的对象需要做类型转换,原则一致)
下篇说说抽象工厂和工厂方法吧
之前在博客园见到过别人发的关于Android的帖子,当时只记得是关于手机开发的。
没想到现在洒家也要学这个了。
不过还好经过1周多的学习,感觉Android还是很简单的。
Android的基本概念
1.Activity
2,Intent
3.Content Privoder
4.BroadCast Revicer.
5..
接上文.
Tremolo音效比较酷的音效,听上去感觉是使用电子乐器演示的。
从感官上将Tremolo(颤音)音效是重击一个音符然后快速提高,减小音量
下面是颤音音效的几个参数:
1.深度控制:用来控制音量增减速度
2.阈值数据:说明控制音量的频率值
3.波形
其基本数学表达式为:
data = data * (1.0 + depth * sin(k* rate * index));
简易的c++代码如下:
class Tremolo : public AudioEffect
{
public:
static double def_depth;
static double def_rate;
double depth;
double rate;
double k;
Tremole();
std::vector<float> Filter(const std::vector<float>& _data)
{
data = _data;
for(int i = 0; i < data.size();i++)
data[i] *= (1.0 + depth * sin(2.0 * PI * rate * i / k);
return data;
}
};
当然有java版本的化应该是如下这个样子:
public class Tremolo extends AudioEffect
{
private static double final def_depth = ;
private static double final def_rate = ;
private double depth = def_depth;
private double rate = def_rate;
Tremolo()
{
}
double[] Filter(double[] _data)
{
int len = _data.length;
double[] ret = new double[len];
for(int i = 0;i<len;i++)
ret[i] = _data[i]*(1+depth*Math.Sin(2*Math.PI*rate*i/k));
return ret;
}
}
基本的源码就这个样子
不过有一个问题就是播放音效有少许杂音-不过不是大问题
之前做的音频API都是使用的第三方的库或者代码
不过这段时间一直比较忙
没什么时间来玩玩音频引擎了
不过为了不至于本博客长草
我就整理下以前接触过的音频处理这块吧
首先上一个简单的音效基类吧
class AudioEffect
{
public:
virtual ~AudioEffect(){}
virtual std::vector<float> Filter(const std::vector<float>& data) = 0;
protected:
std::vector<float> data;
};
通过调用Filter就可以获取给定pcm处理后的音效数据
然后再谈下什么是Distortion音效
Distortion主要使用于电吉他等电子类乐器,
Distortion音效主要有以下参数:
1.edge 临界值
2.gain 增益
3.低通剪切值(当然还有其他几个参数,...)
其简易化的音效处理原则就是
使用使用给定临界值对原有数据做Clamp处理
简单的例子如下:
#define DISTORTION_RATE 100.0
#define DISTORTION_THRESHOLD 0.4
class Distortion : public AudioEffect
{
public:
Distortion()
{
gain = DISTORTION_RATE;
value = DISTORTION_THRESHOLD;
}
std::vector<float> Filter(const std::vector<float>& data_)
{
this->data.clear();
for(int i = 0; i < data_.size(); i++)
{
float v = data_[i]*gain;
if(v > value)
v = value;
if(v < - value)
v = -value;
data.push_back(v);
}
reutrn data;
}
private:
float gain;
float value;
};
看上去似乎很简单
那处理后的音效如何? 试试就知道了
接下来还有reverb,ring,echo,chorus等音效算法和音频傅里叶变换等
等弄完了这些,音频引擎也就该升级了(我早已构思好了下个版本的音频API功能了)
下篇tremolo音效
包
import android.media.AudioManager;
获取
AudioManager audiomanage = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE);
音量增大和减小(一个单位)
audiomanager.adjustVolum(AudioManager.ADJUST_LOWER,0);
audiomanager.adjustVolum(AudioManager.ADJUST_RAISE,0);
Styles是QT自带的例子 - 主要展示的是QT程序界面风格方面的编程知识
1.程序调色板的获取
使用QApplication中的静态函数
QApplication::palette
palette有2个版本一个是给定的调色板,另外一个给定的调色板
对应的调用
QApplication::setPalette
就可以设置新的程序调色板
如果使用自定义的Palette就可以达到修改界面色调的目的
比如:
2.QStyleFactory对象
The QStyleFactory class creates QStyle objects.可以通过静态函数QStyleFactory::key()获取工厂所支持的风格名字列表(注意是列表,返回类型是QStringList)
当然可以通过函数cerate来生成新的风格指针
3.QComboBox 组合框
主要函数有以下几个:
通过函数addItem增加新项
通过addItems增加新项列表
通过插槽绑定就可以传递响应了:
connect(combobox,SIGNAL(activated(QString)),this, SLOT(changeComBox(QString)));
其他三个可能会用到的函数
currentIndex,count, currentText
4.QT计时器
拿例子说下:
QTimer *timer = new QTimer(this);
connect(timer, SIGNAL(timeout()), this, SLOT(advanceProgressBar()));
timer->start(1000);
首先构造一个计时器 然后绑定计时器对象和槽函数
之后启用计时器-每隔1秒钟调用advaceProressBar函数
如果想停止计时器则调用stop函数即可
5.
QProgressBar进度条对象
基本的函数就那些
设置方向,当前值,最大值最小值,文本,可见性等等
progressBar = new QProgressBar;
progressBar->setRange(0, 10000);
progressBar->setValue(0);
其槽函数为
valueChanged ( int value )
6.单选按钮QRodioButton
例子如下
topLeftGroupBox = new QGroupBox(tr("Group 1"));
radioButton1 = new QRadioButton(tr("Radio button 1"));
radioButton2 = new QRadioButton(topLeftGroupBox);
radioButton2->setText(tr("Radio button 2"));
radioButton3 = new QRadioButton(tr("Radio button 3"));
radioButton1->setChecked(true);
layout->addWidget(radioButton1);
layout->addWidget(radioButton2);
layout->addWidget(radioButton3);
似乎没什么可说的
7.QTableWidget控件
The QTableWidget class provides an item-based table view with a default model.
需要说明的是如果要使用自定义类型,则需要使用QTableView而非QTableWidget.
tableWidget = new QTableWidget(this);
tableWidget->setRowCount(10);
tableWidget->setColumnCount(5);
不过感觉以后不会使用这个对象
8.QLineText
QT的单行输入控件
具体函数有(似乎不需要说功能了)
QString text() const;
QString displayText() const;
int maxLength() const;
void setMaxLength(int);
bool isReadOnly() const;
void setReadOnly(bool);
bool isModified() const;
void setModified(bool);
9.
Q_INIT_RESOURCE(styles
);
加载资源文件
styles.qrc