virtualx-engine/doc/gdscript.lyx
2014-02-09 22:10:30 -03:00

2531 lines
40 KiB
Text

#LyX 2.0 created this file. For more info see http://www.lyx.org/
\lyxformat 413
\begin_document
\begin_header
\textclass article
\use_default_options true
\maintain_unincluded_children false
\language english
\language_package default
\inputencoding auto
\fontencoding global
\font_roman default
\font_sans default
\font_typewriter default
\font_default_family default
\use_non_tex_fonts false
\font_sc false
\font_osf false
\font_sf_scale 100
\font_tt_scale 100
\graphics default
\default_output_format default
\output_sync 0
\bibtex_command default
\index_command default
\paperfontsize default
\use_hyperref false
\papersize default
\use_geometry false
\use_amsmath 1
\use_esint 1
\use_mhchem 1
\use_mathdots 1
\cite_engine basic
\use_bibtopic false
\use_indices false
\paperorientation portrait
\suppress_date false
\use_refstyle 0
\index Index
\shortcut idx
\color #008000
\end_index
\secnumdepth 3
\tocdepth 3
\paragraph_separation indent
\paragraph_indentation default
\quotes_language english
\papercolumns 1
\papersides 1
\paperpagestyle default
\tracking_changes false
\output_changes false
\html_math_output 0
\html_css_as_file 0
\html_be_strict false
\end_header
\begin_body
\begin_layout Title
GD Scripting Language (GDScript)
\end_layout
\begin_layout Section
Introduction
\end_layout
\begin_layout Standard
GDScript is a high level, dynamically typed programming language used to
create content.
It uses a syntax that is very similar to the Python language (blocks are
indent-based) and it's goal is to be very optimal and tigthly integrated
with the engine, allowing great flexibility for content creation and integratio
n.
\end_layout
\begin_layout Section
Example
\end_layout
\begin_layout Standard
Some people can learn better by just taking a look at the syntax, so here's
a simple example of how it looks.
\end_layout
\begin_layout Standard
\begin_inset listings
inline false
status open
\begin_layout Plain Layout
#a file is a class!
\end_layout
\begin_layout Plain Layout
\end_layout
\begin_layout Plain Layout
#inheritance
\end_layout
\begin_layout Plain Layout
extends BaseClass
\end_layout
\begin_layout Plain Layout
\end_layout
\begin_layout Plain Layout
#member variables
\end_layout
\begin_layout Plain Layout
\end_layout
\begin_layout Plain Layout
var a=5
\end_layout
\begin_layout Plain Layout
var s="Hello"
\end_layout
\begin_layout Plain Layout
var arr=[1,2,3]
\end_layout
\begin_layout Plain Layout
var dict={"key":"value", 2:3}
\end_layout
\begin_layout Plain Layout
\end_layout
\begin_layout Plain Layout
#constants
\end_layout
\begin_layout Plain Layout
\end_layout
\begin_layout Plain Layout
const answer=42
\end_layout
\begin_layout Plain Layout
const thename="Charly"
\end_layout
\begin_layout Plain Layout
\end_layout
\begin_layout Plain Layout
#built-in vector types
\end_layout
\begin_layout Plain Layout
\end_layout
\begin_layout Plain Layout
var v2 = Vector2(1,2)
\end_layout
\begin_layout Plain Layout
var v3 = Vector3(1,2,3)
\end_layout
\begin_layout Plain Layout
\end_layout
\begin_layout Plain Layout
#function
\end_layout
\begin_layout Plain Layout
\end_layout
\begin_layout Plain Layout
func some_function(param1,param2):
\end_layout
\begin_layout Plain Layout
var local_var=5
\end_layout
\begin_layout Plain Layout
\end_layout
\begin_layout Plain Layout
if param1 < local_var:
\end_layout
\begin_layout Plain Layout
print(param1)
\end_layout
\begin_layout Plain Layout
elif param2 > 5:
\end_layout
\begin_layout Plain Layout
print(param2)
\end_layout
\begin_layout Plain Layout
else:
\end_layout
\begin_layout Plain Layout
print("fail!")
\end_layout
\begin_layout Plain Layout
\end_layout
\begin_layout Plain Layout
for i in range(20):
\end_layout
\begin_layout Plain Layout
print(i)
\end_layout
\begin_layout Plain Layout
\end_layout
\begin_layout Plain Layout
while(param2!=0):
\end_layout
\begin_layout Plain Layout
param2-=1
\end_layout
\begin_layout Plain Layout
\end_layout
\begin_layout Plain Layout
var local_var2 = param1+3
\end_layout
\begin_layout Plain Layout
return local_var2
\end_layout
\begin_layout Plain Layout
\end_layout
\begin_layout Plain Layout
\end_layout
\begin_layout Plain Layout
#subclass
\end_layout
\begin_layout Plain Layout
\end_layout
\begin_layout Plain Layout
class Something:
\end_layout
\begin_layout Plain Layout
var a=10
\end_layout
\begin_layout Plain Layout
\end_layout
\begin_layout Plain Layout
#constructor
\end_layout
\begin_layout Plain Layout
\end_layout
\begin_layout Plain Layout
func _init():
\end_layout
\begin_layout Plain Layout
print("constructed!")
\end_layout
\begin_layout Plain Layout
var lv = Something.new()
\end_layout
\begin_layout Plain Layout
print(lv.a)
\end_layout
\begin_layout Plain Layout
\end_layout
\begin_layout Plain Layout
\end_layout
\end_inset
\end_layout
\begin_layout Section
Language
\end_layout
\begin_layout Subsection
Identifiers
\end_layout
\begin_layout Standard
Any string that restricts itself to alphabetic characters ('a' to 'z' and
'A' to 'Z'), digits ('0' to '9') and '_' qualifies as an identifier.
As an extra restriction, identifiers must not begin with a digit.
Identifiers are case-sensitive ('foo' is different to 'FOO').
\end_layout
\begin_layout Subsection
Keywords
\end_layout
\begin_layout Standard
The following is the list of keywords supported by the language.
Since keywords are reserved words (tokens), they can't be used as identifiers.
\end_layout
\begin_layout Subsection
Operators
\end_layout
\begin_layout Standard
The following is the list of supported operators and their precedence (TODO,
change since this was made to reflect python operators)
\end_layout
\begin_layout Standard
\begin_inset Tabular
<lyxtabular version="3" rows="18" columns="2">
<features tabularvalignment="middle">
<column alignment="center" valignment="top" width="0">
<column alignment="center" valignment="top" width="0">
<row>
<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none">
\begin_inset Text
\begin_layout Plain Layout
Operator
\end_layout
\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" rightline="true" usebox="none">
\begin_inset Text
\begin_layout Plain Layout
Note
\end_layout
\end_inset
</cell>
</row>
<row>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text
\begin_layout Plain Layout
x[index]
\end_layout
\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
\begin_inset Text
\begin_layout Plain Layout
Subscription, Highest Priority
\end_layout
\end_inset
</cell>
</row>
<row>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text
\begin_layout Plain Layout
x.attribute
\end_layout
\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
\begin_inset Text
\begin_layout Plain Layout
Attribute Reference
\end_layout
\end_inset
</cell>
</row>
<row>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text
\begin_layout Plain Layout
extends
\end_layout
\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
\begin_inset Text
\begin_layout Plain Layout
Instance Type Checker
\end_layout
\end_inset
</cell>
</row>
<row>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text
\begin_layout Plain Layout
~
\end_layout
\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
\begin_inset Text
\begin_layout Plain Layout
Bitwise NOT
\end_layout
\end_inset
</cell>
</row>
<row>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text
\begin_layout Plain Layout
-x
\end_layout
\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
\begin_inset Text
\begin_layout Plain Layout
Negative
\end_layout
\end_inset
</cell>
</row>
<row>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text
\begin_layout Plain Layout
* / %
\end_layout
\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
\begin_inset Text
\begin_layout Plain Layout
Mult / Div / Remainder
\end_layout
\end_inset
</cell>
</row>
<row>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text
\begin_layout Plain Layout
+ -
\end_layout
\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
\begin_inset Text
\begin_layout Plain Layout
Addition / Substraction
\end_layout
\end_inset
</cell>
</row>
<row>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text
\begin_layout Plain Layout
<< >>
\end_layout
\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
\begin_inset Text
\begin_layout Plain Layout
Bit Shifting
\end_layout
\end_inset
</cell>
</row>
<row>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text
\begin_layout Plain Layout
&
\end_layout
\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
\begin_inset Text
\begin_layout Plain Layout
Bitwise AND
\end_layout
\end_inset
</cell>
</row>
<row>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text
\begin_layout Plain Layout
^
\end_layout
\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
\begin_inset Text
\begin_layout Plain Layout
Bitwise XOR
\end_layout
\end_inset
</cell>
</row>
<row>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text
\begin_layout Plain Layout
|
\end_layout
\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
\begin_inset Text
\begin_layout Plain Layout
Bitwise OR
\end_layout
\end_inset
</cell>
</row>
<row>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text
\begin_layout Plain Layout
< > == != >= <=
\end_layout
\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
\begin_inset Text
\begin_layout Plain Layout
Comparisons
\end_layout
\end_inset
</cell>
</row>
<row>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text
\begin_layout Plain Layout
in
\end_layout
\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
\begin_inset Text
\begin_layout Plain Layout
Content Test
\end_layout
\end_inset
</cell>
</row>
<row>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text
\begin_layout Plain Layout
! not
\end_layout
\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
\begin_inset Text
\begin_layout Plain Layout
Boolean NOT
\end_layout
\end_inset
</cell>
</row>
<row>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text
\begin_layout Plain Layout
and &&
\end_layout
\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
\begin_inset Text
\begin_layout Plain Layout
Boolean AND
\end_layout
\end_inset
</cell>
</row>
<row>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text
\begin_layout Plain Layout
or ||
\end_layout
\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
\begin_inset Text
\begin_layout Plain Layout
Boolean OR
\end_layout
\end_inset
</cell>
</row>
<row>
<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none">
\begin_inset Text
\begin_layout Plain Layout
= += -= *= /= ^= &= |=
\end_layout
\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" rightline="true" usebox="none">
\begin_inset Text
\begin_layout Plain Layout
Assignment, Lowest Priority
\end_layout
\end_inset
</cell>
</row>
</lyxtabular>
\end_inset
\end_layout
\begin_layout Subsection
Literals
\end_layout
\begin_layout Standard
\begin_inset Tabular
<lyxtabular version="3" rows="6" columns="2">
<features tabularvalignment="middle">
<column alignment="center" valignment="top" width="0">
<column alignment="center" valignment="top" width="0">
<row>
<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none">
\begin_inset Text
\begin_layout Plain Layout
Literal
\end_layout
\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" rightline="true" usebox="none">
\begin_inset Text
\begin_layout Plain Layout
Name
\end_layout
\end_inset
</cell>
</row>
<row>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text
\begin_layout Plain Layout
45
\end_layout
\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
\begin_inset Text
\begin_layout Plain Layout
Base 10 Integer
\end_layout
\end_inset
</cell>
</row>
<row>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text
\begin_layout Plain Layout
0x8F51
\end_layout
\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
\begin_inset Text
\begin_layout Plain Layout
Base 16 (hex) Integer
\end_layout
\end_inset
</cell>
</row>
<row>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text
\begin_layout Plain Layout
3.14, 58.1e-10
\end_layout
\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
\begin_inset Text
\begin_layout Plain Layout
Floating Point Number (real)
\end_layout
\end_inset
</cell>
</row>
<row>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text
\begin_layout Plain Layout
'Hello',
\begin_inset Quotes eld
\end_inset
Hi
\begin_inset Quotes erd
\end_inset
\end_layout
\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
\begin_inset Text
\begin_layout Plain Layout
Strings
\end_layout
\end_inset
</cell>
</row>
<row>
<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none">
\begin_inset Text
\begin_layout Plain Layout
@'Hello', @'Hi'
\end_layout
\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" rightline="true" usebox="none">
\begin_inset Text
\begin_layout Plain Layout
Internationalized Strings
\end_layout
\end_inset
</cell>
</row>
</lyxtabular>
\end_inset
\end_layout
\begin_layout Subsection
Comments
\end_layout
\begin_layout Standard
Anything from a '#' to the end of the line is ignored and is considered
a comment.
\end_layout
\begin_layout Standard
\begin_inset listings
lstparams "language=Python"
inline false
status open
\begin_layout Plain Layout
# This is a comment
\end_layout
\end_inset
\end_layout
\begin_layout Section
Built-in Types
\end_layout
\begin_layout Subsection
Basic Bult-In Types
\end_layout
\begin_layout Standard
A variable in GDScript can be assigned many of several built-in types.
\end_layout
\begin_layout Subsubsection
null
\end_layout
\begin_layout Standard
'null' is a data type that contains no information, nothing assigned, and
it's just empy.
It can only be set to one value: 'null'.
\end_layout
\begin_layout Subsubsection
bool
\end_layout
\begin_layout Standard
Boolean data type, can only contain 'true' or 'false'.
\end_layout
\begin_layout Subsubsection
int
\end_layout
\begin_layout Standard
Integer data type, can only contain integer numbers, negative and positive.
\end_layout
\begin_layout Subsubsection
float
\end_layout
\begin_layout Standard
contains a floating point value (real).
\end_layout
\begin_layout Subsubsection
String
\end_layout
\begin_layout Standard
Sequence of characters in unicode format.
Strings can contain the standard C escape sequences.
\end_layout
\begin_layout Subsection
Vector Built-In Types
\end_layout
\begin_layout Subsubsection
Vector2/Size2
\end_layout
\begin_layout Standard
2D vector type, containing x and y fields.
Can alternatively access fields as width and height for readability.
Can also be accessed as array.
\end_layout
\begin_layout Subsubsection
Rect2
\end_layout
\begin_layout Standard
2D Rectangle type.
Contains 2 vectors fields,
\begin_inset Quotes eld
\end_inset
pos
\begin_inset Quotes erd
\end_inset
and size
\begin_inset Quotes erd
\end_inset
.
Alternatively contains an
\begin_inset Quotes eld
\end_inset
end
\begin_inset Quotes erd
\end_inset
field which is
\begin_inset Quotes eld
\end_inset
pos+size
\begin_inset Quotes erd
\end_inset
.
\end_layout
\begin_layout Subsubsection
Vector3
\end_layout
\begin_layout Standard
3D vector type.
Contains x, y and z fields.
Can also be accessed as array.
\end_layout
\begin_layout Subsubsection
Matrix32
\end_layout
\begin_layout Standard
3x2 matrix used for 2D transforms.
\end_layout
\begin_layout Subsubsection
Plane
\end_layout
\begin_layout Standard
3D Plane type in normalized form.
Contains a
\begin_inset Quotes eld
\end_inset
normal
\begin_inset Quotes erd
\end_inset
vector field and a
\begin_inset Quotes eld
\end_inset
d
\begin_inset Quotes erd
\end_inset
scalar distance.
\end_layout
\begin_layout Subsubsection
Quat
\end_layout
\begin_layout Standard
Quaternion, datatype used for representing a 3D rotation.
It's useful for interpolating rotations.
\end_layout
\begin_layout Subsubsection
AABB/Box3
\end_layout
\begin_layout Standard
Axis Aligned bounding box (or alternatively, 3D box).
Contains 2 vectors fields,
\begin_inset Quotes eld
\end_inset
pos
\begin_inset Quotes erd
\end_inset
and size
\begin_inset Quotes erd
\end_inset
.
Alternatively contains an
\begin_inset Quotes eld
\end_inset
end
\begin_inset Quotes erd
\end_inset
field which is
\begin_inset Quotes eld
\end_inset
pos+size
\begin_inset Quotes erd
\end_inset
.
\end_layout
\begin_layout Subsubsection
Matrix3
\end_layout
\begin_layout Standard
3x3 matrix used for 3D rotation and scale.
Contains 3 vector fields x,y and z.
Can also be accessed as array of 3D vectors.
\end_layout
\begin_layout Subsubsection
Transform
\end_layout
\begin_layout Standard
3D Transform, contains a Matrix3 field
\begin_inset Quotes eld
\end_inset
basis
\begin_inset Quotes erd
\end_inset
and a Vector3 field
\begin_inset Quotes eld
\end_inset
origin
\begin_inset Quotes erd
\end_inset
.
\end_layout
\begin_layout Subsection
Engine Built-In Types
\end_layout
\begin_layout Subsubsection
Color
\end_layout
\begin_layout Standard
Color datatype, contains r,g,b,a fields.
Can also be accessed as h,s,v for hue/saturation/value.
\end_layout
\begin_layout Subsubsection
Image
\end_layout
\begin_layout Standard
Contains a 2D Image of custom format and allows direct access to the pixels.
\end_layout
\begin_layout Subsubsection
NodePath
\end_layout
\begin_layout Standard
Compiled path to a node, used mainly in the scene system.
Can be easily asigned from/to a String.
\end_layout
\begin_layout Subsubsection
RID
\end_layout
\begin_layout Standard
Resource ID (RID).
Servers use generic RIDs to reference opaque data.
\end_layout
\begin_layout Subsubsection
Object
\end_layout
\begin_layout Standard
Base class for anything not a built-in type.
\end_layout
\begin_layout Subsubsection
InputEvent
\end_layout
\begin_layout Standard
Events from input devices are contained in very compact form in InputEvent
objects.
Due to fact they can be received in high amounts from frame to frame, they
are optimized in their own datatype.
\end_layout
\begin_layout Subsection
Container Built-In Types
\end_layout
\begin_layout Subsubsection
Array
\end_layout
\begin_layout Standard
Generic sequence of objects.
It's size can be changed to anything and starts from index 0.
\end_layout
\begin_layout Standard
\begin_inset listings
inline false
status open
\begin_layout Plain Layout
var arr=[]
\end_layout
\begin_layout Plain Layout
arr=[1,2,3]
\end_layout
\begin_layout Plain Layout
arr[0]="Hi!"
\end_layout
\end_inset
\end_layout
\begin_layout Standard
Arrays are allocated linearly in memory, so they are fast, but very large
arrays (more than tens of thousands of elements) may cause fragmentation.
There are specialized arrays for some built-in datatypes which do not suffer
from this and use much less memory.
\end_layout
\begin_layout Subsubsection
Dictionary
\end_layout
\begin_layout Standard
Associative container which contains values referenced by unique keys.
\end_layout
\begin_layout Standard
\begin_inset listings
inline false
status open
\begin_layout Plain Layout
var dict={4:5, "a key":"a value", 28:[1,2,3]}
\end_layout
\begin_layout Plain Layout
dict["Hi!"]=0
\end_layout
\end_inset
\end_layout
\begin_layout Subsubsection
ByteArray
\end_layout
\begin_layout Standard
Array of bytes.
Can only contains bytes (integers from 0 to 255).
Optimized for memory usage, can't fragment the memory.
\end_layout
\begin_layout Subsubsection
IntArray
\end_layout
\begin_layout Standard
Array of integers.
Can only contain integers.
Optimized for memory usage, can't fragment the memory.
\end_layout
\begin_layout Subsubsection
FloatArray
\end_layout
\begin_layout Standard
Array of floats, can only contain floats.
Optimized for memory usage, can't fragment the memory.
\end_layout
\begin_layout Subsubsection
StringArray
\end_layout
\begin_layout Standard
Array of strings, can only contain strings.
Optimized for memory usage, can't fragment the memory.
\end_layout
\begin_layout Subsubsection
Vector2Array
\end_layout
\begin_layout Standard
Array of Vector2, can only contain 2D Vectors.
Optimized for memory usage, can't fragment the memory.
\end_layout
\begin_layout Subsubsection
Vector3Array
\end_layout
\begin_layout Standard
Array of Vector3, can only contain 3D Vectors.
Optimized for memory usage, can't fragment the memory.
\end_layout
\begin_layout Subsubsection
ColorArray
\end_layout
\begin_layout Standard
Array of Color, can only contains colors.
Optimized for memory usage, can't fragment the memory.
\end_layout
\begin_layout Section
Data
\end_layout
\begin_layout Subsection
Variables
\end_layout
\begin_layout Standard
Variables can exist as class members or local to functions.
They are created with the
\begin_inset Quotes eld
\end_inset
var
\begin_inset Quotes erd
\end_inset
keyword and may be, optionally, be assigned a value upon initialization.
\end_layout
\begin_layout Standard
\begin_inset listings
inline false
status open
\begin_layout Plain Layout
var a # datatype is null by default
\end_layout
\begin_layout Plain Layout
var b = 5
\end_layout
\begin_layout Plain Layout
var c = 3.8
\end_layout
\begin_layout Plain Layout
var d = b+c # variables are always initialized in order
\end_layout
\end_inset
\end_layout
\begin_layout Subsection
Constants
\end_layout
\begin_layout Standard
Constants are similar to variables, but must be constants or constant expression
s and must be assigned on initialization.
\end_layout
\begin_layout Standard
\begin_inset listings
inline false
status open
\begin_layout Plain Layout
const a = 5
\end_layout
\begin_layout Plain Layout
const b = Vector2(20,20)
\end_layout
\begin_layout Plain Layout
const c = 10+20 # constant expression
\end_layout
\begin_layout Plain Layout
const d = Vector2(20,30).x # constant expression: 20
\end_layout
\begin_layout Plain Layout
const e = [1,2,3,4][0] # constant expression: 1
\end_layout
\begin_layout Plain Layout
const f = sin(20) # sin() can be used in constant expression
\end_layout
\begin_layout Plain Layout
const g = x+20 # invalid, not a constant expression!
\end_layout
\begin_layout Plain Layout
\end_layout
\end_inset
\end_layout
\begin_layout Subsection
Functions
\end_layout
\begin_layout Standard
Functions always belong to a class.
The scope priority for variable look-up is: local -> class member -> global.
\begin_inset Quotes eld
\end_inset
self
\begin_inset Quotes erd
\end_inset
is provided as an option for accessing class members but is not required
always (and must
\emph on
not
\emph default
be defined as first parameter, like in Python).
For performance reasons, functions are not considered class members, so
they can't be referenced directly.
A function can return at any point.
The default return value is null.
\end_layout
\begin_layout Standard
\begin_inset listings
inline false
status open
\begin_layout Plain Layout
func myfunction(a,b):
\end_layout
\begin_layout Plain Layout
print(a)
\end_layout
\begin_layout Plain Layout
print(b)
\end_layout
\begin_layout Plain Layout
return a+b # return is optional, otherwise null is returned
\end_layout
\end_inset
\end_layout
\begin_layout Subsubsection
Statements and Control Flow
\end_layout
\begin_layout Standard
Statements are standard, and can be assignments, function calls, control
flow structures, etc (see below).
\begin_inset Quotes eld
\end_inset
;
\begin_inset Quotes erd
\end_inset
as separator is entirely optional.
\end_layout
\begin_layout Subsubsection
if/else/elif
\end_layout
\begin_layout Standard
Simple conditions are created by using the
\emph on
if/else/elif
\emph default
syntax.
Parenthesis around statements is allowed but not requiered.
Given the nature of the tab-based indentation, elif can be used instead
of else:/if: to mantain a level of indentation.
\end_layout
\begin_layout Standard
\begin_inset listings
inline false
status open
\begin_layout Plain Layout
if [expression]:
\end_layout
\begin_layout Plain Layout
statement(s)
\end_layout
\begin_layout Plain Layout
elif [expression]:
\end_layout
\begin_layout Plain Layout
statement(s)
\end_layout
\begin_layout Plain Layout
else:
\end_layout
\begin_layout Plain Layout
statement(s)
\end_layout
\end_inset
\end_layout
\begin_layout Subsubsection
while
\end_layout
\begin_layout Standard
Simple loops are created by using
\emph on
while
\emph default
syntax.
Loops can be broken using
\emph on
break
\emph default
, or continued using
\emph on
continue
\emph default
:
\end_layout
\begin_layout Standard
\begin_inset listings
inline false
status open
\begin_layout Plain Layout
while [expression]:
\end_layout
\begin_layout Plain Layout
statement(s)
\end_layout
\end_inset
\end_layout
\begin_layout Subsubsection
for
\end_layout
\begin_layout Standard
To iterate a range, array or table a
\emph on
for
\emph default
loop is used.
For loops store the index in the loop variable on each iteration.
\end_layout
\begin_layout Standard
\begin_inset listings
inline false
status open
\begin_layout Plain Layout
for i in [0,1,2]:
\end_layout
\begin_layout Plain Layout
statement # loop iterates 3 times, i being 0,1 and 2
\end_layout
\begin_layout Plain Layout
\end_layout
\begin_layout Plain Layout
var dict = {"a":0, "b":1, "c": 2}
\end_layout
\begin_layout Plain Layout
for i in dict:
\end_layout
\begin_layout Plain Layout
print(dict[i]) # loop iterates the keys, i being "a","b" and c".
It prints 0, 1 and 2.
\end_layout
\begin_layout Plain Layout
\end_layout
\begin_layout Plain Layout
for i in range(3):
\end_layout
\begin_layout Plain Layout
statement # similar to [0,1,2] but does not allocate an array
\end_layout
\begin_layout Plain Layout
\end_layout
\begin_layout Plain Layout
for i in range(1,3):
\end_layout
\begin_layout Plain Layout
statement # similar to [1,2] but does not allocate an array
\end_layout
\begin_layout Plain Layout
\end_layout
\begin_layout Plain Layout
for i in range(2,8,2):
\end_layout
\begin_layout Plain Layout
statement # similar to [2,4,6] but does not allocate an array
\end_layout
\begin_layout Plain Layout
\end_layout
\end_inset
\end_layout
\begin_layout Section
Classes
\end_layout
\begin_layout Standard
By default, the body of a script file is an unnamed class, and it can only
be referenced externally as a resource or file.
Class syntax is meant to be very compact and can only contain member variables
or functions.
Static functions are allowed, but not static members (in the spirit of
thread safety, since scripts can be initialized in separate threads without
the user knowing).
In the same way, member variables (including arrays and dictionaries) are
initialized every time an instance is created.
\end_layout
\begin_layout Subsection
Class File Example
\end_layout
\begin_layout Standard
Example of a class file, imagine it being stored in a file like myclass.gd.
\end_layout
\begin_layout Standard
\begin_inset listings
inline false
status open
\begin_layout Plain Layout
\end_layout
\begin_layout Plain Layout
var a=5
\end_layout
\begin_layout Plain Layout
\end_layout
\begin_layout Plain Layout
function print_value_of_a():
\end_layout
\begin_layout Plain Layout
print(a)
\end_layout
\begin_layout Plain Layout
\end_layout
\end_inset
\end_layout
\begin_layout Subsection
Inheritance
\end_layout
\begin_layout Standard
A class-file can inherit from a global class, another file or a subclass
inside another file.
Multiple inheritance is not allowed.
The
\begin_inset Quotes eld
\end_inset
extends
\begin_inset Quotes erd
\end_inset
syntax is used:
\end_layout
\begin_layout Standard
\begin_inset listings
inline false
status open
\begin_layout Plain Layout
# extend from some class (global)
\end_layout
\begin_layout Plain Layout
extends SomeClass
\end_layout
\begin_layout Plain Layout
\end_layout
\begin_layout Plain Layout
# optionally, extend from another file
\end_layout
\begin_layout Plain Layout
extends "somefile.gd"
\end_layout
\begin_layout Plain Layout
\end_layout
\begin_layout Plain Layout
# extend from a subclass in another file
\end_layout
\begin_layout Plain Layout
extends "somefile.gd".Subclass
\end_layout
\end_inset
\end_layout
\begin_layout Subsection
Inheritance Testing
\end_layout
\begin_layout Standard
It is possible to check if an instance inherits from a given class.
For this the
\begin_inset Quotes eld
\end_inset
extends
\begin_inset Quotes erd
\end_inset
keyword can be used as an operator instead:
\end_layout
\begin_layout Standard
\begin_inset listings
inline false
status open
\begin_layout Plain Layout
static var enemy_class = preload("enemy.gd") # cache the enemy class
\end_layout
\begin_layout Plain Layout
\end_layout
\begin_layout Plain Layout
[..]
\end_layout
\begin_layout Plain Layout
\end_layout
\begin_layout Plain Layout
if ( entity extends enemy_class ):
\end_layout
\begin_layout Plain Layout
entity.apply_damage()
\end_layout
\begin_layout Plain Layout
\end_layout
\begin_layout Plain Layout
\end_layout
\begin_layout Plain Layout
\end_layout
\end_inset
\end_layout
\begin_layout Subsection
Constructor
\end_layout
\begin_layout Standard
A class can have an optional constructor, a function named
\begin_inset Quotes eld
\end_inset
_init
\begin_inset Quotes erd
\end_inset
that is called when the class is instanced.
\end_layout
\begin_layout Subsection
Sub Classes
\end_layout
\begin_layout Standard
A class file can have subclasses.
Syntax should be straightforward:
\end_layout
\begin_layout Standard
\begin_inset listings
inline false
status open
\begin_layout Plain Layout
class SomeSubClass:
\end_layout
\begin_layout Plain Layout
var a=5
\end_layout
\begin_layout Plain Layout
function print_value_of_a():
\end_layout
\begin_layout Plain Layout
print(a)
\end_layout
\begin_layout Plain Layout
\end_layout
\begin_layout Plain Layout
function _init():
\end_layout
\begin_layout Plain Layout
var sc = SomeSubClass.new() #instance by calling built-in new
\end_layout
\begin_layout Plain Layout
sc.print_value_of_a()
\end_layout
\end_inset
\end_layout
\begin_layout Subsection
Classes as Objects
\end_layout
\begin_layout Standard
It may be desired at some point to load a class from a file and then instance
it.
Since the global scope does not exist, classes must be loaded as a resource.
Instancing is done by calling the
\begin_inset Quotes eld
\end_inset
new
\begin_inset Quotes erd
\end_inset
function in a class object:
\end_layout
\begin_layout Standard
\begin_inset listings
inline false
status open
\begin_layout Plain Layout
#load the class (loaded every time the script is instanced)
\end_layout
\begin_layout Plain Layout
var MyClass = load("myclass.gd")
\end_layout
\begin_layout Plain Layout
\end_layout
\begin_layout Plain Layout
#alternatively, using the preload() function preloads the class at compile
time
\end_layout
\begin_layout Plain Layout
var MyClass2 = preload("myclass.gd")
\end_layout
\begin_layout Plain Layout
\end_layout
\begin_layout Plain Layout
function _init():
\end_layout
\begin_layout Plain Layout
var a = MyClass.new()
\end_layout
\begin_layout Plain Layout
a.somefunction()
\end_layout
\end_inset
\end_layout
\begin_layout Subsection
Exports
\end_layout
\begin_layout Standard
Class members can be exported.
This means their value gets saved along with a scene.
If class members have initializers to constant expressions, they will be
available for editing in the property editor.
Exporting is done by using the export keyword:
\end_layout
\begin_layout Standard
\begin_inset listings
inline false
status open
\begin_layout Plain Layout
extends Button
\end_layout
\begin_layout Plain Layout
\end_layout
\begin_layout Plain Layout
export var data # value will be saved
\end_layout
\begin_layout Plain Layout
export var number=5 # also available to the property editor
\end_layout
\begin_layout Plain Layout
\end_layout
\end_inset
\end_layout
\begin_layout Standard
One of the fundamental benefits of exporting member variables is to have
them visible in the property editor.
This way artists and game designers can modify values that later influence
how the program runs.
For this, a special export syntax is provided for more detail in the exported
variables:
\end_layout
\begin_layout Standard
\begin_inset listings
inline false
status open
\begin_layout Plain Layout
#if the exported value assigns a constant or constant expression, the type
will be infered and used in the editor
\end_layout
\begin_layout Plain Layout
\end_layout
\begin_layout Plain Layout
export var number=5
\end_layout
\begin_layout Plain Layout
\end_layout
\begin_layout Plain Layout
#export can take a basic datatype as argument, which will be used in the
editor
\end_layout
\begin_layout Plain Layout
\end_layout
\begin_layout Plain Layout
export(int) var number
\end_layout
\begin_layout Plain Layout
\end_layout
\begin_layout Plain Layout
#export can also take a resource type as hint
\end_layout
\begin_layout Plain Layout
\end_layout
\begin_layout Plain Layout
export(Texture) var character_face
\end_layout
\begin_layout Plain Layout
\end_layout
\begin_layout Plain Layout
#integers and strings hint enumerated values
\end_layout
\begin_layout Plain Layout
\end_layout
\begin_layout Plain Layout
export(int,"Warrior","Magician","Thief") var character_class # (editor will
set them as 0,1 and 2)
\end_layout
\begin_layout Plain Layout
export(String,"Rebecca","Mary","Leah") var character_name
\end_layout
\begin_layout Plain Layout
\end_layout
\begin_layout Plain Layout
#strings as paths
\end_layout
\begin_layout Plain Layout
\end_layout
\begin_layout Plain Layout
export(String,FILE) var f # string is a path to a file
\end_layout
\begin_layout Plain Layout
export(String,DIR) var f # string is a path to a directory
\end_layout
\begin_layout Plain Layout
export(String,FILE,"*.txt") var f # string is a path to a file, custom filter
provided as hint
\end_layout
\begin_layout Plain Layout
\end_layout
\begin_layout Plain Layout
#integers and floats hint ranges
\end_layout
\begin_layout Plain Layout
\end_layout
\begin_layout Plain Layout
export(int,20) var i # 0 to 20 allowed
\end_layout
\begin_layout Plain Layout
export(int,-10,20) var j # -10 to 20 allowed
\end_layout
\begin_layout Plain Layout
export(float,-10,20,0.2) var k # -10 to 20 allowed, with stepping of 0.2
\end_layout
\begin_layout Plain Layout
\end_layout
\begin_layout Plain Layout
#color can hint availability of alpha
\end_layout
\begin_layout Plain Layout
\end_layout
\begin_layout Plain Layout
export(Color,RGB) var col # Color is RGB
\end_layout
\begin_layout Plain Layout
export(Color,RGBA) var col # Color is RGBA
\end_layout
\begin_layout Plain Layout
\end_layout
\begin_layout Plain Layout
\end_layout
\end_inset
\end_layout
\begin_layout Standard
It must be noted that even if the script is not being run while at the editor,
the exported properties are still editable (see below for
\begin_inset Quotes eld
\end_inset
tool
\begin_inset Quotes erd
\end_inset
).
\end_layout
\begin_layout Subsection
Static Functions
\end_layout
\begin_layout Standard
A function can be declared static.
When static, it has no access to the instance member variables or
\begin_inset Quotes eld
\end_inset
self
\begin_inset Quotes erd
\end_inset
.
This is mainly useful to make libraries of helper functions:
\end_layout
\begin_layout Standard
\begin_inset listings
inline false
status open
\begin_layout Plain Layout
static func sum2(a,b):
\end_layout
\begin_layout Plain Layout
return a+b
\end_layout
\end_inset
\end_layout
\begin_layout Subsection
Asserting
\end_layout
\begin_layout Standard
It is possible to assert a condition, which will cause a debugger break
if false.
Just use the built-in 'assert' function.
\end_layout
\begin_layout Standard
\begin_inset listings
inline false
status open
\begin_layout Plain Layout
assert(a==2)
\end_layout
\begin_layout Plain Layout
# if a is not 2, it will generate a debugger break
\end_layout
\end_inset
\end_layout
\begin_layout Subsection
Tool Mode
\end_layout
\begin_layout Standard
Scripts by default don't run inside the editor, and only the exported properties
can be changed.
In some cases it is desired that they do (as long as they don't execute
game code or manually avoid doing so).
For this, the
\begin_inset Quotes eld
\end_inset
tool
\begin_inset Quotes erd
\end_inset
keyword exists, and must be placed at the top of the file:
\end_layout
\begin_layout Standard
\begin_inset listings
inline false
status open
\begin_layout Plain Layout
tool
\end_layout
\begin_layout Plain Layout
extends Button
\end_layout
\begin_layout Plain Layout
\end_layout
\begin_layout Plain Layout
func _init():
\end_layout
\begin_layout Plain Layout
print("Hello")
\end_layout
\end_inset
\end_layout
\begin_layout Subsection
Memory Management
\end_layout
\begin_layout Standard
If a class inherits from
\emph on
Reference
\emph default
, then instances will be freed when no longer in use.
No garbage collector exists, just simple reference counting.
By default, all classes that don't define inheritance extend
\emph on
Reference
\emph default
.
If this is not desired, then a class must inherit
\emph on
Object
\emph default
manually and must call instance.free().
To avoid reference cycles that can't be freed, a weakref() function is
provided for creating weak references.
\end_layout
\begin_layout Subsection
Function References
\end_layout
\begin_layout Standard
Functions can't be referenced because they are not treated as class members.
There are two alternatives to this, though.
The
\begin_inset Quotes eld
\end_inset
call
\begin_inset Quotes erd
\end_inset
function or the funcref() helper.
\end_layout
\begin_layout Standard
\begin_inset listings
inline false
status open
\begin_layout Plain Layout
instance.call("funcname",args) # call a function by bane
\end_layout
\begin_layout Plain Layout
\end_layout
\begin_layout Plain Layout
var fr = funcref(instance,"funcname") #create a function ref
\end_layout
\begin_layout Plain Layout
fr.exec(args)
\end_layout
\end_inset
\end_layout
\end_body
\end_document