C++, Allegro i wolne działanie.

0

Witam. Wszystko działało bardzo szybko. Dodałem podwójne buforowanie i wypełnienie bufora jakimś kolorem i zaczęło wolno działać. Dodałem jeszcze kilka rzeczy i u mnie jest naprawdę wolno. Link do gry: http://chomikuj.pl/darkslayerpl

#include <allegro.h>
int main() 
{	
	allegro_init();
	install_keyboard();
	set_color_depth(32);
	set_gfx_mode(GFX_AUTODETECT_WINDOWED,800,600,0,0);
	clear_to_color(screen, makecol(128,128,128));
	BITMAP * bufor = NULL;
	BITMAP * plansza = NULL;
	BITMAP * niebo = NULL;
	BITMAP * ludek = NULL;
	BITMAP * nicosc = NULL;
	BITMAP * ziemia = NULL;
	BITMAP * drewno = NULL;
	BITMAP * kamien = NULL;
	BITMAP * gabka = NULL;
	BITMAP * trawa = NULL;
	BITMAP * snieg = NULL;
	BITMAP * szklo = NULL;
	BITMAP * grzyb = NULL;
	BITMAP * gwiazdka = NULL;
	BITMAP * blok = NULL;
	bufor = create_bitmap(4000,600);
	plansza = load_bmp("plansza.bmp",default_palette);
	niebo = load_bmp("niebo.bmp",default_palette);
	ludek = load_bmp("ludek.bmp",default_palette);
	nicosc = load_bmp("nicosc.bmp",default_palette);
	ziemia = load_bmp("ziemia.bmp",default_palette);
	drewno = load_bmp("drewno.bmp",default_palette);
	kamien = load_bmp("kamien.bmp",default_palette);
	gabka = load_bmp("gabka.bmp",default_palette);
	trawa = load_bmp("trawa.bmp",default_palette);
	snieg = load_bmp("snieg.bmp",default_palette);
	szklo = load_bmp("szklo.bmp",default_palette);
	grzyb = load_bmp("grzyb.bmp",default_palette);
	gwiazdka = load_bmp("gwiazdka.bmp",default_palette);
	blok = drewno;
	int ludek_x=0,ludek_y=0;
	while (!key[KEY_ESC])
	{
	if (key[KEY_LEFT] ) ludek_x--;
	if (key[KEY_RIGHT] ) ludek_x++;
	if (key[KEY_UP] ) ludek_y--;
	if (getpixel(plansza, ludek_x, ludek_y+50) == makecol(255,0,255)) ludek_y++;
	blit(niebo,bufor,0,0,0,0,niebo->w,niebo->h);
	masked_blit(plansza,bufor,0,0,0,0,plansza->w,plansza->h);
	masked_blit( ludek,bufor,0,0,ludek_x,ludek_y,ludek->w,ludek->h );
	if (key[KEY_1] ) blok = nicosc;
	if (key[KEY_2]) blok = ziemia;
	if (key[KEY_3] ) blok = drewno;
	if (key[KEY_4]) blok = kamien;
	if (key[KEY_5] ) blok = gabka;
	if (key[KEY_6]) blok = trawa;
	if (key[KEY_7] ) blok = snieg;
	if (key[KEY_8]) blok = szklo;
	if (key[KEY_9] ) blok = grzyb;
	if (key[KEY_0]) blok = gwiazdka;
	if (key[KEY_E]) blit(blok,plansza,0,0,ludek_x+50,ludek_y,blok->w,blok->h);
	if (key[KEY_Q]) blit(blok,plansza,0,0,ludek_x-50,ludek_y,blok->w,blok->h);
	if (key[KEY_R]) blit(blok,plansza,0,0,ludek_x,ludek_y-50,blok->w,blok->h);
	if (key[KEY_F]) blit(blok,plansza,0,0,ludek_x,ludek_y+50,blok->w,blok->h);
	if(ludek_x>-1&ludek_x<801) blit(bufor,screen,0,0,0,0,bufor->w,bufor->h);
	if(ludek_x>800&ludek_x<1601) blit(bufor,screen,801,0,0,0,bufor->w,bufor->h);
	if(ludek_x>1600&ludek_x<2401) blit(bufor,screen,1601,0,0,0,bufor->w,bufor->h);
	if(ludek_x>2400&ludek_x<3201) blit(bufor,screen,2401,0,0,0,bufor->w,bufor->h);
	if(ludek_x>3200&ludek_x<4001) blit(bufor,screen,3201,0,0,0,bufor->w,bufor->h);
    }
	allegro_exit();
	return 0;
}
END_OF_MAIN();
0

bo dodałeś getpixel(plansza, ludek_x, ludek_y+50)

1

proponowałbym użyć czegoś takiego jak "atlas tekstur". Grafikę do programu byś wczytał tylko raz później musiałbyś powycinać tylko odpowiednie fragmenty. To co ty zrobiłeś to marnowanie pamięci.

0

Tzn. to działało wolno nawet tylko jak była jedna tekstura która chodziła tylko w lewo i prawo, działało szybko bez podwójnego bufora i zamazywania bufora. Atlas tekstur? Mógłbyś wyjaśnić? na razie szukam go w googlach. Używam allegro 4. Nie korzystałem z atlasu (jeszcze w tedy nie wiedziałem że tak to się nazywa) bo miałem problemy głównie przez tą (i podobnymi do tej) linijkę "ludek->w,ludek->h". "bo dodałeś getpixel(plansza, ludek_x, ludek_y+50) " getpixel aż tak spowalnia?

0

Zapomniałem napisać że znalazłem (dokładnie tą samą stronę), ale i tak działa wolno.

0

dopóki używasz getpixel - będzie wolno cokolwiek zrobisz. Pozbądź się tego.

0

Bez getpixel i tak jest wolno.

0

Teraz kod wygląda tak:

#include <allegro.h>
int main() 
{	
	allegro_init();
	install_keyboard();
	set_color_depth(32);
	set_gfx_mode(GFX_AUTODETECT_WINDOWED,800,600,0,0);
	clear_to_color(screen, makecol(128,128,128));
	BITMAP * bufor = NULL;
	BITMAP * tekstury = NULL;
	bufor = create_bitmap(4000,600);
	tekstury = load_bmp("tekstury.bmp",default_palette);
	int ludek_x=0,ludek_y=0;
	while (!key[KEY_ESC])
	{
	if (key[KEY_LEFT] ) ludek_x--;
	if (key[KEY_RIGHT] ) ludek_x++;
	if (key[KEY_UP] ) ludek_y--;
	if (getpixel(tekstury, ludek_x, ludek_y+50) == makecol(255,0,255)) ludek_y++;
	blit(tekstury,bufor,0,600,0,0,4000,600);	
	masked_blit(tekstury,bufor,0,0,0,0,4000,600);
	masked_blit( tekstury,bufor,0,1200,ludek_x,ludek_y,50,50 );
    blit(bufor,screen,ludek_x-400,0,0,0,800,600);
    }
	allegro_exit();
	return 0;
}
END_OF_MAIN();

ale i tak to działa wolno. Bez getpixel również działa wolno.

0

Ref.

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