• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            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 閱讀(1452) | 評論 (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 閱讀(1663) | 評論 (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 閱讀(2157) | 評論 (5)編輯 收藏
             
            接上文:設計模式-簡單工廠 http://www.shnenglu.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 閱讀(1672) | 評論 (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 閱讀(1782) | 評論 (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 閱讀(1627) | 評論 (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 閱讀(1674) | 評論 (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 
             
            亚洲精品WWW久久久久久| 国产精品内射久久久久欢欢| 日产久久强奸免费的看| 久久强奷乱码老熟女网站| 亚洲欧美一区二区三区久久| 亚洲中文久久精品无码ww16| 国产午夜久久影院| 久久天天躁狠狠躁夜夜躁2014| 久久九九青青国产精品| 亚洲国产成人久久一区WWW| 久久精品国产亚洲AV嫖农村妇女| 国产精品美女久久久免费| 亚洲精品乱码久久久久久| 国产精品久久久99| 国产精品视频久久久| 久久人人爽人人爽人人av东京热 | 欧美激情一区二区久久久| 国产精品美女久久久| 三级三级久久三级久久| 国产一区二区精品久久凹凸| 国产精品女同久久久久电影院| 欧美久久久久久午夜精品| MM131亚洲国产美女久久| 国产亚洲精品久久久久秋霞 | 狠狠综合久久AV一区二区三区| 久久精品成人一区二区三区| 久久福利青草精品资源站| 亚洲国产欧美国产综合久久| 亚洲人成无码久久电影网站| 久久e热在这里只有国产中文精品99 | 久久精品国产亚洲麻豆| 青青草原精品99久久精品66| 久久人人爽人人爽人人片av麻烦| 久久影院亚洲一区| 久久高清一级毛片| 久久久久这里只有精品| 久久精品综合一区二区三区| 久久e热在这里只有国产中文精品99| 99精品伊人久久久大香线蕉| 国产成人精品久久亚洲高清不卡 国产成人精品久久亚洲高清不卡 国产成人精品久久亚洲 | 人妻无码αv中文字幕久久琪琪布 人妻无码久久一区二区三区免费 人妻无码中文久久久久专区 |