目的
巩固之前学的Java的基础
基本功能的实现步骤
AWT和Swing是Java中常见的GUI(图形用户界面),但是Java很少用于桌面应用开发,所以无需学习这两门技术
MyGameFrame类:画游戏窗口
package com.lucifer.game;
import javax.swing.*; //需要导入的类
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
/**
* @Description 飞机游戏的主窗口
* @Author Lucifer
*/
public class MyGameFrame extends JFrame {
/**
* 写一个方法用来在类里面加载窗口,初始化窗口
*/
public void launchFrame(){
/*给游戏窗口加一个标题---settitle*/
this.setTitle("Make By Lucifer");
/*窗口可视化---调用方法*/
this.setVisible(true);
/*给窗口设置大小---利用setSize方法*/
this.setSize(600,600);
/*窗口居中---调用方法*/
this.setLocation(750,200);
/*
设置窗口的位置,根据的是屏幕的x.y轴来设置。
原点(0,0)位于屏幕右上角
往下是x轴,往右是y轴
*/
/*加一个匿名内部类*/
this.addWindowListener(new WindowAdapter() {
/*重写一个方法*/
再窗口中画图形和文本
窗口类主方法:paint方法
作用:
-
做窗口的绘制
特点:
-
自动被调用
-
g这个变量相当于一支画笔
实例:
/**
* @Description 飞机游戏的主窗口
* @Author Lucifer
*/
public class MyGameFrame extends JFrame {
/*重写桌面绘制方法*/
用ImageIO实现图片加载技术(0.3版)
过程:
-
将图片加载的方法封装到GameUtil工具类中,便于以后直接调用
实例:
import javax.swing.*; //需要导入的类
import java.awt.*;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
/**
* @description 飞机游戏的主窗口
* @author Lucifer
*/
public class MyGameFrame extends JFrame {
/*加载图片---创建对象加载*/
Image Marks = GameUtil.getImage("images/staticPicture.jpg");
/*重写桌面绘制方法*/
工具类
package com.lucifer.game;
import javax.imageio.ImageIO;
import java.awt.Image;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.net.URL;
/**
* 一个工具类
* @author Lucifer
*/
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;
}
}
多线程和内部类实现动画效果
方法:
-
再MyGameFrame类中定义"重画窗口线程PaintThread类"
-
将PaintThread定义成内部类
实例:
/*
定义一个内部类
好处:
直接使用外部类的属性
*/
class PaintThread extends Thread{
/*
利用这个线程帮助我们反复重画窗口
*/
/*重写父类的方法---内部类是子类*/
package com.lucifer.game;
import javax.swing.*; //需要导入的类
import java.awt.*;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
/**
* @description 飞机游戏的主窗口
* @author Lucifer
*/
public class MyGameFrame extends JFrame {
/*加载图片---创建对象加载*/
Image Marks = GameUtil.getImage("images/staticPicture.jpg");
/*给个背景图片---动图皮卡丘*/
Image Pkq = GameUtil.getImage("Images/big.gif");
/*利用变量让Marks动起来*/
int MarksX = 50, MarksY = 50;
/*重写桌面绘制方法*/
双缓存技术使用说明:
GameObject类设计
目的:
-
因为制作的内容有很多共性,设计一个GameObject类作为所有物体的父类,方便编程
共性:
-
有图片的
-
物体是有坐标的
-
移动的速度
-
物体的宽度和高度
所以需要定义一个父类,把这些属性放进去,然后以后要使用就去继承即可
实例:
package com.lucifer.game;
import java.awt.*;
/**
* 游戏物体的父类
* @author Lucifer
*/
public class GameObject {
//列出他们需要的属性
/*需要图片---对象*/
// private Image img;
Image img;
/*需要坐标点---double类型*/
// private double x,y;
double x,y;
/*他们的移动速度*/
// private int speed;
int speed;
/*宽度和高度*/
// private int width,height;
int width,height;
// //JavaBean方法
// public void setImg(Image img){
// this.img = img;
// }
//
// public Image getImg(){
// return img;
// }
//
// public void setX(double x){
// this.x = x;
// }
//
// public double getX(){
// return x;
// }
//
// public void setY(double y){
// this.y = y;
// }
//
// public double getY(){
// return y;
// }
//
// public void setSpeed(int speed){
// this.speed = speed;
// }
//
// public int getSpeed() {
// return speed;
// }
//
// public void setHeight(int height) {
// this.height = height;
// }
//
// public int getHeight() {
// return height;
// }
//
// public void setWidth(int width) {
// this.width = width;
// }
//
// public int getWidth() {
// return width;
// }
/*定义物体画出自己的方法*/
public void drawSelf(Graphics g){
g.drawImage(img,(int)x,(int)y,null);
}
//为了方便使用加几个重载的构造器
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 =