999精品在线视频,手机成人午夜在线视频,久久不卡国产精品无码,中日无码在线观看,成人av手机在线观看,日韩精品亚洲一区中文字幕,亚洲av无码人妻,四虎国产在线观看 ?

基于C#的Windows游戲開發的方法與原理

2018-02-02 12:46:50畢文斌郭曉玉
電腦知識與技術 2018年1期
關鍵詞:數據庫游戲

畢文斌+郭曉玉

摘要:在Visual Studio環境中使用C#編寫游戲項目是很多計算機相關專業的大學生非常愿意嘗試的課題,該文通過一個小的例子,給出這類游戲項目的開發方法與基本原理,這個方法的掌握可以使一些基于文件和數據庫的游戲項目的開發變得更加簡單。

關鍵詞:雙緩存(DoubleBuffered);計時器(Timer)

中圖分類號:TP311 文獻標識碼:A 文章編號:1009-3044(2018)01-0106-02

一般以為游戲必須在專業的游戲開發平臺上去實現,而基于C#的Winforms應用程序一般用來開發基于數據庫的管理類應用程序。但是各個平臺都有自身的長處,也都有自己的短板:基于C#的Winforms程序對使用文件及數據庫有著天然的優勢,專業的游戲開發平臺更偏重圖像刷新的頻率和聲音的及時性,而要在這些平臺上使用文、數據庫及其他控件,明顯比前者不便。

在認真觀察了XNA游戲開發的內部體制之后,經詳細的理解Winforms的DoubleBuffered(雙緩存)機制,加上靈活使用Winfroms自身提供的Timer(計時器)組件,也可以開發出像掃雷、連連看及中國象棋這類2D游戲,游戲體驗和專業游戲平臺并無明顯的差別,但要比使用C++語言或從另外學習新的平臺入手要簡單得多;尤其如果游戲是基于數據庫的,并且界面中需要給用戶提供輸入或選擇的控件,這種情況下Winfroms的優勢更加明顯。

簡單地說,雙緩存機制就是就是在內存中定義個圖片,繪圖時先在內存中畫好,再使用這個圖片更新你要畫圖的地方,這個機制可以有效地避免圖像閃爍的問題,使用雙緩存機制的過程如下:

1) 新建一個Winforms應用程序,將窗體的DoubleBuffered屬性設置為True;

2) 重載窗體的OnPaint函數,在這個函數中“畫”游戲所需要的畫面;

3) 在窗體設計界面根據需要中拖入一個或多個Timer組件,根據游戲的實時情況更新數據并調用窗體的Invalidate()函數,這個函數促發調用OnPaint()函數,更新游戲畫面。

下面以一個簡單的例子來學習一般游戲的開發方法:

1) 新建一個Winforms項目,將其命名為Rotating,將Form1的DoubleBuffered屬性設置為True,在項目的Debug文件夾中粘貼圖片threerings,一般選擇png格式的圖片,如果是用來當游戲背景圖,也可以使用其他格式的圖片。Threerings.png如圖1所示:

這是由三個環旋轉所截得的48個時刻的小圖片(80x100),就像電影的膠片一樣,如果連續“播放”它們,就會產生旋轉的效果;

2) 拖入一個Timer控件,其默認名為timer1,將其Interval屬性設置為80;

3) 在Form1.cs文件中新建以下全局變量:

Bitmap bmpAll;

Bitmap[] bmpFragments=new Bitmap[48];//48張小圖片

int bmp_X = 0;//畫布左上角的橫坐標

int bmp_Y = 0;//畫布左上角的縱坐標

int DisplayIndex = 0; }//當前顯示的小圖片的索引

4) 在窗體的Load事件中輸入以下代碼:

private void Form1_Load(object sender, EventArgs e)

{

bmp_X = this.ClientRectangle.Width / 2 - 40;

bmp_Y = this.ClientRectangle.Height / 2 - 50;

bmpAll = new Bitmap(Application.StartupPath + "\\threerings.bmp");

for (int row = 0; row < 8; row++)

for (int col = 0; col < 6; col++)

bmpFragments[row * 6 + col] = bmpAll.Clone(new Rectangle(col*75,row*75,75,75),bmpAll.PixelFormat);

this.timer1.Start();

5) 在Form1.cs文件中手動輸入重載函數OnPaint函數,代碼如下:

protected override void OnPaint(PaintEventArgs e)

{

Bitmap bufferBmp = new Bitmap(this.ClientRectangle.Width - 1, this.ClientRectangle.Height - 1);//空背景的畫布

Graphics g = Graphics.FromImage(bufferBmp);

g.DrawImage(bmpFragments[DisplayIndex], new Point(bmp_X, bmp_Y));

e.Graphics.DrawImage(bufferBmp, 0, 0);

g.Dispose();

base.OnPaint(e);

}

6) timer1的Tick事件代碼如下:

private void timer1_Tick(object sender, EventArgs e)

{

DisplayIndex = (++DisplayIndex) % 48;

if (DisplayIndex == 47 && this.timer1.Interval>=20)

this.timer1.Interval -= 10;

this.Invalidate();//促發調用OnPaint()函數

}

現在運行程序,就可以看到一個旋轉的三色環,每旋轉一個周期,由于timer1的Interval減少了10,所以會旋轉的比上個周期更快。

當游戲上有更多的變化的元素時,如:移動的棋子、控制游戲時間的進度條、

爆炸特效等,需要為每個元素創建不同的Timer,以更新與這個元素相關的位置、百分比、爆炸圖片索引等數據信息,當這些信息更新時,調用代碼this.Invalidate();以更新畫面。

最后說一下游戲聲音的處理:一般播放流暢的背景音樂時,使用Visual Studio自帶的多媒體播放控件,如果需要及時響應的聲音,如點擊棋子、碰撞等,可以使用Windows自帶的PlaySound函數。

就當前的實踐來說,圖像的顯示與更新非常好,即使像掃雷這種畫有很多方格的游戲都非常流暢,但一些特定的游戲聲音會出現卡頓:比如彈球游戲,上一個碰撞聲音正在播放,下一個碰撞已經到來,這時PlaySound函數不會自動結束正在進行的播放,所以還需要添加額外的變量進行控制—即使專業的游戲開發平臺,也會出現這種情況,需要設計人根據游戲體驗做出合理的取舍。

備注:上述例子是以整個窗體作為游戲畫布,如果界面中除了顯示圖像,還想加入Visual Studio的自帶的輸入或選擇類控件,可以將界面的某個不包含這些控件的區域作為畫布(在OnPaint()函數中定義),這樣更新畫面時僅更新游戲畫面,而不會同時重繪這些控件。

參考文獻:

[1] 楊關勝,栗俊霞.精通XNA圖形與游戲程序設計[M].北京:人民郵電出版社, 2012.

[2] 畢文斌,孫明亮.C# Windows游戲設計[M].北京:清華大學出版社, 2014.endprint

猜你喜歡
數據庫游戲
數據庫
財經(2017年15期)2017-07-03 22:40:49
游戲
數據庫
財經(2017年2期)2017-03-10 14:35:35
數獨游戲
瘋狂的游戲
飛碟探索(2016年11期)2016-11-14 19:34:47
爆笑游戲
數據庫
財經(2016年15期)2016-06-03 07:38:02
數據庫
財經(2016年3期)2016-03-07 07:44:46
數據庫
財經(2016年6期)2016-02-24 07:41:51
第八章直接逃出游戲
小學科學(2015年7期)2015-07-29 22:29:00
主站蜘蛛池模板: 欧美精品导航| 婷婷色一二三区波多野衣| 婷婷激情亚洲| 亚洲男人天堂网址| 国产91视频免费观看| 成人av手机在线观看| 青青草原国产av福利网站| 老色鬼久久亚洲AV综合| 久久男人视频| 亚洲三级影院| 亚洲无码日韩一区| 1024国产在线| 婷婷中文在线| 国产三区二区| 欧美精品在线看| 国产欧美在线观看视频| 亚洲综合天堂网| 亚洲精品在线影院| 园内精品自拍视频在线播放| 日韩最新中文字幕| 99精品在线看| A级毛片无码久久精品免费| 国产成人高清精品免费| 手机永久AV在线播放| 日韩无码视频播放| 午夜视频在线观看免费网站| 欧美激情,国产精品| 少妇露出福利视频| 国产精品美人久久久久久AV| 亚洲中文字幕97久久精品少妇| 欧美精品不卡| 91亚洲精品第一| 毛片在线播放网址| 国产xx在线观看| 伊人久久久久久久久久| 午夜欧美理论2019理论| 精品撒尿视频一区二区三区| 国产精品13页| 亚洲精品国产综合99久久夜夜嗨| 国产亚洲精品va在线| 欧美一区精品| 国产人碰人摸人爱免费视频| 亚洲精品成人片在线观看| 国产综合亚洲欧洲区精品无码| 青青操国产| 日本欧美午夜| 国产精品lululu在线观看| 国产亚洲精品精品精品| 丁香婷婷在线视频| 一级毛片在线播放| 亚洲人网站| 999国产精品| 午夜三级在线| 久久精品国产精品青草app| 精品久久久久久中文字幕女| 在线观看av永久| 亚洲无线国产观看| 老司机午夜精品视频你懂的| 国产99在线观看| 国产网站黄| 亚洲伊人久久精品影院| 在线毛片网站| 久久青草免费91观看| 91成人在线观看视频| 91精品最新国内在线播放| 久久久久亚洲精品成人网| 美女潮喷出白浆在线观看视频| 亚洲AV一二三区无码AV蜜桃| 久久中文电影| 国产精品色婷婷在线观看| 国国产a国产片免费麻豆| 日韩欧美亚洲国产成人综合| 国产成人资源| 巨熟乳波霸若妻中文观看免费| 久久精品免费国产大片| 在线观看精品国产入口| 亚洲国产成人麻豆精品| 国产精品香蕉在线| 婷婷久久综合九色综合88| 日本三区视频| 免费无码AV片在线观看国产| 丝袜美女被出水视频一区|