Feedback after a couple months with Tiled

I spent the whole year so far basically just making games in LÖVE with Tiled. I went all-in on it — the vast bulk of game data is crammed into Tiled one way or another — and it saved me an awful lot of time and effort, sometimes in ways I didn’t expect. Thank you for making it!

But, ah, I naturally ran into some frustrations too. So here those are, in the hopes that Tiled can become better. I’m on Arch Linux x64 using KDE.

I know some of these things are being addressed in the dev preview right now, but I haven’t had a chance to try it out yet. I also know some of these are known issues, in which case, here’s another vote for them. :slight_smile:

Apologies for the slightly preposterous length of this list, but I’m guessing this is a nicer format than suddenly getting 200 GitHub emails.

Map canvas

I basically just want Aseprite, but for tiles instead of pixels. :slight_smile: Tiled is close, but could stand to draw inspiration from art programs in a couple more places.

  • The mouse wheel scrolls the map vertically. This is a 2D canvas, so it ought to zoom instead.

  • Occasionally I roll the mouse wheel, and the canvas instantly jumps to some point high above the map itself.

  • Ctrl-= is ambiguous, according to Qt? I get a generic dialog that doesn’t tell me what the ambiguity is, and suggests I use Settings → Configure Shortcuts to resolve it (which of course doesn’t exist). I’m using KDE, so it might be coming from there too.

  • The shortcut for rectangular marquee is R, but I think the de facto standard is M.

  • Ctrl-Y should probably also work as Redo.

  • Switching between the eraser and brush is annoying. I’d like to just be able to pick up and “place” the empty tile with the brush. (This is how I work in Aseprite, too; I rarely use the actual eraser.)

    Curiously, this is already how the terrain tool works.

  • Right-clicking with the eraser… just erases. I do this a lot when I think I have the brush selected.

  • Right-clicking with the bucket fill doesn’t select tiles.

  • The ability to draw with a selection of several tiles is great! Alas! If I select a block of off-sized tiles from a tileset, Tiled will try to draw them in adjacent map tiles, rather than spacing them out to preserve their appearance as a block.

    I know this is unsolvable in the general case, but I’ve only ever wanted to do it with a tileset whose size is an integral multiple of the map’s tile size.

  • I can’t move chunks of the map around! The tile select tool always creates a new selection. This is really bad. Like, really, really bad. Even the PICO-8 map editor can do this. It made iterating on maps a lot more cumbersome. I can cut and paste, but that doesn’t paste empty tiles; “offset map” works on the selection, but it’s nearly useless here.

  • There’s no way to flip a tile selection — for example, if I want to make a room go right-to-left instead of left-to-right.

    An object selection offers the deceptive “flip horizontally” and “flip vertically”, but those just flip each selected object in-place, rather than flipping their positions within the selection.

  • Ctrl-Shift-A clears a tile selection, but not an object selection. I notice that the tile selection is still visible when on an object layer, and Ctrl-Shift-A will still clear it. Odd.

  • After copying or cutting a tile selection, pasting it will set it as the current brush… centered on the mouse cursor. This seems sensible enough, but if I’m copying a large block of tiles between layers — say, moving all of a particular tile onto another layer — then I have to figure out how to align them all with where they were originally.

    I think the usual image editor approach is that if the source position is still visible, then pasting will give you a floating selection in the same place; otherwise, it’s centered. Of course, Tiled doesn’t have floating tile selections, so I don’t know what the equivalent would be.

  • Selecting tiles marks the map as modified. (Perhaps because it creates an undo entry? As it should!)

  • Clicking once with the move tool marks the map as modified, despite not actually moving anything.

  • Switching to an image layer causes the move tool to be the active tool, because it’s the only one that’s valid on an image layer. Okay. Switching to any other layer then keeps the move tool as the active tool, even though I didn’t choose it myself and didn’t use it. This has caused a few surprises.

  • If I erase a tile in a spritesheet — that is, edit the image to erase the tile — but had forgotten the tile was still in use, it’s hard to notice anything’s awry. Until I draw a new tile there and something unexpected pops up in a map. :slight_smile: Not sure if there’s any good solution for this, but I’ve done it a couple times now.

  • Occasionally a tile appears to be selected, but actually isn’t, and clicking it doesn’t select it.

    I neglected to write down exactly when this happens, but I found an obvious example: with the brush selected, use right-drag to select a block of all the same tile. That tile will be the only one selected in the tileset, but clicking on it won’t change the brush to a single copy of that tile.

  • If I have the map properties open, switch to another map, and then switch back, the properties panel will now be showing a tile’s properties.

Objects

  • The tile and object select tools work totally differently. Object selection captures anything it touches, even grazes; tile selection captures (I think) only tiles that are at least halfway inside the drawn area. I frequently get these behaviors confused.

  • “Select objects” can select objects on any visible object layer, which feels very wrong to me. Simply clicking can do this, too. What’s the point of layers if not to scope edits? I don’t know what to expect the behavior to be, either — if I drag an object on another layer, should that move it to the current layer?

    I ran into this an awful lot because I had one game where a single map could also have several overlaid “submaps”, for the interiors of buildings and the like, and both the main map and the building needed identical door rectangles in the same place.

  • Perhaps because of the above, I’m always a little paranoid that I don’t have the objects selected that I think I do. Perhaps the selection rectangle could be more obvious? It’s especially hard to see if you’re using “highlight current layer”, since the background is darkened.

  • Dragging a selection to the edge of the canvas doesn’t automatically pan in that direction.

  • Direly need a way to select objects behind other objects. For what it’s worth, in Inkscape, holding Alt while clicking in the same spot will cycle through possible selectables from the top down.

    It seems like there’s a rather wide margin around objects that captures clicks, too, especially when zoomed in. Maybe it’s measured in map pixels when it should be measured in screen pixels?

  • Holding Shift while dragging an object selection ought to snap the movement to a “nice” angle.

  • I’ve tried to Ctrl-drag to clone an object on several occasions.

  • When the tile object tool is selected, there’s no preview of the tile being placed, unlike the tile tools.

  • I often find myself trying to drag a newly-created object around, but of course that just tries to create another object of the same type. I mostly do this with tiles, too; maybe because of the lack of preview.

  • When on an object layer, clicking a tile ought to switch to the tile object tool. (Tile layers work this way.)

  • There’s no way to change which tile a tile object uses.

  • In one game, the world was a single hand-drawn image, so I had to draw collision on top of it. Making small tweaks turned out to be tedious at times, because I need to use “select objects” to edit rectangles, but “edit polygons” to edit polygons. I wish the “edit polygons” tool worked on rectangles as well.

  • Deleting objects pans the canvas to center on where they were, for some reason?

  • A point type would be super.

Collision

  • Setting a lot of tiles to be completely solid is fairly tedious. I also can’t tell at a glance which tiles have what collision.

  • I’ve been indicating sprite “anchors” (or “offsets”, if you like) by putting a zero-radius circle on the tile and giving it a type “anchor”. This feels hacky, and is surely a common need; perhaps worth first-class support?

  • I wish I could see all the collision on the entire map, including for tile objects.

    This would actually help with a common problem I have with tile objects: placing them so they’re actually on the ground! Ground tiles are usually completely solid, but most of my objects have collision that stops a pixel or two before their feet, and I’m basically placing them blind. If I put them too high, then they visibly fall when the map starts; if I put them too low, they either fall through the ground or get stuck, depending on your taste in physics.

    For bonus points, let me just drag a tile object towards the ground, and stop it automatically when it collides.

    For extra bonus points, show me all overlapping collision shapes in the map!

    But also note that sometimes I use the collision editor to draw things that are not collision.

  • The collision editor seems to switch tools completely at random.

    I frequently have “select objects” active, then I pick another tile, then I tab back to the collision editor, and I find that it’s now drawing circles or something. Sometimes it’ll draw a circle for my first click, then revert back to select. I have absolutely no idea what’s going on here.

  • Similar to the problem with pasting tiles: sometimes I want to copy/paste a collision box to several tiles, but the paste is relative to the mouse cursor rather than the tile, so I have to manually check the positioning every time. I don’t know the right answer here either, since the current behavior is also useful sometimes.

  • When looking at the collision for an external tileset, everything is disabled. I can’t select objects to see their properties. I can’t even zoom!

Animation

  • I can’t change the framerate of multiple frames at once. Similarly, I can’t change the framerate of every frame at once.

  • There’s no timeline or other indication of where in the animation we are, which can be confusing for animations that use the same frames several times with different timing.

  • If the tiles are particularly large, it’s very easy to get lost in the frame list.

  • You can’t zoom the animation preview.

  • The tile list is completely distinct from the tileset view. If you have a lot of tiles that are fairly similar — say, a detailed walk animation — it can be difficult to pick out the right frames. The tileset view has a few useful landmarks, like the filmstrip overlay for animated tiles, or the list of tile properties.

  • There’s no way to specify that an animation stops.

  • There’s no way to specify that an animation loops to a tile other than the first (or, equivalently, has a lead-in).

  • There’s no way to copy an animation’s timing, but use different tiles.

Shared tilesets

Looking forward to trying the dev builds! Having to import/export every time I wanted to make a change has been kind of a drag. :slight_smile: I even lost a significant chunk of work once — I’d made a bunch of changes in one map, then made another small change from a second map, but the second map didn’t realize the tileset changed and “imported” a stale copy of it, which then overwrote the other changes. Oops.

  • Adding an external tileset doesn’t switch to its tab in the tileset panel, even though the very next thing I want to do is always use one of its tiles.

  • If I change the width of a spritesheet used by a tileset, Tiled asks if I want to adjust tile references. Awesome. If I do that with a shared tileset, every open map using that tileset will ask me. Again, awesome.

    Of course, the tileset will still appear to be wrong until I manually import and re-export it. If I do that before I’ve fixed all the maps that use it… then Tiled won’t realize anything changed, and I’ll have to fix the tiles by hand. Auuggghhh.

    I don’t know what the right answer is here. I see mention of work on a way to swap tiles, which will at least make manual fixing easier.

Terrain

I mention this almost-last because I have the least experience with it; I basically picked it up at the last minute because I realized I was running out of jam time and manually placing edge tiles was taking way too long.

  • The terrain editor should probably work by toggling, rather than needing an explicit erase mode? I can see how erase mode would be useful for deleting a terrain type no matter what it is, but if I click on a corner that’s already using the current type, surely it should just clear the type.

    Also, the little quarter-circle preview under the cursor looks exactly the same whether drawing or erasing, which is probably not right.

  • If I use the terrain tool to right-click a tile that’s solidly a particular type, the terrain tool will switch to that type. Cool. But if I right-click an edge tile, the terrain tool will switch to erase mode.

  • The terrain tool does incredibly bizarre things to existing un-edged terrain. If I have a full tileset (visible here) and a block of middle tiles, then the terrain tool will propose… uh…

    I don’t know what’s going on here; you can see I do have edge tiles, and the terrain tool otherwise draws them just fine.

  • Perhaps the same problem, but if I have otherwise-correct terrain that’s missing a single tile, like so:

    The terrain tool can’t fix this. If I hold Ctrl while aiming at the upper-right corner of the missing tile, I get nothing at all. Aiming at other nearby quadrants gives various goofy suggestions that generally involve adding several other new tiles.

  • I have some special tiles that fit with this terrain, but should never be placed by the terrain tool. For example, sloped or stair tiles.

    Trouble is, I can’t flag them with a terrain type, or the terrain tool will think they’re one of a few random choices and place them whenever it feels like it. (That might even be kind of neat, but I don’t think I can express the right constraint here; obviously these pairs of tiles should always go together.) But since they’re not flagged, if I use the terrain tool anywhere near them, it’ll try to replace them with the “correct” tiles.

  • It’s very cool that the terrain tool can choose randomly from a handful of variants. Wild pie-in-the-sky idea: flexible enough constraints that I could implement Wang tiles?

    I think I’m asking for the terrain tool to evolve into a little constraint engine.

  • I have a game that has an awful lot of cave walls, so I drew a 2×2 block of tiles and floodfilled them everywhere to reduce the sameyness. (Very cool that Tiled can do this!) Unfortunately, this hamstrings me a little bit in future editing, because now the magic wand and color picker tools won’t work so well on them. Also, since I used a consistent grid pattern, moving anything around means I may have to fix the pattern.

    I found myself wishing for a terrain floodfill as well, for example for filling the space around an enclosed map with solid tech tiles. Using regular floodfill would mostly work, but I’d have to also take care of all the outer edges left by the terrain tool.

  • I used the terrain tool with the above tech-y tileset to fairly great effect, and it saved me a lot of time. Unfortunately, I never got it to work very well with a dirt tileset, and I eventually figured out the problem was that several shapes of tiles were missing entirely. For example, I didn’t have inner corner tiles; I’d just been using solid dirt tiles instead. There’s no way for me to me to explain this to the terrain tool, so it tried to avoid those kinds of tiles by breaking everything into distinct rectangles.

  • The grass tile also has a “background” variant (next to the top left) that needs to go on a layer behind all regular grass. I think automapping can do this, but (a) it seems relevant to the idea of terrain and (b) I don’t know if automapping can remove the background tile when I remove the foreground tile.

  • How would I mark 1-tile-wide terrain? 1×1 tiles exist, and marking 1×n would be useful for pipes and wires and thin connections between other kinds of terrain.

I’ve got to stress that the terrain tool is a lovely concept that’s fairly well-implemented, and quite cleverly avoids bogging the actual map down with metadata. With a little TLC, it could be phenomenal.

I’ve also tried automapping in the past, but it seems very tedious to set up for similar edge cases; for example, you can’t just say that some set of 12 tiles are all “water” tiles, you’d have to actually make 12 input layers and place them all… every single time. But this is the kind of information that the terrain tool already has! I think both features would be much improved if they could use each other’s capabilities, or even were merged somehow.

Game-specific amenities

I think the last tile-based game-specific map editor I used was MegaZeux, so my inspiration might be a tad retro here.

  • I’d love to be able to say that a particular tile can only go on a particular layer (or a layer with some particular properties, or whatever). Ideally I wouldn’t even be prevented from placing it; it would just go on the nearest correct layer, whatever that means.

  • I’d also love to be able to say that a particular tile can only exist as an object, not directly on the map; or that a tile should only be placable on the map; or that a tile can never be placed at all.

    I had a fun bug where I accidentally placed the “powered on” states of some wires, but only the “powered off” states were recognized specially by the engine. So the wires still appeared in-game, but didn’t actually work, and I was very confused for a few minutes.

  • Honestly, it would be nice to just have a palette of all “valid” stuff that can go on the map so I don’t have to navigate a little minefield of unused tiles and alternate states and whatnot. :slight_smile:

  • Sometimes I have a property that’s quite important to my engine, and thus to me, and I’d like to know about it. Collision shapes, for example, can be flagged as being one-way platforms, which gives them rather different behavior. It’d be nice if this could somehow cause them to show in a different color, or with some other visual effect, without having to create a separate object type for every such variant.

    I imagine I’ll want this all the more when I start messing with tile types!

  • Relatedly: there’s no way to find a tile, object, collision object, or layer by name or property or property value (or tile, in the case of tile objects).

  • Tiles can’t draw from a fixed list of properti— oh, you just fixed that. Never mind, then. And thank you. :slight_smile:

  • I have platforms as tile objects, and I have platform tracks as polylines, but I don’t have a nice way to connect the two. I suppose this is the usual request for “link objects” or “objects as a property type”… but for a platform, I wouldn’t just want a visual link between the platform and track. I’d want the platform to be physically attached to the track.

  • Being able to view or edit the properties of several maps at a time would be useful. Perhaps something for a “project” which contains all of a game’s maps?

  • Tiled supports a lot of stuff, which is great, but I don’t support all of it. For Tiled to be appropriate for other people to use to map for an arbitrary engine, it’d have to be possible to disable (in a project settings file or something) unsupported features. For example, I’ve always treated Tiled’s rectangles as AABBs, but Tiled allows rotating them; I don’t support flipped tiles; I haven’t implemented collision with ellipses or polylines. Nothing’s stopping anyone from putting those in a map and throwing it at my game, but they’ll probably be a bit confused by the results.

3 Likes

It’s amazing that you could do such a thing and great to hear that you’ve enjoyed using Tiled in the process!

I think it’s better this way too. I can’t reply to everything at once, so I’ll go category by category. Thanks a lot for providing all this detailed feedback! And good timing too, now that many student are looking to submit their first patch as part of applying to the Google Summer of Code. :slight_smile:

Map canvas

Opened Consider zooming with mouse wheel by default · Issue #1472 · mapeditor/tiled · GitHub

Hmm, I never noticed this myself and it’s the first time I head about it. Any specific way to reproduce it?

Sounds like an issue limited to KDE indeed, but would be interesting if we can find a workaround for this.

Not sure, but I based the shortcuts on GIMP which uses R for Rectangular Select and M for the Move Tool. I guess this would be something for configurable shortcuts.

I agree it probably doesn’t hurt to have both, so consider it done.

Right, sometimes this is what you want, sometimes it isn’t. If any empty tile in the brush would erase what is already there, then it would be annoying to work with any non-rectangular brush that is meant to only modify the part it is placing. I’m not sure how Asesprite works here, but in GIMP a textured brush works the same way.

Maybe this should be a toggle once a tool-specific toolbar UI is introduced.

The terrain tool is different in the sense that it never has empty parts in its stamp. It either places some terrain, or it places no terrain (erases).

It’s actually since recently a rectangular erase. Of course, that doesn’t help clear up confusion between doing rectangular erase and capturing a stamp. Not sure what to do here.

Yeah, I agree it should. It’s covered by issue #790.

I’ve opened an issue about this: Smarter behavior when selecting multiple tiles from the tileset · Issue #1474 · mapeditor/tiled · GitHub

Yeah, it’s definitely a weak point for Tiled. There’s an issue open about adding a Move Selection feature.

You can flip by capturing (or cutting) the tiles, pressing Y or X to flip in either direction, and then painting the section again. What people often run into though, is that this also flips the tile graphics. So a way of flipping without affecting graphics would be needed.

Yeah, there’s a TODO entry about this in the code… I’ve turned it into a bug report.

Ctrl+Shift+A does clear an object selection. Whether it clears the tile selection or the object selection depends on whether you have a tile layer or object layer selected. I can’t reproduce the behavior you described.

Indeed Tiled doesn’t have floating selection, but for this use-case “Paste in Place” was added (for objects in Tiled 0.17, for tiles in Tiled 0.18).

That’s indeed because there is an “unsaved” undo entry. It’s not really an issue, is it? Would be some work to change, since we could no longer rely on QUndoStack::isClean.

Yeah, I also noticed this, and now it’s fixed. :slight_smile:

I find this also very annoying. Unfortunately the tool manager at the moment doesn’t know why some tool may choose to disable itself or not, and it only takes action when the current tool becomes disabled. I could try to find some way to make it switch to the last active tool for each layer type, or maybe it should not switch tools at all and the tool should just refuse to work. What do you think?

A solution I’ve seen in some projects is to not just erase the tile, but to replace it with a noticeable dummy graphic. As for Tiled, it could probably provide some kind of “erase empty tiles” feature somewhere.

Right, only a change in the selection causes the stamp to be updated. Now it happens on mouse click as well.

Hmm, this happens until Tiled 0.18 when the selected tileset is not the first one, because switching back to the map also switched back to that tileset, which then sets that tile at the current object. The problem is gone in the development snapshots, because you can no longer change tileset, tile or terrain properties directly from the map editor (you need to switch to the tileset editor for that).

If you get a chance to try out the development snapshots, I’d really welcome feedback about the changes there as well!

[quote=“bjorn, post:2, topic:2090”]

Not sure! It seemed very sporadic — enough that I remembered to mention it, but not enough that I noticed any clear cause. I’ll keep an eye out.

Still not sure exactly what’s going on here. KDE does have a notion of “standard shortcuts”, used for common operations in all KDE (or all Qt?) applications. It lists “zoom in” as one such operation, and Ctrl-= is one of the shortcuts… but it also has Ctrl-- for zoom out, and that works fine in Tiled.

Wish it would tell me what the conflict is

Oh, whoops, you’re right. Aseprite uses M for rectangular marquee (and V for move), and for some reason I’d thought Krita did the same, but no, it uses Ctrl-R. So much for a de facto standard, then. :slight_smile:

I hadn’t thought about the impact on larger brushes. Hmm, tricky.

It looks like Aseprite brushes, at least created with Edit > New Brush, treat transparent like any other color (which it is) and overwrite whatever’s underneath. I pushed a lot of buttons but couldn’t find a way to get “compositing” behavior.

That same behavior in Tiled would be a bit more troublesome, since it uses brushes in place of floating selections. :slight_smile: I suppose you could say that the empty tile overwrites when the brush is exactly one empty tile, and otherwise it’s ignored? Not sure how intuitive that would be.

Oh, that’s interesting, and might’ve saved me time once or twice if I’d realized what it was doing. :slight_smile: What if the status bar said somewhere what you’re doing, taking mouse buttons and modifier keys into account? So left-clicking would just say “Erase”, but right-click would show “Rectangular Erase” for a brief moment. I think GIMP and Inkscape both do this with most tools.

Oh! I didn’t realize those worked on tiles. I wasn’t even sure how to flip individual tiles, and only knew it was possible because I saw the high gid bits mentioned in the file format docs. This isn’t listed in a menu anywhere, and there’s no context menus for tiles, so I don’t think there’s any way to discover this unless you see it in an object context menu and think to try it.

So you have a similar problem with both tiles and objects: I might want to reverse their positions, or I might want to flip them individually, or both. Some combination of X, Shift-X, Alt-Shift-X? Can’t use Ctrl-X, which makes it a bit tricky.

Ah, and even if I’d just flipped the tiles, I’d still have to fix all the edges manually. So you need a terrain-aware flip, too. :slight_smile:

Interesting! I just tried it again (0.18.1) and it still works as I said. Edit > Select None (which lists Ctrl-Shift-A as its shortcut) is likewise only enabled when I have a tile selection, regardless of what kind of layer I’m on.

Aha, I noticed that but didn’t realize what it did and never thought to try it. Nice, thanks!

Not a huge one, no. Just led to some frantic Ctrl-Zing once or twice.

I wonder how Krita handles this? Maybe it just marks the stack clean again if it only became dirty due to a selection change?

Does it not already switch to the last active tool for the layer type? That seems to be what happens when I go back and forth between tile and object layers with tile and object tools active. I assumed the move tool was only misbehaving because it works on any type of layer, so Tiled doesn’t think it’s necessary to switch tools.

Yeah, I need to get in that habit.

Maybe if “select same tile” could pick from the tileset? Not much of a solution if you have a lot of blank tiles, though. It might be nice in general for finding tiles if you don’t already know where on the map they are.

Ah, that makes sense.

I’ll definitely give the snapshots a spin when I can! For the moment, I’m a bit swamped catching up on everything I put off during February. :slight_smile: Hopefully I’ll have some game time again within a week or so.

Objects

I agree, and now I’ve changed it. The only difference that remains is that simply clicking still clears the tile selection, because I think selecting a single tile in this case would be annoying more often than it is useful.

The layers have different use-cases so I can’t assume that when you have one layer selected, that you don’t want to select objects from other layers. One improvement that has been made recently is that when selecting an object, its layer is selected along with it.

For preventing the interaction with objects from layers that you do not currently want to edit, there is currently only the option of hiding those other layers. A planned improvement there is to add layer locking (and maybe also object locking). Also, the layers now form a hierarchy, making the use of layer visibility (and locking in the future) more useful since it could be applied to groups of layers.

Hmm, I agree the selection rectangle could use some improvement, especially on dark backgrounds. I’ve opened an issue about it.

Right, something I left out because of the feedback issues that can cause. I agree it should be there though, but care should be taken that it’s not going to scroll vast distances really fast (Inkscape gets this wrong, for example). It has an issue on GitHub now.

Yeah, I’ve been planning to get around to implementing that. I’ve opened an issue about this now.

… to be continued …