我的团队项目有点问题,在这个项目中我们必须制作一个游戏。我有2个面板用于背景与地图(从json创建)和另一个面板与角色。我已尝试使用jlayeredpane,但地图不在我的jframe中心。我也尝试过.setOpaque(true / false),但它不起作用。有谁有想法?
这是我的代码:
package vue;
import java.awt.BorderLayout;
import java.awt.CardLayout;
import java.awt.Color;
import java.awt.Component;
import java.awt.GridBagLayout;
import java.awt.GridLayout;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.nio.Buffer;
import java.util.ArrayList;
import java.util.Hashtable;
import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JLayeredPane;
import org.json.*;
import org.json.simple.JSONArray;
import org.json.simple.JSONObject;
import org.json.simple.parser.JSONParser;
import org.json.simple.parser.ParseException;
import controler.abstractControler;
import observer.Observer;
public class gamingArea extends JPanel implements Observer {
private String ressourcesImg = "resources/images/";
private Hashtable <String,String> tile = new Hashtable();
private abstractControler controler;
private JSONParser parser = new JSONParser();
private JSONArray map ;
private JPanel centerPanel,topPanel,playerPanel,mapPanel,centerContentPanel;
private GridBagLayout centerLayout,topLayout;
private GridLayout mapLayout,playerLayout;
private BorderLayout divider;
private JLabel banniereLabel;
private BufferedImage banniere;
public gamingArea(abstractControler controler) {
this.controler = controler;
//getting the image from system file
try {
banniere = ImageIO.read(new File(ressourcesImg+"banniere.png"));
banniereLabel = new JLabel(new ImageIcon(banniere));
} catch (IOException e) {
banniereLabel = new JLabel();
banniereLabel.setText("error file can't be read");
e.printStackTrace();
}
//getting the map in json format
try {
map = (JSONArray) ((JSONObject) parser.parse(new FileReader("resources/cartes/carte.json"))).get("boite");
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (ParseException e) {
e.printStackTrace();
}
//init Jpanel
centerPanel = new JPanel();
topPanel = new JPanel();
playerPanel = new JPanel();
mapPanel = new JPanel();
centerContentPanel = new JPanel(new CardLayout());
//init layout
centerLayout = new GridBagLayout();
topLayout = new GridBagLayout();
divider = new BorderLayout();
playerLayout = new GridLayout(map.size(),map.size());
mapLayout = new GridLayout(map.size(),map.size());
//setting layout
this.setLayout(divider);
centerPanel.setLayout(centerLayout);
topPanel.setLayout(topLayout);
mapPanel.setLayout(mapLayout);
playerPanel.setLayout(playerLayout);
//setting the hasmap
tile.put("1",ressourcesImg+"sol.png");
tile.put("2",ressourcesImg+"mur.png");
//defining layout which show the map
for (int i = 0; i < map.size(); i++) {
ArrayList<String> line= (ArrayList<String>) map.get(i);
for (int j = 0; j < line.size(); j++) {
try {
BufferedImage tempBuf = ImageIO.read(new File(tile.get(line.get(j))));
JLabel temp = new JLabel(new ImageIcon(tempBuf));
mapPanel.add(temp);
} catch (Exception e) {
e.printStackTrace();
}
}
}
//adding a player sample
BufferedImage testb;
try {
testb = ImageIO.read(new File(ressourcesImg+"snake_tete_invisible.png"));
JLabel test = new JLabel(new ImageIcon(testb));
playerPanel.add(test);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//setting panels opaque or not
mapPanel.setOpaque(true);
playerPanel.setOpaque(false);
//adding components to main panels
//centerContentPanel.add(mapPanel);
//centerContentPanel.add(playerPanel);
centerPanel.add(centerContentPanel);
topPanel.add(banniereLabel);
this.add(topPanel,divider.PAGE_START);
this.add(mapPanel,divider.CENTER);
this.add(playerPanel,divider.CENTER);
}
@Override
public void update(String str) {
// TODO Auto-generated method stub
}
@Override
public void changePanel(String nomPanel) {
// TODO Auto-generated method stub
}
}
我已经找到了解决方案,所以对于那些想要在这里知道解决方案的人来说,在Java中创建一个没有库的磁贴图:使用类似的Json创建地图:
{"box":[
["2","2","2","2","2","2","2","2","2","2"]
["2","1","1","1","1","1","1","1","1","2"]
["2","1","1","1","1","1","1","1","1","2"]
["2","1","1","1","1","1","1","1","1","2"]
["2","1","1","1","1","1","1","1","1","2"]
["2","1","1","1","1","1","1","1","1","2"]
["2","1","1","1","1","1","1","1","1","2"]
["2","1","1","1","1","1","1","1","1","2"]
["2","1","1","1","1","1","1","1","1","2"]
["2","2","2","2","2","2","2","2","2","2"]
]
}
以box表的大小创建gridLayout,其中2设置为墙的图像,1设置为草的图像
然后获得一个不可见的图块,并在第一个图块的大小处制作第二个gridlayout。最后你只需要用JLayeredPane将它设置在它上面,并用你的角色替换由gridlayout给出的cordinate的invisibile tile。