Laziz Опубликовано 12 сентября, 2014 Поделиться Опубликовано 12 сентября, 2014 LPDIRECT3DBASETEXTURE9 BTEX = NULL;vector<DWORD> BASETEX;pDev->GetTexture(0, &BTEX);Found = false;for (UINT i = 0; i < BASETEX.size(); i++){ if (BASETEX[i] == (DWORD)BTEX) { Found = true; }}Что именно сравнивает оператор if в этом коде? Ссылка на комментарий Поделиться на другие сайты Поделиться
keng Опубликовано 12 сентября, 2014 Поделиться Опубликовано 12 сентября, 2014 /*----------------------------------------------------------------------------*/ Привет!Сравнивает, равны ли BASETEX и (DWORD)BTEX. Первое - элемент массива (как видно выше - вектора, но сути это не меняет) BASETEX по индексу i, второе - значение переменной BTEX, приведённое к типу DWORD, так как элементы BASETEX тоже имеют тип DWORD. /*----------------------------------------------------------------------------*/ Ссылка на комментарий Поделиться на другие сайты Поделиться
Laziz Опубликовано 12 сентября, 2014 Автор Поделиться Опубликовано 12 сентября, 2014 Привет КенгBaseTexture BTEX;BTEX = device.GetTexture(0);List<BaseTexture> BASETEX = new List<BaseTexture>(); found = false;foreach (BaseTexture item in BASETEX){ if (item == BTEX) { found = true; }}if (found == false){ BASETEX.Add(BTEX);}почему вот тут, это не проходить? то есть, оператор if никогда не получает "TRUE". (Я уже ВЕСь мозг сломал за два дня) Ссылка на комментарий Поделиться на другие сайты Поделиться
MasterGH Опубликовано 12 сентября, 2014 Поделиться Опубликовано 12 сентября, 2014 Я так понял проблема перевода с С++ на С# Список из List<BaseTexture> BASETEX перед началом цикла каждый раз инициируется и уже абсолютно пустой. Судя по коду цикл ищет текстуру и естественно не может найти. Поэтому found всегда будет false. На C# у шаблонного класса List<T> есть функция проверки вхождения bool List<T>.Contains<T>(), которая возвратит результат. Вот так бы это выглядело на движке Unity3DList<Texture2D> listTexture2d = new List<Texture2D>();void TryAddTexture(Texture2D texture2D){ if(!listTexture2d.Contains(someTexture)){ listTexture2d.Add(); } }void Start(){ // Запускается один раз var someTexture1 = new Texture2D(10,10); var someTexture2 = new Texture2D(10,10); TryAddTexture(someTexture1); TryAddTexture(someTexture2);} Ссылка на комментарий Поделиться на другие сайты Поделиться
Laziz Опубликовано 12 сентября, 2014 Автор Поделиться Опубликовано 12 сентября, 2014 Я так понял проблема перевода с С++ на С# Список из List<BaseTexture> BASETEX перед началом цикла каждый раз инициируется и уже абсолютно пустой. Судя по коду цикл ищет текстуру и естественно не может найти. Поэтому found всегда будет false. Привет MasterGH, я немного не так показал код, извиняюсь, все пременные глобалны и они заного не инициализируеться, то есть вот так:BaseTexture BTEX;BTEX = device.GetTexture(0);List<BaseTexture> BASETEX = new List<BaseTexture>();int DrawIndexedPrimitiveHook(IntPtr devicePtr, SharpDX.Direct3D9.PrimitiveType primitiveType, ...){ found = false; foreach (BaseTexture item in BASETEX) { if (item == BTEX) { found = true; } } if (found == false) { BASETEX.Add(BTEX); }}вот наглядное видео: На C# у шаблонного класса List<T> есть функция проверки вхождения bool List<T>.Contains<T>(), которая возвратит результат. Вот так бы это выглядело на движке Unity3DList<Texture2D> listTexture2d = new List<Texture2D>();void TryAddTexture(Texture2D texture2D){ if(!listTexture2d.Contains(someTexture)){ listTexture2d.Add(); } }void Start(){ // Запускается один раз var someTexture1 = new Texture2D(10,10); var someTexture2 = new Texture2D(10,10); TryAddTexture(someTexture1); TryAddTexture(someTexture2);}Эту сейчас проверю, но сомневаюсь что поможет... по тому что, на ровном месте не сравниваеть! Ссылка на комментарий Поделиться на другие сайты Поделиться
MasterGH Опубликовано 12 сентября, 2014 Поделиться Опубликовано 12 сентября, 2014 Имеет смысл не меняя этот код (на видео) попробовать его на той же игре, что на видео. Обязательно! Первым делом! Только тот код и только та игра. Проверь внимательно совпадает ли он с тем что на видео. Если не успешно, то искать причину логируя в файл ключевые моменты, а именно, проверка на null текстуру, прохождение тех или иных условий. Все пусть логируется. Если логи слишком частые, то хотя бы первые пару тысяч строк лога. Если успешно, то пробовать на разных играх. Если опять не успешно, то обязательно разобраться с тем что и какая строчка кода делает (вообще желательно в любом случае разобраться), какой результат должна возвратить, сравнить логи. Попробуй использовать визуальный отладчик этой dll в чужом процессе игры. Мне что-то помниться, что реально прямо из студии. Поставишь бряк, да и посмотришь состояние переменных и регистров. Если не знаешь как, то придется вести логи в файл или в текст в gui. Ссылка на комментарий Поделиться на другие сайты Поделиться
Laziz Опубликовано 12 сентября, 2014 Автор Поделиться Опубликовано 12 сентября, 2014 Имеет смысл не меняя этот код (на видео) попробовать его на той же игре, что на видео. Обязательно! Первым делом! Только тот код и только та игра. Проверь внимательно совпадает ли он с тем что на видео. Если не успешно, то искать причину логируя в файл ключевые моменты, а именно, проверка на null текстуру, прохождение тех или иных условий. Все пусть логируется. Если логи слишком частые, то хотя бы первые пару тысяч строк лога. Если успешно, то пробовать на разных играх. Если опять не успешно, то обязательно разобраться с тем что и какая строчка кода делает (вообще желательно в любом случае разобраться), какой результат должна возвратить, сравнить логи. Попробуй использовать визуальный отладчик этой dll в чужом процессе игры. Мне что-то помниться, что реально прямо из студии. Поставишь бряк, да и посмотришь состояние переменных и регистров. Если не знаешь как, то придется вести логи в файл или в текст в gui.Спасибо за советы, логгировал все что возможно, все нормально, проверка на NULL проходить, то есть все инициализируеться. Не ожиданно ответил сам создатель SharpDX (Alexandre Mutel), не ожидал потому что, вопрос задавал через гугл переводчик думал не поймет. вот ответ:"You need to compare the item.NativePointer. COM Objects are not cached" Что значить "COM Objects are not cached"? ну... перевод понял но, смысл не понял. Я COM Objects не зняю Ссылка на комментарий Поделиться на другие сайты Поделиться
Coder Опубликовано 12 сентября, 2014 Поделиться Опубликовано 12 сентября, 2014 DirectX не существует для C# как такового, всё это лишь managed обёртка над unmanged кодом (с++ либой DX).Так вот, тебе нужно сравнивать не указали этих объектов C#, а указатели нативных объектов DX. Ссылка на комментарий Поделиться на другие сайты Поделиться
Laziz Опубликовано 12 сентября, 2014 Автор Поделиться Опубликовано 12 сентября, 2014 Ну почти сделал, осталось некоторые нюансы. Спасибо всем! 1 Ссылка на комментарий Поделиться на другие сайты Поделиться
Рекомендуемые сообщения