Suggestions

Sep 7, 2010 at 6:49 PM

Hey,

I've been testing out tIDE this evening, and unfortunately I've made the decision to go back to Tiled. I thought it worth posting my reasons here, so they might be considered for future versions. Some of your features (AutoTiles, Parallax Scrolling, Animated Tiles) are great, but I feel the issues below outweigh them.

  • Performance issues - As posted in another thread, I get "Not Responding" when loading 1000x1000 textures (25x25 per tile), and the tile window is a little sluggish
  • No ability to select multiple tiles from the tile window - In tiled, I see the texture as-is, and can highlight a block of tiles very easily from the tileset and paste them in
  • Auto-scrolling of window when the mouse gets near the edge was really annoying, and no way to turn it off
  • Install requirement (not a big deal, but I much prefer things I can run without installing, like Tiled, so I can test them out without the install/uninstall cycle)
  • No "object" support, eg. for placing spawn point, level goal, etc. Can probably be achieved with tiles, but feels clumsy

This was all fairly minor stuff, but the big problem, was when I came to actually trying to render something in XNA.

  • No documentation/sample for loading into XNA (if there is, I couldn't find it)
  • Confusing API - Do I really have to do "XTile.Format.FormatManager.Instance.DefaultFormat.Load(blah)"? What's wrong with "new Map(filename)"?
  • No content pipeline support
    • Should be content.Load<Map>("Blah")
  • Seemingly had to implement my own IDisplayDevice before I could render anything?

Unfortunately, I gave up before even getting the sample level to render. I really like the idea, and I think tIDE can do really well, but it does need a little work before I'd recommend it over Tiled.

Hope this isn't taken negatively, and I'll keep popping by to see how things progress!

Sep 7, 2010 at 11:28 PM
Edited Sep 7, 2010 at 11:41 PM
This is exactly the kind of critique that I need to improve this editor, and I will try to address these as best as I can. In the meantime, let me comment on the issues you mentioned:

  • Performance issues - As posted in another thread, I get "Not Responding" when loading 1000x1000 textures (25x25 per tile), and the tile window is a little sluggish
The editor builds a cache of individual tile image objects in memory. These speed up the editor considerably while editing, but the caching process itself is still very slow. I will need to investigate this problem and hopefully find a remedy.

  • No ability to select multiple tiles from the tile window - In tiled, I see the texture as-is, and can highlight a block of tiles very easily from the tileset and paste them in
The tIDE tile picker does not preserve the tile set image or texture as you call it. However, it is possible to select an arbitrary portion from a layer containing individually placed tiles and copy and paste this somewhere else. Alternatively, once a selected portion is chosen, it can be stored as a tile brush and reused via the tile brush tool. This was my approach to handling composite tile drawing. The one thing that is sorely missing and that I need to address is the ability to persist these tile brush definitions in a map file as these are lost once a new map is loaded or created, or when the user quits the editor.

  • Auto-scrolling of window when the mouse gets near the edge was really annoying, and no way to turn it off
My aim for this was to let users navigate around a map while building it, without having to move away from the editing area in order to use a scrollbar. To be honest I have tried tweaking this to make it practical but experience is showing that this is not really working well. In fact, I am considering scrapping auto-scrolling altogether.

  • Install requirement (not a big deal, but I much prefer things I can run without installing, like Tiled, so I can test them out without the install/uninstall cycle)
This should be no biggie as I can add a release containing the EXE file itself. The in-build documentation is actually contained within the executable so it is convenient. There are a couple of things the the installer handles however:
  1. it creates a Plugins directory in the same location where the application is installed. Without this, the editor will complain once when it is loaded, but this can be quickly dismissed by clicking an OK button
  2. it associates the .tide file extension with the editor, such that double-clicking on a tIDE map file in Windows explorer automatically opens the map in a new running instance of the editor

 

  • No "object" support, eg. for placing spawn point, level goal, etc. Can probably be achieved with tiles, but feels clumsy
Tiled supports object layers, in which rectangular regions can be defined and annotated with custom properties. tIDE does not have object layers, but instead, it allows custom properties to be defined on any tile placed in a layer. Defining custom properties for rectangular regions can be implemented by placing the required custom properties in the top-left corner tile of the desired region, and adding further properties such as "RegionWidth" and "RegionHeight" to identify the region. Since custom properties would need to be interpreted by your application (say, a game) anyway, these width and height properties can be used to set up region objects within the game. In addition, custom properties can also be defined at layer level, tile sheet level and at the map level. A further note on this: I am considering enhancing the Tiled map loader to process object layers and definitions and treat them as custom properties in the manner described above.

  • No documentation/sample for loading into XNA (if there is, I couldn't find it)
You got me there.. work on the XNA integration bit is severely lacking.

  • Confusing API - Do I really have to do "XTile.Format.FormatManager.Instance.DefaultFormat.Load(blah)"? What's wrong with "new Map(filename)"?
The API complexity is due to the decoupling of three aspects of model loading:
  1. Resource aquisition - this could come from a plain file in a Windows environment or from the XNA content manager
  2. File format management - a manager pattern is used to maintain format loaders and savers via an abstract interface. This interface also defines a means of identifying compatibility issues. For example, it would prevent a multi-layer file to be saved to a format that does not support layers, or it might warn the user that only the first layer will be stored.
  3. Separation of the map representation code and logic from file format management code.
Having said that, I will look into providing convenience methods in the API to simplify activities such as map loading.

  • No content pipeline support
    • Should be content.Load<Map>("Blah")
Guilty as charged - no work done yet in that department.

  • Seemingly had to implement my own IDisplayDevice before I could render anything?
There is an XnaDisplaydevice under namespace XTile.Display in the PC, X360 and Zune XTile projects. However this is all untested code. Eventually I would like to add an XNA demo as part of the source code suite and as a separate demo application release. For this, I will need to have the XNA content loader in place. Alternatively, I could set up a PC-only demo that loads tIDE files directly from disk.

I really appreciate the time you've taken to try out the editor and particularly, the time spent on trying to get the XNA code working. For now, I will set up a number of tasks relating to these issues and will start working on them as soon as possible.

Sep 8, 2010 at 7:35 AM

Hi Colin,

Thanks for the reply. A few comments (replied to in order of the above, to avoid re-quoting the whole lot):

Performance
I think shifting this to a BackgroundWorker would be trivial, and won't stop the app from painting (BackgroundWorker runs DoWork on a background thread, and the Completed event back on the UI thread).

Selecting Multiple Tiles
I think this feature is a big deal. I know you can build brushes from things on the layer, but getting them there is tricky. I try to use one tileset for my level (better performance if you can avoid switching textures), but it means I might have some elements that are a number of tiles (eg. 5x5), and it's a real pain to have to put them in one at a time before I can then duplicate them. This aspect works really well in Tiled, and I think it should be considered.

Autoscrolling
I don't think the idea is bad here, but it makes it hard to put tiles near the edge of the screen (because it moves!). A simple toggle option would be good. You could try adding a big margin (when it's turned on), and scrolling when the mouse is over the margin, rather than some tiles - that might make it less annoying.

Portable Zip
For something like this, I think being able to test it out without installing is great (or running multiple versions, etc.). I understand it won't set up file extensions etc., but you can make it a "secondary" download, and still push the installer as the main download (since I'm sure most people would prefer that).

Object Support
One of the reasons I like this in Tiled (though unfortunately only the Java one supports it), is that you can set an object, and give it an image to render in the editor. This means you can set a "Spawn Point" object, and give it a static image of your character, and it's much easier to visualise. You solution works, but it feels like a bit of a hack (esp.  if it's multiple tiles). This isn't an important feature (esp. as it's likely quite a bit of work), but something to think about if there's an easy way to get it in.

Confusing API
I appreciate what you're trying to do, but I do worry the XNA interface might feel a bit weird as a result of this abstraction. The interface of TiledLib is very good (one line to load the map via contentManager, and then an Update and Draw call, and you're rendering!), so I would aim for something as simple. People are turned away by an API that doesn't let them get up and running quickly (eg. I had to create my own FileStream to load the map - that didn't really feel right in XNA :-))