Здравствуйте, гость ( Авторизация | Регистрация )
![]() ![]() |
28.08.2016, 23:32
Сообщение
#1
|
|
![]() Почти Игроман Репутация: 187
Группа: Участник Сообщений: 647 Награды: 4 Регистрация: 05.05.2007 |
суровый код quake на чистом си Чистый C - это круто. Однажды я скомпилировал ваш движок на C борландовским компилятором, и он запускался под Windows NT 3.51. Меня это очень впечатлило. Только в этом движке мне не понравились сложные форматы файлов, требование высокой версии OpenGL и ini-конфиги, они конечно подходят для хранения простых настроек, но если в них хранить что-то более сложное всё превращается в нечитабельную кашу. Поэтому я решил сделать свой такой же, только с простыми форматами файлов, OpenGL 1.1, и конфигами с синтаксисом похожим на LUA. Т.к. использовать луа только для конфигов расточительно, я написал свой парсер похожего формата. В итоге форматом текстур стал TGA, форматом моделей OGF(не то чтобы не очень нравился этот формат, но он вполне простой) а ресурсы хранились в обычном zip-архиве. Минимально необходимая версия OpenGL - 1.0. Так что можно портировать даже под самые древние платформы. Это всё запускалось под Windows, OS/2 и Linux(только через GLUT), и собиралось разными компиляторами. (BCC, MSVC 5.0, Watcom, GCC) C С++ такое бы не прокатило. Он плохо портируем между разными компиляторами. Например новые компиляторы поймут такой код: Код for(int i = 0; i < 10; i++) puts("for 1"); for(int i = 0; i < 10; i++) puts("for 2"); for(int i = 0; i < 10; i++) puts("for 3"); Старые будут ругаться на повторное объяление i. Там надо делать так: Код for(int i = 0; i < 10; i++) puts("for 1"); for(i = 0; i < 10; i++) puts("for 2"); for(i = 0; i < 10; i++) puts("for 3"); Такой вариант устроит всех: Код int i; for(i = 0; i < 10; i++) puts("for 1"); for(i = 0; i < 10; i++) puts("for 2"); for(i = 0; i < 10; i++) puts("for 3"); Только вот это уже код на С, а не на C++. Сообщение отредактировал refuse - 29.08.2016, 00:15 |
|
 
|
|
|
|
|
28.08.2016, 23:51
Сообщение
#2
|
|
![]() Геймер Репутация: 86
Группа: Участник Сообщений: 128 Награды: 4 Регистрация: 05.05.2012 |
Чистый C - это круто. Сам Кармак признал, что С++ круче! Цитата In some ways, I still think the Quake 3 code is cleaner, as a final evolution of my C style, rather than the first iteration of my C++ style, but it may be more of a factor of the smaller total line count, or the fact that I haven’t really looked at it in a decade. I do think "good C++" is better than "good C" from a readability standpoint, all other things being equal. Сообщение отредактировал refuse - 29.08.2016, 00:15 -------------------- nop
|
|
 
|
|
29.08.2016, 02:10
Сообщение
#3
|
|
![]() Доктор Игровых Наук Репутация: 1084
Группа: Участник Сообщений: 3950 Награды: 6 Регистрация: 24.08.2010 |
Че пацаны, программисты?
-------------------- |
|
 
|
|
29.08.2016, 02:29
Сообщение
#4
|
|
![]() Игровой Бог Репутация: 648
Группа: Участник Сообщений: 5354 Награды: 9 Регистрация: 24.09.2010 |
Тема кстати с таким же названием уже была.
-------------------- |
|
 
|
|
29.08.2016, 03:01
Сообщение
#5
|
|
![]() Gameru DA Репутация: 3704
Группа: Администратор Сообщений: 10206 Награды: 4 Регистрация: 03.02.2006 |
-------------------- |
|
 
|
|
29.08.2016, 07:55
Сообщение
#6
|
|
![]() TECHNOSLAV 80 уровня Репутация: 379
Группа: Участник Сообщений: 5758 Награды: 6 Регистрация: 26.01.2014 |
Хочу запилить 2D движок с API OpenGL. Думал пилить на C# ибо знаком с ним, нашёл всё необходимое для привинчивания OpenGL (есть несколько альтернатив), но OpenGL работает нативно только с C++. Насколько сложнее работать с C++, чем C#?
Объекты будут такие: ГГ, 2D платформы с текстурами и вершинами для просчёта коллизий, всякие там партикловые projectlies. Окружающую среду хочу стримить вторым потоком по мере продвижения, из раздельных секторов карты. Нужен файлоый I/O и внутренний редактор уровней с GUI. Где это проще реализовать? Сообщение отредактировал Cossack-HD - 29.08.2016, 07:55 -------------------- Ryzen 3700X
Arctic Freezer 33 eSports Duo 16GB DDR4 3600MHz Strix GTX 1080 TI |
|
 
|
|
29.08.2016, 08:38
Сообщение
#7
|
|
![]() Геймер Репутация: 86
Группа: Участник Сообщений: 128 Награды: 4 Регистрация: 05.05.2012 |
Cossack-HD, можно написать низкоуровневые ф-ии отрисовки графики на Си, а всё остальное, включая загрузку ресурсов, обработку пользовательского ввода, логику взаимодействия с игровыми объектами и т.д. реализовать на C#. Для этого используют , это такой механизм, который позволяет вызывать неуправляемый код из управляемого. У этого подхода есть и минусы - нельзя передавать данные из управляемого кода в неуправляемый привычным способом, для этого придется использовать , что потребует дополнительных усилий, но учитывая, что для 2D графики много ф-ий рендерера не понадобится, то связанными с маршалингом хлопотами можно пренебречь.
Сообщение отредактировал refuse - 29.08.2016, 08:39 -------------------- nop
|
|
 
|
|
29.08.2016, 11:11
Сообщение
#8
|
|
![]() TECHNOSLAV 80 уровня Репутация: 379
Группа: Участник Сообщений: 5758 Награды: 6 Регистрация: 26.01.2014 |
Cossack-HD, можно написать низкоуровневые ф-ии отрисовки графики на Си, а всё остальное, включая загрузку ресурсов, обработку пользовательского ввода, логику взаимодействия с игровыми объектами и т.д. реализовать на C#. Для этого используют , это такой механизм, который позволяет вызывать неуправляемый код из управляемого. У этого подхода есть и минусы - нельзя передавать данные из управляемого кода в неуправляемый привычным способом, для этого придется использовать , что потребует дополнительных усилий, но учитывая, что для 2D графики много ф-ий рендерера не понадобится, то связанными с маршалингом хлопотами можно пренебречь. Я особо мощного графония не планирую. Я так понимаю, низкоуровневые функции помогают при обработке большого количества объектов в кадре? Это поэтому Кармак писал части движка на ассемблере? Не планирую использовать много объектов, но буду иметь ввиду. Я могу тупо загрузить "один жыпег" как основу куска уровня и закрепить его с collision map, многослойность картинки можно обеспечить n-количеством "жыпегов" с различной близостью к viewport. Движок всё таки должен работать как 3D. Сообщение отредактировал Cossack-HD - 29.08.2016, 11:11 -------------------- Ryzen 3700X
Arctic Freezer 33 eSports Duo 16GB DDR4 3600MHz Strix GTX 1080 TI |
|
 
|
|
29.08.2016, 11:30
Сообщение
#9
|
|
|
The One Репутация: 744
Группа: Участник Сообщений: 2715 Награды: 5 Регистрация: 05.12.2005 |
Cossack-HD, а почему хочешь пилить сам, спортивный интерес?
Ну и позанудствую, что значит? но OpenGL работает нативно только с C++ Это я к тому, что бери готовый движок или бери готовый байндинг к своему языку и не ищи себе приключений -------------------- |
|
 
|
|
29.08.2016, 11:43
Сообщение
#10
|
|
![]() TECHNOSLAV 80 уровня Репутация: 379
Группа: Участник Сообщений: 5758 Награды: 6 Регистрация: 26.01.2014 |
Cossack-HD, а почему хочешь пилить сам, спортивный интерес? Ну и позанудствую, что значит? но OpenGL работает нативно только с C++ Это я к тому, что бери готовый движок или бери готовый байндинг к своему языку и не ищи себе приключений Все байндинги для OpenGL, кроме C++, неофициальные. Я так понимаю, особой разницы между байндингами нет. Просто возьму тот, который тянет более современную GL. Пилить самостоятельно - да, спортивный интерес. Сейчас у меня начался курс профессиональной подготовки (дизайнер ПО), в колледже выделены отдельные помещения для нашей группы и VIP ключи до 8 вечера, офис для студентов короче, нужно пользоваться возможностью Насколько сложно сделать радиальную проверку коллизий для окружности, с return на угол столкновения относительно центра/поверхности окружности? Сообщение отредактировал Cossack-HD - 29.08.2016, 11:44 -------------------- Ryzen 3700X
Arctic Freezer 33 eSports Duo 16GB DDR4 3600MHz Strix GTX 1080 TI |
|
 
|
|
29.08.2016, 12:06
Сообщение
#11
|
|
![]() Геймер Репутация: 86
Группа: Участник Сообщений: 128 Награды: 4 Регистрация: 05.05.2012 |
Я так понимаю, низкоуровневые функции помогают при обработке большого количества объектов в кадре? Не совсем. Суть заключается в том, что на си пишутся функции, обеспечивающие низкоуровневый вывод графики. В теле этих функций происходит вызов нативных ф-ий OpenGL, а наружу поставляется простой интерфейс из нескольких таких ф-ий, к примеру: Код int Init(uint64_t handle); void Shutdown(); void SetViewport(int x, int y, int w, int h); int CreatePrimitive(Triangle *triangles); void DrawPrimitive(int handle); void DeletePrimitive(int handle); int CreateTexture(int w, int h, char *pixels); int BindTexture(int handle); void DeleteTexture(int handle); void SetTransforms(float *matrix); void Render(); Потом эта библиотека цепляется к приложению на С# и вся высокоуровневая работа с графикой (спрайты, анимация, очередь отрисовки и т.д.) реализуется уже там. В качестве примера реализации такого АПИ советую -------------------- nop
|
|
 
|
|
29.08.2016, 12:07
Сообщение
#12
|
|
|
The One Репутация: 744
Группа: Участник Сообщений: 2715 Награды: 5 Регистрация: 05.12.2005 |
Все байндинги для OpenGL, кроме C++, неофициальные. Я так понимаю, особой разницы между байндингами нет. Просто возьму тот, который тянет более современную GL. Cossack-HD, ну разрабам не всегда с руки реализовывать API-обёртки под великое множество языков. По поводу разницы между байндингами - всё зависит от того зачем этим занимался автор. Взять например GLScene, числится, как байндинг для pascal-based языков, но я бы не назвал это байндингом, слишком высокоуровнево. Насчёт движка ничего особо сложного - один поток для передвижения объекта и проверки коллизий, по началу могу прямо в код вписывать геометрию, I/O файлов и редактор уже потом. Прверку коллизий хочу сделать "лучиками", потом буду прикручивать больше фичей, как пойдёт А где цикл отрисовки? А в каком потоке он будет? А как будет обрабатываться ввод? А как будут синхронизироваться результаты расчётов из разных потоков? И т.п. вопросы конечно наигранные, но тем не менее... Поэтому я и предлагал взять готовый движок и на основе его разбираться с тем, как это всё организованно и реализовывать уже саму игру. Но, если реализация какой-либо законченной игры не является целью, тогда можно и понабивать себе шишки Насколько сложно сделать радиальную проверку коллизий для окружности, с return на угол столкновения относительно центра/поверхности окружности? Не совсем понял, что такое "радиальная проверка", "поверхность окружности"... Но в целом в коллизиях нет ничего сложного, все формулы гуглятся на раз ) -------------------- |
|
 
|
|
29.08.2016, 13:13
Сообщение
#13
|
|
![]() TECHNOSLAV 80 уровня Репутация: 379
Группа: Участник Сообщений: 5758 Награды: 6 Регистрация: 26.01.2014 |
refuse, если запилить такую прослойку, то можно пользоваться нативным байндингом C++/OpenGL, а основная разработка может быть на C#? Удобно.
Neo][, я перечислил список базовых функций. Такую игрульку можно хоть на простом canvas рисовать, без использования текстур, даже FPS будет играбельный. Не вижу особого смысла разбивать игру на много потоков, сайдскроллер можно делать секвентивно. Подгрузку ресурсов "на лету" можно вынести на второй поток, и до кучи звук и ИИ на свои потоки. -------------------- Ryzen 3700X
Arctic Freezer 33 eSports Duo 16GB DDR4 3600MHz Strix GTX 1080 TI |
|
 
|
|
29.08.2016, 13:31
Сообщение
#14
|
|
|
The One Репутация: 744
Группа: Участник Сообщений: 2715 Награды: 5 Регистрация: 05.12.2005 |
Cossack-HD, что-то ты меня совсем запутал. Зачем opengl, если можно и на обычной канве рисовать? Не видишь смысла в разбиении на потоки, но ресурсы, звук, ии можно вынести в отдельные потоки. Звучит противоречиво.
Я же писал про готовые движки и задавал надуманные вопросы потому что OpenGL - это не на канве рисовать. Посмотри любой урок, показывающий как нарисовать кубик с текстурой на ogl, возможно удивишься количеству кода. -------------------- |
|
 
|
|
29.08.2016, 13:43
Сообщение
#15
|
|
![]() TECHNOSLAV 80 уровня Репутация: 379
Группа: Участник Сообщений: 5758 Награды: 6 Регистрация: 26.01.2014 |
Cossack-HD, что-то ты меня совсем запутал. Зачем opengl, если можно и на обычной канве рисовать? Не видишь смысла в разбиении на потоки, но ресурсы, звук, ии можно вынести в отдельные потоки. Звучит противоречиво. Я же писал про готовые движки и задавал надуманные вопросы потому что OpenGL - это не на канве рисовать. Посмотри любой урок, показывающий как нарисовать кубик с текстурой на ogl, возможно удивишься количеству кода. На канве без текстур и без шейдеров, можно просто сделать однопоточный гейм-дизайн прототип. На OpenGL да, инициализация рендера, стирание буфера вывода, установка view port, установка вершин и групп, назначение текстур, отрисовка по z-буферу (или как там) и прочее прочее. Годный туториал уже нашёл - он настолько для чайников, что начинается с Hello World в Windows Forms Application ;) Что я имел ввиду - игра вполне может работать в одном потоке и с GL рендером, а разбить на потоки можно те вещи, которые между собой связаны минимально. Глубокая оптимизация в планах не стоит. Сообщение отредактировал Cossack-HD - 29.08.2016, 13:45 -------------------- Ryzen 3700X
Arctic Freezer 33 eSports Duo 16GB DDR4 3600MHz Strix GTX 1080 TI |
|
 
|
|
29.08.2016, 14:06
Сообщение
#16
|
|
![]() Почти Игроман Репутация: 187
Группа: Участник Сообщений: 647 Награды: 4 Регистрация: 05.05.2007 |
На мой взгляд испоьзовать OpenGL для 2D графики это overkill. Если только для кросспатформенности.
Под виндой есть аж три специальных API для 2D графики. Это GDI, DirectDraw и Direct2D. Но использовать их имеет смысл только если не устраивает в плане производительности этот ваш canvas. Сообщение отредактировал saas - 29.08.2016, 14:07 |
|
 
|
|
29.08.2016, 14:11
Сообщение
#17
|
|
|
Игровое Воплощение Репутация: 394
Группа: Участник Сообщений: 4791 Награды: 4 Регистрация: 27.04.2011 |
|
|
 
|
|
29.08.2016, 14:14
Сообщение
#18
|
|
|
The One Репутация: 744
Группа: Участник Сообщений: 2715 Награды: 5 Регистрация: 05.12.2005 |
Что я имел ввиду - игра вполне может работать в одном потоке и с GL рендером, а разбить на потоки можно те вещи, которые между собой связаны минимально. Глубокая оптимизация в планах не стоит. Cossack-HD, вот только всё тобой перечисленное связанно максимально Без ресурсов нечего рисовать. На экране происходит столкновение, а из колонок тишина. Тяжёлый алгоритм ИИ или коллизии не успел отработать, а рендер уже рисует следующий кадр. Движок - это комплексная система в которой всё взаимосвязано и это очень не тривиальная задача написать многопоточную риалтайм систему. Уж лучше не заморачивайся с потоками и делай всё в одном. Это же с++. Для старых компиляторов пишется костыль: Код #define for if (false);else for И вот уже ругани на повторные объявления нет abramcumner, воу воу полегче, видел многое, но вот этот трюк -------------------- |
|
 
|
|
29.08.2016, 18:07
Сообщение
#19
|
|
![]() TECHNOSLAV 80 уровня Репутация: 379
Группа: Участник Сообщений: 5758 Награды: 6 Регистрация: 26.01.2014 |
На мой взгляд испоьзовать OpenGL для 2D графики это overkill. Если только для кросспатформенности. Под виндой есть аж три специальных API для 2D графики. Это GDI, DirectDraw и Direct2D. Но использовать их имеет смысл только если не устраивает в плане производительности этот ваш canvas. OpenGL нужен, чтобы учиться основам 3D графона, да и кросс-платформенность тоже интересует, да и "всякие там Vulkan'ы", которые растут из GL. Я подумал, что лучше начинать с "2D" игр, с редким использованием 3D объектов. Я по AutoCAD знаю, как мозг ломается и перегревается при работе в 3D. В сайдскроллерах хорошо смотрятся 3D объекты для фона (горизонтальная поверхность с перспективой) - это очень актуально для открытых пространств, когда хочется показать глубину мира: . В противном случае, придётся насаживать десятки линий кустиков "друг за другом" - тогда можно даже не думать об уходящей вдаль водной поверхности. Сообщение отредактировал Cossack-HD - 29.08.2016, 18:11 -------------------- Ryzen 3700X
Arctic Freezer 33 eSports Duo 16GB DDR4 3600MHz Strix GTX 1080 TI |
|
 
|
|
04.09.2016, 01:05
Сообщение
#20
|
|
![]() Почти Игроман Репутация: 187
Группа: Участник Сообщений: 647 Награды: 4 Регистрация: 05.05.2007 |
|
|
 
|
|
04.09.2016, 14:20
Сообщение
#21
|
|
![]() Геймер Репутация: 86
Группа: Участник Сообщений: 128 Награды: 4 Регистрация: 05.05.2012 |
архив с Припятью побился Касательно движка есть пара не вполне очевидных моментов: 1. Изначально движок пилился под x86 архитектуру и когда был допилен до запускаемой демо-версии я начал портировать его под ARM. В этот момент выяснилось, что архитектурное решение для парсера двоичных файлов, позаимствованное из хray, не годится для этой платформы т.к. данные считанные из файла в память должны быть . В итоге на скорую руку был придуман костыль - при сборке ресурсов данные выравнивались при записи в файл так, словно они размещались в памяти, а при загрузке файл загружался в память целиком и уже после производился его разбор путем раздачи выровненных указателей на эти данные. Позже, я нашел ошибку при сборке ресурсов, в результате которой могла происходить порча памяти во время загрузки этих ресурсов, но к тому моменту работа над движком была приостановлена. Для обеспечения стабильной работы движка необходимо переписать файловую систему так, чтобы вместо раздачи указателей на память данные считывались с диска или копировались из памяти при помощи POSIX ф-ий: // 2. В рендерере существовала ошибка при вычислении размеров данных текстуры, в результате некоторые текстуры с мипмапами могли глючить при приближении/удалении камеры, позднее эта ошибка была но протестировать его не удалось т.к. ресурсы для тестовой сборки к тому моменту были удалены с жесткого диска. -------------------- nop
|
|
 
|
|
04.09.2016, 19:27
Сообщение
#22
|
|
![]() Почти Игроман Репутация: 187
Группа: Участник Сообщений: 647 Награды: 4 Регистрация: 05.05.2007 |
2. В рендерере существовала ошибка при вычислении размеров данных текстуры, в результате некоторые текстуры с мипмапами могли глючить при приближении/удалении камеры, позднее эта ошибка была но протестировать его не удалось т.к. ресурсы для тестовой сборки к тому моменту были удалены с жесткого диска. В версии из репозитория некоторые форматы текстур(DXT) вообще не работают, это из за того что коды форматов в types.h не совпадают c теми что используются в PVR файлах. Сообщение отредактировал saas - 04.09.2016, 19:28 |
|
 
|
|
04.09.2016, 19:32
Сообщение
#23
|
|
![]() Продвинутый геймер Репутация: 90
Группа: Участник Сообщений: 395 Награды: 3 Регистрация: 07.04.2014 |
saas, 4 апдейт для билдера накатывал?
-------------------- no more running
|
|
 
|
|
04.09.2016, 19:48
Сообщение
#24
|
|
![]() Почти Игроман Репутация: 187
Группа: Участник Сообщений: 647 Награды: 4 Регистрация: 05.05.2007 |
Ray, нет, у меня есть только первый.
|
|
 
|
|
04.09.2016, 20:13
Сообщение
#25
|
|
![]() Геймер Репутация: 86
Группа: Участник Сообщений: 128 Награды: 4 Регистрация: 05.05.2012 |
saas, чтот я стал забывать как устроен текстурный менеджер, в ближайшее время постараюсь разобраться что там за проблема с форматом пиксела, о результатах отпишусь.
-------------------- nop
|
|
 
|
|
04.09.2016, 20:26
Сообщение
#26
|
|
![]() Почти Игроман Репутация: 187
Группа: Участник Сообщений: 647 Награды: 4 Регистрация: 05.05.2007 |
refuse, да ничего сложного там. Действительно нужен преобразователь, т.е. в texture_read вместо t->format = fomat; написать что-то типа такого:
Код switch(format)
{ case 0: t->format = PVRTC_2BPP_RGB; break; case 1: t->format = PVRTC_2BPP_RGBA; break; case 2: t->format = PVRTC_4BPP_RGB; break; case 3: t->format = PVRTC_4BPP_RGBA; break; case 4: t->format = PVRTCII_2BPP; break; case 5: t->format = PVRTCII_4BPP; break; case 6: t->format = ETC1; break; case 7: t->format = DXT1; break; case 9: t->format = DXT3; break; case 11: t->format = DXT5; break; case 22: t->format = ETC2_RGB; break; case 23: t->format = ETC2_RGBA; break; case 24: t->format = ETC2_RGBA1; break; case 25: t->format = EACR11U; break; case 26: t->format = EACRG11U; break; default: t->format = -1; } |
|
 
|
|
10.09.2016, 03:34
Сообщение
#27
|
|
![]() Почти Игроман Репутация: 187
Группа: Участник Сообщений: 647 Награды: 4 Регистрация: 05.05.2007 |
Извинияюсь за даблпост.
refuse, а каким образом это всё собирается/запускается под Android? Я с этой платформой совсем не знаком.. |
|
 
|
|
19.09.2016, 21:39
Сообщение
#28
|
|
![]() Игровой Бог Репутация: 648
Группа: Участник Сообщений: 5354 Награды: 9 Регистрация: 24.09.2010 |
Не знаете, есть ли специальный синтаксис для notepad++ для файлов-конфигов? Можно конечно и свой сделать, но если уже есть (по идее должен быть), то зачем изобретать велосипед. Тем не менее, пока не удалось найти подходящего ничего.
Код [section] ; comment key = value З.Ы. с небольшой натяжкой подходит синтаксис от ассемблера. -------------------- |
|
 
|
|
19.09.2016, 22:03
Сообщение
#29
|
|
|
Игровое Воплощение Репутация: 394
Группа: Участник Сообщений: 4791 Награды: 4 Регистрация: 27.04.2011 |
А чем не подходит MS-INI?
|
|
 
|
|
19.09.2016, 22:43
Сообщение
#30
|
|
![]() Игровой Бог Репутация: 648
Группа: Участник Сообщений: 5354 Награды: 9 Регистрация: 24.09.2010 |
А чем не подходит MS-INI? В целом конечно тоже подходит, однако есть моменты когда не определяет как параметр, состоящих из двух частей с разделителем: Код key:prop = value ну и хотелось бы различную подсветку для значений числа, строки... Попробую изменить этот стиль. -------------------- |
|
 
|
|
20.09.2016, 08:42
Сообщение
#31
|
|
![]() Высший Игровой Бог Репутация: 1747
Группа: Супермодератор Сообщений: 12594 Награды: 15 Регистрация: 05.11.2009 |
RayTwitty, советую еще Sublime Text попробовать, там это тоже просто настраивается. А если много RAM и хороший CPU, то можно и хипстерский Atom попробовать. Т.к. по сути это обычный хромиум, то там тоже можно все настроить быстро и красиво.
-------------------- |
|
 
|
|
20.09.2016, 08:49
Сообщение
#32
|
|
![]() Почти Мастер Репутация: 237
Группа: Участник Сообщений: 1163 Награды: 4 Регистрация: 18.03.2010 |
хипстерский Atom Не знаю почему все его так хвалят, я попробовал и он очень мне не понравился + там странная вертикальная белая полоска почти по средине экрана с кодом. Крч вернулся на саблайм) -------------------- -------------------------------- |
|
 
|
|
20.09.2016, 09:07
Сообщение
#33
|
|
![]() Ветеран Репутация: 108
Группа: Участник Сообщений: 83 Награды: 3 Регистрация: 13.02.2010 |
Несколько лет назад я вел свои эксперименты с рендером объектов сталкера под разные движки (dx7-8-9 ffp, dx8-9 sm1.1-sm2.0, gl, allegro, irrlicht, snapgraphics gl) и платформы - win-dos-os2. Пересобирал двиг ТЧ (вернул g_spawn из билда 2571 и проч.) - на форуме было выложено.
http://www.gameru.net/forum/index.php?showtopic=33123 -------------------- Словно с видом чудака,
С верхней лестничной площадки, Крадучись, играя в прятки, Сходит небо с чердака. Потому что жизнь не ждет. Не оглянешься - и святки. Только промежуток краткий, Смотришь, там и новый год. |
|
 
|
|
04.10.2016, 19:09
Сообщение
#34
|
|
![]() Игровой Бог Репутация: 648
Группа: Участник Сообщений: 5354 Награды: 9 Регистрация: 24.09.2010 |
советую еще Sublime Text попробовать Сегодня увидел у знакомого, пришел домой, заценил - пока нравится. Интересно, что тут по умолчанию стоит подсветка синтаксиса Monokai, которую я для себя когда-то выбрал путем долгого отбора Кстати, почему-то в стоке нет стиля для ini файлов, поэтому проблема отсюда решается установкой стороннего синтаксиса: (для 3 версии тоже катит). З.Ы. Зато присутствует адекватный Monokai для Lua. В notepad++ мне приходилось его ручками допиливать (некоторые ключевые слова языка почти сливались с фоном etc). Сообщение отредактировал RayTwitty - 04.10.2016, 19:17 -------------------- |
|
 
|
|
04.10.2016, 20:20
Сообщение
#35
|
|
![]() Игровой Бог Репутация: 648
Группа: Участник Сообщений: 5354 Награды: 9 Регистрация: 24.09.2010 |
Подход к настройкам радует - слева дефолтные значения с описанием, справа пользовательские. Причем дефолт в режиме readonly, сломать случайно не получится.
Немного допилил под себя: Код {
//"font_size": 13, "show_encoding": true, "fallback_encoding": "Cyrillic (Windows 1251)", "caret_style": "phase", "highlight_line": true, "highlight_modified_tabs": true, "draw_minimap_border": true, "always_show_minimap_viewport": true, } Сообщение отредактировал RayTwitty - 04.10.2016, 20:41 -------------------- |
|
 
|
|
04.10.2016, 20:32
Сообщение
#36
|
|
![]() Высший Игровой Бог Репутация: 1747
Группа: Супермодератор Сообщений: 12594 Награды: 15 Регистрация: 05.11.2009 |
Еще один огромный плюс Sublime Text, он выполняет самую важную задачу которую только может сделать текстовый редактор - сохранение результатов работы. У меня несколько раз во время работы в Sublime Text выключался ПК (перебои с напряжением), и только он смог полностью сохранить все изменения. Такое не могут ни Notepad+, ни даже VS и Android Studio, они тупо делают авто сохранение раз в X минут. И в случае чего - велика вероятность повреждения данных, из-за чего приходится заново все восстанавливать. Хоть потеря пары минут работы несущественна, но все равно неприятно.
-------------------- |
|
 
|
|
04.10.2016, 21:04
Сообщение
#37
|
|
![]() Игровой Бог Репутация: 648
Группа: Участник Сообщений: 5354 Награды: 9 Регистрация: 24.09.2010 |
STALKER2011x, сподвигло поставить ещё и то, что в notepad++ после одного из последних апдейтов начались какие-то проблемы с кодировкой. Точнее, я склоняюсь к тому, что проблема была в старой версии (2007 года, которую я когда-то скачал и не обновлял с тех пор). Видимо в последней версии (спустя почти 10 лет) изменились правила пересохранения файлов и установки дефолтных кодировок.
В sublime с этим как-то прозрачнее, ибо все достаточно грамотно настроено и прокомментировано разрабами, плюс можно задать свою кодировку для неопознанных файлов. З.Ы. вот кстати стиль для MASM, которого тоже нет по дефолту: Сообщение отредактировал RayTwitty - 04.10.2016, 21:49 -------------------- |
|
 
|
|
06.10.2016, 00:37
Сообщение
#38
|
|
![]() Игровой Бог Репутация: 648
Группа: Участник Сообщений: 5354 Награды: 9 Регистрация: 24.09.2010 |
Пока нашел один недостаток - нету возможности показать файл в проводнике. В notepad++ в контекстном меню файла-вкладки было "Открыть директорию файла".
-------------------- |
|
 
|
|
06.10.2016, 08:32
Сообщение
#39
|
|
![]() Высший Игровой Бог Репутация: 1747
Группа: Супермодератор Сообщений: 12594 Награды: 15 Регистрация: 05.11.2009 |
Пока нашел один недостаток - нету возможности показать файл в проводнике. В notepad++ в контекстном меню файла-вкладки было "Открыть директорию файла". ПКМ по текстовому полю, а не вкладки: -------------------- |
|
 
|
|
06.10.2016, 12:28
Сообщение
#40
|
|
![]() Доктор Игровых Наук Репутация: 1084
Группа: Участник Сообщений: 3950 Награды: 6 Регистрация: 24.08.2010 |
Попробуйте visual studio code, очень быстро запускается и есть плагины для всего.
-------------------- |
|
 
|
|
06.10.2016, 16:40
Сообщение
#41
|
|
![]() Игровой Бог Репутация: 648
Группа: Участник Сообщений: 5354 Награды: 9 Регистрация: 24.09.2010 |
ПКМ по текстовому полю, а не вкладки: Да, спасибо, не заметил Попробуйте visual studio code, очень быстро запускается и есть плагины для всего. На рабочем компе как-нибудь попробую. -------------------- |
|
 
|
|
06.10.2016, 16:43
Сообщение
#42
|
|
![]() Почти Игроман Репутация: 187
Группа: Участник Сообщений: 647 Награды: 4 Регистрация: 05.05.2007 |
Оказывается в C++ можно сделать оператор with(как в JavaScript или Pascal).
Код #define with(type, var, code) \
struct __with_##type : type { \ void operator () () { code } \ }; static_cast<__with_##type&>(var)() ... struct S { char *string; int x, y, z; }; S s; with(S, s, x = 2; y = 222; z = 90; string = NULL; ); Сообщение отредактировал saas - 06.10.2016, 16:43 |
|
 
|
|
06.10.2016, 16:52
Сообщение
#43
|
|
![]() Доктор Игровых Наук Репутация: 1084
Группа: Участник Сообщений: 3950 Награды: 6 Регистрация: 24.08.2010 |
-------------------- |
|
 
|
|
06.10.2016, 17:06
Сообщение
#44
|
|
![]() Почти Игроман Репутация: 187
Группа: Участник Сообщений: 647 Награды: 4 Регистрация: 05.05.2007 |
1001v, ничего не убрали, просто не рекомендуют использовать.
|
|
 
|
|
06.10.2016, 17:22
Сообщение
#45
|
|
![]() Игровой Бог Репутация: 648
Группа: Участник Сообщений: 5354 Награды: 9 Регистрация: 24.09.2010 |
Код obj = { a = 1, b = "str" } Не совсем понятна целесообразность применения Код with (obj) { a = 2 b = "" } если можно написать просто Код obj.a = 2 obj.b = "" так еще и нагляднее. Сообщение отредактировал RayTwitty - 06.10.2016, 17:24 -------------------- |
|
 
|
|
06.10.2016, 18:08
Сообщение
#46
|
|
![]() Доктор Игровых Наук Репутация: 1084
Группа: Участник Сообщений: 3950 Награды: 6 Регистрация: 24.08.2010 |
1001v, ничего не убрали, просто не рекомендуют использовать. C use strict работать не будет. -------------------- |
|
 
|
|
07.10.2016, 00:34
Сообщение
#47
|
|
![]() Геймер Репутация: 86
Группа: Участник Сообщений: 128 Награды: 4 Регистрация: 05.05.2012 |
а каким образом это всё собирается/запускается под Android? Для этого нужно: - Установить и . - В папке platforms/android лежит шелл скрипт, в нем прописывается путь к скрипту сборки который находится в папке с NDK. - После запуска скрипта будет выполнена сборка и в результате получится статическая библиотека, которая подключается к демонстрационному приложению. Демо приложение делается на базе примера, который поставляется в комплекте с Android NDK. Пример на базе которого я делал демо называется native_app_glue. Оказывается в C++ можно сделать оператор with(как в JavaScript или Pascal). в С++14 такую возможность добавили в язык, на манер С99 На такую конструкцию налагается ограничение - поля структуры в списке инициализации должны быть перечислены строго в том же порядке в каком они были объявлены, иначе компилятор выдаст ошибку. Сообщение отредактировал refuse - 07.10.2016, 00:38 -------------------- nop
|
|
 
|
|
11.10.2016, 00:14
Сообщение
#48
|
|
![]() Игровой Бог Репутация: 648
Группа: Участник Сообщений: 5354 Награды: 9 Регистрация: 24.09.2010 |
Как может называться штука, которая динамически меняет громкость звука (например звук винтов вертолета - плавное нарастание и угасание)? Написать-написал, а человеческое название этому придумать пока не могу
-------------------- |
|
 
|
|
11.10.2016, 00:18
Сообщение
#49
|
|
![]() Продвинутый геймер Репутация: 33
Группа: Участник Сообщений: 339 Награды: 4 Регистрация: 11.09.2008 |
Volume control.
-------------------- Всё легко, но все хлюпики.
|
|
 
|
|
11.10.2016, 01:22
Сообщение
#50
|
|
![]() Продвинутый геймер Репутация: 33
Группа: Участник Сообщений: 339 Награды: 4 Регистрация: 11.09.2008 |
Написать-написал... А как сделал? В движке или отдельно, через winapi..? "Плеер" или просто команды? Сообщение отредактировал 7.9 - 11.10.2016, 01:23 -------------------- Всё легко, но все хлюпики.
|
|
 
|
|
11.10.2016, 01:37
Сообщение
#51
|
|
![]() Игровой Бог Репутация: 648
Группа: Участник Сообщений: 5354 Награды: 9 Регистрация: 24.09.2010 |
7.9, там речь шла о внутренних звуковых объектах.
-------------------- |
|
 
|
|
11.10.2016, 01:48
Сообщение
#52
|
|
![]() Продвинутый геймер Репутация: 33
Группа: Участник Сообщений: 339 Награды: 4 Регистрация: 11.09.2008 |
Понятненько...
Про (амбиентные) loop-ы, надеюсь, не забыли... там такое как раз и надо. Сообщение отредактировал 7.9 - 11.10.2016, 02:01 -------------------- Всё легко, но все хлюпики.
|
|
 
|
|
11.10.2016, 08:09
Сообщение
#53
|
|
![]() Высший Игровой Бог Репутация: 1747
Группа: Супермодератор Сообщений: 12594 Награды: 15 Регистрация: 05.11.2009 |
называться штука, которая динамически меняет громкость звука Loudness equalization -------------------- |
|
 
|
|
11.10.2016, 15:36
Сообщение
#54
|
|
![]() Игровой Бог Репутация: 648
Группа: Участник Сообщений: 5354 Награды: 9 Регистрация: 24.09.2010 |
там такое как раз и надо. В амбиентах это, в принципе, не нужно - звуки как правило играют целиком и в них уже есть плавное затухание. -------------------- |
|
 
|
|
11.10.2016, 23:16
Сообщение
#55
|
|
![]() Продвинутый геймер Репутация: 33
Группа: Участник Сообщений: 339 Награды: 4 Регистрация: 11.09.2008 |
там такое как раз и надо. В амбиентах это, в принципе, не нужно - звуки как правило играют целиком и в них уже есть плавное затухание. Это -- статичный "амбиент". Я имел в виду "динамический" -- зависимый от ситуации... -- это тоже, что и обычные звуки, только без акустических пресетов. Сообщение отредактировал 7.9 - 11.10.2016, 23:18 -------------------- Всё легко, но все хлюпики.
|
|
 
|
|
11.10.2016, 23:59
Сообщение
#56
|
|
![]() Игровой Бог Репутация: 648
Группа: Участник Сообщений: 5354 Награды: 9 Регистрация: 24.09.2010 |
Я имел в виду "динамический" -- зависимый от ситуации Динамическая музыка при перестрелках в ЧН/ЗП? -------------------- |
|
 
|
|
12.10.2016, 00:18
Сообщение
#57
|
|
![]() Продвинутый геймер Репутация: 33
Группа: Участник Сообщений: 339 Награды: 4 Регистрация: 11.09.2008 |
Возможно, но это самое примитивное применение...
В частности, постановщик может это использовать для разного рода невербальных акцентов, например... ну и "не только" Сообщение отредактировал 7.9 - 12.10.2016, 00:23 -------------------- Всё легко, но все хлюпики.
|
|
 
|
|
12.10.2016, 08:47
Сообщение
#58
|
|
![]() Высший Игровой Бог Репутация: 1747
Группа: Супермодератор Сообщений: 12594 Награды: 15 Регистрация: 05.11.2009 |
Я имел в виду "динамический" -- зависимый от ситуации Динамическая музыка при перестрелках в ЧН/ЗП? А разве там звук не плавно менялся в начале и в конце? В том же ЧН - музыка состояла из нескольких кусочков, которые зацикливались, если перестрелка не прекращалась, а звук плавно менялся в начале/конце фрагмента. В ЗП уже просто обычные треки, но звук менялся так же. Насколько я помню. -------------------- |
|
 
|
|
21.10.2016, 21:11
Сообщение
#59
|
|
![]() Игровой Бог Репутация: 648
Группа: Участник Сообщений: 5354 Награды: 9 Регистрация: 24.09.2010 |
Код for /f "delims=" %%a in ('dir /b /s /a-d "*"') do echo %%~na >> "_list.txt" Выводит список файлов (без расширения) текущего каталога и всех подкаталогов в заданный файл. Как сделать, чтобы пропускались (исключались) все файлы, которые имеют расширение, например ".exe"? -------------------- |
|
 
|
|
21.10.2016, 21:35
Сообщение
#60
|
|
![]() Почти Игроман Репутация: 187
Группа: Участник Сообщений: 647 Награды: 4 Регистрация: 05.05.2007 |
RayTwitty, if /I not %%~xa==.EXE
|
|
 
|
|
25.10.2016, 22:23
Сообщение
#61
|
|
![]() Игровой Бог Репутация: 648
Группа: Участник Сообщений: 5354 Награды: 9 Регистрация: 24.09.2010 |
С ужасом обнаружил, что в JS нету функции формата строки аля С++
В Lua есть: Код str = "world" print(string.format("hello %s", str)) --> hello world Нашел некий аналог для JS: Но тут строка форматируется в несколько ином виде: Код var str = "world"; console.log(format("hello {0}", str)) --> hello world Существует ли первый вариант для JS? -------------------- |
|
 
|
|
25.10.2016, 22:46
Сообщение
#62
|
|
![]() Почти Игроман Репутация: 187
Группа: Участник Сообщений: 647 Награды: 4 Регистрация: 05.05.2007 |
RayTwitty, а зачем она там, когда можно "hello " + "world"?
|
|
 
|
|
25.10.2016, 22:52
Сообщение
#63
|
|
![]() Игровой Бог Репутация: 648
Группа: Участник Сообщений: 5354 Награды: 9 Регистрация: 24.09.2010 |
Нашел.
а зачем она там, когда можно "hello " + "world"? Это для примера. -------------------- |
|
 
|
|
26.10.2016, 11:50
Сообщение
#64
|
|
![]() Доктор Игровых Наук Репутация: 1084
Группа: Участник Сообщений: 3950 Награды: 6 Регистрация: 24.08.2010 |
Существует ли первый вариант для JS? В es2015 можно сделать вот так: Код let str = "world"; console.log(`hello ${str}`); // => hello world Обрати внимание на обратные кавычки `, будет работать только с ними. -------------------- |
|
 
|
|
26.10.2016, 13:47
Сообщение
#65
|
|
![]() TECHNOSLAV 80 уровня Репутация: 379
Группа: Участник Сообщений: 5758 Награды: 6 Регистрация: 26.01.2014 |
Вопрос по C# MVC
Есть база данных с тремя таблицами. Запилена модель WebsiteDBEntities. Суть такова: не получается скинуть List с таблицами в View Код public class HomeController : Controller { WebsiteDBEntities WebsiteDB; List<List<object>> listCeption; public HomeController() { WebsiteDB = new WebsiteDBEntities(); listCeption = new List<List<object>>(); listCeption.Add(new ((object)WebsiteDBEntities().organizations.ToList())); listCeption.Add(new ((object)WebsiteDBEntities().persons.ToList())); listCeption.Add(new ((object)WebsiteDBEntities().connections.ToList())); } public ActionResult Index() { return View(new WebsiteDBEntities().organizations.ToList()); } } КО кричит, что List для object не может принимать organization, person, connection. Кастинг не проходит. Какие есть варианты запихнуть три модели в один List? Сообщение отредактировал Cossack-HD - 26.10.2016, 13:51 -------------------- Ryzen 3700X
Arctic Freezer 33 eSports Duo 16GB DDR4 3600MHz Strix GTX 1080 TI |
|
 
|
|
26.10.2016, 14:04
Сообщение
#66
|
|
|
Игровое Воплощение Репутация: 394
Группа: Участник Сообщений: 4791 Награды: 4 Регистрация: 27.04.2011 |
listCeption.Add(new ((object)WebsiteDBEntities().organizations.ToList())); Здесь написана какая-то ересь - после new разве не должен тип указываться? Тогда уж списки как-то так передавать надо: Код var orgView = new List<object>(); foreach(var org in WebsiteDBEntities().organizations) orgView.Add(org); listCeption.Add(orgView); А вообще это какой-то крайне порочный путь. |
|
 
|
|
26.10.2016, 14:05
Сообщение
#67
|
|
![]() Высший Игровой Бог Репутация: 1747
Группа: Супермодератор Сообщений: 12594 Награды: 15 Регистрация: 05.11.2009 |
Хм. Объединить три модели в одну? У каждой же модели поля разные, как listView поймет какие поля куда пихать?
Ну и еще, список перед добавлением в listView приводится к типу object, но ведь listView не поймет какие поля есть в object. Для этого нужно передавать именно тип/класс конкретного list. --- С C#/MVC работал давно, так что могу ошибаться. Все уже позабыл. -------------------- |
|
 
|
|
26.10.2016, 16:31
Сообщение
#68
|
|
![]() Доктор Игровых Наук Репутация: 544
Группа: Участник Сообщений: 3657 Награды: 9 Регистрация: 12.07.2007 |
listCeption = new List<List<object>>(); listCeption.Add(new ((object)WebsiteDBEntities().organizations.ToList())); listCeption.Add(new ((object)WebsiteDBEntities().persons.ToList())); listCeption.Add(new ((object)WebsiteDBEntities().connections.ToList())); Я как ява программист и не особо знающий шарпея сильно преполагаю что не проканает такое. Во первых: new List<List<object>>(); Лист в которым Лист в котором объекты??? Косяк. Во вторых: существует ли реализация метода ToList у organizations, persons и connections? Или же там реализация от родителя? В третьих: listCeption.Add(new ((object)WebsiteDBEntities().organizations.ToList())); По логике той же явы конкретно такое написание говорит о том что в listCeption пытаются Add(1 ЭЛЕМАНТ А НЕ ЛИСТ) запихнуть кучу. Хотя в савокупности с первым пунктом и если его правильно реализацивоть то такое возможно. Либо же тут(в шарпе) нет метода AddAll который подразумевает всунуть кучу. В четвертых, опять же незнаю как это в шарпе но в яве для решения подобной задачи и создания таблицы(на самом деле чего угодно) нужно сначала сделать interface или абстрактный класс общий и от него сделать реализации модели(собственно данные из бд в твоем случае) и графического элемента(представление) View. В таком случае если вызывать SomeView.Add(new SomeData()) то табличка\гуи\pojo корректно автоматом разложит все по полочкам. В т.ч. можно реализовать множественный View который отобразит корректно даже разные типы данных или же будет строить дерево таблиц вложенных таблицами с данными(Это исходя из new List<List<object>>()). В пятых: юзать тип Object крайне нежелательно, опять же отталкиваюсь от явы. Касательно ответа на вопрос: Какие есть варианты запихнуть три модели в один List? Не юзай Object!!! Сделай 1 родительский interface(класс если в шарпе нет интерфейсов) и реализуй его в своих organizations, persons и connections. Дальше в листе тип данных будет родительский interface\класс и в него уже пихаешь потомков. |
|
 
|
|
29.10.2016, 19:37
Сообщение
#69
|
|
![]() Игровой Бог Репутация: 648
Группа: Участник Сообщений: 5354 Награды: 9 Регистрация: 24.09.2010 |
Вопрос следующего характера - имеется самописный парсер конфигов для nodeJS. Для чтения файла используется внутренняя функция readFileSync, которая возвращает массив строк. Строки в файле выглядят как "ключ = значение". Значение может включать в себя специальные символы (вроде '\n' - перенос на следующую строку). После чтения файла функцией readFileSync, почему-то, все эти специальные символы распознаются как обычные, например '\n' как '\' и 'n', соответственно переноса строки не происходит. Кодировка файла конфига UTF-8, кодировка обрабатывающего .js тоже UTF-8.
В итоге был написан костыль, который заменяет в строке два отдельных символа '\' и 'n' на один '\n'. В чем собственно вопрос - почему так происходит и может быть есть нормальный парсер для node JS (гугление по русскому и английскому сегменту инета результата не дали)? -------------------- |
|
 
|
|
29.10.2016, 20:36
Сообщение
#70
|
|
![]() Доктор Игровых Наук Репутация: 1084
Группа: Участник Сообщений: 3950 Награды: 6 Регистрация: 24.08.2010 |
которая возвращает массив строк Она возвращает буфер или строку. Из документации: Цитата If the encoding option is specified then this function returns a string. Otherwise it returns a buffer. Поэтому просто прочитай и порежь: Код fs.readFileSync('filename', 'utf8').match(/[^\r\n]+/gu)
-------------------- |
|
 
|
|
29.10.2016, 21:44
Сообщение
#71
|
|
![]() Игровой Бог Репутация: 648
Группа: Участник Сообщений: 5354 Награды: 9 Регистрация: 24.09.2010 |
Она возвращает буфер или строку. Из документации: Да, просто забыл, что сразу в строку перевел и разбил на части через split('\n'). И да, видимо toString делает аналогичное, что и вызов readFileSync с опцией "utf8". Поэтому просто прочитай и порежь: Вроде бы, никаких изменений - \n как не читался, так и не читается. З.Ы. У меня кстати подсветка синтаксиса в sublime с твоим шаблоном сломалась Сообщение отредактировал RayTwitty - 29.10.2016, 21:59 -------------------- |
|
 
|
|
29.10.2016, 22:02
Сообщение
#72
|
|
![]() Доктор Игровых Наук Репутация: 1084
Группа: Участник Сообщений: 3950 Награды: 6 Регистрация: 24.08.2010 |
RayTwitty, split оставляет пустую строку последним элементом, по-моему.
Вроде бы, никаких изменений - \n как не читался, так и не читается. У меня нормально. ![]() Или я не понимаю, что тебе нужно. -------------------- |
|
 
|
|
29.10.2016, 22:09
Сообщение
#73
|
|
![]() Игровой Бог Репутация: 648
Группа: Участник Сообщений: 5354 Награды: 9 Регистрация: 24.09.2010 |
Или я не понимаю, что тебе нужно. Скачай и выведи его в консоль. Должно вывести именно это (массив из двух элементов): вызов console.log(array[0]): Код test1 = One1 Two1 вызов console.log(array[1]): Код test2 = One2
Two2 Сообщение отредактировал RayTwitty - 29.10.2016, 22:39 -------------------- |
|
 
|
|
29.10.2016, 22:46
Сообщение
#74
|
|
![]() Доктор Игровых Наук Репутация: 1084
Группа: Участник Сообщений: 3950 Награды: 6 Регистрация: 24.08.2010 |
RayTwitty,
Код fs.readFileSync('filename', 'utf8').split(/\\n|\n/gu) З.Ы. У меня кстати подсветка синтаксиса в sublime с твоим шаблоном сломалась Это из-за флага u, он появился только в es6. -------------------- |
|
 
|
|
29.10.2016, 22:56
Сообщение
#75
|
|
![]() Почти Игроман Репутация: 187
Группа: Участник Сообщений: 647 Награды: 4 Регистрация: 05.05.2007 |
В итоге был написан костыль, который заменяет в строке два отдельных символа '\' и 'n' на один '\n'. Почему костыль? По идее, функция которая читает данные из файла и не должна сама расшифровывать escape-последовательности. Ты же вроде знаешь C++, и даже ассемблер, а такие странные вопросы задаёшь. |
|
 
|
|
29.10.2016, 23:33
Сообщение
#76
|
|
![]() Игровой Бог Репутация: 648
Группа: Участник Сообщений: 5354 Награды: 9 Регистрация: 24.09.2010 |
По идее, функция которая читает данные из файла и не должна сама расшифровывать escape-последовательности. На самом деле проблема была в другом - на строки readFileSync разбивает таки нормально, а вот спец. символы записанные явно, представляет как экранированные. Это я понял, когда тестил варианты от 1001v. В моем случае, для значения ключа, достаточно просто сделать replace('\\n', '\n'). Проблема решена. Плюсы в репутацию поставил Сообщение отредактировал RayTwitty - 29.10.2016, 23:35 -------------------- |
|
 
|
|
12.11.2016, 02:29
Сообщение
#77
|
|
![]() Кандидат Игровых Наук Репутация: 2153
Группа: Участник Сообщений: 3488 Награды: 4 Регистрация: 27.07.2009 |
Возник небольшой вопрос по поводу работы Visual Studio и её компилятора, может кто знает ответ. Весь текст копировать не буду, оставлю просто ссылку - .
Сами файлы можно посмотреть здесь: Сообщение отредактировал Shoкer - 12.11.2016, 02:29 -------------------- Мне просто нравятся синие буквы под сообщением.
|
|
 
|
|
12.11.2016, 09:56
Сообщение
#78
|
|
![]() Высший Игровой Бог Репутация: 1747
Группа: Супермодератор Сообщений: 12594 Награды: 15 Регистрация: 05.11.2009 |
Shoкer, а ты проверил тот класс? Может он действительно недоступен для наследования?
PS: полагаю, очистка и полная пересборка проекта (точнее, нужного подпроекта, в решении) уже была сделана? VS (как и многие IDE) часто грешит этой проблемой. PSS: Скорее всего, проблема как раз в новой версии VS / компиляторе. Наверняка в новой версии что-то запретили делать так как было раньше и в итоге возникает предупреждение об ошибке. К сожалению, с C++ работал давно, поэтому ничего конкретного сказать не могу. Кроме как в строке ошибки перейти к определению (комбинацию клавиш в VS тоже забыл -------------------- |
|
 
|
|
12.11.2016, 11:45
Сообщение
#79
|
|
![]() Геймер Репутация: 86
Группа: Участник Сообщений: 128 Награды: 4 Регистрация: 05.05.2012 |
Возник небольшой вопрос по поводу работы Visual Studio и её компилятора, может кто знает ответ. я так понимаю inherited - это какое-то макроопределение препроцессора, полагаю, что этот макрос разворачивается в этой строке: Код inherited::inherited::ProcessCam(info) в что-то типа Код CAnimatorCamEffector::CAnimatorCamEffector::ProcessCam(info)
Сообщение отредактировал refuse - 12.11.2016, 11:46 -------------------- nop
|
|
 
|
|
12.11.2016, 11:54
Сообщение
#80
|
|
![]() Почти Игроман Репутация: 187
Группа: Участник Сообщений: 647 Награды: 4 Регистрация: 05.05.2007 |
refuse, нет, inherited это родительский класс.
Код class A
{ ... }; class B : public A { typedef A inherited; .... }; |
|
 
|
|
12.11.2016, 12:04
Сообщение
#81
|
|
![]() Геймер Репутация: 86
Группа: Участник Сообщений: 128 Награды: 4 Регистрация: 05.05.2012 |
saas, тогда все должно работать
-------------------- nop
|
|
 
|
|
12.11.2016, 13:50
Сообщение
#82
|
|
|
Игровое Воплощение Репутация: 394
Группа: Участник Сообщений: 4791 Награды: 4 Регистрация: 27.04.2011 |
|
|
 
|
|
12.11.2016, 14:16
Сообщение
#83
|
|
![]() Геймер Репутация: 86
Группа: Участник Сообщений: 128 Награды: 4 Регистрация: 05.05.2012 |
Студия его собирает, а clang и gcc выдают ошибку. да, действительно. однако, даже если компилятор студии проглотил такой код, это не должно привести к описанной выше проблеме в рантайме, очевидно проблема кроется в чем-то другом. -------------------- nop
|
|
 
|
|
12.11.2016, 15:15
Сообщение
#84
|
|
|
Игровое Воплощение Репутация: 394
Группа: Участник Сообщений: 4791 Награды: 4 Регистрация: 27.04.2011 |
да, действительно. однако, даже если компилятор студии проглотил такой код, это не должно привести к описанной выше проблеме в рантайме, очевидно проблема кроется в чем-то другом. Под Debug на Visual Studio 2015 Update 3 вызывается, как и положено CEffectorCam::ProcessCam. Но баг я все равно вижу. Однозначно в чем-то другом. Хотя нет, у меня похоже Когда идешь по диагонали и перезаряжаешься, что-то мелькает на экране А еще есть такой: Сообщение отредактировал abramcumner - 12.11.2016, 15:18 |
|
 
|
|
12.11.2016, 16:27
Сообщение
#85
|
|
![]() Кандидат Игровых Наук Репутация: 2153
Группа: Участник Сообщений: 3488 Награды: 4 Регистрация: 27.07.2009 |
У меня только Update 1 стоит. Юзаю релизную сборку.
Вот тут код чуть более похожий на тот, что в движке - Однако тут он выдаёт корректный результат. Сейчас полез в игру в эти же самые функции, видоизменил (кастрировал) их так чтобы они примерно соответствовали примеру из rextester.com, собрал ... и в игре всё вызывается как положено. Откатил изменения - снова идёт некорректный вызов. Подсунул игре такой код: Код BOOL CAnimatorCamLerpEffector::ProcessCam(SCamEffectorInfo& info) { Msg("Test1"); // Корректно inherited::inherited::ProcessCam(info); Msg("Test2"); if(!inherited::inherited::ProcessCam(info)) return FALSE; // Некорректно И в итоге оказалось что первая строка вызывается "правильно" (CEffectorCam), а вот вторая где if уже некорректно (CAnimatorCamEffector) UPD1: Вот удалось воспроизвести ошибку - Как же так происходит? ._. Возможно ошибка кроется в том что у меня старый апдейт, к вечеру попробую обновить. (хотя на rextester то наверно самая последняя версия компилятора стоит) Хотелось-бы хотя бы заставить компилятор валиться при таких ошибках, подобно тому как это происходит в gcc. UPD2: Похоже вся проблема возникает из-за знака отрицания !, если убрать его из CAnimatorCamLerpEffector то всё опять-же работает корректно. Следует заметить что я не просто так возвращаю int а не bool, потому что сами GSC там используют макросы FALSE (int 0) и TRUE (int 1) вместо булевых значений. UPD3: Заменил все int на bool - ошибка осталась: Получается всё дело в конструкции !inherited::inherited::ProcessCam(), символ ! видимо исключает один inherited из конструкции, но почему? Сообщение отредактировал Shoкer - 12.11.2016, 16:53 -------------------- Мне просто нравятся синие буквы под сообщением.
|
|
 
|
|
12.11.2016, 17:03
Сообщение
#86
|
|
|
Игровое Воплощение Репутация: 394
Группа: Участник Сообщений: 4791 Награды: 4 Регистрация: 27.04.2011 |
Получается всё дело в конструкции !inherited::inherited::ProcessCam(), символ ! видимо исключает один inherited из конструкции, но почему? Скорее всего все дело в глюках студии или этого: Если интересно, можешь проверить дебажную сборку или в релизе отключить оптимизации. |
|
 
|
|
12.11.2016, 17:36
Сообщение
#87
|
|
![]() Кандидат Игровых Наук Репутация: 2153
Группа: Участник Сообщений: 3488 Награды: 4 Регистрация: 27.07.2009 |
Собрал только xrGame без оптимизации - ошибка осталась. Попробую ещё на третий апдейт перейти, потом отпишусь о результатах.
-------------------- Мне просто нравятся синие буквы под сообщением.
|
|
 
|
|
12.11.2016, 18:20
Сообщение
#88
|
|
![]() Игровой Бог Репутация: 648
Группа: Участник Сообщений: 5354 Награды: 9 Регистрация: 24.09.2010 |
Shoкer, самое лучшее решение - собирать в той студии (и вообще с теми же компонентами) - что и разработчики. Тогда гарантированно будет правильный результат. Да, новые студии лучше и все такое, но появляются такие баги как у тебя.
У меня например, были странные баги (ТЧ) пока не поставил SP1 на 10 студию, а именно: при нажатии на кнопку в меню "Загрузить послед. сохран. игру" игра тупо висла, а с новым xrSound вообще не запускалась (вылетала на стадии синхронизации). Но это мое имхо конечно же. Можно и потанцевать с новыми студиями, тут каждый сам решает. Сообщение отредактировал RayTwitty - 12.11.2016, 18:37 -------------------- |
|
 
|
|
12.11.2016, 20:10
Сообщение
#89
|
|
![]() Геймер Репутация: 86
Группа: Участник Сообщений: 128 Награды: 4 Регистрация: 05.05.2012 |
Вот удалось воспроизвести ошибку - да, действительно есть проблема, вот ассемблерный выхлоп проблемной строчки кода: Код ; 37 : if (!inherited::inherited::ProcessCam()) return 0; mov ecx, DWORD PTR _this$[ebp] call ?ProcessCam@CAnimatorCamEffector@@UAEHXZ; CAnimatorCamEffector::ProcessCam из которого следует, что вызывается не тот метод. решения мне в данной ситуации видится два: 1. 2. объяснить это можно тем, что С++ контекстно-зависимый язык, т.е. некоторые похожие конструкции несут совершенно различную функциональность в разных контекстах, например: Код template <int N> void f(int v) { (void *)v; } int main() { int s = 123; int k = 1234; f<11>(k); s<11>(k); return 0; } и некоторые малоочевидные конструкции могут сбивать компилятор с толку. Сообщение отредактировал refuse - 12.11.2016, 20:11 -------------------- nop
|
|
 
|
|
12.11.2016, 21:53
Сообщение
#90
|
|
![]() Кандидат Игровых Наук Репутация: 2153
Группа: Участник Сообщений: 3488 Награды: 4 Регистрация: 27.07.2009 |
> s<11>(k);
Действительно, как этот код вообще собирается Но вообще моя проблема в принципе не в том как исправить эту ошибку, а в том как выявить подобные ошибки в остальных файлах проекта, может где то есть настройка чтобы заставить компилятор\студию более строго относится к коду и ослабить его "самодеятельность"? А то есть опасения что это не единственное место в коде Сталкера с таким поведением. Сообщение отредактировал Shoкer - 12.11.2016, 21:54 -------------------- Мне просто нравятся синие буквы под сообщением.
|
|
 
|
|
12.11.2016, 21:58
Сообщение
#91
|
|
![]() Геймер Репутация: 86
Группа: Участник Сообщений: 128 Награды: 4 Регистрация: 05.05.2012 |
как это код вообще работает все просто, на самом деле это логическое выражение, расставь пробелы и сразу станет понятно как выявить подобные ошибки в остальных файлах проекта только переписывать проблемные участки кода, я бы вообще от этого тайпдефа отказался, либо использовал using из С++11. еще можно багрепорт засабмитить в мелкософт. -------------------- nop
|
|
 
|
|
12.11.2016, 22:52
Сообщение
#92
|
|
![]() Почти Игроман Репутация: 187
Группа: Участник Сообщений: 647 Награды: 4 Регистрация: 05.05.2007 |
|
|
 
|
|
27.11.2016, 22:24
Сообщение
#93
|
|
![]() Игровой Бог Репутация: 648
Группа: Участник Сообщений: 5354 Награды: 9 Регистрация: 24.09.2010 |
NodeJS
Имеется функция случайной перетасовки значений в массиве: CODE global.shuffle = function(array) { let currentIndex = array.length, temporaryValue, randomIndex // While there remain elements to shuffle... while (currentIndex) { // Pick a remaining element... randomIndex = Math.floor(Math.random() * currentIndex) currentIndex-- // And swap it with the current element. temporaryValue = array[currentIndex] array[currentIndex] = array[randomIndex] array[randomIndex] = temporaryValue } return array } попробовал запихнуть ее в прототип объекта Array, чтобы использовать как и другие стандартные функции: CODE Array.prototype.shuffle = function() { let array = this let currentIndex = array.length, temporaryValue, randomIndex // While there remain elements to shuffle... while (currentIndex) { // Pick a remaining element... randomIndex = Math.floor(Math.random() * currentIndex) currentIndex-- // And swap it with the current element. temporaryValue = array[currentIndex] array[currentIndex] = array[randomIndex] array[randomIndex] = temporaryValue } return array } но получаю какой-то бред в консоль при инициализации модуля, в котором есть использование модуля fs: Код fs.js:951 return binding.readdir(pathModule._makeLong(path), options.encoding); Аналогично этому, добавлял новые методы в прототип объекта String, все было нормально. Может быть, кто нибудь знает - что это за дичь? -------------------- |
|
 
|
|
27.11.2016, 23:04
Сообщение
#94
|
|
![]() Доктор Игровых Наук Репутация: 1084
Группа: Участник Сообщений: 3950 Награды: 6 Регистрация: 24.08.2010 |
RayTwitty, запустил твой пример, ошибок нет, нода 7.1.0.
-------------------- |
|
 
|
|
27.11.2016, 23:11
Сообщение
#95
|
|
![]() Игровой Бог Репутация: 648
Группа: Участник Сообщений: 5354 Награды: 9 Регистрация: 24.09.2010 |
запустил твой пример, ошибок нет Где-нибудь вверху есть Код const fs = require('fs') ? Без подключения этого модуля и у меня работает. Сообщение отредактировал RayTwitty - 27.11.2016, 23:11 -------------------- |
|
 
|
|
27.11.2016, 23:29
Сообщение
#96
|
|
![]() Доктор Игровых Наук Репутация: 1084
Группа: Участник Сообщений: 3950 Награды: 6 Регистрация: 24.08.2010 |
RayTwitty, есть.
-------------------- |
|
 
|
|
28.11.2016, 02:21
Сообщение
#97
|
|
![]() Почти Мастер Репутация: 75
Группа: Участник Сообщений: 1168 Награды: 4 Регистрация: 10.11.2015 |
Придумал тут, дефайны к черту, с пояса гранаты или нет, лучше задавать конфигом, а то в рев181 не берутся в пояс по дефолту(надо настраивать конфиг), и реально делаем секцию inventory_manager и там задаём: используем гранаты и патроны с пояса или нет, я думаю так удобней будет, и для отладки можно сразу проверить два варианта, так лучше и самим мододелам. Сейчас идея на компиляции.
ЗЫ Ещё интересные проблемы были, сделал перегруженный метод explode, где можно задавать вредителя, старый метод оставил для совместимости. Дак проблема была, метод explode(0) работал, а метод explode() отваливался, так как в скрипте менеджер перегруженных методов не знал какой метод выбрать или explode(u32) или explode(CScriptGameObject*), сделал ещё один перегруженный метод explode(void) который выбирает принудительно один из методов. И тут тоже проблемы были. CODE // Так не прокатило. void CScriptGameObject::explode() { explode(0); } // А так прошло. void CScriptGameObject::explode() { int zero = 0; // для однозначности вызова перегруженной функции void CScriptGameObject::explode(u32) explode(zero); } // Но сделал так. void CScriptGameObject::explode() { explode(nullptr); // для однозначности вызова перегруженной функции void CScriptGameObject::explode(CScriptGameObject *initiator) } Вот как то так. Сообщение отредактировал NanoBot-AMK - 28.11.2016, 02:23 -------------------- СТАЛКЕР только для ПК!
|
|
 
|
|
28.11.2016, 17:41
Сообщение
#98
|
|
![]() Игровой Бог Репутация: 648
Группа: Участник Сообщений: 5354 Награды: 9 Регистрация: 24.09.2010 |
1001v, пока выяснил, что такая байда при добавлении любой функции в объект массива.
Код Array.prototype.shuffle = function() { return 'test' } Подозреваю, что где-то у меня косяк, хотя и очень странный. Нода 6.9.1. Сообщение отредактировал RayTwitty - 28.11.2016, 17:41 -------------------- |
|
 
|
|
28.11.2016, 18:18
Сообщение
#99
|
|
![]() Доктор Игровых Наук Репутация: 1084
Группа: Участник Сообщений: 3950 Награды: 6 Регистрация: 24.08.2010 |
RayTwitty, сейчас проверил на 6.6.0, все также хорошо. У тебя это происходит в контексте какого-то проекта, или в отдельно взятом модуле тоже так?
-------------------- |
|
 
|
|
17.12.2016, 16:40
Сообщение
#100
|
|
![]() Игровой Бог Репутация: 648
Группа: Участник Сообщений: 5354 Награды: 9 Регистрация: 24.09.2010 |
Код Object.assign(target, ...sources) По идее, этот метод должен копировать данные (ключи и значения) из одного объекта в другой. Но у меня почему-то копируются ссылки. Т.е. при изменении target, изменения вносятся и в sources. upd: Код let obj1 = {} let obj2 = {field1: [5, 25, 100], field2: 'text'} Object.assign(obj1, obj2) // копирование obj2 в obj1 obj1.field1.splice(0, 1) // удаление первого элемента массива в obj1 console.log(JSON.stringify(obj2)) // => массив в obj2 тоже изменился! Видимо, это не глубокое копирование. Подобъекты нужно копировать вручную (в том числе и массивы, поскольку в JS, массив интерпретируется тоже как объект), например так: Код function deepCopy(obj) {
if (typeof obj != "object") return obj var copy = obj.constructor() for (var key in obj) { if (typeof obj[key] == "object") copy[key] = deepCopy(obj[key]) else copy[key] = obj[key] } return copy } Сообщение отредактировал RayTwitty - 17.12.2016, 17:10 -------------------- |
|
 
|
|
![]() ![]() |
| Текстовая версия | Сейчас: 11.03.2026, 21:46 |