📄 mapeditorex.java
字号:
}
map = new Map(tileCol, tileRow, tileWidth, tileHeight);
addLayer();
Image img = getImage(fileName);
//分割图片
tilePanel1.tileImgs = extractImages(img);
//生成逻辑图块
tilePanel1.logicImgs = this.createLogicImg();
maxLayerLB.setText(String.valueOf(map.getLayerSize()));
layerIdLB.setText(String.valueOf(curLayerID + 1));
showLB.setText(String.valueOf(curLayerID + 1));
downBtn.setEnabled(false);
upBtn.setEnabled(false);
jButton4.setEnabled(true);
jButton3.setEnabled(true);
jButton6.setEnabled(true);
showCB.setEnabled(true);
showCB.setSelected(true);
newMapJF.setVisible(false);
showPanel1.updateScale();
repaint();
}//GEN-LAST:event_jButton1ActionPerformed
//生成逻辑图块
private Image[] createLogicImg(){
Image[] imgs = new Image[2];
imgs[0] = createImage(map.tileWidth, map.tileHeight);
Graphics g = imgs[0].getGraphics();
g.setColor(Color.ORANGE);
g.fillRect(0, 0, map.tileWidth, map.tileHeight);
imgs[1] = createImage(map.tileWidth, map.tileHeight);
g = imgs[1].getGraphics();
g.setColor(Color.BLACK);
g.fillRect(0, 0, map.tileWidth, map.tileHeight);
return imgs;
}
//初始化组件
private void initComponents2(){
Thread t = new Thread(new Timer());
t.start();
//设置按钮不可用
jButton4.setEnabled(false);
jButton3.setEnabled(false);
jButton6.setEnabled(false);
upBtn.setEnabled(false);
downBtn.setEnabled(false);
showCB.setEnabled(false);
//帮助文本
String v = "1:新建一个地图文件,设置图块宽、图块高、纵行图块数、横行图块数、地图图片文件\n2: 编辑地图,可以添加图层,指定显示某些图层,编辑碰撞层,最后一个图块是橡皮\n3: 导出文件,文件保存在软件的当前目录下,文件名为map.x";
jTextArea1.setText(v);
center(this);
}
//打开文件
private void openActive(){
JFileChooser chooser = new JFileChooser("X:");
javax.swing.filechooser.FileFilter filter = new Map_file_filter();
chooser.setFileFilter(filter);
chooser.setDialogTitle("Open map File");
int returnVal = chooser.showOpenDialog(this);
if(returnVal == 0)
openFile(chooser.getSelectedFile());
}
private void openFile(File file){
picAddrLB.setText(file.getAbsolutePath());
newMapJF.setVisible(true);
}
private Image[] extractImages(Image img){
ImageProducer ip = img.getSource();
int width = img.getWidth(null);
int height = img.getHeight(null);
if(width % map.tileWidth != 0 || height % map.tileHeight != 0){
showMessageDialog("注意", "此图片裁减失败,请重新调整规格,图片的宽和图片的高应该是格子宽和格子高的整数倍", javax.swing.JOptionPane.ERROR_MESSAGE);
map = null;
return null;
}
int wSize = width / map.tileWidth;
int hSize = height / map.tileHeight;
Image[] imgs = new Image[wSize * hSize + 1];
int x = 0;
int y = 0;
for(int i = -1; ++i < hSize;){
for(int j = -1; ++j < wSize;){
x = j * map.tileWidth;
y = i * map.tileHeight;
CropImageFilter cf = new CropImageFilter(x, y, map.tileWidth, map.tileHeight);
imgs[i * wSize + j] = createImage(new FilteredImageSource(ip, cf));
}
}
imgs[imgs.length - 1] = createImage(map.tileWidth, map.tileHeight);
Graphics g = imgs[imgs.length - 1].getGraphics();
g.setColor(Color.BLACK);
g.fillRect(0, 0, map.tileWidth, map.tileHeight);
return imgs;
}
//背景缓冲
private Image bgBuffer;
public Image getImage(String imageFileName){
Image tkimage = this.getToolkit().createImage(imageFileName);
int tkMax = tkimage.getWidth(null) * tkimage.getHeight(null);
MediaTracker tracker = new MediaTracker(this);
tracker.addImage(tkimage, 0);
try {
tracker.waitForAll();
} catch(Exception e) {
Image image1 = null;
return image1;
}
return tkimage;
}
//创建新的地图
private void newMap(){
center(newMapJF);
picAddrLB.setText("");
newMapJF.setVisible(true);
}
//添加图层
private void addLayer(){
map.addLayer();
maxLayerLB.setText(String.valueOf(map.getLayerSize()));
downBtn.setEnabled(false);
upBtn.setEnabled(true);
curLayerID = map.getLayerSize() - 1;
showCB.setSelected(true);
layerIdLB.setText(String.valueOf(curLayerID + 1));
showLB.setText(String.valueOf(curLayerID + 1));
}
//生成二进制地图文件
private void saveFile(File file){
try{
RandomAccessFile raf = new RandomAccessFile(file, "rw");
raf.seek(0);
//层数
raf.writeByte(map.getLayerSize());
//宽
raf.writeByte(map.column);
//高
raf.writeByte(map.row);
//tileW
raf.writeByte(map.tileWidth);
//tileH
raf.writeByte(map.tileHeight);
//输入地图层
for(int l = -1; ++l < map.getLayerSize();){
for(int i = -1; ++i < map.row;){
for(int j = -1; ++j < map.column;){
raf.writeShort(map.getLayer(l).getData(i,j));
}
}
}
//输出逻辑层
for(int i = -1; ++i < map.row;){
for(int j = -1; ++j < map.column;){
raf.writeByte(map.getLogicLayer(i, j));
}
}
raf.close();
showMessageDialog("INFO", "导出成功,文件保存在: " + file.getAbsolutePath(), javax.swing.JOptionPane.ERROR_MESSAGE);
}catch(Exception e){
showMessageDialog("错误", e.getMessage(), javax.swing.JOptionPane.ERROR_MESSAGE);
}
}
/**
* @param args the command line arguments
*/
public static void main(String args[]) {
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
new MapEditorEX().setVisible(true);
}
});
}
class Map_file_filter extends javax.swing.filechooser.FileFilter{
public boolean accept(File f){
if(f != null){
if(f.isDirectory())
return true;
else{
String filename = f.getName();
int i = filename.lastIndexOf('.');
if(i > 0 && i < filename.length() - 1){
String extention = filename.substring(i + 1).toLowerCase();
return extention.equals("png");
}else{
return false;
}
}
}else{
return false;
}
}
public String getDescription(){
return "世界文件(*.xml)";
}
}
//定时刷新器
class Timer implements Runnable{
public void run(){
while(true){
//if(tilePanel1.bg != null){
// tilePanel1.setSize(tilePanel1.bg.getWidth(null), tilePanel1.bg.getHeight(null));
// }
tilePanel1.repaint();
showPanel1.repaint();
try{
Thread.sleep(1000L);
}catch(Exception e){
e.printStackTrace();
}
}
}
}
public static void center(Window win){
Toolkit tkit = Toolkit.getDefaultToolkit();
Dimension screenSize = tkit.getScreenSize();
Dimension windowSize = win.getSize();
if(windowSize.height > screenSize.height){
windowSize.height = screenSize.height;
}
if(windowSize.width > screenSize.width){
windowSize.width = screenSize.width;
}
win.setLocation((screenSize.width - windowSize.width) / 2, (screenSize.height - windowSize.height) / 2);
}
//显示提示框
private void showMessageDialog(String title, String msg, int type){
javax.swing.JOptionPane jOptionPane = new javax.swing.JOptionPane();
javax.swing.JLabel msgLabel = new javax.swing.JLabel(msg);
java.awt.Font font = new java.awt.Font("仿宋_GB2312", java.awt.Font.BOLD, 15);
msgLabel.setFont(font);
jOptionPane.showMessageDialog(this, msgLabel, title, type);
}
// 变量声明 - 不进行修改//GEN-BEGIN:variables
public static javax.swing.JLabel colLB;
private javax.swing.JButton downBtn;
private javax.swing.JMenu fileMU;
private javax.swing.JButton jButton1;
private javax.swing.JButton jButton2;
private javax.swing.JButton jButton3;
private javax.swing.JButton jButton4;
private javax.swing.JButton jButton5;
private javax.swing.JButton jButton6;
private javax.swing.JButton jButton7;
private javax.swing.JFrame jFrame1;
private javax.swing.JFrame jFrame2;
private javax.swing.JLabel jLabel1;
private javax.swing.JLabel jLabel10;
private javax.swing.JLabel jLabel11;
private javax.swing.JLabel jLabel12;
private javax.swing.JLabel jLabel13;
private javax.swing.JLabel jLabel15;
private javax.swing.JLabel jLabel16;
private javax.swing.JLabel jLabel2;
private javax.swing.JLabel jLabel3;
private javax.swing.JLabel jLabel4;
private javax.swing.JLabel jLabel5;
private javax.swing.JLabel jLabel6;
private javax.swing.JLabel jLabel7;
private javax.swing.JLabel jLabel8;
private javax.swing.JLabel jLabel9;
private javax.swing.JMenu jMenu1;
private javax.swing.JMenuBar jMenuBar1;
private javax.swing.JMenuItem jMenuItem1;
private javax.swing.JMenuItem jMenuItem2;
private javax.swing.JPanel jPanel2;
private javax.swing.JScrollPane jScrollPane1;
private javax.swing.JScrollPane jScrollPane2;
private javax.swing.JSeparator jSeparator1;
private javax.swing.JSeparator jSeparator2;
private javax.swing.JTextArea jTextArea1;
private javax.swing.JToolBar jToolBar1;
private javax.swing.JLabel layerIdLB;
private javax.swing.JLabel maxLayerLB;
private javax.swing.JMenuItem newMI;
private javax.swing.JFrame newMapJF;
private javax.swing.JMenuItem outMI;
private javax.swing.JLabel picAddrLB;
public static javax.swing.JLabel rowLB;
private javax.swing.JCheckBox showCB;
private javax.swing.JLabel showLB;
private map.ShowPanel showPanel1;
private javax.swing.JTextField tileColTF;
private javax.swing.JTextField tileHeightTF;
private map.TilePanel tilePanel1;
private javax.swing.JTextField tileRowTF;
private javax.swing.JTextField tileWidthTF;
private javax.swing.JButton upBtn;
// 变量声明结束//GEN-END:variables
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -