Flappybird游戏设计.docx
- 文档编号:26897657
- 上传时间:2023-06-23
- 格式:DOCX
- 页数:25
- 大小:793.42KB
Flappybird游戏设计.docx
《Flappybird游戏设计.docx》由会员分享,可在线阅读,更多相关《Flappybird游戏设计.docx(25页珍藏版)》请在冰豆网上搜索。
Flappybird游戏设计
四川师范大学成都学院高级语言程序课程设计
Flappybird游戏程序设计
学生姓名
向华峰
学号
2014101007
所在学院
通信工程学院
专业名称
通信工程
班级
2014级移动通信方向
指导教师
周小丽
成绩
四川师范大学成都学院
二○一六年十二月
课程设计任务书
学生姓名
向华峰
学生学号
2014101007
学生专业
通信工程
学生班级
2014级移动通信方向
指导教师
周小丽
职称
助教
发题日期
2016年11月18日
完成日期
2016年12月30日
设计题目
Flappybird游戏设计
设计目的:
1、掌握java语言编程
2、了解简单游戏设计思路与方法
3、学习用java语言编写简单程序
4、了解用java语言处理图片
具体任务与要求:
1、用java完成flappybird程序设计。
2、游戏包括加载、引导、开始、游戏、结束环节。
3、记分牌、记录等设计。
4、游戏分为白天和黑夜两个场景。
5、按时完成课题设计,总结。
课程设计进度安排:
序号
内容安排
时间
1
查阅文献资料,写任务书
10.23—11.3
2
做出需求分析,列出大纲
11.30—12.3
3
列出可行的方案,并讨论修改
12.2—12.10
4
完成初稿
12.10—12.15
5
修改完善论文,总结
12.15—12.30
课程设计参考文献:
[1]冯燕奎、赵德奎:
JSP实用案例教程[M],清华大学出版社,2004.5,P70-P100
[2]王家华:
软件工程[M],东北大学出版社,2001.3,P303
[3]王宜贵:
软件工程[M],机械工业出版社,2002,P20-P79
[4]张洪斌:
java2高级程序设计[M],中科多媒体出版社,2001.11,P85-P90
[5]孙鑫:
JavaWeb开发详解[M,电子工业出版社,2006,P189-P274
指导教
师签字
院长审
核签字
Flappybird游戏程序设计
内容摘要:
flappybird是一款形式简易但难度极高的休闲游戏。
玩家需要不断控制点击屏幕的频率来调节小鸟的飞行高度和降落速度,让小鸟顺利通过画面右方的管道缝隙。
如果小鸟不小心擦碰到了管子的话,游戏便宣告结束。
本设计介绍了电脑版的该游戏的大概框架以与具体源程序代码。
关键词:
游戏设计程序
Flappybirdgameprogramming
Abstract:
Flappybirdisaformofsimplebutverycasualgames.Playersneedtokeepcontrolofthefrequencyoftheclickonthescreentoadjusttheflyingheightofthebirdsandlandingspeed,andletthebirdpipeaperturepassthepicturetotheright.Ifthebirdaccidentallybrushagainstthepipe,thegamehasended.Thisdesignintroducedthecomputerversionofthegameaboutframeworkandspecificsourceprogramcode.Keywords:
GameDesignProgram
Flappybird游戏程序设计
前言
《flappybird》是由来自越南的独立游戏开发者DongNguyen所开发的作品,该游戏于2013年5月上线,2014年年初迎来火爆之势。
目前,该游戏全球下载或已超过5千万次。
由于本游戏的成功受到质疑,研发者迫于压力,于2014年2月8日意外宣布游戏下线。
游戏中玩家必须控制一只小鸟,跨越由各种不同长度水管所组成的障碍,而这只鸟其实是根本不会飞的„„所以玩家每点击一下小鸟就会飞高一点,不点击就会下降,玩家必须控制节奏,拿捏点击屏幕的时间点,让小鸟能在落下的瞬间跳起来,恰好能够通过狭窄的水管缝隙,只要稍一分神,马上就会失败阵亡。
cocos2dxeditor,它是开发跨平台的手机游戏工具,运行window系统上,javascript脚本语言,基于cocos2d-x跨平台游戏引擎,集合代码编辑,场景设计,动画制作,字体设计,还有粒子,物理系统,地图等等的,而且调试方便,和实时模拟。
1游戏设计思路
●游戏场景:
游戏主要有三个场景组成,开始场景、主场景、结束场景
●主场景:
主场景是由上下两个水管和水管之间空隙组成,间隙时一定的,下水管可以是随机出来的,然后上水管可以由下水管的数据计算出。
●小鸟:
每次按一下向上小鸟坐标就向上加一定的高度,释放后就自由落下
●游戏成绩:
当小鸟没通过一个水管的时候分数就自加一定分值。
●死亡判断:
当小鸟碰到水管或者是地面的时候,小鸟死亡,游戏结束。
判断到小鸟坐标与水管坐标或者地面坐标在一定的范围内就可以判断其死亡。
2游戏设计过程
✧
刚想到做这个游戏。
用线程来让小鸟掉下来,用鼠标监听来控制小鸟的飞行,当时也没把各个对象抽象出来,就一个劲把它放到界面的那个类里面,然后又把地面、水管等陆续加进去,后来随着做的深入,发现这样是行不通的。
因为做这个游戏还要拿到他的坐标判断游戏是否结束,现在的问题是把小鸟、水管、地面等都放到一个类里面,根本就不方便往下做,因为这样拿不到他们的数据,比如说他们的坐标等。
✧在上面这样做行不通的时候,只有停下来思考怎么做
其实很很明显,要把各个对象抽象成为一个类(当然可能还有更好的办法,但是我觉得现在办法是行的通的),这样一个类就只管一个对象,比如说,小鸟一个类、水管一个类、地面有事一个类,这样就能更好的做下去,各个类之间关系也不会那么,让每个类具有自己单一的功能,体现低耦合的思想。
✧做小鸟是比较简单的,毕竟一个线程就能轻松搞定……
但是现在水管应该怎么做呢?
玩过这个游戏的人都知道,水管是上下对着各一根,上下水管之间的间距也是一定的,而且水管是随机出现的,这样下水管就可以的位置也就能确定了,因为知道游戏面板的高度和上下水管的间距,所以可以确定下水管的位置。
具体怎么实现,我下面会说明。
✧还有一步比较重要就是如何判断游戏的输赢。
判断游戏的输赢也可以分为两种情况,一种是小鸟掉到地上了;一种是小鸟碰到水管了。
还有一个就是计算分数了,这个可以直接写在判断输赢的类里面,只要小鸟没越过一根水管,就令一个数加一,并显示到游戏面板上就可以了。
✧当然并不是这个游戏就只有那么简单的几步。
还有其他的部分,比如说,开始的场景、结束的场景,如果真的要把做的很完美还有一点点细节需要考虑。
3图片素材下载
在编写程序之前,我们必须搜集相应的素材。
可以在网上收索,当然也可以自己画。
完整的flappybird游戏需要图片有:
背景2张(黑白场景)、小鸟、地面、上下管道以与记分牌等。
注:
为了让画面像素更高,须收集更多的运动的小鸟照片。
然后将收集到的照片分类备用,具体素材如下图所示:
4加载界面设计
此界面是游戏的引导界面,相当于是一个叫玩家等待界面。
1秒过后进入游戏主界面。
首先程序界面初始化,然后intini(void);intgame(void);intshow(void);然后获得窗口句柄HWNDhWnd=getHWnd();设置主页面的宽和
高initgraph(384,512);在Windows中,句柄是一个系统内部数据结构的引用。
例如当你操作一个窗口,或说是一个Delphi窗体时,系统会给你一个该窗口的句柄,系统会通知你:
你正在操作142号窗口,就此你的应用程序就能要求系统对142号窗口进行操作——移动窗口、改变窗口大小、把窗口最小化等等。
实际上许多WindowsAPI函数把句柄作为它的第一个参数,如GDI(图形设备接口)句柄、菜单句柄、实例句柄、位图句柄等,不仅仅局限于窗口函数。
换句话说,句柄是一种内部代码,通过它能引用受系统控制的特殊元素,如窗口、位图、图标、内存块、光标、字体、菜单等。
5游戏界面设计
游戏界面为该游戏的设计难点,包括动画、碰撞检测等等。
分为游戏前界面、游戏中界面、以与结束界面。
游戏前界面此界面与主页面相似,但没有开始按钮,在界面右边多了2根管道,程序现在就检测玩家是否在游戏界面内点击了鼠标,如果是,那么就进入了游戏中界面。
6游戏设计
4.1场景设计
如下图;主要分三层,开始场景、主场景、游戏结束场景,通过显示隐藏控制三个场景的切换
图4-1开场景
图4-2主场景
图4-3游戏结束场景
4.2游戏中界面
首先,小鸟在向前飞,其实是底部的路和水管在向左移动,相对的你就感觉小鸟在向右飞了;路循环移动代码:
MainLayer.prototype.groundRun=function()
{
varaction1=cc.MoveTo.create(0.5,cc.p(-120,0));
varaction2=cc.MoveTo.create(0,cc.p(0,0));
varaction=cc.Sequence.create(action1,action2);
this.ground.runAction(cc.RepeatForever.create(action));
}
4.3游戏结束界面
该步骤包括碰撞和落地的算法设计、分数显示、是否重来等小模块。
碰撞后,小鸟先下落,游戏结束场景显示,碰撞判断、显示分数的算法为:
MainLayer.prototype.birdFallAction=function()
{
this.gameMode=OVER;
this.bird.stopAllActions();
this.ground.stopAllActions();
varbirdX=this.bird.getPositionX();
varbirdY=this.bird.getPositionY();
vartime=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;c<3;c++)
{
pillar[c].x-=SPEED;
if(pillar[c].x<=-70)
pillar[c].x=650;
if(pillar[c].x==512)
{
pillar[c].h=(newRandom()).nextInt(200)+200;
}
}
/***************计算分数************************/
for(c=0;c<3;c++)
{
if(pillar[c].x==100)
point++;
}
/****************地面移动***********************/
a-=SPEED;
如果玩家点击了重来按钮,游戏又重新开始。
就构成了一个循环,小鸟碰撞后,玩家不想玩了,点击结束就可以结束游戏
7效果图
图5-1游戏加载和开始
.
图5-2游戏运行和小鸟落地
8结束语
经过近两个月的学习,使我对JAVA语言有了更进一步的认识和了解,要想学好它要重在实践,要通过不断的上机操作才能更好地学习它,通过实践,我也发现我的好多不足之处,首先是自己在指法上还不行,经常按错字母,通过学习也有所改进;再有对JAVA语言的一些标准库函数不太了解,还有对函数调用的正确使用不够熟悉,还有对JAVA语言中经常出现的错误也不了解,通过实践,使我在这几个方面的认识有所提高。
通过实践的学习,我知道学好计算机要重视实践操作,不仅仅是学习JAVA语言,还是其它的语言,以与其它的计算机方面的知识都要重在实践,所以后在学习过程中,我会更加注视实践操作,使自己便好地学好各门课程。
通过课程设计,普遍感到自己应用基础知识与专业知识解决问题的能力有了很大的提高,以前所学的许多课程觉得很零散,也不知道有什么用与怎么用,现在也都找到了用武之地。
同时,我也学到了在许多书本上不可能收录的东西。
例如一些设计的具体的规范,和一些设计的要求。
如何把规范里的明文规定运用到实际上去,以与运用过程中的把握上。
也学到了如何独立思考,如何自己查阅资料,如何与人相处融洽等实际经验。
今后走上社会,我主要还是靠在学校学到的知识技能来养活自己,并回报社会,回报父母,我也了解到了自己的很多不足,在今后的工作与学习中,我会不断的提高与改进。
附录
packagemcnk;
importjava.awt.Color;
importjava.awt.Font;
importjava.awt.Graphics;
importjava.awt.Graphics2D;
importjava.awt.event.MouseAdapter;
importjava.awt.event.MouseEvent;
importjava.awt.event.MouseListener;
importjava.awt.image.BufferedImage;
importjava.io.IOException;
importjava.util.Random;
importjavax.imageio.ImageIO;
importjavax.swing.JFrame;
importjavax.swing.JPanel;
importsun.audio.AudioPlayer;
importsun.audio.AudioStream;
public class FlappyBird
{
publicstaticvoidmain(String[]args)throwsException{
JFrameframe=newJFrame("我是一只小小小小鸟~!
");
Worldworld=newWorld();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();
}
}
classWorldextendsJPanel{
BufferedImagebackground;//图像缓存区,保存图片
Groundground;
Columncolumn1;
Columncolumn2;
Birdbird;
booleangameover;
BufferedImagegameoverImage;
BufferedImagestartedImage;
intscore;
booleanstart;.
publicWorld()throwsIOException{
Background=ImageIO.read(getClass().getResource("bg.png"));
gameoverImage=ImageIO.read(getClass().getResource("gameover.png"));
Started=ImageImageIO.read(getClass().getResource("start.png"));
start();
}
publicvoidstart()throwsIOException{
ground=newGround();
column1=newColumn
(1);
column2=newColumn
(2);
bird=newBird();
gameover=false;
score=0;
start=false;
}
public void paint(Graphics g){
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);
Font font = new Font(Font.SANS_SERIF,Font.BOLD,30);
g.setFont(font);
g.drawString(score+"",20,40);
Graphics2Dg2d=(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);
}
}
publicvoidaction()throwsException{
//定义鼠标监听器(匿名内部类)
MouseListenerl=newMouseAdapter(){
publicvoidmousePressed(MouseEvente){
if(gameover){
try{
start();
}catch(IOExceptione1){
e1.printStackTrace();
}
}else{
start=true;
bird.flappy();
}
}
};
addMouseListener(l);//绑定监听器
//添加背景音乐
newThread(){
publicvoidrun(){
AudioStreamas;
try{
as=newAudioStream(getClass().getResourceAsStream("music.mid"));
AudioPlayer.player.start(as);
}catch(IOExceptione){
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);
}
}}/**
*地面
*@authormcnk*
*/
classGround{
BufferedImageimage;
intx;
inty;
publicGround()throwsIOException{
image=ImageIO.read(getClass().getResource("ground.png"));
x=0;
y=500;
}
//地面移动
publicvoidstep(){
x--;
if(x<=-108){
x=0;
}
}
}
/**
*柱子
*@authormcnk
*
*/classColumn{
BufferedImageimage;
intx;//中心点X坐标
inty;//中心点Y坐标
intwidth;
intheight;
intgap;//柱子缝隙
intdistance;//柱子与柱子之间间距
Randomrandom=newRandom();
PublicColumn(intnum)
throwsIOException{
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]}
publicv
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Flappybird 游戏 设计