此小程序适合java初学者练手之用
效果图
(Plane .java)
package beans;
import java.awt.Image;
import java.io.Serializable;
import javax.swing.ImageIcon;
public class Plane implements Serializable{
private Image myImage;
private int x;
private int y;
private int life;
private boolean isRun;
public Plane(Image myImage, int x, int y, int life, boolean isRun) {
super();
this.myImage = myImage;
this.x = x;
this.y = y;
this.life = life;
this.isRun = isRun;
}
// public Plane(ImageIcon imageIcon, int x2, int y2, int life2, boolean isRun2) {
// TODO Auto-generated constructor stub
// }
public Image getMyImage() {
return myImage;
}
public void setMyImage(Image myImage) {
this.myImage = myImage;
}
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 int getLife() {
return life;
}
public void setLife(int life) {
this.life = life;
}
public boolean isRun() {
return isRun;
}
public void setRun(boolean isRun) {
this.isRun = isRun;
}
}
(FrmPlane .java)
package gui;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.LayoutManager;
import java.awt.Rectangle;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import java.util.prefs.BackingStoreException;
import javax.sound.midi.Receiver;
import javax.swing.ImageIcon;
import beans.Plane;
import com.common.FrmAdpter;
public class FrmPlane extends FrmAdpter{
ImageIcon icon,backImg,background;
int backy;//yzhou
Image bufferImg;
Plane hero,enemy,bullet;
Random rd=new Random();
int mark;
ArrayList<Plane> emyList=new ArrayList<Plane>();//敌机
ArrayList<Plane> bulList=new ArrayList<Plane>();//子弹
public FrmPlane() {
super("飞机大战", 400, 480, false, true,0, 0, null);
//background=frmP.setIconImage("image/bgstar.gif");
backImg=new ImageIcon("image/bgstar.gif");
//this.setBackground(new Color(0, 130, 190));
icon=new ImageIcon("image/logo.png");//logo
super.setIconImage(icon.getImage());
hero=new Plane(new ImageIcon("image/hero.png").getImage(),160,390,3,true);
//"敌机"线程
Enemy am1=new Enemy();
Thread t2=new Thread(am1);
t2.start();
//"子弹"线程
Bullet b=new Bullet();
Thread tbul=new Thread(b);
tbul.start();
//敌机与子弹
EnemyBullet eb=new EnemyBullet();
Thread tEB=new Thread(eb);
tEB.start();
//"移动"线程
Move m=new Move();
m.fp=this;
Thread mThread=new Thread(m);
mThread.start();
this.addKeyListener(this);
this.setFont(new Font("koko", 10, 25));
this.setForeground(new Color(250,250,0));
super.setVisible(true);
}
//双缓冲
public void paint(Graphics g) {
// super.paint(g);再绘,闪屏
if(bufferImg==null) {
//画笔
bufferImg=this.createImage(this.getWidth(), this.getHeight());
}
//根据画笔创建一个画布,背景
Graphics g2=bufferImg.getGraphics();
g2.drawImage(backImg.getImage(),0,backy,null);
//英雄
g2.drawImage(hero.getMyImage(),hero.getX(),hero.getY(),null);
//敌机
for (int i = 0; i < emyList.size(); i++) {
g2.drawImage(emyList.get(i).getMyImage(), emyList.get(i).getX(),emyList.get(i).getY(), null);
}
//子弹
for(int i=0;i<bulList.size();i++) {
g2.drawImage(bulList.get(i).getMyImage(), bulList.get(i).getX(), bulList.get(i).getY(), null);
}
g2.drawString("分数:"+mark, 20, 450);
//缓冲画布一次性画到
g.drawImage(bufferImg,0,0,null);
}
//敌机生成
class Enemy implements Runnable {
//FrmPlane fp;
@Override
public void run() {
while(true) {
try {
Thread.sleep(1000);
Plane army=new Plane(new ImageIcon("image/enemy.png").getImage(), rd.nextInt(350)+30, 30, 1, true);//.getImage()
emyList.add(army);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
//子弹生成
class Bullet implements Runnable {
public void run() {
while(true) {
try {
Thread.sleep(600);
Plane bullet=new Plane(new ImageIcon("image/bullet.png").getImage(),hero.getX()+40,hero.getY()-10,1,true);
bulList.add(bullet);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
//敌机与子弹
class EnemyBullet implements Runnable {
public void run() {
while(true) {
for(int i=0;i<emyList.size();i++) {
Plane Renemy=emyList.get(i);
for(int j=0;j<bulList.size();j++) {
Plane Rbullet=bulList.get(j);
if(Renemy==null||Renemy.getMyImage()==null) {
break;
}
if(Rbullet==null||Rbullet.getMyImage()==null) {
break;
}
//将图片转换为矩形以便判断
Rectangle recEnemy=new Rectangle(Renemy.getX(),Renemy.getY(),Renemy.getMyImage().getWidth(null), Renemy.getMyImage().getHeight(null));
Rectangle recBullet=new Rectangle(Rbullet.getX(),Rbullet.getY(),Rbullet.getMyImage().getWidth(null), Rbullet.getMyImage().getHeight(null));
if(recEnemy.intersects(recBullet)) {//检测碰撞
emyList.remove(i);
bulList.remove(j);
mark++;
break;
}
}
}
}
}
}
//所有移动
class Move implements Runnable {
FrmPlane fp;
@Override
public void run() {
while(true) {
//画布坐标动
// backy--;
// if(Math.abs(backy)==1800) {
// backy=0;
// }
//敌人的飞机动
for (int i = 0; i < emyList.size(); i++) {
emyList.get(i).setY(emyList.get(i).getY()+2);
}
//子弹的移动
for(int i=0;i<bulList.size();i++) {
bulList.get(i).setY(bulList.get(i).getY()-2);
}
try {
Thread.sleep(30);
} catch (InterruptedException e) {
e.printStackTrace();
}
fp.repaint();
}
}
}
//键盘移动事件
@Override
public void keyPressed(KeyEvent e) {
super.keyPressed(e);
char choice;
choice=e.getKeyChar();
switch (choice) {
case 'w':
hero.setY(hero.getY()-3);
break;
case 's':
hero.setY(hero.getY()+3);
break;
case 'a':
hero.setX(hero.getX()-3);
break;
case 'd':
hero.setX(hero.getX()+3);
break;
}
}
/*private class backThread implements Runnable {
FrmPlane fp;
@Override
public void run() {
while(true) {
backy--;
if(Math.abs(backy)==1500) {//1500即一个数值<画布长度-窗体长度
backy=0;
}
try {
Thread.sleep(20);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
fp.repaint();
}
}
}*/
public static void main(String[] args) {
new FrmPlane();
}
}
(FrmAdpter.java)
package com.common;
import java.awt.Container;
import java.awt.LayoutManager;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.FocusEvent;
import java.awt.event.FocusListener;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;
import javax.swing.JFrame;
public class FrmAdpter extends JFrame implements ActionListener,KeyListener,
MouseListener,MouseMotionListener,WindowListener,
FocusListener,ItemListener {
protected Container container;
public FrmAdpter(String title,int w,int h,boolean resize,boolean location,int x,int y,LayoutManager layout)
{
super.setTitle(title);
super.setSize(w, h);
super.setResizable(resize);
if(location)
super.setLocationRelativeTo(null);
else
super.setLocation(x, y);
super.setDefaultCloseOperation(3);
container=super.getContentPane();
container.setLayout(layout);
}
@Override
public void itemStateChanged(ItemEvent e) {
// TODO Auto-generated method stub
}
@Override
public void focusGained(FocusEvent e) {
// TODO Auto-generated method stub
}
@Override
public void focusLost(FocusEvent e) {
// TODO Auto-generated method stub
}
@Override
public void windowOpened(WindowEvent e) {
// TODO Auto-generated method stub
}
@Override
public void windowClosing(WindowEvent e) {
// TODO Auto-generated method stub
}
@Override
public void windowClosed(WindowEvent e) {
// TODO Auto-generated method stub
}
@Override
public void windowIconified(WindowEvent e) {
// TODO Auto-generated method stub
}
@Override
public void windowDeiconified(WindowEvent e) {
// TODO Auto-generated method stub
}
@Override
public void windowActivated(WindowEvent e) {
// TODO Auto-generated method stub
}
@Override
public void windowDeactivated(WindowEvent e) {
// TODO Auto-generated method stub
}
@Override
public void mouseDragged(MouseEvent e) {
// TODO Auto-generated method stub
}
@Override
public void mouseMoved(MouseEvent e) {
// TODO Auto-generated method stub
}
@Override
public void mouseClicked(MouseEvent e) {
// TODO Auto-generated method stub
}
@Override
public void mousePressed(MouseEvent e) {
// TODO Auto-generated method stub
}
@Override
public void mouseReleased(MouseEvent e) {
// TODO Auto-generated method stub
}
@Override
public void mouseEntered(MouseEvent e) {
// TODO Auto-generated method stub
}
@Override
public void mouseExited(MouseEvent e) {
// TODO Auto-generated method stub
}
@Override
public void keyTyped(KeyEvent e) {
// TODO Auto-generated method stub
}
@Override
public void keyPressed(KeyEvent e) {
// TODO Auto-generated method stub
}
@Override
public void keyReleased(KeyEvent e) {
// TODO Auto-generated method stub
}
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
}
}
(FrmDailogAdpter.java)
package com.common;
import java.awt.Container;
import java.awt.Frame;
import java.awt.LayoutManager;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.FocusEvent;
import java.awt.event.FocusListener;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;
import javax.swing.JDialog;
public class FrmDailogAdpter extends JDialog implements ActionListener,KeyListener,
MouseListener,MouseMotionListener,WindowListener,
FocusListener,ItemListener {
protected Container container;
public FrmDailogAdpter(Frame owner,String title,int w,int h,boolean resize,boolean location,int x,int y,LayoutManager layout)
{
super(owner, true);
super.setTitle(title);
super.setSize(w, h);
super.setResizable(resize);
if(location)
super.setLocationRelativeTo(null);
else
super.setLocation(x, y);
super.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
container=super.getContentPane();
container.setLayout(layout);
}
@Override
public void itemStateChanged(ItemEvent e) {
// TODO Auto-generated method stub
}
@Override
public void focusGained(FocusEvent e) {
// TODO Auto-generated method stub
}
@Override
public void focusLost(FocusEvent e) {
// TODO Auto-generated method stub
}
@Override
public void windowOpened(WindowEvent e) {
// TODO Auto-generated method stub
}
@Override
public void windowClosing(WindowEvent e) {
// TODO Auto-generated method stub
}
@Override
public void windowClosed(WindowEvent e) {
// TODO Auto-generated method stub
}
@Override
public void windowIconified(WindowEvent e) {
// TODO Auto-generated method stub
}
@Override
public void windowDeiconified(WindowEvent e) {
// TODO Auto-generated method stub
}
@Override
public void windowActivated(WindowEvent e) {
// TODO Auto-generated method stub
}
@Override
public void windowDeactivated(WindowEvent e) {
// TODO Auto-generated method stub
}
@Override
public void mouseDragged(MouseEvent e) {
// TODO Auto-generated method stub
}
@Override
public void mouseMoved(MouseEvent e) {
// TODO Auto-generated method stub
}
@Override
public void mouseClicked(MouseEvent e) {
// TODO Auto-generated method stub
}
@Override
public void mousePressed(MouseEvent e) {
// TODO Auto-generated method stub
}
@Override
public void mouseReleased(MouseEvent e) {
// TODO Auto-generated method stub
}
@Override
public void mouseEntered(MouseEvent e) {
// TODO Auto-generated method stub
}
@Override
public void mouseExited(MouseEvent e) {
// TODO Auto-generated method stub
}
@Override
public void keyTyped(KeyEvent e) {
// TODO Auto-generated method stub
}
@Override
public void keyPressed(KeyEvent e) {
// TODO Auto-generated method stub
}
@Override
public void keyReleased(KeyEvent e) {
// TODO Auto-generated method stub
}
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
}
}