Cpper
C/C++高级工程师 Android高级软件工程师 IT集成工程师 音频工程师 熟悉c,c++,java,c#,py,js,asp等多种语言 程序猿

一般来说 原型方法主要使用于快速生成和已存在对象基本一致的对象。
一般典型的例子是细胞分裂和孙悟空变换出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
     
};

需要说明的是原型一般使用的是浅拷贝
posted @ 2011-05-06 22:22 ccsdu2009 阅读(1436) | 评论 (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程序并在模拟器上跑了
不过模拟器启动很慢 一般都是在真机上做测试

posted @ 2011-05-06 22:06 ccsdu2009 阅读(1651) | 评论 (0)编辑 收藏
 

早在2008年底我就想做一套完整的GUI库,搞笑的是当时我以为游戏中的所有控件都是

使用win32做的。看了Opengl游戏编程附带的代码,才搞清楚了不是这个样子的滴(感觉当时很肤浅哈哈)

之后我就打算自己开发一个玩玩,尽管我很努力,但是水平太菜,做不出来(不过我有一个特点就是说干就干,这点很赞)

大致到了2009年年底,技术积累达到了一定的高度,也查看了很多的gui库,基本上能够做出来成型的GUI了(至于能不能用,这是一个问题)

去年中期,才拿出了一个成套的GUI,虽然不是特别好,但是基本能用,另外对GUI各块机理也有了很好的认识(比如字体渲染,控件架构,对象序列化,事件处理等)

但是这块有几个问题:
1。对象序列化是基于模板的,这块有益处也有弊端
2。只能支持控件换肤,不能支持完备的控件序列化
3。.做出来的控件太丑了-不具有漂亮的脸蛋

现在决定做一个独立,开源,完备,漂亮,方便,易用,容扩展的一个GUI
说他独立:是考虑把这个做成一个类似于个人做的音频引擎,不依赖于游戏引擎
说他开源:这个好解释
说他漂亮:就是做出来的界面一定要美观,否则就是一坨屎
说他易用:是指容易使用,包括支持控件资源皮肤资源等
说他易扩展:是指其由若干模块构成,容易增加新的接口,不依赖于具体渲染API和平台
当然编辑器也应该有的

在开发过程中将详细讲解GUI开发中遇到的各类问题,包括所有控件,接口,事件处理,对象布局,设计的设计模式等细节

同时尽可能得附上代码
如果感觉写的不对请随时指正

另外:今年看了大量的QT和Android例子,吸收了不少养分
关于开发时间:慢慢来吧,兴趣所致,走走看吧

之前开发的引擎不打算再做了,涉及面太大,精力太少
在可预见的时间内,我想继续维护音频API,GUI库和另外一个软件
posted @ 2011-05-05 22:52 ccsdu2009 阅读(2150) | 评论 (5)编辑 收藏
 
接上文:设计模式-简单工厂 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:系统那个总结下设计模式
posted @ 2011-05-05 22:27 ccsdu2009 阅读(1663) | 评论 (0)编辑 收藏
 
这段时间在学习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)函数,只是返回的对象需要做类型转换,原则一致)

下篇说说抽象工厂和工厂方法吧
posted @ 2011-05-02 16:57 ccsdu2009 阅读(1770) | 评论 (0)编辑 收藏
 

之前在博客园见到过别人发的关于Android的帖子,当时只记得是关于手机开发的。
没想到现在洒家也要学这个了。

不过还好经过1周多的学习,感觉Android还是很简单的。

Android的基本概念
1.Activity
2,Intent
3.Content Privoder
4.BroadCast Revicer.
5..
posted @ 2011-04-30 23:00 ccsdu2009| 编辑 收藏
 
接上文.
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;        
    }
}    
基本的源码就这个样子
不过有一个问题就是播放音效有少许杂音-不过不是大问题
posted @ 2011-04-26 22:42 ccsdu2009 阅读(1619) | 评论 (0)编辑 收藏
 

之前做的音频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音效
posted @ 2011-04-25 22:48 ccsdu2009 阅读(1648) | 评论 (0)编辑 收藏
 

import android.media.AudioManager;
获取
AudioManager audiomanage = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE);
音量增大和减小(一个单位)
audiomanager.adjustVolum(AudioManager.ADJUST_LOWER,0);
audiomanager.adjustVolum(AudioManager.ADJUST_RAISE,
0);



posted @ 2011-04-22 21:02 ccsdu2009| 编辑 收藏
 
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(010000);
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

posted @ 2011-03-20 12:19 ccsdu2009| 编辑 收藏
仅列出标题
共38页: First 19 20 21 22 23 24 25 26 27 Last