ANTICHAT

ANTICHAT (https://forum.antichat.xyz/index.php)
-   Общие вопросы программирования (https://forum.antichat.xyz/forumdisplay.php?f=206)
-   -   Как передать свои аргументы в D3DCallback? (https://forum.antichat.xyz/showthread.php?t=1378864)

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

Цитата:

Сообщение от Dark_Knight

Создаешь нужную функцию для коллбека и уже в нем её вызываешь

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

Цитата:

Сообщение от Dark_Knight

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

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

Dark_Knight 14.02.2021 11:55

Цитата:

Сообщение от Ya Zaregalsya

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

Ты регистриуешь всего лишь раз коллбек и все. Он автоматически удаляется при выгрузке плагина. Все остальное время он работает и сам по себе без вызова внутри в нем кода он вообще не грузит ничего.

Ya Zaregalsya 14.02.2021 21:22

Цитата:

Сообщение от Dark_Knight

Ты регистриуешь всего лишь раз коллбек и все. Он автоматически удаляется при выгрузке плагина. Все остальное время он работает и сам по себе без вызова внутри в нем кода он вообще не грузит ничего.

Ну вот перед нами пример кода, который выполняется или нет в зависимости от значения в поле класса, если экземпляр класса ShowText будет удалён, а колбэк продолжит проверять
Код:

if (this->showTime > 0)
, то всё сломается, либо будет работать неправильно.

Ya Zaregalsya 15.02.2021 04:29

Цитата:

Сообщение от Dark_Knight

Ты регистриуешь всего лишь раз коллбек и все. Он автоматически удаляется при выгрузке плагина. Все остальное время он работает и сам по себе без вызова внутри в нем кода он вообще не грузит ничего.

Блин, нельзя делать методы класса колбэками, на них запрещено создавать указатели.

Dark_Knight 15.02.2021 20:20

Цитата:

Сообщение от Ya Zaregalsya

Блин, нельзя делать методы класса колбэками, на них запрещено создавать указатели.

Цитата:

Сообщение от Ya Zaregalsya

Ну вот перед нами пример кода, который выполняется или нет в зависимости от значения в поле класса, если экземпляр класса ShowText будет удалён, а колбэк продолжит проверять
Код:

if (this->showTime > 0)
, то всё сломается, либо будет работать неправильно.

Завези проверку на указатель, если ты используешь.

Ya Zaregalsya 16.02.2021 03:02

Цитата:

Сообщение от Dark_Knight

Завези проверку на указатель, если ты используешь.

А сделать метод класса колбэком всё-таки не получится?


Время: 19:25