亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發(fā)設計 > 正文

C#開發(fā)WPF/Silverlight動畫及游戲系列教程(Game Tutorial):(三十九)向Silverlight移植①

2019-11-17 04:08:08
字體:
來源:轉載
供稿:網友
一、主要改進:

1)Silverlight3.0上的右鍵實現:

//注冊右鍵事件

HtmlPage.Document.AttachEvent("oncontextmenu", Game_MouseRightButtonDown);

//鼠標右鍵事件

PRivate void Game_MouseRightButtonDown(object sender, HtmlEventArgs e) {

        e.PreventDefault(); //取消右鍵彈出菜單

……邏輯部分

}

通過上述方法還必須配合<param name="Windowless" value="true" />或System.Windows.Interop.Settings.Windowless = true才能實現右鍵功能。另外需要特別說明的是,此方法并非官方所提供的解決方案,而是第三方間接的實現方式。因此,在使用前,您必須解為Silverlight解禁右鍵將付出的代價:①Windowless = true將降低程序整體性能;②無法使用輸入法;③無法被所有的瀏覽器所兼容,例如在Google Chrome中,雖然可以激發(fā)出右鍵功能,但是取消不了彈出右鍵菜單。綜上,在Silverlight3.0中,您還是得謹慎再謹慎的考慮是否使用右鍵。





2)撤消精靈及其他所有控件中的x,y,z坐標定位用關聯屬性,取而代之的是一個名為Coordinate的關聯屬性,其完整定義如下:

/// <summary>

/// 獲取或設置控件坐標(關聯屬性)

/// </summary>

public Point Coordinate {

    get { return (Point)GetValue(CoordinateProperty); }

    set { SetValue(CoordinateProperty, value); }

}

public static readonly DependencyProperty CoordinateProperty = DependencyProperty.Register(

    "Coordinate",

     typeof(Point),

     typeof(QXSprite),

     new PropertyMetadata(ChangeCoordinateProperty)

);

private static void ChangeCoordinateProperty(DependencyObject d, DependencyPropertyChangedEventArgs e) {

     QXSprite obj = (QXSprite)d;

     if (obj.Visibility == Visibility.Visible) {

         Point p = (Point)e.NewValue;

         obj.SetValue(Canvas.LeftProperty, p.X - obj.CenterX);

         obj.SetValue(Canvas.TopProperty, p.Y - obj.CenterY);

         obj.SetValue(Canvas.ZIndexProperty, Convert.ToInt32(p.Y));

      }

}

Coordinate的類型為Point,因此,我將原先精靈移動用的DoubleAnimation動畫類型替換成了PointAnimation;這樣,不論是在代碼結構還是性能上均得到很大的優(yōu)化。更改控件坐標時,只需修改它的Coordinate = new Point(x,y)即可,系統(tǒng)會判斷該關聯屬性的值是否發(fā)生改變而激發(fā)ChangeCoordinateProperty方法,從而更新該控件最終在畫面中的LeftProperty、TopProperty和ZIndexProperty。沒錯,關聯屬性就是這么強大。

3)A*移動的優(yōu)化。我已留下接口,根據不同的參數設置,可以啟動不同效率、不同路徑長短、不同精確度的A*尋路,這里我給大家推薦兩種現成的方案,第一種—程序默認A*尋路方案,此方案找到的路徑最精確,但性能消耗最高;另一種方案可以實現最高效的尋路,但得到的路徑并非最短:

PathFinderFast pathFinderFast = new PathFinderFast(varyObstruction) {

    HeavyDiagonals = false,

    HeuristicEstimate = 100,

};

我在Silverlight引擎中封裝的A*尋路DLL,是根據教程第七節(jié)的老外A*改編而成。因此,您完全可以將之作為一個調試器,調試不同的搭配方案,然后將參數賦予pathFinderFast里:



例如上圖,我通過模擬測試,發(fā)現最終找到路徑所消耗的時間為0.0071秒,假如我已對此設置所產生的路徑長度與性能感到滿意,那么接下來要做的就是將此方案的配置記錄下來: Diagonals = true ; Heavy Diagonals = true ; Henuristic = 5 ; Formula = Max(DX,DY) ; Use Tie Breaker = false ; Search Limit = 40000 ; 尋路對象使用的是FastPathFinder。

OK,最后來在Silverlight引擎中,我就可以這樣來啟動A*尋路:

PathFinderFast pathFinderFast = new PathFinderFast(varyObstruction) {

    Diagonals = true,

    HeavyDiagonals = true,

    HeuristicEstimate = 5,

    Formula = HeuristicFormula.MaxDXDY,

    TieBreaker = false,

    SearchLimit = 40000,

};

嘿嘿,其實使用A*是可以如此簡單的,不是嗎?

二、主要優(yōu)化:

1)  地圖切片實現了最優(yōu)化加載方法。即不需要額外做多余判斷,也無需每次對切片容器進行Clear。只需按從0到8的順序對這9個切片重新賦值Source即可,性能真的很優(yōu)哦:

private void ChangeMapSection() {

……

        countSection = 0;

        for (int x = startSectionX; x <= endSectionX; x++) {

           for (int y = startSectionY; y <= endSectionY; y++) {

              mapSection[countSection].Source =

Super.GetImage(string.Format("/Image/Map/{0}/Surface/{1}_{2}.jpg", mapCode, x, y));

              Canvas.SetLeft(mapSection[countSection], x * mapSectionWidth);

              Canvas.SetTop(mapSection[countSection], y * mapSectionHeight);

              countSection++;

        }

……

}

2)改進了 “托盤式”主位地圖移動模式。首先我想向一些朋友道歉,一時找不到是哪篇文章后面評論中有提到對一個Canvas進行移動而不是遍歷所有精靈,這樣可以提升邏輯方面的性能;我當時有測試過,為什么一直堅持不行,因為我沒轉過彎,主角和其他所有對象是完全可以放在一個Canvas里的,這也意味著它們的ZIndex順序照樣可以很好的處理,同時實現“托盤式”地圖移動模式。最終在QQ群里“內Cool超人”的感化下,我才得以覺醒。這樣,雖然畫面性并無提升,但是,配合上Coordinate坐標關聯屬性的回調方法使用,可以去掉循環(huán)遍歷地圖上所有對象位置,在邏輯上大大的提升了性能。

3)隱藏遠離畫面窗口的精靈對象。這是基于Web游戲所必須做的處理,它將大大減少不必要元素的呈現及邏輯運算:

……

//隱藏及顯示區(qū)域范圍內精靈

      if ((Math.Abs(sprite.Coordinate.X - Leader.Coordinate.X) > this.ActualWidth / 2) || (Math.Abs(sprite.Coordinate.Y - Leader.Coordinate.Y) > this.ActualHeight / 2)) {

           sprite.Visibility = Visibility.Collapsed;

           sprite.Timer.Stop();

      }else {

             if (!sprite.Timer.IsEnabled) {

                  sprite.Visibility = Visibility.Visible;

                  sprite.Timer.Start();

             }

      ……

}

……

在間隔0.5秒的輔助計時器事件中進行類似如上判斷,當某個精靈超出了主角可視范圍,即在我們屏幕窗口所能看到的區(qū)域以外,則將之隱藏掉,并停止它的切幀動作,否則反之。這對提升游戲整體性能起著決定性關鍵作用。如果是網絡版,我們則可以拓展出2級范圍,其中1級范圍即為上述范圍;而2級范圍則為:當某個已被隱藏的精靈遠離主角到了更遙遠的地方,則我們將之移除掉,從而減少邏輯且實現不必要資源的及時釋放與回收。



4)改進了時時障礙物系統(tǒng)。整個游戲有兩個障礙物數組(可以記錄0-255,0代表障礙物,除0外的所有其他字節(jié)均代表無障礙。這里我使用1標識無任何對象可通行區(qū)域,10-19用來標識傳送點。如果以后需要加入新的地形效果拓展,那么同樣可以使用類似設定:例如20用來標識可通行水域,21標識可通行沙漠等等;這樣,現當主角在這些區(qū)域中移動時,會發(fā)出相應的腳步聲,使游戲效果更為逼真)。動態(tài)障礙物系統(tǒng)實現代碼如下,首先定義一個固定數組和一個動態(tài)數組:

byte[,] fixedObstruction, varyObstruction;

fixedObstruction是地圖加載后永遠不變的地圖信息描述載體,它記錄了地圖中肯定無法通過的地形及傳送點的位置等等。varyObstruction是時時的動態(tài)地圖信息,會根據所有精靈時時的位置來填充障礙物。

在每次A*移動時,我們通過先去掉精靈腳底的障礙物區(qū)域(HoldWidth和HoldHeight),然后啟動A*尋路,找到路徑后再補回精靈的腳底障礙物區(qū)域:

……

SetSpriteObstruction(sprite, 1);

AStarMove(sprite, GetSpriteEdge(enemy));

sprite.UseAStarMove = true;

SetSpriteObstruction(sprite, 0);

……

其中SetSpriteObstruction方法為:

/// <summary>

/// 設置精靈占位障礙物對應值

/// </summary>

private void SetSpriteObstruction(QXSprite sprite, byte sign) {

        int x = (int)(sprite.Coordinate.X / gridSizeX);

        int y = (int)(sprite.Coordinate.Y / gridSizeY);

        for (int m = x - sprite.HoldWidth; m <= x + sprite.HoldWidth; m++) {

            for (int n = y - sprite.HoldHeight; n <= y + sprite.HoldHeight; n++) {

                if (fixedObstruction[m, n] != 0) {

                    varyObstruction[m, n] = sign;

                }

            }

        }

}
發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
欧美亚洲一区三区| 久久中文字幕免费| 日韩精品成人一区二区三区| 欧美重口另类videos人妖| 国产精品久久久久久69| 日韩一区二区高清视频| 国产视频123区| 国产欧美一区二区在线播放| sese视频| 色网站国产精品| 欧美日韩一区二区三区在线播放| 日韩欧美亚洲一二三区| 中文字幕亚洲精品一区| 在线成人h网| 国内精品国语自产拍在线观看| 亚洲字幕成人中文在线观看| √天堂中文www官网| 在线视频不卡一区二区三区| 96精品久久久久中文字幕| 波多野结衣一区| 亚洲欧洲另类精品久久综合| 亚洲精品乱码久久久久久日本蜜臀| 91av资源网| 亚洲激精日韩激精欧美精品| 国产中文在线观看| 国产亚洲精品自在线观看| 91av俱乐部| 中日韩一区二区三区| 日本又骚又刺激的视频在线观看| 牛夜精品久久久久久久99黑人| 99re视频| 国产精品免费av| 亚洲欧美综合一区二区| 欧美精品一区二区免费| 成人在线手机视频| 椎名由奈jux491在线播放| 国产亚洲一区二区三区在线播放| 免费一级特黄特色毛片久久看| 国产毛片一区| 精品视频在线观看| 中文人妻熟女乱又乱精品| 亚洲精品成人在线视频| 尤物网址在线观看| 国产毛片毛片毛片毛片毛片| 五月天天在线| 国产精品久久久久久久久久| 午夜免费在线| 国产日韩在线播放| 国产成人精品亚洲精品| 久久精品成人动漫| 成人性生活视频免费看| 色综合久久影院| 免费国产h视频在线观看86| 国产精品久久久久久无人区| 女一区二区三区| 亚洲天堂avav| 国产中文伊人| 国产精品天堂| 精彩视频一区二区| 欧美深深色噜噜狠狠yyy| 国产精品久久久久久久av福利| 日本精品va在线观看| 久久精品中文字幕一区二区三区| 久久婷婷综合色| h视频在线免费看| 亚洲欧美一区二区精品久久久| 国产区一区二区三区| 高清亚洲成在人网站天堂| 国产精品毛片一区二区三区| 午夜精品av| 亚洲国产精品成人一区二区在线| 久久99伊人| 精品久久在线播放| 999这里有精品| 一区二区三区电影| 日韩美女一区二区三区在线观看| 午夜免费福利小电影| 国产精品久久久久91| 欧美性猛交xxx高清大费中文| 天堂а√在线资源在线| 中国特黄一级片| 无码无遮挡又大又爽又黄的视频| 色婷婷亚洲一区二区三区| 国产乱码精品一品二品| 欧美激情a∨在线视频播放| 欧美成人黄色网址| www.欧美日本| 亚洲成人一区二区三区| 2019中文字幕在线观看| 国产精品免费一区二区三区四区| 久久综合色婷婷| 一二三区高清| 最新av在线播放| 亚洲av片在线观看| 黄色一级视频网站| 美媛馆国产精品一区二区| 国产精品极品美女粉嫩高清在线| 性做久久久久久免费观看欧美| 在线播放日韩欧美| 国产专区欧美精品| 中文字幕精品国产| 国产1区2区在线观看| 蜜臀av亚洲一区中文字幕| 欧美日韩国产中字| eeuss国产一区二区三区| 免费男女羞羞的视频网站中文字幕| 亚洲成人av免费在线观看| 亚洲人成网在线播放| 水蜜桃免费高清视频在线播放| 一区二区三区四区欧美| 国产精品后入内射日本在线观看| 亚洲精品第二页| 91精品国自产在线| 91精品国产黑色瑜伽裤| 亚洲国产精品久久艾草纯爱| 3d动漫精品啪啪1区2区免费| 美国三级日本三级久久99| 97国产一区二区| 久久精品视频1| 中文字幕av在线播放| japanese在线观看| 最全影音av资源中文字幕在线| 国产无遮挡又黄又爽| 欧美午夜丰满在线18影院| 国产精品一二三四五区| 最新版天堂中文在线官网| 中文在线一二区| 国产一区亚洲二区三区| 美女毛片在线看| 亚洲日本japanese丝袜| 欧洲国内综合视频| 囯产精品一品二区三区| 久久人妻少妇嫩草av蜜桃| 小说区图片区色综合区| 一级特黄毛片| 亚洲自拍偷拍视频| 你真棒插曲来救救我在线观看| 无需播放器亚洲| 亚洲自拍偷拍色图| 国产精品一区2区| 国产精品久久久久久久久借妻| 国产精品资源站在线| 久久久久国产免费免费| 午夜时刻免费入口| 欧美18xxxx| 亚洲直播在线一区| 亚洲三区在线观看无套内射| 成人欧美一区二区三区视频网页| 亚洲欧美在线x视频| 中文字幕亚洲一区二区av在线| 91精品国产欧美一区二区成人| 欧美三级电影网址| 欧洲生活片亚洲生活在线观看| 精品中文字幕人| 免费在线超碰| 久久国产精品视频在线观看| 国产精品白丝jk喷水视频一区| 日韩欧美123区| 少妇又色又爽又黄的视频| 91在线视频网址| 亚洲欧美日韩综合一区| 视频一区二区不卡| 污污的视频免费| 先锋影音在线资源站91| 最新电影电视剧在线观看免费观看| 美日韩精品免费视频| 国产国语性生话播放| 免费午夜视频在线观看| 国产一精品一av一免费爽爽| 成人手机在线电影| 992tv成人免费影院| 精品久久人人做人人爱| 日韩视频免费观看高清在线视频| 久久超级碰碰| 99久久精品免费看国产免费软件| 亚洲综合网站久久久| 欧美白人最猛性xxxxx| 7777精品伊人久久久大香线蕉超级流畅| 欧美刺激午夜性久久久久久久| 国产精品日韩成人| 国产中文第一页| 噼里啪啦国语在线观看免费版高清版| 丝袜美腿精品国产二区| 亚洲综合网在线| 国产精品国产亚洲精品看不卡| 欧美三级免费观看| 伊人性伊人情综合网| 91超碰在线观看| 国产一区二区三区欧美| 欧美精品在线一区二区三区| 精品盗摄一区二区三区| 国产成人无码精品亚洲| 亚洲一区二区三区av无码| 超碰在线播放97| 午夜综合激情| 中文在线资源新版官网| 国产精品免费区二区三区观看| 亚洲女同一区二区| 在线观看日韩一区| 亚洲av无码乱码国产精品久久| 在线播放国产区| 91精品国产综合久久福利软件| 精品亚洲精品| 欧美日韩综合色| 亚洲欧美日韩综合一区| 色婷婷综合久久久中字幕精品久久| 久久国产色av| 日韩精品一区二区三区老鸭窝| 91国视频在线| 成人影院午夜久久影院| 欧美一卡2卡3卡4卡无卡免费观看水多多| 成人免费毛片在线观看| 最近2019免费中文字幕视频三| 九九热最新地址| 美女张开让男人捅| 国产69精品久久久久毛片| 天堂中文在线网| 99久久999| 亚洲欧美日韩成人| 亚洲欧美一区在线| 中文字幕av亚洲精品一部二部| 中文字幕一区二区三中文字幕| 538精品在线观看| 亚洲精品日韩欧美| 亚洲美女精品久久| 巨胸喷奶水www久久久| 久久精品国产亚洲av麻豆蜜芽| 在线免费观看h| 国产中文字幕在线播放| 五月婷婷色丁香| 樱花草国产18久久久久| 久久99在线观看| 99国内精品久久久久| 免费一级欧美在线观看视频| 星空大象在线观看免费播放| 特级毛片在线观看| 日韩免费观看高清完整版| 亚洲午夜在线电影| xxx在线视频| 538国产视频| 在线观看18视频网站| 日本网站在线免费观看视频| 久久人人爽人人爽爽久久| 国产色综合久久| 久久国产精品-国产精品| 欧美激情第6页| 香蕉视频在线播放| 成人永久免费网站| 小h片在线观看| 成人高清伦理免费影院在线观看| 狠狠色丁香久久婷婷综合_中| 国产精品丝袜xxxxxxx| 免费a级毛片在线观看| 国产一区二区三区四区五区| 一本色道久久加勒比精品| 91视频福利| 日韩精品五月天| 免费的黄网站在线观看| 91网址在线看| 亚洲久色影视| 久久综合久久鬼色| 99国产精品久久久久老师| 国产又粗又长| 黄色小视频在线播放| 亚洲伊人春色| 91色精品视频在线| 美女看a上一区| 91在线不卡| 9久久婷婷国产综合精品性色| av资源吧首页| 最近2018年手机中文在线| 九九视频这里只有精品| 99热这里只有精品首页| 欧美伊人精品成人久久综合97| 噜噜噜噜噜久久久久久91| 中文天堂在线视频| 在线碰免费视频在线观看| 日本在线观看免费| 电影久久久久久| 欧美日韩精品一区二区在线播放| 亚洲在线免费| 亚洲依依成人| 欧美激情在线一区二区三区| 综合自拍亚洲综合图不卡区| 日韩在线观看中文字幕| 久久久免费在线观看| 国产l精品国产亚洲区久久| 国产日产一区二区| 久久久久九九精品影院| av成人激情| 国产香蕉精品视频一区二区三区| 欧美搞黄网站| 色婷婷综合久久久中文一区二区| 欧美a级大片在线| 麻豆高清免费国产一区| 日韩伦理一区二区三区av在线| 红桃视频一区二区三区免费| 国产亚洲精品一区二区在线观看| 国产精品无码一区二区三区| 精品无人区乱码1区2区3区在线| 亚洲美女主播视频免费观看| 日本不卡一区二区三区四区| av在线播放中文字幕| 亚洲第一福利网| 精品无码人妻一区二区三区| 玖玖国产精品视频| 不卡av电影院| 欧美wwwwww| 夜夜爽妓女8888视频免费观看| 国产精品v日韩精品v在线观看| 久久久久99精品成人| 日本欧美一二三区| 日本性生活一级片| 免费白浆视频| 一级毛片免费在线| 久久九九有精品国产23| 国产美女做爰免费视频软件| 国产资源在线播放| 免费国产自线拍一欧美视频| 亚洲aa中文字幕| 18视频免费网址在线观看| 国产精品久久久久久久app| 亚洲精品国产精品国自产观看浪潮| 亚州av电影免费在线观看| 久久久午夜精品理论片中文字幕| 国产特级淫片高清视频| 国产欧美一区二区三区视频| 正在播放精油久久|