讲了那么多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> 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没有配置环境,那么如何解决这个问题呢?这里大家可以根据我的步骤:
好了,接下来我们讲解一些素材的创建,欢迎大家给我指导意见。