Step by Step,用JAVA做一个FLAPPYBIRD游戏(五)
来源:互联网 发布:淘宝折扣价怎么设置 编辑:程序博客网 时间:2024/06/07 02:18
这一篇主要讲讲怎么做小鸟的敌人——管道。
先给出管道的具体代码,然后我们慢慢分析。
public class Pipe { private Image IMG_PIPE_UP = new ImageIcon("images/pipe1.png").getImage(); private Image IMG_PIPE_DOWN = new ImageIcon("images/pipe2.png").getImage(); public int pipeType=0; private final int PIPE_TYPE_UP = 0; private final int PIPE_TYPE_DOWN = 1; public int x; public int y; public final int w = IMG_PIPE_UP.getWidth(null); public final int h = IMG_PIPE_UP.getHeight(null); public boolean isDead=false; public boolean isThrough=false; public Pipe(int type,int x,int y) { this.x=x; this.y = y; this.pipeType = type; } public void draw(Graphics g) { if(this.pipeType==PIPE_TYPE_UP) g.drawImage(IMG_PIPE_UP, x,-y, null); else if(this.pipeType==PIPE_TYPE_DOWN) g.drawImage(IMG_PIPE_DOWN, x, IMG_PIPE_DOWN.getHeight(null)+y, null); } public void logic() { this.x-=8; if(this.x<-250) { this.isDead = true; } }}
首先,加载管道的图片。有两张,一张向下,一张向上。
定义了两个常量表示向上和向下:
private final int PIPE_TYPE_UP = 0;
private final int PIPE_TYPE_DOWN = 1;
public boolean isDead=false;
public boolean isThrough=false;
这两个变量分别表示管道是否离开屏幕,是否被小鸟通过。在我们主循环中,就能通过循环管道的Vector判断是否是isDead,true就可以从Vector移除,以免一直占用内存。我们可以通过isThrough来判断小鸟是否得分。
draw方法根据管道是向上还是向下,画不同的图片。logic就是管道不停往前移动,如果移出屏幕if(this.x<-250) 就标记isDead为true。
下面来看看主循环中的管道相关的代码:
pipeCount++; //1500ms出现一个管道 if(pipeCount%30==0) { int y = (int) (Math.random()*100); if(this.isUpPiepe) { pipes.add(new Pipe(0, gameW,y)); } else { pipes.add(new Pipe(1, gameW,y)); } isUpPiepe=!isUpPiepe; } //判断管道是否与小鸟相撞 for(int i=0;i<pipes.size();i++) { Pipe pipe = pipes.get(i); int x1 = pipe.x; int y1=0; int y = pipe.y; if(pipe.pipeType==0) { y1=-y; } else if(pipe.pipeType==1) { y1=pipe.h+y; } int x2 = x1 + pipe.w; int y2 = y1 + pipe.h; //如果相撞 if(bird.isCollision(x1, y1, x2, y2) || bird.isFall()) { gameState=GAME_STATE_OVER; //撞击音效 playHit(); } //未相撞且之前未穿过该管道即得分 if(bird.x>pipe.x+pipe.w && pipe.isThrough==false) { score++; //得分音效 playPoint(); pipe.isThrough=true; } pipe.logic(); //删除离开屏幕范围的管道 if(pipe.isDead) { pipes.remove(pipe); } }
每30帧产生一个管道,加入pipes,循环pipes,判断每一个管道是否和小鸟相撞,调用小鸟的isCollision方法。如果小鸟x坐标大于管道x坐标,且之前是未通过的,则标记该管道为通过并给玩家加一分。调用管道的logic移动管道。如果管道isDead为true,就移除管道。
总结:至此,我们的游戏界面已经基本完成了,接下来我们要讲游戏结束画面了。大功就要告成了^_^
0 0
- Step by Step,用JAVA做一个FLAPPYBIRD游戏(五)
- Step by Step,用JAVA做一个FLAPPYBIRD游戏(前言)
- Step by Step,用JAVA做一个FLAPPYBIRD游戏(一)
- Step by Step,用JAVA做一个FLAPPYBIRD游戏(二)
- Step by Step,用JAVA做一个FLAPPYBIRD游戏(三)
- Step by Step,用JAVA做一个FLAPPYBIRD游戏(四)
- Step by Step,用JAVA做一个FLAPPYBIRD游戏(六)
- Step by Step,用JAVA做一个FLAPPYBIRD游戏(完)
- 卷积神经网络Step by Step(五)
- java 学习 step by step
- 精通init ramfs构建step by step (五)
- Linux驱动编程 step-by-step (五)
- Linux驱动编程 step-by-step (五)
- Linux驱动编程 step-by-step (五)
- NHibernate Step by Step (五)Criteria Query
- NHibernate Step by Step (五)Criteria Query
- NHibernate Step by Step (五)Criteria Query
- NHibernate Step by Step (五)Criteria Query
- Servlet接口五种方法介绍
- Protobuf在Unity中的应用
- Linux定时运行命令脚本——crontab
- Restore IP Addresses
- JSF中Facescontext对象详解
- Step by Step,用JAVA做一个FLAPPYBIRD游戏(五)
- vue.js中使用vueResource向后台请求数据时出现跨域访问失败的问题
- inotify配合rsync将文件时时同步到备份服务器
- Java动态编译源代码并加载执行
- 深度学习-Caffe(1)
- 蓝桥杯-算法提高-Cowboys
- Celery+django+redis异步执行任务
- google chrome adobe flash player过期解决方法
- spring boot 整合 CAS