VGUI: Making GameUI Panels: Difference between revisions
No edit summary |
(Polish version) |
||
| Line 1: | Line 1: | ||
==Resource\UI\TestPanel.res== | ==Resource\UI\TestPanel.res== | ||
Oto przykład panelu, kiedy wydana jest komenda w każdym czasie: | |||
"Resource/UI/TestPanel.res" | "Resource/UI/TestPanel.res" | ||
{ | { | ||
| Line 56: | Line 56: | ||
==cl_dll\vgui_helpers.h== | ==cl_dll\vgui_helpers.h== | ||
Dodaj to następująco po Includach: | |||
class IGameUI | class IGameUI | ||
{ | { | ||
| Line 92: | Line 92: | ||
};\ | };\ | ||
extern IGameUI *globalPanel | extern IGameUI *globalPanel | ||
// | //Nie używaj panelClassName ale skopiuj to i wklej do głównego kodu | ||
#define PanelGlobals(className,panelClassName,globalPanel)\ | #define PanelGlobals(className,panelClassName,globalPanel)\ | ||
static className g_##className##Panel;\ | static className g_##className##Panel;\ | ||
| Line 100: | Line 100: | ||
panel->SetVisible(!panel->IsVisible()) | panel->SetVisible(!panel->IsVisible()) | ||
// | //Tylko prototyp AlignPanel istnieje | ||
#define CenterThisPanelOnScreen()\ | #define CenterThisPanelOnScreen()\ | ||
int x,w,h;\ | int x,w,h;\ | ||
| Line 131: | Line 131: | ||
#include "cbase.h" | #include "cbase.h" | ||
#include "testpanel.h" | #include "testpanel.h" | ||
// memdbgon | // memdbgon Musi być ostatnim zincludowanym plikiem w pliku .cpp !!! | ||
#include "tier0/memdbgon.h" | #include "tier0/memdbgon.h" | ||
PanelGlobals(CTest,CTestPanel,test); | PanelGlobals(CTest,CTestPanel,test); | ||
| Line 144: | Line 144: | ||
SetScheme( scheme ); | SetScheme( scheme ); | ||
LoadControlSettings("Resource/UI/TestPanel.res"); | LoadControlSettings("Resource/UI/TestPanel.res"); | ||
CenterThisPanelOnScreen();// | CenterThisPanelOnScreen();//Zapamiętaj, HL2 wspiera panoramiczne ekrany | ||
SetVisible(false);// | SetVisible(false);//Widoczna na polecenie później | ||
//Other useful options | //Other useful options | ||
| Line 152: | Line 152: | ||
} | } | ||
Widzisz jak dużo definicji zostało zdredukowanych dla programowania dla testpanel.cpp i testpanel.h? | |||
==cl_dll\vgui_int.cpp== | ==cl_dll\vgui_int.cpp== | ||
Teraz mamy system dla panelu... | |||
Wpierw idź do nagłówka zawartości (Includes) '''Dodaj twój testpanel.h do listy includów (includes)''' i możesz mieć dostęp do swojego nowego panelu | |||
Zjedź na dół do VGui_CreateGlobalPanels and i dodaj to po drugiej lini: | |||
VPANEL uiParent = enginevgui->GetPanel( PANEL_GAMEUIDLL ); | VPANEL uiParent = enginevgui->GetPanel( PANEL_GAMEUIDLL ); | ||
Panel GameUI jest tym co użyjemy do robienia naszych paneli | |||
W tej samej funkcji, dodaj to do listy "Creates": | |||
test->Create( uiParent ); | test->Create( uiParent ); | ||
Zjedź troche na dół, aż do VGui_Shutdown i dodaj to do listy zniszczonych (Destroys): | |||
test->Destroy(); | test->Destroy(); | ||
== | ==Konkluzja== | ||
Teraz mamy panel tworzony podczas włączania, niszczony podczas wyłączania, i dostępny przez komende. | |||
Zapamiętaj to: | |||
* | * Nie musisz używać ramki dla panelu | ||
* | * Możesz to zrobić, że komenda otworzy to ale już nie może zamknąć tego | ||
* | * Możesz to zrobić, że panel będzie stworzony jednorazowo poprzez wydanie komendy, i znoszczone jednorazowo poprzez zamknięcie tego, więc nie musi to siedzieć w pamięci | ||
Tu jest przykład co możemy zrobić bazując na tym kodzie:<br> | |||
[[Image:Gameui.jpg]] | [[Image:Gameui.jpg]] | ||
{{otherlang:en}} | {{otherlang:en}} | ||
Revision as of 10:06, 16 January 2010
Resource\UI\TestPanel.res
Oto przykład panelu, kiedy wydana jest komenda w każdym czasie:
"Resource/UI/TestPanel.res"
{
"testpanel"
{
"ControlName" "CTestPanel"
"fieldName" "testpanel"
"title" "Test Panel"
"xpos" "0"
"ypos" "0"
"wide" "200"
"tall" "200"
"autoResize" "0"
"pinCorner" "0"
"visible" "1"
"enabled" "1"
"tabPosition" "0"
}
"Label1"
{
"ControlName" "Label"
"fieldName" "Label1"
"xpos" "8"
"ypos" "32"
"wide" "200"
"tall" "175"
"wrap" "1"
"autoResize" "0"
"pinCorner" "0"
"visible" "1"
"enabled" "1"
"tabPosition" "0"
"labelText" "An example label inside of an example frame"
"textAlignment" "north"
"dulltext" "0"
"brighttext" "0"
}
"close"
{
"ControlName" "Button"
"fieldName" "close"
"xpos" "68"
"ypos" "168"
"wide" "64"
"tall" "24"
"labelText" "#GameUI_Close"
"Command" "Close"
"autoResize" "0"
"pinCorner" "0"
"visible" "1"
"enabled" "1"
"tabPosition" "0"
}
}
cl_dll\vgui_helpers.h
Dodaj to następująco po Includach:
class IGameUI
{
public:
virtual void Create( vgui::VPANEL parent ) = 0;
virtual void Destroy( void ) = 0;
virtual vgui::Panel *GetPanel(void) = 0;
};
#define DeclarePanel(className,panelClassName,globalPanel)\
class className : public IGameUI\
{\
private:\
panelClassName *myPanel;\
public:\
className(void)\
{\
myPanel = NULL;\
}\
void Create( vgui::VPANEL parent )\
{\
myPanel = new panelClassName( parent );\
}\
void Destroy( void )\
{\
if(myPanel)\
{\
myPanel->SetParent( (vgui::Panel *)NULL );\
delete myPanel;\
}\
}\
vgui::Panel *GetPanel(void)\
{\
return myPanel;\
}\
};\
extern IGameUI *globalPanel
//Nie używaj panelClassName ale skopiuj to i wklej do głównego kodu
#define PanelGlobals(className,panelClassName,globalPanel)\
static className g_##className##Panel;\
IGameUI *globalPanel = (IGameUI *)&g_##className##Panel
#define ToggleVisibility(panel)\
panel->SetVisible(!panel->IsVisible())
//Tylko prototyp AlignPanel istnieje
#define CenterThisPanelOnScreen()\
int x,w,h;\
GetBounds(x,x,w,h);\
SetPos((ScreenWidth()-w)/2,(ScreenHeight()-h)/2)
#define CenterPanelOnScreen(panel)\
int x,w,h;\
panel->GetBounds(x,x,w,h);\
panel->SetPos((panel->ScreenWidth()-w)/2,(panel->ScreenHeight()-h)/2)
cl_dll\testpanel.h
#ifndef TESTPANEL_H
#define TESTPANEL_H
#ifdef _WIN32
#pragma once
#endif
#include "vgui_helpers.h"
#include <vgui_controls/Frame.h>
using namespace vgui;
class CTestPanel : public Frame
{
DECLARE_CLASS_SIMPLE(CTestPanel,Frame);
public:
CTestPanel( vgui::VPANEL parent );
};
DeclarePanel(CTest,CTestPanel,test);
#endif // TESTPANEL_H
cl_dll\testpanel.cpp
#include "cbase.h"
#include "testpanel.h"
// memdbgon Musi być ostatnim zincludowanym plikiem w pliku .cpp !!!
#include "tier0/memdbgon.h"
PanelGlobals(CTest,CTestPanel,test);
CON_COMMAND(ToggleTestPanel,NULL)
{
ToggleVisibility(test->GetPanel());
}
CTestPanel::CTestPanel( vgui::VPANEL parent ) : BaseClass( NULL, "testpanel" )
{
SetParent(parent);
vgui::HScheme scheme = vgui::scheme()->LoadSchemeFromFile("resource/SourceScheme.res", "SourceScheme");
SetScheme( scheme );
LoadControlSettings("Resource/UI/TestPanel.res");
CenterThisPanelOnScreen();//Zapamiętaj, HL2 wspiera panoramiczne ekrany
SetVisible(false);//Widoczna na polecenie później
//Other useful options
//SetSizeable(false);
//SetMoveable(false);
}
Widzisz jak dużo definicji zostało zdredukowanych dla programowania dla testpanel.cpp i testpanel.h?
cl_dll\vgui_int.cpp
Teraz mamy system dla panelu...
Wpierw idź do nagłówka zawartości (Includes) Dodaj twój testpanel.h do listy includów (includes) i możesz mieć dostęp do swojego nowego panelu
Zjedź na dół do VGui_CreateGlobalPanels and i dodaj to po drugiej lini:
VPANEL uiParent = enginevgui->GetPanel( PANEL_GAMEUIDLL );
Panel GameUI jest tym co użyjemy do robienia naszych paneli
W tej samej funkcji, dodaj to do listy "Creates":
test->Create( uiParent );
Zjedź troche na dół, aż do VGui_Shutdown i dodaj to do listy zniszczonych (Destroys):
test->Destroy();
Konkluzja
Teraz mamy panel tworzony podczas włączania, niszczony podczas wyłączania, i dostępny przez komende. Zapamiętaj to:
- Nie musisz używać ramki dla panelu
- Możesz to zrobić, że komenda otworzy to ale już nie może zamknąć tego
- Możesz to zrobić, że panel będzie stworzony jednorazowo poprzez wydanie komendy, i znoszczone jednorazowo poprzez zamknięcie tego, więc nie musi to siedzieć w pamięci
Tu jest przykład co możemy zrobić bazując na tym kodzie:
Template:Otherlang:en
Template:Otherlang:en:it