Skip to main content

Galleries, Existential Coalescing, Slow Motion and more! (Feb 2026 update)

· 5 min read
raysplaceinspace
Creator of Easel

Easel continues to improve! Keep reading to learn what is new with Easel this month.

info

Easel is a beginner-friendly 2D game programming language with automatic multiplayer. Intrigued? Visit our home page to learn more.

Galleries

Games have entities, and they have user interface panels, and when the hierarchy of the two do not line up, sometimes complex code was required to wire the two together. Galleries are a new powerful feature that streamlines this process.

Let's say you are making an inventory management panel. Instead of needing to ship all the data from each inventory item to the panel, each item can instead just display itself in the gallery. Your logic stays local, staying within the context where the data already is and reducing boilerplate.

tip

Galleries allow you to separate the decision of "what" should be displayed from "where" to display it, decoupling the logic of your game from the structure of your user interface, which can simplify your code.

See Galleries to learn more.

Existential coalescing

The new existential coalescing ??? and existential assignment ???= operators check for existence, and can make your code more succinct.

For example, let's say in your game, a hero can only have one shield. If they pickup another shield powerup, it should do nothing. However, let's say the shield expires after a while, at which point they are allowed to pick up a new shield. We can implement this succinctly with the existential assignment operator ???=:

HeroShield ???= Subspawn shield {
// only runs if the hero does not already have an existing shield
}

If the left side (HeroShield in this case) already exists, it will short circuit, meaning the right-hand side will not execute at all (Subspawn shield in this case).

See Operators and Assignments to learn more about these new operators.

More initializers

You can now initialize a field or prop with an Array or Map literal.

Let's say in our game, a player can receive multiple curses, but each player can only curse another player once.

This can be implemented succinctly using a field initialized with Map, like this:

pub field hero.HeroCurses = {} // a map of { owner => curse }

Now it only takes one line to add a new curse to the hero's HeroCurses Map, if it does not already exist:

HeroCurses[owner] ???= Subspawn curse {
// only runs if the hero does not already have an existing curse from this player
}

Here is an example of initializing a field with an Array:

pub field hero.SnakeSegments = [] // initialize with an empty array

Also, now various arithmetic operators can also be used in initializers, which means you can now initialize a field with flags like this:

pub field hero.PickupTypes = PickupType:Weapon | PickupType:Powerup

More engaging homepages

Preivously toolbars would reserve space at the top of the screen, above any content, and this area could not be stylized in any way.

Now a ContentScreen will now fill the entire screen all the way to the top, with the Toolbar overlaid on top. This allows you to make more immersive homepages and let your content stand out even more. See Turret Tumblers for an example of a homepage video that now reaches all the way to the top of the screen.

Also, now if you want to encourage players to scroll below the ContentScreen, you can set ContentScreen(expand=false). This makes the ContentScreen only take as much height as it needs, rather than filling the full height of the screen, making room for any content below it to be visible and enticing players to scroll down. See Beelines for an example of a homepage that encourages players to scroll down.

By default, pages have a max width to keep your paragraphs of text legible, but the new Content(maxWidth=64) parameter lets you change this limit or remove it entirely, if you would like your content to better fill the whole page.

Pausing physics

The new PhysicsTimescale property lets you slow down, speed up, while the rest of the simulation continues at normal speed. You could use this for a slow motion powerup, or to pause the physics simulation while the player is selecting an upgrade, for example.

Editor improvements

In order to keep you in the flow of coding, a number of improvements have been made to the editor.

  • Ctrl+F will now search for selected text, helping you more quickly find other instances of the same function.
  • Press F3 or Shift+F3 to jump to the next or previous search result, respectively.
  • The new Ctrl+P shortcut lets you jump to a file by name, making it faster to navigate between files.
  • Ctrl+Tab lets you jump back to a recently opened file. Hold Ctrl and keep tapping Tab or Shift+Tab to cycle through your recently opened files. Depending on your browser and operating system, you may want to try Ctrl+Alt+Tab or Option+Tab if Ctrl+Tab does not work for you.
  • For power users, the new Vim mode allows you to use Vim keybindings in the editor.
  • One subtle but important improvement is the focus will be retuned to the editor whenever you do various actions like selecting another file, reducing the number of clicks to get back to coding.

See Keyboard Shortcuts for more information.

Other changes

  • The new hoverColor parameter lets you customize the hover color of buttons Button(hoverColor=#0fc) or links Link(hoverColor=#f80). See Button.
  • The new shadow parameter lets you customize the strength of panel shadows Panel(shadow=0.5). In particular, Panel(shadow=0) can help you make effects like progress bars or title bars without the shadow interfering. See Panel.
  • The new LoginToggle lets you add a login/manage account button to your homepage with a single line of code.

Now you can make even more fun and engaging games with Easel!