菜鸡自学JAVA坎坷路day.8【小游戏飞机大战1】

声明:写这个小游戏的目的是把我们前面学习的基本知识串起来;

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.写一个炮弹类




猜你喜欢

转载自blog.csdn.net/qq_38053395/article/details/80312715
今日推荐