Browse Source

Added a better description for types operations (floats, integers), fixes #377

Julian Murgia 8 years ago
parent
commit
af28c7515e
1 changed files with 96 additions and 87 deletions
  1. 96 87
      learning/scripting/gdscript/gdscript_basics.rst

+ 96 - 87
learning/scripting/gdscript/gdscript_basics.rst

@@ -7,9 +7,9 @@ Introduction
 ------------
 
 *GDScript* is a high level, dynamically typed programming language used to
-create content. It uses a syntax similar to 
-`Python <https://en.wikipedia.org/wiki/Python_%28programming_language%29>`_ 
-(blocks are indent-based and many keywords are similar). Its goal is 
+create content. It uses a syntax similar to
+`Python <https://en.wikipedia.org/wiki/Python_%28programming_language%29>`_
+(blocks are indent-based and many keywords are similar). Its goal is
 to be optimized for and tightly integrated with Godot Engine, allowing great
 flexibility for content creation and integration.
 
@@ -28,7 +28,7 @@ enormous amount of code. After some experiments with
 
 The last third party scripting language that was used for shipped games
 was `Squirrel <http://squirrel-lang.org>`__, but it was dropped as well.
-At that point, it became evident that a custom scripting language could 
+At that point, it became evident that a custom scripting language could
 more optimally make use of Godot's particular architecture:
 
 -  Godot embeds scripts in nodes. Most languages are not designed with
@@ -65,7 +65,7 @@ here's a simple example of how GDScript looks.
 
     # member variables
 
-    var a = 5 
+    var a = 5
     var s = "Hello"
     var arr = [1, 2, 3]
     var dict = {"key":"value", 2:3}
@@ -126,9 +126,9 @@ read this tutorial: :ref:`doc_gdscript_more_efficiently`.
 Language
 --------
 
-In the following, an overview is given to GDScript. Details, such as which 
+In the following, an overview is given to GDScript. Details, such as which
 methods are available to arrays or other objects, should be looked up in
-the linked class descriptions. 
+the linked class descriptions.
 
 Identifiers
 ~~~~~~~~~~~
@@ -220,6 +220,15 @@ The following is the list of supported operators and their precedence
 | ``-x``                                                        | Negative                                |
 +---------------------------------------------------------------+-----------------------------------------+
 | ``*`` ``/`` ``%``                                             | Multiplication / Division / Remainder   |
+|                                                               |                                         |
+|                                                               | NOTE: The result of these operations    |
+|                                                               | depends on the operands types. If both  |
+|                                                               | are Integers, then the result will be   |
+|                                                               | an Integer. That means 1/10 returns 0   |
+|                                                               | instead of 0.1. If at least one of the  |
+|                                                               | operands is a float, then the result is |
+|                                                               | a float: float(1)/10 or 1.0/10 return   |
+|                                                               | both 0.1.                               |
 +---------------------------------------------------------------+-----------------------------------------+
 | ``+`` ``-``                                                   | Addition / Subtraction                  |
 +---------------------------------------------------------------+-----------------------------------------+
@@ -276,13 +285,13 @@ considered a comment.
     # This is a comment
 
 ..  Uncomment me if/when https://github.com/godotengine/godot/issues/1320 gets fixed
-    
+
     Multi-line comments can be created using """ (three quotes in a row) at
     the beginning and end of a block of text.
-    
+
     ::
-    
-        """ Everything on these 
+
+        """ Everything on these
         lines is considered
         a comment """
 
@@ -298,7 +307,7 @@ null
 ^^^^
 
 ``null`` is an empty data type that contains no information and can not
-be assigned any other value. 
+be assigned any other value.
 
 bool
 ^^^^
@@ -428,7 +437,7 @@ Container built-in types
 :ref:`Array <class_Array>`
 ^^^^^^^^^^^^^^^^^^^^^^^^^^
 
-Generic sequence of arbitrary object types, including other arrays or dictionaries (see below). 
+Generic sequence of arbitrary object types, including other arrays or dictionaries (see below).
 The array can resize dynamically. Arrays are indexed starting from index ``0``.
 Starting with Godot 2.1, indices may be negative like in Python, to count from the end.
 
@@ -444,10 +453,10 @@ Starting with Godot 2.1, indices may be negative like in Python, to count from t
 
 GDScript arrays are allocated linearly in memory for speed. Very
 large arrays (more than tens of thousands of elements) may however cause
-memory fragmentation. If this is a concern special types of 
-arrays are available. These only accept a single data type. They avoid memory 
+memory fragmentation. If this is a concern special types of
+arrays are available. These only accept a single data type. They avoid memory
 fragmentation and also use less memory but are atomic and tend to run slower than generic
-arrays. They are therefore only recommended to use for very large data sets: 
+arrays. They are therefore only recommended to use for very large data sets:
 
 - :ref:`ByteArray <class_ByteArray>`: An array of bytes (integers from 0 to 255).
 - :ref:`IntArray <class_IntArray>`: An array of integers.
@@ -473,15 +482,15 @@ Associative container which contains values referenced by unique keys.
         "morekey"  : "Hello"
     }
 
-Lua-style table syntax is also supported. Lua-style uses ``=`` instead of ``:`` 
-and doesn't use quotes to mark string keys (making for slightly less to write). 
-Note however that like any GDScript identifier, keys written in this form cannot 
+Lua-style table syntax is also supported. Lua-style uses ``=`` instead of ``:``
+and doesn't use quotes to mark string keys (making for slightly less to write).
+Note however that like any GDScript identifier, keys written in this form cannot
 start with a digit.
 
 ::
 
     var d = {
-        test22 = "Value", 
+        test22 = "Value",
         somekey = 2,
         otherkey = [2,3,4],
         morekey = "Hello"
@@ -516,7 +525,7 @@ Constants
 ~~~~~~~~~
 
 Constants are similar to variables, but must be constants or constant
-expressions and must be assigned on initialization. 
+expressions and must be assigned on initialization.
 
 ::
 
@@ -527,7 +536,7 @@ expressions and must be assigned on initialization.
     const e = [1, 2, 3, 4][0]  # constant expression: 1
     const f = sin(20)  # sin() can be used in constant expressions
     const g = x + 20  # invalid; this is not a constant expression!
-    
+
 Enums
 ^^^^^
 
@@ -589,13 +598,13 @@ function or be returned from other functions. This is for performance reasons.
 To reference a function by name at runtime, (e.g. to store it in a variable, or
 pass it to another function as an argument) one must use the ``call`` or
 ``funcref`` helpers::
-   
+
     # Call a function by name in one step
-    mynode.call("myfunction", args)  
+    mynode.call("myfunction", args)
 
-    # Store a function reference 
+    # Store a function reference
     var myfunc = funcref(mynode, "myfunction")
-    # Call stored function reference 
+    # Call stored function reference
     myfunc.call_func(args)
 
 
@@ -603,7 +612,7 @@ Remember that default functions like  ``_init``, and most
 notifications such as ``_enter_tree``, ``_exit_tree``, ``_process``,
 ``_fixed_process``, etc. are called in all base classes automatically.
 So there is only a need to call the function explicitly when overloading
-them in some way. 
+them in some way.
 
 
 Static functions
@@ -705,7 +714,7 @@ It's the equivalent of the ``switch`` statement found in many other languages bu
 Basic syntax:
 
 ::
-    
+
     match [expression]:
         [pattern](s): [block]
         [pattern](s): [block]
@@ -730,7 +739,7 @@ There are 6 pattern types:
 
 - constant pattern
     constant primitives, like numbers and strings ::
-    
+
         match x:
             1:      print("We are number one!")
             2:      print("Two are better than one!")
@@ -739,7 +748,7 @@ There are 6 pattern types:
 
 - variable pattern
     matches the contents of a variable/enum ::
-    
+
         match typeof(x):
             TYPE_FLOAT:  print("float")
             TYPE_STRING: print("text")
@@ -748,9 +757,9 @@ There are 6 pattern types:
 
 - wildcard pattern
     This pattern matches everything. It's written as a single underscore.
-    
+
     It can be used as the equivalent of the ``default`` in a ``switch`` statement in other languages. ::
-    
+
         match x:
             1: print("it's one!")
             2: print("it's one times two!")
@@ -760,7 +769,7 @@ There are 6 pattern types:
 - binding pattern
     A binding pattern introduces a new variable. Like the wildcard pattern, it matches everything - and also gives that value a name.
     It's especially useful in array and dictionary patterns. ::
-        
+
         match x:
             1:           print("it's one!")
             2:           print("it's one times two!")
@@ -769,13 +778,13 @@ There are 6 pattern types:
 
 - array pattern
     matches an array. Every single element of the array pattern is a pattern itself so you can nest them.
-    
+
     The length of the array is tested first, it has to be the same size as the pattern, otherwise the pattern don't match.
 
     **Open-ended array**: An array can be bigger than the pattern by making the last subpattern ``..``
-    
+
     Every subpattern has to be comma separated. ::
-    
+
         match x:
             []:
                 print("empty array")
@@ -785,7 +794,7 @@ There are 6 pattern types:
                 print("first element is ", start, ", and the last is \"test\"")
             [42, ..]:
                 print("open ended array")
-    
+
 - dictionary pattern
     Works in the same was as the array pattern. Every key has to be a constant pattern.
 
@@ -834,7 +843,7 @@ separate threads without the user knowing). In the same way, member
 variables (including arrays and dictionaries) are initialized every time
 an instance is created.
 
-Below is an example of a class file. 
+Below is an example of a class file.
 
 ::
 
@@ -848,29 +857,29 @@ Below is an example of a class file.
 Inheritance
 ^^^^^^^^^^^
 
-A class (stored as a file) can inherit from 
+A class (stored as a file) can inherit from
 
 - A global class
-- Another class file 
-- An inner class inside another class file. 
+- Another class file
+- An inner class inside another class file.
 
-Multiple inheritance is not allowed. 
+Multiple inheritance is not allowed.
 
 Inheritance uses the ``extends`` keyword:
 
 ::
 
     # Inherit/extend a globally available class
-    extends SomeClass 
-    
+    extends SomeClass
+
     # Inherit/extend a named class file
-    extends "somefile.gd" 
-    
+    extends "somefile.gd"
+
     # Inherit/extend an inner class in another file
     extends "somefile.gd".SomeInnerClass
 
 
-To check if a given instance inherits from a given class 
+To check if a given instance inherits from a given class
 the ``extends`` keyword can be used as an operator instead:
 
 ::
@@ -887,7 +896,7 @@ the ``extends`` keyword can be used as an operator instead:
 Class Constructor
 ^^^^^^^^^^^^^^^^^
 
-The class constructor, called on class instantiation, is named ``_init``. 
+The class constructor, called on class instantiation, is named ``_init``.
 As mentioned earlier, the constructors of parent classes are called automatically when
 inheriting a class. So there is usually no need to call ``._init()`` explicitly.
 
@@ -902,7 +911,7 @@ Inner classes
 ^^^^^^^^^^^^^
 
 A class file can contain inner classes. Inner classes are defined using the
-``class`` keyword. They are instanced using the ``ClassName.new()`` 
+``class`` keyword. They are instanced using the ``ClassName.new()``
 function.
 
 ::
@@ -917,7 +926,7 @@ function.
 
     # This is the constructor of the class file's main class
     func _init():
-        var c = SomeInnerClass.new() 
+        var c = SomeInnerClass.new()
         c.print_value_of_a()
 
 Classes as resources
@@ -960,12 +969,12 @@ special export syntax is provided.
 
 ::
 
-    # If the exported value assigns a constant or constant expression, 
+    # If the exported value assigns a constant or constant expression,
     # the type will be inferred and used in the editor
 
     export var number = 5
 
-    # Export can take a basic data type as an argument which will be 
+    # Export can take a basic data type as an argument which will be
     # used in the editor
 
     export(int) var number
@@ -978,49 +987,49 @@ special export syntax is provided.
     # Integers and strings hint enumerated values
 
     # Editor will enumerate as 0, 1 and 2
-    export(int, "Warrior", "Magician", "Thief") var character_class   
-    # Editor will enumerate with string names 
-    export(String, "Rebecca", "Mary", "Leah") var character_name 
+    export(int, "Warrior", "Magician", "Thief") var character_class
+    # Editor will enumerate with string names
+    export(String, "Rebecca", "Mary", "Leah") var character_name
 
     # Strings as paths
 
     # String is a path to a file
-    export(String, FILE) var f  
+    export(String, FILE) var f
     # String is a path to a directory
-    export(String, DIR) var f  
+    export(String, DIR) var f
     # String is a path to a file, custom filter provided as hint
-    export(String, FILE, "*.txt") var f  
+    export(String, FILE, "*.txt") var f
 
-    # Using paths in the global filesystem is also possible, 
+    # Using paths in the global filesystem is also possible,
     # but only in tool scripts (see further below)
 
     # String is a path to a PNG file in the global filesystem
-    export(String, FILE, GLOBAL, "*.png") var tool_image 
+    export(String, FILE, GLOBAL, "*.png") var tool_image
     # String is a path to a directory in the global filesystem
     export(String, DIR, GLOBAL) var tool_dir
 
-    # The MULTILINE setting tells the editor to show a large input 
+    # The MULTILINE setting tells the editor to show a large input
     # field for editing over multiple lines
     export(String, MULTILINE) var text
 
     # Limiting editor input ranges
 
     # Allow integer values from 0 to 20
-    export(int, 20) var i  
-    # Allow integer values from -10 to 20 
-    export(int, -10, 20) var j 
+    export(int, 20) var i
+    # Allow integer values from -10 to 20
+    export(int, -10, 20) var j
     # Allow floats from -10 to 20, with a step of 0.2
-    export(float, -10, 20, 0.2) var k 
-    # Allow values y = exp(x) where y varies betwee 100 and 1000 
-    # while snapping to steps of 20. The editor will present a 
-    # slider for easily editing the value. 
-    export(float, EXP, 100, 1000, 20) var l 
+    export(float, -10, 20, 0.2) var k
+    # Allow values y = exp(x) where y varies betwee 100 and 1000
+    # while snapping to steps of 20. The editor will present a
+    # slider for easily editing the value.
+    export(float, EXP, 100, 1000, 20) var l
 
     # Floats with easing hint
 
-    # Display a visual representation of the ease() function 
+    # Display a visual representation of the ease() function
     # when editing
-    export(float, EASE) var transition_speed 
+    export(float, EASE) var transition_speed
 
     # Colors
 
@@ -1028,9 +1037,9 @@ special export syntax is provided.
     export(Color, RGB) var col  # Color is RGB
     # Color given as Red-Green-Blue-Alpha value
     export(Color, RGBA) var col  # Color is RGBA
-   
+
     # another node in the scene can be exported too
-    
+
     export(NodePath) var node
 
 It must be noted that even if the script is not being run while at the
@@ -1047,7 +1056,7 @@ can be set from the editor:
 ::
 
     # Individually edit the bits of an integer
-    export(int, FLAGS) var spell_elements = ELEMENT_WIND | ELEMENT_WATER 
+    export(int, FLAGS) var spell_elements = ELEMENT_WIND | ELEMENT_WATER
 
 Restricting the flags to a certain number of named flags is also
 possible. The syntax is very similar to the enumeration syntax:
@@ -1055,7 +1064,7 @@ possible. The syntax is very similar to the enumeration syntax:
 ::
 
     # Set any of the given flags from the editor
-    export(int, FLAGS, "Fire", "Water", "Earth", "Wind") var spell_elements = 0 
+    export(int, FLAGS, "Fire", "Water", "Earth", "Wind") var spell_elements = 0
 
 In this example, ``Fire`` has value 1, ``Water`` has value 2, ``Earth``
 has value 4 and ``Wind`` corresponds to value 8. Usually, constants
@@ -1096,21 +1105,21 @@ initializers, but they must be constant expressions.
 Setters/getters
 ~~~~~~~~~~~~~~~
 
-It is often useful to know when a class' member variable changes for 
-whatever reason. It may also be desired to encapsulate its access in some way. 
+It is often useful to know when a class' member variable changes for
+whatever reason. It may also be desired to encapsulate its access in some way.
 
-For this, GDScript provides a *setter/getter* syntax using the ``setget`` keyword. 
+For this, GDScript provides a *setter/getter* syntax using the ``setget`` keyword.
 It is used directly after a variable definition:
 
 ::
 
     var variable = value setget setterfunc, getterfunc
 
-Whenever the value of ``variable`` is modified by an *external* source 
+Whenever the value of ``variable`` is modified by an *external* source
 (i.e. not from local usage in the class), the *setter* function (``setterfunc`` above)
-will be called. This happens *before* the value is changed. The *setter* must decide what to do 
-with the new value. Vice-versa, when ``variable`` is accessed, the *getter* function 
-(``getterfunc`` above) must ``return`` the desired value. Below is an example: 
+will be called. This happens *before* the value is changed. The *setter* must decide what to do
+with the new value. Vice-versa, when ``variable`` is accessed, the *getter* function
+(``getterfunc`` above) must ``return`` the desired value. Below is an example:
 
 
 ::
@@ -1135,8 +1144,8 @@ Either of the *setter* or *getter* functions can be omitted:
 Get/Setters are especially useful when exporting variables to editor in tool
 scripts or plugins, for validating input.
 
-As said *local* access will *not* trigger the setter and getter. Here is an 
-illustration of this: 
+As said *local* access will *not* trigger the setter and getter. Here is an
+illustration of this:
 
 ::
 
@@ -1144,7 +1153,7 @@ illustration of this:
         # Does not trigger setter/getter
         myinteger=5
         print(myinteger)
-        
+
         # Does trigger setter/getter
         self.myinteger=5
         print(self.myinteger)
@@ -1183,7 +1192,7 @@ Signals
 
 It is often desired to send a notification that something happened in an
 instance. GDScript supports creation of built-in Godot signals.
-Declaring a signal in GDScript is easy using the `signal` keyword. 
+Declaring a signal in GDScript is easy using the `signal` keyword.
 
 ::
 
@@ -1241,7 +1250,7 @@ Object.emit_signal method:
 Coroutines
 ~~~~~~~~~~
 
-GDScript offers support for `coroutines <https://en.wikipedia.org/wiki/Coroutine>`_ 
+GDScript offers support for `coroutines <https://en.wikipedia.org/wiki/Coroutine>`_
 via the ``yield`` built-in function. Calling ``yield()`` will
 immediately return from the current function, with the current frozen
 state of the same function as the return value. Calling ``resume`` on