The Design Principles of Vectarine
Vectarine has 3 main goals, listed in order of importance:
- Don’t waste people’s time and be fun to use
- Empower makers to create whatever they can imagine
- Run anywhere without lag to reach the largest audience possible
Most guidelines derive from these goals. For each one, we give an example of a feature designed with this principle in mind.
Not wasting time and having fun are one goal as people have fun when they are productive and not frustrated by:
- weird bugs
- crashes
- long compilation and export times
- confusing interfaces
- …
Not wasting time
Section titled “Not wasting time”We have a limited amount of time, especially during a game jam, so being productive is the most important goal of Vectarine.
It needs to work with hot-reload
Section titled “It needs to work with hot-reload”Vectarine’s main feature is its instant hot-reload for everything. Quick feedback cycles are what make development enjoyable.
Thus, all features of the engine are built with this in mind. If something does not work well with hot-reload, it can be considered a bug.
It needs to welcome first time users
Section titled “It needs to welcome first time users”When using the engine for the first time, a user needs to be able to quickly get going. They shouldn’t be confused about how to do something.
There is a clear path between hearing about Vectarine for the first time and creating a game.
- Learning how to install vectarine is easy
- Installation is easy
- The starting screen has 2 main buttons, one of which is “Create new project”
- The default empty project explains how to get going
Moreover, the engine is distributed with a detailed offline PDF book on how to make games as well as a gallery of examples.
The Vectarine APIs feel familiar and simple (drawCircle, isKeyJustPressed, sound:play()).
Discovering features should be easy
Section titled “Discovering features should be easy”When wanting to do something new, you shouldn’t need to watch a tutorial. The autocompletion of the editor shows available functions.
The interface displays the tools available without overwhelming the user. Keyboard shortcuts are written down to allow people to become power users.
Be fun to use!
Section titled “Be fun to use!”Creating games is a hobby for many! So might as well have fun making them. Using Vectarine should be fun and enjoyable.
As bugs and crashes are one of the least fun parts of making games, we try to guide the user away from code prone to bugs. Moreover, we avoid crashes except for impossible situations.
Bug-free renaming and refactors
Section titled “Bug-free renaming and refactors”Renaming elements and moving code should not introduce bugs and if it does, these bugs should be caught by the type system.
Provide structure to code
Section titled “Provide structure to code”Most people that want to create games do not have a programming background. We offer solutions to organize their projects so that they are understandable to them and others.
Luau is not object-oriented by default, but it can be. Our tutorials and examples try to guide user towards a clear code structure that scales when the project grows while staying understandable.
Making buggy code harder to write than correct code
Section titled “Making buggy code harder to write than correct code”We create APIs that are naturally hard to misuse.
One example is the Canvas:paint which takes a function that draws to the canvas.
This prevents the user from forgetting that they are drawing to the canvas as everything is wrapped in an indented block.
It also means that the user cannot forget to stop drawing to the canvas.
Empowering makers
Section titled “Empowering makers”You don’t want to start making a game in an engine and realize you cannot add a feature because the engine does not support it. We built Vectarine to allow making any game you can imagine, without restrictions.
Providing low level and high level APIs
Section titled “Providing low level and high level APIs”Systems like tilemaps and collision detection push users towards specific game mechanics and types of game and limit their creativity.
However, these features are still essential for a lot of games.
Thus, we provide both low level features like drawing an image at a position and higher level features like an entity system.
Interface with most tools
Section titled “Interface with most tools”We support common file formats including (but not limited to) png, gif and jpg for images,
wav, mp3 and flac for audio, tmx for levels, etc.
We cannot create the best code editor, 3d modeling software or level editor, but we can seamlessly integrate with the best ones.
With hot-reload, Vectarine feels like an extension of Blender, VSCode, Aseprite, Tiled, LDtk or FLStudio.
Because these tools are not integrated into the editor, we need to guide the user to them through links.
Run anywhere without lag
Section titled “Run anywhere without lag”Export to anything
Section titled “Export to anything”A Vectarine game runs identically in the editor, or when exported on any platform.
For example, we force paths to be case sensitive and use / to avoid games working by
accident on case insensitive systems, but breaking when exported.
Be performant, even on low-end devices
Section titled “Be performant, even on low-end devices”Like other interpreted languages, Lua loops are slower than their native counterparts.
We provide APIs to allow the user to move computation heavy code to the native platform.
This native code is written carefully to take advantage of CPU features like SIMD and of data locality for best performance.
