Darkroom - console game - Problems
Здравейте,
занимавам се с една идея и ако някой иска да си поблъска главата с мен, ще се радвам на помощ.
Кода на играта: https://pastebin.com/Wqskt6Hd
Играта представлява поглед отгоре на карта, която е затъмнена. Играчът (символа 'о') има фенер, с който осветява определено пространство пред него. Като идеята е ако има обекти/стени/друго да се създава "сянка" зад тях:
/*
. . . . . . . . . .
. . . . . . . . . .
. . | . . . .
. . . |____ . .
. . . . . . .
. . . . . . . . .
. . . . . o . . . .
. . . . . . . . . .
*/
Играта има два пласта: картата на един двоен вектор от char и "тъмнината" на друг. Вижда се само тъмнината (точките), като осветената част презаписва върху нея, това което всъщност е на картата.
Пробвах различни неща и най-работещето, до което достигнах, e да взема крайните точки на осветената част (getEndPosOfVecsOfLigth()), слагайки ги във вектори с начало позицията на играча (revealMap()). От там да минавам по всеки един от тях, по координаатите на всеки един техен елемент и ако срещне обект да прекъсва презапиването от картата върху тъмнината.
Съответно не работи перфектно. Или поне не толкова реалистично колкото ми се иска. Бъгва се или гърми и на определени места в края на картата.
Та проблемите, които искам да реша са:
1. Как изчистването на конзолота да работи на различни OS? Четох че става с preprocessor directives, но не мисля, че знам как и дали работят наистина:
void clrscr(){
#if defined(_WIN32) // windows
system("cls");
#else
system("clear"); // other
#endif
2. Изрязването на векторите по рамката на картата (-1) да не гърми или бъгва. Това се случва когато играча е долу или горе и гледа настрани. Би следвало вектора да се прекъсва само ако координатите му са извън размерите на картата. Кода за това е в revealMap():
while (x != endX || y != endY) {
x = moveOverVec(endX, x);
y = moveOverVec(endY, y);
// trim light on the edge of the map
if (x > 15 || x < 0) { // to change 15 with mapSize -1
x = endX - 1;
break;
}
if (y > 15 || y < 0) { // to change 15 with mapSize -1
y = endY - 1;
break;
}
//
...
3. Векторите на светлината да са по-реалистични при създаването на сянка зад обекти. Друг метод за създаването на светлината?
Благодаря на всеки, който е стигнал да чете до тук. Ще се радвам на мнения и помощ, ако не следете тук какво друго ще измисля тези дни. :)
Поздрави,
Илиян Павлов
Привет,
голям ъпдейт към играта :)
Мисля, че се справих да я кача и в github (силно се надявам да е станало):
https://github.com/Smeshan/Dark-room
Открих цветовете в конзолата и ми хрумна как мога да ги приложа за придам дълбочина и дистанция на светлината.
Things to do:
1. Сянка от другите обекти. Имам уж идея как ще стане.
2. Истински cirle на светлината, защото сега не е така. И ако се увеличи LIGTH_POW става ромб.
3. Ще ми се да направя и статични светлини (факли), но предполагам тогава светлината ще трябва да я изведа в отделен class.
Ще се радвам за обратна връзка за OPP начинанията ми (защото за сега е много проба/грешка) и като цяло за всичко свързано с играта.
Поздрави,
Илиян