allegro 5 kolizja

0
czy mógłby mi ktoś wytłumaczyć jak stworzyć  kolizje wczytuje mapę z pliku.Kolizje jako kolizje na ekranie umiem zrobić ale chcę zacząć wczytywać mapę i na tej mapie robić kolizje . help

a o to kod

```cpp
#include <allegro5\allegro5.h>
#include <allegro5\allegro_native_dialog.h>
#include <allegro5\allegro_image.h>
#include <allegro5\allegro_primitives.h>
#include <fstream>
#include "load.h"
#define ScreenSzer 800
#define ScreenWys 600
#define  BlockSize 40
int top, bottom, left, right;
bool Collision(ALLEGRO_BITMAP *player, ALLEGRO_BITMAP *sciana,
	float x, float y, float ex, float ey, int width, int height, float &moveSpeed, int dir)
{
	if(x + width < ex || x > ex + width || y + height < ey || y > ey + height)
	{
		return false;
	}
	else 
	{
		top = max(y, ey); 
		bottom = min(y + height, ey + height);
		left = max(x, ex); 
		right = min(x + width, ex + width); 

		for(int i = top; i < bottom; i++)
		{
			for(int j = left; j < right; j++)
			{
				al_lock_bitmap(player, al_get_bitmap_format(player), ALLEGRO_LOCK_READONLY);
				al_lock_bitmap(sciana, al_get_bitmap_format(sciana), ALLEGRO_LOCK_READONLY);
				ALLEGRO_COLOR color = al_get_pixel(player, j - x, i - y);
				ALLEGRO_COLOR color2 = al_get_pixel(sciana, j - ex, i - ey);
				
				
			}
		}

	}
	return false;
}


int loadCounterX=0,loadCounterY=0,mapSizeX,mapSizeY;

void LoadMap(const char *filename,int map[][100])
{
	std::ifstream openfile(filename);
	if(openfile.is_open())
	{
		openfile>>mapSizeX>>mapSizeY;
		while(!openfile.eof())
		{
			openfile>>map[loadCounterX][loadCounterY];
			loadCounterX++;
			if(loadCounterX>=mapSizeX)
			{
				loadCounterX=0;
				loadCounterY++;
			}
		}
	}
	else
	{

	}
}
void DrawMap(int map[][100],ALLEGRO_BITMAP *,ALLEGRO_BITMAP *,ALLEGRO_BITMAP *pod);
int main()
{
	enum Direction{DOWN,LEFT,RIGHT,UP};
	const float FPS=60.0;
	bool done=false,draw=true,active=false;
	float x=10,y=10,moveSpeed=3;
	int map[100][100];
	int dir=DOWN,prevDir,index=0,sourceX=32,sourceY=0;
	ALLEGRO_DISPLAY *display;
	if(!al_init())
	{
		al_show_native_message_box(NULL,NULL,NULL,"blad",NULL,NULL);
	}
	display=al_create_display(320,320);
	if(!display)
	{
		al_show_native_message_box(NULL,NULL,NULL,"blad",NULL,NULL);
	}
	al_install_keyboard();
	al_init_image_addon();
	ALLEGRO_BITMAP *player=al_load_bitmap("PlayerImage1.png");
	ALLEGRO_BITMAP *sciana=al_load_bitmap("sprite/sciana.png");
	ALLEGRO_BITMAP *pod=al_load_bitmap("sprite/pod.png");
	ALLEGRO_BITMAP *mur=al_load_bitmap("sprite/mur.png");
	ALLEGRO_TIMER *timer = al_create_timer(1.0 / FPS);  
	ALLEGRO_TIMER *frameTimer = al_create_timer(1.0 / 15); 
	ALLEGRO_KEYBOARD_STATE keyState;
	ALLEGRO_EVENT_QUEUE *event_queue = al_create_event_queue();
	al_register_event_source(event_queue, al_get_timer_event_source(timer));
	al_register_event_source(event_queue, al_get_timer_event_source(frameTimer));
	al_register_event_source(event_queue, al_get_display_event_source(display));
	al_register_event_source(event_queue,al_get_keyboard_event_source());
	LoadMap("map.txt",map);
	al_start_timer(timer);
	al_start_timer(frameTimer);
	while(!done)
	{
		int *i =0,*j=0;
		ALLEGRO_EVENT events; 
		al_wait_for_event(event_queue, &events);
		al_get_keyboard_state(&keyState);

		if(events.type == ALLEGRO_EVENT_DISPLAY_CLOSE)
		{
			done = true;
		}
		else if (events.type == ALLEGRO_EVENT_TIMER)
		{
			if(events.timer.source == timer)
			{
				active = true;
				if(al_key_down(&keyState, ALLEGRO_KEY_DOWN))
				{
					y += moveSpeed; 
					dir = DOWN;
				}
				else if(al_key_down(&keyState, ALLEGRO_KEY_UP))
				{
					y -= moveSpeed; 
					dir = UP;
				}
				else if(al_key_down(&keyState, ALLEGRO_KEY_RIGHT))
				{
					x += moveSpeed; 
					dir = RIGHT;
				}
				else if(al_key_down(&keyState, ALLEGRO_KEY_LEFT))
				{
					x -= moveSpeed; 
					dir = LEFT;
				}
				else 
					active = false;

				if(Collision(player, sciana, x, y, 50, 50, 32, 32, moveSpeed, dir))
				{
					
				}
				else 
				draw = true;
			}

			else if (events.timer.source == frameTimer)
			{
				if(active)
					sourceX += al_get_bitmap_width(player) / 3;
				else 
					sourceX = 32; 

				if(sourceX >= al_get_bitmap_width(player))
					sourceX = 0;

				sourceY = dir;
			}

			draw = true;
		}

		if(draw){
		DrawMap(map,sciana,mur,pod);
		al_draw_bitmap_region(player,sourceX,sourceY*al_get_bitmap_height(player)/4,32,32,x,y,NULL);
		al_flip_display();
		al_clear_to_color(al_map_rgb(0, 0, 0));
		}
	}
	al_destroy_display(display);
	al_destroy_timer(timer);
	al_destroy_bitmap(player);
	al_destroy_bitmap(sciana);
	al_destroy_bitmap(mur);
	al_destroy_event_queue(event_queue);
	return 0;

}

void DrawMap(int map[][100],ALLEGRO_BITMAP *sciana,ALLEGRO_BITMAP *mur,ALLEGRO_BITMAP *pod)
{
	for(long int i=0;i<mapSizeX;i++)
	{
		for(long int j=0;j<mapSizeX;j++)
		{
			if(map[i][j]==0)
			{
				al_draw_bitmap(mur,i*32,j*32,NULL);
			}
			else if(map[i][j]==1)
			{
				al_draw_bitmap(sciana,i*32,j*32,NULL);
			}
			else if(map[i][j]==2)
			{
				al_draw_bitmap(pod,i*32,j*32,NULL);
			}		 
		}
	}
}
0
bool kolizja(int x1,int y1,int x2,int y2)
{
   if( x2 <= x1 + 20 && x2 > x1 && y2 >= y1 && y2 <= y1 + 20 ) return true; else
    if( x2 <= x1 + 20 && x2 > x1 && y2 + 20 >= y1 && y2 + 20 <= y1 + 20 ) return true; else
    if( x2 + 20 <= x1 + 20 && x2 + 20 > x1 && y2 >= y1 && y2 <= y1 + 20 ) return true; else
    if( x2 + 20 <= x1 + 20 && x2 + 20 > x1 && y2 + 20 >= y1 && y2 + 20 <= y1 + 20 ) return true;
    else return false;
};

Funkcja sprawdzające kolizje .
To powinno wystarczyć.

0

najlepiej to stworzyć edytor map i później zrobić aby zapisywało do twojego formatu mapy(tzn zapisuje wszystkie współrzędne prostokątów dla których zachodzi kolizja) później wczytaj do programy plik mapy i ztablicuj wszystkie współrzędne prostokątów i później sprawdzaj ze wszystkimi kolizje. Bo w sumie to troche ciężko by było robić mapy do gry manualnie. Tzn wpisywać do pliku odpowiednie współrzedne prostokątów i rodzaje tekstur. Lepiej to zrobić "wizualnie" za pomocą metody przeciągnij upuść i późnie program to konwertuje do odpowiedniego formatu. W allegro taki edytor by było dość trudno napisać gdyż jest to dość niskopoziomowa biblioteka. polecałbym użyć C++ cli. Jest to dialekt c++(jak rozumiesz c++ to zrozumienie tego przyjdzie ci z łatwością). Za to będziesz miał dostęp do komponentów .net framework i taki edytor map będzie łatwo zrobić. Tworzenie aplikacji okienkowych w C++ CLI jest niby nie zalecane bo winforms jest do d**y bo zżera dużo procesora zamiast używać karty graficznej ale do prostych aplikacji starcza

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