java坦克大戰例項講解(二)
阿新 • • 發佈:2018-12-15
一:繪製圖片和播放音樂
我們玩遊戲最重要的是什麼,就是圖片和音樂,那麼如何展示它們呢?我們首先需要匯入它們,大家可以在這個連結處下載素材:
我們匯入我們需要的包,裡面有圖片包和音樂包。
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");
}
}
接下來就要向大家介紹如何繪製磚牆了,歡迎大家提意見和評論。