Ukrywanie wybranego koloru na bitmapie podczas jej animacji

0

Mam taki problem. Piszę grę w stylu mario, która składa się z dwóch bitmap. Gracza czyli naszego Mario i tła które się przesówa gdy wierzołek bitmapy z graczem znajdzie się pośrodku ekranu. Chciałbym, aby kolor którym wcześniej otoczyłem postać Maria był zastępowany kolorem tła, czyli piksel o podanym kolorze na obrazie gracza przyjmował kolor piksela tła. Napisałem oto taki kod który realizuje ten sposób, lecz gdy skompiluje kod i opdale program to ten zacinia się.

Dodam, że x_M, y_M cały czas się zmieniją bo bitmapa się przesówa wraz z naciśnmieciem klawiszy strzałek

RGB(129,41,56) // to wartości tego koloru

x_M// x wierzchołka bitmapy względem początku układu okna
y_M// y-||-

GAMER.infBmp.bmWidth// szerokość bitmapy
GAMER.infBmp.bmHeight// wysokość bitmapy

if(GetPixel(GAMER.hdcMem, x_0, y_0) == RGB(129,41,56))
// jezeli pobrany kolor piksela kontekstu bitmapy z gramczem jest taki sam jak
// kolor którym otoczyłem postać

SetPixel(GAMER.hdcMem, x_0, y_0, GetPixel(MAP.hMemMAP, x_M +GAMER.infBmp.bmWidth, y_M +GAMER.infBmp.bmHeight));
// to uktaw kolor piksela kontekstu bitmapy z graczem na kolor tego samego piksela, z tym że tła


//sprawdzamy wszystkie piksele jakie mają kolory wykona sie tyle razy ile pikseli ma bmp z graczem
while(x_M < x_M + GAMER.infBmp.bmWidth)//wspolrzedna x piksela dopóki nie przekroczy końca bitmapy gracza
{
	while(y_M < y_M +GAMER.infBmp.bmHeight)//wspolrzedna y piksela dopóki nie przekroczy przekroczy końca bitmapy gracza
	{
	  if(GetPixel(GAMER.hdcMem, x_0, y_0) == RGB(129,41,56))
           SetPixel(GAMER.hdcMem, x_0, y_0, GetPixel(MAP.hMemMAP, (x_M+x_0), (y_M + y_0));
	
           ++y_M;//kolejny piksel bmp tła na y
	   ++y_0;//kolejny piksel bmp gracza na y
        }
			}
++x_M;// kolejny piksel bmp tła na x
++x_0;//kolejny piksel bmp gracza na x
}
0

Zacina czyli zapętla, tak? Przyjrzyj się dobrze warunkom w pętlach while i sam odpowiedz sobie
na pytanie dlaczego tak się dzieje ;)
BTW. Z ciekawości zapytam, korzystasz z biblioteki Allegro?

0

Nie korzystam z allegro tylko windows.h. No chyba się gdzieś zapętla, ale nie wiem gdzie. Wszystko jest na swoim miejscu według mnie. Teraz już nawet myśle, że za duża ilość obliczeń, bo bitmapa ma 64x56, co daje 3584 obliczenia na jeden obieg, a dodają jeszczę sprawdzenie warunków.. Dalej czekam na pomoc.

0

Po pierwsze kod który podałeś jest ok. Problem leży pewnie gdzieś indziej albo GetPixel/SetPixel są po prostu zbyt wolne.

Powinieneś odmalować cały prostokąt za pomocą BitBlt bez sprawdzania jaki piksel ma jaką wartość, będzie szybciej.

0

Problem rozwiązany oto poprawiony kod. Mała korekta i śmiga. :D


                x_k = (x_M+GAMER.infBmp.bmWidth+10);
		y_k = (y_M+GAMER.infBmp.bmHeight+10); 

		for(x_M = posGAMER.x; x_M <= x_k; ++x_M)
		{
			for(y_M = posGAMER.y; y_M <= y_k; ++y_M)
			{
				if(GetPixel(GAMER.hdcMem, x_0, y_0) == RGB(129,41,56))
					SetPixel(GAMER.hdcMem, x_0, y_0, GetPixel(hdcBufor, x_M, y_M));
				++y_0;
				
				
			}
			y_0=0;
			++x_0;
		}
		x_0 = 0;
		y_0 = 0;
0

Ok, fajnie że rozwiązałeś problem, ale może warto by było się zastanowić czemu nie działało.
@adf88: Nie wiem, może coś jest ze mną nie teges ale przecież kod:

x_M < x_M + GAMER.infBmp.bmWidth

jest równoważny

0 < GAMER.infBmp.bmWidth

co dla niepustego obrazka zawsze zachodzi przez co dostajemy while (true), w środku nie ma break-a no i zapętelenie gotowe.
Czyli tak jak zasugerowałem warunek w while powinien zostać zmieniony. Kiep poprawił to co trzeba i o dziwo zaczęło śmigać;)

@kiep123: Tak jak napisał adf setPixel/getPixel to chyba najmniej wydajny sposób dostępu do tekstury. Należy tego unikać jak ognia.

1 użytkowników online, w tym zalogowanych: 0, gości: 1