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 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);
 }
 
}
}

你可能感兴趣的:(Java星际争霸1仿制)