俄罗斯方块OPENGL大作业.docVIP

  1. 1、本文档共4页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
俄罗斯方块OPENGL大作业

俄罗斯方块 ---OPENGL大作业 杨博量 实验题目 俄罗斯方块 回忆起儿时火拼俄罗斯方块的情景,加上在多媒体接触了OPENGL这一绘图动画工具,所以萌生了自己用OPENGL写一个俄罗斯方块的想法。 实验编程步骤 ⒈为OPENGL绘图做好各项准备工作,比如在项目设置里面添加对应的库文件,在对应的程序文件里面包含OPENGL库文件。在PreCreateWindow(), OnCreate(),OnDestroy(), OnSize(), 等函数里面做好相应的准备,还要设置逻辑调色板等。 ⒉我的初始化openGL场景的代码在自定义的InitializeOpenGL(CDC* pDC)函数里面。里面大概做了设置像素格式,取得着色描述表,激活着色描述表,启用纹理映射,启用阴影平滑,置黑色背景,设置深度缓存,开启深度测试,还有将绘图所要用到的纹理装载到一个名为texture的数组里面。 3.我设置的游戏场景主要有四个。 1)第一个:游戏之前的难度选择场景。界面如下图所示 界面显示有9个难度,此时你可以通过上下左右方向键移动上面那个方框来选择难度,难度越大,俄罗斯方块下落的速度就越快。 实现的方法:先画一合适大小的矩形,再贴上上面那个纹理。而可以移动用来选择难度的框框是另外一个纹理,在启用黑白掩模混合屏幕颜色之后来实现的 glBlendFunc(GL_DST_COLOR,GL_ZERO); //使用黑白掩模混合屏幕颜色 glEnable(GL_BLEND); //启用混合 glBindTexture(GL_TEXTURE_2D, texture[6]); //启用表示选择难度的框框的纹理 2)第二个:游戏时的方块下落的场景 i)在上图中,右下角所显示的俄罗斯方块表示的是下一个将要出现的俄罗斯方块。 实现这个功能是这样的:在当前的方块到达底部之后,调用NewBlock();函数产生下一个将要随机出现的方块,保存在nextblockmap[4][5]的二维数组里面,而在显示这个将要出现的方块的小黑框里面,我根据合适的大小设定出一个个方块大小的空间,然后在这个空间内绘方块,nextblockmam[i][j]=1的就画上一个小方块,如果nextblockmam[i][j]=0 则什么也不做。从而就画出了方块。 关于NewBlock()这个随机产生下一个俄罗斯方块的函数。我作一点解释,由于要随机产生的方块只有7 种,所以type = rand()%7既可,再在下面中用switch语句根据type的值设置各种情况。 ii)实现方块的不断下落直至到达底端或者其它方块上面是用SetTimer和OnTimer来实现的,而在SetTimer(1, speed, NULL);里面的第二个参数speed就是用来控制方块的下落速度的,选择的level越高,speed的值就越小,从而使方块下落的速度就越快。 iii)实现按方向键上下左右时,方块作相应的移动是在函数MoveLeft();MoveRight();Rotate();MoveDown();里实现的,每按某一键则触发与之相应的函数,从而实现相应的左移右移旋转,以及加速下落的功能。 iv)判断是否得分并消掉吃掉的一行或几行方块是在CheckWin()函数里面实现的,每次方块下落到底部或其它方块上面时,方块下落的区域的状态就会置成1,没有方块的地方是0 (记录这些状态的是一个int map[10][20]数组,在上面的图的左侧大黑框,就是方块下落的区域,我将它割成了10列20行的空间,每一格的状态都记录在map数组里面) 这时,在CheckWin()里面就会扫描map数组,若某一行全为1 ,则将这一行消掉,消掉的方法是利用将一行的状态赋给该行,即循环执行map[l][k + 1] = map[l][k];语句。在消掉这些行的同时在分数栏增加相应的分数。 3)第三个游戏结束的场景 如上图当CheckWin()函数检测到最顶端一行在map数组里面的标志为1时,就结束游戏,就是将标志gamefinish = true;(当为游戏运行时gamerun = true;在选择难度画面时标志gameintro = true;游戏胜利时gamewin=true ;在任意时刻,这四个标志,只能有一个能为真。) 再调用DrawGameF

文档评论(0)

chenchenb + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档