学习Swing做的打飞机小游戏

本文介绍了一款使用Java Swing库开发的打飞机小游戏,通过代码实现游戏的基本功能,包括飞机移动、射击、敌机生成及碰撞检测等,适合初学者了解Swing在游戏开发中的应用。
摘要由CSDN通过智能技术生成

下面是代码

package game;

import java.awt.Color;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;

import javax.imageio.ImageIO;
import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
import javax.swing.Timer;

import model.Plane;

public class FightFrame extends JFrame implements KeyListener{
	
	List<Plane> zds = new ArrayList<Plane>();	//子弹
	List<Plane> drs = new ArrayList<Plane>();	//敌人
	Plane myPlane = new Plane();				//自己
	Timer timer = null;		//用来产生敌人飞机
	Timer gameTimer = null;	//游戏逻辑线程
	static int drSpeed = 5; //敌人飞机飞行速度
	static int mySpeed = 8; //自己的飞机飞行速度
	static int zdSpeed = 20; //子弹飞行速度
	static int gameSpeed = 70;	//游戏速度
	
	
	public FightFrame(){
		this.setTitle("打飞机");
		this.getContentPane().setBackground(Color.black);
		this.setSize(400, 600);
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		this.setLocationRelativeTo(null);
		this.addKeyListener(this);
		timer = new Timer(3000, new ActionListener() {
			@Override
			public void actionPerformed(ActionEvent e) {
				Random random = new Random();
				int rX = random.nextInt(330);
				int type = random.nextInt(2);
				if(type==0){
					drs.add(new Plane(rX, 55, getImage("f1.bmp"),0));
				}else{
					drs.add(new Plane(rX, 55, getImage("f2.bmp"),0));
				}
			}
		});
		gameTimer = new Timer(gameSpeed, new ActionListener() {
			@Override
			public void actionPerformed(ActionEvent e) {
				//敌人飞机往下飞
				for(int i = drs.size()-1;i>=0;i--){
					Plane plane = drs.get(i);
					plane.setY(plane.getY()+drSpeed);
					if(myPlane.getX()+55>plane.getX()&&myPlane.getX()<plane.getX()+55
						&&myPlane.getY()+35>plane.getY()&&myPlane.getY()<plane.getY()+45){
						myPlane.setStatus(1);
						drs.get(i).setStatus(1);
						paint(getGraphics());
						try {
							Thread.sleep(200);
						} catch (InterruptedException e1) {
							e1.printStackTrace();
						}
						JOptionPane.showMessageDialog(null, "GAME OVER!");
						init();
						return;
					}
					if(plane.getStatus()==2||plane.getY()>600){
						drs.remove(i);
					}
				}
				//子弹往上飞
				for(int i = zds.size()-1;i>=0;i--){
					Plane plane = zds.get(i);
					plane.setY(plane.getY()+drSpeed);
					plane.setY(plane.getY()-zdSpeed);
					int zdX = plane.getX();//子弹中间拿来判断
					int zdY = plane.getY();
					boolean flag = true;	//如果打到了飞机则不用判断子弹是否飞出屏幕
					//判断是否打到敌方飞机
					for(int j = drs.size()-1;j>=0;j--){
						Plane dr = drs.get(j);
						flag = true;
						int drX = dr.getX();
						int drY = dr.getY();
						if(zdX>=drX&&zdX<=drX+60&&zdY<=drY+70&&zdY>=drY+35+zdSpeed){
							drs.get(j).setStatus(1);
							zds.remove(i);
							flag = false;
						}
					}
					if(plane.getStatus()==2||(flag&&plane.getY()<53)){
						zds.remove(i);
					}
				}
				repaint();
			}
		});
		JMenuBar menu = new JMenuBar();
		JMenu game = new JMenu("游戏");
        JMenuItem newgame = game.add("新游戏");
        final JMenuItem pause = game.add("暂停");
        JMenuItem exit = game.add("退出");
        newgame.addActionListener(new ActionListener() {
			
			@Override
			public void actionPerformed(ActionEvent e) {
				init();
			}
		});
        pause.addActionListener(new ActionListener() {
			@Override
			public void actionPerformed(ActionEvent e) {
				if(pause.getText().equals("暂停")){
					timer.stop();
					gameTimer.stop();
					pause.setText("继续");
				}else {
					timer.start();
					gameTimer.start();
					pause.setText("暂停");
				}
			}
		});
        exit.addActionListener(new ActionListener() {
			@Override
			public void actionPerformed(ActionEvent e) {
				System.exit(0);
			}
		});
        menu.add(game);
		this.setJMenuBar(menu);
		this.setVisible(true);
	}
	
	@Override
	public void paint(Graphics g) {
		super.paint(g);
		if(myPlane.getStatus()==0){
			g.drawImage(myPlane.getImage(), myPlane.getX(), myPlane.getY(), null);
		}else if(myPlane.getStatus()==1){
			g.drawImage(getImage("boom.bmp"), myPlane.getX(), myPlane.getY(), null);
		}
		for(Plane plane : zds){
			g.drawImage(plane.getImage(), plane.getX(), plane.getY(), null);
		}
		for(int i = 0;i<drs.size();i++){
			Plane plane = drs.get(i);
			if(plane.getStatus()==0){
				g.drawImage(plane.getImage(), plane.getX(), plane.getY(), null);
			}else if (plane.getStatus()==1) {
				g.drawImage(getImage("boom.bmp"), plane.getX(), plane.getY(), null);
				drs.get(i).setStatus(2);
			}
			
		}
	}
	
	public Image getImage(String path){
		try {
			return ImageIO.read(new File(path));
		} catch (IOException e) {
			e.printStackTrace();
			return null;
		}
	}
	
	//初始化游戏
	public void init(){
		timer.stop();
		gameTimer.stop();
		//移除子弹和敌人飞机
		zds.clear();
		drs.clear();
		//初始化自己
		myPlane = new Plane(165, 550, getImage("f3.bmp"),0);
		repaint();
		timer.start();
		gameTimer.start();
	}
	
	public static void main(String[] args) {
		new FightFrame();
	}

	@Override
	public void keyTyped(KeyEvent e) {
		
	}

	@Override
	public void keyPressed(KeyEvent e) {
		int code = e.getKeyCode();
		if(code == 39)//右飞行
		{
			myPlane.setX(myPlane.getX()+mySpeed);
			if(myPlane.getX()>330)
			{
				myPlane.setX(330);
			}
		}else if(code == 37)//左飞行
		{
			myPlane.setX(myPlane.getX()-mySpeed);
			if(myPlane.getX()<0)
			{
				myPlane.setX(0);
			}
		}else if(code == 38)//上飞行
		{
			myPlane.setY(myPlane.getY()-mySpeed);
			if(myPlane.getY()<55)
			{
				myPlane.setY(55);
			}
		}else if(code == 40)//下飞行
		{
			myPlane.setY(myPlane.getY()+mySpeed);
			if(myPlane.getY()>550)
			{
				myPlane.setY(550);
			}
		}else if (code == 32) {	//空格开炮
			zds.add(new Plane(myPlane.getX()+22, myPlane.getY(), getImage("zd.bmp"),0));
		}else if(code==112){	//F1开始游戏
			init();
		}
	}

	@Override
	public void keyReleased(KeyEvent e) {
		
	}
}
package model;

import java.awt.Image;

public class Plane {
	private int x;
	private int y;
	private Image image;
	private int status;	
	
	public Plane() {
	}

	public Plane(int x, int y, Image image, int status) {
		this.x = x;
		this.y = y;
		this.image = image;
		this.status = status;
	}

	public int getX() {
		return x;
	}

	public void setX(int x) {
		this.x = x;
	}

	public int getY() {
		return y;
	}

	public void setY(int y) {
		this.y = y;
	}

	public Image getImage() {
		return image;
	}

	public void setImage(Image image) {
		this.image = image;
	}

	public int getStatus() {
		return status;
	}

	public void setStatus(int status) {
		this.status = status;
	}
	
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值