要做飞机大战可能需要使用的类,先来做个简单的介绍。
1.首先不用多说,这种窗口游戏必须得有读图片的类
引入BufferedImage类和ImageIO类
import java.awt.image.BufferedImage
import javax.imageio.ImageIO;
设置成员变量
public static BufferedImage backgroud;
public static BufferedImage start;
public static BufferedImage pause;
public static BufferedImage gameover;
public static BufferedImage airplane;
public static BufferedImage bee;
public static BufferedImage hero0;
public static BufferedImage bullet;
public static BufferedImage hero1;
读取图片
static{//初始化静态资源(图片)
try{
backgroud=ImageIO.read(ShootGame.class.getResource("background.png"));
start=ImageIO.read(ShootGame.class.getResource("start.png"));
pause=ImageIO.read(ShootGame.class.getResource("pause.png"));
gameover=ImageIO.read(ShootGame.class.getResource("gameover.png"));
airplane=ImageIO.read(ShootGame.class.getResource("airplane.png"));
bee=ImageIO.read(ShootGame.class.getResource("bee.png"));
bullet=ImageIO.read(ShootGame.class.getResource("bullet.png"));
hero0=ImageIO.read(ShootGame.class.getResource("hero0.png"));
hero1=ImageIO.read(ShootGame.class.getResource("hero1.png"));
}catch(Exception e){
e.printStackTrace();
}
}
注意,此方法值能用于图片与代码在同一个包中
2.窗口和面板类
import javax.swing.JFrame;
import javax.swing.JPanel;
用相框来比喻这两个类,JFrame相当于相框的外围的那个框,JPanel相当于框里面的那个面板。
主程序类继承JPanel。在main函数中设置窗口和面板的属性
public static void main(String[] args) {
JFrame frame=new JFrame("Fly");//窗口
ShootGame game=new ShootGame();//面板
frame.add(game);//将面板添加到窗口上
frame.setSize(WIDTH,HEIGHT);//设置窗口的宽高
frame.setAlwaysOnTop(true);//设置一直在最上面
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//设置按窗口右上角的X退出
frame.setLocationRelativeTo(null);//设置窗口居中显示
frame.setVisible(true);//1.设置窗口可见2.尽快调用paint()方法
}
3.paint方法
paint()方法的两种调用方式 1.fram.setVisible(true); 2.repaint()
paint()方法传的参数是画笔类(Graphics)
用paint方法画背景图
public void paint(Graphics g){
g.drawImage(backgroud,0,0,null);
}
g.drawImage((图片名称),(y坐标),(y坐标),(缩放,转换 图像时需要通知的对象))
设置画笔颜色字体
g.setColor(new Color(0xFF0000));
g.setFont(new Font(Font.SANS_SERIF,Font.BOLD,24));
解释第一句,setcolor()方法中传入的是一个color对象,颜色是同过16进制表示的。0x表示的十六进制,后面每两位表示一种颜色,分别是计算机的三种原色(红,蓝,绿),00-FF表示那种颜色的程度。0xFF0000的颜色就是红色
第二句,方法传入的是Font对象,构造器里的参数为 (String 字体,int 风格,int 字号).Font.SANS_SERIF为黑体,Font.BOLD为粗体。
4.定时器
导入包
import java.util.Timer;//定时
import java.util.TimerTask;//定时做的事
示例代码:
import java.util.Timer;
public class TimerRunner {
public static void main(String [] args){
Timer timer=new Timer();
timer.schedule(new MyTimerTask(),1000,100);
}
}
import java.util.TimerTask;
public class MyTimerTask extends TimerTask {
@Override
public void run() {
System.out.println("11");
}
解释一下timer.schedule()方法
第一个参数,是 TimerTask 类,在包:import Java.util.TimerTask .使用者要继承该类,并实现public void run() 方法,因为 TimerTask 类 实现了 Runnable 接口。
第二个参数的意思是,用户调用 schedule() 方法后,要等待这么长的时间才可以第一次执行run() 方法。
第三个参数的意思就是,第一次调用之后,从第二次开始每隔多长的时间调用一次 run() 方法。
5.鼠标监听器
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
监听鼠标事件MouseEvent。
鼠标监听器MouseListener,用于接收鼠标事件(按下、释放、单击、进入或离开)的侦听器接口。(要跟踪鼠标移动和鼠标拖动,请使用 MouseMotionListener。)
旨在处理鼠标事件的类要么实现此接口(及其包含的所有方法),要么扩展抽象类 MouseAdapter(仅重写所需的方法)。
MouseListener是一个接口,里面的方法都是抽象的,需要你去实现。
MouseAdapter是一个类,它实现了MouseListener,但是方法主体是空的,主要是方便编程人员。
使用组件的 addMouseListener 方法将从该类所创建的侦听器对象向该组件注册。当按下、释放或单击(按下并释放)鼠标时会生成鼠标事件。鼠标光标进入或离开组件时也会生成鼠标事件。发生鼠标事件时,将调用该侦听器对象中的相应方法,并将MouseEvent 传递给该方法。
其包含五个方法:
1.public void mouseClicked(MouseEvent e) 鼠标按键在组件上单击(按下并释放)时调用。
2.public void mouseEntered(MouseEvent e) 鼠标进入到组件上时调用。
3.public void mouseExited(MouseEvent e) 鼠标离开组件时调用。
4.public void mousePressed(MouseEvent e) 鼠标按键在组件上按下时调用。
5.public void mouseReleased(MouseEvent e) 鼠标按钮在组件上释放时调用。
实例代码
//创建鼠标侦听器
MouseAdapter l=new MouseAdapter(){
public void mouseMoved(MouseEvent e){//英雄机随着鼠标动
int x=e.getX();
int y=e.getY();
hero.moveTo(x, y);
}
//重写鼠标点击事件
//如果当前状态为开始状态,鼠标点击后变为运行状态
//如果当前状态为结束状态,鼠标点击后变为开始状态并清空缓存
public void mouseClicked(MouseEvent e){
switch(stata){
case START:
stata=RUNING;
break;
case GAME_OVER:
hero=new Hero();
bullets=new Bullet[0];
flyings=new FlyObject[0];
stata=START;
break;
}
}
public void mouseExited(MouseEvent e){//重写鼠标移开事件,鼠标移开变成暂停状态
if(stata==RUNING){
stata=PAUSH;
}
}
public void mouseEntered(MouseEvent e){//重写鼠标进入时间
if(stata==PAUSH){
stata=RUNING;
}
}
};
this.addMouseListener(l);//处理鼠标的操作事件
this.addMouseMotionListener(l);//处理鼠标的滑动事件