HOME FORUMS MEMBERS RECENT POSTS LOG IN  
× Авторизация
Имя пользователя:
Пароль:
Нет аккаунта? Регистрация
Баннер 1   Баннер 2
НОВЫЕ ТОРГОВАЯ НОВОСТИ ЧАТ
loading...
Скрыть
Вернуться   ANTICHAT > ПРОГРАММИРОВАНИЕ > Общие вопросы программирования
   
Ответ
 
Опции темы Поиск в этой теме Опции просмотра

  #1  
Старый 13.02.2021, 04:19
Ya Zaregalsya
Постоянный
Регистрация: 29.05.2017
Сообщений: 394
С нами: 4714653

Репутация: 98
По умолчанию

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

  #2  
Старый 13.02.2021, 23:04
Dark_Knight
Флудер
Регистрация: 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
;
}
}
 
Ответить с цитированием

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

  #4  
Старый 14.02.2021, 07:35
Dark_Knight
Флудер
Регистрация: 18.03.2013
Сообщений: 4,080
С нами: 6921957

Репутация: 183


По умолчанию

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

  #5  
Старый 14.02.2021, 08:12
Ya Zaregalsya
Постоянный
Регистрация: 29.05.2017
Сообщений: 394
С нами: 4714653

Репутация: 98
По умолчанию

Цитата:
Сообщение от Dark_Knight  

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

  #6  
Старый 14.02.2021, 11:55
Dark_Knight
Флудер
Регистрация: 18.03.2013
Сообщений: 4,080
С нами: 6921957

Репутация: 183


По умолчанию

Цитата:
Сообщение от Ya Zaregalsya  

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

  #7  
Старый 14.02.2021, 21:22
Ya Zaregalsya
Постоянный
Регистрация: 29.05.2017
Сообщений: 394
С нами: 4714653

Репутация: 98
По умолчанию

Цитата:
Сообщение от Dark_Knight  

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

  #8  
Старый 15.02.2021, 04:29
Ya Zaregalsya
Постоянный
Регистрация: 29.05.2017
Сообщений: 394
С нами: 4714653

Репутация: 98
По умолчанию

Цитата:
Сообщение от Dark_Knight  

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

  #9  
Старый 15.02.2021, 20:20
Dark_Knight
Флудер
Регистрация: 18.03.2013
Сообщений: 4,080
С нами: 6921957

Репутация: 183


По умолчанию

Цитата:
Сообщение от Ya Zaregalsya  

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

Ну вот перед нами пример кода, который выполняется или нет в зависимости от значения в поле класса, если экземпляр класса ShowText будет удалён, а колбэк продолжит проверять
Код:
if (this->showTime > 0)
, то всё сломается, либо будет работать неправильно.
Завези проверку на указатель, если ты используешь.
 
Ответить с цитированием

  #10  
Старый 16.02.2021, 03:02
Ya Zaregalsya
Постоянный
Регистрация: 29.05.2017
Сообщений: 394
С нами: 4714653

Репутация: 98
По умолчанию

Цитата:
Сообщение от Dark_Knight  

Завези проверку на указатель, если ты используешь.
А сделать метод класса колбэком всё-таки не получится?
 
Ответить с цитированием
Ответ



Предыдущая тема Следующая тема

Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 


Быстрый переход




ANTICHAT ™ © 2001- Antichat Kft.