Как передать свои аргументы в D3DCallback?

Ya Zaregalsya

Известный
Автор темы
370
131
Представим, что нужно создать функцию, которая выводит на экран желаемый текст. Как передать его в качестве аргумента в D3DCallback (SAMPFUNCS)?
 

Dark_Knight

Me, me and me.
Друг
4,056
2,074
Создаешь нужную функцию для коллбека и уже в нем её вызываешь
C++:
//Примерный код от балды и параметры могу в реале быть другими
void Draw(){
    //render text here
}

bool CALLBACK Present(const RECT* pSourceRect, const RECT* pDestRect, HWND hDestWindowOverride, const RGNDATA* pDirtyRegion){
    Draw();
    return true;
}

void mainloop(){
    static bool init = false;
    if(!init){
        SF->getRender()->registerD3DCallback(D3DMETHOD_PRESENT, Present);
        init = true;
    }
}
 
  • Нравится
Реакции: Ya Zaregalsya

Ya Zaregalsya

Известный
Автор темы
370
131
Создаешь нужную функцию для коллбека и уже в нем её вызываешь
C++:
//Примерный код от балды и параметры могу в реале быть другими
void Draw(){
    //render text here
}

bool CALLBACK Present(const RECT* pSourceRect, const RECT* pDestRect, HWND hDestWindowOverride, const RGNDATA* pDirtyRegion){
    Draw();
    return true;
}

void mainloop(){
    static bool init = false;
    if(!init){
        SF->getRender()->registerD3DCallback(D3DMETHOD_PRESENT, Present);
        init = true;
    }
}
Давно не работал с рендером. Почудилось, что с ним можно работать примерно как с потоком: получать хэндл и по необходимости разрушать. А так да, смысла создавать более одной функции present нет, соответственно и свои аргументы туда совать бесполезно.

Но в таком случае вопрос не отпадает, а только усложняется. Приведённый Вами вариант конечно добавляет немножко удобства, но не решает основную задачу. Нужна функция вида showText(std::string text, int showTime), которую можно было бы вызывать из любой области программы.

Попробую сделать эту функцию конструктором класса ShowText, который будет вызывать собственный метод Present, который, в свою очередь будет рисовать текст до тех пор, пока поле showTime не станет равно нулю. Осталось только научиться потом этот колбэк удалять.
 

Dark_Knight

Me, me and me.
Друг
4,056
2,074
Ну начнем с того, что ты работаешь с СФ и тебе вообще коллбек удалять не нужно. Чтобы вызывать с любого места программы что тебе надо юзай глобальные переменые(правда херня метод) или используй пространство имен со статическими методами. Про таймер ты правильно сказал.
 

Ya Zaregalsya

Известный
Автор темы
370
131
Ну начнем с того, что ты работаешь с СФ и тебе вообще коллбек удалять не нужно. Чтобы вызывать с любого места программы что тебе надо юзай глобальные переменые(правда херня метод) или используй пространство имен со статическими методами. Про таймер ты правильно сказал.
Глобальные переменные давно использую, во всех заголовочных файлах указываю extern. А почему колбэк удалять не нужно? Если этого не сделать, то каждый кадр будет вызываться обработчик и проверять не равно ли showTime нулю, это как минимум лишняя накапливающаяся нагрузка на процессор, а в определённых задачах это способно вызвать краш (если будет запрашиваться какой-то уже удалённый объект).
 

Dark_Knight

Me, me and me.
Друг
4,056
2,074
Глобальные переменные давно использую, во всех заголовочных файлах указываю extern. А почему колбэк удалять не нужно? Если этого не сделать, то каждый кадр будет вызываться обработчик и проверять не равно ли showTime нулю, это как минимум лишняя накапливающаяся нагрузка на процессор, а в определённых задачах это способно вызвать краш (если будет запрашиваться какой-то уже удалённый объект).
Ты регистриуешь всего лишь раз коллбек и все. Он автоматически удаляется при выгрузке плагина. Все остальное время он работает и сам по себе без вызова внутри в нем кода он вообще не грузит ничего.
 

Ya Zaregalsya

Известный
Автор темы
370
131
Ты регистриуешь всего лишь раз коллбек и все. Он автоматически удаляется при выгрузке плагина. Все остальное время он работает и сам по себе без вызова внутри в нем кода он вообще не грузит ничего.
Ну вот перед нами пример кода, который выполняется или нет в зависимости от значения в поле класса, если экземпляр класса ShowText будет удалён, а колбэк продолжит проверять if (this->showTime > 0), то всё сломается, либо будет работать неправильно.
 

Ya Zaregalsya

Известный
Автор темы
370
131
Ты регистриуешь всего лишь раз коллбек и все. Он автоматически удаляется при выгрузке плагина. Все остальное время он работает и сам по себе без вызова внутри в нем кода он вообще не грузит ничего.
Блин, нельзя делать методы класса колбэками, на них запрещено создавать указатели.
 

Dark_Knight

Me, me and me.
Друг
4,056
2,074
Блин, нельзя делать методы класса колбэками, на них запрещено создавать указатели.
Ну вот перед нами пример кода, который выполняется или нет в зависимости от значения в поле класса, если экземпляр класса ShowText будет удалён, а колбэк продолжит проверять if (this->showTime > 0), то всё сломается, либо будет работать неправильно.
Завези проверку на указатель, если ты используешь.
 
  • Нравится
Реакции: Ya Zaregalsya