Renderizador de mapas 32x32, uma só classe - ficou bem programado?

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]

Melhor que isso só usando Java2D e não componentes do Swing.

[code]package com.primedi.ig;

import java.awt.Color;
import java.awt.Dimension;

import java.util.Timer;
import java.util.TimerTask;

import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;

import com.primedi.matlog.C32;
import com.primedi.util.Arquivo;

public class Mapa extends JFrame {

private static final long serialVersionUID = 1L;

public String nomeMapa = null;

private JPanel panMapa;
private JScrollPane brPanMapa;

// alcance da tela em tiles *

private static final int alcanceX = 20;
private int alcanceY = 15;

// alcance da tela em tiles

private JLabel[][] tilesImaginarios = new JLabel[alcanceX][15];

public static int X_POS_TILE = -1;
public static int Y_POS_TILE = -1;

private Arquivo arqMapa = null;

public Mapa(String nomeMapa){
	this.nomeMapa = nomeMapa;
	
	inicializarJanela();
	setVisible(true);
	
	processosCons();
}

private void criarJanela(){
	//setTitle("zMeck - Início");
	setSize(1352, 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);
	
	brPanMapa.getHorizontalScrollBar().setUnitIncrement(32);
}

private void adicionarComponentes(){
	getContentPane().add(brPanMapa);
}

private void inicializarJanela(){
	criarJanela();
	criarPaineis();
	criarBarrasDeRolagem();
	adicionarComponentes();
	
	carregarInfosMapa();
}

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++){
			tilesImaginarios[i][j] = new JLabel(new ImageIcon("tiles/tile2.PNG"));
			tilesImaginarios[i][j].setBounds((i * 32) + 658, j * 32, 32, 32);
			
			getContentPane().add(tilesImaginarios[i][j]);
		}
	}
}

private void altImg(int x, int y){
	for(int j = 0; j < alcanceY; j++){
		for(int i = 0; i < alcanceX; i++){
			tilesImaginarios[i][j].setIcon(new ImageIcon("tiles/tile" + arqMapa.lerLinha(y + j).charAt(x + i) + ".PNG"));
		}
	}
}

private void processosCons(){
	Timer t = new Timer();
	
	t.schedule(new TimerTask() {
		int posInicialScrollX = 0;
		int posInicialScrollY = 0;
		
		int c32 = 32;
		int c32y = 32;
		
		public void run() {
			if(brPanMapa.getViewport().getViewPosition().x != posInicialScrollX){
				posInicialScrollX = brPanMapa.getViewport().getViewPosition().x;
				
				if(posInicialScrollX > c32){
					altImg(C32.pixelPara32(brPanMapa.getViewport().getViewPosition().x), C32.pixelPara32(brPanMapa.getViewport().getViewPosition().y));
					c32 += 32;
					return;
				}
				
				if(posInicialScrollX < c32){
					altImg(C32.pixelPara32(brPanMapa.getViewport().getViewPosition().x), C32.pixelPara32(brPanMapa.getViewport().getViewPosition().y));
					c32 -= 32;
					return;
				}
			}
			
			if(brPanMapa.getViewport().getViewPosition().y != posInicialScrollY){
				posInicialScrollY = brPanMapa.getViewport().getViewPosition().y;
				
				if(posInicialScrollY > c32y){
					altImg(C32.pixelPara32(brPanMapa.getViewport().getViewPosition().x), C32.pixelPara32(brPanMapa.getViewport().getViewPosition().y));
					c32y += 32;
					return;
				}
				
				if(posInicialScrollY < c32y){
					altImg(C32.pixelPara32(brPanMapa.getViewport().getViewPosition().x), C32.pixelPara32(brPanMapa.getViewport().getViewPosition().y));
					c32y -= 32;
					return;
				}
			}
		}
	}, 1, 1);
}

}
[/code]

C32:

[code]package com.primedi.matlog;

public class C32 {

public static int pixelPara32(int pixelV){
	int aprox = 0;
	int finalx = 0;
	
	for(aprox = 0; aprox < pixelV; aprox++);
	
	for(int i = 0; i < aprox; i = i + 32){
		finalx++;
	}
	return finalx;
}

}
[/code]