java坦克大战实例讲解(一)

讲了那么多python的知识,今天我们换一下口味,讲解一个java实例,就是著名的坦克大战游戏。

准备工作:

(1)安装eclipse

(2)JDK1.8版本以上

这里我用到的是eclipse中文版,主要面向非官方用户。

一:建立一个工作空间

1.先在桌面上创建一个tanke命名的文件夹,然后我们把工作空间切换过去,方法如下:

这是我们来切换工作空间:

之后eclipse会重启,我们等待一下,就会看到已经切换到我们的工作空间了。

这时我们想要验证下,就可以新建一个java项目,然后在建立我们需要的类:

然后我们输出一些东西,可以看到我们创建成功了:

2.我们还需要一些修改:
(1)修改码表为utf-8:我们点击窗口(Windows)->首选项(Preference)->工作空间进入设置:

大家可以自行修改字体大小。

这里向大家介绍一个自动补齐的方法,大家打开这个页面:

在内容辅助中在鼠标的位置java的自动触发器,默认为".",这里我们输入小写abcd-z即可(输入的是a到z的26个字母),就可以让编译器触发默认的代码:

这样可以方便我们写代码,缩短我们写代码的时间。

二.准备工作之模板方法设计模式

1.我们先写一段计算重复代码输出时间的程序:
 

package com.itxiaoangzai.test;

public class Test3 {
	public static void main(String[] args) {
		//打印200次"IT Xiao Ang Zai"
		
		//时间得到的是ms值
		long start = System.currentTimeMillis();
		for(int i = 0;i < 200;i++)
		{
			System.out.println("IT Xiao Ang Zai"+i);
		}
		
		long end = System.currentTimeMillis();
		System.out.println(end - start);
	}
}

2.我们如果想要得到更多重复次数的输出时间,是不是可以用一个通用的办法呢?

当然,我们先新建一个抽象类,然后构建父类的抽象方法:

package com.itxiaoangzai.test;

/**
 * 模板方法设计模式构建一个模板类
 * 可以在非抽象方法中调用抽象方法
 * @author IT Xiao Ang Zai
 *
 */

public abstract class GetTime {
	public abstract void myThing();
	public long getTime(){
		//时间得到的是ms值
		long start = System.currentTimeMillis();
		
		myThing();
		
		long end = System.currentTimeMillis();
		return end - start;
	}
}

然后我们再用一个子类继承父类的方法,然后重写父类的抽象方法(这里用到了多态),就可以得到我们想要的结果:
 

package com.itxiaoangzai.test;

public class MyThing extends GetTime{
	public void myThing(){
	for(int i = 0;i < 200;i++)
	{
		System.out.println("IT Xiao Ang Zai"+i);
	}
	}

}

效果如下:

三:创建第一个窗体

1.导入lwjgl包(LightWight Java Game Library(轻量级Java游戏工具库),轻量级指的是他不依赖计算机硬件,可以在多平台使用。

大家可能没有听过,不过大家肯定听过我得世界这款游戏吧,它就是用这个jar包创建窗体的。

我们先下载后安装,操作如下:

从GitHub上下载我们需要的lwjgl的jar包:

我们可以看到我们已经成功下载到了这个jar包:

这里我想大家分享了一个整理过的文件,大家可以在下面的链接中下载:
https://download.csdn.net/download/itxiaoangzai/10707302

我们导入后还要添加依赖:

这时,这个jar包就可以供我们使用了。

2.我们先定义一个Windows类,代码如下:
 

package com.itxiaoangzai.test;

import java.util.LinkedHashMap;
import java.util.Map;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.ScheduledFuture;
import java.util.concurrent.TimeUnit;

import org.lwjgl.LWJGLException;
import org.lwjgl.input.Keyboard;
import org.lwjgl.input.Mouse;
import org.lwjgl.opengl.Display;
import org.lwjgl.opengl.DisplayMode;
import org.lwjgl.opengl.GL11;

public abstract class Window {
	private final String title;// 标题
	private final int width;// 屏幕宽度
	private final int height;// 屏幕的高度
	private final int fps;// 每秒钟刷新的帧率

	private boolean running;
	private ScheduledExecutorService pool;
	private Map<Integer, ScheduledFuture<?>> tasks = new LinkedHashMap<>();

	public Window(String title, int width, int height, int fps) {
		this.title = title;
		this.width = width;
		this.height = height;
		this.fps = fps;
	}

	/**
	 * 开始游戏
	 */
	public final void start() {
		if (running) {
			return;
		}
		running = true;

		pool = Executors.newScheduledThreadPool(16);

		// 初始化窗体
		initGL();

		// 创建时的回调
		onCreate();

		while (running && !Display.isCloseRequested()) {
			GL11.glClear(GL11.GL_COLOR_BUFFER_BIT);

			// 处理用户交互输入
			processInput();

			// 处理UI刷新显示
			processDisplay();

			Display.update();
			Display.sync(fps);
		}

		pool.shutdownNow();
		Display.destroy();
	}

	/**
	 * 退出游戏
	 */
	public final void stop() {
		if (!running) {
			return;
		}
		running = false;
	}

	private void initGL() {
		try {
			Display.setDisplayMode(new DisplayMode(width, height));
			Display.create();
			Display.setTitle(title);
			Display.setVSyncEnabled(true);
		} catch (LWJGLException e) {
			e.printStackTrace();
			System.exit(0);
		}

		GL11.glEnable(GL11.GL_TEXTURE_2D);

		GL11.glClearColor(0.0f, 0.0f, 0.0f, 0.0f);

		// enable alpha blending
		GL11.glEnable(GL11.GL_BLEND);
		GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA);

		GL11.glViewport(0, 0, width, height);
		GL11.glMatrixMode(GL11.GL_MODELVIEW);

		GL11.glMatrixMode(GL11.GL_PROJECTION);
		GL11.glLoadIdentity();
		GL11.glOrtho(0, width, height, 0, 1, -1);
		GL11.glMatrixMode(GL11.GL_MODELVIEW);
	}

	private void processInput() {
		while (Mouse.next()) {
			if (Mouse.getEventButtonState()) {
				onMouseEvent(Mouse.getEventButton(), Mouse.getX(), Mouse.getY());
			}
		}

		while (Keyboard.next()) {
			if (Keyboard.getEventKeyState()) {
				// 按下
				int key = Keyboard.getEventKey();
				onKeyEvent(key);

				addLongPress(key);
			} else {
				// 释放
				int key = Keyboard.getEventKey();
				removeLongPress(key);
			}
		}
	}

	private void addLongPress(int key) {
		ScheduledFuture<?> future = tasks.get(key);
		if (future != null) {
			future.cancel(true);
			future = null;
		}

		future = pool.scheduleAtFixedRate(new Runnable() {
			@Override
			public void run() {
				onKeyEvent(key);
			}
		}, 100, 100, TimeUnit.MILLISECONDS);

		tasks.put(key, future);
	}

	private void removeLongPress(int key) {
		ScheduledFuture<?> future = tasks.get(key);
		if (future != null) {
			future.cancel(true);
			future = null;
		}
	}

	private void processDisplay() {
		onDisplayUpdate();
	}

	/**
	 * 窗体创建时的回调
	 */
	protected abstract void onCreate();

	/**
	 * 鼠标down事件
	 * 
	 * @param key
	 *            0为左键 1为右键
	 * @param x
	 *            x坐标
	 * @param y
	 *            y坐标
	 */
	protected abstract void onMouseEvent(int key, int x, int y);

	/**
	 * 按键事件
	 * 
	 * @param key
	 *            按键,{@code Keyboard.key_xx}
	 */
	protected abstract void onKeyEvent(int key);

	/**
	 * 当屏幕刷新时的回调
	 */
	protected abstract void onDisplayUpdate();
}

我们写入主程序:

这是我们可以看到一个错误,好像是我们的java.library没有配置环境,那么如何解决这个问题呢?这里大家可以根据我的步骤:

然后我们就可以得到我们的游戏主窗口界面:

好了,接下来我们讲解一些素材的创建,欢迎大家给我指导意见。

猜你喜欢

转载自blog.csdn.net/ITxiaoangzai/article/details/82970379