Estava tentando desenvolver um editor de mapas 2D (32x32 tiles), e digamos que consegui, só não o considero muito rápido, mas ficou bem simples e funcional. Queria saber se ficou bem programado e se tem como deixar ele mais rápido, a principal classe é a “Mapa”, logo abaixo.
Os mapas são arquivos “.pmp” onde 0 representa uma imagem 32x32 verde, e 1 azul. Um mapa de 5x5 seria:
00000
00000
00000
00000
00000
Classe “Mapa”: [code]package com.primedi.ig;
import java.awt.Color;
public class Mapa extends JFrame {
private static final long serialVersionUID = 1L;
public String nomeMapa = null;
private JPanel panMapa;
private JScrollPane brPanMapa;
private JLabel[][] rotTiles = new JLabel[75][15];
// alcance da tela em tiles *
private int alcanceX = 75;
private int alcanceY = 15;
private int limScrollXDir = 32;
private int limScrollXEsq = -1;
// alcance da tela em tiles
// posicoes do scroll iniciais *
private int posX = 0;
private int posY = 0;
// posicoes do scroll iniciais
private Arquivo arqMapa = null;
public Mapa(String nomeMapa){
this.nomeMapa = nomeMapa;
inicializarJanela();
setVisible(true);
processosCons();
}
private void criarJanela(){
//setTitle("zMeck - Início");
setSize(883, 594);
getContentPane().setLayout(null);
setResizable(false);
setLocationRelativeTo(null);
setUndecorated(true);
getContentPane().setBackground(Color.BLACK);
setDefaultCloseOperation(EXIT_ON_CLOSE);
}
private void criarPaineis(){
panMapa = new JPanel();
panMapa.setLayout(null);
panMapa.setBackground(Color.BLACK);
}
private void criarBarrasDeRolagem(){
brPanMapa = new JScrollPane(panMapa);
brPanMapa.setBounds(0, 0, 658, 498);
}
private void adicionarComponentes(){
getContentPane().add(brPanMapa);
}
private void inicializarJanela(){
criarJanela();
criarPaineis();
criarBarrasDeRolagem();
adicionarComponentes();
carregarInfosMapa();
prepararTiles(0, 0, false);
}
private void carregarInfosMapa(){
arqMapa = new Arquivo("mapas", nomeMapa + ".pmp");
arqMapa.carregarArquivo();
Dimension d = new Dimension((arqMapa.lerLinha(0).length() * 32), arqMapa.pegarNumeroLinhas() * 32);
panMapa.setPreferredSize(d);
panMapa.setVisible(true);
for(int j = 0; j < alcanceY; j++){
for(int i = 0; i < alcanceX; i++){
rotTiles[i][j] = new JLabel(new ImageIcon("tiles/tile2.PNG"));
panMapa.add(rotTiles[i][j]);
//System.out.println(i + " " + j);
}
}
}
private void prepararTiles(int posX, int posY, boolean esquerda){
if(esquerda == false){
for(int j = 0; j < alcanceY; j++){
for(int i = 0; i < alcanceX; i++){
if((posX + i) < arqMapa.lerLinha(0).length()){
rotTiles[i][j].setIcon(new ImageIcon("tiles/tile" + arqMapa.lerLinha(posY + j).charAt(posX + i) + ".PNG"));
rotTiles[i][j].setBounds((i + posX) * 32, (j + posY) * 32, 32, 32);
}
//panMapa.add(rotTiles[i][j]);
//System.out.println(i + " " + j);
}
}
}
else{
for(int j = 0; j < alcanceY; j++){
for(int i = 0; i < alcanceX; i++){
if((posX + i) < arqMapa.lerLinha(0).length()){
rotTiles[i][j].setIcon(new ImageIcon("tiles/tile" + arqMapa.lerLinha(posY + j).charAt(posX + i) + ".PNG"));
rotTiles[i][j].setBounds((i + posX) * 32, (j + posY) * 32, 32, 32);
}
//panMapa.add(rotTiles[i][j]);
//System.out.println(i + " " + j);
}
}
}
}
private void processosCons(){
Timer t = new Timer();
t.schedule(new TimerTask() {
public void run() {
int posAtualScroll = brPanMapa.getViewport().getViewPosition().x;
// limScrollXEsq = limScrollXDir - 32;
if(posAtualScroll > limScrollXDir && limScrollXDir < (arqMapa.lerLinha(0).length() * 32) + 32){
limScrollXDir += 32;
limScrollXEsq = limScrollXDir - 32;
posX++;
prepararTiles(posX, 0, false);
return;
}
if(posAtualScroll < limScrollXEsq){
limScrollXDir -= 32;
limScrollXEsq = limScrollXDir - 32;
posX--;
prepararTiles(posX, 0, true);
return;
}
}
}, 1, 1);
}
}
[/code]