Професионална програма
Loading...
+ Нов въпрос
Smeshan avatar Smeshan 37 Точки

Darkroom - console game - Problems

Здравейте,

занимавам се с една идея и ако някой иска да си поблъска главата с мен, ще се радвам на помощ.

Кода на играта: https://pastebin.com/Wqskt6Hd

Играта представлява поглед отгоре на карта, която е затъмнена. Играчът (символа 'о') има фенер, с който осветява определено пространство пред него. Като идеята е ако има обекти/стени/друго да се създава "сянка" зад тях:

/*
. . . . . . . . . .
. . . . . . . . . .
. .       | . . . .
. . .     |____ . .
. . . .       . . .
. . . . .   . . . .
. . . . . o . . . .
. . . . . . . . . .
*/

Играта има два пласта: картата на един двоен вектор от char и "тъмнината" на друг. Вижда се само тъмнината (точките), като осветената част презаписва върху нея, това което всъщност е на картата.

Пробвах различни неща и най-работещето, до което достигнах, e да взема крайните точки на осветената част (getEndPosOfVecsOfLigth()), слагайки ги във вектори с начало позицията на играча (revealMap()). От там да минавам по всеки един от тях, по координаатите на всеки един техен елемент и ако срещне обект да прекъсва презапиването от картата върху тъмнината.

Darkroom - console game - Problems Darkroom - console game - Problems Darkroom - console game - Problems

Съответно не работи перфектно. Или поне не толкова реалистично колкото ми се иска. Бъгва се или гърми и на определени места в края на картата.

Та проблемите, които искам да реша са:
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. Векторите на светлината да са по-реалистични при създаването на сянка зад обекти. Друг метод за създаването на светлината?

Благодаря на всеки, който е стигнал да чете до тук. Ще се радвам на мнения и помощ, ако не следете тук какво друго ще измисля тези дни. :)

Поздрави,
Илиян Павлов

Тагове:
2
C++ Fundamentals
j.petrov_90 avatar j.petrov_90 248 Точки

Привет, Илиян,

Супер се е получило.
1. Как изчистването на конзолота да работи на различни OS? Четох че става с preprocessor directives, но не мисля, че знам как и дали работят наистина: - Правилно, това се случва с препроцесорни директиви. За тях ще учим в следващите курсове.
Това, което си направил с тях изглежда правилно. Викаш функция clearScreen(), която в себе си гледа кой е ОС-а и вика съответната функция.

2. Изрязването на векторите по рамката на картата (-1) да не гърми или бъгва. - Правилно, гърми заради това, защото играча е извън картата. Това е нещо, което лесно може да оправиш с подобен (псевсо) код:
const int playerMoveX = generatePlayerMoveX();

const int playerMoveY = generatePlayerMoveY();
if (isInMapBoundaries(playerMoveX, playerMoveY)) {
 //process the move
} else {
  //probably don't do anything.
}


3. Векторите на светлината да са по-реалистични при създаването на сянка зад обекти. Друг метод за създаването на светлината? - Тук вече излизаш от света на С++ и влизаш в света на линейната алгебра и аналитична геометрия.
Това е много advanced материя (дори и за мен).
Давам ти едно клипче как се постига нещо подобно с OpenGL (graphics library).
https://www.youtube.com/watch?v=waLU-LwLUMs


Със сигурност няма да разбереш 90% от нещата, но поне мога да те надъхам за остатъка от курса :)

Поздрави,
Живко

1