Flappybird游戏设计.doc_第1页
Flappybird游戏设计.doc_第2页
Flappybird游戏设计.doc_第3页
Flappybird游戏设计.doc_第4页
Flappybird游戏设计.doc_第5页
免费预览已结束,剩余17页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

四川师范大学成都学院课题报告四川师范大学成都学院高级语言程序课程设计Flappy bird游戏程序设计学生姓名向华峰学 号2014101007所在学院通信工程学院专业名称通信工程班 级2014级移动通信方向指导教师周小丽成 绩 四川师范大学成都学院二一六年十二月I课程设计任务书学生姓名 向华峰学生学号2014101007学生专业通信工程学生班级2014级移动通信方向指导教师周小丽职 称助教发题日期2016年11 月18 日完成日期2016 年12 月 30日设计题目Flappybird游戏设计设计目的:1、 掌握java语言编程 2、 了解简单游戏设计思路及方法 3、 学习用java语言编写简单程序4、了解用java语言处理图片 具体任务及要求:1、 用java完成flappy bird程序设计 。2、游戏包括加载、引导、开始、游戏、结束环节。 3、 记分牌、记录等设计。 4、 游戏分为白天和黑夜两个场景。 5、 按时完成课题设计,总结。课程设计进度安排:序号内容安排时间1查阅文献资料,写任务书10.2311.32做出需求分析,列出大纲11.3012.33列出可行的方案,并讨论修改12.212.104完成初稿12.1012.155修改完善论文,总结12.1512.30课程设计参考文献: 1冯燕奎、 赵德奎:JSP实用案例教程M ,清华大学出版社, 2004. 5,P 70-P100 2王家华:软件工程M, 东北大学出版社,2001.3,P303 3王宜贵:软件工程M ,机械工业出版社,2002,P20-P79 4张洪斌:java2高级程序设计M,中科多媒体出版社 ,2001.11,P85-P905孙鑫:Java Web开发详解M,电子工业出版社,2006,P189-P274指导教师签字院长审核签字IFlappy bird游戏程序设计内容摘要:flappy bird是一款形式简易但难度极高的休闲游戏。玩家需要不 断控制点击屏幕的频率来调节小鸟的飞行高度和降落速度,让小鸟顺利通过画面右方的管道缝隙。如果小鸟不小心擦碰到了管子的话,游戏便宣告结束。 本设计介绍了电脑版的该游戏的大概框架以及具体源程序代码。 关键词:游戏 设计 程序Flappy bird game programmingAbstract: Flappy bird is a form of simple but very casual games. Players need to keep control of the frequency of the click on the screen to adjust the flying height of the birds and landing speed, and let the bird pipe aperture pass the picture to the right. If the bird accidentally brush against the pipe, the game has ended. This design introduced the computer version of the game about framework and specific source program code. Keywords:Game Design Program 目 录前言11 游戏设计思路12 游戏设计过程13 图片素材下载34 加载界面设计45 游戏界面设计46 游戏设计44.1 场景设计44.2 游戏中界面64.3 游戏结束界面67 效果图8参考文献17IIFlappy bird游戏程序设计前言 flappy bird是由来自越南的独立游戏开发者Dong Nguyen所开发的作品,该游戏于2013年5月上线,2014年年初迎来火爆之势。目前,该游戏全球下载或已超过5千万次。由于本游戏的成功受到质疑,研发者迫于压力,于2014年2月8日意外宣布游戏下线。游戏中玩家必须控制一只小鸟,跨越由各种不同长度水管所组成的障碍,而这只鸟其实是根本不会飞的所以玩家每点击一下小鸟就会飞高一点,不点击就会下降,玩家必须控制节奏,拿捏点击屏幕的时间点,让小鸟能在落下的瞬间跳起来,恰好能够通过狭窄的水管缝隙,只要稍一分神,马上就会失败阵亡。cocos2dx editor,它是开发跨平台的手机游戏工具,运行window系统上,javascript脚本语言,基于cocos2d-x跨平台游戏引擎, 集合代码编辑,场景设计,动画制作,字体设计,还有粒子,物理系统,地图等等的,而且调试方便,和实时模拟。1 游戏设计思路l 游戏场景:游戏主要有三个场景组成,开始场景、主场景、结束场景l 主场景:主场景是由上下两个水管和水管之间空隙组成,间隙时一定的,下水管可以是随机出来的,然后上水管可以由下水管的数据计算出。l 小鸟:每次按一下向上小鸟坐标就向上加一定的高度,释放后就自由落下l 游戏成绩:当小鸟没通过一个水管的时候分数就自加一定分值。l 死亡判断:当小鸟碰到水管或者是地面的时候,小鸟死亡,游戏结束。判断到小鸟坐标与水管坐标或者地面坐标在一定的范围内就可以判断其死亡。2 游戏设计过程 刚想到做这个游戏。 用线程来让小鸟掉下来,用鼠标监听来控制小鸟的飞行,当时也没把各个对象抽象出来,就一个劲把它放到界面的那个类里面,然后又把地面、水管等陆续加进去,后来随着做的深入,发现这样是行不通的。因为做这个游戏还要拿到他的坐标判断游戏是否结束,现在的问题是把小鸟、水管、地面等都放到一个类里面,根本就不方便往下做,因为这样拿不到他们的数据,比如说他们的坐标等。 在上面这样做行不通的时候,只有停下来思考怎么做 其实很很明显,要把各个对象抽象成为一个类(当然可能还有更好的办法,但是我觉得现在办法是行的通的),这样一个类就只管一个对象,比如说,小鸟一个类、水管一个类、地面有事一个类,这样就能更好的做下去,各个类之间关系也不会那么,让每个类具有自己单一的功能,体现低耦合的思想。 做小鸟是比较简单的,毕竟一个线程就能轻松搞定 但是现在水管应该怎么做呢?玩过这个游戏的人都知道,水管是上下对着各一根,上下水管之间的间距也是一定的,而且水管是随机出现的,这样下水管就可以的位置也就能确定了,因为知道游戏面板的高度和上下水管的间距,所以可以确定下水管的位置。具体怎么实现,我下面会说明。 还有一步比较重要就是如何判断游戏的输赢。 判断游戏的输赢也可以分为两种情况,一种是小鸟掉到地上了;一种是小鸟碰到水管了。还有一个就是计算分数了,这个可以直接写在判断输赢的类里面,只要小鸟没越过一根水管,就令一个数加一,并显示到游戏面板上就可以了。 当然并不是这个游戏就只有那么简单的几步。 还有其他的部分,比如说,开始的场景、结束的场景,如果真的要把做的很完美还有一点点细节需要考虑。3 图片素材下载 在编写程序之前,我们必须搜集相应的素材。可以在网上收索,当然也可以自己画。完整的flappy bird游戏需要图片有:背景2张(黑白场景)、小鸟、地面、上下管道以及记分牌等。注:为了让画面像素更高,须收集更多的运动的小鸟照片。然后将收集到的照片分类备用,具体素材如下图所示:4 加载界面设计 此界面是游戏的引导界面,相当于是一个叫玩家等待界面。1秒过后进入游戏主界面。首先程序界面初始化,然后int ini(void);int game(void);int show(void); 然后获得窗口句柄HWND hWnd = getHWnd(); 设置主页面的宽和高initgraph(384,512); 在Windows中,句柄是一个系统内部数据结构的引用。例如当你操作一个窗口,或说是一个Delphi窗体时,系统会给你一个该窗口的句柄,系统会通知你:你正在操作142号窗口,就此你的应用程序就能要求系统对142号窗口进行操作移动窗口、改变窗口大小、把窗口最小化等等。实际上许多Windows API函数把句柄作为它的第一个参数,如GDI(图形设备接口)句柄、菜单句柄、实例句柄、位图句柄等,不仅仅局限于窗口函数。换句话说,句柄是一种内部代码,通过它能引用受系统控制的特殊元素,如窗口、位图、图标、内存块、光标、字体、菜单等。5 游戏界面设计 游戏界面为该游戏的设计难点,包括动画、碰撞检测等等。分为游戏前界面、游戏中界面、以及结束界面。 游戏前界面此界面与主页面相似,但没有开始按钮,在界面右边多了2根管道,程序现在就检测玩家是否在游戏界面内点击了鼠标,如果是,那么就进入了游戏中界面。6 游戏设计4.1 场景设计如下图;主要分三层,开始场景、主场景、游戏结束场景,通过显示隐藏控制三个场景的切换3图4-1开场景图4-2主场景图4-3游戏结束场景4.2 游戏中界面 首先,小鸟在向前飞,其实是底部的路和水管在向左移动,相对的你就感觉小鸟在向右飞了;路循环移动代码:MainLtotype.groundRun = function () var action1 = cc.MoveTo.create(0.5, cc.p(-120, 0); var action2 = cc.MoveTo.create(0, cc.p(0, 0); var action = cc.Sequence.create(action1, action2); this.ground.runAction(cc.RepeatForever.create(action);4.3 游戏结束界面 该步骤包括碰撞和落地的算法设计、分数显示、是否重来等小模块。碰撞后,小鸟先下落,游戏结束场景显示, 碰撞判断、显示分数的算法为:MainLtotype.birdFallAction = function () this.gameMode = OVER; this.bird.stopAllActions(); this.ground.stopAllActions(); var birdX = this.bird.getPositionX(); var birdY = this.bird.getPositionY(); var time = birdY / 2000; this.bird.runAction(cc.Sequence.create( cc.DelayTime.create(0.1), cc.Spawn.create(cc.RotateTo.create(time,90), cc.MoveTo.create(time, cc.p(birdX, 50) );this.overNode.setVisible(true); 如果发生了碰撞或者落地,那么游戏结束,向屏幕弹出游戏结束和重来画面、显示分数、以及分数榜。碰撞后鸟向下落,直到掉到地上。for(c=0;c3;c+) pillarc.x-=SPEED; if(pillarc.x=-70) pillarc.x=650; if(pillarc.x=512) pillarc.h=(new Random().nextInt(200)+200; /*计算分数*/ for(c=0;c3;c+) if(pillarc.x=100) point+; /*地面移动*/ a-=SPEED; 如果玩家点击了重来按钮,游戏又重新开始。就构成了一个循环,小鸟碰撞 后,玩家不想玩了,点击结束就可以结束游戏7 效果图图5-1游戏加载和开始.图5-2 游戏运行和小鸟落地8 结束语 经过近两个月的学习,使我对JAVA 语言有了更进一步的认识和了解,要想学好它要重在实践,要通过不断的上机操作才能更好地学习它,通过实践,我也发现我的好多不足之处,首先是自己在指法上还不行,经常按错字母,通过学习也有所改进;再有对JAVA语言的一些标准库函数不太了解,还有对函数调用的正确使用不够熟悉,还有对JAVA语言中经常出现的错误也不了解,通过实践,使我在这几个方面的认识有所提高。通过实践的学习,我知道学好计算机要重视实践操作,不仅仅是学习JAVA语言,还是其它的语言,以及其它的计算机方面的知识都要重在实践,所以后在学习过程中,我会更加注视实践操作,使自己便好地学好各门课程。通过课程设计,普遍感到自己应用基础知识及专业知识解决问题的能力有了很大的提高,以前所学的许多课程觉得很零散,也不知道有什么用及怎么用,现在也都找到了用武之地。同时,我也学到了在许多书本上不可能收录的东西。例如一些设计的具体的规范,和一些设计的要求。如何把规范里的明文规定运用到实际上去,以及运用过程中的把握上。也学到了如何独立思考,如何自己查阅资料,如何与人相处融洽等实际经验。今后走上社会,我主要还是靠在学校学到的知识技能来养活自己,并回报社会,回报父母,我也了解到了自己的很多不足,在今后的工作与学习中,我会不断的提高与改进。附录 package mcnk; import java.awt.Color; import java.awt.Font; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.awt.event.MouseListener; import java.awt.image.BufferedImage; import java.io.IOException; import java.util.Random; import javax.imageio.ImageIO; import javax.swing.JFrame; import javax.swing.JPanel;import sun.audio.AudioPlayer; import sun.audio.AudioStream;publicclassFlappyBird public static void main(String args) throws Exception JFrame frame = new JFrame(我是一只小小小小鸟!); World world = new World(); frame.add(world); frame.setSize(432,644+30); frame.setVisible(true); frame.setResizable(false);/是否重设大小 frame.setLocationRelativeTo(null);/设置位置 frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);/关闭操作world.action();class World extends JPanel BufferedImage background;/图像缓存区,保存图片 Ground ground; Column column1; Column column2; Bird bird; boolean gameover; BufferedImage gameoverImage; BufferedImage startedImage; int score; boolean start; . public World() throws IOException Background=ImageIO.read(getClass().getResource(bg.png);gameoverImage=ImageIO.read(getClass().getResource(gameover.png); Started=ImageImageIO.read(getClass().getResource(start.png);start(); public void start() throws IOException ground = new Ground(); column1 = new Column(1); column2 = new Column(2); bird = new Bird(); gameover = false; score = 0; start = false;publicvoidpaint(Graphicsg)g.drawImage(background,0,0,null);g.drawImage(column1.image,column1.x-column1.width/2,column1.y-column1.height/2,null);g.drawImage(column2.image,column2.x-column2.width/2,column2.y-column2.height/2,null);g.drawImage(ground.image,ground.x,ground.y,null);g.setColor(Color.WHITE);Fontfont=newFont(Font.SANS_SERIF,Font.BOLD,30);g.setFont(font);g.drawString(score+,20,40); Graphics2D g2d = (Graphics2D)g; g2d.rotate(-bird.alpha, bird.x, bird.y);/旋转坐标系 g.drawImage(bird.image,bird.x - bird.width/2, bird.y - bird.height/2, null); g2d.rotate(bird.alpha, bird.x, bird.y); if(gameover)/绘制结束背景 g.drawImage(gameoverImage,0,0,null); if(!start)/绘制开始背景 g.drawImage(startedImage,0,0,null); public void action() throws Exception /定义鼠标监听器(匿名内部类) MouseListener l = new MouseAdapter() public void mousePressed(MouseEvent e) if(gameover) try start(); catch (IOException e1) e1.printStackTrace(); else start = true; bird.flappy(); ;addMouseListener(l);/绑定监听器 /添加背景音乐 new Thread() public void run() AudioStream as; try as = new AudioStream(getClass().getResourceAsStream(music.mid); AudioPlayer.player.start(as); catch (IOException e) e.printStackTrace(); .start(); while(true) if(!gameover) if(start) column1.step(); column2.step(); bird.step(); ground.step(); bird.fly(); if(bird.x = column1.x | bird.x = column2.x) score+; if(bird.hit(ground) | bird.hit(column1) | bird.hit(column2) gameover = true; repaint();/尽快重新调用paint()绘图 Thread.sleep(1000/100); /* * 地面 * author mcnk * */ class Ground BufferedImage image; int x; int y; public Ground() throws IOException image = ImageIO.read(getClass().getResource(ground.png); x = 0; y = 500; /地面移动 public void step() x-; if(x = -108) x = 0; /* * 柱子 * author mcnk * */ class Column BufferedImage image; int x; /中心点X坐标 int y; /中心点Y坐标 int width; int height; int gap; /柱子缝隙 int distance;/柱子与柱子之间间距 Random random = new Random(); Public Column(int num) throws IOException image = ImageIO.read(getClass().getResource(column.png); width = image.getWidth(); height = image.getHeight(); gap = 144; distance = 245; x = (num -1) * distance + (432+width/2); y = random.nextInt(250) + 132;/132, 132+279 public void step() x-; if(x = -width/2) x = 2 * distance - width/2; y = random.nextInt(250) + 132; /* * 小鸟 * author mcnk * */ class Bird BufferedImage images;/保存鸟的所有活动状态 BufferedImage image;/保存当前鸟的状态 int x; int y; int width; int height; int size; double g;/重力加速度 double h;/经过时间t秒后的垂直位移 double s;/经过时间t秒后的水平位移 double t;/时间 double speed;/速度(初始速度:V0/经过时间t秒后的速度:Vt) double alpha;/倾角 int index;/当前图片的下标 public Bird() throws IOException images = new BufferedImage8; for(int i=0; i images.length imagesi = ImageIO.read(getClass().getResource(i+.png); image = images0; width = image.getWidth(); height = image.getHeight(); x = 132; y = 280; size = 40; g = 4; h = 0; s = 0; speed = 20; t = 0.25; alpha = 0; index = 0; public void step() double v0 = speed; h = v0*t - 0.5*g*t*t; double vt = v0 - g*t; s = v0 * t; y = y -

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论