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

  #1  
Старый 11.02.2021, 01:26
ANZR
Участник форума
Регистрация: 03.08.2019
Сообщений: 168
С нами: 3568604

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

Даров ребят, кто шарит

Крч, сижу на c++, решил создать интерфейс на чистом рендере. Все бы заебись, но вот вопрос)

в getRender такой функции нету, делал сам

У меня примерно вышло вот так

с++:





Код:
void
CreateButton
(
int
posX
,
int
posY
,
int
Width
,
int
Height
,
D3DCOLOR StandartColor
,
D3DCOLOR PressedButton
)
// Создание кнопки и ее функции
{
GetCursorPos
(
&
cursorPos
)
;
if
(
cursorPos
.
x
>
posX
&&
cursorPos
.
x

posY
&&
cursorPos
.
y

getRender
(
)
->
DrawBox
(
posX
,
posY
,
Width
,
Height
,
PressedButton
)
;
}
else
{
SF
->
getRender
(
)
->
DrawBox
(
posX
,
posY
,
Width
,
Height
,
StandartColor
)
;
}
}


Не бейте, если код ***ня, однако для этого я вашей помощи и прошу

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

  #2  
Старый 11.02.2021, 03:12
kin4stat
Флудер
Регистрация: 06.11.2017
Сообщений: 2,759
С нами: 4483143

Репутация: 183


По умолчанию

Накидал небольшой класс:

C++:





Код:
class
Button
{
public
:
float
x
,
y
,
w
,
h
;
bool
state
;
Button
(
float
_x
,
float
_y
,
float
_w
,
float
_h
)
:
x
(
_x
)
,
y
(
_y
)
,
w
(
_w
)
,
h
(
_h
)
,
state
(
false
)
{
}
void
Draw
(
)
{
if
(
this
->
state
)
{
state
=
false
;
return
SF
->
getRender
(
)
->
DrawBox
(
posX
,
posY
,
Width
,
Height
,
PressedButton
)
;
}
return
SF
->
getRender
(
)
->
DrawBox
(
posX
,
posY
,
Width
,
Height
,
StandartColor
)
;
}
bool
HandleClick
(
float
x
,
float
y
)
noexcept
{
if
(
(
this
->
x

x
)
&&
(
this
->
y

y
)
)
{
return
state
=
true
;
}
return
state
=
false
;
}
}


Можно еще сделать типа пула, только он урежет твою мобильность:

C++:





Код:
class
ButtonPool
{
std
::
vector

Buttons
;
unsigned
int
CreateButton
(
float
x
,
float
y
,
float
w
,
float
h
)
{
this
->
Buttons
.
push_back
(
new
Button
(
x
,
y
,
w
,
h
)
)
;
return
this
->
Buttons
.
size
(
)
-
1
;
}
void
HandleClick
(
LPARAM lParam
)
noexcept
{
float
x
=
GET_X_LPARAM
(
lParam
)
;
float
y
=
GET_Y_LPARAM
(
lParam
)
;
for
(
auto
&
i
:
this
->
Buttons
)
{
i
->
HandleClick
(
x
,
y
)
;
}
}
void
Draw
(
)
{
for
(
auto
&
i
:
this
->
Buttons
)
{
i
->
Draw
(
)
;
}
}
void
DeleteButton
(
unsigned
int
id
)
{
this
->
Buttons
.
erase
(
this
->
Buttons
.
begin
(
)
+
id
)
;
}
}


Также при удалении кнопки, придется все иды смещать самому.

Касательно класса кнопки, чтобы обрабатывать нажатия, запихнуть в WndProc под такими условиями:

C++:





Код:
switch
(
uMsg
)
{
case
WM_LBUTTONDOWN
:
{
float
x
=
GET_X_LPARAM
(
lParam
)
;
float
y
=
GET_Y_LPARAM
(
lParam
)
;
Button
::
HandleClick
(
x
,
y
)
;
}
}


Ща налетят всякие мемиры и человечики, и скажут что говно
 
Ответить с цитированием

  #3  
Старый 11.02.2021, 20:22
ANZR
Участник форума
Регистрация: 03.08.2019
Сообщений: 168
С нами: 3568604

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

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

Накидал небольшой класс:

C++:





Код:
class
Button
{
public
:
float
x
,
y
,
w
,
h
;
bool
state
;
Button
(
float
_x
,
float
_y
,
float
_w
,
float
_h
)
:
x
(
_x
)
,
y
(
_y
)
,
w
(
_w
)
,
h
(
_h
)
,
state
(
false
)
{
}
void
Draw
(
)
{
if
(
this
->
state
)
{
state
=
false
;
return
SF
->
getRender
(
)
->
DrawBox
(
posX
,
posY
,
Width
,
Height
,
PressedButton
)
;
}
return
SF
->
getRender
(
)
->
DrawBox
(
posX
,
posY
,
Width
,
Height
,
StandartColor
)
;
}
bool
HandleClick
(
float
x
,
float
y
)
noexcept
{
if
(
(
this
->
x

x
)
&&
(
this
->
y

y
)
)
{
return
state
=
true
;
}
return
state
=
false
;
}
}


Можно еще сделать типа пула, только он урежет твою мобильность:

C++:





Код:
class
ButtonPool
{
std
::
vector

Buttons
;
unsigned
int
CreateButton
(
float
x
,
float
y
,
float
w
,
float
h
)
{
this
->
Buttons
.
push_back
(
new
Button
(
x
,
y
,
w
,
h
)
)
;
return
this
->
Buttons
.
size
(
)
-
1
;
}
void
HandleClick
(
LPARAM lParam
)
noexcept
{
float
x
=
GET_X_LPARAM
(
lParam
)
;
float
y
=
GET_Y_LPARAM
(
lParam
)
;
for
(
auto
&
i
:
this
->
Buttons
)
{
i
->
HandleClick
(
x
,
y
)
;
}
}
void
Draw
(
)
{
for
(
auto
&
i
:
this
->
Buttons
)
{
i
->
Draw
(
)
;
}
}
void
DeleteButton
(
unsigned
int
id
)
{
this
->
Buttons
.
erase
(
this
->
Buttons
.
begin
(
)
+
id
)
;
}
}


Также при удалении кнопки, придется все иды смещать самому.

Касательно класса кнопки, чтобы обрабатывать нажатия, запихнуть в WndProc под такими условиями:

C++:





Код:
switch
(
uMsg
)
{
case
WM_LBUTTONDOWN
:
{
float
x
=
GET_X_LPARAM
(
lParam
)
;
float
y
=
GET_Y_LPARAM
(
lParam
)
;
Button
::
HandleClick
(
x
,
y
)
;
}
}


Ща налетят всякие мемиры и человечики, и скажут что говно
Кстати, по поводу WindowProc

Все написал, робит отменно. Однако есть проблема

Если я с ним отключу sf плагин через консоль, сначала ничего, но при повторном отключении игра крашит

Если не понял, я про команду pfree

Знаешь, с чем это связано?
 
Ответить с цитированием

  #4  
Старый 11.02.2021, 21:55
barspinoff
Участник форума
Регистрация: 14.06.2015
Сообщений: 126
С нами: 5744580

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

никогда не обрабатывай нажатие на вызове WM_LBUTTONDOWN, только WM_LBUTTONUP
 
Ответить с цитированием

  #5  
Старый 11.02.2021, 22:34
ANZR
Участник форума
Регистрация: 03.08.2019
Сообщений: 168
С нами: 3568604

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

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

никогда не обрабатывай нажатие на вызове WM_LBUTTONDOWN, только WM_LBUTTONUP
Чего это так? Да я через WM_LBUTTONUP и сделал

Можешь сказать, в чем разница?
 
Ответить с цитированием

  #6  
Старый 11.02.2021, 22:37
MeG@LaDo[N] ^_^
Участник форума
Регистрация: 21.07.2020
Сообщений: 280
С нами: 3059886

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

как по мне проще подключить какой то гуи,и не ебатся
 
Ответить с цитированием

  #7  
Старый 12.02.2021, 00:05
kin4stat
Флудер
Регистрация: 06.11.2017
Сообщений: 2,759
С нами: 4483143

Репутация: 183


По умолчанию

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

Чего это так? Да я через WM_LBUTTONUP и сделал
Можешь сказать, в чем разница?
WM_LBUTTONDOWN будет спамить пока зажата кнопка мыши
 
Ответить с цитированием

  #8  
Старый 12.02.2021, 02:26
barspinoff
Участник форума
Регистрация: 14.06.2015
Сообщений: 126
С нами: 5744580

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

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

switch (uMsg) { case WM_LBUTTONDOWN: { float x = GET_X_LPARAM(lParam); float y = GET_Y_LPARAM(lParam); Button::HandleClick(x, y); } }
Цитата:
Сообщение от KiN4StAt  

WM_LBUTTONDOWN будет спамить пока зажата кнопка мыши
хорошо сказал
 
Ответить с цитированием

  #9  
Старый 12.02.2021, 04:41
kin4stat
Флудер
Регистрация: 06.11.2017
Сообщений: 2,759
С нами: 4483143

Репутация: 183


По умолчанию

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

хорошо сказал
Я на это и расчитывал -_-
 
Ответить с цитированием
Ответ



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

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


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




ANTICHAT ™ © 2001- Antichat Kft.