UI实现的难点在于Jcombobox和Jlist的选用,界面更好的跳转,点选后组合框弹跳功能的实现,修改分辨率为800X600
为了实现更好的界面跳转效果和功能选用采用了卡片布局.
先看一下UI总共的实现类别:
Abstractpanel:对属性进行一些基本的设置,比如颜色和字体,做为一个ParentPanel
ConsolePanel:是玩家主要的控制面板,如小地图和工作窗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
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);
}
}
}