Files
godot-docs/tutorials/2d/using_tilemaps.rst
2019-05-26 18:48:19 -07:00

167 lines
5.9 KiB
ReStructuredText

.. _doc_using_tilemaps:
Using tilemaps
~~~~~~~~~~~~~~
Introduction
------------
A tilemap is a grid of tiles used to create a game's layout. There are several
benefits to using :ref:`TileMap <class_TileMap>` nodes to design your levels.
First, they make it possible to draw the layout by "painting' the tiles onto a
grid, which is much faster than placing individual :ref:`Sprite <class_Sprite>`
nodes one by one. Second, they allow for much larger levels because they are
optimized for drawing large numbers of tiles. Finally, you can add collision,
occlusion, and navigation shapes to tiles, adding additional functionality to
the TileMap.
.. image:: img/tileset_draw_atlas.png
Project setup
-------------
This demo we'll use the following tiles taken from Kenney's "Abstract Platformer"
art pack. You can find the complete set `here <https://kenney.nl/assets/abstract-platformer>`_
but for this demo we'll stick to this small set.
.. image:: img/tilesheet.png
Create a new project and place the above image in the project folder.
When using a tileset, it's important that adjacent tiles match up. Godot's default
is to import 2D images using an interpolated "filter" mode, which will result in
ugly borders between the tiles. Select the image and click the Import tab. Turn
off ``Filter`` and click "Reimport". See :ref:`doc_import_images` for details.
TileMap node
------------
Add a new :ref:`TileMap <class_TileMap>` node to the scene. By default, a TileMap
uses a square grid of tiles. You can also use a perspective-based "Isometric" mode
or define your own custom tile shape.
.. image:: img/tilemap_mode.png
Under the "Cell" section in the Inspector are many properties you can adjust to
customize your tilemap's behavior:
.. image:: img/tilemap_size.png
- ``Cell Size``
This defines the size of the grid. This should match the pixel size
of your tiles. The default value is ``(64, 64)``.
- ``YSort``
This causes tiles to be drawn in order of their ``Y`` position, so that
"lower" tiles are drawn on top of "higher" ones.
- ``Half Offset`` and ``Tile Origin``
These properties affect the position of the tile relative to the grid position.
- ``Quadrant``
Defines the chunk size used for batched drawing. This can negatively
affect performance. Don't change it unless you know what you're doing.
- ``Custom Transform``
Used to alter the tile's shape. Use this if you have non-square tiles.
All of these options can be left at their defaults for this demo.
Creating a TileSet
------------------
Once you've configured your tilemap, it's time to add a
:ref:`TileSet <class_TileSet>`. A TileSet is a
:ref:`Resource <class_Resource>` that contains the data about your
tiles - their textures, collision shapes, and other properties. When the game
runs, the TileMap combines the individual tiles into a single object.
To add a new TileSet, click on the "Tile Set" property and select "New
TileSet".
.. image:: img/tilemap_add_tileset.png
When you do this, the "TileSet" panel will open at the bottom of the editor
window:
.. image:: img/tilemap_tool.png
First, you need to add the texture(s) that you'll use for the tiles. Click the
"Add Texture(s) to TileSet" button and select the ``tilesheet.png`` image.
Next, click "New Single Tile" and drag in the image to select the tile you want.
Click the "Enable Snap" button to make it easier to select the entire tile. A
yellow rectangle appears around the selected tile.
.. image:: img/tilemap_add_tile.png
Click on the TileMap in the scene tree, and you'll see that the newly created
tile now appears on the right side. Click in the viewport and you can place
tiles. Right-click to remove them.
.. image:: img/tilemap_draw.png
It's easy to accidentally select and move the tilemap node. To avoid this, use
the node's lock button:
.. image:: img/tile_lock.png
Collision Shapes
----------------
If you're making a map that needs collisions - walls, floor, or other obstacles,
for example - then you'll need to add collision shapes to any tiles that you
want to be considered "solid".
Click "TileSet" at the bottom of the editor window to return to the tileset
tool. Click the tile you previously defined (outlined in yellow). Select the
"Collision" tab and click the "Create a new rectangle" button. Make sure you
still have grid snap enabled, then click and drag in the tile. A square
collision shape appears in light blue:
.. image:: img/tileset_add_collision.png
You can add occlusion and navigation shapes to the tile in the same way.
Atlas tiles
-----------
Rather than adding individual tiles one at a time, you can define a group of
tiles all at once using an atlas. Click "New Atlas" and drag to select the
entire tile sheet.
.. image:: img/tileset_atlas.png
If you haven't already, make sure to change the "Step" in the snap settings to
`(64, 64)`, or your tiles may be chopped into smaller pieces. You can find
this in the Inspector:
.. image:: img/tileset_snap.png
Once you've defined the atlas you can add collision shapes to the individual
tiles as before. You can also click "Icon" to select one of the tiles to represent
the atlas.
Back in the TileMap, you can select the atlas tile and you'll see all of the
tiles it contains:
.. image:: img/tileset_draw_atlas.png
In addition to saving time when defining the tiles, this can help by grouping
similar tiles together when you're working with a large number of tiles.
Tips and tricks
---------------
- If you're using a :ref:`Camera2D <class_Camera2D>` to scroll your level, you
may notice lines appearing between your tiles. To fix this, open Project
Settings and enable "Use Pixel Snap" in the "Rendering/Quality" section.
- You can flip and rotate tiles using the icons at the top right of the editor.
- To draw straight lines, hold <Shift> while clicking and dragging a tile.
- Tools such as copy, paste, and bucket fill, can be found in the "TileMap"
menu in the upper-right.
.. image:: img/tilemap_menu.png