java实现飞机大战,供大家参考,具体内容如下
用Java写个飞机大战游戏练习一下,实现可播放游戏背景音乐和游戏的基本功能
设计
1、准备好相应的图片和背景音乐(.wav文件);
2、直接看源码;
3、还有部分功能未实现。
源码
package forGame
加载游戏图片类
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
|
package forGame;
import javax.imageio.ImageIO;
import javax.swing.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
//游戏图片包装
public class ImageUtil {
//图片大小
public static int WIDTH_BACK;
public static int HEIGHT_BACK;
public static int WIDTH_PLANE;
public static int HEIGHT_PLANE;
//图片
public static BufferedImage START;
public static ImageIcon BUTTON;
public static BufferedImage PLANE_1;
public static BufferedImage PLANE_2;
public static BufferedImage Bullet_1;
public static BufferedImage Bullet_2;
public static BufferedImage XIAO_PLANE;
public static BufferedImage BOMB_PLANE1;
public static BufferedImage BOMB_PLANE2;
static {
try {
START = ImageIO.read( new File( "src\\image\\背景2.png" ));
BUTTON = new ImageIcon( "src\\image\\开始.png" );
PLANE_1 = ImageIO.read( new File( "src\\image\\飞机1.png" ));
PLANE_2 = ImageIO.read( new File( "src\\image\\飞机2.png" ));
Bullet_1 = ImageIO.read( new File( "src\\image\\导弹1.png" ));
Bullet_2 = ImageIO.read( new File( "src\\image\\导弹2.png" ));
XIAO_PLANE = ImageIO.read( new File( "src\\image\\小飞机.png" ));
BOMB_PLANE1 = ImageIO.read( new File( "src\\image\\飞机爆炸1.png" ));
BOMB_PLANE2 = ImageIO.read( new File( "src\\image\\飞机爆炸2.png" ));
} catch (IOException e) {
e.printStackTrace();
}
WIDTH_BACK = START.getWidth();
HEIGHT_BACK = START.getHeight();
WIDTH_PLANE = PLANE_1.getWidth();
HEIGHT_PLANE = PLANE_1.getHeight();
}
}
|
播放游戏背景音乐类
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
|
package forGame;
import javax.sound.sampled.AudioInputStream;
import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.Clip;
import java.io.File;
//播放背景音乐(.wav文件)
public class PlayMusic {
private Clip clip;
//需要传入要播放的文件位置的字符串
public void start(File file)
{
try
{
//创建相当于音乐播放器的对象
clip = AudioSystem.getClip();
//转成可播放的文件
AudioInputStream audioInput = AudioSystem.getAudioInputStream(file);
//播放器打开这个文件
clip.open(audioInput);
//clip.start();//只播放一次
//循环播放
clip.loop(Clip.LOOP_CONTINUOUSLY);
} catch (Exception ex){
ex.printStackTrace();
}
//死循环不让主程序结束(swing可不用)
/*
while(true){
}
*/
}
//关闭音乐播放
public void exit(){
clip.close(); //停止音乐播放,下次播放重新开始
}
//停止音乐播放
public void stop(){
clip.stop(); //停止音乐播放,下次播放继续播放
}
}
|
package planeGame
接口
1
2
3
4
5
6
7
8
|
package planeGame;
import java.awt.*;
//绘制接口
public interface DrawMe {
void drawMe(Graphics g);
}
|
1
2
3
4
5
6
|
package planeGame;
//分数接口
public interface Grade {
int getGrade();
}
|
窗口父类
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
package planeGame;
import forGame.ImageUtil;
import forGame.PlayMusic;
import javax.swing.*;
import java.io.File;
//窗口父类
public class MyJFrameFather extends JFrame{
protected int y1 = 0 ;
protected int y2 = - 830 ;
protected PlayMusic playMusic = new PlayMusic();
public MyJFrameFather(String name){
super (name);
setSize(ImageUtil.WIDTH_BACK, ImageUtil.HEIGHT_BACK);
setLocationRelativeTo( null );
setResizable( false );
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
playMusic.start( new File( "src\\music\\bgm.wav" ));
}
}
|
开始界面
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
|
package planeGame;
import forGame.ImageUtil;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
//游戏开始界面
public class StartJFrame extends MyJFrameFather{
public StartJFrame(){
super ( "开始界面" );
ImageIcon imageIcon = ImageUtil.BUTTON;
JButton jButton = new JButton(imageIcon);
//设置按钮没有边框
jButton.setBorder( null );
jButton.setBounds( 200 , 350 ,imageIcon.getIconWidth(),imageIcon.getIconHeight());
jButton.setBackground(Color.lightGray);
setLayout( null );
add(jButton);
setVisible( true );
jButton.addActionListener(actionListener);
}
@Override
public void paint(Graphics g) {
g.drawImage(ImageUtil.START, 0 , 0 , null );
}
private ActionListener actionListener = new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
playMusic.exit();
new GameJFrame();
dispose();
}
};
}
|
飞机父类(抽象类)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
|
package planeGame;
import java.awt.*;
//飞机父类
public abstract class Plane implements DrawMe{
//飞机坐标
protected Point p = new Point();
//飞机是否活着
protected boolean isLive = true ;
//飞机移动速度
protected int speed;
public Plane( int x, int y){
p.x = x;
p.y = y;
}
//修改飞机坐标以重复使用
public abstract void setP( int x);
//画自己
public abstract void drawMe(Graphics g);
//移动
public abstract void move();
//获取飞机坐标
protected Point getP(){
return p;
}
//飞机发射子弹
public void playBullet(Bullet bullet){
//子弹状态为true
bullet.setLive();
}
//改变飞机状态
public void setLive( boolean aboolean){
isLive = aboolean;
}
//返回飞机状态
public boolean getIsLive(){
return isLive;
}
}
|
主飞机类
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
|
package planeGame;
import forGame.ImageUtil;
import java.awt.*;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
//主飞机
public class MainPlane extends Plane{
//移动方向 1;上 -1:下 2:右 -2:左
private int direction = 1 ;
public MainPlane( int x, int y) {
super (x, y);
}
@Override
public void setP( int x) {}
private boolean aBoolean = true ; //绘制动态主飞机
@Override
public void drawMe(Graphics g) {
if (isLive){
if (aBoolean) {
g.drawImage(ImageUtil.PLANE_1, p.x, p.y, null );
aBoolean = false ;
}
else {
g.drawImage(ImageUtil.PLANE_2, p.x, p.y, null );
aBoolean = true ;
}
}
else {
g.drawImage(ImageUtil.BOMB_PLANE1, p.x, p.y, null ); //未绘制动态爆炸效果
}
}
@Override
public void move() {
if (direction == 1 && p.y > 30 )
p.move(p.x,p.y + speed);
else if (direction == - 1 && p.y < ImageUtil.HEIGHT_BACK - ImageUtil.HEIGHT_PLANE)
p.move(p.x,p.y + speed);
else if (direction == 2 && p.x < ImageUtil.WIDTH_BACK - ImageUtil.HEIGHT_PLANE)
p.move(p.x + speed,p.y);
if (direction == - 2 && p.x > 0 )
p.move(p.x + speed,p.y);
}
//监听飞机移动
private KeyListener keyListener = new KeyAdapter() {
@Override
public void keyPressed(KeyEvent e) {
int keyCode = e.getKeyCode();
//移动方向 1;上 -1:下 2:右 -2:左
//上
if (keyCode == KeyEvent.VK_UP){
direction = 1 ;
speed = - 20 ;
move();
}
//下
if (keyCode == KeyEvent.VK_DOWN){
direction = - 1 ;
speed = 20 ;
move();
}
//左
if (keyCode == KeyEvent.VK_LEFT){
direction = - 2 ;
speed = - 32 ;
move();
}
//右
if (keyCode == KeyEvent.VK_RIGHT){
direction = 2 ;
speed = 32 ;
move();
}
}
};
//返回键盘监听器
public KeyListener getKeyListener(){
return keyListener;
}
//主飞机是否与敌机相撞
public void isBomb(Plane[] planes){
for ( int i = 0 ;i < planes.length; i++) {
if (planes[i].getIsLive()) {
if (planes[i].getP().x > p.x && planes[i].getP().x < p.x + 128 && (p.y - planes[i].getP().y < 64 )) {
isLive = false ;
planes[i].setLive( false );
}
}
}
}
}
|
敌机类
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
|
package planeGame;
import forGame.ImageUtil;
import java.awt.*;
//敌机,未设置发射子弹功能
public class GamePlane extends Plane implements Grade{
public GamePlane( int x, int y) {
super (x, y);
}
@Override
public void setP( int x) {
p.x = x;
p.y = 0 ;
}
@Override
public void drawMe(Graphics g) {
g.drawImage(ImageUtil.XIAO_PLANE,p.x,p.y, null );
move();
}
@Override
public void move() {
if (p.y < 900 )
p.y = p.y + 20 ;
else
isLive = false ;
}
//未实现
@Override
public int getGrade() {
return 0 ;
}
}
|
子弹类
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
|
package planeGame;
import forGame.ImageUtil;
import java.awt.*;
//子弹类
public class Bullet implements DrawMe {
private boolean isLive = false ; //是否绘制子弹
private int x; //子弹初始横坐标
private int y; //子弹初始纵坐标
private int color; //绘制什么子弹的标志
public Bullet( int number, int x, int y){
this .color = number;
this .x =x;
this .y =y;
}
//修改子弹坐标
public void setXY( int x, int y){
this .x =x;
this .y =y;
}
//修改子弹状态
public void setLive(){
isLive = true ;
}
public boolean getLive(){
return isLive;
}
//绘制子弹
@Override
public void drawMe(Graphics g) {
if (color == 1 ){
g.drawImage(ImageUtil.Bullet_1, x, y, null );
} else {
g.drawImage(ImageUtil.Bullet_2, x, y, null );
}
move();
}
//子弹移动
private void move(){
if (color == 1 ){
if (y > 30 )
y = y - 50 ;
else
isLive = false ;
} else {
if (y < 900 )
y = y + 100 ;
else
isLive = false ;
}
}
//子弹是否击中敌机
public boolean isBom(Plane[] planes){
boolean is = false ;
for ( int i = 0 ;i < planes.length;i ++){
if (planes[i].getIsLive()){
if (x > planes[i].getP().x && x < planes[i].getP().x + 64 ){
if (y - planes[i].getP().y <= 64 ) {
isLive = false ;
planes[i].setLive( false );
is = true ;
}
}
}
}
return is;
}
//子弹是否与主机相撞
private void isBom(Plane plane){
}
}
|
创建主飞机、敌机、子弹类
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
|
package planeGame;
import java.util.Random;
//生产飞机、子弹
public class Production{
Random random = new Random();
private GamePlane[] gamePlanes = new GamePlane[ 16 ];
private Bullet[] bullets = new Bullet[ 50 ];
//背景图:596 x 854
//飞机图:128 x 128
//子弹图:9 x 21
private MainPlane mainPlane = new MainPlane(random.nextInt( 400 ),random.nextInt( 160 ) + 400 );
public MainPlane getMainPlane() {
return mainPlane;
}
//生产敌机
public GamePlane[] getGamePlanes() {
for ( int i = 0 ;i < 16 ;i ++){
gamePlanes[i] = new GamePlane( 0 , 0 );
gamePlanes[i].setLive( false );
}
return gamePlanes;
}
//修改一个敌机状态为true
public void setGamePlanes(){
for ( int i = 0 ;i < 16 ;i ++){
if (!gamePlanes[i].isLive){
gamePlanes[i].setP(random.nextInt( 12 ) * 45 + 32 );
gamePlanes[i].setLive( true );
break ;
}
}
}
//随机产生一个boolean值
public boolean getBoolean(){
return random.nextBoolean();
}
//生产子弹
public Bullet[] getBullets() {
for ( int i = 0 ;i < 50 ;i ++){
if (i < 20 )
bullets[i] = new Bullet( 1 , 0 , 0 );
else
bullets[i] = new Bullet( 2 , 0 , 0 );
}
return bullets;
}
}
|
游戏界面
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
|
package planeGame;
import forGame.ImageUtil;
import forGame.PlayMusic;
import java.awt.*;
//游戏界面,绘制并显示
public class GameJFrame extends MyJFrameFather{
private boolean isRepaint = true ;
private PlayMusic playMusicB = new PlayMusic();
private Production production = new Production();
private GamePlane[] gamePlanes;
private Bullet[] bullets;
private MainPlane mainPlane = production.getMainPlane();
private int grade = 0 ;
public GameJFrame(){
super ( "游戏界面" );
setVisible( true );
addKeyListener(mainPlane.getKeyListener());
MyRunning myRunning = new MyRunning();
myRunning.start();
gamePlanes = production.getGamePlanes();
bullets = production.getBullets();
}
@Override
public void paint(Graphics g) {
Image image = this .createImage(getWidth(),getHeight());
Graphics gImage = image.getGraphics();
gImage.setColor(gImage.getColor());
gImage.fillRect( 0 , 0 ,getWidth(),getHeight());
super .paint(gImage);
//596 x 854
//绘制动态背景
if (y2 == 0 ){
y1 = 0 ;
y2 = - 830 ;
}
gImage.drawImage(ImageUtil.START, 0 ,y1 , null );
gImage.drawImage(ImageUtil.START, 0 ,y2 , null );
y1 = y1 + 10 ;
y2 = y2 + 10 ;
//绘制飞机子弹
if (mainPlane.isLive){ //主飞机活着
for ( int i = 0 ;i < 20 ;i ++){
//找子弹状态为false,重新设置坐标并修改状态
if (!bullets[i].getLive()){
bullets[i].setXY(mainPlane.getP().x + 60 ,mainPlane.getP().y - 21 );
mainPlane.playBullet(bullets[i]);
break ;
}
}
//绘制活着的敌机
for ( int i = 0 ;i < 10 ;i ++){
if (gamePlanes[i].isLive){
gamePlanes[i].drawMe(gImage);
}
}
//控制什么时候让敌机活
if (production.getBoolean() && production.getBoolean())
production.setGamePlanes();
//判断主飞机是否爆炸
mainPlane.isBomb(gamePlanes);
//绘制主飞机
mainPlane.drawMe(gImage);
//首先判断子弹是否击中敌机,没有击中则绘制子弹
for ( int i = 0 ;i < bullets.length;i ++){
if (bullets[i].getLive()) {
if (bullets[i].isBom(gamePlanes))
grade = grade + 10 ;
else
bullets[i].drawMe(gImage);
}
}
} else {
isRepaint = false ;
mainPlane.drawMe(gImage);
gImage.setFont( new Font( "宋体" ,Font.ITALIC , 50 ));
gImage.drawString( "GameOver" , 200 , 350 );
}
gImage.drawString( "得分:" + grade, 10 , 100 );
//最后绘制缓冲后的图片
g.drawImage(image, 0 , 0 , null );
}
//多线程去控制重新绘制的时间
private class MyRunning extends Thread{
@Override
public void run() {
while (isRepaint){
try {
sleep( 100 );
repaint();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}
|
测试类
1
2
3
4
5
6
7
8
|
package planeGame;
//测试类
public class Demo {
public static void main(String[] args) {
new StartJFrame(); //创建开始界面
}
}
|
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持服务器之家。
原文链接:https://blog.csdn.net/weixin_46085748/article/details/115015948