Loading...

Във форума е въведено ограничение, което позволява на потребителите единствено да разглеждат публикуваните въпроси.

Smeshan avatar Smeshan 89 Точки

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

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

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

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

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

Супер се е получило.
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
Smeshan avatar Smeshan 89 Точки

Привет,

голям ъпдейт към играта :)

Мисля, че се справих да я кача и в github (силно се надявам да е станало):
https://github.com/Smeshan/Dark-room

Открих цветовете в конзолата и ми хрумна как мога да ги приложа за придам дълбочина и дистанция на светлината.

Things to do:
1. Сянка от другите обекти. Имам уж идея как ще стане.
2. Истински cirle на светлината, защото сега не е така. И ако се увеличи LIGTH_POW става ромб.
3. Ще ми се да направя и статични светлини (факли), но предполагам тогава светлината ще трябва да я изведа в отделен class.

Ще се радвам за обратна връзка за OPP начинанията ми (защото за сега е много проба/грешка) и като цяло за всичко свързано с играта.

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

1
Можем ли да използваме бисквитки?
Ние използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Можете да се съгласите с всички или част от тях.
Назад
Функционални
Използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Използваме „сесийни“ бисквитки, за да Ви идентифицираме временно. Те се пазят само по време на активната употреба на услугите ни. След излизане от приложението, затваряне на браузъра или мобилното устройство, данните се трият. Използваме бисквитки, за да предоставим опцията „Запомни Ме“, която Ви позволява да използвате нашите услуги без да предоставяте потребителско име и парола. Допълнително е възможно да използваме бисквитки за да съхраняваме различни малки настройки, като избор на езика, позиции на менюта и персонализирано съдържание. Използваме бисквитки и за измерване на маркетинговите ни усилия.
Рекламни
Използваме бисквитки, за да измерваме маркетинг ефективността ни, броене на посещения, както и за проследяването дали дадено електронно писмо е било отворено.