Difference between revisions of "VGUI: Making GameUI Panels"

From Valve Developer Community
Jump to: navigation, search
(Polish version)
Line 1: Line 1:
 
==Resource\UI\TestPanel.res==
 
==Resource\UI\TestPanel.res==
Here's an example of a panel you want to show when a command is issued at any time:
+
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==
Add the following after the includes:
+
Dodaj to następująco po Includach:
 
  class IGameUI
 
  class IGameUI
 
  {
 
  {
Line 92: Line 92:
 
  };\
 
  };\
 
  extern IGameUI *globalPanel
 
  extern IGameUI *globalPanel
  //Doesn't use panelClassName but has it to base code on copy and paste work
+
  //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())
 
   
 
   
  //only the prototype for AlignPanel exists
+
  //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 must be the last include file in a .cpp file!!!  
+
  // 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();//keep in mind, hl2 supports widescreen
+
  CenterThisPanelOnScreen();//Zapamiętaj, HL2 wspiera panoramiczne ekrany
  SetVisible(false);//made visible on command later
+
  SetVisible(false);//Widoczna na polecenie później
 
   
 
   
 
  //Other useful options
 
  //Other useful options
Line 152: Line 152:
 
  }  
 
  }  
  
See how much the defines reduced the coding for testpanel.cpp and testpanel.h?
+
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==
Now that we have the framework for the panel...
+
Teraz mamy system dla panelu...
  
First go to the header includes and '''add your testpanel.h to the list of includes''' so you can access your newly created panel.
+
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
  
Scroll down to VGui_CreateGlobalPanels and add this after the second line:
+
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 );  
  
The GameUI panel is what we're going to be making our panels in
+
Panel GameUI jest tym co użyjemy do robienia naszych paneli
  
In the same function, add this to the list of Creates:
+
W tej samej funkcji, dodaj to do listy "Creates":
 
  test->Create( uiParent );  
 
  test->Create( uiParent );  
  
Scroll down a little until you get to VGui_Shutdown and add this to the list of Destroys:
+
Zjedź troche na dół, aż do VGui_Shutdown i dodaj to do listy zniszczonych (Destroys):
 
  test->Destroy();
 
  test->Destroy();
  
==Conclusion==
+
==Konkluzja==
Now we have a panel that's created during startup, destroyed on shutdown, and accessible through a command.
+
Teraz mamy panel tworzony podczas włączania, niszczony podczas wyłączania, i dostępny przez komende.
Keep these in mind though:
+
Zapamiętaj to:
* You don't have to use a frame for the panel
+
* Nie musisz używać ramki dla panelu
* You can make it so the command to show it can't close it also
+
* Możesz to zrobić, że komenda otworzy to ale już nie może zamknąć tego
* 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
+
* 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
  
Here's an example of what can be done based on this code:<br>
+
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 17: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:
Gameui.jpg Template:Otherlang:en Template:Otherlang:en:it