#Dodgersdota
User-
Сообщений
346 -
Зарегистрирован
-
Посещение
-
Время онлайн
33д 11ч 4м 36с
О #Dodgersdota
-
Звание
Dominating
- День рождения 27.08.2005
Profile Information
-
Gender
Male
Посетители профиля
8 378 просмотров профиля
-
#Dodgersdota понравился пост в теме: Программирование[11]
-
#Dodgersdota понравился пост в теме: Программирование[11]
-
Смысла переписывать не вижу, но смысл развить то что на лабал. Тысяча строк кода не дадут практического понимания почему нужно писать так, а не эдак. Если есть идеи для фич и тебе самому интересно еще змеей заниматься, то попили ее имхо. Какиенибудь фрукты там временные, мигающие, дающие ускорение, замедление, телепорты для змейки, авто скриншоты результатов, разноцветную змейку, змейку у которо меняются цвета, текстура. идеи для фич есть, такие же как и у тебя , просто внутри она с обычным SDL2_renderer даже не OpenGL поэтому в голове токо переписать это под OpenGL в 2д чтобы шустрее мб обрабатывалось и уже пилить фичи дальше , но мб я хуету несу и этого не нужно совсем. В башку такая мысль пришла ибо на линуксе что то плохо идёт отрисовка и есть разрывы кадров как будто когда всинк выключен хотя либы юзаю кроссплатформ , но я не сильно шарю. Че думаю короче ы тестировщики записаться. Я поиграл в твою змейку, идея конечно не иновационная но для начала заебись. Давай, жду всяких бонусов. Тип чтобы она ускорялась или управления менялось на противоположное. Че куда номер карты кидать то? Или ты за бесплатно хочешь? ну на это нужно время , щас перепишу чутка с тем что мне подсказали и додам пару фич мб телепорт какой , ускорение , но движение какое то слишком рывками, мб переделать. Та сюда кидай номер карты , если чё скажем что из европы не можно скинуть.
-
так посмотри что у меня и что у тебя. я форвард декларейшн сделал. Ну при желании SDL.h можно оставить остальные оставлять не надо точно. да , проебался , спс , только разве это гуд практика? выглядит круче чем было upd. да прочитал , в связи с тем что когда то хидер уже может не иметь в себе включаемый файл , рекомендуется включать в том файле где это нужно, спасибо
-
class GameObject { public: GameObject(SDL_Window* window); virtual ~GameObject() = default; virtual void Render(SDL_Renderer* renderer) = 0; virtual void Update(double delta_time) = 0; virtual void HandleInput(SDL_Event& event) = 0; virtual void UpdateWindowSize(SDL_Window* window); Vector2<int> GetCoordinates() const; protected: Vector2<int> window_size; Vector2<int> coordinates; }; Background* background; Field* field; Food* food; Snake* snake; Полное непонимание зачем нужен динамический полиморфизм и как его использовать. Нагородил бессмысленную иерархию и ни разу не воспользовался. Тебе нужны виртуальные функции когда ты хранишь указатели на базу условно std::vector<GameObject*> entity_list; и хочешь колить для каждого Render(); for (auto &&ent: entity_list) ____ent->Render(); более того - так и надо делать, более того - так и делают. EntityList где Entity базовый класс и все игровые объекты от него наследуются это стандарт для игровой индустрии. Советую 10 раз подумать перед тем как в голову придёт слово virtual написать Виртуалки не бесплатные за дереференс платить нужно. Ты платишь но не пользуешься. GameObject(SDL_Window* window); protected: Vector2<int> window_size; Какого хуя у тебя ваще GameObject принимает окно ? Почему он ваще должен заботиться и знать о размерах окна ? void Game_Manager::RestartGame() { for (int y = 0; y < SIZE_Y; ++y) { for (int x = 0; x < SIZE_X; ++x) { field[x][y] = 0; } } score = 0; } Почему управляющий(Manager) вообще занимается такой хуйней ? Мэнеджер должен управлять, а не сам всё руками делать. Чем больше игра разрастётся тем больше клинапа ему придётся делать. static Framework* GetInstance() { return (framework != nullptr) ? framework : framework = new Framework; } Вот потому тебе и написал выше не возвращай raw pointer потому что не понятно кто владеет твоим синглом и кто должен освобождать. (Никто и не освободил у тебя Лик. Это самая критичная ошибка в твоём коде). По поводу "avoid raw pointers" выше хуёвый и неполный совет. avoid raw pointers when transfer ownership. Конкретно в случае с синглтоном да - нужно возвращать ссылку потому что для GetInstance() невозможна ситуация что не существует инстанса. У тебя на выбор есть 4 варианта: raw pointer, reference, std::unque_ptr, std::shared_ptr. ссылка передаётся когда пустое значение невозможно. У ссылок не бывает nullptr; std::unque_ptr, std::shared_ptr для передачи владения. Raw pointer когда возможно нулевое значение и нет передачи владения. int rand_x = rand() % Game_Manager::GetInstance()->SIZE_X / 2 + 2; int rand_y = rand() % Game_Manager::GetInstance()->SIZE_Y; snake_body.emplace_back(Vector2<int> {rand_x, rand_y}); snake_body.emplace_back(Vector2<int> {rand_x - 1, rand_y}); snake_body.emplace_back(Vector2<int> {rand_x - 2, rand_y}); Ты точно понимаешь как работает emplace_back ? #pragma once #include "GUI/GUI.h" #include "SDL2/SDL.h" #include "imgui/imgui.h" #include "imgui/imgui_impl_sdl2.h" #include "imgui/imgui_impl_sdlrenderer.h" class UI_Manager { public: UI_Manager(); void PrepareUI(); void RenderUI(); void Close(); void InitFontSize(SDL_Window* window); private: void NewFrame(); }; Инклюды Игуя и сдл в хедерах. Хуёвая практика. Инклюдь в cpp. Ну это самое критичное. Остальное менее отсутвие explicit у single argument конструкторов. забытые override на вирт деструкторах срезки (implicit narrowing conversions) double -> float. В играх вообще не используется дабл. int instead of std::int32_t в смейке 17 стандарт а по сути 03 и пару штук из 11. if (ImGui::Checkbox("NORMAL", &check_normal)) { Game_Manager::GetInstance()->SetDifficulty(DIFFICULTY_NORMAL); } Когда учился в школе и c++ для меня был blackbox я тоже строки экономил думал что так "машинного кода меньше будет" и быстрее программа заработает. Собственно вопрос: вкурсе что процессор с++ не понимает ? Ему похуй в сколько ты строк уложился. А вот программистам с вертикальными мониторами ваще не похуй. 80 символов на строку на плюсах конечно сложно держать это не си, но хотя бы 100. Хуйвый инконсистент нейминг стайл. типо class Game_Manager. используй clang_format SDL_Texture* food_t не самое лучшее имя для текстуры. обычно так теги для темплейтов именуют. По поводу что выше написали avoid singletons. Синглтоны стандарт для игростроя EntitySystem, ParticleManager, ModifierManager и тд. Просто у тебя в целом архитектура стрёмная получилась, всё переплетено. Одни классы делают то что не должны, другие не делают что должны. Везде вручную Клинап вместо RAII. А так если учесть что ты заводыч - неплохо. Типичный выпускник дефолтного вуза с поступлением по егэ на плюсах писать не умеет совсем. Предполагаю что некоторые из них даже на транслите переменные именуют. А ты и с имгуей смог разобраться и смейк. поставь себе утилит удобных (Clion/resharper++) линтеры санитайзеры копайлоты они быстро тебе качество кода подтянут. Советую новое что то написать на змейку пока забить, потом мб вернёшься. И предпочесть количество кода - качеству Спасибо , буду исправляться. 1. Динамический полиморфизм там должно было быть так как ты говоришь стандарт Entities->Render() or Update(); но я походу забыл это сделать в конце когда уже всё +- ок работало;Да и щас подумал если с рендер функцией плюс минус легко будет то в апдейте я мб наделал хуеты с менеджером этим и он делает не то что нужно; 2. И так же само хотел в конце всё перенести на умные указатели но уже какая то хуета выходит ибо в каждом объекте где есть текстура в деструкторе вызов той функции которая привязана к рендереру и так как я проебал архитектуру то и подумал что не уверен до конца в каком порядке вызовутся деструкторы и будет залупа если рендерер удалится а он удалится ибо первый ибо он в Close() удаляется спешиал функцией (следовательно его тоже нужно было бы сделать отдельным классом) я потому к нему вызываю функцию в деконструкторе объекта. И решил что уж лучше некст пет проджект писать изначало в лучшем стиле. extern DECLSPEC void SDLCALL SDL_DestroyTexture(SDL_Texture * texture); * Destroy the rendering context for a window and free associated textures. * If `renderer` is NULL, this function will return immediately after setting * the SDL error message to "Invalid renderer". See SDL_GetError(). 3. GameObject принимает окно потому что я в не знал как сделать доступ к окну которое нужно чтобы каждый спрайт менял размер когда меняется размер окна (щас то я бы уже сделал какой то класс Синглтон для данного окна или окон и обращался бы так мб к нему по индексу , не уверен что верно ибо я ещё к паттернам проектирования не дошел). 4. По поводу занимания GameManager такой хуетой , подумал что всё просто в архитектуре есть он который отвечает за состояние игры и всего что внутри(счёт , сетка , проверка ячеек) больше хз что нужно змейке . Буду рад услышать как должно быть+-. 5. На счёт возрврата по ссылке понял. 6. До emplace_back там был push_back что я очевидно и забыл изменить то что передаю , щас поменял уже код под emplace. 7. На счёт инклюдов не понял ибо как я буду инклюдить в cpp то чё напишу в хидерах они ж не дадут скомпилится .Наверное не понял совет. 8. explicit буду юзать , спасибо. 9. с double и delta_time ваще рофл случился ее тип float он когда получаю её в апдейте почему то решил ебануть double и в апдейт пошли уже даблы . Изменил , спасибо. 10. clang_format юзаю , потратил пару дней чтобы проверить всё что он дает менять и написал для себя но всё равно не так удобно как в visual studio стандартный их же. 11. нейминг стайл буду исправлять и смотреть где чо и в каком стиле пишу . 12. RAII буду стараться впихивать в каждый конструктор. 13. Пытаюсь пока в VS code писать ибо после IDE это всё в ручную собирать совершенно другое дело. Спасибо за советы
-
v1le понравился пост в теме: Программирование[11]
-
Смысла переписывать не вижу, но смысл развить то что на лабал. Тысяча строк кода не дадут практического понимания почему нужно писать так, а не эдак. Если есть идеи для фич и тебе самому интересно еще змеей заниматься, то попили ее имхо. Какиенибудь фрукты там временные, мигающие, дающие ускорение, замедление, телепорты для змейки, авто скриншоты результатов, разноцветную змейку, змейку у которо меняются цвета, текстура. идеи для фич есть, такие же как и у тебя , просто внутри она с обычным SDL2_renderer даже не OpenGL поэтому в голове токо переписать это под OpenGL в 2д чтобы шустрее мб обрабатывалось и уже пилить фичи дальше , но мб я хуету несу и этого не нужно совсем. В башку такая мысль пришла ибо на линуксе что то плохо идёт отрисовка и есть разрывы кадров как будто когда всинк выключен хотя либы юзаю кроссплатформ , но я не сильно шарю.
-
Думал будет гифка в репе с игрой с геймплеем,а нету - печаль Будет , делается как раз, снял видео а девушка нарезает , к вечеру мб или к утру будет. Думал будет гифка в репе с игрой с геймплеем,а нету - печаль как то так будет , не знаю нужна ли длиннее gameplay.mp4 /monthly_2023_02/gameplay.mp4.a51add034a8007e95fe04e8353ab2a02.mp4
-
Ты должен делать хорошо для себя "дебила", а не для других. Показать содержимое include_directories(${PROJECT_NAME} ${SDL2_INCLUDE_DIRS} ${PROJECT_SOURCE_DIR}/include ${PROJECT_SOURCE_DIR}/src ) https://cmake.org/cmake/help/latest/command/target_include_directories.html if (CMAKE_COMPILER_IS_GNUCXX) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++17 -static-libgcc -static-libstdc++") endif() https://cmake.org/cmake/help/latest/command/target_compile_features.html https://cmake.org/cmake/help/latest/command/target_compile_options.html static SimpleTimer* GetInstance() ; SimpleTimer* SimpleTimer::GetInstance() { return (timer != nullptr) ? timer : timer = new SimpleTimer; } Возвращай референс, а не поинтер в таких случаях. По референсу сразу ясно кто владеет объектом, по поинтеру нихуя не ясно. Зачем этот класс синглтоном неясно. Сигнлтон должен использоваться когда класс представляет собой какойто уникальный ресурс который ну кровь из жопы нужно абстрагировать для его использования в разных местах никак не связывая эти собственно части. Например генерация UUID1 строк через демон линукса, который нужно закрыть мьютексами и всякое такое. Эта генерация будет использоваться по всему коду, и который ну никак не связать друг с другом красиво что бы оно владело одним объектом генератора, потому использование синглтона оправдано. Зачем указателем создается не ясно тоже. Зачем хранить мембером инстанс неясно в том числе. Ты мог просто сделать так: SimpleTimer& SimpleTimer::GetInstance() { static auto singletone = SimpleTimer(); return singletone; } Указывай единицы измерений, не используй просто float. Конкретнее: class SimpleTimer { float GetDeltaTime() const; void Tick(); private: float delta_time = 0; float last_time = 0; }; float SimpleTimer::GetDeltaTime() const { return delta_time; } void SimpleTimer::Tick() { delta_time = (SDL_GetTicks() - last_time) / 1000.f; last_time = SDL_GetTicks(); } Вот и хуй просышь сходу что у тебя такое delta_time. Гугл говорит что SDL_GetTicks возвращает милисекунды, ну и оберни это в них: class SimpleTimer { std::chrono::seconds GetDeltaTime() const; void Tick(); private: std::chrono::seconds delta_time = std::chrono::seconds(0); std::chrono::milliseconds last_time = std::chrono::milliseconds(0); }; std::chrono::seconds SimpleTimer::GetDeltaTime() const { return delta_time; } void SimpleTimer::Tick() { auto now = std::chrono::milliseconds(SDL_GetTicks()); delta_time = std::chrono::duration_cast<decltype(delta_time)>(now - last_time); last_time = now; } Не используй указатели вообще без крайней необходимости. Так же ты должен вообще забыть как вызывать New/Delete. Например: class Framework { public: void Close(); void LoadMedia(); private: Background* background; Field* field; Food* food; Snake* snake; }; void Framework::Close() { delete field; field = nullptr; delete food; food = nullptr; delete snake; snake = nullptr; delete background; background = nullptr; delete game_manager; game_manager = nullptr; // Close UI ui_manager->Close(); ui_manager = nullptr; // Destroy window SDL_DestroyRenderer(renderer); SDL_DestroyWindow(window); window = nullptr; renderer = nullptr; // Quit SDL subsystems TTF_Quit(); IMG_Quit(); SDL_Quit(); } void Framework::LoadMedia() { game_manager = Game_Manager::GetInstance(); game_manager->RefreshSquareSize(window); background = new Background(window); field = new Field(window); snake = new Snake(window); food = new Food(window); } Здесь ты сам в себе легко насрешь в штаны если забудешь Close позвать или два раза вызовешь Load. Используй: https://en.cppreference.com/w/cpp/memory/unique_ptr Но в данном случае как я понял можно было вообще в конструкторе проинициализировать один раз и все, без всяких клоз и прочего. И вообще без необходимости избегай "опциональных" Init, Close, и прочей параши. Твой FrameWork одна из причин почему сиглтоны не стоит использовать бездумно. Он должен принимать в конструкторе параметры для Init и проводить эту инициализацию в нем. class Framework { bool is_running = false; int SCREEN_WIDTH; int SCREEN_HEIGHT; }; Соблюдай свой же нейминг. Я вообще считаю что тех кто заставляет язык учить на граф либах стоит убить. Большинство из них это Си с классами блять, а не плюсы. Благодарю , буду исправлять по тихоньку , есть ли смысл переписывать щас код или лучше делать с учётом ошибок с некст проекта уже? За смаке отдельное спасибо ибо мне чёт ваще не заходят их доки. Начал делать с граф либ ибо подумал пока так легче далее думал некст делать уже что то типа приложухи для фитнесса на QT+База данных либо пытаться в сервер/клиент какой то морской бой для начала но мб уже с SFML библиотекой она вроде более как на с++ написана чем на С с классами. Учу всё сам , объём информации большой как для после завода, но очень нравится этим заниматься. Спасибо еще раз за разьеб
-
прикольно, но бывает что я жму 2 кнопки сразу (врядли конечно) скорее с очень маленьким делеем, практически одновременно, и в таком случае змейка вообще не реагирует, бежит как бежала. Так должно быть? не должно, но я сейчас играю и не могу воспроизвести баг или фичу , всегда вроде норм поворачивает по крайней мере как мне кажется , как было задумано работает вроде +-. Но мб я уже привык к этому движению
-
ну тут я чисто для себя делал надеясь что никто не увидит , возьму к сведению , спасибо
-
Привет всем , сделал первый раз что то сам на плюсах, пока учусь , симпл игра змейка на С++ и SDL , первый раз ебался с CMake и гитом , мб кто то что то подскажет по коду на сколько убого выглядит то что написал или где можно было бы сделать лучше. Хотелось бы на стажировку попасть , или хотя бы что бы поразговаривали и дали понять на сколько убог в плюсах. https://github.com/cah9xddd/snake2d_game
-
#Dodgersdota понравился пост в теме: [Работа и образование] т. 2. Перекатываемся в IT.
-
#Dodgersdota понравился пост в теме: Обсуждение и выбор комплектующих, новости из мира железа т.5
-
#Dodgersdota понравился пост в теме: Веселые веселинки
-
#Dodgersdota понравился пост в теме: Самая красивая актриса т.14
-
#Dodgersdota понравился пост в теме: Поиск своего места в жизни [Работа и образование]
-
LFP нужен убийца на центр (Квалы мажор онли)
#Dodgersdota ответил в теме пользователя Deus. в Вакансии
-
LFP нужен убийца на центр (Квалы мажор онли)
#Dodgersdota ответил в теме пользователя Deus. в Вакансии
ну если хочешь го , но я не играл 2 месяца когда чел с армейки вернётся -
#Dodgersdota понравился пост в теме: Веселые пикчеринки здесь?
-
#Dodgersdota понравился пост в теме: Настоящий детектив / True Detective
-
плиз подскажите торрент трекер где можно качать новые серии в оригинале и хотя бы hd качестве.
-
#Dodgersdota понравился пост в теме: Веселые пикчеринки
-
сын фрозена вернулся !! го бух по вебке
-
Maxuwa понравился пост в теме: Видосы от умника [NEW] Ruhub
-