1、重庆海天软件学院的WINFORM实训项目疯狂的小鸟重庆海天软件学院的WINFORM实训项目-疯狂的小鸟 重庆海天软件学院第二学期微软4班 WINFORM实训项目截图:最近学生们学习了2个月的C#和WINFORM,没有学习数据库。故设计了这样的一个小游戏,基本覆盖了C#语言常用的语法,已经面向对象的基本思想。本实训课程分为8个阶段来实践,效果非常好。故录制成视频分为8个阶段,每个阶段15分钟左右。此游戏开发为在课堂上即兴编写,即兴录制。没有事先准备,故有些地方不是很完美,请见谅!不过,大家可以学习丁老师在完成软件开发中的需求的时候,思考的过程和完整的思路,以及遇到错误如果去调试和解决的方法,这个
2、大家会有收获。下载地址:主要实现思路为:用GDI+在窗体上绘制图形,在主窗体加入了一个Time控件来做游戏循环,不断的绘图。使用的DoubleBuffer技术,屏幕不闪烁。效果还是可以的,但是在面向对象设计这块设计得有点罗嗦了,没有设计好,需要进一步完善。代码展示:csharpview plaincopyprint?1. usingSystem;2. usingSystem.Collections.Generic;3. usingSystem.ComponentModel;4. usingSystem.Data;5. usingSystem.Drawing;6. usingSystem.Lin
3、q;7. usingSystem.Text;8. usingSystem.Windows.Forms;9. 10. namespaceCrazyBird_GDI11. 12. /13. /重庆海天软件工程学院微软7班WINFORM实训项目-疯狂的小鸟14. /微软讲师:丁浩Email:dinghao80QQ:37112555 15. /项目需求:射击游戏16. /实现步骤:1.采用GDI+技术,双缓冲实训精灵的绘制17. /2.绘制背景 18. /3.绘制小鸟19. /4.绘制小猪20. /5.绘制子弹21. /22. publicpartialclassForm1:Form23. 24. p
4、ublicForm1()25. 26. InitializeComponent();27. 28. Bitmapbitmap;29. Pigpig;30. /第七步4 31. Listbullets=newList();32. BirdOPbirdop;33. /第十步6:当子弹碰到小鸟的开关34. boolisTouched=false;35. privatevoidtimer1_Tick(objectsender,EventArgse)36. 37. /在time控件中循环绘制,约33帧的FPS 38. /第一步:导入所需资源39. /第二步:搭建双缓冲模型,将资源不断的绘制在虚拟画布上面
5、,这个技术可以消除屏幕闪烁40. /最后将虚拟画布bitmap的内容复制在窗体绘图区41. 42. using(Graphicsdc=Graphics.FromImage(bitmap)43. 44. /第三步:导入背景图片资源45. BackGroundbg=newBackGround(this.Width,this.Height);46. bg.Draw(dc);47. /固定窗体不能拖动48. 49. /*-/第一阶段完成。思考:BackGround设计成了一个类,为什么?好处在哪儿?- 50. /第四步:绘制小鸟需求一共64只小鸟,成8*8排列设计小鸟类51. 52. /第九步6:绘制
6、小鸟53. birdop.Draw(dc);/之前要装载小鸟54. 55. 56. 57. /*-/第二阶段完成。- 58. /第五步:绘制小猪59. 60. pig.Width=70;61. pig.Height=60;62. 63. pig.Draw(this,dc);64. 65. /*-/第三阶段完成- 66. /第六步:移动小猪67. /触发键盘事件:注意思考,事件源是什么?-窗体68. 69. /第七步6:绘制子弹70. foreach(Bulletbulletinbullets)71. 72. /第八步2:让speed值增加,现在找个地方赋予speed初始值73. /bullet
7、.Speed+=10;/没有起到作用 74. bullet.X-=bullet.Speed;75. bullet.Draw(dc);76. 77. /*-第六阶段完成(让子弹飞)-下一阶段:子弹碰撞小鸟,子弹和小鸟移除集合- 78. /思考:子弹碰撞小鸟,只需要在time控件中从小鸟集合中绘制,子弹从子弹集合里面绘制。碰撞后,从各种集合移除小鸟或子弹即可。79. 80. /第十步1:判断子弹和小鸟相撞,实际上就是2个矩形相交。追加子弹的方法。81. 82. /第十步5:83. for(inti=0;ibullets.Count;i+)/遍历子弹,注意这个时候不能用foreach,为什么?84.
8、 85. for(intj=0;jBirdOP.birds.Count;j+)/遍历小鸟86. 87. if(bulletsi.Intersect(BirdOP.birdsj)/每一个子弹去判断所有的小鸟碰撞88. 89. BirdOP.birds.RemoveAt(j);/移除小鸟测试成功但是同时要移除子弹90. isTouched=true;91. 92. 93. /移除子弹94. if(isTouched)95. 96. bullets.RemoveAt(i);97. isTouched=false;98. 99. /测试成功100. /*-第八阶段完成到这儿就结束了思考加入声音,由于机
9、房没有音响,不好测试。- 101. /我们发现在构造BirdBackGroundPig等到类的时候,发现都有共同的属性,这个时候可以用继承来实现,需要进一步改进,还要有更好的扩展性,大家在学习面向对象的时候102. /要积极思考面向对象的三大特性,封装继承多态接口抽象类结构枚举等等C#的特性103. /实训制作人:丁浩老师QQ:37112555这个视频会放在中下载,欢迎大家学习,谢谢!重庆海天软件工程学院 104. 105. 106. 107. 108. /第二步:复制绘制在窗体绘图区109. using(Graphicsg=this.CreateGraphics()110. 111. g.D
10、rawImage(bitmap,0,0);112. 113. 114. 115. privatevoidForm1_Load(objectsender,EventArgse)116. 117. /第二步:创建和窗体一样大小的画布118. bitmap=newBitmap(this.Width,this.Height);119. /初始化小猪120. pig=newPig();121. pig.Step=10;122. /第九步5:初始化小鸟123. /bird=newBird(); 124. /bird.LoadBird(); 125. /做到这个地方,我们发现在bird设计中出现了问题。需要
11、重新设计,没有思考全面。126. birdop=newBirdOP();127. /第九步5:初始化小鸟128. birdop.LoadBirds();129. 130. 131. /第六步触发键盘事件移动小猪132. privatevoidForm1_KeyUp(objectsender,KeyEventArgse)133. 134. switch(e.KeyCode)135. 136. caseKeys.Up:137. pig.Move(Direct.UP);138. break;139. caseKeys.Down:140. pig.Move(Direct.DOWN);141. brea
12、k;142. caseKeys.Space:143. /第七步5:装载子弹在集合中144. bullets.Add(pig.FireABullet();145. break;146. 147. 148. 149. /*-第四阶段完成- 150. 151. 背景类:csharpview plaincopyprint?1. usingSystem;2. usingSystem.Collections.Generic;3. usingSystem.Linq;4. usingSystem.Text;5. usingSystem.Drawing;6. 7. namespaceCrazyBird_GDI8
13、. 9. classBackGround10. 11. publicBackGround(intwidth,intheight)12. 13. Width=width;14. Height=height;15. 16. intwidth;17. 18. publicintWidth19. 20. getreturnwidth;21. setwidth=value;22. 23. intheight;24. 25. publicintHeight26. 27. getreturnheight;28. setheight=value;29. 30. 31. /绘制一个背景图片32. publicv
14、oidDraw(Graphicsg)33. 34. Rectanglerect=newRectangle(0,0,Width,Height);35. g.DrawImage(MyRes.background,rect);36. 37. 38. 小鸟类:csharpview plaincopyprint?1. usingSystem;2. usingSystem.Collections.Generic;3. usingSystem.Linq;4. usingSystem.Text;5. usingSystem.Drawing;6. 7. namespaceCrazyBird_GDI8. 9. p
15、ublicclassBird10. 11. intx;/x坐标12. 13. publicintX14. 15. getreturnx;16. setx=value;17. 18. inty;/y坐标19. 20. publicintY21. 22. getreturny;23. sety=value;24. 25. intwidth;26. 27. publicintWidth28. 29. getreturnwidth;30. setwidth=value;31. 32. intheight;33. 34. publicintHeight35. 36. getreturnheight;37
16、. setheight=value;38. 39. 40. /小鸟的矩形绘图区第十步3 41. privateRectanglerectBird;42. 43. publicRectangleRectBird44. 45. getreturnrectBird;46. setrectBird=value;47. 48. 49. 小鸟操作类:csharpview plaincopyprint?1. usingSystem;2. usingSystem.Collections.Generic;3. usingSystem.Linq;4. usingSystem.Text;5. usingSystem
17、.Drawing;6. 7. namespaceCrazyBird_GDI8. 9. /10. /第九步6:重新设计小鸟类11. /增加了一个小鸟操作类12. /13. publicclassBirdOP14. 15. /第九步2:定义一个集合16. publicstaticListbirds=newList();/为什么是静态的呢?如17. 18. 果不是静态的,每次new一个小鸟,都会有属于自己的集合,显然不对。所以用静态的19. 20. ,所有的小鸟对象都对应这一个集合21. 22. /绘制8*8小鸟阵23. 24. /第九步3:装入64只小鸟到集合中25. publicvoidLoadBirds()26