using System; namespace blue_dish_te { internal class Kolize { private Svet svet; // odsazeni od steny private const float hracRadius = 0.5f; public Kolize(Svet svet) { this.svet = svet; } public Hrac UpravPohyb(Hrac stary, Hrac novy) { int[,] odecty = new int[8,2] {{0, -1}, {1, 0}, {0, 1}, {-1, 0}, {-1, -1}, {1, -1}, {1, 1}, {-1, 1}}; // hrac nesmi vypadnout z mapy if (-novy.x <= hracRadius) novy.x = -hracRadius; if (-novy.y <= hracRadius) novy.y = -hracRadius; if (-novy.x >= svet.height * 2 - hracRadius) novy.x = - (svet.height * 2 - hracRadius); if (-novy.y >= svet.width * 2 - hracRadius) novy.y = -(svet.width * 2 - hracRadius); //projedeme pro kazdy smer for (int i = 0; i < 8; i++) { try { // prevedeme na souradnice mapy a provedeme odecet v prislusnym smeru, cimz dostane kosticky okolo stare polohy int x = ((int) -stary.x) / 2 + odecty[i, 0]; int y = ((int) -stary.y) / 2 + odecty[i, 1]; //nechceme pocitat veci mimo mapu if (x < 0 || y < 0 || x > svet.height - 1 || y > svet.width - 1) continue; //pokud je tam zed a nova poloha hrace jiz tuto zet prekrocila if ((svet.map[x][y] == '*' || (svet.map[x][y] >= 'a' && svet.map[x][y] <= 'n')) && -novy.x > x * 2 - hracRadius && -novy.x < x * 2 + 2 + hracRadius && -novy.y > y * 2 - hracRadius && -novy.y < y * 2 + 2 + hracRadius) { //provedeme patricny posun smerem ke stare poloze // // ^ y (v 3D prostoru brano jako osa z) // | // | // 7 2 6 // 3 +-1--------> // 4 0 5 x // //posun nahoru, pokud je zed v 4, 0 nebo 5 if ((i == 4 || i == 0 || i == 5)) novy.y = -(y * 2 + 2 + hracRadius); //posun dolu, pokud je zed v 6, 2 nebo 7 if ((i == 6 || i == 2 || i == 7)) novy.y = -(y * 2 - hracRadius); //posun doleva, pokud je zed v 5, 1 nebo 6 if ((i == 5 || i == 1 || i == 6)) novy.x = -(x * 2 - hracRadius); //posun doprava, pokud je zed v 7, 3 nebo 4 if ((i == 7 || i == 3 || i == 4)) novy.x = -(x * 2 + 2 + hracRadius); } } catch(Exception e) { Console.WriteLine(e); } } // vratime novou pozici return novy; } } }