Просмотр полной версии : Как передать свои аргументы в D3DCallback?
Ya Zaregalsya
13.02.2021, 04:19
Представим, что нужно создать функцию, которая выводит на экран желаемый текст. Как передать его в качестве аргумента в D3DCallback (SAMPFUNCS)?
Dark_Knight
13.02.2021, 23:04
Создаешь нужную функцию для коллбека и уже в нем её вызываешь
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
14.02.2021, 06:36
Создаешь нужную функцию для коллбека и уже в нем её вызываешь
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
14.02.2021, 07:35
Ну начнем с того, что ты работаешь с СФ и тебе вообще коллбек удалять не нужно. Чтобы вызывать с любого места программы что тебе надо юзай глобальные переменые(правда херня метод) или используй пространство имен со статическими методами. Про таймер ты правильно сказал.
Ya Zaregalsya
14.02.2021, 08:12
Ну начнем с того, что ты работаешь с СФ и тебе вообще коллбек удалять не нужно. Чтобы вызывать с любого места программы что тебе надо юзай глобальные переменые(правда херня метод) или используй пространство имен со статическими методами. Про таймер ты правильно сказал.
Глобальные переменные давно использую, во всех заголовочных файлах указываю extern. А почему колбэк удалять не нужно? Если этого не сделать, то каждый кадр будет вызываться обработчик и проверять не равно ли showTime нулю, это как минимум лишняя накапливающаяся нагрузка на процессор, а в определённых задачах это способно вызвать краш (если будет запрашиваться какой-то уже удалённый объект).
Dark_Knight
14.02.2021, 11:55
Глобальные переменные давно использую, во всех заголовочных файлах указываю extern. А почему колбэк удалять не нужно? Если этого не сделать, то каждый кадр будет вызываться обработчик и проверять не равно ли showTime нулю, это как минимум лишняя накапливающаяся нагрузка на процессор, а в определённых задачах это способно вызвать краш (если будет запрашиваться какой-то уже удалённый объект).
Ты регистриуешь всего лишь раз коллбек и все. Он автоматически удаляется при выгрузке плагина. Все остальное время он работает и сам по себе без вызова внутри в нем кода он вообще не грузит ничего.
Ya Zaregalsya
14.02.2021, 21:22
Ты регистриуешь всего лишь раз коллбек и все. Он автоматически удаляется при выгрузке плагина. Все остальное время он работает и сам по себе без вызова внутри в нем кода он вообще не грузит ничего.
Ну вот перед нами пример кода, который выполняется или нет в зависимости от значения в поле класса, если экземпляр класса ShowText будет удалён, а колбэк продолжит проверять
if (this->showTime > 0)
, то всё сломается, либо будет работать неправильно.
Ya Zaregalsya
15.02.2021, 04:29
Ты регистриуешь всего лишь раз коллбек и все. Он автоматически удаляется при выгрузке плагина. Все остальное время он работает и сам по себе без вызова внутри в нем кода он вообще не грузит ничего.
Блин, нельзя делать методы класса колбэками, на них запрещено создавать указатели.
Dark_Knight
15.02.2021, 20:20
Блин, нельзя делать методы класса колбэками, на них запрещено создавать указатели.
Ну вот перед нами пример кода, который выполняется или нет в зависимости от значения в поле класса, если экземпляр класса ShowText будет удалён, а колбэк продолжит проверять
if (this->showTime > 0)
, то всё сломается, либо будет работать неправильно.
Завези проверку на указатель, если ты используешь.
Ya Zaregalsya
16.02.2021, 03:02
Завези проверку на указатель, если ты используешь.
А сделать метод класса колбэком всё-таки не получится?
Dark_Knight
16.02.2021, 03:37
А сделать метод класса колбэком всё-таки не получится?
Не городи костылей там, где костыли это норма.
vBulletin® v3.8.14, Copyright ©2000-2026, vBulletin Solutions, Inc. Перевод: zCarot