* MVC模式中得Viewer,只負責對數據的顯示,而不用理會遊戲的控制邏輯
*/
class SnakeView implements Observer {
SnakeControl control = null; //實例話壹個SnakeControl對象是control ..SnakeControl在jdk中不存在可能是第3方的或者是自己編寫的壹個類吧
SnakeModel model = null;//如上
JFrame mainFrame; //創建壹個面板類jframe
Canvas paintCanvas;
/**
*Canvas 組件表示屏幕上壹個空白矩形區域,應用程序可以在該區域內繪圖,或者可以從該區域捕獲用戶的輸入事件。
*應用程序必須為 Canvas 類創建子類,以獲得有用的功能(如創建自定義組件)。必須重寫 paint 方法,以便在 canvas 上執行自定義圖形。
*/
JLabel labelScore;//....不說了吧..
public static final int canvasWidth = 200; //常量寬度200
public static final int canvasHeight = 300;//常量高300
public static final int nodeWidth = 10;//常量寬度10
public static final int nodeHeight = 10;//常量高度10
public SnakeView(SnakeModel model, SnakeControl control) {
this.model = model;
this.control = control;
mainFrame = new JFrame("GreedSnake");//創建jframe 標題是GreedSnake
Container cp = mainFrame.getContentPane(); //得到jfram的容器
labelScore = new JLabel("Score:"); //創建jlabel 標簽內容是"Score:"
cp.add(labelScore, BorderLayout.NORTH);/將jlabel添加到jfram的容器中去
paintCanvas = new Canvas(); //創建新繪圖區
paintCanvas.setSize(canvasWidth + 1, canvasHeight + 1); //設置繪圖區大小
paintCanvas.addKeyListener(control);//添加鍵盤監聽器control
cp.add(paintCanvas, BorderLayout.CENTER);//將繪圖區添加到jfram容器中去.布局是BorderLayout的CENTER位置.就是東西南北中的中間
JPanel panelButtom = new JPanel();//創建壹個panel
panelButtom.setLayout(new BorderLayout());//設置布局是BorderLayout
JLabel labelHelp;//標簽的創建和添加開始了.......new了3遍就是實例化了3個都加到了panle的中間 ,標簽的內容都是""中間的
labelHelp = new JLabel("PageUp, PageDown for speed;", JLabel.CENTER);
panelButtom.add(labelHelp, BorderLayout.NORTH);
labelHelp = new JLabel("ENTER or R or S for start;", JLabel.CENTER);
panelButtom.add(labelHelp, BorderLayout.CENTER);
labelHelp = new JLabel("SPACE or P for pause", JLabel.CENTER);
panelButtom.add(labelHelp, BorderLayout.SOUTH);
cp.add(panelButtom, BorderLayout.SOUTH);//把這個panel添加到jframe的容器裏面去
mainFrame.addKeyListener(control);//為jframe添加鍵盤監聽器
mainFrame.pack();//調整此窗口的大小,以適合其子組件的首選大小和布局。如果該窗口和/或其所有者仍不可顯示,則兩者在計算首選大小之前變得可顯示。在計算首選大小之後,將會驗證該 Window。
mainFrame.setResizable(false);//設置此 frame 是否可由用戶調整大小。false就是不能
mainFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//點擊又上角的就是關閉
mainFrame.setVisible(true);//設置jfram為能看到
}
void repaint() {
Graphics g = paintCanvas.getGraphics();//Graphics詳細看jdk文檔..我就知道是壹個所有圖形上下文的抽象基類..這裏應該是那個畫圖面板
g.setColor(Color.WHITE);//設置這個顏色
g.fillRect(0, 0, canvasWidth, canvasHeight);//畫壹個矩形在x,y處畫壹個寬是200,高是300的矩形,
g.setColor(Color.BLACK);//顏色是黑的
LinkedList na = model.nodeArray;//LinkedList 類 List 接口的鏈接列表實現就是壹個集合對象了,因為不知道SnakeModel具體是壹個什麽類這裏就當作這個類能得到壹個集合
Iterator it = na.iterator();//得到叠代器去叠代這個集合
while (it.hasNext()) {//開始用while叠代
Node n = (Node) it.next();//得到壹個集合中元素.是壹個Node....這裏的Node不知道是什麽對象..有待於研究
drawNode(g, n);//調用另外方法
}
g.setColor(Color.RED);//設置顏色是紅的
Node n = model.food;//得到壹個新node..看來Node這裏應該是壹個坐標..這裏的坐標就是蛇吃的那個東西
drawNode(g, n);//畫這個東西..
updateScore();//調用..
}
private void drawNode(Graphics g, Node n) {//這是壹個畫方的方法..動態改變方型的位置
g.fillRect(n.x * nodeWidth,
n.y * nodeHeight,
nodeWidth - 1,
nodeHeight - 1);
}
public void updateScore() {//這是更新標簽的壹個方法
String s = "Score: " + model.score;
labelScore.setText(s);
}
public void update(Observable o, Object arg) {//這個就是Observer監聽類必須實現的方法..這裏是去調用repaint()方法..repaint方法就是不斷去改變畫圖版裏面的內容的
repaint();
}
}
參考資料: