一、项目目录结构 二、关于游戏窗体和游戏面板这是一个Java小游戏,带背景音乐的飞机大战,简单易上手,一共九个代码段,具体代码和游戏制作如下:
Gameframe.Java
package ui;import javax.swing.Jframe;public class Gameframe extends Jframe {public Gameframe() {//设置标题 方法来源于Jframe类setTitle("全民飞机大战");//设置大小 setSize(宽度,高度);setSize(512,768);//设置位置居中显示//快捷键:Alt+? 开启代码提示//null相对于屏幕左上角居中setLocationRelativeTo(null);//设置不允许玩家改变界面大小setResizable(false);//设置默认的关闭选项//关闭窗体的时候退出程序setDefaultCloseOperation(Jframe.EXIT_ON_CLOSE);}public static void main(String arg[]) {//创建窗体对象:调用窗体的构造方法,制作窗体Gameframe frame=new Gameframe();//创建面板对象:调用面板的构造方法,制作面板GamePanel panel = new GamePanel(frame);//方便在面板中添加键盘监听器//调用开始游戏的方法,启动游戏panel.action();//将面板加入到窗体中frame.add(panel);//显示窗体 true显示 false隐藏frame.setVisible(true);//Music music=new Music();//music.player();String filepath="src/img/game_music.wav";musicStuff musicObject=new musicStuff();musicObject.playMusic(filepath);}}
package ui;import java.awt.Color;import java.awt.Font;import java.awt.Graphics;//import java.awt.List;import java.awt.event.KeyAdapter;import java.awt.event.KeyEvent;import java.awt.event.MouseAdapter;import java.awt.event.MouseEvent;import java.awt.image.BufferedImage;import java.io.File;import java.io.IOException;import java.util.ArrayList;import java.util.List;import java.util.Random;import javax.sound.sampled.AudioFormat;import javax.sound.sampled.AudioInputStream;import javax.sound.sampled.AudioSystem;import javax.sound.sampled.DataLine;import javax.sound.sampled.FloatControl;import javax.sound.sampled.SourceDataLine;import javax.sound.sampled.UnsupportedAudioFileException;import javax.swing.JPanel;public class GamePanel extends JPanel{//1.定义背景图BufferedImage bg;//背景图//创建英雄机对象Hero hero=new Hero();//创建敌机对象//Ep ep=new Ep();//创建敌机的大本营(所有的敌机都放在这里)//使用集合不使用数组,是因为数组必须指定长度,而此游戏中,敌机数量不确定。List
Ep.java
package ui;import java.awt.image.BufferedImage;import java.util.Random;public class Ep extends FlyObject {int sp;//敌机的速度public int hp;//敌机的血量int type;//敌机的类型//BufferedImage img;//int x;//敌机的横坐标//int y;//敌机的纵坐标//int w;//敌机的宽度//int h;//敌机的高度public Ep() {//确定随机数的类Random rd=new Random();//生成一个随机数,用来选取图片,随机数为1,则为第一张图片以此类推int index=rd.nextInt(15)+1;//设置敌机的类型type=index;//三目运算符//格式:条件表达式?值1:值2//表达式为true,取值1,否则值2String path="/img/ep"+(index<10?"0":"")+index+".png";//常见笔试题//加号可以用来做加法运算,也可以用连接内容//加号遇到双引号之前,都做加法运算//加号遇到双引号开始及之后,都只能做连接,连接之后的结果为字符串//确定敌机显示的图片img=App.getImg(path);y=-h;//确定敌机的大小w=img.getWidth();//确定敌机的位置//nextInt(num) 表示会在[0,num)之间随机生成一个整数x=rd.nextInt(512-w);h=img.getHeight();//设置敌机的速度,序号越大,速度越慢sp=17-index;}public void move() {if(type==1||type==7||type==12) {x-=1;y+=sp;}else if(type==2||type==6||type==11) {x+=2;y+=sp;}else if(type==3||type==8||type==13){x+=1;y+=sp;}else if(type==4||type==9||type==14){x-=2;y+=sp;}else if(type==15) {//敌机导弹速度快y+=20;}else if(type==5||type==10) {y+=sp;}}public boolean shootBy(Fire f) {boolean hit=x<=f.x+f.w &&x>=f.x-w &&y<=f.y+f.h &&y>=f.y-h;return hit;}//将英雄机看成子弹,复制上面的代码public boolean hitBy(Hero f) {boolean hit=x<=f.x+f.w &&x>=f.x-w &&y<=f.y+f.h &&y>=f.y-h;return hit;}}
FlyObject.java
package ui;import java.awt.image.BufferedImage;public class FlyObject {//飞行物的图片BufferedImage img;int x;//飞行物的横坐标int y;//飞行物的纵坐标int w;//飞行物的宽度int h;//飞行物的高度}
package ui;public class Fire extends FlyObject {//子弹当前移动的方向int dir;//dir 为0:左上角 为1:垂直向上 为2:右上角 public Fire(int hx,int hy,int dir) {//确定子弹的图片img=App.getImg("/img/fire.png");//确定子弹的大小w=img.getWidth()/4;h=img.getHeight()/4;//确定子弹的位置(初始位置在英雄机的上方)x=hx;y=hy;//属性的名字和参数的名字相同时,要加thisthis.dir=dir;}public void move(){if(dir==0) {//左上角飞x-=1;y-=10;}else if(dir==1){//垂直飞y-=10;}else {//右上角飞x+=1;y-=10;}}}
Hero.java
package ui;import java.awt.image.BufferedImage;public class Hero extends FlyObject {int hp;//确定英雄机的血量//英雄机的图片//BufferedImage img;//英雄机的横坐标//int x;//英雄机的纵坐标//int y;//英雄机的宽度//int w;//英雄机的高度//int h;public Hero() {//确定游戏开始时,英雄机显示的图片img=App.getImg("/img/hero.png");//使用横纵坐标,确定英雄机的初始位置x=200;y=500;//确定英雄机的大小,使用图片的大小作为飞机的大小w=img.getWidth();h=img.getHeight();//确定游戏开始时,英雄机的初始血量hp=3;}public void moveToMouse(int mx,int my) {x=mx-w/2;y=my-h/2;//x,y各减1/2,让鼠标作用在英雄机的中心位置//System.out.println(x+","+y);}public void moveUp() {//英雄机向上移动y-=100;}public void moveDown() {//英雄机向下移动y+=100;}public void moveLeft() {//英雄机向左移动x-=100;}public void moveRight() {//英雄机向右移动x+=100;}}
四、插入背景音乐Music.java
package ui;import java.io.File;import java.io.IOException;import javax.sound.sampled.AudioFormat;import javax.sound.sampled.AudioInputStream;import javax.sound.sampled.AudioSystem;import javax.sound.sampled.DataLine;import javax.sound.sampled.LineUnavailableException;import javax.sound.sampled.SourceDataLine;import javax.sound.sampled.UnsupportedAudioFileException;public class Music {private int t = 0; // 音乐播放时间AudioInputStream bgm;private boolean playing = false;public boolean isPlaying() {return playing;}public void setPlaying(boolean playing) {this.playing = playing;}public int getT() {return t;}public void setT(int t) {this.t = t;}public Music() {try {bgm = AudioSystem.getAudioInputStream(new File("src/img/game_music.wav"));} catch (UnsupportedAudioFileException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();} // 获得音频输入流}public void player() {AudioInputStream ais;AudioFormat baseFormat;DataLine.Info info;ais = bgm;baseFormat = ais.getFormat(); // 指定声音流中特定数据安排info = new DataLine.Info(SourceDataLine.class, baseFormat);SourceDataLine line = null; //该数据线处理字节的缓冲并将其传递到混频器try {line = (SourceDataLine) AudioSystem.getLine(info);line.open(baseFormat);// 打开具有指定格式的行,这样可使行获得所有所需的系统资源并变得可操作。line.start();// 允许数据行执行数据 I/Oint BUFFER_SIZE = 4000 * 4;int intBytes = 0;byte[] audioData = new byte[BUFFER_SIZE]; // 音频数据数组while (intBytes != -1 && (playing == false)) {intBytes = ais.read(audioData, 0, BUFFER_SIZE);// 从音频流读取指定的最大数量的数据字节,并将其放入给定的字节数组中。if (intBytes >= 0) {line.write(audioData, 0, intBytes);// 通过此源数据行将音频数据写入混频器。t += 1;}//System.out.println(t);}} catch (LineUnavailableException | IOException e1) {e1.printStackTrace();}}}
五、 处理图片的工具类
App.java
package ui;import java.awt.image.BufferedImage;import java.io.IOException;import javax.imageio.ImageIO;public class App {public static BufferedImage getImg(String path) {//加载图片//java中的IO流,输送数据的管道//输入输出流//App.class找到App类的路径//getResource()获取资源try {BufferedImage img=ImageIO.read(App.class.getResource(path));//如果找到图片就将图片返回return img;} catch (IOException e) {//catch如果找不到图片,就会捕获找不到图片的原因e.printStackTrace();}return null;}}
六、运行截图
需要游戏素材的小伙伴点赞加关注私聊哈~~~ 瑞斯拜~~~