Strona wykorzystuje ciasteczka by usprawnić komfort z jej korzystania. Korzystając ze strony akceptujesz naszą Politykę Ciasteczek. X

Podstawy silnika kafelkowego część 3: pole widzenia [zaawansowany]

Mam już za sobą rzut izometryczny i wyszukiwanie ścieżki, teraz przyszedł czas na ostatni punkt tego 3 częściowego artykułu: pole widzenia. W praktyce polega to zwykle na sprawdzaniu czy między jednym punktem (na przykład postacią gracza) a drugim (przeciwnikiem) jest bezpośredni kontakt, bez przeszkód po drodze. Zwykle jest to dość skomplikowane zagadnienie, jednak w silnikach kafelkowych okazuje się wyjątkowo trywialne, wystarczy znaleźć sobie jakiś algorytm do rysowania linii. Po co dokładnie? Algorytmy rysujące linie startują z jakiegoś punktu i krok po kroku zastępują piksele wybranym kolorem kierując się w stronę jakiegoś innego punktu by ostatecznie stworzyć linię. Gdyby jednak zastąpić wstawienie pikseli funkcją sprawdzając kafelki mielibyśmy algorytm który krok po kroku sprawdza czy coś nie stoi na przeszkodzie między dwoma punktami.
Tak więc, pozostaje tylko znaleźć jakiś algorytm - osobiście polecam ten opisany na Wikipedii: Algorytm Bresenhama. Zaimplementowany w ActionScript może wyglądać tak:
function isInSight(tiles:Vector.<Vector.<int>>,x1:Number, y1:Number, x2:Number, y2:Number):Boolean {
	var dx:Number;
	var dy:Number;
	if (x1>x2) {
		dy = y1;
		y1 = y2;
		y2 = dy;
		dx = x1;
		x1 = x2;
		x2 = dx;
	}
	dx = x2-x1;
	dy = y2 - y1;
			
	var y:Number;
	var x:Number;
	var m:Number;
	if (Math.abs(dx)>Math.abs(dy)) {
		m = dy/dx;
		y = y1;
		for (x=x1; x<x2; x++) {
			if(tiles[x][y] == 1) return false;
			y = y+m;
		}
	} else {
		m = dx/dy;
		x = x1;
		if (y1<y2) {
			for (y = y1; y < y2; y++) {
				if(tiles[x][y] == 1) return false;
				x = x+m;
			}
		} else {
			for (y = y1; y > y2; y--) {
				if(tiles[x][y] == 1) return false;
				x = x-m;
			}
		}
	}
	
	if(tiles[x2][y2] == 1) return false;
	return true;
}
Funkcja isInSight zwróci false jeśli po drodze do punktu 2 z punktu 1, trafią się jakieś kafelki oznaczone jako 1 w dwuwymiarowej tablicy tiles.
Łatwizna. Do tego algorytmy rysujące linie zwykle są bardzo szybkie, więc spokojnie można stosować to rozwiązanie na naprawdę obszernych planszach.

Imię:
Komentarz:
Potwierdz kod z obrazka:confirm image