Arma: GUI Configuration: Difference between revisions
m (ArmA uses font Zeppelin32)  | 
				Dr Eyeball (talk | contribs)   | 
				||
| Line 311: | Line 311: | ||
=== Polymorphism ===  | === Polymorphism ===  | ||
=== Inheritance ===  | |||
<!-- added by Dr_Eyeball. Example not tested. 11 May 2007. Modify it as you see fit, but don't forget this important topic. -->  | |||
Using inheritance can reduce your dialog class definitions significantly by standardising common attributes in base classes and just changing unique attributes in derived classes. There is no need to redeclare all attributes for each class definition.  | |||
* '''Example:'''  | |||
<code><nowiki>class RscText  | |||
{  | |||
  type = CT_STATIC;  | |||
  idc = -1;  | |||
  style = ST_LEFT;  | |||
  colorBackground[] = {0, 0, 0, 1};  | |||
  colorText[] = {1, 1, 1, 1};  | |||
  font = FontM;  | |||
  sizeEx = 0.04;  | |||
  h = 0.04;  | |||
  text = "";  | |||
};  | |||
class My_BlueText: RscText  | |||
{  | |||
  colorText[] = {0, 0, 1, 1};  | |||
  x = 0.1;  | |||
  w = 0.4;  | |||
};  | |||
class My_Dialog  | |||
{  | |||
  //...  | |||
  controls[] =  | |||
  {  | |||
    My_Text_1,  | |||
    My_Text_2  | |||
    //...    | |||
  };  | |||
  class My_Text_1: My_BlueText  | |||
  {  | |||
    text = "Line 1";  | |||
    y = 0.2;    | |||
  };  | |||
  class My_Text_2: My_BlueText  | |||
  {  | |||
    text = "Line 2";  | |||
    y = 0.25;    | |||
  };  | |||
  //...  | |||
};  | |||
</nowiki></code>  | |||
Revision as of 07:58, 11 May 2007
Feel free to make changes though, even if it currently resides in Manny's personal namespace.
-- Manny 15:49, 6 May 2007 (CEST)Introduction
Dialogs are one way to provide custom graphical user interface in your missions and allow interaction with the player aswell as they are able to run code. They are defined as classes in the description.ext file.
Notice: If you change your description.ext file while the mission is still open in the editor, you will have to restart the editor and load the mission again so the changes actually take effect.
Warning: If there are syntactic errors in your description.ext file (e.g. incorrect spelling of keywords), then the game will simply crash while processing the file, stating the nature and location of the error that caused it.
Most of these definitions work with numeric constants, which are presented in the following section. For readability purposes you should consider favoring them instead of the actual integers.
- Positions and dimensions (x, y, w, h) aswell as font sizes are relative to the screen (and not pixel values), ranging from 0.0 to 1.0; 0.0 means 0% of the screen width (e.g. the left side of the screen in the context of x or y, or 0% length in the context of width and height). This makes font sizes usually a very small number (~0.02). Keep this in mind.
 - Colors are usually defined in the following convention: { Red, Green, Blue, Alpha }, each ranging from 0.0 to 1.0 aswell.
 - Sounds are usually defined in the following convention: { "file.ogg", volume, ??? }, whereas volume ranges from 0.0 to 1.0.
 
You can find a complete list of scripting related GUI functions in Category:Command Group: GUI Control.
Constants
These are constants generally used to maintain a certain degree of readability. They represent integer values for use with type and style properties of controls. You can also define other constants, e.g. the font name.
// Control types
#define CT_STATIC           0
#define CT_BUTTON           1
#define CT_EDIT             2
#define CT_SLIDER           3
#define CT_COMBO            4
#define CT_LISTBOX          5
#define CT_TOOLBOX          6
#define CT_CHECKBOXES       7
#define CT_PROGRESS         8
#define CT_HTML             9
#define CT_STATIC_SKEW      10
#define CT_ACTIVETEXT       11
#define CT_TREE             12
#define CT_STRUCTURED_TEXT  13
#define CT_CONTEXT_MENU     14
#define CT_CONTROLS_GROUP   15
#define CT_XKEYDESC         40
#define CT_XBUTTON          41
#define CT_XLISTBOX         42
#define CT_XSLIDER          43
#define CT_XCOMBO           44
#define CT_ANIMATED_TEXTURE 45
#define CT_OBJECT           80
#define CT_OBJECT_ZOOM      81
#define CT_OBJECT_CONTAINER 82
#define CT_OBJECT_CONT_ANIM 83
#define CT_LINEBREAK        98
#define CT_USER             99
#define CT_MAP              100
#define CT_MAP_MAIN         101
// Static styles
#define ST_POS            0x0F
#define ST_HPOS           0x03
#define ST_VPOS           0x0C
#define ST_LEFT           0x00
#define ST_RIGHT          0x01
#define ST_CENTER         0x02
#define ST_DOWN           0x04
#define ST_UP             0x08
#define ST_VCENTER        0x0c
#define ST_TYPE           0xF0
#define ST_SINGLE         0
#define ST_MULTI          16
#define ST_TITLE_BAR      32
#define ST_PICTURE        48
#define ST_FRAME          64
#define ST_BACKGROUND     80
#define ST_GROUP_BOX      96
#define ST_GROUP_BOX2     112
#define ST_HUD_BACKGROUND 128
#define ST_TILE_PICTURE   144
#define ST_WITH_RECT      160
#define ST_LINE           176
#define FontM             "Zeppelin32"
Notice: All examples within this article use these constants. If you do not include them, or name them differently, these examples won't work 1:1.
Dialogs
Dialogs are parent containers for the actual controls it contains. Their definition contains several properties on the controls it contains, how the dialog can be addressed, and whether or not the player is able to continue regular movement while the dialog is shown.
They can be defined in the description.ext file or externalized to seperate hpp-files, which are included in the description.ext file using the #include preprocessor directive. The latter method is generally a good idea to split a large description.ext file into several small chunks in order to keep track of what's where.
Most often, controls of a dialog are defined within the definition of the dialog itself, though it's a good practice to generalize common controls in a base definition in the global scope. See best practice for details. For simplicity we won't apply this practice in the following code examples.
| Properties | ||
|---|---|---|
| Name | Type | Remark | 
| idd | integer | the unique ID number of this dialog. can be -1 if you don't require access to the dialog itself from within a script. | 
| movingEnable | boolean | sets whether or not the player is hindered from aiming or moving while the dialog is open. | 
| controlsBackground | array | contains class names of all background controls associated to this dialog. | 
| controls | array | contains class names of all foreground controls associated to this dialog. | 
| objects | array | |
Setting the idd property to a non-negative (i.e. "useful") number is only required if you want to access the dialog itself via the findDisplay function. Accessing the dialog itself via the idd property though does not mean that you can implicitely access the controls within the dialog. For that you will have to rely on the control's idc properties. Hence, in most basic cases you won't need it and -1 should be sufficient.
Here's an example of a dialog that will only display Hello world in the top right corner of the screen. If you get confused by the MyHelloText class, just ignore it for the moment until you have read details on the definition of controls in the following chapter, Controls.
- Example:
 
class MyHelloWorldDialog {
	idd = -1;   // set to -1, because we don't require a unique ID
	movingEnable = false;   // no movement while the dialog is shown
	controlsBackground[] = { };   // no background controls needed
	objects[] = { };   // no objects needed
	controls[] = { MyHelloText };   // our Hello World text as seen below:
	
	class MyHelloText {
		idc = -1;   // set to -1, unneeded
		type = CT_STATIC;   // constant
		style = ST_LEFT;   // constant
		text = "Hello world";
		font = FontM;
		sizeEx = 0.023;
		colorBackground[] = { 1, 1, 1, 0.3 };
		colorText[] = { 0, 0, 0, 1 };
		x = 0.8;
		y = 0.1;
		w = 0.2;
		h = 0.05;
	};
};
Once you have defined (or prototyped) dialogs you want to use, be sure to reload the mission in the editor if it is already running.
Dialogs can then be created and shown using the createDialog function. If you do so by script and await a responsive action from the user, you might also want to wait until the user has closed the dialog by using the dialog function, if you intend to handle the dialog result in the same script.
- Example:
 
_ok = createDialog "MyHelloWorldDialog";
waitUntil { !dialog };
hint "Dialog closed.";
Controls
Controls are the actual content of dialogs and can be anything, ranging from simple solid rectangles to a complex 3d object within a dialog. Like dialogs, controls can have a unique ID saved in the idc property to access them from within scripts using GUI functions.
The type of the control is usually set in the type property. Different types allow or require a different set of properties. However most controls share a set of properties in addition to the properties described in the following sections:
| Common properties | ||
|---|---|---|
| Name | Type | Remark | 
| idc | integer | the unique ID number of this control. can be -1 if you don't require access to the control itself from within a script. | 
| type | integer (constant) | control type constant. | 
| style | integer (constant) | style constant. | 
| x | float | the offset from the left side of the window (0..1; 0.0 = left side; 1.0 = right side) | 
| y | float | the offset from the top side of the window (0..1; 0.0 = left side; 1.0 = right side) | 
| w | float | the width of the control (0..1) | 
| h | float | the height of the control (0..1) | 
| sizeEx | float | the font size of text (0..1) | 
| font | string | the font to use | 
To save space and effort, it is generally a good idea to make use of class polymorphism, i.e. deriving from very basic classes that already have some specific properties set. See theBest Practice chapter for details.
Static
Static controls represent exactly that: static data. Primarily they are used for texts, dialog backgrounds and pictures. The constant type property for these controls usually is CT_STATIC.
| Properties | ||
|---|---|---|
| Name | Type | Remark | 
| colorText | color array | text color | 
| colorBackground | color array | background color | 
| text | string | the text to display initially | 
| lineSpacing | float | line spacing. Required, if the style was set to ST_MULTI. | 
Text
Most often this type of control will be used to add text to dialogs. If you want the text to change dynamically while playing the mission, you should set the idc property to a positive number, which allows usage of the ctrlSetText function. Text alignment can be controlled using the style property and the ST_* constants.
By default, this will only display a single line (and cut the overflow); use ST_MULTI if you intend to use multiple lines. This also requires setting the property lineSpacing, which indicates the relative space between lines; usually, you can set this to 1 for normal line spacing.
- Example:
 
class MyHelloPlayerExample {
	idc = -1;
	type = CT_STATIC;  // defined constant
	style = ST_CENTER;  // defined constant
	colorText[] = {0, 0, 0, 1};
	colorBackground[] = {1, 1, 1, 0.75};
	font = FontM;  // defined constant
	sizeEx = 0.023;
	x = 0.3; y = 0.1;
	w = 0.4;  h = 0.03;
	text = "Hello player!";
};
Solid rectangles
One can too use this control type to add solid background to dialogs by simply leaving the text property empty. This way, it will look like a regular rectangle.
- Example:
 
class MyRedBackgroundExample {
	/* ... same as the text example, except for */
	colorBackground[] = {1, 0.1, 0.1, 0.8};
	text = "";
};
Pictures
Using specific style constants you can enhance your dialogs with pictures too. These pictures should reside in your mission folder as paa-files. Then set your style property to ST_PICTURE (to display it once) or ST_TILE_PICTURE (to tile it) and use the text property to locate the paa image you want to use, relative to your mission folder.
- Example:
 
class MyPictureExample {
	/* ... same as the text example, except for */
	style = ST_PICTURE;
	text = "mypicture.paa";
};
Button
Active text
Structured text
Text box
Slider
Combobox
Listbox
Toolbox
Checkbox
Progress bar
HTML
Tree
Static skew
Controls group
Animated texture
3D Objects
Map
Best practice
Polymorphism
Inheritance
Using inheritance can reduce your dialog class definitions significantly by standardising common attributes in base classes and just changing unique attributes in derived classes. There is no need to redeclare all attributes for each class definition.
- Example:
 
class RscText
{
  type = CT_STATIC;
  idc = -1;
  style = ST_LEFT;
  colorBackground[] = {0, 0, 0, 1};
  colorText[] = {1, 1, 1, 1};
  font = FontM;
  sizeEx = 0.04;
  h = 0.04;
  text = "";
};
class My_BlueText: RscText
{
  colorText[] = {0, 0, 1, 1};
  x = 0.1;
  w = 0.4;
};
class My_Dialog
{
  //...
  controls[] =
  {
    My_Text_1,
    My_Text_2
    //...  
  };
  class My_Text_1: My_BlueText
  {
    text = "Line 1";
    y = 0.2;  
  };
  class My_Text_2: My_BlueText
  {
    text = "Line 2";
    y = 0.25;  
  };
  
  //...
};