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

2 respostas
jubapunx

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":
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);
	}

}

2 Respostas

ViniGodoy

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

jubapunx
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);
	}

}

C32:

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;
	}

}
Criado 15 de dezembro de 2013
Ultima resposta 16 de dez. de 2013
Respostas 2
Participantes 2