Java游戏开发基本知识二
1、抽象公共的窗口类,负责完成窗口的公共功能,如关闭窗口,建立窗口,重画线程
2、建立公共类Constant,放置项目中的常量
3、运用公共类来运行一个项目
4、轨迹的一些实现方式,定义弧度,通过弧度改变x,y值来实现任意估计
基础窗口类(父类)
package com.hank.game;
import java.awt.Frame;
import java.awt.Image;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import com.hank.util.Constant;
import com.hank.util.GameUtil;
/**
* 游戏基本知识学习类
* 游戏窗口类
*/
public class BaseFrame extends Frame{ //GUI编程,awt,swing,jframe等
private static final long serialVersionUID = -8342342546611528706L;
Image image = GameUtil.getImage("images/95501.jpg");
/**
* 启动主窗口
*/
public void launchFrame() {
//如果更标准些,宽度和高度都应该从配置文件中读取
this.setSize(Constant.GAME_WIDTH, Constant.GAME_HEIGHT); //设置窗体大小
this.setLocation(100, 100); //设置窗体在屏幕显示的位置
this.setVisible(true); //设置窗体是否可见
//启动重画线程,可以产生动态效果
new Thread(new PaintThread()).start();
//加个监听器,监听器用匿名内部类,监听窗口关闭动作,来执行相应动作
//WindowAdapter类实现了三个重要监听接口WindowListener,WindowStateListner,WindowFocusListner
//但WindowAdapter具体方法的实现没有写,需要我们手动完成
this.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
}
/**
* 定义一个重画窗口的线程类,也是一个内部类,方便访问外部类属性,方法
*/
class PaintThread implements Runnable {
public void run() {
while (true) {
repaint(); //重画相当于反复调用paint()方法
try {
Thread.sleep(40);//为了不太耗cpu,大约40ms重画一次,大约1s25张图片
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}
游戏开发工具类
package com.hank.util;
import java.awt.Image;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.net.URL;
import javax.imageio.ImageIO;
/**
* 游戏开发中常用的工具类
* 工具类:1.通常将构造方法私有
* 2.工具类基本都是静态的方法,方便调用
*/
public class GameUtil {
/**
* 加载图片方法
* @param path
* @return
*/
public static Image getImage(String path) {
URL url = GameUtil.class.getClassLoader().getResource(path); //要搞懂这句话 FIXME
BufferedImage image = null;
try {
image = ImageIO.read(url);
} catch (IOException e) {
e.printStackTrace();
}
return image;
}
}
游戏常量类
package com.hank.util;
/**
* 项目中用到的常量
*/
public interface Constant {
/**
* 游戏窗口的宽度
*/
public static int GAME_WIDTH = 800;
/**
* 游戏窗口的高度
*/
public static int GAME_HEIGHT = 800;
}
游戏窗口主类
package com.hank.test;
import java.awt.Graphics;
import java.awt.Image;
import com.hank.game.BaseFrame;
public class GameFrame05 extends BaseFrame{
Image image = GameUtil.getImage("images/95501.jpg");
private int x = 200;
private int y = 200;
private double speed = 10;
private double degree = Math.PI/3; //[0,3.14*2]
//在窗体里面画东西,这个是构造函数回调自动调用的,一定会被执行
public void paint(Graphics g) {
System.out.println("painting!!!");
g.drawImage(image, x, y, null); //通过每次画不同的位置实现动态效果
if (speed > 0) {
speed -= 0.1;
}
x += speed * Math.cos(degree);
y += speed * Math.sin(degree);
if (y > 600-40 || y < 30) {
degree = -degree;
}
if (x > 600-40 || x < 0) {
degree = Math.PI - degree;
}
}
public static void main(String[] args) {
GameFrame05 gFrame05 = new GameFrame05();
gFrame05.launchFrame();
}
}