Added examples for collision layer masks (#3863)

Co-authored-by: Hugo Locurcio <hugo.locurcio@hugo.pro>
Co-authored-by: Balloonpopper <balloonpopper@git.com>
This commit is contained in:
balloonpopper
2020-08-03 21:47:40 +10:00
committed by GitHub
parent 428106f910
commit c40d74e19b
4 changed files with 36 additions and 3 deletions

View File

@@ -521,7 +521,7 @@ If ``grabbed_object`` is ``null``, we want to see if we can pick up a :ref:`Rigi
We first get the direct space state from the current :ref:`World <class_World>`. This is so we can cast a ray entirely from code, instead of having to We first get the direct space state from the current :ref:`World <class_World>`. This is so we can cast a ray entirely from code, instead of having to
use a :ref:`Raycast <class_Raycast>` node. use a :ref:`Raycast <class_Raycast>` node.
.. note:: see :ref:`Ray-casting <doc_ray-casting>` for more information on raycasting in Godot. .. note:: See :ref:`Ray-casting <doc_ray-casting>` for more information on raycasting in Godot.
Then we get the center of the screen by dividing the current :ref:`Viewport <class_Viewport>` size in half. We then get the ray's origin point and end point using Then we get the center of the screen by dividing the current :ref:`Viewport <class_Viewport>` size in half. We then get the ray's origin point and end point using
``project_ray_origin`` and ``project_ray_normal`` from the camera. If you want to know more about how these functions work, see :ref:`Ray-casting <doc_ray-casting>`. ``project_ray_origin`` and ``project_ray_normal`` from the camera. If you want to know more about how these functions work, see :ref:`Ray-casting <doc_ray-casting>`.
@@ -537,6 +537,8 @@ the :ref:`RigidBody <class_RigidBody>` we collided with to ``MODE_STATIC`` so it
Finally, we set the grabbed :ref:`RigidBody <class_RigidBody>`'s collision layer and collision mask to ``0``. Finally, we set the grabbed :ref:`RigidBody <class_RigidBody>`'s collision layer and collision mask to ``0``.
This will make the grabbed :ref:`RigidBody <class_RigidBody>` have no collision layer or mask, which means it will not be able to collide with anything as long as we are holding it. This will make the grabbed :ref:`RigidBody <class_RigidBody>` have no collision layer or mask, which means it will not be able to collide with anything as long as we are holding it.
.. note:: See :ref:`doc_physics_introduction_collision_layer_code_example` for more information on Godot collision masks.
______ ______
If ``grabbed_object`` is not ``null``, then we need to throw the :ref:`RigidBody <class_RigidBody>` the player is holding. If ``grabbed_object`` is not ``null``, then we need to throw the :ref:`RigidBody <class_RigidBody>` the player is holding.

View File

@@ -95,6 +95,8 @@ it will typically be equal to ``0.01666...`` (but not always, see below).
physics calculations, so that the game behaves correctly if you change the physics calculations, so that the game behaves correctly if you change the
physics update rate or if the player's device can't keep up. physics update rate or if the player's device can't keep up.
.. _doc_physics_introduction_collision_layers_and_masks:
Collision layers and masks Collision layers and masks
~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~
@@ -123,7 +125,7 @@ be assigned in Project Settings -> Layer Names.
.. image:: img/physics_layer_names.png .. image:: img/physics_layer_names.png
**Example:** **GUI example:**
You have four node types in your game: Walls, Player, Enemy, and Coin. Both You have four node types in your game: Walls, Player, Enemy, and Coin. Both
Player and Enemy should collide with Walls. The Player node should detect Player and Enemy should collide with Walls. The Player node should detect
@@ -138,6 +140,34 @@ interact with. For example, the Player's settings would look like this:
.. image:: img/player_collision_layers.png .. image:: img/player_collision_layers.png
.. image:: img/player_collision_mask.png .. image:: img/player_collision_mask.png
**Code example:**
In function calls, layers are specified as a bitmask. Where a function enables
all layers by default, the layer mask will be given as ``0x7fffffff``. Your code
can use binary, hexadecimal, or decimal notation for layer masks, depending
on your preference.
The code equivalent of the above example where layers 1, 3 and 4 were enabled
would be as follows:
.. _doc_physics_introduction_collision_layer_code_example:
# Example: Setting mask value for enabling layers 1, 3 and 4
# Binary - set the bit corresponding to the layers you want to enable (1, 3, and 4) to 1, set all other bits to 0.
# Note: Layer 20 is the first bit, layer 1 is the last. The mask for layers 4,3 and 1 is therefore
0b00000000000000001101
# (This can be shortened to 0b1101)
# Hexadecimal equivalent (1101 binary converted to hexadecimal)
0x000d
# (This value can be shortened to 0xd)
# Decimal - Add the results of 2 to the power of (layer be enabled-1).
# (2^(1-1)) + (2^(3-1)) + (2^(4-1)) = 1 + 4 + 8 = 13
pow(2, 1) + pow(2, 3) + pow(2, 4)
Area2D Area2D
------ ------

View File

@@ -83,4 +83,4 @@ Make sure to set up your collision layers and masks properly so the ``KinematicB
.. image:: img/ragdoll_layer.png .. image:: img/ragdoll_layer.png
For more information, read :ref:`doc_physics_introduction` For more information, read :ref:`doc_physics_introduction_collision_layers_and_masks`.

View File

@@ -221,6 +221,7 @@ member variable:
} }
} }
See :ref:`doc_physics_introduction_collision_layer_code_example` for details on how to set the collision mask.
3D ray casting from screen 3D ray casting from screen
-------------------------- --------------------------