 |
|

21.12.2016, 11:56
|
|
Постоянный
Регистрация: 26.05.2013
Сообщений: 692
С нами:
6822856
Репутация:
213
|
|
Сообщение от Potniy
Что лучше : загружать текстуру или рендрить ? Пример: текстура 500х500px синяя или же DrawBox ?
Лучше самому отрисовать, но средствами DX9 (вертекс буффером).
|
|
|

27.12.2016, 23:52
|
|
Познающий
Регистрация: 26.12.2016
Сообщений: 61
С нами:
4936063
Репутация:
58
|
|
Наведите на правильную мысль, вот к примеру есть функция отрисовки:
C++:
Код:
bool
CALLBACK
Present
(
CONST RECT
*
pSourceRect
,
CONST RECT
*
pDestRect
,
HWND hDestWindowOverride
,
CONST RGNDATA
*
pDirtyRegion
)
{
if
(
SUCCEEDED
(
SF
->
getRender
(
)
->
BeginRender
(
)
)
)
// если рендерер готов к рисованию
{
// рисуем
SF
->
getRender
(
)
->
DrawBox
(
50
,
500
,
100
,
250
,
D3DCOLOR_ARGB
(
255
,
0
,
255
,
0
)
)
;
SF
->
getRender
(
)
->
EndRender
(
)
;
// завершаем рисование
}
;
return
true
;
// возвращаем положительный результат
}
;
В mainloop() я хочу сделать следующее:
C++:
Код:
if
(
SF
->
getGame
(
)
->
isKeyPressed
(
'H'
)
)
// если нажата клавиша H (англ)
{
SF
->
getRender
(
)
->
registerD3DCallback
(
eDirect3DDeviceMethods
::
D3DMETHOD_PRESENT
,
Present
)
;
//Рисую блок
pFont
=
SF
->
getRender
(
)
->
CreateNewFont
(
"Tahoma"
,
12
,
FCR_BORDER
)
;
pFont
->
Print
(
"текст"
,
D3DCOLOR_ARGB
(
255
,
255
,
255
,
0
)
,
45
,
505
,
false
)
;
//Добавляю к нему текст
}
;
Но сам вопрос, как мне скрывать этот блок при нажатии на другую клавишу? Я так понимаю надо будет вывести переменную глобально со статусом блока, но вот как убрать отрисованый блок это я не нашел в API.
И ещё сразу вопрос, когда я делаю сначала SF->getRender()->registerD3DCallback а потом текст, то я текст не вижу, а если в функцию добавлю текст:
C++:
Код:
if
(
SUCCEEDED
(
SF
->
getRender
(
)
->
BeginRender
(
)
)
)
// если рендерер готов к рисованию
{
// рисуем
SF
->
getRender
(
)
->
DrawBox
(
50
,
500
,
100
,
250
,
D3DCOLOR_ARGB
(
255
,
0
,
255
,
0
)
)
;
pFont
=
SF
->
getRender
(
)
->
CreateNewFont
(
"Tahoma"
,
12
,
FCR_BORDER
)
;
pFont
->
Print
(
"текст"
,
D3DCOLOR_ARGB
(
255
,
255
,
255
,
0
)
,
45
,
505
,
false
)
;
//Добавляю к нему текст
SF
->
getRender
(
)
->
EndRender
(
)
;
// завершаем рисование
}
;
То рисует текст поверх блока и вылетает клиент, как разместить нормально текст на блоке?
|
|
|

28.12.2016, 00:45
|
|
Постоянный
Регистрация: 10.01.2016
Сообщений: 922
С нами:
5441999
Репутация:
133
|
|
Сообщение от Jadson
но вот как убрать отрисованый блок это я не нашел в API.
Он сам пропадает если перестать его рисовать
Сообщение от Jadson
И ещё сразу вопрос
Шрифт достаточно создать один раз, где нибудь в цикле mainloop перед init = true;
|
|
|

28.12.2016, 00:56
|
|
Познающий
Регистрация: 26.12.2016
Сообщений: 61
С нами:
4936063
Репутация:
58
|
|
Сообщение от BlackKnigga
Он сам пропадает если перестать его рисовать
SF->getRender()->EndRender(); // завершаем рисование
Я так понял о этом речь? Но вот сейчас я нажал клавишу, появился блок и он уже не пропадает даже если я выхожу в меню, что я тогда не так делаю?
|
|
|

28.12.2016, 01:07
|
|
Постоянный
Регистрация: 10.01.2016
Сообщений: 922
С нами:
5441999
Репутация:
133
|
|
Сообщение от Jadson
SF->getRender()->EndRender(); // завершаем рисование
Я так понял о этом речь? Но вот сейчас я нажал клавишу, появился блок и он уже не пропадает даже если я выхожу в меню, что я тогда не так делаю?
Ты нажал клавишу и зарегистрировал коллбек (registerD3DCallback) который рисует постоянно. Это не вызов рисования единожды. Чтобы перестать рисовать тебе нужно перестать выполнять функции рисования в методе Present (DrawBox и Print).
|
|
|

28.12.2016, 01:09
|
|
Участник форума
Регистрация: 14.05.2014
Сообщений: 149
С нами:
6314183
Репутация:
68
|
|
Сообщение от Jadson
SF->getRender()->EndRender(); // завершаем рисование
Я так понял о этом речь? Но вот сейчас я нажал клавишу, появился блок и он уже не пропадает даже если я выхожу в меню, что я тогда не так делаю?
(Для примера)
Насчёт меню - делай проверку, замени:
Код:
Код:
if (SUCCEEDED(SF->getRender()->BeginRender()))
на
Код:
Код:
if (SUCCEEDED(SF->getRender()->BeginRender()) && !SF->getGame()->isGTAMenuActive())
Аналогично с отображением, сделай глобальную переменную, к примеру, bool render и делай проверку на true/false:
Код:
Код:
if (SUCCEEDED(SF->getRender()->BeginRender()) && !SF->getGame()->isGTAMenuActive() && render == true)
|
|
|

28.12.2016, 01:18
|
|
Познающий
Регистрация: 26.12.2016
Сообщений: 61
С нами:
4936063
Репутация:
58
|
|
Сообщение от BlackKnigga
Ты нажал клавишу и зарегистрировал коллбек (registerD3DCallback) который рисует постоянно. Это не вызов рисования единожды.
Как тогда вызвать рисование 1 раз? Вопросов много, а доки нет, поэтому извиняйте.
И ещё вопрос, в консоли в игре есть дебаг мод, я могу отправлять сообщения в консоль вместо вывода в чат к примеру сообщения о том что происходит?
|
|
|

28.12.2016, 01:34
|
|
Флудер
Регистрация: 18.03.2013
Сообщений: 4,080
С нами:
6921957
Репутация:
183
|
|
1 раз? 1 раз - это один кард.Я конечно все понимаю, что у каждого свои увлечения, но зачем делать приложения под винды с убунты?
|
|
|

28.12.2016, 01:42
|
|
Познающий
Регистрация: 26.12.2016
Сообщений: 61
С нами:
4936063
Репутация:
58
|
|
Сообщение от Dark_Knight
1 раз? 1 раз - это один кард.Я конечно все понимаю, что у каждого свои увлечения, но зачем делать приложения под винды с убунты?
Ну на работе у меня Ubuntu+Windows, но т.к. я работаю в Ubuntu то думал и это учить там же не перегружаясь, в SAMP я иногда захожу через Wine . Дома там же 2 операционки, но т.к. дома в основном с WIndows тут проблем нет, работаю с под неё.
|
|
|

28.12.2016, 02:59
|
|
Новичок
Регистрация: 05.12.2016
Сообщений: 2
С нами:
4966293
Репутация:
3
|
|
Есть диалог 2-ого стиля(LIST), нужно после его закрытия вывести номер последней выделенной строки. Но если диалог был закрыт с помощью ESC ничего не выводить.
C++:
Код:
if
(
SF
->
getGame
(
)
->
isKeyPressed
(
VK_NUMPAD0
)
)
{
char
buf2
[
128
]
;
char
buf1
[
]
=
"Test"
;
sprintf
(
buf2
,
"[%d]\n[%d]\n[%d]\n[%d]\n[%d]"
,
0
,
1
,
2
,
3
,
4
)
;
SF
->
getSAMP
(
)
->
getDialog
(
)
->
ShowDialog
(
1
,
2
,
buf1
,
buf2
,
"Enter"
,
""
)
;
dialogWasActive
=
1
;
}
if
(
SF
->
getGame
(
)
->
isKeyPressed
(
VK_ESCAPE
)
)
{
dialogWasActive
=
0
;
SF
->
getSAMP
(
)
->
getChat
(
)
->
AddChatMessage
(
D3DCOLOR_XRGB
(
0
,
0xAA
,
0
)
,
"esc"
)
;
}
if
(
!
(
SF
->
getSAMP
(
)
->
getDialog
(
)
->
iIsActive
)
&
(
dialogWasActive
==
1
)
)
{
int
item
=
SF
->
getSAMP
(
)
->
getDialog
(
)
->
ListBoxGetIndex
(
)
;
SF
->
getSAMP
(
)
->
getChat
(
)
->
AddChatMessage
(
D3DCOLOR_XRGB
(
0
,
0xAA
,
0
)
,
"item = %d"
,
item
)
;
dialogWasActive
=
0
;
}
Вроде всё правильно, но isKeyPressed(VK_ESCAPE) не работает в диалоге.
|
|
|
|
 |
|
|
Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
|
|
|
|