声明:写这个小游戏的目的是把我们前面学习的基本知识串起来;
1.SWT,Swing;(很老,工作用不到);建立Plane Game 的主窗口(0.1)
MyGame01:
package cn.DKF.game;
import javax.swing.JFrame;
/**
* 飞机游戏的主窗口
* @author Wang
*
*/
public class MyGameFrame extends JFrame {//继承一个Java的窗口类
/**
* 初始化窗口;
*/
public void LaunchFrame() {//发动窗口
this.setTitle("wang_程序员作品");//设置窗口的题目
this.setVisible(true);//窗口默认是不可见的现在把他设置为可见
this.setSize(500, 500);//设置窗口的宽和高;
this.setLocation(500, 200);//设置窗口的坐标;
// this.addWindowListener(new WindowAdapter(){//这是一个匿名内部类 控制程序的退出的;
// public void windowClosed(WindowEvent e){
// System.exit(0);
// }
// });
}
public static void main(String[] args) {
MyGameFrame f = new MyGameFrame();
f.LaunchFrame();
}
}
2.图形和文本的绘制;(0.2)
package cn.DKF.game;
/**
* 加载图片的工具类
*
*/
import java.awt.Image;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.net.URL;
import javax.imageio.ImageIO;
public class GameUtil {
// 工具类最好将构造器私有化。
private GameUtil() {
}
/**
* 返回指定路径文件的图片对象
* @param path
* @return
*/
public static Image getImage(String path) {
BufferedImage bi = null;
try {
URL u = GameUtil.class.getClassLoader().getResource(path);
bi = ImageIO.read(u);
} catch (IOException e) {
e.printStackTrace();
}
return bi;
}
}
package cn.DKF.game;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import javax.swing.JFrame;
/**
* 飞机游戏的主窗口
* @author Wang
*
*/
public class MyGameFrame extends JFrame {//继承一个Java的窗口类
Image ball = GameUtil.getImage("image/ball.png");//"/"前面的是路径 后面的就是那个图片;
public void paint(Graphics g) {// g就相当于一支画笔 主函数会自动调用这个paint
super.paint(g);//在 paint() 中,先调用一个父类的 paint() 方法,父类的这个方法会绘一个背景。不然就会是黑色的;
Color c = g.getColor();//颜色控制 注意这个 父类传过来的你在改的时候就会修改那边的数据所以我们先那边的color的染色存到c里面最后再还回去;
Font f = g.getFont();//这个是修改字体的,同上面的颜色操作
g.setColor(Color.red);//把画笔的颜色改成蓝色;
g.drawLine(100,100,300,300);//画一条线根据两点的坐标确定一条直线;可以看他的源码;
g.drawRect(100,100, 300,300);//画一个矩形确定左上角的那个定点然后是宽和高
g.drawOval(100, 100, 300, 300);//画一个椭圆,椭圆形状(矩形的确定方法同上)是根据他相切的去写决定的
g.fillRect(100, 100, 40, 40);//填充一个矩形
g.setColor(Color.blue);
g.setFont(new Font("宋体",Font.BOLD,50));//设置字体为宋体,然后为粗体 ,大小设置为50;
g.drawString("我是菜鸡", 200, 200);//这个是写一个字符串
g.drawImage(ball,250,250,null);//第一个是画哪一个图片 然后坐标,在后面是observer 这个不用管了;
g.setColor(c);//把原来g的color还给他
g.setFont(f);//同上;
}
/**
* 初始化窗口;
*/
public void LaunchFrame() {//发动窗口
this.setTitle("wang_程序员作品");//设置窗口的题目
this.setVisible(true);//窗口默认是不可见的现在把他设置为可见
this.setSize(500, 500);//设置窗口的宽和高;
this.setLocation(300, 300);//设置窗口的坐标;
this.addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
}
public static void main(String[] args) {
MyGameFrame f = new MyGameFrame();
f.LaunchFrame();
}
}
3.飞机的重画多线程实现动画
package cn.DKF.game;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import javax.swing.JFrame;
/**
* 飞机游戏的重画和动画;
* @author Wang
*
*/
public class MyGameFrame extends JFrame {//继承一个Java的窗口类
Image plane = GameUtil.getImage("image/plane.png");//"/"前面的是路径 后面的就是那个图片;
Image bg = GameUtil.getImage("image/bg.jpg");
int planeX = 250, planeY = 250;
public void paint(Graphics g) {// g就相当于一支画笔 主函数会自动调用这个paint
super.paint(g);//在 paint() 中,先调用一个父类的 paint() 方法,父类的这个方法会绘一个背景。不然就会是黑色的;
g.drawImage(bg,0,0,null);
g.drawImage(plane,planeX,planeY,null);
planeX++;//坐标移动
planeY++;
}
//这个类的作用是反复重画窗口
class PaintThread extends Thread{//继承多线程(这是一个内部类:就是写在类的里面作用是是可以直接调用外部类的方法和属性)
public void run() {//重写父类的run()方法
while(true) {
repaint(); //重画(注意paint不能直接掉他系统自己调用的)
try {
Thread.sleep(40);//人眼可识别的是1s20多次就会看成是动画 每隔40ms打印一次 一分钟就是25次;
}catch(InterruptedException e) {
e.printStackTrace();
}
}
}
}
/**
* 初始化窗口;
*/
public void LaunchFrame() {//发动窗口
this.setTitle("wang_程序员作品");//设置窗口的题目
this.setVisible(true);//窗口默认是不可见的现在把他设置为可见
this.setSize(500, 500);//设置窗口的宽和高;
this.setLocation(300, 300);//设置窗口的坐标;
this.addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
new PaintThread().start(); //启动重划窗口的线程;
}
public static void main(String[] args) {
MyGameFrame f = new MyGameFrame();
f.LaunchFrame();
}
}
注意;内部类的作用是可以直接调用外部类的属性和方法,写在那个类的里面就好;
4.写一个游戏物体的父类;
package cn.DKF.game;
import java.awt.Graphics;
import java.awt.Image;
/**
* 游戏物体的父类
* @author Wang
*
*/
public class GameObject {
Image img;
double x,y;
int speed;
int width,height;
public void draSelf(Graphics g) {//注意Graphics这个画笔类定义的对象 画东西的方法都在他里面呢
g.drawImage(img,(int)x,(int)y,null);//参数需要int类型的所以要先强制转化一下
}
public GameObject(Image img, double x, double y, int speed, int width, int height) {
super();
this.img = img;
this.x = x;
this.y = y;
this.speed = speed;
this.width = width;
this.height = height;
}
public GameObject(Image img, double x, double y) {
super();
this.img = img;
this.x = x;
this.y = y;
}
public GameObject() {}
}
5.键盘的控制原理:
6.写一个炮弹类