1. 程式人生 > >java坦克大戰例項講解(二)

java坦克大戰例項講解(二)

一:繪製圖片和播放音樂

我們玩遊戲最重要的是什麼,就是圖片和音樂,那麼如何展示它們呢?我們首先需要匯入它們,大家可以在這個連結處下載素材:

我們匯入我們需要的包,裡面有圖片包和音樂包。

1.繪製圖片

我們建立一個新的圖片類,並在類中寫入下面的程式碼:  

package com.itxiaoangzai.tankegame.utils;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.LinkedHashMap;
import java.util.Map;

import org.lwjgl.opengl.GL11;
import org.newdawn.slick.Color;
import org.newdawn.slick.opengl.Texture;
import org.newdawn.slick.opengl.TextureLoader;

public class DrawUtils {
	private static Map<String, Texture> map = new LinkedHashMap<>();

	private DrawUtils() {
	}

	/**
	 * 獲得圖片的大小
	 * 
	 * @param imagePath
	 *            圖片路徑
	 * @return 返回長度為2的陣列,0為寬,1為高
	 * @throws IOException
	 *             圖片不存在時的異常
	 */
	public static int[] getSize(String imagePath) throws IOException {
		String key = getKey(imagePath);
		Texture texture = map.get(key);

		if (texture == null) {
			String format = getFormat(imagePath);
			texture = TextureLoader.getTexture(format, new FileInputStream(new File(imagePath)));
			map.put(key, texture);
		}

		int width = (int) (texture.getImageWidth() + 0.5f);
		int height = (int) (texture.getImageHeight() + 0.5f);

		return new int[] { width, height };
	}

	/**
	 * 繪製圖片
	 * 
	 * @param imagePath
	 *            圖片路徑
	 * @param x
	 *            圖片繪製時的x座標
	 * @param y
	 *            圖片繪製時的y座標
	 * @throws IOException
	 *             圖片不存在時的異常
	 */
	public static void draw(String imagePath, int x, int y) throws IOException {
		String key = getKey(imagePath);
		Texture texture = map.get(key);

		if (texture == null) {
			String format = getFormat(imagePath);
			texture = TextureLoader.getTexture(format, new FileInputStream(new File(imagePath)));
			map.put(key, texture);
		}

		int width = texture.getImageWidth();
		int height = texture.getImageHeight();

		width = texture.getTextureWidth();
		height = texture.getTextureHeight();

		Color.white.bind();
		texture.bind(); // or GL11.glBind(texture.getTextureID());
		GL11.glBegin(GL11.GL_QUADS);
		{
			GL11.glTexCoord2f(0f, 0f);
			GL11.glVertex2f(x, y);

			GL11.glTexCoord2f(1f, 0f);
			GL11.glVertex2f(x + width, y);

			GL11.glTexCoord2f(1f, 1f);
			GL11.glVertex2f(x + width, y + height);

			GL11.glTexCoord2f(0f, 1f);
			GL11.glVertex2f(x, y + height);

		}
		GL11.glEnd();
	}

	private static String getKey(String imagePath) {
		return imagePath;
	}

	private static String getFormat(String imagePath) {
		if (imagePath == null) {
			return null;
		}
		int index = imagePath.lastIndexOf(".");
		if (index == -1) {
			return null;
		}
		return imagePath.substring(index + 1);
	}
}

然後我們在MyWindows類中重寫方法:  

/**
	 * 窗體載入時執行,只執行一次
	 */
	protected void onCreate(){

	}
	
	/**
	 * 滑鼠事件
	 */
	protected void onMouseEvent(int key, int x, int y){
		
	}

	/**
	 * 鍵盤事件
	 */
	protected void onKeyEvent(int key){
		
	}

	/**
	 * 不斷重新整理
	 */
	protected void onDisplayUpdate(){
		try{
		DrawUtils.draw("shiCai/img/tkk.jpg", 0, 0);
		}catch (IOException e){
			e.printStackTrace();
		}
    }

這時有個疑問,我們是在每次重新整理一次時寫入圖片,還是在不斷重新整理時寫入圖片呢?其實是這個窗體是按照毫秒顯示元件的(可以理解為與遊戲有關的東西),所以我們要重寫不斷重新整理類。

我們看一下效果:

二:播放音樂

播放音樂和顯示圖片是一樣的,只要選對路徑即可。但要注意的是,播放音樂是播放一次,需要寫到顯示一次的類中:

protected void onCreate(){
		try{
			SoundUtils.play("shiCai/mysound/start.wav");
		}catch(IOException e){
			e.printStackTrace();
		}
	}

我們可以增加滑鼠事件,來控制,這個音樂播放:

protected void onMouseEvent(int key, int x, int y){
		if(key == 0){
			try {
				SoundUtils.play("shiCai/mysound/start.wav");
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
		else if(key == 1){
			SoundUtils.stop("shiCai/mysound/start.wav");
		}
		
	}

接下來就要向大家介紹如何繪製磚牆了,歡迎大家提意見和評論。