PDA

Просмотр полной версии : [Информация] Для Юных Создателей Меню\Читов.


Devil™
28.06.2013, 17:52
Всем привет,с вами Devil :3
Сегодня я хочу выложить и объяснить код для вашего исходника.
На данный момент я разберу только код обычной кнопки.
Так же,вы можете данный материал использовать для чек кнопки.(Check Button)
И так,начёнм.

1.Ознакомление с кодом из паблик исходников.

В "паблик" исходниках,вам встретиться давольно ужасный\непонятный\хардкорный код,который вы не сразу-то и поймёте,да и разбираться в нём безполезно ,ибо ничего умного там нет.
Код который вам попадёться ,выглядит так :
Func_Button(int x ,int y , int w , int h ,int &Var ,char *Button_Text ,LPDIRECT3DDEVICE9 pDevice)
{
int y_ = (y) + (h/2)-7;
int x_ = x + 3+20;
int y__ = ((h) - (h/1));
int x__ = (x + w/1);
if(IsInBox(x,y,w,h))
{
if(GetAsyncKeyState(VK_LBUTTON)&1)
{
if(Var == 1 && Var !=0)
{
Var = 0;
}
else if(Var == 0)
{
if(Var == 0)
{
Var = 1;
}
}
}
}
if(Var == 0)
{
DrawBox(x_-26,y_,268,18, GRE2, pDevice);
//DrawBox(x_-27,y_+9,113,8.7, ButtonOff2, pDevice);
DrawBorder(x-3,y+2,268,h-2,BLACK, pDevice);
font->DrawText(x_+30,y_,TextOn,Button_Text,DT_CENTER|DT_ SHADOW);
}
if(Var == 1)
{
DrawBox(x_-27,y_,113,9, ButtonOn, pDevice);
DrawBox(x_-27,y_+9,113,8.7, ButtonOn2, pDevice);
DrawBorder(x-5,y+2,113,h-2,RED2, pDevice);
font->DrawText(x_+30,y_,TextOn,Button_Text,DT_CENTER|DT_ SHADOW);
}
}
Всё это очень грузит цп,и вообще нафиг никому не нужно.

Поэтому перейдём ко 2 части нашей темы.


2.Делаем "грамотный" код.

Сейчас мы будем делать "Грамотный код",который более-менее читается.
Для начала обьявим "Тело",для нашего кода.
void Кнопка(int x,int y,int w,int h,bool &Var,char *Text,LPDIRECT3DDEVICE9 pDevice)
{

}

Мы сделали "тело" , для кода,и теперь давайте запишем туда наводку муши на кнопку.
void Кнопка(int x,int y,bool &Var,char *Text,LPDIRECT3DDEVICE9 pDevice)
{
if(IsInBox(x,y,w,h))
{

}
}
Так,это мы сделали ,теперь перейдём к коду :" Нажатие левой кнопки мыши",для этого мы запишем внутри "IsInBox" вот это :

if(GetAsyncKeyState(VK_LBUTTON)&1)
{

}
Целиком всё будет выглядить так :
void Кнопка(int x,int y,bool &Var,char *Text,LPDIRECT3DDEVICE9 pDevice)
{
if(IsInBox(x,y,w,h))
{
if(GetAsyncKeyState(VK_LBUTTON)&1)
{

}
}
}
После мы в это место
if(GetAsyncKeyState(VK_LBUTTON)&1)
{
ТУТ
}
Пишем вот это :
Var=!Var;
Дальше,мы объявляем ДаблВордом(DWORD),цвета которые будут использоваться ,да бы сократить код,и по 100 раз не писать новый бокс и т.д.
Перед if(IsInBox(x,y,w,h))
Пишем это :

DWORD Col1;
DWORD Col2;

Код будет выглядить так :
void Кнопка(int x,int y,bool &Var,char *Text,LPDIRECT3DDEVICE9 pDevice)
{
DWORD Col1;
DWORD Col2;

if(IsInBox(x,y,w,h))
{
if(GetAsyncKeyState(VK_LBUTTON)&1)
{
Var=!Var;
}
}
}
Дальше,мы рисуем бокс,и текст(Основу кнопки,и текст ,который будет в названии кнопки).
void Кнопка(int x,int y,bool &Var,char *Text,LPDIRECT3DDEVICE9 pDevice)
{
DWORD Col1;
DWORD Col2;

if(IsInBox(x,y,w,h))
{
if(GetAsyncKeyState(VK_LBUTTON)&1)
{
Var=!Var;
}
}
Text(Text,,y,Col2,DT_CENTER|DT_NOCLIP);
DrawBox(x,y,w,h,Col1,pDevice);
}
И теперь используем DWORD'ы,для манипуляции над цветом того или иного состояния кнопки.
void Кнопка(int x,int y,bool &Var,char *Text,LPDIRECT3DDEVICE9 pDevice)
{
DWORD Col1 = RED;
DWORD Col2 = WHITE;
if(IsInBox(x,y,w,h))
{
Col1 = BLACK;
Col2 = DEEPSKYBLUE;
if(GetAsyncKeyState(VK_LBUTTON)&1)
{
Var=!Var;
}
}
Text(Text,,y,Col2,DT_CENTER|DT_NOCLIP);
DrawBox(x,y,w,h,Col1,pDevice);
}
В этом коде,я присвоил значиние к DWORD ,цвета ,которым будет у нас кнопка выключенная.
И потом,просто изменял цвета,когда кнопка находиться в том или ином состоянии.

Ещё надо дописать что у нас будет,когда кнопка будет включена!
void Кнопка(int x,int y,bool &Var,char *Text,LPDIRECT3DDEVICE9 pDevice)
{
DWORD Col1 = RED;
DWORD Col2 = WHITE;
if(IsInBox(x,y,w,h))
{
Col1 = BLACK;
Col2 = DEEPSKYBLUE;
if(GetAsyncKeyState(VK_LBUTTON)&1)
{
Var=!Var;
}
}
if (Var==1)
{
Col1=BLACK;
Col2= BLUE;
}
Text(Text,,y,Col2,DT_CENTER|DT_NOCLIP);
DrawBox(x,y,w,h,Col1,pDevice);
}

Вроде бы всё,теперь используем кнопку так :
Кнопка(10,10,Test,"Название", pDevice);
Не забываем объявить переменную :
bool Test;
Всё,с вами был Devil , прошу помидорами не кидаться,тему писал для новичков в сфере Создания меню\читов ......
За некоторые ошибки прошу так же не ругаться,писал быстро,и не проверял(текст много).
Всем пока:)

Если надо,то напишу пояснения к коду:с

qwertyujhgb
28.06.2013, 19:25
Извини меня,опытный менюшкостроитель,но чем первый код грузит цп,в отличии от второго?
По моему они ни чем существенно не отличаются.
ну кроме того,что кто-то в первом коде написал
else if(var==0)
{
if(var==0)
{

Devil™
28.06.2013, 19:49
Извини меня,опытный менюшкостроитель,но чем первый код грузит цп,в отличии от второго?
По моему они ни чем существенно не отличаются.
ну кроме того,что кто-то в первом коде написал
else if(var==0)
{
if(var==0)
{
Не это написал,а это
if(Var == 1 && Var !=0)
{
Var = 0;
}
else if(Var == 0)
{
if(Var == 0)
{
Var = 1;
}
}
}
}
И я не опытный,просто помочь хочу.

[Teest]
28.06.2013, 22:15
Зачем писать
void Кнопка(.....)
Ведь на русском писать это не есть очень хорошо.

Devil™
28.06.2013, 22:21
;4676878']Зачем писать

Ведь на русском писать это не есть очень хорошо.

Для примера написал:)

Добавлено через 5 минут
Ну вот,писал,старался,а в ответ толпы коментов с негативом:с

iamzero
29.06.2013, 00:56
if(IsInBox(x,y,w,h))
{
if(GetAsyncKeyState(VK_LBUTTON)&1)
{
Var=!Var;
}
}
}

зачем двойной if? не ужеле в с++ нельзя использовать &&?

мб я не прав но

if(IsInBox(x,y,w,h) && (GetAsyncKeyState(VK_LBUTTON)&1))
{Var!=Var}




PS если не прав и в СПП так нельзя, звиняйте...

Тигрь
29.06.2013, 07:45
зачем двойной if? не ужеле в с++ нельзя использовать &&?

мб я не прав но

if(IsInBox(x,y,w,h) && (GetAsyncKeyState(VK_LBUTTON)&1))
{Var!=Var}




PS если не прав и в СПП так нельзя, звиняйте...

Естественно можно, но он этого не знает. Книжек соответственно по с++ он не читал, а только дергает малопонятный ему код из чужих исходников, не зная принципов того же сплайсинга который используется в перехвате D3D, да что там сплайсинг, даже массивы для него проблема. И мало понимает о том про что он пытается объяснить, судя из первого поста. Ну и плюс оформление кода в одну линию без отступов это просто жесть.

Annedroid
29.06.2013, 09:15
if(IsInBox(x,y,w,h) && (GetAsyncKeyState(VK_LBUTTON)&1))
Вот как меня раздражает этот метод...
Неужели никто не хочет написать централизованный класс мыши, чтобы все было гораздо лучше?
Да и вот GetAsyncKeyState проверяет в таком условии только одно нажатие, а если накрутка или прокрутка, то как вам быть?

Dimedrol1536
29.06.2013, 10:21
if(IsInBox(x,y,w,h))
А это что такое?
У меня необъявленный индентификатор, как быть?
Если пишеш, пиши полностью.

Devil™
29.06.2013, 11:16
Так братцы кролики,вы давайте потише с комментариями,и зачем надо лезть в любую затычку,чтобы сунуть свой код?Смысл?Думаете исправят?Нет.....
Комменты без смысла.

Dimedrol1536
29.06.2013, 11:50
Так братцы кролики,вы давайте потише с комментариями,и зачем надо лезть в любую затычку,чтобы сунуть свой код?Смысл?Думаете исправят?Нет.....
Комменты без смысла.
Что-то ты какойто не понятный.

Для того, у кого этого нету)
BOOL IsInBox(int x,int y,int w,int h)
{
POINT MousePosition;
GetCursorPos(&MousePosition);
ScreenToClient(GetForegroundWindow(),&MousePosition);
return(MousePosition.x >= x && MousePosition.x <= x + w && MousePosition.y >= y && MousePosition.y <= y + h);
}

Dimedrol1536
29.06.2013, 12:49
Devil™, У каждого, у кого есть комп, есть мышка. /dgs
Ты начал разъяснять функцию, так будь добр, довести дело до конца.

BLACK_DEAD
02.07.2013, 23:48
Да и вот GetAsyncKeyState проверяет в таком условии только одно нажатие, а если накрутка или прокрутка, то как вам быть?
наверно так

//================================================== ================================================== =========
void Button_PM(char *Button_Text,int &Var,char **typ,int max,int x,int y,LPDIRECT3DDEVICE9 pDevice)//Класс Кнопки
{
//================================================== ====
if(IsInBox(x,y,125,16)){//Координаты наведения и нажатия кнопки
//================================================== ====
DrawBox(x,y,125,16,BLACK2,pDevice);//Наведение
//================================================== ====
if(GetAsyncKeyState(VK_RBUTTON)){
if(Var!=0){Var--;Sleep(100);}}
if(GetAsyncKeyState(VK_LBUTTON)){
if(Var>=0 && Var<max){Var++;Sleep(100);}}}
DrawBox(x,y,125,16,DARK20,pDevice);
DrawBorder(x,y,125,16,DARK20,pDevice);
font->DrawText(x+63,y+1,WHITE,Button_Text,DT_CENTER|DT_S HADOW);
font->DrawText(x+99,y+1,WHITE,typ[Var],DT_SHADOW);
}


bool Test;
почему булл?булл обычно равен true или false, а у тебя тут включению.Или я не догоняю с++

Annedroid
03.07.2013, 11:02
Sleep(100)
А вот это не выход.
Лучше используй GetTickCount( ), будет подобие таймера.