声明:写这个小游戏的目的是把我们前面学习的基本知识串起来;
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.写一个炮弹类