• <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>

            戰魂小筑

            討論群:309800774 知乎關注:http://zhihu.com/people/sunicdavy 開源項目:https://github.com/davyxu

               :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
              257 隨筆 :: 0 文章 :: 506 評論 :: 0 Trackbacks

            #

            QtPropertyBrowser2.5中的字符串屬性對應的修改方式是一個輸入框,OnValueChange是在每次鍵入字符時發送一次.這個對于編輯器需要的邏輯來說是一種災難. Ogitor修改了其源碼,解決了這個問題:

            qteditorfactory.h 中

            QtLineEditFactory類添加如下代碼,紅色標識

            class QT_QTPROPERTYBROWSER_EXPORT QtLineEditFactory : public QtAbstractEditorFactory<QtStringPropertyManager>
            {
                Q_OBJECT
            public:
                QtLineEditFactory(QObject *parent = 0);
                ~QtLineEditFactory();
            protected:
                void connectPropertyManager(QtStringPropertyManager *manager);
                QWidget *createEditor(QtStringPropertyManager *manager, QtProperty *property,
                            QWidget *parent);
                void disconnectPropertyManager(QtStringPropertyManager *manager);
            private:
                QtLineEditFactoryPrivate *d_ptr;
                Q_DECLARE_PRIVATE(QtLineEditFactory)
                Q_DISABLE_COPY(QtLineEditFactory)
                Q_PRIVATE_SLOT(d_func(), void slotPropertyChanged(QtProperty *, const QString &))
                Q_PRIVATE_SLOT(d_func(), void slotRegExpChanged(QtProperty *, const QRegExp &))
                Q_PRIVATE_SLOT(d_func(), void slotSetValue(const QString &))
                Q_PRIVATE_SLOT(d_func(), void slotEditingFinished())
                Q_PRIVATE_SLOT(d_func(), void slotEditorDestroyed(QObject *))
            };
            
             
            qteditorfactory.cpp中
            class QtLineEditFactoryPrivate : public EditorFactoryPrivate<QLineEdit>
            {
                QtLineEditFactory *q_ptr;
                Q_DECLARE_PUBLIC(QtLineEditFactory)
            public:
            
                void slotPropertyChanged(QtProperty *property, const QString &value);
                void slotRegExpChanged(QtProperty *property, const QRegExp &regExp);
                void slotSetValue(const QString &value);
                void slotEditingFinished();
            };
            
            void QtLineEditFactoryPrivate::slotEditingFinished()
            {
                QObject *object = q_ptr->sender();
                const QMap<QLineEdit *, QtProperty *>::ConstIterator ecend = m_editorToProperty.constEnd();
                for (QMap<QLineEdit *, QtProperty *>::ConstIterator itEditor = m_editorToProperty.constBegin(); itEditor != ecend; ++itEditor)
                    if (itEditor.key() == object) {
                        QtProperty *property = itEditor.value();
                        QtStringPropertyManager *manager = q_ptr->propertyManager(property);
                        if (!manager)
                            return;
                        QString value = static_cast<QLineEdit*>(itEditor.key())->text();
                        manager->setValue(property, value);
                        return;
                    }
            }
            
            
            QWidget *QtLineEditFactory::createEditor(QtStringPropertyManager *manager,
                    QtProperty *property, QWidget *parent)
            {
            
                QLineEdit *editor = d_ptr->createEditor(property, parent);
                QRegExp regExp = manager->regExp(property);
                if (regExp.isValid()) {
                    QValidator *validator = new QRegExpValidator(regExp, editor);
                    editor->setValidator(validator);
                }
                editor->setText(manager->value(property));
            
                connect(editor, SIGNAL(editingFinished()),
                            this, SLOT(slotEditingFinished()));
                connect(editor, SIGNAL(destroyed(QObject *)),
                            this, SLOT(slotEditorDestroyed(QObject *)));
                return editor;
            }
            
             
            這樣既可在輸入回車鍵,或者輸入框失去焦點后產生一個OnValueChange事件
            posted @ 2011-05-06 21:11 戰魂小筑 閱讀(2905) | 評論 (1)編輯 收藏

            Git在網上炒的轟轟烈烈,很多人說它快,好,linux代碼庫都是用這個庫,強大而有保證.

            本人使用TortoiseHg 1.0 接近1年時間,感覺非常好.由于本人開發的引擎屬于私人代碼不開源,只希望在U盤及公司/家的電腦共享,因此一年前選擇了TortoiseHg,一直使用至今. 今天有幸看到TortoiseGit終于有hack方法支持中文,而且GUI也做的跟SVN一樣,適用了一下,但發現不能滿足我的需求.

            下面對比下TortoiseHg及TortoiseGit的優缺點

            1. TortoiseHg安裝簡單方便,1個exe搞定(這里只考慮Windows平臺)

                TortoiseGit相對麻煩點點,還需要外掛git. 這個對于SVN來說都沒這樣

            2. TortoiseHg Commit速度超快,雖然很多人說Hg是python寫的,但沒感覺慢

                TortoiseGit Commit同樣多的文件,GUI居然卡了沒響應,單個文件Commit也卡很久

            3. TortoiseHg在Commit時選擇Ignore,會彈出很強大的IgnorePattern,這比SVN要方便很多

                TortoiseGit則是和SVN一樣,可惜對于想忽略文件夾,還得自己手動打開ignorefile編輯

            4. TortoiseHg遠程共享可以直接使用TortoiseHg的webserver,只需一步操作即可,新版本(2.0) 支持SSH

                TortoiseGit的WindowsServer架設跟SVN一樣麻煩

            5. TortoiseHg 1.0里的多分枝合并問題很多,操作不當還會導致版本錯位, 希望2.0能好一點

                TortoiseGit 支持Rebase,這點很不錯

            6. Hg支持直接Push到一個帶.hg庫的文件夾而無需任何的server,這是Git望塵莫及的

                雖然Git支持一些安全的令牌及密碼,這點類似于SVN,但對于自己的代碼,這些過程就顯得過于強大而不方便了

            轉載請注明: 戰魂小筑

            總結: 本人的需求很簡單,并且只是簡單的使用TortoiseHg,不需要過多的功能. 這里沒有貶低TortoiseGit的意思. TortoiseGit的強大更適用于專業大型團隊及分散式開發,以替代SVN

            posted @ 2011-04-10 23:47 戰魂小筑 閱讀(7116) | 評論 (4)編輯 收藏

            • Game Team
              • 國外AI和Audio程序員所占的角色還是很重要的, 而國內AI都是服務器在做, Audio基本上沒有人下多少工夫
              • 美術的話TA越來越重要, 3D游戲開發不缺少
              • 另外, 項目管理也很重要, 程序員沒有那么多精力去關注這些事情
            • Game Engine
              • 引擎的三個特性: 數據驅動, 可復用, 可擴展
              • 流派
                • 第一人稱
                  • 寫實效果, 對于技術要求最高. 真實渲染, 高幀率, 物理模擬, 動畫和高智能AI, 多人游戲支持
                • 第三人稱
                  • 卡通效果, 豐富的動作, 可交互場景
                • 格斗游戲
                  • 大量的動作, 打擊判定, 角色渲染, 皮膚/布料/毛發渲染
                • 競速游戲
                • 即時戰略
                  • 地形支持. 復雜AI
                • 多人在線
                  • 服務器, 圖形效果要求低
                • 其他
              • 中間件
                • 游戲開發越來越多的使用到中間件, 沒有哪一個引擎能把所有的部分做到極致
                • 現在的引擎更像是一個容器, 各種第三方插件整合到一起
                • 就國內現狀來說, 用商業引擎的一般會再買幾個中間件, 不然功能不全; 用自研引擎的要么找開源的, 要么自己做
                • 典型的幾個中間件:
                  • Lighting: Beast/Enlighten
                  • Physics: Havok/PhysX/Bullet
                  • Animation: Granny/Havok/Edge
                  • AI: Kynapse/Xaiment
                  • UI: Scaleform/Iggy
                  • Video: Bink
                  • Audio: fmod/XACT/Miles
                  • Network: RakNet
              • Gameplay
                • 很多引擎是缺少這一層的, 可能OGRE的流行讓大部分人覺得渲染引擎就是游戲引擎吧?
                • 除了渲染, 像對象系統, 事件系統, 腳本系統, AI等也是一個游戲引擎不可缺少的部分
              • Pipeline
                • 這才是一個引擎具有競爭力的地方, 因為它直接關系到一個游戲的開發效率
                • 對于一個引擎來說, 畫面效果雖然重要, 但是pipeline比畫面和效率更為重要
                • 游戲開發是個不斷迭代的過程, 所以提高迭代的速度也意味著降低成本
                • 一個引擎, 不管什么都是圍繞著"資源"來進行的
              • Tools
                • 版本管理
                  • 最開始接觸的是SVN. 當然, 不可否認這是開源免費的最佳代表, 用來管理代碼還是不錯的. 但是用它管理美術資源無疑是個效率很低的選擇
                  • Git/Hg, 相比SVN我覺得更好用一些, TortoiseGit是我現在的首選. TortoiseHg用了一段時間, 跟TortoiseSVN的操作習慣差別太大, 而且界面還是python的, 不太習慣
                  • Perforce, 商業解決方案. 效率的確高(特別是美術二進制資源), 插件(VS/Max/Maya/PS)也不錯. 從SVN轉過來后老是對它某些細節有點不爽, 因為它不會主動對比文件差異, 這也是它為什么速度快的原因-_-
                • Profiling
                  • VTune/CodyAnalyst是兩上程序用的工具. 最近發現VS2010自代的也相當好用, 不做匯編級的分析的話完全夠用了
                  • PerfHUD/PIX/GPA: NV現在感覺對PerfHUD支持的少了. PIX如果程序寫法不標準會分析不了. GPA現在是越來越好用了, 要是把PIX的一些功能也吸收過去就更好了

            轉載自: 逍遙自在的CSDN博客 http://blog.csdn.net/xoyojank/archive/2011/04/10/6313422.aspx

            posted @ 2011-04-10 21:41 戰魂小筑 閱讀(1893) | 評論 (0)編輯 收藏

               Gizmo可以理解為坐標軸,就是3D軟件里3個軸并可以調整對象的各種變換屬性的東西.

                繪制Gizmo其實很簡單,這里只說箭頭的繪制中的一些技巧.一開始我的做法是MAX里建模,如圖

            image

            然后創建3個模型對象,以Z為父級(我的坐標系是Z朝上), X,Y分別掛接Z節點

            按照Ogitor中的介紹,需要將Z關閉繪制,結果,繪制順序有錯誤

            image

            正確的效果應該是藍色(Z軸,朝上)蓋住綠色的Y軸.

            這就涉及到X,Y,Z軸模型在Z關閉后的繪制順序,需要通過檢查對象的位置,按照從遠到近的順序進行繪制.

            但是一開始每個軸的單位坐標都是在箭頭的下部,因此,怎么旋轉攝像機,都只能出1個繪制順序.這就是問題所在. 因此,決定重新修改箭頭的本地坐標系,調整為下圖所示

            image

            MAX中,將箭頭作為本地坐標原點, 并修改排序算法,對Z關閉后的對象按照畫家算法排序,如圖:

            image

            繪制效果正確.

            解決這個問題時,我查閱了Ogitor代碼,并在Ogitor編輯器資源里找到了箭頭資源,但是代碼中并沒有用到這個資源,而是改用

            AxisGizmo::createMesh(Ogre::SceneManager *manager, Ogre::String name)

            函數用代碼方式創建Gizmo,估計也是和我碰到一樣的問題吧

            posted @ 2011-03-11 19:06 戰魂小筑 閱讀(1954) | 評論 (0)編輯 收藏

            從XP開始,多出了一套叫ApplicationData的目錄,由于是NT內核及多用戶的引用,因此在沒有管理員權限的帳號打開安裝過的程序時,應用程序是無法寫入自己的目錄的,因此早期的一些程序會因此遇到一些故障.

            解決這個問題的方法是獲取ApplicationData的目錄位置,根據自己應用程序的名稱創建配置文件.

            這些網上都能搜到,主要是使用SHGetFolderPath的API,這里要說下 int csidl這個參數的幾個區別:

            CSIDL_COMMON_APPDATA   所有用戶都可以使用的應用程序配置,映射All Users\Application Data

            CSIDL_APPDATA                指定用戶使用的應用程序配置,并且可以通過域同步漫游的,映射<user name>\Application Data

            CSIDL_LOCAL_APPDATA      本機使用,不能漫游的應用程序配置,映射<user name>\Local Settings\Applicaiton Data

            另外,由于這些路徑使用起來并不方便,因此一般我們還是習慣在應用程序下存儲配置文件,這就涉及一個檢測是否應用程序文件夾有寫權限的問題.

            我嘗試過:

            int _waccess( 
               const wchar_t *path, 
               int mode 
            );
              MSDN里說這個函數可以用于判定一個文件夾是否有寫權限,但是實際測試中,這個函數對于有權限控制的文件夾毫無作用,始終返回可寫.
              因此,最笨的方法,依然是直接在應用程序目錄下創建一個臨時文件,創建成功說明可寫,然后再刪除這個文件(好惡心的方法).不過話又說回來,這是C時代的函數,應該不會做太多平臺相關的判斷.
             
            posted @ 2011-03-09 16:38 戰魂小筑 閱讀(2631) | 評論 (0)編輯 收藏

            程序員的3種美德: 懶惰、急躁和傲慢(Laziness, Impatience and Hubris)

            Laziness

            The quality that makes you go to great effort to reduce overall energy expenditure. It makes you write labor-saving programs that other people will find useful, and document what you wrote so you don't have to answer so many questions about it. Hence, the first great virtue of a programmer, Also hence, this book.

            懶惰:

            是這樣一種品質,它使得你花大力氣去避免消耗過多的精力。它敦促你寫出節省體力的程序,同時別人也能利用它們。為此你會寫出完善的文檔,以免別人問你太多問題。

            Impatience

            The anger you feel when the computer is being lazy. This makes you write programs that don't just react to your needs, but actually anticipate them. Or at least pretend to. Hence, the second great virtue of a programmer.

            急躁:

            是這樣一種憤怒——當你發現計算機懶洋洋地不給出結果。于是你寫出更優秀的代碼,能盡快真正的解決問題。至少看上去是這樣。

            Hubris

            Excessive pride, the sort of thing Zeus zaps you for. Also the quality that makes you write (and maintain) programs that other people won't want to say bad things about. Hence, the third great virtue of a programmer.

            傲慢:

            極度的自信,使你有信心寫出(或維護)別人挑不出毛病的程序。

             

            轉自http://blog.csdn.net/arbuckle/archive/2007/01/05/1475009.aspx

             

            上面3點越是厲害,說明你的程序員功力,火候不淺.對, 好程序員就是很認真很仔細的

            posted @ 2011-02-14 22:33 戰魂小筑 閱讀(2511) | 評論 (5)編輯 收藏

            http://pinnawhite.com/weblog/?p=2145

            世界游戲革命

            介紹日本游戲開發與美國的區別,片中你能見識全世界游戲開發方式及工作環境和理念,做游戲開發的童鞋不能錯過這個視頻

            posted @ 2011-01-15 21:30 戰魂小筑 閱讀(980) | 評論 (1)編輯 收藏

            Qt下的屬性控件QtPropertyBrowser在Google中資料很少,而且在很多介紹的文章里的下載地址都指向了QtMobility,這個東西跟非手機平臺沒有太大關系。找了很久,發現在http://qt.nokia.com/downloads頁面的右下角有一個FTP鏈接:

            ftp://ftp.qt.nokia.com/

            提示也寫著在這里可以下載到以前的一些Qt包

            在里面終于可以找到qtpropertybrowser-2.5_1-opensource.zip

            下載后,用VisualStudio的Qt插件打開pro,有例子有設置好的工程,還愁文檔么,呵呵

            posted @ 2010-12-31 22:36 戰魂小筑 閱讀(4920) | 評論 (1)編輯 收藏

            這里使用的是VC2008編譯exe,其中要鏈接VC2005編譯的靜態庫,編譯,鏈接都無問題。運行后出現無法找到Manifest問題。按照傳統,查看用戶機是否使用FAT32格式分區,勾選解決FAT32選項依然無效。屏蔽新鏈接庫,運行又正常,所以問題出現在靜態庫本身。但是靜態庫編譯時無法關閉和控制Manifest。

            Google之,找到這樣一篇文章

            http://connect.microsoft.com/VisualStudio/feedback/details/362837/migrating-from-microsoft-vc80-crt-manifest-to-microsoft-vc90-crt-manifest

            突然想到,靜態庫編譯器與exe編譯器不統一,馬上重新使用2008編譯靜態庫,問題解決

             

            總結:

            VC6時期沒有Manifest,那個時候編譯出的lib都可以給現在的編譯器用,2003也勉強,但是2005還沒做完善,2008就是2005的大補丁,所以以后庫用2008編譯都應該沒有問題

            posted @ 2010-11-22 12:05 戰魂小筑 閱讀(2527) | 評論 (7)編輯 收藏

            調試中總會遇到這樣的情況,比如,需要調試一個被另外一個進程啟動的程序。最簡單的方法莫過于直接在IDE中Attach到進程,但是這樣的方法做一次還行。要是一直需要調試,編譯后需要再調試,就會讓你抓狂。

            平時安裝有VC IDE的機器一定會碰到這樣的情況:如果程序有crash,會彈出一個JIT的調試對話框,詢問使用何種調試器進行調試。這種情況同樣會出現在使用dump文件時。這個對話框也是我們今天需要用到的。

            如果需要調試一個被另外進程啟動的進程,那么需要讓這個被啟動的線程能啟動調試器,方法如下:

            假定我們需要調試的應用程序名稱為myapp.exe

             

            1. 打開注冊表

            2. 在HKEY_LOCAL_MACHINE\Software\Microsoftware\Windows NT\CurrentVersion\Image File Execution Options中尋找myapp.exe文件夾

            3. 如果這個文件夾不存在,那么就新建一個,例如:myapp.exe

            4. 在文件夾里新建一個字符串鍵,名稱為debugger,值為vsjitdebugger.exe

            5. 如果使用的不是VC調試器,那么需要在環境變量中添加這個exe的啟動路徑

             

            運行你需要被調試的程序試試吧,爽了吧!

             

            轉載請注明此文來自 戰魂小筑博客 http://www.shnenglu.com/sunicdavy

            posted @ 2010-11-16 21:22 戰魂小筑 閱讀(2708) | 評論 (4)編輯 收藏

            僅列出標題
            共26頁: First 9 10 11 12 13 14 15 16 17 Last 
            亚洲av成人无码久久精品| 亚洲Av无码国产情品久久| 97久久精品国产精品青草| 久久综合丁香激情久久| 久久精品国产久精国产一老狼| 久久精品成人免费网站| 午夜精品久久久久久久无码| 亚洲婷婷国产精品电影人久久| 久久国产成人精品国产成人亚洲| 久久国产成人精品麻豆| 亚洲性久久久影院| 久久精品国产99国产精品澳门 | 77777亚洲午夜久久多人| 久久青青草原精品国产软件| 国产无套内射久久久国产| 久久精品国产亚洲av影院| 99蜜桃臀久久久欧美精品网站 | 久久午夜福利无码1000合集| 亚洲精品乱码久久久久久不卡| 嫩草伊人久久精品少妇AV| 日韩av无码久久精品免费| 精品人妻伦九区久久AAA片69| 亚洲精品乱码久久久久久按摩 | 色播久久人人爽人人爽人人片aV| 99久久国产热无码精品免费| 国产一区二区精品久久| 99久久国产综合精品女同图片| 久久精品国产99国产精品| 香蕉99久久国产综合精品宅男自| 久久91精品国产91久久麻豆| 色8久久人人97超碰香蕉987| 久久精品人成免费| 久久青青草原精品国产软件| 99久久免费只有精品国产| 国产精品欧美久久久久天天影视| 久久久久久毛片免费播放| 亚洲国产精品无码久久98| 亚洲精品高清国产一线久久| 亚洲国产精品无码久久98| 伊人久久大香线焦AV综合影院| 国产色综合久久无码有码|