<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:fh="http://purl.org/syndication/history/1.0"><channel><title>Vectarine  |  Blog</title><description/><link>https://vectarineengine.com/</link><language>en</language><fh:complete/><atom:link rel="self" href="https://vectarineengine.com/blog/rss.xml"/><item><title>There is no general-purpose game engine</title><link>https://vectarineengine.com/blog/there-is-no-general-purpose-game-engine/</link><guid isPermaLink="true">https://vectarineengine.com/blog/there-is-no-general-purpose-game-engine/</guid><description>How all game engines push you away from certain types of games and why you should be aware of it.</description><pubDate>Thu, 20 Aug 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Game engines greatly simplify the process of making games, but at a hidden cost: They push you towards a certain type of game and away from others.&lt;/p&gt;
&lt;p&gt;For some engines, this is obvious.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.renpy.org/&quot;&gt;Ren’Py&lt;/a&gt; is built for visual novels and is advertised as such, you’ll struggle to make a first-person shooter with it.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://gamemaker.io/&quot;&gt;GameMaker&lt;/a&gt; is great at 2D, but is not built for 3D.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;However, I’d argue that &lt;strong&gt;every engine&lt;/strong&gt;, including the most “general-purpose” ones like Unity, Godot or Defold have this problem, but in a more vicious way.&lt;/p&gt;

&lt;p&gt;Because they are advertised as general-purpose, you might not be aware of the limitations they impose on your game design.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;ui-biases&quot;&gt;UI biases&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;Let’s say you want to make a video game for the first time. You open up Godot and see an empty scene with tabs: 2D, 3D, Script.&lt;/p&gt;
&lt;p&gt;Through its UI, the engine told you something: Games are either 2D or 3D, you cannot mix them. In reality, Godot allows you to mix 2D and 3D,
but the UI and its presentation is pushing you away from it, without you being aware of it.&lt;/p&gt;
&lt;p&gt;Your tool is driving you towards certain types of games, and preventing you from making some original concepts.&lt;/p&gt;
&lt;p&gt;I’m not saying Godot specifically is bad, this is an example of something that would also be true in Unreal, Unity or Phaser.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;game-objects&quot;&gt;Game objects&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;Something similar happens with game objects. Game objects are an abstraction common to most general-purpose engines. They are supposed to represent
a “thing” in your game with an appearance, a position and some associated behavior.&lt;/p&gt;
&lt;p&gt;However, they are extremely limiting. Take Tetris for example. What is a game object in Tetris? A block? A tetromino? The whole board?&lt;/p&gt;
&lt;p&gt;In general, when you make Tetris in an engine, you use a single game object on which you draw everything and you manually manage the position, animation and destructions of the blocks,
going against the game object abstraction and fighting the engine. This also means you lose access to the tools the engine provides to manage game objects like collisions or editing properties in the editor.&lt;/p&gt;
&lt;p&gt;Once you start building your game with game objects, you abandon the idea that a game object can be split into other game objects, or that multiple objects
can be combined. Your game object becomes the atom of your game and drives the game design.&lt;/p&gt;
&lt;p&gt;Moreover, having many game objects can be a performance issue. Take &lt;a href=&quot;https://discussions.unity.com/t/managing-performance-with-many-gameobjects/1581337/2&quot;&gt;this thread about a 3d asteroid game&lt;/a&gt; where
a person had to rework their game and work against the engine to make it run smoothly because of the number of game objects involved.
In general, people give up on game design ideas involving many game objects because of their engine’s limitations, without even realizing it.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;frameworks&quot;&gt;Frameworks&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;A large share of very popular and original games are made with frameworks instead of engines. Frameworks are more low-level and don’t impose as many constraints on your game design.
Examples include Love2D, Raylib, Monogame, Bevy or Pygame.&lt;/p&gt;
&lt;p&gt;Frameworks give you a lot more freedom to make games, while still providing you with loads of tools to handle physics, rendering, input, etc.
They are a great way to make games, but are less beginner-friendly than engines, as they require you to know about programming, are a bit
more complex to install and don’t have a visual editor to help you build your game.&lt;/p&gt;
&lt;aside aria-label=&quot;Note&quot;&gt;&lt;p aria-hidden=&quot;true&quot;&gt;Note&lt;/p&gt;&lt;div&gt;&lt;p&gt;I’m sick of Bevy being described as a “game engine”, it is a framework. It does not have an editor, built-in asset management, debugging tools, etc.
An engine is an executable piece of software that can be used to make games. A collection of source code that makes games is a framework.
Like Love2D, it manages the game-loop for you, and provides you with APIs to build your game, but that’s not enough to be called an engine.&lt;/p&gt;&lt;p&gt;At the very least, an engine needs to contain all the tools needed to make a game.
As Bevy depends on the Rust compiler (and cargo and the rest of the Rust ecosystem), it is a framework, not an engine.
&lt;a href=&quot;https://fyrox.rs/&quot;&gt;Fyrox&lt;/a&gt; is a better example of a Rust engine as it manages the Rust toolchain for you and thus provides you with everything you need to make a game in one package.&lt;/p&gt;&lt;/div&gt;&lt;/aside&gt;
&lt;p&gt;I think that frameworks lead to better games, because they allow you to create unique game concepts that would be hard (or even impossible) to replicate in an engine.&lt;/p&gt;
&lt;p&gt;Take &lt;a href=&quot;https://www.factorio.com/&quot;&gt;Factorio&lt;/a&gt; for example. It needs to handle tons of moving objects everywhere.&lt;/p&gt;
&lt;img src=&quot;https://vectarineengine.com/_astro/factorio-factory.DoGJJMRp_Z2vguC7.webp&quot; alt=&quot;A large factory in Factorio&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1920&quot; height=&quot;1080&quot;&gt;
&lt;p&gt;&lt;em&gt;A large factory in Factorio, with a lot of moving parts&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Most engines would struggle to handle this because of the huge amount of game objects involved and game makers would probably avoid
making such a game. This is why Factorio was built on top of &lt;a href=&quot;https://liballeg.org/&quot;&gt;Allegro&lt;/a&gt; instead of an engine.&lt;/p&gt;
&lt;p&gt;The same could be said about Minecraft, which has infinite worlds with countless blocks. While game objects are perfect for &lt;a href=&quot;https://minecraft.wiki/w/Entity&quot;&gt;Minecraft entities&lt;/a&gt;, the block
system, with world generation, saving the world, etc. is better handled with a framework than an engine.&lt;/p&gt;
&lt;p&gt;I’m not saying that engines are bad, that you should never use them, or that it is impossible to make original games with them.&lt;/p&gt;
&lt;p&gt;But you should be aware of the limitations engines impose on your game design, and that they are not as general-purpose as they advertise themselves to be.&lt;/p&gt;
&lt;p&gt;In fact, many games made with frameworks could have worked in an engine, like “Baba Is You”, “Balatro” or “Animal Well”, but making them in
an engine would have pushed the game design in a different direction, and they would have been different games.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;how-vectarine-tries-to-handle-the-issue&quot;&gt;How Vectarine tries to handle the issue&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;Vectarine is a framework-engine hybrid. It is like a framework because you could in theory make a game without ever using the editor, by writing code in
your favorite text editor, and running it in the runtime (as if you exported the game each time to run it).&lt;/p&gt;
&lt;p&gt;However, it is also an engine, because it provides you with an executable editor that scaffolds new projects, exports them, provides hot-reloading, asset management,
debugging tools, etc. It is a complete package to make games.&lt;/p&gt;
&lt;p&gt;As a framework-engine hybrid, I was very aware of this when designing Vectarine. I wanted to make it general-purpose like a framework while still
providing the tools of an engine.&lt;/p&gt;
&lt;p&gt;To do so, Vectarine provides you with different levels of API abstraction.&lt;/p&gt;
&lt;p&gt;You can &lt;a href=&quot;https://vectarineengine.com/guides/overview/#images&quot;&gt;draw rectangles, sprites and text&lt;/a&gt; with a single function call, without ever relying on the concept of a game object just like in a framework:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;image:&lt;/span&gt;&lt;span&gt;draw&lt;/span&gt;&lt;span&gt;(coord.CENTER, coord.&lt;/span&gt;&lt;span&gt;px&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;100&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;100&lt;/span&gt;&lt;span&gt;))&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;This code just draws an image at the center of the screen. There is no game object involved, you can draw anything anywhere at any time, without any constraints on the structure of your game.&lt;/p&gt;
&lt;p&gt;But you can use &lt;a href=&quot;https://vectarineengine.com/guides/making-a-platformer&quot;&gt;modules like physics to manage objects&lt;/a&gt; with positions, velocity and collisions, like an engine.&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;-- Create a box object&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const boxCollider &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; physics.&lt;/span&gt;&lt;span&gt;newRectangleCollider&lt;/span&gt;&lt;span&gt;(vec.&lt;/span&gt;&lt;span&gt;V2&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;10&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;10&lt;/span&gt;&lt;span&gt;))&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const box &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; world:&lt;/span&gt;&lt;span&gt;createObject&lt;/span&gt;&lt;span&gt;(vec.&lt;/span&gt;&lt;span&gt;V2&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;0&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;0&lt;/span&gt;&lt;span&gt;), &lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt;, boxCollider, {}, &lt;/span&gt;&lt;span&gt;&quot;dynamic&quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;-- Draw the box as a red rectangle&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;local&lt;/span&gt;&lt;span&gt; points &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; box:&lt;/span&gt;&lt;span&gt;getPoints&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;graphics.&lt;/span&gt;&lt;span&gt;drawPolygon&lt;/span&gt;&lt;span&gt;(points, vec4.&lt;/span&gt;&lt;span&gt;V4&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;0&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;0&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt;))&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;And, just like an engine, when using physics, you get access to debugging tools to visualize the colliders or edit velocities and positions in the watcher.&lt;/p&gt;
&lt;p&gt;When writing the documentation, I tried to present the low-level APIs first
and then the higher-level ones.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;You can first understand how the basic systems work&lt;/li&gt;
&lt;li&gt;Then, get ideas of what you want in your game&lt;/li&gt;
&lt;li&gt;Finally see what tools Vectarine provides to help you implement them.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This approach has limitations. For example, when editing a level, you implicitly tell Vectarine, when writing your level loading code, how objects in the level
map to objects in your game, meaning that you don’t get as much of an out-of-the-box experience as other engines if you don’t use a ready-made template.&lt;/p&gt;
&lt;p&gt;But this added flexibility is worth it, as it allows you to make games that would be hard to make in other engines. And if you don’t mind
making a specific type of game, you can start from a template and get what you’d expect from other engines.&lt;/p&gt;</content:encoded></item><item><title>Doing the GMTK Game Jam with the Vectarine engine</title><link>https://vectarineengine.com/blog/gmtk-jam-with-vectarine/</link><guid isPermaLink="true">https://vectarineengine.com/blog/gmtk-jam-with-vectarine/</guid><description>How Vectarine performs in a game jam context.</description><pubDate>Thu, 13 Aug 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Since a few years, I’ve been participating in the &lt;a href=&quot;https://gmtk.itch.io/&quot;&gt;GMTK Game Jam&lt;/a&gt;, one of the largest game jams in the world.&lt;/p&gt;


&lt;p&gt;To be honest, this jam was one of the reasons I built Vectarine. I felt like existing engines were not optimized for
making games in time constraints situations and don’t allow you to easily turn your jam prototype into a full game.&lt;/p&gt;
&lt;p&gt;I’m quite happy with how Vectarine performed during the jam, we built &lt;a href=&quot;https://vanyle0.itch.io/5-hours-to-y2k&quot;&gt;5 hours to Y2K&lt;/a&gt;, a
game about organizing the largest party possible in 5 hours.&lt;/p&gt;
&lt;p&gt;As always, hot-reloading, exports to HTML and the general API were a joy to work with. As vectarine games are text based,
we could collaborate using Git and GitHub with no issue to build features together.&lt;/p&gt;
&lt;p&gt;However, there were a few improvement areas that we found during the jam and that were addressed in the new &lt;a href=&quot;https://github.com/vanyle/vectarine/releases/tag/0.6.0&quot;&gt;0.6.0 release of Vectarine&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Most of them are related to the developer experience, something that is very important to the spirit of Vectarine, as outlined in the &lt;a href=&quot;https://vectarineengine.com/guides/design-principles&quot;&gt;Design Principles of Vectarine&lt;/a&gt;.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;loadscript&quot;&gt;loadScript&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;Before 0.6.0, you needed to call &lt;code dir=&quot;auto&quot;&gt;loadScript&lt;/code&gt; and wait for the script to we ready, which was annoying and hindered the creation of libraries
as you needed for the library to be loaded before you could use it. Now, you can use &lt;code dir=&quot;auto&quot;&gt;require&lt;/code&gt; to load scripts, just like any other
Lua runtime and it just works.&lt;/p&gt;
&lt;p&gt;To do that, internally, Vectarine switched to an async execution model where we pause execution and resume it when the script is ready.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;the-ui-module&quot;&gt;The &lt;code dir=&quot;auto&quot;&gt;ui&lt;/code&gt; module&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;The &lt;code dir=&quot;auto&quot;&gt;ui&lt;/code&gt; module was very good, but the way it dealt with text was strange: The size of the text was based on the size of the widget, and
the text would be as big as it could to fit.&lt;/p&gt;
&lt;p&gt;This is was not super convenient, so we switched to having a &lt;code dir=&quot;auto&quot;&gt;fontSize&lt;/code&gt; property to the text widgets. Also, we reworked the API to make it
as convenient as possible. Now you can write this:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;local&lt;/span&gt;&lt;span&gt; ui &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;require&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;@vectarine/ui&quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;local&lt;/span&gt;&lt;span&gt; textWidget &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; ui.&lt;/span&gt;&lt;span&gt;text&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;My text&quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;local&lt;/span&gt;&lt;span&gt; customizedTextWidget &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; ui.&lt;/span&gt;&lt;span&gt;text&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;My text&quot;&lt;/span&gt;&lt;span&gt;, {fontSize &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;0.1&lt;/span&gt;&lt;span&gt;, color &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; vec.&lt;/span&gt;&lt;span&gt;V4&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;0&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;0&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt;)})&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;local&lt;/span&gt;&lt;span&gt; dynamicColorAndTextWidget &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; ui.&lt;/span&gt;&lt;span&gt;text&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;function&lt;/span&gt;&lt;span&gt;() &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;My text&quot;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;end&lt;/span&gt;&lt;span&gt;, {fontSize &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;0.1&lt;/span&gt;&lt;span&gt;, color &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;function&lt;/span&gt;&lt;span&gt;() &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; vec.&lt;/span&gt;&lt;span&gt;V4&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;0&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;0&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt;) &lt;/span&gt;&lt;span&gt;end&lt;/span&gt;&lt;span&gt;})&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;You can create the text widget with one simple line, or provide more options as needed, or even use functions
to dynamically change the text and color. Previously, you were forced to define a function everytime which was a bit verbose.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;and-a-lot-more&quot;&gt;And a lot more&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;We also made &lt;code dir=&quot;auto&quot;&gt;coord&lt;/code&gt; more convenient to use, made the aspect ratio of the game in the editor more logical (the editor toolbar is no longer
rendered over the game!), and a lot of other improvements!&lt;/p&gt;
&lt;p&gt;These resolved all (not most, ALL) of the issues we found during the jam, meaning that Vectarine is better than ever for making game during jams.&lt;/p&gt;
&lt;p&gt;So, for your next game jam, pick Vectarine and have fun making your game!&lt;/p&gt;
&lt;p&gt;Update to 0.6.0 and check out the &lt;a href=&quot;https://github.com/vanyle/vectarine/releases/tag/0.6.0&quot;&gt;release notes&lt;/a&gt; for more details.&lt;/p&gt;</content:encoded></item></channel></rss>