VGUI: Making GameUI Panels: Difference between revisions

From Valve Developer Community
Jump to navigation Jump to search
No edit summary
No edit summary
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:pl}}
{{otherlang:en:it|VGUI:_Making_GameUI_Panels:it}}, {{otherlang:en:pl|VGUI:_Making_GameUI_Panels:pl}}
{{otherlang:en:it|VGUI:_Making_GameUI_Panels:it}}, {{otherlang:pl:en|VGUI:_Making_GameUI_Panels:en}}
[[Category:Programming]]
[[Category:Programming]]
[[Category:VGUI|M]]
[[Category:VGUI|M]]

Revision as of 10:16, 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:pl Template:Otherlang:en:it, Template:Otherlang:pl:en