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

            #

            Patch

            patch只是顯示當前版本發生了怎樣的變化,基于文本。例如:

            文本變化:

            del /s /q game\bin\*.lib
            del /s /q game\bin\*.dll
            +
            \ No newline at end of file

             

            二進制變化:

            diff -r 2f3c677ed7ab -r c0efe12f9de3 game/bin/091208A002.jpg
            Binary file game/bin/091208A002.jpg has changed

            對于hg來說,據我所了解,無法像svn那樣apply一個patch。hg的patch可以在提交后從log中提取

            而svn的patch只能在未提交前提取,svn在這點上顯然有些麻煩。

             

            Bundle

            bundle包含了版本修改的所有信息,包括二進制。其本身基于二進制,無法閱讀,可以通過Repository Explorer的Add Bundle來將修改打入你的版本庫。但須注意Bundle之間必須連續,如果當中跳過任何一個Bundle,都是無法成功完整的打入你的版本庫的

            posted @ 2010-01-29 15:56 戰魂小筑 閱讀(2504) | 評論 (0)編輯 收藏

                  鑒于使用HgSubversion無法從SVN服務器獲取版本,我找到了另外一個方法能解決公司使用SVN與自己攜帶方式編碼的平衡點:同時使用SVN與HG進行代碼管理。

                  在現有的SVN文件夾下,創建HG的代碼庫,編輯.hgignore文件,一般對于VC項目,可以這樣參考這樣的寫法

            *中文為注釋,不要寫入文件

            glob:.hgignore             忽略.hgignore本身
            glob:.svn                    忽略所有的svn管理文件
            glob:*.user                 本地用戶配置文件
            glob:*.suo                  solution本地配置文件
            glob:*.ncb                  Intelisence庫
            glob:*.exe                  exe可以由代碼生成
            glob:*.dll                    dll可以由代碼生成
            glob:game/Lib             直接忽略lib里所有文件
            glob:game/Obj            直接忽略obj里所有文件

            這里的glob就是通配符,也可以使用工具做正則表達式

            .hgignore可以由烏龜shell菜單中的Edit ignore filter來管理,而且還可以時時查看修改情況,可惜的是右邊的結果居然沒有排序功能……所以我的一般做法是直接在根目錄Commit,在列表中查看filter結果是否正確

             

            確認無誤后,直接將代碼提交到hg代碼庫,以后代碼做修改時,SVN與HG會同時偵測到文件修改。一般可以自己認為HG是大的版本,而SVN是小的版本即可。 當需要帶走版本時,只需要直接拷貝hg目錄,或者用clone指令即可。別人需要獲得一份干凈的穩定版本,也可以新建一個HG版本庫,從這個混合庫中pull過去

             

            這種做法在git+svn也是一樣的,:)

            posted @ 2010-01-29 11:55 戰魂小筑 閱讀(5488) | 評論 (4)編輯 收藏

                 當我們的代碼寫的差不多,需要提交給其他人怎么辦?這里可以將自己的電腦作為WebServer:

                 在要共享的hg版本庫目錄中命令行中鍵入

                 hg serve

                 或者在烏龜中選擇WebServer一項,就可以將本機作為WebServer,在瀏覽器中敲入http://127.0.0.1:8000就可以訪問自己的代碼庫

                 另外一個代碼庫可以通過pull指令,或者在烏龜的Repository Explorer中鍵入這個地址,然后使用pull菜單命令直接獲取更新,然后再update,將庫中最新的更新變為代碼

                這里有詳細教程

             

                bundle,查看文檔和菜單時,經常看到這個詞。它是changeset的一個集合文件,可以使用Incoming來導入

               

                patch, 這種文件一般是文檔,可以查看修改,貌似可以和其他代碼管理工具通用

             

                Hg權限管理貌似只有Web Server 配置里的Alllw Push, Deny Push兩種方法,但是你的庫只要打開,對于別人來說就等于完全訪問,這一塊也貌似沒有人研究過,確實沒有權限管理?

            posted @ 2010-01-29 10:44 戰魂小筑 閱讀(2336) | 評論 (2)編輯 收藏

                今天試用了下Mercurial(簡稱Hg)分布式代碼管理系統,查了下,居然烏龜這家公司做的WindowsShell,趕快下載

                Hg比Svn最大的優勢就是在于

                1. 分布式代碼管理,無需服務器hosting(當然也支持這種方式)

                2. 只在根目錄有1個hg目錄用于代碼管理,其他目錄都很干凈。這點是svn的最大詬病,尤其是這些目錄都保存有文件的修改base,所以對于一些很大的二進制文件,一般目錄大小會是常規的2倍

                 安裝好后,直接選一個空目錄建立一個版本庫,直接在版本庫里就可以添加文件并commit,這點跟svn就不一樣了,還得分清楚客戶端和服務器。

                 如果需要從原來的svn庫導入到Hg的庫,只需要用convert指令就可以。但是實際操作中,發現好像這個過程并不需要密碼……

                 有一個叫hgsubversion的庫,可以從svn中將代碼pull過來,也可以push回去。但是在我的VisualSVN Server中pull時,反復提示輸入帳號及密碼,實在不清楚是為什么。

                 總結:公司做項目,用svn比較適合,畢竟Hg的分布式代碼管理不是那么多人都會用而且有這個習慣,svn能統一習慣,再者,公司都是局域網,速度不成問題。如果是和幾個朋友一起寫代碼,交流只能靠網絡,而且網速不是很理想時,Hg就是很好的選擇

            posted @ 2010-01-28 17:06 戰魂小筑 閱讀(2123) | 評論 (3)編輯 收藏

            前段時間曾經碰到過RT紋理繪制出來時需要透明的問題。當時也Google了一下,但是很少有人提起過這個問題。昨天看劍孤寒的空間的Galaxy2D引擎中使用RT的透明繪制,文章在這里。發現這個特性居然需要顯卡支持,馬上查過DX9SDK文檔,發現這樣一篇文章,已經告訴我們怎么做了:

            Render Target Alpha (Direct3D 9)

            The frame buffer blender can now blend alpha channels independent from color-channel blending on render targets. This control is enabled with a new render state, D3DRS_SEPARATEALPHABLENDENABLE.

            When D3DRS_SEPARATEALPHABLENDENABLE is set to FALSE (which is the default condition), the render-target blending factors and operations applied to alpha are the same as those defined for blending color channels. A driver needs to set the D3DPMISCCAPS_SEPARATEALPHABLEND cap to indicate that it can support render-target alpha blending. Be sure to enable D3DRS_ALPHABLEND to tell the pipeline that alpha blending is needed.

            To control the factors in the alpha channel of the render-target blenders, two new render states are defined as follows:

            D3DRS_SRCBLENDALPHA 
            D3DRS_DESTBLENDALPHA 
            

            Like the D3DRS_SRCBLEND and D3DRS_DESTBLEND, these can be set to one of the values in the D3DBLEND enumeration. The source and destination blend settings can be combined in several ways, depending on the settings in the SrcBlendCaps and DestBlendCaps members of D3DCAPS9.

            The alpha blending is done as follows:

            renderTargetAlpha = (alphain* srcBlendOp) BlendOp (alphart* destBlendOp) 
            

            Where:

            • alphain is the input alpha value.
            • srcBlendOp is one of the blend factors in D3DBLEND.
            • BlendOp is one of the blend factors in D3DBLENDOP.
            • alphart is the render-target alpha value.
            • destBlendOp is one of the blend factors in D3DBLEND.
            • renderTargetAlpha is the final blended alpha value.

             

            翻譯如下:

               使用 D3DRS_SEPARATEALPHABLENDENABLE渲染狀態可以讓Frame Buffer 混合器將RT中的Alpha通道與顏色通道分開混合。

            當D3DRS_SEPARATEALPHABLENDENABLE 設置為 FALSE(默認),RT渲染參數和操作會跟顏色通道一樣被應用到Alpha通道。 這項特性需要顯卡支持D3DPMISCCAPS_SEPARATEALPHABLEND 特性。記住,在之前設置D3DRS_ALPHABLEND以便打開Alpha混合。

               RT混合器的Alpha通道混合因子渲染狀態如下:

            D3DRS_SRCBLENDALPHA

            D3DRS_DESTBLENDALPHA

            其被定義在D3DBLEND枚舉中,D3DRS_SRCBLEND 和D3DRS_DESTBLEND也是這樣定義的。來源色與目標顏色將會有很多組合方式,主要依賴于D3DCAPS9中的SrcBlendCaps 和DestBlendCaps

            Alpha混合公式如下:

            renderTargetAlpha = (alphain* srcBlendOp) BlendOp (alphart* destBlendOp)

            其中:

                alphain為輸入alpha值

                srcBlendOp是D3DBLEND中的一個混合因子

                BlendOp是 D3DBLENDOP中的一個混合因子

                alphart是RT的alpha值

                destBlendOp是D3DBLEND中的一個混合因子

                renderTargetAlpha是最后混合后的alpha值

            posted @ 2010-01-20 16:56 戰魂小筑 閱讀(2871) | 評論 (1)編輯 收藏

            早上打開GR閱讀新聞時還是中文版,剛才刷新了下,全變英文版了,有圖有真相

            image

            而昨天下午,Google.cn又解除了對中國的搜索屏蔽,不得不覺得Google太杯具了。

            最近在看李開復自傳,還沒看到谷歌那章,但已經在微軟那節感覺中國GOV實在不是什么好BIRD。

            那天問女友為什么一直喜歡用Chrome和谷歌,她說,Google的logo好看,百度的太丑。我想,也許Google不僅僅是logo好看,即便在中國被過濾,但其不作惡的作風,還有給用戶提供最新的技術(Google Earth,Google 地圖搜索中的面部識別,Chrome)上,我永遠支持Google

            posted @ 2010-01-15 11:16 戰魂小筑 閱讀(2951) | 評論 (11)編輯 收藏

            前幾天需要做一個鼠標點擊判定,具體是判斷一個點是否在某個凸四邊形中。

            最簡單的方法莫過于判斷鼠標點是否在2個三角形中。但是很多判定方法都是有問題的,比如說

             

            copy自IndieLib

            bool Triangle2D::Inside2( const Vector2& p )
            {
                Vector2 v0 = mP3 - mP1;
                Vector2 v1 = mP2 - mP1;
                Vector2 v2 = p - mP1; 
            
                // Compute dot products
                float dot00 =  Vector2::DotProduct( v0, v0 );
                float dot01 =  Vector2::DotProduct( v0, v1 );
                float dot02 =  Vector2::DotProduct( v0, v2 );
                float dot11 =  Vector2::DotProduct( v1, v1 );
                float dot12 =  Vector2::DotProduct( v1, v2 ); 
            
                // Compute barycentric coordinates
                float invDenom = 1 / (dot00 * dot11 - dot01 * dot01);
                float u = (dot11 * dot02 - dot01 * dot12) * invDenom;
                float v = (dot00 * dot12 - dot01 * dot02) * invDenom; 
            
                // Check if point is in triangle
                return (u > 0) && (v > 0) && (u + v < 1);
            } 
            
              
            

            Google出的某人代碼

            float Triangle2D::CrossProduct3(const Vector2& p1,const Vector2& p2, const Vector2& p0 )
            {
                return (p1.x-p0.x)*(p2.y-p0.y)-(p2.x-p0.x)*(p1.y-p0.y);
            } 
            
            bool Triangle2D::Inside( const Vector2& p )
            {
                return (CrossProduct3(mP1,p,mP2)*CrossProduct3(mP3,p,mP2)<0) &&
                       (CrossProduct3(mP2,p,mP1)*CrossProduct3(mP3,p,mP1)<0) &&
                       (CrossProduct3(mP1,p,mP3)*CrossProduct3(mP2,p,mP3)<0);
            } 
            

             

            這2個方法都有缺陷,當點在三角形邊上時,就無法得出。當用在一個正方形判斷時,正方形中心點就判定為沒有在其內部,顯然是一個錯誤。

             

            之后,又Google出某幾個大俠的算法和思想,考慮了下,判定點與四邊形重心點的線段是否與四邊形4條邊相交,相交時,其在四邊形外部,反之亦然。

            bool Quadrangle::Inside2( const Vector2& p )
            {
                Vector2 c = Segement2D::GetCrossPoint( mP1, mP3, mP2, mP4 ); 
            
                return !(Segement2D::Intersect( mP1, mP2, c, p) || 
                       Segement2D::Intersect( mP2, mP3, c, p) ||
                       Segement2D::Intersect( mP3, mP4, c, p) ||
                       Segement2D::Intersect( mP4, mP1, c, p) );
            } 
            
            bool Segement2D::Intersect( const Vector2& p1, const Vector2& p2,const Vector2& p3, const Vector2& p4 )
            {
                float gradab, gradcd, ycptab, ycptcd, interceptX, intercepty; 
            
                // In order to avoid divisions by zero
                //if (mP1.y == mP2.y)
                //    mP2.y += 0.0001f; 
            
                //if (mP1.x == mP2.x)
                //    mP2.x += 0.0001f; 
            
                //if (seg.mP1.y == seg.mP2.y)
                //    seg.mP2.y += 0.0001f; 
            
                //if (seg.mP1.x == seg.mP2.x)
                //    seg.mP2.x += 0.0001f; 
            
                // Calculates the intersection between the two lines
                gradab = (p1.y - p2.y) / (p1.x - p2.x);
                gradcd = (p3.y - p4.y) / (p3.x - p4.x); 
            
                ycptab = p1.y - p1.x * gradab;
                ycptcd = p3.y - p3.x * gradcd;
                interceptX = (ycptab - ycptcd) / (gradcd - gradab);
                intercepty = (ycptab - (gradab * ycptcd) / gradcd) / (1 - gradab / gradcd); 
            
                // Checking in the intersection is inside the segment
                if (!((interceptX >= p1.x && interceptX <= p2.x) || (interceptX >= p2.x && interceptX <= p1.x)))
                    return 0; 
            
                if (!((intercepty >= p1.y && intercepty <= p2.y) || (intercepty >= p2.y && intercepty <= p1.y)))
                    return 0; 
            
                if (!((interceptX >= p3.x && interceptX <= p4.x) || (interceptX >= p4.x && interceptX <= p3.x)))
                    return 0; 
            
                if (!((intercepty >= p3.y && intercepty <= p4.y) || (intercepty >= p4.y && intercepty <= p3.y)))
                    return 0; 
            
                return 1;
            } 
            
            Vector2 Segement2D::GetCrossPoint(const Vector2& p1, const Vector2& p2, const Vector2& q1, const Vector2& q2)
            {
                //必須相交求出的才是線段的交點,但是下面的程序段是通用的 
            
                /*根據兩點式化為標準式,進而求線性方程組*/
                Vector2 crossPoint;
                //求x坐標
                float tempLeft = (q2.x - q1.x) * (p1.y - p2.y) - (p2.x - p1.x) * (q1.y - q2.y);
                float tempRight = (p1.y - q1.y) * (p2.x - p1.x) * (q2.x - q1.x) + q1.x * (q2.y - q1.y) * (p2.x - p1.x) - p1.x * (p2.y - p1.y) * (q2.x - q1.x);
                crossPoint.x = tempRight / tempLeft;
                //求y坐標
                tempLeft = (p1.x - p2.x) * (q2.y - q1.y) - (p2.y - p1.y) * (q1.x - q2.x);
                tempRight = p2.y * (p1.x - p2.x) * (q2.y - q1.y) + (q2.x- p2.x) * (q2.y - q1.y) * (p1.y - p2.y) - q2.y * (q1.x - q2.x) * (p2.y - p1.y);
                crossPoint.y = tempRight / tempLeft; 
            
                return crossPoint;
            }
            

            這個算法效率并不是很高,但對于設計器來說無所謂了,如果有好的準確算法,可以討論

            posted @ 2010-01-08 10:29 戰魂小筑 閱讀(2768) | 評論 (6)編輯 收藏

            前幾天需要做一個鼠標點擊判定,具體是判斷一個點是否在某個凸四邊形中。

            最簡單的方法莫過于判斷鼠標點是否在2個三角形中。但是很多判定方法都是有問題的,比如說

             

            copy自IndieLib

            bool Triangle2D::Inside2( const Vector2& p )
            {
                Vector2 v0 = mP3 - mP1;
                Vector2 v1 = mP2 - mP1;
                Vector2 v2 = p - mP1; 
            
                // Compute dot products
                float dot00 =  Vector2::DotProduct( v0, v0 );
                float dot01 =  Vector2::DotProduct( v0, v1 );
                float dot02 =  Vector2::DotProduct( v0, v2 );
                float dot11 =  Vector2::DotProduct( v1, v1 );
                float dot12 =  Vector2::DotProduct( v1, v2 ); 
            
                // Compute barycentric coordinates
                float invDenom = 1 / (dot00 * dot11 - dot01 * dot01);
                float u = (dot11 * dot02 - dot01 * dot12) * invDenom;
                float v = (dot00 * dot12 - dot01 * dot02) * invDenom; 
            
                // Check if point is in triangle
                return (u > 0) && (v > 0) && (u + v < 1);
            } 
            
              
            

            Google出的某人代碼

            float Triangle2D::CrossProduct3(const Vector2& p1,const Vector2& p2, const Vector2& p0 )
            {
                return (p1.x-p0.x)*(p2.y-p0.y)-(p2.x-p0.x)*(p1.y-p0.y);
            } 
            
            bool Triangle2D::Inside( const Vector2& p )
            {
                return (CrossProduct3(mP1,p,mP2)*CrossProduct3(mP3,p,mP2)<0) &&
                       (CrossProduct3(mP2,p,mP1)*CrossProduct3(mP3,p,mP1)<0) &&
                       (CrossProduct3(mP1,p,mP3)*CrossProduct3(mP2,p,mP3)<0);
            } 
            

             

            這2個方法都有缺陷,當點在三角形邊上時,就無法得出。當用在一個正方形判斷時,正方形中心點就判定為沒有在其內部,顯然是一個錯誤。

             

            之后,又Google出某幾個大俠的算法和思想,考慮了下,判定點與四邊形重心點的線段是否與四邊形4條邊相交,相交時,其在四邊形外部,反之亦然。

            bool Quadrangle::Inside2( const Vector2& p )
            {
                Vector2 c = Segement2D::GetCrossPoint( mP1, mP3, mP2, mP4 ); 
            
                return !(Segement2D::Intersect( mP1, mP2, c, p) || 
                       Segement2D::Intersect( mP2, mP3, c, p) ||
                       Segement2D::Intersect( mP3, mP4, c, p) ||
                       Segement2D::Intersect( mP4, mP1, c, p) );
            } 
            
            bool Segement2D::Intersect( const Vector2& p1, const Vector2& p2,const Vector2& p3, const Vector2& p4 )
            {
                float gradab, gradcd, ycptab, ycptcd, interceptX, intercepty; 
            
                // In order to avoid divisions by zero
                //if (mP1.y == mP2.y)
                //    mP2.y += 0.0001f; 
            
                //if (mP1.x == mP2.x)
                //    mP2.x += 0.0001f; 
            
                //if (seg.mP1.y == seg.mP2.y)
                //    seg.mP2.y += 0.0001f; 
            
                //if (seg.mP1.x == seg.mP2.x)
                //    seg.mP2.x += 0.0001f; 
            
                // Calculates the intersection between the two lines
                gradab = (p1.y - p2.y) / (p1.x - p2.x);
                gradcd = (p3.y - p4.y) / (p3.x - p4.x); 
            
                ycptab = p1.y - p1.x * gradab;
                ycptcd = p3.y - p3.x * gradcd;
                interceptX = (ycptab - ycptcd) / (gradcd - gradab);
                intercepty = (ycptab - (gradab * ycptcd) / gradcd) / (1 - gradab / gradcd); 
            
                // Checking in the intersection is inside the segment
                if (!((interceptX >= p1.x && interceptX <= p2.x) || (interceptX >= p2.x && interceptX <= p1.x)))
                    return 0; 
            
                if (!((intercepty >= p1.y && intercepty <= p2.y) || (intercepty >= p2.y && intercepty <= p1.y)))
                    return 0; 
            
                if (!((interceptX >= p3.x && interceptX <= p4.x) || (interceptX >= p4.x && interceptX <= p3.x)))
                    return 0; 
            
                if (!((intercepty >= p3.y && intercepty <= p4.y) || (intercepty >= p4.y && intercepty <= p3.y)))
                    return 0; 
            
                return 1;
            } 
            
            Vector2 Segement2D::GetCrossPoint(const Vector2& p1, const Vector2& p2, const Vector2& q1, const Vector2& q2)
            {
                //必須相交求出的才是線段的交點,但是下面的程序段是通用的 
            
                /*根據兩點式化為標準式,進而求線性方程組*/
                Vector2 crossPoint;
                //求x坐標
                float tempLeft = (q2.x - q1.x) * (p1.y - p2.y) - (p2.x - p1.x) * (q1.y - q2.y);
                float tempRight = (p1.y - q1.y) * (p2.x - p1.x) * (q2.x - q1.x) + q1.x * (q2.y - q1.y) * (p2.x - p1.x) - p1.x * (p2.y - p1.y) * (q2.x - q1.x);
                crossPoint.x = tempRight / tempLeft;
                //求y坐標
                tempLeft = (p1.x - p2.x) * (q2.y - q1.y) - (p2.y - p1.y) * (q1.x - q2.x);
                tempRight = p2.y * (p1.x - p2.x) * (q2.y - q1.y) + (q2.x- p2.x) * (q2.y - q1.y) * (p1.y - p2.y) - q2.y * (q1.x - q2.x) * (p2.y - p1.y);
                crossPoint.y = tempRight / tempLeft; 
            
                return crossPoint;
            }
            

            這個算法效率并不是很高,但對于設計器來說無所謂了,如果有好的準確算法,可以討論

            posted @ 2010-01-08 10:27 戰魂小筑 閱讀(671) | 評論 (0)編輯 收藏

                 準備為自己的2D游戲動畫系統選擇一套給外部使用的接口方式,有如下幾種選擇:

             

            1. 純C API方式導出,類似于Windows API方式

            優點:簡潔,可以供C/C#乃至其他可以導入C DLL的語言使用

            缺點:C++的系統轉化為C會遇到很多性能以及架構的折損,對于對象控制類功能導出比較多的系統,這種方式簡直是噩夢

             

            2. C++方式導出,宏方式實現RTTI以及C++反射系統

            優點:強大,易用。

            缺點:對象生命周期不容易控制,反射系統設計比較費時,可能暴露很多類的細節,只能給C++使用

             

            3. COM方式,類DirectX的接口方式

            優點:商業項目已經證明這種接口方式的強大地方。無論是多個對象的類功能導出,還是COM接口重載都非常方便。而且,可以極為容易的讓.NET訪問。XBOX SDK里的XUI就是采用這種方式,而且還設計了一套C API搭配的強大C++反射系統,支持動態類創建,RTTI,動態類型轉換等等。

            缺點:需要系統注冊,不能跨平臺。COM標準學習起來需要時間

             

            4. 腳本綁定

            優點:保持你的系統對外C/C++接口的干凈,簡潔。通過腳本類綁定,可以很快的將C++功能注冊到腳本中。

            缺點:腳本如果沒有調試器,將會讓開發中碰到的棘手問題,甚至于在后期維護系統以及系統架構大變動變得異常復雜。腳本的性能決定了不能讓其做實時處理,例如:渲染

             

            最終選擇下來,由于有自己的界面系統Motion使用lua的函數綁定的前例,因此還是決定選擇一款腳本語言來做系統的對外接口,這里有幾個選擇:

            1. Lua

              可以說最好的游戲系統腳本語言。穩定,高效,bug幾乎沒有(即便有,普通開發者也是很難察覺的)。配上LuaPlus的強大C++綁定系統,你的系統開發效率可以提高很多。這里推薦notepad++來做lua開發,稍微配置下,彈出提示給你感覺在使用Visual Studio,:)

               同時需要指出的是,lua的類功能確實比較弱。雖然可以用metatable方式來模擬。但逼近跟native class支持還差很遠,實際開發中,你能體會出class中的權限控制(private,protected)有多么重要。

            2. Python

               誠然,這是個最OO的腳本。但是對于游戲,它太慢了。雖然本人只是用python寫過一些build系統,但從很多朋友反應的情況來看,Python嵌入游戲系統,確實太慢。用Stackless Python? 用第三方開源產品,還是認準品牌,呵呵,這里如果有用過的同學,歡迎提供感受。

            3. C#

               語言和系統都很美,但是想嵌入游戲,還是很痛的。.net平臺可惜就在于,到現在為止,可能還不是所有機器默認安裝有.net平臺。如果你的游戲是C++寫成,但卻要安裝.net以便你的腳本能運行,這很奇怪吧?所以,如果要用C#,還不如不用腳本,全盤.net就好了。Managed DX? 那東西幾年前就被MS打入冷宮了。XNA? 那東西只是一個玩具,別摸。

            4.Squirrel松鼠腳本

               這是個好東西。類lua的語法,C/C++/Java的語言結構,純正的native class外加OO支持。擁有開源的C++類綁定系統。最爽的是,SQDEV支持日食(Eclipse)下的遠程調試,開發環境還支持動態語法檢查。oh,my god。還說不定哪天這腳本被MS招安,跟IronPython一樣弄個.net綁定。

             

            posted @ 2009-12-31 11:42 戰魂小筑 閱讀(2220) | 評論 (2)編輯 收藏

            中文社區:http://silverlight.cn/

            微軟官方中文MSDN:http://msdn.microsoft.com/zh-cn/library/cc838158(VS.95).aspx

            微軟官方英文MSDN例子:http://samples.msdn.microsoft.com/Silverlight/SampleBrowser/index.htm#/?sref=HomePage

            posted @ 2009-12-30 16:45 戰魂小筑 閱讀(1427) | 評論 (0)編輯 收藏

            僅列出標題
            共26頁: First 16 17 18 19 20 21 22 23 24 Last 
            AV狠狠色丁香婷婷综合久久| 亚洲综合久久久| 国产精品嫩草影院久久| 国产福利电影一区二区三区久久老子无码午夜伦不 | 精品99久久aaa一级毛片| 日韩精品久久久久久久电影| 久久久久99精品成人片欧美| 久久国产成人| 国内精品久久久久伊人av| 久久精品成人免费国产片小草| 新狼窝色AV性久久久久久| 久久久久亚洲AV综合波多野结衣| 日韩精品久久无码中文字幕| 日本精品久久久久久久久免费| 久久99国产精品久久| 久久精品国产免费观看三人同眠| 中文字幕成人精品久久不卡| 少妇内射兰兰久久| 麻豆久久久9性大片| 国产精品久久久久久久午夜片| 久久WWW免费人成一看片| 日日狠狠久久偷偷色综合免费| 久久91精品久久91综合| 久久久久亚洲AV成人片 | 久久久久久亚洲Av无码精品专口| 久久久久综合中文字幕| 精品国产一区二区三区久久蜜臀| 婷婷伊人久久大香线蕉AV| 精品久久人人爽天天玩人人妻| 久久人妻少妇嫩草AV蜜桃| 日韩一区二区三区视频久久| 久久久久久久久久久免费精品| 久久国产精品久久国产精品| 69久久精品无码一区二区| 国产精品久久免费| 国产成人精品久久综合| 精品久久久久国产免费| 久久午夜福利电影| 一本久久综合亚洲鲁鲁五月天亚洲欧美一区二区 | 久久九九青青国产精品| 欧美亚洲国产精品久久蜜芽|