推箱子 | 遇到的問題及解決的辦法 ??

文章目錄
- 推箱子 | 遇到的問題及解決的辦法 ??
- 玩游戲界面
- map陣列的存盤和讀取
- 怎么初始化map陣列里面的內容
- 怎么控制人物的移動
- 怎么判斷人物移動的模型
- 怎么判斷游戲結束
- 地圖編輯器的實作原理
- 創新問題
- JComboBox組件監聽和游戲移動監聽沖突
- 實作音樂播放
- Timer類的使用
玩游戲界面
map陣列的存盤和讀取
Q: map陣列的存盤和讀取
A: 剛開始自己是想將map直接儲存在 主程式里面,但是后來發現這種思維方式,并不適合大量的存盤操作反而容易出錯,后來剛好學到了檔案流的操作,自己就想將map陣列,先存盤到每一個txt檔案,在通過檔案的讀取操作,將txt里面的資料寫入到每一個map陣列里面,這樣就實作了整個代碼的健壯性,
1墻 0空地 4箱子 12有箱子的目的地 8空目的地 2玩家

源代碼如下:
private void ReadMap(int k) throws IOException {
DataInputStream cin = new DataInputStream(new FileInputStream("src/JavaClassDesign/"+k+".txt"));
String b = "";
int j=0;
while((b=cin.readLine())!=null) {
char[] a=b.toCharArray();
for(int i=0;i<a.length;i++) {
wall[j][i]=a[i]-'0';
}
j++;
}
cin.close();
}
怎么初始化map陣列里面的內容
Q: 怎么初始化map陣列里面的內容
A: 以墻體為例,我們可以使用對map陣列遍歷來實作,如果此時map陣列里面內容為1,就在這里初始化墻體
怎么控制人物的移動
Q: 怎么控制人物的移動
A:對鍵盤實時監聽,每一個方向鍵會有一個鍵值,只需要判斷鍵值,就可以知道人物該如何移動了
怎么判斷人物移動的模型
Q:怎么控制人物的移動模型
A:對每一個移動要考慮13種移動,移動情況如下所示

怎么判斷游戲結束
Q:怎么判斷游戲結束
A:設定一個全域變數flag,當箱子和目的地重合時,flag++,時時刻刻維護flag的值,這個判斷標志,這里我們通過一個win函式來進行判斷,
private void win() throws IOException, ClassNotFoundException, InstantiationException, IllegalAccessException, UnsupportedLookAndFeelException{
if (num==boxnum){
Object[] options={"下一關","回傳"};
int response=JOptionPane.showOptionDialog ( null, "你的選擇","接下來",JOptionPane.YES_OPTION ,JOptionPane.PLAIN_MESSAGE, null, options, options[0] ) ;
if(response==0) {
if(musicFlag!=null)
musicFlag.stop();
if(musicFlagtmp!=null)
musicFlagtmp.stop();
this.dispose();
if(k<4)
new PlayGameInterface();
}
if(response==1) {
k=0;
if(musicFlag!=null)
musicFlag.stop();
if(musicFlagtmp!=null)
musicFlagtmp.stop();
this.dispose();
if(k<4)
new PlayGameInterface();
}
}
}
地圖編輯器的實作原理
Q:怎么實作地圖編輯器
A:對每一個要填充的物件,設定一個監聽器,在設定一個全域變數flag,當選擇墻體時flag==1,再將滑鼠點擊編輯地圖界面,將flag的值填充到map陣列里面,將map陣列作為一個形參,傳到跑這個游戲的主界面,
創新問題
JComboBox組件監聽和游戲移動監聽沖突
A:我是用JComboBox組件來實作,音樂的選著播放,但是JComboBox會和那個游戲界面進行沖突,我是用在JComboBox組件上呼叫一個方法
comboBox.setFocusable(false);
加了組件之后,鍵盤的監聽就已經全部實作到,JComboBox組件上面,這是呼叫setFoucusable,將鍵盤的聚焦到游戲的主界面,
實作音樂播放
Q:怎么實作音樂播放
A:1 獲取你要播放的音樂檔案,2、定義一個AudioInputStream用于接收輸入的音頻資料 3、呼叫AudioSystem.getClip()方法,就獲得一個資料線clip,用clip.open(audioInput)函式打開資料線的介面,用clip.start()資料線開始作業,
package SwingTest;
import java.io.File;
import java.io.IOException;
import javax.sound.sampled.AudioInputStream;
import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.Clip;
import javax.sound.sampled.LineUnavailableException;
import javax.sound.sampled.UnsupportedAudioFileException;
public class ClipTestClass {
String file;
Clip clip;
public ClipTestClass(String file) {
this.file=file;
}
public void player() throws UnsupportedAudioFileException, IOException, LineUnavailableException {
File filePath = new File(file);
if(filePath.exists()) {
AudioInputStream audioInput = AudioSystem.getAudioInputStream(filePath);
clip = AudioSystem.getClip();
clip.open(audioInput);
clip.start();
clip.loop(Clip.LOOP_CONTINUOUSLY);
//Thread.sleep(Integer.MAX_VALUE);
}
}
public void stop() {
if(clip!=null)
clip.stop();
}
}
Timer類的使用
Q:怎么使用Timer類的使用
A:使用System.currentTimeMillis()方法,獲得時間,是long型是數值,數值是與1970年1月1日的差值,在用Data物件,獲得當地時間
Timer time = new Timer(1000,new ActionListener() {
public void actionPerformed(ActionEvent e) {
long currentTime = System.currentTimeMillis();
SimpleDateFormat formatter = new SimpleDateFormat("HH:mm:ss");
Date date = new Date(currentTime);
jl33.setText(formatter.format(date));
jl6.setText(String.valueOf((currentTime-currentTime1)/1000)+"秒");
}
});
time.start();
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/244364.html
標籤:其他
上一篇:Java的誕生
