VGUI: Making GameUI Panels: Difference between revisions
Jump to navigation
Jump to search
No edit summary |
m (Reverted edit of Pgmaker, changed back to last version by Ts2do) |
||
Line 1: | Line 1: | ||
==Resource\UI\TestPanel.res== | |||
Here's an example of a panel you want to show when a command is issued at any time: | |||
"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== | |||
Add the following after the includes: | |||
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 | |||
//Doesn't use panelClassName but has it to base code on copy and paste work | |||
#define PanelGlobals(className,panelClassName,globalPanel)\ | |||
static className g_##className##Panel;\ | |||
IGameUI *globalPanel = (IGameUI *)&g_##className##Panel | |||
#define ToggleVisibility(panel)\ | |||
panel->SetVisible(!panel->IsVisible()) | |||
//only the prototype for AlignPanel exists | |||
#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 must be the last include file in a .cpp file!!! | |||
#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();//keep in mind, hl2 supports widescreen | |||
SetVisible(false);//made visible on command later | |||
//Other useful options | |||
//SetSizeable(false); | |||
//SetMoveable(false); | |||
} | |||
See how much the defines reduced the coding for testpanel.cpp and testpanel.h? | |||
==cl_dll\vgui_int.cpp== | |||
Now that we have the framework for the panel... | |||
Go to the includes and add testpanel.h | |||
Scroll down to VGui_CreateGlobalPanels and add this after the second line: | |||
VPANEL uiParent = enginevgui->GetPanel( PANEL_GAMEUIDLL ); | |||
The GameUI panel is what we're going to be making our panels in | |||
In the same function, add this to the list of Creates: | |||
test->Create( uiParent ); | |||
Scroll down a little until you get to VGui_Shutdown and add this to the list of Destroys: | |||
test->Destroy(); | |||
==Conclusion== | |||
Now we have a panel that's created during startup, destroyed on shutdown, and accessible through a command. | |||
Keep these in mind though: | |||
* You don't have to use a frame for the panel | |||
* You can make it so the command to show it can't close it also | |||
* You can make it so the panel is created once the command is issued, and destroyed once it's closed, so it doesn't have to sit in the memory | |||
Here's an example of what can be done based on this code:<br> | |||
[[Image:Gameui.jpg]] | |||
[[Category:Programming]] | |||
[[Category:VGUI]] |
Revision as of 11:01, 8 February 2006
Resource\UI\TestPanel.res
Here's an example of a panel you want to show when a command is issued at any time:
"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
Add the following after the includes:
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 //Doesn't use panelClassName but has it to base code on copy and paste work #define PanelGlobals(className,panelClassName,globalPanel)\ static className g_##className##Panel;\ IGameUI *globalPanel = (IGameUI *)&g_##className##Panel #define ToggleVisibility(panel)\ panel->SetVisible(!panel->IsVisible()) //only the prototype for AlignPanel exists #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 must be the last include file in a .cpp file!!! #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();//keep in mind, hl2 supports widescreen SetVisible(false);//made visible on command later //Other useful options //SetSizeable(false); //SetMoveable(false); }
See how much the defines reduced the coding for testpanel.cpp and testpanel.h?
cl_dll\vgui_int.cpp
Now that we have the framework for the panel...
Go to the includes and add testpanel.h
Scroll down to VGui_CreateGlobalPanels and add this after the second line:
VPANEL uiParent = enginevgui->GetPanel( PANEL_GAMEUIDLL );
The GameUI panel is what we're going to be making our panels in
In the same function, add this to the list of Creates:
test->Create( uiParent );
Scroll down a little until you get to VGui_Shutdown and add this to the list of Destroys:
test->Destroy();
Conclusion
Now we have a panel that's created during startup, destroyed on shutdown, and accessible through a command. Keep these in mind though:
- You don't have to use a frame for the panel
- You can make it so the command to show it can't close it also
- You can make it so the panel is created once the command is issued, and destroyed once it's closed, so it doesn't have to sit in the memory