介绍
第一篇文章,萌新能力有限,主要记录一下,请大佬多指教。
https://blog.csdn.net/codehxy/article/details/25268295
代码的主体都是来自上面链接大佬的,之所以选择Flappy Brid,一因为某人曾经喜欢玩这个游戏,二是因为比较简单= =
内容
大佬的博客里讲的很清楚了,我主要讲讲我自己做的吧。
Item类
这个类描述的是在屏幕中的道具,我自己从网上找的像素图片,然后扣下来的,分别是:字母U,R,T,H,E,[苹果图片],OF,MY,[眼睛图片],连起来就是“U R THE APPLE OF MY EYE”,算是一种暗示吧。撞到道具后会显示切换到像素效果的爆炸图片。
public class Item {
BufferedImage[] images;
BufferedImage image;
BufferedImage image2;
int x;
int y;
int index = 0;
int width;
int height;
boolean flag = true;
public Item() throws IOException {
this.x = 850;
this.y = 250;
images = new BufferedImage[9];
for(int i=0; i<9; i++){
images[i] = ImageIO.read(getClass().getResource("a"+i+".png"));
}
image = images[0];
image2 = ImageIO.read(getClass().getResource("bmob.png"));
width = image.getWidth();
height = image.getHeight();
}
public void step(){
x-=6;//每一步像左侧移动6
if(x<= -100 ){
x=630;
index++;
if(index>=9) index=0;
image = images[index];
}
}
public void paint(Graphics g) {
if (flag)
g.drawImage(image, x, y, null);
else {
g.drawImage(image2, x, y, null);
flag = true;
}
}
}
Attack类
这个类描述的是屏幕中的攻击,我把小鸟的图片水平翻转然后调成了浅黄色,然后从屏幕左侧出现,如果撞到玩家的小鸟就会扣血和扣分。
public class Attack {
BufferedImage image;
BufferedImage[] images;
int x;
int y;
int width;
int height;
Random r = new Random();
int distance = 400;
int index = 0;
public Attack(int n) throws IOException {
images = new BufferedImage[8];
for(int i=0; i<8; i++){
images[i] = ImageIO.read(getClass().getResource("b"+i+".png"));
}
image = images[0];
width = image.getWidth();
height = image.getHeight();
this.x = distance * n + 80 + 432;
this.y = r.nextInt(120) + 220;
}
public void step(){
x=x-8;
if(x<= -(111)){
x = 1200;
this.y = r.nextInt(120) + 220;
}
}
public void fly(){
//更换小鸟的动画帧图片, 其中/4 是为了调整动画更新的频率
index++;
image = images[(index/8)%images.length];
}
public void paint(Graphics g) {
g.drawImage(image, x, y, null);
}
}
hit方法
创建了上面的两个类后,要在Bird类中写相应的成员方法,判断敌方小鸟和道具是否跟玩家小鸟撞在一起了。代码如下,x和y已经item.x和item.y都是图片中心的的坐标,所以要判断碰撞需要注意图片的宽高,另外我把撞到攻击的判定范围缩小了。
/** 检查当前鸟是否碰到道具 */
public boolean hit(Item item){
if( x >= item.x-item.width/2-size/2 && x <=item.x+item.width/2+size/2){
if(y >= item.y-item.height/2-size/2 && y <= item.y+item.height/2+size/2) {
return true;
}
return false;
}
return false;
}
/** 检查当前鸟是否碰到攻击 */
public boolean hit(Attack attack){
if( x >= attack.x-attack.width/2-size/2+25 && x <= attack.x+attack.width/2+size/2-25){
if(y >= attack.y-attack.height/2-size/2+25 && y <= attack.y+attack.height/2+size/2-25) {
return true;
}
return false;
}
return false;
}
添加音频
背景音乐我选取的是钢琴版的摇滚卡农,然后得分的音效和撞击的音效都是随便网上找的。Player这个类是来自其他jar的。
new Thread(new Runnable() {
@Override
public void run() {
try {
BufferedInputStream buffer = new BufferedInputStream( new FileInputStream("music\\12.mp3"));
new Player(buffer).play();
} catch (FileNotFoundException e){
e.printStackTrace();
} catch (JavaLayerException e) {
e.printStackTrace();
}
}
}).start();
风格
改了暗色调的背景,把柱子的颜色调暗了,加了阴影,感觉比蓝天白云看起来更有感觉?
速度调整
加快了速度,也就是在step()方法中:x-=n;把n调大了,这样柱子就会飞快的左移,然后敌方小鸟和道具也同样的道理
其他调整
或许加个得到多少分显示不同的结算画面比较好吧…这里可以加一些想说的话什么的…
演示效果
添加一段演示效果吧
关于打包
如果对方没有安装JRE的话可能就不太好了,运行不了。
我查的需要把JRE和工程文件打包的jar放在一个文件夹里,像这样:
run.bat里面填写:
start jre\bin\javaw -jar myjava.jar
这个如果没有音乐的话是可以在任何环境正常运行的,就是有文件点大,但音乐文件不知道怎么添加到jar中,能力有限,正在学习。
源码
https://download.csdn.net/download/qq_23841127/12431757
来源:oschina
链接:https://my.oschina.net/u/4363105/blog/4284830