 |
|

13.02.2021, 04:19
|
|
Постоянный
Регистрация: 29.05.2017
Сообщений: 394
С нами:
4714653
Репутация:
98
|
|
Представим, что нужно создать функцию, которая выводит на экран желаемый текст. Как передать его в качестве аргумента в D3DCallback (SAMPFUNCS)?
|
|
|

13.02.2021, 23:04
|
|
Флудер
Регистрация: 18.03.2013
Сообщений: 4,080
С нами:
6921957
Репутация:
183
|
|
Создаешь нужную функцию для коллбека и уже в нем её вызываешь
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
;
}
}
|
|
|

14.02.2021, 06:36
|
|
Постоянный
Регистрация: 29.05.2017
Сообщений: 394
С нами:
4714653
Репутация:
98
|
|
Сообщение от 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 не станет равно нулю. Осталось только научиться потом этот колбэк удалять.
|
|
|

14.02.2021, 07:35
|
|
Флудер
Регистрация: 18.03.2013
Сообщений: 4,080
С нами:
6921957
Репутация:
183
|
|
Ну начнем с того, что ты работаешь с СФ и тебе вообще коллбек удалять не нужно. Чтобы вызывать с любого места программы что тебе надо юзай глобальные переменые(правда херня метод) или используй пространство имен со статическими методами. Про таймер ты правильно сказал.
|
|
|

14.02.2021, 08:12
|
|
Постоянный
Регистрация: 29.05.2017
Сообщений: 394
С нами:
4714653
Репутация:
98
|
|
Сообщение от Dark_Knight
Ну начнем с того, что ты работаешь с СФ и тебе вообще коллбек удалять не нужно. Чтобы вызывать с любого места программы что тебе надо юзай глобальные переменые(правда херня метод) или используй пространство имен со статическими методами. Про таймер ты правильно сказал.
Глобальные переменные давно использую, во всех заголовочных файлах указываю extern. А почему колбэк удалять не нужно? Если этого не сделать, то каждый кадр будет вызываться обработчик и проверять не равно ли showTime нулю, это как минимум лишняя накапливающаяся нагрузка на процессор, а в определённых задачах это способно вызвать краш (если будет запрашиваться какой-то уже удалённый объект).
|
|
|

14.02.2021, 11:55
|
|
Флудер
Регистрация: 18.03.2013
Сообщений: 4,080
С нами:
6921957
Репутация:
183
|
|
Сообщение от Ya Zaregalsya
Глобальные переменные давно использую, во всех заголовочных файлах указываю extern. А почему колбэк удалять не нужно? Если этого не сделать, то каждый кадр будет вызываться обработчик и проверять не равно ли showTime нулю, это как минимум лишняя накапливающаяся нагрузка на процессор, а в определённых задачах это способно вызвать краш (если будет запрашиваться какой-то уже удалённый объект).
Ты регистриуешь всего лишь раз коллбек и все. Он автоматически удаляется при выгрузке плагина. Все остальное время он работает и сам по себе без вызова внутри в нем кода он вообще не грузит ничего.
|
|
|

14.02.2021, 21:22
|
|
Постоянный
Регистрация: 29.05.2017
Сообщений: 394
С нами:
4714653
Репутация:
98
|
|
Сообщение от Dark_Knight
Ты регистриуешь всего лишь раз коллбек и все. Он автоматически удаляется при выгрузке плагина. Все остальное время он работает и сам по себе без вызова внутри в нем кода он вообще не грузит ничего.
Ну вот перед нами пример кода, который выполняется или нет в зависимости от значения в поле класса, если экземпляр класса ShowText будет удалён, а колбэк продолжит проверять
Код:
if (this->showTime > 0)
, то всё сломается, либо будет работать неправильно.
|
|
|

15.02.2021, 04:29
|
|
Постоянный
Регистрация: 29.05.2017
Сообщений: 394
С нами:
4714653
Репутация:
98
|
|
Сообщение от Dark_Knight
Ты регистриуешь всего лишь раз коллбек и все. Он автоматически удаляется при выгрузке плагина. Все остальное время он работает и сам по себе без вызова внутри в нем кода он вообще не грузит ничего.
Блин, нельзя делать методы класса колбэками, на них запрещено создавать указатели.
|
|
|

15.02.2021, 20:20
|
|
Флудер
Регистрация: 18.03.2013
Сообщений: 4,080
С нами:
6921957
Репутация:
183
|
|
Сообщение от Ya Zaregalsya
Блин, нельзя делать методы класса колбэками, на них запрещено создавать указатели.
Сообщение от Ya Zaregalsya
Ну вот перед нами пример кода, который выполняется или нет в зависимости от значения в поле класса, если экземпляр класса ShowText будет удалён, а колбэк продолжит проверять
Код:
if (this->showTime > 0)
, то всё сломается, либо будет работать неправильно.
Завези проверку на указатель, если ты используешь.
|
|
|

16.02.2021, 03:02
|
|
Постоянный
Регистрация: 29.05.2017
Сообщений: 394
С нами:
4714653
Репутация:
98
|
|
Сообщение от Dark_Knight
Завези проверку на указатель, если ты используешь.
А сделать метод класса колбэком всё-таки не получится?
|
|
|
|
 |
|
Предыдущая тема
Следующая тема
|
Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
|
|
|
|