A variety of clarity changes to the your-first-game tutorial (#517)

* A variety of clarity changes to the your-first-game tutorial

* Requested changes from review
This commit is contained in:
casey-mc
2017-10-13 01:24:58 -06:00
committed by Nathan Lovato
parent 84a3c21ba6
commit 300951b2c1
3 changed files with 34 additions and 11 deletions

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 34 KiB

After

Width:  |  Height:  |  Size: 21 KiB

View File

@@ -33,7 +33,8 @@ Launch Godot and create a new project. Then, download
using to make the game. Unzip these files in your new project folder. using to make the game. Unzip these files in your new project folder.
.. note:: For this tutorial, we will assume you are already familiar with the .. note:: For this tutorial, we will assume you are already familiar with the
Godot Engine editor. If you haven't read :ref:`doc_scenes_and_nodes`, do so now. Godot Engine editor. If you haven't read :ref:`doc_scenes_and_nodes`, do so now
for an explanation of setting up a project and using the editor.
This game will use "portrait" mode, so we need to adjust the size of the This game will use "portrait" mode, so we need to adjust the size of the
game window. Click on Project -> Project Settings -> Display -> Window and game window. Click on Project -> Project Settings -> Display -> Window and
@@ -150,8 +151,9 @@ that's a good time to find the size of the game window:
func _ready(): func _ready():
screensize = get_viewport_rect().size screensize = get_viewport_rect().size
Now we can use the ``_process()`` function to define what the player Now we can use the ``_process()`` function to define what the player will do.
will do every frame: The ``_process()`` function is called on every frame, so we'll use it to update
elements of our game which we expect to be changing often. Here we'll have it:
- check for input - check for input
- move in the given direction - move in the given direction
@@ -196,6 +198,10 @@ We can prevent that if we *normalize* the velocity, which means we set
its *length* to ``1``, and multiply by the desired speed. This means no its *length* to ``1``, and multiply by the desired speed. This means no
more fast diagonal movement. more fast diagonal movement.
.. tip:: If you've never used vector math before (or just need a refresher)
you can see an explanation of vector usage in Godot at :ref:`doc_vector_math`.
It's good to know but won't be necessary for the rest of this tutorial.
We also check whether the player is moving so we can start or stop the We also check whether the player is moving so we can start or stop the
AnimatedSprite animation. AnimatedSprite animation.
@@ -222,6 +228,7 @@ AnimatedSprite is playing based on direction. We have a "right"
animation, which should be flipped horizontally (using the ``flip_h`` animation, which should be flipped horizontally (using the ``flip_h``
property) for left movement, and an "up" animation, which should be property) for left movement, and an "up" animation, which should be
flipped vertically (``flip_v``) for downward movement. flipped vertically (``flip_v``) for downward movement.
Let's place this code at the end of our ``_process()`` function:
:: ::
@@ -273,7 +280,7 @@ Add this code to the function:
:: ::
func _on_Player_body_entered( area ): func _on_Player_body_entered( area ):
hide() hide() # Player disappears after being hit
emit_signal("hit") emit_signal("hit")
monitoring = false monitoring = false
@@ -316,6 +323,8 @@ create any number of independent mobs in the game.
Node Setup Node Setup
~~~~~~~~~~ ~~~~~~~~~~
Click Scene -> New Scene and we'll create the Mob.
The Mob scene will use the following nodes: The Mob scene will use the following nodes:
- :ref:`RigidBody2D <class_RigidBody2D>` (named ``Mob``) - :ref:`RigidBody2D <class_RigidBody2D>` (named ``Mob``)
@@ -325,9 +334,9 @@ The Mob scene will use the following nodes:
- :ref:`VisibilityNotifier2D <class_VisibilityNotifier2D>` (named ``Visibility``) - :ref:`VisibilityNotifier2D <class_VisibilityNotifier2D>` (named ``Visibility``)
In the :ref:`RigidBody2D <class_RigidBody2D>` properties, set ``Gravity Scale`` to ``0`` (so In the :ref:`RigidBody2D <class_RigidBody2D>` properties, set ``Gravity Scale`` to ``0`` (so
that the mob will not fall downward). In addition, under that the mob will not fall downward). In addition, under the
``PhysicsBody2D``, click the ``Mask`` property and uncheck the first ``PhysicsBody2D`` section in the Inspector, click the ``Mask`` property and
box. This will ensure that the mobs do not collide with each other. uncheck the first box. This will ensure that the mobs do not collide with each other.
.. image:: /img/set_collision_mask.png .. image:: /img/set_collision_mask.png
@@ -411,8 +420,7 @@ follows:
- ``StartTimer``: ``2`` - ``StartTimer``: ``2``
In addition, set the ``One Shot`` property of ``StartTimer`` to "On" and In addition, set the ``One Shot`` property of ``StartTimer`` to "On" and
set ``Position`` of the ``StartPosition`` node to ``(240, 450)``. Now add a set ``Position`` of the ``StartPosition`` node to ``(240, 450)``.
script to ``Main``.
Spawning Mobs Spawning Mobs
~~~~~~~~~~~~~ ~~~~~~~~~~~~~
@@ -425,7 +433,8 @@ you will see some new buttons appear at the top of the editor:
.. image:: /img/path2d_buttons.png .. image:: /img/path2d_buttons.png
Select the middle one ("Add Point") and draw the path by clicking to add Select the middle one ("Add Point") and draw the path by clicking to add
the points shown. the points shown. To have the points snap to the grid, make sure "Use Snap" is
checked. This option can be found under the "Edit" button to the left of the Path2D buttons.
.. image:: /img/draw_path2d.png .. image:: /img/draw_path2d.png
@@ -527,16 +536,24 @@ HUD
The final piece our game needs is a UI: an interface to display things The final piece our game needs is a UI: an interface to display things
like score, a "game over" message, and a restart button. Create a new like score, a "game over" message, and a restart button. Create a new
scene, and add a ``CanvasLayer`` node named ``HUD`` ("HUD" stands for scene, and add a :ref:`CanvasLayer <class_CanvasLayer>` node named ``HUD`` ("HUD" stands for
"heads-up display", meaning an informational display that appears as an "heads-up display", meaning an informational display that appears as an
overlay, on top of the game view). overlay, on top of the game view).
The :ref:`CanvasLayer <class_CanvasLayer>` node lets us draw our UI elements on
the layer above the rest of the game so that the information it displays doesn't get
covered up by any game elements like the player or the mobs.
The HUD displays the following information: The HUD displays the following information:
- Score, changed by ``ScoreTimer`` - Score, changed by ``ScoreTimer``
- A message, such as "Game Over" or "Get Ready!" - A message, such as "Game Over" or "Get Ready!"
- A "Start" button to begin the game - A "Start" button to begin the game
The basic node for UI elements is :ref:`Control <class_Control>`. To create our UI,
we'll use two types of :ref:`Control <class_Control>` nodes: The :ref:`Label <class_Label>`
and the :ref:`Button <class_Button>`.
Create the following children of the ``HUD`` node: Create the following children of the ``HUD`` node:
- :ref:`Label <class_Label>` (named ``ScoreLabel``) - :ref:`Label <class_Label>` (named ``ScoreLabel``)
@@ -670,6 +687,12 @@ Connect the ``timout()`` signal of ``MessageTimer`` and the
Connecting HUD to Main Connecting HUD to Main
~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~
Now that we're done creating the ``HUD`` scene, save it and go back to ``Main``.
Instance the ``HUD`` scene in ``Main`` like you did the ``Player`` scene, and place it at the
bottom of tree. The full tree should look like this, so make sure you didn't miss anything:
.. image:: /img/completed_main_scene.png
Now we need to connect the ``HUD`` functionality to our ``Main`` script. Now we need to connect the ``HUD`` functionality to our ``Main`` script.
This requires a few additions to the ``Main`` scene: This requires a few additions to the ``Main`` scene: