520用修改的FlappyBird小游戏表白

半腔热情 提交于 2020-08-14 12:39:39

介绍

第一篇文章,萌新能力有限,主要记录一下,请大佬多指教。
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






易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!