Java項目之星際爭霸1簡單仿製(二)UI的實現

UI實現的難點在於Jcombobox和Jlist的選用,界面更好的跳轉,點選後組合框彈跳功能的實現,修改分辨率爲800X600

爲了實現更好的界面跳轉效果和功能選用採用了卡片佈局.

先看一下UI總共的實現類別:

Abstractpanel:對屬性進行一些基本的設置,比如顏色和字體,做爲一個ParentPanel

ConsolePanel:是玩家主要的控制面板,如小地圖和工作窗
GameGUI:作爲最頂層的Frame
GamePanel:遊戲面板,也放置了一些控制方法,左右鍵的點擊,用畫筆畫了控制線
MainMenuPanel:菜單面板
MapPanel:地圖面板   注意畫框有一個像素   畫筆使用雙緩衝   使用了MouseAdapter
MutilPlayerPanel:多人遊戲界面
NetworkPanel:網絡面板
NewGamePanel:新建遊戲面板
ProgressPanel:進度條面板
SingleGamePanel:單人遊戲面板

WorkPanel:建造面板



UI的實現採用了建立父類面板的方法來節省編碼實踐,提高編碼效率。



下面闡述一下技術難點的處理方法

1.分辨率的修改

修改分辨率要用到java.awt包
使用其中的DisplayMode
調用isFullScreenSupported()方法返回的是false
new DisplayMode(1024,768,16,0); 
修改顯示器的分辨率依賴於硬件,在個別顯示器中不一定好用

public void setResolution() { 
GraphicsEnvironment environment = GraphicsEnvironment.getLocalGraphicsEnvironment();
GraphicsDevice device=environment.getDefaultScreenDevice();
DisplayMode displayMode=new DisplayMode(1024,768,16,75);
device.setDisplayMode(displayMode);

}

public static void main(String args[]) {
FenBianLv fbl = new FenBianLv();
fbl.setResolution();
}


2.Jcombobox和Jlist的選用

 JComboBox  只有一行,但是點擊右邊向下箭頭後,有一列可以選擇,至於一列可以顯示多少個列對象,可以通過setMaximumRow方法設置。 
       JList是直接列出很多列對象可以選擇。本身沒有滾動條,可以添加JScrollPane對象綁定Jlist到滾動條。使用setVisibleRowCount()方法調節顯示的選項數
swing默認的BasicComboBoxRenderer主要是爲了改變默認選擇每個下拉項的外觀





3.點選功能鍵後發生界面跳轉的彈跳功能實現

可以將基本組件的彈跳與QQ聊天窗口的抖動功能類比,其本質是短時間內基本組件發生了座標位置的來回變換。

public void shake() {
new Thread() {
public void run() {
for (int i = 0; i < 5; i++) {
// 獲取到的是原始位置
setLocation((int) getX(), (int) getY() - 5);
ThreadUtil.sleep(20);
setLocation((int) getX() - 5, (int) getY());
ThreadUtil.sleep(20);
setLocation((int) getX(), (int) getY() + 5);
ThreadUtil.sleep(20);
setLocation((int) getX() + 5, (int) getY());
ThreadUtil.sleep(20);
setLocation((int) getX(), (int) getY());
}


};
}.start();
}



下面放出代碼:

Abstractpannel

import java.awt.Color;
import java.awt.Font;
import java.awt.Image;
import java.awt.event.ActionListener;


import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JPanel;


import core.ResourceManager;


public class Abstractpanel extends JPanel {
 
protected static final Color borderColor = new Color(255,0,0,100);
protected static final Color fillColor = new Color(0,0,0,70);
protected static final Color textColor = new Color(76,196,40);
protected static final Color titleColor = new Color(164,180,248);
protected static final Font font = new Font("Tahoma",Font.BOLD,12);
protected Image main = ResourceManager.loadImage("background3.jpg");
protected GameGUI gameGUI;

public Abstractpanel(GameGUI gameGUI, String name) {
setLayout(null);
setSize(gameGUI.getWidth(), gameGUI.getHeight());
gameGUI.add(this, name);
this.gameGUI = gameGUI;


}
protected void initButton(final JButton button,ActionListener listenner) {
button.setBorder(BorderFactory.createLineBorder(borderColor));
button.setFont(font);
button.setForeground(textColor);
button.setIgnoreRepaint(true);
button.setFocusable(false);
button.setContentAreaFilled(false);
button.addActionListener(listenner);
 
}
public void update(long elapsedTime) {


}

}


ConsolePanel

import java.awt.Graphics;
import java.awt.Image;


import javax.swing.JPanel;


import core.GridMapRender;
import core.ResourceManager;


public class ConsolePanel extends JPanel {


Image main = ResourceManager.loadImage("console.gif");

GridMapRender tileMap;

public MapPanel   map_panel ;
public WorkPanel  work_panel  ;


public ConsolePanel(GridMapRender gridMapRender) {
super();
setFocusable(false);
setLayout(null);
setSize(main.getWidth(null), main.getHeight(null));

//初始化map_panel和work_panel
this.tileMap = gridMapRender;
map_panel = new MapPanel(gridMapRender);
work_panel = new WorkPanel(gridMapRender);
map_panel.setLocation(10, 20);
work_panel.setLocation(10, 158);
add(map_panel);
add(work_panel);
gridMapRender.setConsolePanel(this);
 
}
 

public void paintComponent(Graphics g) {
g.drawImage(main, 0, 0, null);
 
}

}


GameGUI:

import icon.BaseIcon;


import java.awt.CardLayout;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.util.LinkedList;
import java.util.List;


import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JPanel;


import net.NetWorkManager;
import net.datagram.IconInfo;
import net.datagram.MoveInfo;
import net.datagram.PlayerInfo;
import net.datagram.SpriteInfo;
import net.socket.ClientEvent;
import net.socket.ClientListener;
import net.udp.PlayerEvent;
import net.udp.PlayerListener;
import tile.Scv;
import tile.Sprite;
import tile.Tile;
import core.FocusManager;
import core.GridMapRender;
import core.ResourceManager;
import core.ResourceManager.Constant;


@SuppressWarnings({ "unused", "serial" })
public class GameGUI extends JPanel {


//卡片佈局器
private CardLayout cardLayout = new CardLayout();
//進度條面板 
private ProgressPanel progressPanel; 
//菜單面板
private MainMenuPanel menuPanel;
//遊戲面板
private GamePanel gamePanel;
//需要update
private Abstractpanel currentPanel;
//單人遊戲面板
private SingleGamePanel singleGamePanel;
//多人能遊戲面板
private MutilPlayerPanel mutilPlayerPanel;

NewGamePanel newGamePanel;

NetWorkManager netWorkManager;

GridMapRender mapRender;

JFrame frame;
public GameGUI(JFrame frame) {
this.frame = frame;
setLayout(cardLayout);
getBorder();
frame.getContentPane().add(this);
setSize(frame.getWidth(), frame.getHeight());
//這裏有個次序,最先加入的顯示
currentPanel = menuPanel = new MainMenuPanel(this, "mainMenu");
progressPanel = new ProgressPanel(this, "progress");
gamePanel = new GamePanel(this, "game");
singleGamePanel = new SingleGamePanel(this,"singleGame");
mutilPlayerPanel = new MutilPlayerPanel(this,"mutilGame");
newGamePanel = new NewGamePanel(this,"newGame");

}
public void switchProgress(final int type,final List<Integer> types) {
   
cardLayout.show(this, "progress");
currentPanel = progressPanel;

Thread t = new Thread(){
public void run(){
mapRender = ResourceManager.load(type,types);
mapRender.setNetWorkManager(netWorkManager);
}
};
t.start();

}


public void switchGame() {
 
gamePanel.init();
cardLayout.show(this, "game");
currentPanel = gamePanel;
}

public void switchSingleGame() {

cardLayout.show(this, "singleGame");
singleGamePanel.reset();
currentPanel = singleGamePanel;
}

public void switchMutilGame() {

cardLayout.show(this, "mutilGame");
mutilPlayerPanel.reset();
currentPanel = mutilPlayerPanel;
}

public void switchMainMenu() {

cardLayout.show(this, "mainMenu");
menuPanel.reset();
currentPanel = menuPanel;

}

public void switchNewGame() {

cardLayout.show(this, "newGame");
newGamePanel.reset();
currentPanel = newGamePanel;

}
 

public void update(long elapsedTime) {
 
 if(currentPanel!=null){
 currentPanel.update(elapsedTime);
 }
 
}
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章