1、13. 重庆海天软件工程学院微软7班WINFORM实训项目-疯狂的小鸟14. 微软讲师:丁浩Email:dinghao80QQ:37112555 15. 项目需求:射击游戏16. 实现步骤:1.采用GDI+技术,双缓冲实训精灵的绘制17. 2.绘制背景 18. 3.绘制小鸟19. 4.绘制小猪20. 5.绘制子弹21. /summary22. publicpartialclassForm1:Form23. 24. Form1()25. 26. InitializeComponent();27. 28. Bitmapbitmap;29. Pigpig;30. /第七步4 31. Listbull
2、ets=new();32. BirdOPbirdop;33. /第十步6:当子弹碰到小鸟的开关34. boolisTouchedfalse;35. privatevoidtimer1_Tick(objectsender,EventArgse)36. 37. /在time控件中循环绘制,约33帧的FPS 38. /第一步:导入所需资源39. /第二步:搭建双缓冲模型,将资源不断的绘制在虚拟画布上面,这个技术可以消除屏幕闪烁40. /最后将虚拟画布bitmap的内容复制在窗体绘图区41. 42. (Graphicsdc=Graphics.FromImage(bitmap)43. 44. /第三步:
3、导入背景图片资源45. BackGroundbgBackGround(this.Width,this.Height);46. bg.Draw(dc);47. /固定窗体不能拖动48. 49. /*-/第一阶段完成。思考:BackGround设计成了一个类,为什么?好处在哪儿?- 50. /第四步:绘制小鸟需求一共64只小鸟,成8*8排列设计小鸟类51. 52. /第九步6:53. birdop.Draw(dc);/之前要装载小鸟54. 55. 56. 57. /*-/第二阶段完成。- 58. /第五步:绘制小猪59. 60. pig.Width70;61. pig.Height60;62. 6
4、3. pig.Draw(this,dc);64. 65. /*-/第三阶段完成- 66. /第六步:移动小猪67. /触发键盘事件:注意思考,事件源是什么?-窗体68. 69. /第七步6:绘制子弹70. foreach(Bulletbulletinbullets)71. 72. /第八步2:让speed值增加,现在找个地方赋予speed初始值73. /bullet.Speed+=10;/没有起到作用74. bullet.X-=bullet.Speed;75. bullet.Draw(dc);76. 77. /*-第六阶段完成(让子弹飞)-下一阶段:子弹碰撞小鸟,子弹和小鸟移除集合- 78.
5、/思考:子弹碰撞小鸟,只需要在time控件中从小鸟集合中绘制,子弹从子弹集合里面绘制。碰撞后,从各种集合移除小鸟或子弹即可。79. 80. /第十步1:判断子弹和小鸟相撞,实际上就是2个矩形相交。追加子弹的方法。81. 82. /第十步5:83. for(inti0;bullets.Count;i+)/遍历子弹,注意这个时候不能用foreach,为什么?84. 85. jBirdOP.birds.Count;j+)/遍历小鸟86. 87. if(bulletsi.Intersect(BirdOP.birdsj)/每一个子弹去判断所有的小鸟碰撞88. 89. BirdOP.birds.Remov
6、eAt(j);/移除小鸟测试成功但是同时要移除子弹90. true;91. 92. 93. /移除子弹94. (isTouched)95. 96. bullets.RemoveAt(i);97. 98. 99. /测试成功100. /*-第八阶段完成到这儿就结束了思考加入声音,由于机房没有音响,不好测试。- 101. /我们发现在构造BirdPig等到类的时候,发现都有共同的属性,这个时候可以用继承来实现,需要进一步改进,还要有更好的扩展性,大家在学习面向对象的时候102. /要积极思考面向对象的三大特性,封装继承多态接口抽象类结构枚举等等C#的特性103. /实训制作人:丁浩老师371125
7、55这个视频会放在中下载,欢迎大家学习,谢谢!104. 105. 106. 107. 108. /第二步:复制绘制在窗体绘图区109. g=this.CreateGraphics()110. 111. g.DrawImage(bitmap,0,0);112. 113. 114. 115. Form1_Load(object116. 117. 创建和窗体一样大小的画布118. bitmapBitmap(this.Width,119. /初始化小猪120. pigPig();121. pig.Step10;122. /第九步5:初始化小鸟123. /birdBird();124. /bird.Lo
8、adBird();125. /做到这个地方,我们发现在bird设计中出现了问题。需要重新设计,没有思考全面。126. birdopBirdOP();127. 128. birdop.LoadBirds();129. 130. 131. /第六步触发键盘事件移动小猪132. Form1_KeyUp(objectKeyEventArgs133. 134. switch(e.KeyCode)135. 136. caseKeys.Up:137. pig.Move(Direct.UP);138. break;139. Keys.Down:140. pig.Move(Direct.DOWN);141. 1
9、42. Keys.Space:143. /第七步5:装载子弹在集合中144. bullets.Add(pig.FireABullet();145. 146. 147. 148. 149. /*-第四阶段完成- 150. 151. 背景类:BackGround(intwidth,intheight)Widthwidth;Heightheight;intgetreturnsetwidthvalue;height/绘制一个背景图片Draw(Graphicsg)Rectanglerect=newRectangle(0,0,Width,Height);g.DrawImage(MyRes.background,rect);小鸟类:Birdx;/x坐标Xxy;/y坐标Yy/小鸟的矩形绘图区第十步3 rectBird;RectBirdrectBird小鸟操作类:1. 2. using3. using4. using5. using7. namespace8. 第九步6:重新设计小鸟类增加了一个小鸟操作类/第九步2:定义一个集合staticBirdbirds/为什么是静态的呢?如18. 果不是静态的,每次new一个小鸟,都会有属于自己的集合,显然不对。所以用静态的20. ,所有的小鸟对象都对应这一个集合/绘制8*8小鸟阵/第九步3:装入64只小鸟到集合中LoadBirds()26