Why are you giving "Uncaught ReferenceError: getSetorObj is not defined"?

0

You are saying that "getSetorObj" is not defined, but the method exists and is in the Map class. The error is at line 38 of the script.

$(document).ready(function(){
	var jogo = new Jogo();
	jogo.init();
});

function Setor(X, Y){ 				//Classe Setor: Cada setor do mapa
	var x = X, y = Y; 				//	Coordenadas xy do setor	
	var id = "x" + x + "y" + y;		//	id do div do setor
	this.get = function(){			//	retorna o objeto JQuery do setor
		return $("#" + id);
	}
	
	$("#mapa").append("<div class=\"setor\" id=\"" + id + "\" ></div>" );	//	Adiciona div do setor ao mapa
}

function Mapa(TamX, TamY){
	var tamX = TamX, tamY = TamY;
	var setores = [];
	
	for(i = 1; i <= tamY; i++){
		for(j = 1; j <= tamX; j++){
			setores[tamX * (i - 1) + j] = new Setor(j, i);
		}
		$("#x" + 1 + "y" + i).css("clear", "left");
	}
	
	this.getSetorObj = function(x, y){
		return $("#x" + x + "y" + y);
	}
	
	
	var atualiza = function(){
		
	
	}
	
	this.selectSetor = function(X, Y){
		getSetorObj(X, Y).css("background-color", "red");
	}
	this.destSetor = function(X, Y){
		getSetorObj(X, Y).css("background-color", "lightblue");
	}
	this.getTamX = function(){
		return tamX;
	}
	this.getTamY = function(){
		return tamY;
	}
	this.getSetor = function(x, y){
		return setores[tamX * (y - 1) + x]
	}
}

function Jogo(){
	mapa = new Mapa(10, 10);
	var initX, initY;
	var setoresJogador = [];
	

	
	this.init = function(){
		initX = Math.floor((Math.random() * mapa.getTamX()) + 1);
		initY = Math.floor((Math.random() * mapa.getTamY()) + 1);
		
		setorInit = {x: initX, y: initY};
		setoresJogador.push(setorInit);
		mapa.selectSetor(initX, initY);
		atualiza();
	}
	
	var addSetorJog = function(novoSetor){
		setoresJogador.push(novoSetor);
		atualiza();
	}
	
	var getSetoresAdj = function(setores){
		var setoresAdjacentes = []; 
		for(i=0; i<setores.length; i++){
			var setor = setores[i];
			for(j= (-1); j<=1; j++){
				for(k= (-1); k<=1; k++){
					if(j!=0 || k!=0){
						var x = setor.x + j;
						var y = setor.y + k;
						if((x >= 1 && x <= mapa.getTamX()) && (y >=1 && y <= mapa.getTamY()))
							setoresAdjacentes.push({x: x, y: y});
                        }
				}
			}
		}
		return setoresAdjacentes;
	}
	var atualiza = function(){
		adjacentes = getSetoresAdj(setoresJogador);
		for(i=0; i<adjacentes.length; i++){
			var setor = adjacentes[i];
			mapa.destSetor(setor.x, setor.y);
			mapa.getSetorObj(setor.x, setor.y).click(function(){
				setoresJogador.push({x: setor.x, y: setor.y});
			});
		}
	}
}

function Jogador(){




}
<html>
	<head>
		<style>
		.setor{
			margin: 0px;
			padding: 0px;
			float: left;
			width: 40px;
			height: 40px;
			border: solid 1px lightblue;
			background-color: lightgreen;
		}
		</style>
		<script src="jquery.min.js"></script>
		<script src="script.js" ></script>
	</head>
	<body>
		<div id="mapa">
		</div>
	</body>
</html>
    
asked by anonymous 15.01.2016 / 18:40

1 answer

4

You need to specify the this. to call the getSetorObj function on that line (and in others as well). If you do not use this prefix, the

this.selectSetor = function(X, Y){
    getSetorObj(X, Y).css("background-color", "red");
}

is equivalent to

this.selectSetor = function(X, Y){
    [[global]].getSetorObj(X, Y).css("background-color", "red");
}

And that function is not defined in the global scope. Using this you will use the correct scope.

this.selectSetor = function(X, Y){
    this.getSetorObj(X, Y).css("background-color", "red");
}
    
15.01.2016 / 18:46