[c++, allegro]jak zrobić ściany

0

witam, od niedawna bawię się w allegro i zacząłem robić jakąś prostą grę
i mam z nią mały problem: jak zrobić taką ścianę przez którą nie da się przechodzić
mój programik:

 #include <allegro.h>

int main()
{
allegro_init();
install_keyboard();

set_color_depth(16);
set_gfx_mode(GFX_AUTODETECT_WINDOWED,800,800,0,0);
clear_to_color(screen, makecol(128,128,128));  

install_sound(DIGI_AUTODETECT,MIDI_AUTODETECT,"");
set_volume(255,255); 

BITMAP *bufor = NULL;
BITMAP *ludek = NULL;  
SAMPLE *dzwiek = NULL;
dzwiek = load_sample("muzyka.wav");
play_sample(dzwiek, 255,127,1000,1);

bufor = create_bitmap(800,800);

ludek = load_bmp("ludek.bmp",default_palette);

int ludek_x = 100, ludek_y = 100;  

while( !key[KEY_ESC])
{



if( key[KEY_LEFT]) ludek_x--;
if( key[KEY_RIGHT]) ludek_x++;
if( key[KEY_UP]) ludek_y--;
if( key[KEY_DOWN]) ludek_y++;
clear_to_color(bufor, makecol(150,150,150));

masked_blit( ludek, bufor, 0,0, ludek_x, ludek_y, ludek->w, ludek->h);  
blit( bufor, screen, 0,0,0,0, 800,800);
}  
destroy_bitmap(ludek);
destroy_bitmap(bufor);
allegro_exit();
return 0;
}
END_OF_MAIN();  

Będę bardzo wdzięczny za pomoc

0

jak piszesz program to nie ma czegos takiego jak sciana przez ktora nie da sie przejsc. sa tylko wspolrzedne ludka i wspolrzedne sciany ktora jest de facto prostokatem. jak sprawdzic czy ludek znajduje sie w prostokacie? powinienes wiedziec z matematyki

0

Byłbym bardzo wdzięczny jak by ktoś napisał ten kod
bo ja nawet nie wiem jak za to się zabrać

0

Pisanie całej gry w jednej funkcji? Daleko nie zajedziesz... Spróbuj wprowadzić poniższe poprawki.

// wcześniej
struct rectangle
{
	int x;
	int y;
	int w; // width
	int h; // height
};

// w main:
rectangle rects[3];
// wypełnianie prostokątów

// przed pętlą główną:
int new_ludek_x;
int new_ludek_y;

W pętli głównej zmienić 4 ify na
if( key[KEY_LEFT]) new_ludek_x = ludek_x-1;
if( key[KEY_RIGHT]) new_ludek_x = ludek_x+1;
if( key[KEY_UP]) new_ludek_y = ludek_y-1;
if( key[KEY_DOWN]) new_ludek_y = ludek_y+1;

for (int i = 0; i < 3; i++)
{
	rectangle rect = rects[i]
	if (new_ludek_x > rect.x && new_ludek_x < rect.X + rect.w
		&& new_ludek_y > rect.y && new_ludek_y < rect.Y + rect.h)
	{ ludek_x = new_ludek_x; ludek_y = new_ludek_y; }
}

// rysowanie prostokątów czyli ścian
0

próbowałem zrobić to co napisał MSM ale niestety wyskoczył taki błąd:

------ Build started: Project: Allegro_testrun, Configuration: Debug Win32 ------
1> main.cpp
1>c:\documents and settings\admin\moje dokumenty\allegro_testrun\allegro_testrun\allegro_testrun\main.cpp(17): error C3646: 'rectangle' : unknown override specifier
1>c:\documents and settings\admin\moje dokumenty\allegro_testrun\allegro_testrun\allegro_testrun\main.cpp(17): error C3646: 'rects' : unknown override specifier
1>c:\documents and settings\admin\moje dokumenty\allegro_testrun\allegro_testrun\allegro_testrun\main.cpp(17): error C2090: function returns array
1>c:\documents and settings\admin\moje dokumenty\allegro_testrun\allegro_testrun\allegro_testrun\main.cpp(19): error C2447: '{' : missing function header (old-style formal list?)
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========

0
#include <allegro.h>

struct rectangle
{
        int x;
        int y;
        int w; // width
        int h; // height
};

int main()
{
	rectangle rects[3];
	
	for(int i = 0; i < 3; i++)
	{
		rects[i].x = rand() % 800;
		rects[i].y = rand() % 800;
		rects[i].h = rand() % 300;
		rects[i].w = rand() % 300;
	}

	allegro_init();
	install_keyboard();

	set_color_depth(16);
	set_gfx_mode(GFX_AUTODETECT_WINDOWED,800,800,0,0);
	clear_to_color(screen, makecol(128,128,128));  

	install_sound(DIGI_AUTODETECT,MIDI_AUTODETECT,"");
	set_volume(255,255);

	BITMAP *bufor = NULL;
	BITMAP *ludek = NULL; 
	int ludek_sizex = 100;
	int ludek_sizey = 100;

	bufor = create_bitmap(800,800);

	ludek = load_bmp("ludek.bmp",default_palette);

	int ludek_x = 100, ludek_y = 100;  
	int new_ludek_x;
	int new_ludek_y;


	while( !key[KEY_ESC])
	{
		new_ludek_x = ludek_x;
		new_ludek_y = ludek_y;
		if( key[KEY_LEFT]) new_ludek_x = ludek_x-1;
		if( key[KEY_RIGHT]) new_ludek_x = ludek_x+1;
		if( key[KEY_UP]) new_ludek_y = ludek_y-1;
		if( key[KEY_DOWN]) new_ludek_y = ludek_y+1;

		bool intersection = false;
		for (int i = 0; i < 3; i++)
		{
			rectangle rect = rects[i];
			if (new_ludek_x > rect.x && new_ludek_x < rect.x + rect.w
				&& new_ludek_y > rect.y && new_ludek_y < rect.y + rect.h)
			{ intersection = true; }
		}
		if (!intersection)
		{ ludek_x = new_ludek_x; ludek_y = new_ludek_y; }
		
		clear_to_color(bufor, makecol(150,150,150));
		
		for(int i  = 0; i < 3; i++)
		{
			rectfill(bufor, rects[i].x, rects[i].y, rects[i].x + rects[i].w, rects[i].y + rects[i].h, 0);
		}
		
		masked_blit( ludek, bufor, 0,0, ludek_x, ludek_y, ludek->w, ludek->h);  
		blit( bufor, screen, 0,0,0,0, 800,800);
	}
	
	destroy_bitmap(ludek);
	destroy_bitmap(bufor);
	allegro_exit();
	return 0;
}
END_OF_MAIN(); 

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