Witam
Pracuję nad grą w stylu Breakout. Mam mapkę kafelkową z bloczkami które trzeba rozwalać. Niestety nie bardzo wiem jak zrobić wykrywanie kolizji piłki z tymi bloczkami.
Podaję kod:
#include <iostream>
#include <windows.h>
#include <allegro5/allegro.h>
#include <allegro5/allegro_image.h>
#include <allegro5/allegro_font.h>
#include <allegro5/allegro_ttf.h>
#include <allegro5/allegro_acodec.h>
#include <allegro5/allegro_audio.h>
#include <allegro5/allegro_primitives.h>
using namespace std;
int dwn=0,lft=0,szer=1280,wys=1024;
int rozm1=210,rozm2=20;
int x_paletki=szer/2-rozm1/2,y_paletki=wys-2*rozm2;
int x_ball=x_paletki+rozm1/2,y_ball=y_paletki-rozm2/2;
int ruch=3;
int vol=2;
int i=0;
int x,y;
int tab_bloczki[5][20]=
{
{1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},
{2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
{3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3},
{4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4}
};
int main()
{
srand( time( NULL ) );
al_init();
al_install_keyboard();
al_init_font_addon();
al_init_ttf_addon();
al_init_image_addon();
al_init_primitives_addon();
al_install_audio();
al_init_acodec_addon();
al_reserve_samples(8);
ALLEGRO_KEYBOARD_STATE klawiatura;
al_set_new_display_flags( ALLEGRO_FULLSCREEN );
ALLEGRO_DISPLAY *okno = al_create_display(szer,wys);
ALLEGRO_FONT * font_100 = al_load_ttf_font("data/font/font_100.ttf",100, 0);
ALLEGRO_FONT * font = al_load_ttf_font("data/font/font.ttf",18, 0);
ALLEGRO_BITMAP * bloczki = al_load_bitmap("data/image/bloczki.png");
ALLEGRO_BITMAP * paletka = al_create_bitmap(rozm1,rozm2);
al_hide_mouse_cursor(okno);
al_set_window_title(okno,"WallBall");
al_set_target_bitmap(paletka);
al_clear_to_color(al_map_rgb(255,255,255));
al_set_target_bitmap(al_get_backbuffer(okno));
double czas = al_get_time();
while( !al_key_down( &klawiatura, ALLEGRO_KEY_ESCAPE))
{
al_get_keyboard_state(&klawiatura);
if ( al_get_time() > czas+ 0.00001)
{
if (y_ball+10>=y_paletki)
{
if (x_ball>=x_paletki && x_ball<=x_paletki+30) ruch=1;
if (x_ball>=x_paletki+30 && x_ball<=x_paletki+60) ruch=2;
if (x_ball>=x_paletki+60 && x_ball<=x_paletki+90) ruch=3;
if (x_ball>=x_paletki+90 && x_ball<=x_paletki+120) ruch=4;
if (x_ball>=x_paletki+120 && x_ball<=x_paletki+150) ruch=5;
if (x_ball>=x_paletki+150 && x_ball<=x_paletki+180) ruch=6;
if (x_ball>=x_paletki+180 && x_ball<=x_paletki+210) ruch=7;
}
if (x_ball-10<=0 or x_ball+10>=szer)
{
if (ruch==1) ruch=7;
if (ruch==2) ruch=6;
if (ruch==3) ruch=5;
if (ruch==4) ruch=11;
if (ruch==5) ruch=3;
if (ruch==6) ruch=2;
if (ruch==7) ruch=1;
}
if (y_ball-10<=0)
{
if (ruch==1) ruch=8;
if (ruch==2) ruch=9;
if (ruch==3) ruch=10;
if (ruch==4) ruch=11;
if (ruch==5) ruch=12;
if (ruch==6) ruch=13;
if (ruch==7) ruch=14;
}
//w góre
if (ruch==1) y_ball--,x_ball-=2;
if (ruch==2) y_ball-=2,x_ball-=2;
if (ruch==3) y_ball-=2,x_ball--;
if (ruch==4) y_ball-=2;
if (ruch==5) y_ball-=2,x_ball++;
if (ruch==6) y_ball-=2,x_ball+=2;
if (ruch==7) y_ball--,x_ball+=2;
//w dół
if (ruch==8) y_ball++,x_ball-=2;
if (ruch==9) y_ball+=2,x_ball-=2;
if (ruch==10) y_ball+=2,x_ball--;
if (ruch==11) y_ball+=2;
if (ruch==12) y_ball+=2,x_ball++;
if (ruch==13) y_ball+=2,x_ball+=2;
if (ruch==14) y_ball++,x_ball+=2;
if(al_key_down(&klawiatura,ALLEGRO_KEY_LEFT) && x_paletki>0) x_paletki-=3;
if(al_key_down(&klawiatura,ALLEGRO_KEY_RIGHT) && x_paletki+rozm1<szer) x_paletki+=3;
al_clear_to_color(al_map_rgb_f(0,0,0));
for (int y=0 ; y < 5 ; y++ )
for (int x=0 ; x < 20 ; x++ )
al_draw_bitmap_region(bloczki,128*tab_bloczki[y][x], 0,128,40,x*128, y*40+80,0);
al_draw_bitmap(paletka,x_paletki,y_paletki,0);
al_draw_filled_circle(x_ball,y_ball,rozm2/2,al_map_rgb(255,255,255));
al_draw_textf(font,al_map_rgb(255,255,255),szer-szer+10,wys-25,0,"ESC - wyjście");
al_draw_textf(font,al_map_rgb(255,255,255),szer-szer+140,wys-25,0,"F12 - restart gry");
al_flip_display();
czas = al_get_time();
al_rest(0.01);
}
}
al_destroy_font(font_100);
al_destroy_font(font);
al_destroy_display(okno);
return 0;
}