Loading...
Smeshan avatar Smeshan 89 Точки

Elevator rush [Custom game]

Здравейте,

предаставям ви играта, върху която работя. Кръстил съм я Elevator rush. Крайният вариант трябва да представлява нещо подобно на: Mini metro и Mini motorways само че с асансьори :)
Вчера след като чух изискванията се зарадвах, защото някои от нещата вече ги бях направил, така че се боря за най-високия резултат в краткото оставащо време, за което и пиша тук, тъй като имам доста въпроси и проблеми за решаване.

Линк с код-а: https://github.com/Smeshan/Elevator-rush (мисля, че се справих)

Идеята на играта:
Всяко ниво има сграда, на която в random момент се появяват хората (сини кръгчета за сега), които искат да се качат или слязат от някой етаж. Има шахти за асансьори, при които ще се поставят с мишката асансьори, които ще се движат автоматично (според зависи дали хората отиват някъде или офисите имат нужда от хора, още не съм решил кой ще управлява).
Ще има таймер горе, който отмерва едно денонощие (30-60 сек) и на следващия ден се появява на екрана избор за играча, измежду нов асансьор, нова шахта, по-голям аснасьор, стъпала дори, и всякакви такива, които той събира и разполага по картата. Ще избира само едно от две. И тези различни асансьори ще се разполагат по картата или ще се пазят, изобразени някъде по екрана.
В същото време с всеки ден се забързва появяването на хората и офисите, до момента в който губиш играта, ако някой човек(или офис) е чакал прекалено много време и не е бил взет от асансьор. Всеки човек е една точка и се бориш за high score.

Какво съм направил до сега:
Има главно меню с динамичен бекраунд и гейм меню, което зарежда ниво. Там съм разположил офиси (квадратите с числа 1-2..) и един асаньор и един човек (кръгчето). Както и tile map на асаньора, която ще ползвам за поставяне на асаньори според стратегията на играча. Хората имат число над себе си и това етажа на който искат да отидат (ще отпадне по нататък). Офисите пък също има индикатор, който показва колко хора са нужни да се закарат там. За проба съм нагласил бутони + и -, както и 1 и 2.

Проблемите:
1. Кода поддържа звуци и музика, НО има някакво забавяне в изпълнението. Първо ако мините с мишка през главното меню хвърля грешка от Mix_GetError() -> Mix_PlayChannel() failed. Error: Surface doesn't have a colorkey. Която е супер странна и не разбирам как да я оправя. Рових в нета - нищо свързано с миксера от тази грешка. Но може би от там идва това забавяне след като се сложи мишката върху бутон от менюто и не произлиза веднага звук.
2. В MenuButton.cpp функцията, която оцветява текста, по някакви причини не работи с WHITE и GREY, отново никаква идея защо е това странно поведение.
3. В text.cpp в void Text::destroy() , която се обсъждаше добавянето unLoadText при мен се чупи в момента, в който го добавя.

Архитектурни питанки:
1. След като стартираш играта от менюто, обектите и анимацията от main menu си остават на заден план, но просто не се рисуват нали? Какво трябва да ги направя, да ги деинициализирам в която фунцкия всеки обект ще се дестройва? Или?
2. Създал съм LevelPos, който за по-лесно преизчислява кординатите по етажи и шахти(колони), но ми се струва, че не съм го направил много добре. Но то и самия grid map е различен за чакащите хора, асансьорите и офисите, като се предполага, че като добавяш нови шахти, офисите и хората ще мърдат сътоветно настрани.
3. В даден момент, когато съм готов ще трябва да направя PersonGenerator и OfficeGenerator, които да генерира съотвените обекти на нивото. Само че просто random не би било яко. Как да го персонализирам, така че да може едно ниво да бъде горе-долу еднакво или като цяло да мога да го контролирам. Скоростта на създаване е ясна на теория, но примерно в началото на деня да пуска повече хора долу (отиващи хора да работят в офис), на обяд друго, вечерта трето. Просто този генератор как да го контролирам и все пак да е рандом, за да не е напълно еднакво нивото.
4. Придвижването на хора. Вижте в Elevator.cpp съм докарал process() фунцкията, която да гледа ако аснасьора е спрял и ако не е пълен, да вземе хора от етажа. Само че хората са в Level обекта. Бях написал прокси, което взема и прехвърля човек. Това ли е начина? Или да сложа още един флаг в Level, който в процесс да пита isThereElevator и ако има, да маха от себе си хора и да казва на асансьора да ги пълни? Поне това ми хрумна вчера. И същото с офисите, ако има асансьор и ако има пътници да слизат, да намали request-ите на офиса и да махне хора от асансьора. :?

Todo:
1. Да добавя повече цветове или форми на Person и Office обектите, за да махна текста, показващ къде искат да отидат.
2. Да добавя поне още 4-5 нива до края на срока.
3. Да направя заключени нива и само определен score отключва следващото.
4. Background и background анимация за всяко ниво (имам идея какви)
5. Още звуци
6. И други.. (приемам идеи)

Ще се радвам за мнение. Да ме поправите ако съм написал нещо тъпо. И за всякакъв вид друга помощ. За пръв път пиша нещо такова, така че доста се вълнувам и отдлено се уча в движение (ако забележите странни неща в кода).

Мисля да редактирам, този въпрос директно при следващите промени/въпроси, за да може първото, което излиза да е това и да се вижда какво направено и какво не. Така че може да няма нови постове отдолу, но ще редактирам този текст тук. Като запазвам старите неща, за да са свързани коментарите.

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

П.С. Повечето неща си ги рисувам аз :D

Тагове:
1
C++ Applications Development 14/11/2021 00:38:22
j.petrov_90 avatar j.petrov_90 373 Точки

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

 

Щастлив съм, че се вълнуваш от проекта. Браво!

Смело мога да заявя, че "my work here is done".

Не напразно съм написал в изискванията - от тук нататък sky's the limit.

 

Отговор на многото ти въпроси ще изисква време.

Трябва да черпиш поне 2 бири човекът, който ще ти отговори.... Шегувам се :)

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

 

Бърз отговор относно архитектурните ти въпроси:

Остави компютъра за момент.

Вземи химикал и лист хартия и начертай 2-3 примерни апхитектури на твоя код.

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

Ако се получат много стрелки в различни посоки (ефекта на спагети код) това не е добре.

Повтори упражнението няколко пъти.

Когато постигнеш резултат, с който си доволен - тогава се върни към кода си и го имплементирай.

 

Поздрави

1
j.petrov_90 avatar j.petrov_90 373 Точки

Привет, 

Относно проблемите:
1. Кода поддържа звуци и музика, НО има някакво забавяне в изпълнението. Първо ако мините с мишка през главното меню хвърля грешка от Mix_GetError() -> Mix_PlayChannel() failed. Error: Surface doesn't have a colorkey. Която е супер странна и не разбирам как да я оправя. Рових в нета - нищо свързано с миксера от тази грешка. Но може би от там идва това забавяне след като се сложи мишката върху бутон от менюто и не произлиза веднага звук.
Проблема ти е тук:
https://github.com/Smeshan/Elevator-rush/blob/master/sdl_utils/src/containers/SoundContainer.cpp#L42

Ако трябва да бъда честен имаш 2 проблема.
Прочети документацията на тази функция и ще си отговориш на тях.
Проблем 1:
Първия ти аргумент е грешен. Ако няма сам да поддържаш на кой канал ще се изпълнява звука трябва да подадеш -1.
Ти подаваш 1, което винаги преизползва този канал за всеки нов звук. Това е грешно.
Подай му -1 и да ти е чиста душата.

Проблем 2:
Функцията не връща грешка. Връща на кой канал и пуснат звука.

Не трябва да проверяваш за грешка.
Получава се, че ти му подаваш 1 и то ти връща 1. Ти го проверяваш срещу EXIT_SUCCESS, което е 0...


2. В MenuButton.cpp функцията, която оцветява текста, по някакви причини не работи с WHITE и GREY, отново никаква идея защо е това странно поведение.
Първа май съм объркал кодовете на цветовете като съм ви ги давал.
На бялото кодовете са 0,0,0, а на черното 255,255,255.
След това проследих проблема до този ред:
https://github.com/Smeshan/Elevator-rush/blob/master/sdl_utils/src/Texture.cpp#L60
Ако го премахна и го заменя с това, работи.

    SDL_Color sdlColor;
    sdlColor.r = 255;
    sdlColor.g = 255;
    sdlColor.b = 255;
    sdlColor.a = 255;
	SDL_Surface* textSurface = TTF_RenderText_Blended(font, text, *sdlColor);

Да си призная на прима-виста не виждам къде е проблема.

3. В text.cpp в void Text::destroy() , която се обсъждаше добавянето unLoadText при мен се чупи в момента, в който го добавя.
Функцията изглежда си работи нормално. Имаш бъг някъде другаде.
Виждам, че под дадените текстове седи nullptr за textureId.
Това ме навежда на мисълта, че си унищожил някой текст, обаче продължаваш да го рисуваш.

Поздрави


 

1
Smeshan avatar Smeshan 89 Точки

Много благодаря Живко! Наистина оценявам времето, което отделяш, за да ми отговориш на въпросите.

Това с белия лист помогна и даже написах решение на прехвърлянето на пътниците, ще го покажа тези дни. Поне аз съм доста горд с него.

Проблем 1: го оправих. Много благодаря. Обещавам да чета какво връщат функциите в документацията!
Проблем 2: Намерих проблема с цвета. Оказа се че в оператора за сравнение на Color класа съм написал = вместо == .. И от там бялото и сивото не работят (и всеки друг цвят който има стойност различно от 0 и за трите r g b). Сега работи! 
Проблем 3: ще търся още, не мога да го проследя от къде идва.. :(
 

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

1
Smeshan avatar Smeshan 89 Точки

Здравейте колеги, може ли някой да ми помогне и да изпробва дали проекта се компелира?

Elevator_rush.zip (30.59MB)

Ако има някакъв проблем, цялата логика с директнории е в CommonPaths.h.

Също ако мина лимита от 32 мб, което сигурно ще стане, как да процедирам? 

Благодаря предварително и поздрави!

0
MartinBG avatar MartinBG 4803 Точки

Изтрий от архива следните папки:

.git 25.5MB!!!

build/.git

Debug

.vscode

.settings

Както и този файл (намира се на основното ниво):

main 3.1MB

 

След като ги премахнах ZIP-a се редуцира до 6.0MB

 

Отделно, стандартната ZIP компресия е по-слаба от повечето алтернативни формати (силно препоръчвам 7z), но в случая това има малко значение, защото основната "тежест" идва от menu_music.mp3 (5.8MB), който е вътрешно компресиран.

1
26/11/2021 22:33:51
Smeshan avatar Smeshan 89 Точки

Благодаря Мартине!
И аз се зачудих защо е толкова голям зип-а, но така е като не цъкам през терминала и не виждам скритите файлове :Х

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

Elevator_rush.7z(5.62MB)

:)
А може ли да помоля, да пробваш дали компелира при теб? Ще съм много благодарен!

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

0
JohnDoe256 avatar JohnDoe256 5 Точки

При мен се компилира.

1
Smeshan avatar Smeshan 89 Точки

Здравейте, играта ми от време на време крашва, без да казва от какво? Пуснах gdb, но не казва при коя фунцкия се е случил segmentation fault-a. :?

Дали сте виждалите нещо подобно:

Thread 1 "elevator_rush" received signal SIGSEGV, Segmentation fault.
0x00007ffff658d545 in ?? ()
(gdb) bt
#0  0x00007ffff658d545 in ?? ()
#1  0x3f8000003f800000 in ?? ()
#2  0x0000000000000018 in ?? ()
#3  0x00007fffffffaa7c in ?? ()
#4  0x0000000000000002 in ?? ()
#5  0x00007fffffffaa40 in ?? ()
#6  0x0000000000000002 in ?? ()
#7  0x00007fffffffaa40 in ?? ()
#8  0x00007fffffffa9c0 in ?? ()
#9  0x0000555555954390 in ?? ()
#10 0x00007fffea0ca5c7 in ?? ()
#11 0x0000555500000001 in ?? ()
---Type <return> to continue, or q <return> to quit---

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

1
JohnDoe256 avatar JohnDoe256 5 Точки

Щом е segmentation fault най-вероятно имаш pointer,който сочи към uninitialized memory и като играта го access-не става memory leak/undefined behavior.За да го оправиш опитай да изолираш по някакъв начин грешката,един вид да може да я предизвикваш всеки път.Ако успееш това,почваш да коментираш функции да видиш без коя крашва,.Ако крашва без нея значи проблема не е  в нея.

1
j.petrov_90 avatar j.petrov_90 373 Точки

Не виждаш никаква информация, защото нямаш дебъг символи.

Билдни си проекта за дебъг чрез CMake и повтори операцията с gdb.

Това ти е най-добрия ориентир, защото с gdb ще видиш точно кое ти гърми и ще можеш да разгледаш стойността на останалите променливи по време на crash-a.

 

Valgrind също може да ти помогне.

valgrind --leak-check=full --track-origins=yes ./myAppName

1
30/11/2021 08:38:18
Smeshan avatar Smeshan 89 Точки
Thread 1 "elevator_rush" received signal SIGSEGV, Segmentation fault.
malloc_consolidate (av=av@entry=0x7ffff68e4c40 <main_arena>) at malloc.c:4469
4469    malloc.c: No such file or directory.
(gdb) bt
#0  malloc_consolidate (av=av@entry=0x7ffff68e4c40 <main_arena>) at malloc.c:4469
#1  0x00007ffff658d968 in _int_malloc (av=av@entry=0x7ffff68e4c40 <main_arena>, bytes=bytes@entry=3772) at malloc.c:3713
#2  0x00007ffff65903cd in __GI___libc_malloc (bytes=3772) at malloc.c:3075
#3  0x00007ffff7b07a83 in ?? () from /usr/lib/x86_64-linux-gnu/libSDL2-2.0.so.0
#4  0x00007ffff7b3b251 in ?? () from /usr/lib/x86_64-linux-gnu/libSDL2-2.0.so.0
#5  0x00007ffff744e31f in TTF_RenderUTF8_Blended () from /usr/lib/x86_64-linux-gnu/libSDL2_ttf-2.0.so.0
#6  0x00007ffff744e6fa in TTF_RenderText_Blended () from /usr/lib/x86_64-linux-gnu/libSDL2_ttf-2.0.so.0
#7  0x00005555555914f3 in Texture::createTextureFromText (text=0x5555561468d0 "3", color=..., font=0x55555607d200, outTexture=@0x555556137f20: 0x0, outTextWidth=@0x555556146890: 23, 
    outTextHeight=@0x555556146894: 41) at /home/smeshan/workspace/elevator rush/sdl_utils/src/Texture.cpp:66
#8  0x000055555558b582 in TextContainer::reloadText (this=0x555555951348, text=0x5555561468d0 "3", color=..., fontId=2, textId=10, outTextWidth=@0x555556146890: 23, 
    outTextHeight=@0x555556146894: 41) at /home/smeshan/workspace/elevator rush/sdl_utils/src/containers/TextContainer.cpp:72
#9  0x0000555555584f8a in Text::setColor (this=0x555556146878, color=...) at /home/smeshan/workspace/elevator rush/manager_utils/src/drawing/Text.cpp:91
---Type <return> to continue, or q <return> to quit---

Готово, но #5 нагоре нищо не ми говори :?

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