⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mapeditorex.java

📁 这是一个手机端的地图编辑器
💻 JAVA
📖 第 1 页 / 共 3 页
字号:
        }
        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 + -