<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: SpriteShip Team</title>
    <description>The latest articles on DEV Community by SpriteShip Team (@spriteship).</description>
    <link>https://dev.to/spriteship</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4086461%2Fe5dd3426-4c34-4a48-a15d-f24ef64daf0e.png</url>
      <title>DEV Community: SpriteShip Team</title>
      <link>https://dev.to/spriteship</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/spriteship"/>
    <language>en</language>
    <item>
      <title>Editing a Top-Down 2D Map: Paths, Regions, and Elevation</title>
      <dc:creator>SpriteShip Team</dc:creator>
      <pubDate>Tue, 20 Oct 2026 12:30:02 +0000</pubDate>
      <link>https://dev.to/spriteship/editing-a-top-down-2d-map-paths-regions-and-elevation-1pa7</link>
      <guid>https://dev.to/spriteship/editing-a-top-down-2d-map-paths-regions-and-elevation-1pa7</guid>
      <description>&lt;p&gt;Top-down levels are easy to fill and surprisingly hard to read. A large field of attractive ground can still leave players unsure where to go, which objects block them, or whether a raised area is reachable.&lt;/p&gt;

&lt;p&gt;The most useful map editing habit is to build a clear route before filling the screen with detail.&lt;/p&gt;

&lt;h2&gt;
  
  
  Sketch the regions and connections
&lt;/h2&gt;

&lt;p&gt;Start with the major places: a village square, a wooded approach, a riverbank, or a dungeon room. Decide how the player moves between them. Paint the broad terrain regions first, then add a path that connects the important destinations.&lt;/p&gt;

&lt;p&gt;In SpriteShip, a Terrain layer can use multiple Materials. That lets you paint grass, dirt, stone, or another ground look within one editable map. Change brush size as you move from broad areas to narrow turns. Use visual contrast to show where a path continues, especially near intersections.&lt;/p&gt;

&lt;p&gt;The &lt;a href="https://spriteship.com/docs/level-editor" rel="noopener noreferrer"&gt;top-down map editor guide&lt;/a&gt; covers terrain painting, layers, map settings, and preview.&lt;/p&gt;

&lt;h2&gt;
  
  
  Use height as a navigation cue
&lt;/h2&gt;

&lt;p&gt;Raised ground can make a map more interesting, but it creates a new question: how does the player get there? Add a ramp where movement should be possible, then check the route from both sides. Shading can make a height break visible; it does not replace a deliberate movement rule.&lt;/p&gt;

&lt;p&gt;If the map is mostly flat, you can still get useful structure from Material changes. A stone floor can announce a town boundary, while a dirt track can guide the eye through grass. &lt;a href="https://spriteship.com/docs/backgrounds-and-textures" rel="noopener noreferrer"&gt;Repeatable 2D terrain Materials&lt;/a&gt; give those regions a consistent look across a larger map.&lt;/p&gt;

&lt;h2&gt;
  
  
  Add objects in readable layers
&lt;/h2&gt;

&lt;p&gt;Place buildings, trees, props, and characters after the basic route works. Use Object layers to organize them and inspect the draw order. Decide which objects are solid, which are decorative, and which carry gameplay data such as a trigger or spawn point.&lt;/p&gt;

&lt;p&gt;Look at the map at the size players will actually see. A route that is obvious when zoomed out may disappear behind a building or a dense row of trees in game preview.&lt;/p&gt;

&lt;h2&gt;
  
  
  Walk the map before export
&lt;/h2&gt;

&lt;p&gt;Set a player spawn, preview movement, and try to reach each important region. Fix blocked or confusing routes. Then test once more after adding the final scenery.&lt;/p&gt;

&lt;p&gt;When the layout holds together, &lt;a href="https://spriteship.com/docs/exports" rel="noopener noreferrer"&gt;export the top-down map for your game engine&lt;/a&gt;. You can return to the same editable map to revise a path or swap a Material later.&lt;/p&gt;

&lt;p&gt;The aim is not a screen full of assets. It is a world the player can understand and move through.&lt;/p&gt;

</description>
      <category>gamedev</category>
      <category>topdown</category>
      <category>leveldesign</category>
      <category>indiedev</category>
    </item>
    <item>
      <title>Editing a 2D Platformer Map: From Ground Shape to Playable Route</title>
      <dc:creator>SpriteShip Team</dc:creator>
      <pubDate>Wed, 14 Oct 2026 12:30:02 +0000</pubDate>
      <link>https://dev.to/spriteship/editing-a-2d-platformer-map-from-ground-shape-to-playable-route-16pe</link>
      <guid>https://dev.to/spriteship/editing-a-2d-platformer-map-from-ground-shape-to-playable-route-16pe</guid>
      <description>&lt;p&gt;In a platformer, the map is a sequence of movement decisions. A ledge asks the player to jump. A slope changes the pace. A low ceiling changes which actions feel safe. Editing the map means shaping that route, then making sure the art and collision communicate the same thing.&lt;/p&gt;

&lt;p&gt;Here is a practical way to build one in SpriteShip.&lt;/p&gt;

&lt;h2&gt;
  
  
  Block out the route first
&lt;/h2&gt;

&lt;p&gt;Start with the player's path through the level. Place the main ground, major gaps, and changes in height before decorating. A Terrain layer lets you paint broad masses quickly, then refine a landing zone or tunnel with a smaller brush. For side-view ground, choose a Material that makes the top surface easy to read.&lt;/p&gt;

&lt;p&gt;Keep early tests simple. If a jump is hard to judge with plain terrain, adding more scenery will not fix it. Check the gap length, landing width, and the silhouette of the next platform.&lt;/p&gt;

&lt;p&gt;The &lt;a href="https://spriteship.com/docs/level-editor" rel="noopener noreferrer"&gt;2D level editor&lt;/a&gt; is where you paint terrain and keep the map editable as these shapes change.&lt;/p&gt;

&lt;h2&gt;
  
  
  Separate gameplay from dressing
&lt;/h2&gt;

&lt;p&gt;Use Object layers for things like bridges, doors, hazards, and foreground details. Place them after the route works. Layer order decides what appears in front, while solid and collider settings help distinguish a physical obstacle from a visual prop or trigger.&lt;/p&gt;

&lt;p&gt;Put the player spawn where a real playtest should begin. If the level has a one-way platform or an overhang, approach it from both directions in preview. What looks clear in an editor can feel ambiguous once a character is moving at speed.&lt;/p&gt;

&lt;h2&gt;
  
  
  Make slopes deliberate
&lt;/h2&gt;

&lt;p&gt;A slope should support the movement you want: a climb, a descent, or a smooth transition into a jump. Paint the terrain shape, then check its contact behavior and the character's route across it. Visual styling can make the incline easier to see, but it does not decide how your game's controller should handle acceleration or jumping.&lt;/p&gt;

&lt;p&gt;This is where &lt;a href="https://spriteship.com/docs/backgrounds-and-textures" rel="noopener noreferrer"&gt;reusable platformer terrain Materials&lt;/a&gt; help: you can change the ground's look while continuing to edit the path itself.&lt;/p&gt;

&lt;h2&gt;
  
  
  Preview, revise, export
&lt;/h2&gt;

&lt;p&gt;Test a short loop: spawn, move, jump, land, turn around, and exit. Fix confusing geometry before adding detail. Then place the assets that establish setting and mood, and test again with the final layers visible.&lt;/p&gt;

&lt;p&gt;When the route feels right, &lt;a href="https://spriteship.com/docs/exports" rel="noopener noreferrer"&gt;export your platformer map for the target engine&lt;/a&gt;. Keep the editable map as your source so another pass on jump spacing or terrain art does not mean rebuilding the level.&lt;/p&gt;

&lt;p&gt;A good platformer map is readable at running speed. That is the standard to use throughout the edit.&lt;/p&gt;

</description>
      <category>gamedev</category>
      <category>platformer</category>
      <category>leveldesign</category>
      <category>indiedev</category>
    </item>
    <item>
      <title>How Terrain Materials Work in a Top-Down 2D Game</title>
      <dc:creator>SpriteShip Team</dc:creator>
      <pubDate>Thu, 08 Oct 2026 12:30:03 +0000</pubDate>
      <link>https://dev.to/spriteship/how-terrain-materials-work-in-a-top-down-2d-game-4j0</link>
      <guid>https://dev.to/spriteship/how-terrain-materials-work-in-a-top-down-2d-game-4j0</guid>
      <description>&lt;p&gt;A top-down map has a different readability problem from a platformer. The player sees the ground as a field: paths, clearings, shorelines, floors, and raised areas all compete for attention. The material underfoot should help the player understand the space without drowning out characters and objects.&lt;/p&gt;

&lt;p&gt;SpriteShip Materials are reusable ground looks for that job. You generate visual options that match the project, choose the ones you like, and paint them where they belong in an editable map.&lt;/p&gt;

&lt;h2&gt;
  
  
  Think in regions, not isolated tiles
&lt;/h2&gt;

&lt;p&gt;Suppose you are building a forest village. Grass might cover most of the map, dirt could mark the main route, and stone could identify a market square. Those choices do more than decorate: they establish a visual hierarchy. A player can follow the path at a glance, notice a change of area, and distinguish an accessible square from background detail.&lt;/p&gt;

&lt;p&gt;Top-down Material generation gives you several repeatable fill options to review. Inspect a repeated preview before covering a large area, particularly if the game uses a camera that moves across the map. The goal is a surface that feels coherent beyond one screen.&lt;/p&gt;

&lt;p&gt;The &lt;a href="https://spriteship.com/docs/backgrounds-and-textures" rel="noopener noreferrer"&gt;guide to generating 2D ground Materials&lt;/a&gt; explains how to create and review those assets.&lt;/p&gt;

&lt;h2&gt;
  
  
  Paint, then add height where it matters
&lt;/h2&gt;

&lt;p&gt;Choose a Material on a Terrain layer and paint broad areas first. Add a second Material for routes or distinct zones, then refine the boundaries with a smaller brush. For a top-down map, this is often faster to reason about than selecting an individual corner tile for every turn in the path.&lt;/p&gt;

&lt;p&gt;If the world has raised ground, use elevation and ramps to express the route through it. Visual shading can help a height change read clearly, but the map's movement rules still need to be tested. Decide whether the player can reach the higher area, where the ramp begins, and what should block movement.&lt;/p&gt;

&lt;p&gt;You can also place trees, buildings, and other props on Object layers above the terrain. Keep the most important paths visible: a beautiful ground treatment is less useful if a player cannot see where to move.&lt;/p&gt;

&lt;h2&gt;
  
  
  Review the whole scene
&lt;/h2&gt;

&lt;p&gt;Zoom out and ask three questions: Can I see the route? Can I tell which regions differ? Do characters remain legible against the ground? Then preview the map at the camera size your game will use.&lt;/p&gt;

&lt;p&gt;SpriteShip's &lt;a href="https://spriteship.com/docs/level-editor" rel="noopener noreferrer"&gt;top-down level editor guide&lt;/a&gt; covers painting terrain, placing assets, and testing the map. You can &lt;a href="https://spriteship.com/docs/exports" rel="noopener noreferrer"&gt;export the finished 2D map&lt;/a&gt; while keeping the source editable for later changes.&lt;/p&gt;

&lt;p&gt;A Material makes the world visually consistent. Good top-down level design still comes from the paths, boundaries, and decisions you paint with it.&lt;/p&gt;

</description>
      <category>gamedev</category>
      <category>topdown</category>
      <category>gameart</category>
      <category>indiedev</category>
    </item>
    <item>
      <title>We Built a Browser Strategy Game with Codex, SpriteShip, and Godot</title>
      <dc:creator>SpriteShip Team</dc:creator>
      <pubDate>Tue, 06 Oct 2026 09:12:11 +0000</pubDate>
      <link>https://dev.to/spriteship/we-built-a-browser-strategy-game-with-codex-spriteship-and-godot-1h2</link>
      <guid>https://dev.to/spriteship/we-built-a-browser-strategy-game-with-codex-spriteship-and-godot-1h2</guid>
      <description>&lt;p&gt;We wanted a 2D strategy game where you could gather wood, stone, gold, and food, build a settlement, recruit soldiers, upgrade structures, and eventually lead an army into battle.&lt;/p&gt;

&lt;p&gt;The inspiration was the settlement-building loop of classic RTS games, with direct control of a hero. The world and characters would be original. The game had to run in a browser, and all its illustrated assets had to come from &lt;a href="https://spriteship.com/" rel="noopener noreferrer"&gt;SpriteShip&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The result is &lt;strong&gt;Emberhold: The Last Hearth&lt;/strong&gt;, a Godot game with a story campaign, a peaceful sandbox, and a public web build.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://spriteship.github.io/sample_games/emberhold/" rel="noopener noreferrer"&gt;Play Emberhold in your browser&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/spriteship/sample_games" rel="noopener noreferrer"&gt;Explore the GitHub repository&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://spriteship.com/project/proj_1791027542095_991m" rel="noopener noreferrer"&gt;Open the game's SpriteShip project&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;



&lt;p&gt;&lt;a href="https://postiz.spriteship.com/uploads/2026/10/06/297ca10a5bbdec205512bba8dee2310ebf.mp4" rel="noopener noreferrer"&gt;Watch the gameplay video&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Codex handled the coding and tool-driven implementation. SpriteShip supplied the illustrated assets and their export data. Godot brought the systems together.&lt;/p&gt;

&lt;p&gt;Here's what that process actually looked like—including the parts that still need work.&lt;/p&gt;

&lt;h2&gt;
  
  
  Start with a game vision, not an asset list
&lt;/h2&gt;

&lt;p&gt;Our initial request described a genre and a visual ambition. It did not specify every building, character, quest, or balance value.&lt;/p&gt;

&lt;p&gt;We asked Codex to turn that into a product requirements document before implementation. A cleaned-up version of the brief would look like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Build an original 2D settlement strategy game in Godot for the web.

The player gathers resources, constructs and upgrades buildings,
recruits soldiers, explores the map, and fights enemies.

Use SpriteShip for every illustrated game asset.
Define the story and campaign objectives before implementation.
Keep SpriteShip production within a 30,000-credit ceiling.
Validate the game in the engine and in a real browser.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That planning step gave the art and mechanics a shared direction.&lt;/p&gt;

&lt;p&gt;Captain Elara arrives in a ruined valley with survivors and a coal from the last living hearth. Rebuilding the settlement lets her recruit an army, rekindle three beacons, and confront Veyr, the Ash Regent.&lt;/p&gt;

&lt;p&gt;The campaign has five chapters. Its progression moves from gathering and construction to recruitment, exploration, beacon liberation, and the final battle.&lt;/p&gt;

&lt;p&gt;The &lt;a href="https://github.com/spriteship/sample_games/blob/main/games/emberhold/PRD.md" rel="noopener noreferrer"&gt;PRD is in the repository&lt;/a&gt;, alongside the implementation.&lt;/p&gt;

&lt;h2&gt;
  
  
  Give Codex tools and an explicit workflow
&lt;/h2&gt;

&lt;p&gt;For this build, Codex could inspect and edit the repository, run commands, call SpriteShip's API/MCP tools, download exports, and examine the resulting game.&lt;/p&gt;

&lt;p&gt;We also supplied SpriteShip's current agent instructions. Those instructions covered generation, export contracts, synchronization, collision metadata, quality review, and spending controls.&lt;/p&gt;

&lt;p&gt;There are two useful layers here: tools expose operations, while a skill explains the workflow around them. That's also the distinction described in the &lt;a href="https://developers.openai.com/plugins/concepts/skills" rel="noopener noreferrer"&gt;official OpenAI documentation on skills&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;In our production scripts, the loop became:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Define the asset and its role
  → obtain a generation quote
  → check it against the authorized budget
  → submit and wait for the job
  → download the native export
  → integrate, inspect, and test
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The scripts retained request state and used idempotency keys for paid operations. They also needed file locking when multiple production operations updated shared state.&lt;/p&gt;

&lt;p&gt;The point was to make the agent's work inspectable: which assets were requested, which jobs finished, what was imported, and what actually cost credits.&lt;/p&gt;

&lt;h2&gt;
  
  
  Build a coherent art pack
&lt;/h2&gt;

&lt;p&gt;We chose an angled top-down, painted fantasy style: mossy greens, ivory stone, copper roofs, warm settlement lighting, and ember-red enemy accents.&lt;/p&gt;

&lt;p&gt;The SpriteShip project supplied the illustrated menu scene, terrain, nature props, resource deposits, structures, fortified building variants, landmarks, characters, icons, and ornamental UI.&lt;/p&gt;

&lt;p&gt;The character lineup includes Elara, settlers, guards, rangers, knights, raiders, and armored brutes. The final boss uses the brute artwork at a different scale.&lt;/p&gt;

&lt;p&gt;Godot code supplies lighting, particles, text, interface layout, and gameplay. Music and sound effects are synthesized at runtime rather than imported as generated audio files. Fonts arrived through SpriteShip with their license notices.&lt;/p&gt;

&lt;p&gt;We later changed the account's watermark setting and downloaded every selected asset again, including the whole-character, map, and UI bundles. We did not paint over watermarks locally.&lt;/p&gt;

&lt;p&gt;That refresh also reinforced a useful production rule: store local asset bytes and stable identifiers, not expiring download URLs.&lt;/p&gt;

&lt;h2&gt;
  
  
  Native exports make integration concrete
&lt;/h2&gt;

&lt;p&gt;SpriteShip's Godot character bundles include native &lt;code&gt;.tres&lt;/code&gt; animation resources, spritesheets, manifests, and integration instructions. Its &lt;a href="https://spriteship.com/agents/codex" rel="noopener noreferrer"&gt;Codex integration guide&lt;/a&gt; describes these self-describing exports.&lt;/p&gt;

&lt;p&gt;Codex read the delivered animation names, frame order, and playback data rather than inventing a spritesheet layout.&lt;/p&gt;

&lt;p&gt;Our project keeps an asset lock file and a local runtime manifest. The lock records imported entities and versions; the runtime manifest routes game archetypes to their local art and animation resources.&lt;/p&gt;

&lt;p&gt;The final synchronization check covered &lt;strong&gt;18 entries&lt;/strong&gt;, all matching the downloaded versions.&lt;/p&gt;

&lt;h3&gt;
  
  
  The surprisingly tricky part: feet
&lt;/h3&gt;

&lt;p&gt;A character can look great in an individual frame and still look wrong when it switches animations.&lt;/p&gt;

&lt;p&gt;Different clips had different amounts of transparent padding. Without calibration, standing and walking could appear to change the character's size or ground contact.&lt;/p&gt;

&lt;p&gt;We used a fixed neutral-first-frame reference for each clip to calibrate visible height and the foot anchor. This is a per-clip render adjustment, not a crop that changes on every frame.&lt;/p&gt;

&lt;p&gt;Movement footprints were authored back into SpriteShip separately from full-body hurtbox metadata, then downloaded in fresh native exports. The full, untrimmed logical frame coordinates were retained.&lt;/p&gt;

&lt;p&gt;For browser delivery, we applied a paired 50% scale to the character sheets &lt;strong&gt;and every corresponding atlas rectangle&lt;/strong&gt;. Scaling only the image would leave the atlas pointing at the wrong pixels. Full-resolution native sources were retained locally.&lt;/p&gt;

&lt;p&gt;These integration details were a substantial part of the work. Generating the image was only one step.&lt;/p&gt;

&lt;h2&gt;
  
  
  Build the game systems in Godot
&lt;/h2&gt;

&lt;p&gt;The shipped game uses Godot 4.7.2 and GDScript. Node.js handles production and build tooling; it is not the gameplay engine.&lt;/p&gt;

&lt;p&gt;The main systems include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Hero movement, contextual gathering, melee attacks, healing, and dashing.&lt;/li&gt;
&lt;li&gt;Settlers that travel to deposits and gather resources autonomously.&lt;/li&gt;
&lt;li&gt;Eleven structure types, construction progress, upgrades, repairs, and population limits.&lt;/li&gt;
&lt;li&gt;Guard, ranger, and knight recruitment, with follow, defend, rally, and assault orders.&lt;/li&gt;
&lt;li&gt;Research, ranged projectiles, defensive towers, enemy camps, and escalating raids.&lt;/li&gt;
&lt;li&gt;Three beacons, a protected citadel, a final boss, campaign progression, and save/load.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The authored valley is 4096 × 3584 pixels. Godot handles obstacle-aware navigation with &lt;code&gt;AStarGrid2D&lt;/code&gt;, exploration, fog, interactions, and the gameplay meaning of the map data.&lt;/p&gt;

&lt;p&gt;The source is split into recognizable responsibilities: &lt;code&gt;game.gd&lt;/code&gt; owns simulation and saves, &lt;code&gt;world.gd&lt;/code&gt; handles rendering and animation selection, &lt;code&gt;hud.gd&lt;/code&gt; manages the interface, and &lt;code&gt;data.gd&lt;/code&gt; holds unit, building, and story definitions.&lt;/p&gt;

&lt;p&gt;You can inspect that division in the &lt;a href="https://github.com/spriteship/sample_games/tree/main/games/emberhold" rel="noopener noreferrer"&gt;Godot project source&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Test actions, not just screenshots
&lt;/h2&gt;

&lt;p&gt;We used two different kinds of validation.&lt;/p&gt;

&lt;p&gt;First, native Godot acceptance scenarios exercised gathering, settler travel, navigation routes, placement, upgrades, completed recruitment queues, research, repairs, projectiles, saves, beacon activation, and final victory.&lt;/p&gt;

&lt;p&gt;Those tests use prepared resources and cleared beacon guards where appropriate. They are systems tests—not evidence of a complete human campaign playthrough or a measured campaign duration.&lt;/p&gt;

&lt;p&gt;Second, an isolated Chromium browser used real mouse and keyboard input. It moved Elara, placed structures, waited for settlers to collect resources, recruited troops, upgraded a barracks, saved, reloaded, and continued the settlement.&lt;/p&gt;

&lt;p&gt;The browser also led an army to the first beacon, defeated five enemies, used healing, and rekindled it. We repeated these checks against the public GitHub Pages build.&lt;/p&gt;

&lt;p&gt;The public-site run passed with all seven character archetypes registered and &lt;strong&gt;zero browser console or page errors&lt;/strong&gt;. Screenshots covered multiple desktop viewport sizes.&lt;/p&gt;

&lt;p&gt;The browser tests inspect a read-only state snapshot; they do not use a debug API to grant resources or complete objectives.&lt;/p&gt;

&lt;h2&gt;
  
  
  Ship the web build through GitHub Pages
&lt;/h2&gt;

&lt;p&gt;The repository already hosted another game, Last Light. We extended its Pages build so Emberhold could live alongside it:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://spriteship.github.io/sample_games/emberhold/" rel="noopener noreferrer"&gt;https://spriteship.github.io/sample_games/emberhold/&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;We used Godot's Compatibility renderer and a single-threaded Web export. Single-threaded exports avoid the cross-origin isolation headers required by threaded builds, which makes this a practical fit for static hosting. See &lt;a href="https://docs.godotengine.org/en/stable/tutorials/export/exporting_for_web.html" rel="noopener noreferrer"&gt;Godot's web export documentation&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The Linux CI build installs the pinned Godot version and matching Web templates, verifies their SHA-256 checksums, runs the tests, exports the game, and packages both games into the Pages artifact.&lt;/p&gt;

&lt;p&gt;Generated web builds stay out of Git. The repository contains the source and illustrated assets; CI rebuilds the deployable files. Playing or deploying the game requires no SpriteShip API key.&lt;/p&gt;

&lt;p&gt;To rebuild locally, install Godot 4.7.2 with matching Web export templates and Node.js 22+, then run:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://github.com/spriteship/sample_games.git
&lt;span class="nb"&gt;cd &lt;/span&gt;sample_games
npm ci
npm run build:emberhold
npm run dev:emberhold
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The local game runs at &lt;code&gt;http://localhost:4174&lt;/code&gt;. Saves on the public site are separate from localhost saves.&lt;/p&gt;

&lt;h2&gt;
  
  
  What it cost—and what still needs work
&lt;/h2&gt;

&lt;p&gt;Our audited SpriteShip production spend was &lt;strong&gt;14,360 credits net&lt;/strong&gt;, against the authorized 30,000-credit ceiling. That includes generation failures and provider refunds recorded in the ledger. It is an art-production figure, not the total cost of development or a dollar-price estimate.&lt;/p&gt;

&lt;p&gt;The original brief asked for an AAA-style 2D look. That was an ambition, not a certification of the result.&lt;/p&gt;

&lt;p&gt;This is a playable single-player campaign and sandbox on one map. It still needs animation polish, broader hardware testing, and longer balance playtests. In particular:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Gathering reuses strike/chopping clips rather than having distinct animations for each resource.&lt;/li&gt;
&lt;li&gt;Hero death currently restores health and returns Elara home immediately, which needs a clearer death-and-recovery sequence.&lt;/li&gt;
&lt;li&gt;Three gameplay building levels share two delivered artwork tiers; level III reuses fortified art with a crown marker.&lt;/li&gt;
&lt;li&gt;Some optional attack directions failed at the provider, so delivered animations serve as fallbacks. Quality-review flags remain documented.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It does not include multiplayer, voice acting, mobile touch controls, or a multi-map campaign. The &lt;a href="https://github.com/spriteship/sample_games/blob/main/games/emberhold/QA.md" rel="noopener noreferrer"&gt;QA record&lt;/a&gt; explains the validation and limitations.&lt;/p&gt;

&lt;h2&gt;
  
  
  The takeaway
&lt;/h2&gt;

&lt;p&gt;Codex let us work through planning, implementation, asset orchestration, debugging, testing, and deployment in one ongoing workflow. SpriteShip gave that workflow a source of illustrated assets with native export data the agent could inspect and integrate.&lt;/p&gt;

&lt;p&gt;The most useful combination was a clear game brief, a coherent art direction, explicit asset contracts, bounded spending, and tests that exercised actual player actions.&lt;/p&gt;

&lt;p&gt;There is still polish to do. But the result is a public game you can play, with source you can inspect and a production process you can follow.&lt;/p&gt;

&lt;p&gt;Try &lt;a href="https://spriteship.github.io/sample_games/emberhold/" rel="noopener noreferrer"&gt;Emberhold&lt;/a&gt;, browse the &lt;a href="https://github.com/spriteship/sample_games" rel="noopener noreferrer"&gt;repository&lt;/a&gt;, or explore &lt;a href="https://spriteship.com/" rel="noopener noreferrer"&gt;SpriteShip&lt;/a&gt; and the &lt;a href="https://spriteship.com/project/proj_1791027542095_991m" rel="noopener noreferrer"&gt;game's art project&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;If you play it, I'd love feedback on the settlement pacing, army controls, and what feels most important to improve next.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>gamedev</category>
      <category>godot</category>
      <category>webdev</category>
    </item>
    <item>
      <title>How Terrain Materials Work in a 2D Platformer</title>
      <dc:creator>SpriteShip Team</dc:creator>
      <pubDate>Fri, 02 Oct 2026 12:30:03 +0000</pubDate>
      <link>https://dev.to/spriteship/how-terrain-materials-work-in-a-2d-platformer-he2</link>
      <guid>https://dev.to/spriteship/how-terrain-materials-work-in-a-2d-platformer-he2</guid>
      <description>&lt;p&gt;A platformer level is read from the side. Players need to see where they can land, which surfaces they can pass through, and where a slope begins. A good ground texture helps, but a repeating image alone cannot answer those questions.&lt;/p&gt;

&lt;p&gt;That is why a Material in SpriteShip is a reusable terrain choice, not a finished level. You create the visual look of ground, then decide where that ground belongs on the map.&lt;/p&gt;

&lt;h2&gt;
  
  
  Start with the ground's visual identity
&lt;/h2&gt;

&lt;p&gt;Imagine a hillside level with grassy earth above a stone tunnel. You might want a soft green top edge, a darker soil body, and a separate stone look below. Generate Materials that fit the project's art direction, then inspect how the artwork repeats before you build a long stretch of terrain.&lt;/p&gt;

&lt;p&gt;In a platformer, a Material pairs the appearance of the ground's interior with a visible surface treatment. That lets a ledge read as a ledge while the body of the terrain still feels continuous. You can review the result and choose the look you want to use in the level.&lt;/p&gt;

&lt;p&gt;If you are starting from scratch, the &lt;a href="https://spriteship.com/docs/backgrounds-and-textures" rel="noopener noreferrer"&gt;SpriteShip guide to creating 2D terrain materials&lt;/a&gt; walks through the asset workflow.&lt;/p&gt;

&lt;h2&gt;
  
  
  Paint the shape players will navigate
&lt;/h2&gt;

&lt;p&gt;In the map editor, add a Terrain layer, choose a Material, and paint the mass of the ground. A wider brush blocks out the level quickly; a smaller brush helps refine a jump landing, tunnel entrance, or narrow platform. You can use more than one Material on the same layer, so the visual theme can change without rebuilding the map from separate image rectangles.&lt;/p&gt;

&lt;p&gt;Slopes are especially useful in a side-view game. A gentle rise can lead the player into a new area without turning every elevation change into a staircase. The important design decision is still yours: where does the player climb, jump, stop, or fall?&lt;/p&gt;

&lt;h2&gt;
  
  
  Keep appearance and gameplay readable
&lt;/h2&gt;

&lt;p&gt;The same terrain can look different under different rendering styles. You can tune scale, edge treatment, and blending to suit pixel art or a softer painted world. Then review contact and collision settings separately. A decorative surface does not become good gameplay merely because it looks solid.&lt;/p&gt;

&lt;p&gt;Playtest the route: approach a slope, land on an edge, pass under an overhang, and check one-way platforms where you use them. The map should communicate those actions before the player has to guess.&lt;/p&gt;

&lt;p&gt;The &lt;a href="https://spriteship.com/docs/level-editor" rel="noopener noreferrer"&gt;2D platformer map editor workflow&lt;/a&gt; covers Terrain layers, objects, preview, and export. When the level is ready, &lt;a href="https://spriteship.com/docs/exports" rel="noopener noreferrer"&gt;export the map for your game engine&lt;/a&gt; and keep the editable source for later changes.&lt;/p&gt;

&lt;p&gt;The useful mental model is simple: the Material supplies a consistent visual language; you author the playable shape.&lt;/p&gt;

</description>
      <category>gamedev</category>
      <category>platformer</category>
      <category>gameart</category>
      <category>indiedev</category>
    </item>
    <item>
      <title>From AI-Generated Game Assets to a Playable 2D Game Level</title>
      <dc:creator>SpriteShip Team</dc:creator>
      <pubDate>Fri, 25 Sep 2026 15:30:07 +0000</pubDate>
      <link>https://dev.to/spriteship/from-ai-generated-game-assets-to-a-playable-2d-game-level-4gea</link>
      <guid>https://dev.to/spriteship/from-ai-generated-game-assets-to-a-playable-2d-game-level-4gea</guid>
      <description>&lt;p&gt;AI-generated game art is most useful when it becomes part of a real production workflow.&lt;/p&gt;

&lt;p&gt;A single image can be inspiring, but a game needs more: consistent visual direction, reusable assets, terrain, background layers, placement, revision, and an export path into the engine. The interesting question is not “Can AI make an image?” It is “Can that image help a creator build a playable level?”&lt;/p&gt;

&lt;p&gt;Here is the workflow we are building around in SpriteShip.&lt;/p&gt;

&lt;h2&gt;
  
  
  Start with a visual language
&lt;/h2&gt;

&lt;p&gt;Before generating individual objects, establish the game’s perspective, palette, lighting, and overall style. A platformer, top-down RPG, and isometric adventure may all use the same subject matter, but they need different composition and camera treatment.&lt;/p&gt;

&lt;p&gt;A clear visual direction makes later assets feel like part of the same game instead of a collection of unrelated images.&lt;/p&gt;

&lt;h2&gt;
  
  
  Give every asset a job
&lt;/h2&gt;

&lt;p&gt;Game assets are easier to work with when their role is explicit.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Backgrounds&lt;/strong&gt; establish the scene, distant depth, or foreground framing.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Environment Kits&lt;/strong&gt; provide placeable world props and details.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Object Collections&lt;/strong&gt; produce matching groups of items, icons, cards, or variants.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Object States&lt;/strong&gt; represent meaningful changes such as growth, damage, construction, or activation.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Materials&lt;/strong&gt; provide reusable terrain that can be painted in the map editor.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Thinking in roles helps turn an art request into a level-building system.&lt;/p&gt;

&lt;h2&gt;
  
  
  Build the map, not just an image board
&lt;/h2&gt;

&lt;p&gt;Once assets exist, the map editor becomes the place where composition turns into a playable space.&lt;/p&gt;

&lt;p&gt;Place props, paint terrain, define layers, refine shapes, and preview the level as it comes together. This is where the game starts to develop its own visual rhythm: open areas, routes, landmarks, foreground framing, and places for interaction.&lt;/p&gt;

&lt;p&gt;The important part is that these choices remain editable. A useful workflow should make it easy to move an object, change terrain, replace a background, or revise an asset without starting again.&lt;/p&gt;

&lt;h2&gt;
  
  
  Keep AI in the right role
&lt;/h2&gt;

&lt;p&gt;AI can accelerate exploration and help create a coherent starting set of art. It does not replace art direction, level design, accessibility review, gameplay design, or the judgment needed to decide whether an asset belongs in the game.&lt;/p&gt;

&lt;p&gt;Treat generated art as a creative input. Review it, edit it, place it intentionally, and keep iterating.&lt;/p&gt;

&lt;h2&gt;
  
  
  Export when the level is ready for development
&lt;/h2&gt;

&lt;p&gt;When the map is ready to leave the editor, export it into the supported game workflow. The handoff should preserve useful facts such as the artwork, placed objects, map layers, terrain, and other authored data.&lt;/p&gt;

&lt;p&gt;Developers can then focus on the game-specific work: player controls, AI, interactions, combat, missions, and progression.&lt;/p&gt;

&lt;h2&gt;
  
  
  A practical loop for indie teams
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Define the visual direction.&lt;/li&gt;
&lt;li&gt;Create assets with clear roles.&lt;/li&gt;
&lt;li&gt;Assemble and refine the level.&lt;/li&gt;
&lt;li&gt;Test the layout and gameplay assumptions.&lt;/li&gt;
&lt;li&gt;Export, implement, and iterate.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The payoff is not a fully automated game. It is a tighter loop between an idea, the art needed to express it, and a level that developers can actually build on.&lt;/p&gt;

&lt;p&gt;Build a consistent 2D game-art pipeline at &lt;a href="https://spriteship.com/?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=map_editor_series" rel="noopener noreferrer"&gt;spriteship.com&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>gamedev</category>
      <category>ai</category>
      <category>tutorial</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Exporting One 2D Map to Phaser, Godot, Unity, GameMaker, and Tiled</title>
      <dc:creator>SpriteShip Team</dc:creator>
      <pubDate>Fri, 18 Sep 2026 15:30:00 +0000</pubDate>
      <link>https://dev.to/spriteship/exporting-one-2d-map-to-phaser-godot-unity-gamemaker-and-tiled-11ca</link>
      <guid>https://dev.to/spriteship/exporting-one-2d-map-to-phaser-godot-unity-gamemaker-and-tiled-11ca</guid>
      <description>&lt;p&gt;Choosing a game engine should not mean rebuilding the same map from scratch.&lt;/p&gt;

&lt;p&gt;That sounds obvious, but 2D map workflows often become tied to one editor, one file format, and one runtime. The artwork might travel easily; the map data usually does not. Layers, placement, collision, terrain, metadata, and draw order are often rebuilt by hand whenever a prototype moves to a different engine.&lt;/p&gt;

&lt;p&gt;We built SpriteShip’s map export workflow around a different idea: keep one editable source map, then package it for the engine or toolchain you need.&lt;/p&gt;

&lt;h2&gt;
  
  
  A map is more than a screenshot
&lt;/h2&gt;

&lt;p&gt;Exporting a flattened image is useful for a mockup, but it is not enough for an interactive game. A playable map needs information about layers, placed assets, transforms, collision, terrain, navigation, and custom gameplay data.&lt;/p&gt;

&lt;p&gt;If that information disappears during export, the receiving engine gets pixels—but not a usable level.&lt;/p&gt;

&lt;h2&gt;
  
  
  Keep the source map editable
&lt;/h2&gt;

&lt;p&gt;The source map should preserve the facts a creator authored: the map’s layers, terrain, object placement, visual order, transforms, and gameplay-oriented metadata.&lt;/p&gt;

&lt;p&gt;That means the same project can be revised without treating an exported file as the new source of truth. Move a prop, reshape terrain, adjust a layer, then export again from the map you actually edit.&lt;/p&gt;

&lt;h2&gt;
  
  
  Export for the target, not for a lowest common denominator
&lt;/h2&gt;

&lt;p&gt;Different engines expect different project structures. A useful export should respect the target while preserving the meaning of the map.&lt;/p&gt;

&lt;p&gt;SpriteShip currently supports map exports for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Phaser&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Godot&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Unity&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;GameMaker&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Tiled&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Each export is built from the same editable map rather than from a separate manual recreation. Unreal Paper2D export is also available in beta for teams exploring that workflow.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why cross-engine export matters for small teams
&lt;/h2&gt;

&lt;p&gt;Indie projects change. A prototype may start in a browser game framework, move into a desktop engine, or need to share level data with a teammate using a different tool. Keeping the map editable and portable makes those changes less expensive.&lt;/p&gt;

&lt;p&gt;It also helps when you are evaluating engines. You can test the same level in more than one runtime without throwing away the work that got you there.&lt;/p&gt;

&lt;h2&gt;
  
  
  Export is a handoff, not automatic gameplay
&lt;/h2&gt;

&lt;p&gt;A map export can preserve artwork, placement, layer order, collision information, terrain, and metadata. It cannot decide how a specific game should handle combat, AI, quest logic, save systems, or player movement.&lt;/p&gt;

&lt;p&gt;Those choices still belong to the game team. The goal is to make the asset and level handoff dependable, so developers can spend their time on the parts that make their game distinct.&lt;/p&gt;

&lt;h2&gt;
  
  
  The workflow we want
&lt;/h2&gt;

&lt;p&gt;Build the level once. Keep editing the same source map. Export it for the engine you need today—and re-export when the map changes tomorrow.&lt;/p&gt;

&lt;p&gt;That is a better foundation for experimentation, collaboration, and shipping a 2D game.&lt;/p&gt;

&lt;p&gt;See the full SpriteShip workflow at &lt;a href="https://spriteship.com/?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=map_editor_series" rel="noopener noreferrer"&gt;spriteship.com&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>gamedev</category>
      <category>godot</category>
      <category>unity3d</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Building a 2D Terrain Editor: Auto-Tiling, Slopes, and Collision</title>
      <dc:creator>SpriteShip Team</dc:creator>
      <pubDate>Fri, 11 Sep 2026 15:30:00 +0000</pubDate>
      <link>https://dev.to/spriteship/building-a-2d-terrain-editor-auto-tiling-slopes-and-collision-2kj3</link>
      <guid>https://dev.to/spriteship/building-a-2d-terrain-editor-auto-tiling-slopes-and-collision-2kj3</guid>
      <description>&lt;p&gt;A 2D terrain editor should let creators think in terrain—not in a catalogue of corners, edge tiles, and one-off fixes.&lt;/p&gt;

&lt;p&gt;When a map is built tile by tile, a small visual change can become a maintenance problem. Paint a new patch of ground and suddenly every transition, slope, collision boundary, and layer relationship needs attention. That friction is exactly what we set out to remove.&lt;/p&gt;

&lt;h2&gt;
  
  
  The terrain problem with tile-by-tile editing
&lt;/h2&gt;

&lt;p&gt;Traditional tilemaps are powerful, but they ask creators to manage a lot of presentation detail themselves. A grass tile next to stone may need a different edge than grass next to sand. Platformer terrain needs slopes and solid surfaces; top-down terrain needs readable boundaries; isometric terrain needs consistent depth.&lt;/p&gt;

&lt;p&gt;Those concerns are real, but they should not force a creator to hand-place every visual variation.&lt;/p&gt;

&lt;h2&gt;
  
  
  Paint terrain intent, not individual corners
&lt;/h2&gt;

&lt;p&gt;In SpriteShip, a &lt;strong&gt;Material&lt;/strong&gt; is a reusable visual recipe for terrain. Instead of selecting a specific corner or edge tile, you choose the material and paint the shape of the ground you want.&lt;/p&gt;

&lt;p&gt;The editor retains the intent: where the terrain is, which material it uses, and the gameplay properties you chose. From there, it can render connected terrain appropriate to the map’s perspective.&lt;/p&gt;

&lt;p&gt;That makes the result easier to revise. Want to widen a path, reshape a cliff, or replace grass with snow? Edit the terrain itself rather than rebuilding a patchwork of tiles.&lt;/p&gt;

&lt;h2&gt;
  
  
  Auto-tiling is only useful when it stays editable
&lt;/h2&gt;

&lt;p&gt;Connected terrain should look intentional, but it also needs to survive iteration. The important part is not merely choosing neighboring tile art automatically. It is preserving an editable map representation so that visual details can be recalculated after the creator changes the shape.&lt;/p&gt;

&lt;p&gt;This is especially valuable when the same project needs different terrain treatment across side-view, top-down, and isometric scenes.&lt;/p&gt;

&lt;h2&gt;
  
  
  Slopes, collision, and visual terrain belong in the same workflow
&lt;/h2&gt;

&lt;p&gt;A playable map needs more than a good-looking ground layer. Platform surfaces, slopes, collision boundaries, and draw order all affect the game experience.&lt;/p&gt;

&lt;p&gt;The editor keeps those decisions close to the terrain workflow: paint a region, refine its shape, preview the result, and verify collision before export. That gives creators a faster feedback loop without pretending that artwork alone can define gameplay.&lt;/p&gt;

&lt;h2&gt;
  
  
  A practical terrain workflow
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Choose or create a Material that fits the project’s visual language.&lt;/li&gt;
&lt;li&gt;Paint the terrain shape directly on the map.&lt;/li&gt;
&lt;li&gt;Refine slopes, shapes, and layer order where the level needs them.&lt;/li&gt;
&lt;li&gt;Preview the visual result and collision behavior.&lt;/li&gt;
&lt;li&gt;Export the map for the engine you are using.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The goal is simple: keep terrain creation expressive enough for artists and structured enough for game development.&lt;/p&gt;

&lt;h2&gt;
  
  
  What this approach does not promise
&lt;/h2&gt;

&lt;p&gt;It does not turn a rough idea into a finished level automatically. It does not guarantee that generated artwork is seamless in every situation, and it does not invent game logic, enemy behavior, or level design.&lt;/p&gt;

&lt;p&gt;What it does provide is a more useful starting point: editable terrain that can be painted quickly, refined deliberately, and carried forward into a real game project.&lt;/p&gt;

&lt;p&gt;That is the kind of map editor we want to use ourselves—one that removes repetitive work while leaving the creative decisions in the creator’s hands.&lt;/p&gt;

&lt;p&gt;Explore SpriteShip’s 2D game-art and map-building workflow at &lt;a href="https://spriteship.com/?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=map_editor_series" rel="noopener noreferrer"&gt;spriteship.com&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>gamedev</category>
      <category>typescript</category>
      <category>tutorial</category>
      <category>webdev</category>
    </item>
    <item>
      <title>From Prompt to Playable: Building a Phaser Survival Game with Codex and SpriteShip</title>
      <dc:creator>SpriteShip Team</dc:creator>
      <pubDate>Sat, 22 Aug 2026 18:22:01 +0000</pubDate>
      <link>https://dev.to/spriteship/from-prompt-to-playable-building-a-phaser-survival-game-with-codex-and-spriteship-2me0</link>
      <guid>https://dev.to/spriteship/from-prompt-to-playable-building-a-phaser-survival-game-with-codex-and-spriteship-2me0</guid>
      <description>&lt;p&gt;There is a big difference between a game prototype that technically works and one that feels like a game.&lt;/p&gt;

&lt;p&gt;Movement, spawning, upgrades, and collision can be built with colored rectangles. That is often the right way to start. But the moment you want an animated player, a family of enemies, weapon variety, collectibles, and a consistent visual identity, the art pipeline can become the project.&lt;/p&gt;

&lt;p&gt;For a recent experiment, I wanted to see how far I could get by combining three tools:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Phaser 3&lt;/strong&gt; for the game runtime&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Codex&lt;/strong&gt; for implementation and iteration&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;SpriteShip&lt;/strong&gt; for game-ready visual assets through its MCP/API workflow&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The result was &lt;strong&gt;Last Light&lt;/strong&gt;, a top-down survival game that runs in desktop and mobile browsers. It has an animated player, multiple enemy families, a large humanoid with separate walk and attack animations, sixteen weapons, sixteen collectibles, upgrades, an objective, and a boss encounter.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Play Last Light:&lt;/strong&gt; &lt;a href="https://spriteship.github.io/sample_games/last-light/" rel="noopener noreferrer"&gt;https://spriteship.github.io/sample_games/last-light/&lt;/a&gt;&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Browse the source repository:&lt;/strong&gt; &lt;a href="https://github.com/spriteship/sample_games" rel="noopener noreferrer"&gt;https://github.com/spriteship/sample_games&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;More importantly, it became playable through a surprisingly natural loop: describe an asset, generate it in SpriteShip, inspect or revise it, and let Codex wire the exported data into Phaser.&lt;/p&gt;
&lt;h2&gt;
  
  
  Starting with gameplay, not presentation
&lt;/h2&gt;

&lt;p&gt;The first version was intentionally plain. It established the systems that mattered:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Top-down movement&lt;/li&gt;
&lt;li&gt;Automatic targeting and firing&lt;/li&gt;
&lt;li&gt;Enemy spawning and difficulty progression&lt;/li&gt;
&lt;li&gt;Experience drops and upgrades&lt;/li&gt;
&lt;li&gt;Desktop and touch input&lt;/li&gt;
&lt;li&gt;A camera following the player across a large map&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That gave us something useful to evaluate. Once the loop was playable, every art decision could be judged in motion rather than in isolation.&lt;/p&gt;

&lt;p&gt;This order mattered. SpriteShip did not have to invent the game design; it could supply assets for systems that already existed.&lt;/p&gt;
&lt;h2&gt;
  
  
  Creating a coherent project in SpriteShip
&lt;/h2&gt;

&lt;p&gt;Instead of making unrelated images one at a time, we created a top-down overhead project in SpriteShip. That project context helped keep the blackout-survival direction consistent across characters, enemies, weapons, and collectibles.&lt;/p&gt;

&lt;p&gt;The player went through a normal creative selection process. We generated options, selected a character, refined the camera angle and facing direction, and then added animation states. The same process produced:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A player walk cycle&lt;/li&gt;
&lt;li&gt;A separate idle animation&lt;/li&gt;
&lt;li&gt;Four creature enemies&lt;/li&gt;
&lt;li&gt;A larger weaponless humanoid enemy&lt;/li&gt;
&lt;li&gt;Humanoid walk and attack animations&lt;/li&gt;
&lt;li&gt;A 4×4 weapon set&lt;/li&gt;
&lt;li&gt;A 4×4 collectible set&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The useful part was not just getting PNG files. SpriteShip returned structured animation data: atlas frames, FPS, looping behavior, source sizes, previews, and collision-body definitions.&lt;/p&gt;

&lt;p&gt;That is where the MCP integration started to feel less like image generation and more like a game-development tool.&lt;/p&gt;
&lt;h2&gt;
  
  
  Wiring SpriteShip animations into Phaser
&lt;/h2&gt;

&lt;p&gt;Phaser’s atlas support maps naturally to SpriteShip’s exports. The loader only needs the sheet and its JSON metadata:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;load&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;atlas&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="nx"&gt;PLAYER_ATLAS&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;assets/spriteship/player/spritesheet_walk_256.png&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;assets/spriteship/player/atlas_walk_256.json&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Animation registration can use the frame list supplied by the atlas instead of assuming a fragile numeric range:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;definition&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;atlasData&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;animations&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;walk&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="nx"&gt;scene&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;anims&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;key&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;player-walk&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;frames&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;definition&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;frames&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;frame&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;({&lt;/span&gt;
    &lt;span class="na"&gt;key&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;PLAYER_ATLAS&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nx"&gt;frame&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;})),&lt;/span&gt;
  &lt;span class="na"&gt;frameRate&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;60&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;repeat&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The player switches to the walk cycle while moving and to SpriteShip’s &lt;code&gt;idle_2&lt;/code&gt; animation while stationary. Because the animation data is named and versionable, updating a dashboard edit is much safer than manually rebuilding frame sequences.&lt;/p&gt;

&lt;h2&gt;
  
  
  Collision data was more useful than I expected
&lt;/h2&gt;

&lt;p&gt;SpriteShip supplied normalized rectangular collision bodies for individual animation states. We converted those values into rotated world-space rectangles inside Phaser.&lt;/p&gt;

&lt;p&gt;For the humanoid enemy, the body changes when the attack animation begins. The attack pose is wider and lower than the walk pose, so using a single circular approximation would have produced misleading hits.&lt;/p&gt;

&lt;p&gt;The final game uses the same authored rectangle for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Projectile collision&lt;/li&gt;
&lt;li&gt;Enemy melee contact&lt;/li&gt;
&lt;li&gt;Debug visualization&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That last point was important. Drawing the rectangle on screen made it immediately obvious whether gameplay matched the artwork. It also turned collision tuning into something a non-programmer could evaluate visually.&lt;/p&gt;

&lt;h2&gt;
  
  
  The dashboard-and-agent loop worked well
&lt;/h2&gt;

&lt;p&gt;One of my favorite parts of the workflow was mixing dashboard edits with Codex-driven integration.&lt;/p&gt;

&lt;p&gt;At one point, the humanoid attack animation was adjusted in the SpriteShip dashboard. Instead of manually exporting everything and explaining what changed, the updated asset could be fetched again and repackaged for the game. The same happened with collectible cleanup.&lt;/p&gt;

&lt;p&gt;The division of labor felt sensible:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The human selected and visually edited assets.&lt;/li&gt;
&lt;li&gt;SpriteShip managed the project and generated structured outputs.&lt;/li&gt;
&lt;li&gt;Codex synchronized files, generated runtime variants, updated Phaser code, and ran tests.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It was a much smoother loop than downloading miscellaneous images, renaming them by hand, and guessing how they should be sliced.&lt;/p&gt;

&lt;h2&gt;
  
  
  Resolution is not only width and height
&lt;/h2&gt;

&lt;p&gt;The most useful lesson from the project was that two 256×256 frames are not necessarily the same visual size.&lt;/p&gt;

&lt;p&gt;The player’s walk and idle animations both had 256×256 runtime frames, but the character initially occupied a much smaller part of the idle frame. When the game switched states, the player appeared to shrink.&lt;/p&gt;

&lt;p&gt;We measured the visible pixel bounds and found roughly:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Walk footprint: 158×179 pixels&lt;/li&gt;
&lt;li&gt;Initial idle footprint: 109×111 pixels&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The fix was to rebuild the idle runtime sheet from SpriteShip’s original 512×512 frames, normalize the character around the same ground anchor, and then export back to 256×256 frames. That produced a much closer 176×178 pixel footprint without throwing away source detail.&lt;/p&gt;

&lt;p&gt;This was not a failure of the integration. It was a reminder that a real asset pipeline must consider transparent padding, subject scale, ground contact, and intended display size—not just file dimensions.&lt;/p&gt;

&lt;p&gt;The same principle guided the other assets:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Weapons: 32×32 source and runtime display target&lt;/li&gt;
&lt;li&gt;Collectibles: 64×64 source and runtime display target&lt;/li&gt;
&lt;li&gt;Animated characters: larger source frames with consistent visual occupancy&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Once those rules were explicit, the game looked much sharper and more cohesive.&lt;/p&gt;

&lt;h2&gt;
  
  
  What SpriteShip made easy
&lt;/h2&gt;

&lt;p&gt;Several things that normally consume a lot of setup time were refreshingly straightforward:&lt;/p&gt;

&lt;h3&gt;
  
  
  Consistent asset families
&lt;/h3&gt;

&lt;p&gt;The player, enemies, weapons, and collectibles belong to the same visual world. Achieving that consistency across dozens of independent assets is usually difficult.&lt;/p&gt;

&lt;h3&gt;
  
  
  Animation metadata
&lt;/h3&gt;

&lt;p&gt;Named animations, FPS, loop state, frame lists, and preview GIFs made integration predictable.&lt;/p&gt;

&lt;h3&gt;
  
  
  Multiple runtime sizes
&lt;/h3&gt;

&lt;p&gt;Having access to larger sources and smaller runtime variants let us make sensible choices for desktop and mobile instead of scaling one image everywhere.&lt;/p&gt;

&lt;h3&gt;
  
  
  MCP/API access
&lt;/h3&gt;

&lt;p&gt;The API key stayed in the local environment, and Codex could work with SpriteShip as part of the development process. There was no need to build an asset-management service inside the game.&lt;/p&gt;

&lt;h3&gt;
  
  
  Human-in-the-loop editing
&lt;/h3&gt;

&lt;p&gt;The dashboard remained valuable even in an agent-driven workflow. This was not “type one prompt and accept everything.” It was a collaborative process where visual judgment and automation complemented each other.&lt;/p&gt;

&lt;h2&gt;
  
  
  The results were not magically perfect—and that is fine
&lt;/h2&gt;

&lt;p&gt;A believable account of AI-assisted creation should include the iterations.&lt;/p&gt;

&lt;p&gt;The first character direction was not exactly right. One collectible sheet included labels that were useful for review but not for runtime use. Animation families needed scale normalization. Playback speed needed tuning after a walk cycle changed frame count. Collision bodies needed to be visualized before they could be trusted.&lt;/p&gt;

&lt;p&gt;What impressed me was how inexpensive those corrections were in the overall workflow. We did not have to discard the pipeline every time something changed. We could revise an asset, fetch the new version, and update the game.&lt;/p&gt;

&lt;p&gt;That is a more meaningful kind of speed than getting a perfect image from one prompt.&lt;/p&gt;

&lt;h2&gt;
  
  
  Building a sample repository
&lt;/h2&gt;

&lt;p&gt;The finished game became the first entry in a dedicated SpriteShip sample-games repository:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;spriteship-game-samples/
├── README.md
├── package.json
└── games/
    └── last-light/
        ├── README.md
        ├── PRD.md
        ├── public/
        ├── tests/
        └── package.json
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Each future game can live in its own workspace with independent assets, tests, and build scripts. The root repository acts as a catalog rather than forcing every sample into one application.&lt;/p&gt;

&lt;p&gt;This structure also makes the examples useful to developers. They can inspect the actual atlases, animation registration, collision conversion, and resolution choices instead of only seeing a promotional demo.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I would do next
&lt;/h2&gt;

&lt;p&gt;The obvious next step is to add samples in other genres and engines:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A platformer with state transitions and hit reactions&lt;/li&gt;
&lt;li&gt;A tactics prototype using character directions and tilemaps&lt;/li&gt;
&lt;li&gt;A Godot sample using the same SpriteShip project concepts&lt;/li&gt;
&lt;li&gt;A small multiplayer arena with cosmetic variants&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I would also like to see engine-specific SpriteShip exports become even more opinionated: a Phaser loader module, recommended display sizes, per-frame opaque bounds, and a compact synchronization manifest would make an already smooth workflow nearly automatic.&lt;/p&gt;

&lt;h2&gt;
  
  
  Final thoughts
&lt;/h2&gt;

&lt;p&gt;Codex made it possible to keep implementation, asset processing, testing, and iteration in one development thread. Phaser made the runtime lightweight and immediate. SpriteShip supplied the piece that usually holds prototypes back: enough coherent, animated art to make the game feel intentional.&lt;/p&gt;

&lt;p&gt;The standout feature was not simply that SpriteShip generated good images. It was that the service fit into a real engineering loop. Assets had identities, versions, animations, collision data, previews, and dashboard edits. The MCP/API interface made those capabilities accessible without turning the project into an asset-management exercise.&lt;/p&gt;

&lt;p&gt;Last Light still involved judgment and iteration, as every game does. But the distance between “I want a top-down survival game” and “I can play one with a coherent animated cast” was much shorter than I expected.&lt;/p&gt;

&lt;p&gt;That is the kind of AI-assisted workflow I find genuinely useful: not replacing the creative process, but removing enough friction that the process can keep moving.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Play the game:&lt;/strong&gt; &lt;a href="https://spriteship.github.io/sample_games/last-light/" rel="noopener noreferrer"&gt;https://spriteship.github.io/sample_games/last-light/&lt;/a&gt;&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Project repository:&lt;/strong&gt; &lt;a href="https://github.com/spriteship/sample_games" rel="noopener noreferrer"&gt;https://github.com/spriteship/sample_games&lt;/a&gt;&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Tools:&lt;/strong&gt; &lt;a href="https://spriteship.com/" rel="noopener noreferrer"&gt;SpriteShip&lt;/a&gt;, Codex, Phaser 3&lt;/p&gt;

</description>
      <category>gamedev</category>
      <category>phaser</category>
      <category>ai</category>
      <category>mcp</category>
    </item>
    <item>
      <title>How to give a coding agent a complete 2D game-art pipeline over MCP</title>
      <dc:creator>SpriteShip Team</dc:creator>
      <pubDate>Thu, 20 Aug 2026 12:42:02 +0000</pubDate>
      <link>https://dev.to/spriteship/how-to-give-a-coding-agent-a-complete-2d-game-art-pipeline-over-mcp-1475</link>
      <guid>https://dev.to/spriteship/how-to-give-a-coding-agent-a-complete-2d-game-art-pipeline-over-mcp-1475</guid>
      <description>&lt;p&gt;Most coding agents can write the player controller, register an animation, and&lt;br&gt;
load a texture atlas. They usually stop at the point where the art has to exist.&lt;/p&gt;

&lt;p&gt;That boundary is awkward for an autonomous workflow. An image generator can&lt;br&gt;
produce a PNG, but the agent still has to guess how to split frames, name&lt;br&gt;
animations, build an atlas, define collision, and package everything for the&lt;br&gt;
engine.&lt;/p&gt;

&lt;p&gt;SpriteShip's hosted Model Context Protocol server is meant to close that gap. It&lt;br&gt;
currently exposes 41 tools for creating, reading, revising, animating, and&lt;br&gt;
exporting a game's 2D art layer.&lt;/p&gt;

&lt;p&gt;The cover image for this article was AI-generated with SpriteShip.&lt;/p&gt;
&lt;h2&gt;
  
  
  What the agent can actually make
&lt;/h2&gt;

&lt;p&gt;The tool surface covers more than characters:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;animated characters and directional turns;&lt;/li&gt;
&lt;li&gt;static props and animated objects;&lt;/li&gt;
&lt;li&gt;tilesets, terrain sheets, backgrounds, and seamless textures;&lt;/li&gt;
&lt;li&gt;level maps assembled from those assets;&lt;/li&gt;
&lt;li&gt;engine-native exports for Phaser, Godot, Unity, GameMaker, and Tiled.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The important part is the sequence. An agent can create a project, generate an&lt;br&gt;
asset inside it, poll the asynchronous job, inspect the result, and export files&lt;br&gt;
without requiring somebody to first prepare the entity in the web dashboard.&lt;/p&gt;
&lt;h2&gt;
  
  
  Connect the MCP server
&lt;/h2&gt;

&lt;p&gt;Create a scoped API key in SpriteShip under &lt;strong&gt;Account → API keys&lt;/strong&gt;, then expose it&lt;br&gt;
to the process running your agent:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;SPRITESHIP_API_KEY&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"ss_live_..."&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The MCP endpoint is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;https://spriteship.com/mcp
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;An MCP client configuration has three essential fields:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"mcpServers"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"spriteship"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"url"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://spriteship.com/mcp"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"headers"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"Authorization"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Bearer ${env:SPRITESHIP_API_KEY}"&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The exact config-file location differs between Claude Code, Cursor, Windsurf,&lt;br&gt;
Cline, and Codex, but the endpoint and authorization header are the same.&lt;/p&gt;
&lt;h2&gt;
  
  
  Start with a project
&lt;/h2&gt;

&lt;p&gt;Characters and assets live inside a project. The project also owns the permanent&lt;br&gt;
game perspective that guides later generations: platformer, angled top-down,&lt;br&gt;
straight overhead, isometric, or point-and-click.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;create_project&lt;/code&gt; is synchronous and free. A typical instruction to the agent is:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Create a platformer project called Clockwork Harbor. Use a hand-drawn style and&lt;br&gt;
describe it as a foggy port city powered by unreliable brass machinery.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Before creating anything, the agent should call &lt;code&gt;list_projects&lt;/code&gt; and reuse a&lt;br&gt;
matching project rather than creating a near-duplicate.&lt;/p&gt;
&lt;h2&gt;
  
  
  Generate four character options for one image call
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;create_character&lt;/code&gt; makes the initial character image. Setting both &lt;code&gt;gridRows&lt;/code&gt;&lt;br&gt;
and &lt;code&gt;gridCols&lt;/code&gt; to &lt;code&gt;2&lt;/code&gt; asks for a four-variation sheet. It is still one image call,&lt;br&gt;
so the four resulting character designs have the same generation cost as one.&lt;/p&gt;

&lt;p&gt;That makes the sensible first workflow:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Request a 2×2 set of character variations.&lt;/li&gt;
&lt;li&gt;Poll the returned job with &lt;code&gt;get_job&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Show the four &lt;code&gt;characterPreviews&lt;/code&gt; to the user.&lt;/li&gt;
&lt;li&gt;Animate only the selected design.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Generation is asynchronous. The create call returns a &lt;code&gt;jobId&lt;/code&gt;; when the job is&lt;br&gt;
finished, &lt;code&gt;get_job&lt;/code&gt; returns the created character IDs and expiring preview URLs.&lt;/p&gt;
&lt;h2&gt;
  
  
  Preview the cost before spending
&lt;/h2&gt;

&lt;p&gt;Paid SpriteShip MCP tools default to &lt;code&gt;dryRun: true&lt;/code&gt;. A dry run returns the&lt;br&gt;
estimated credit cost, current balance, daily spend cap, recent spend, and&lt;br&gt;
remaining cap. It generates nothing.&lt;/p&gt;

&lt;p&gt;The expected exchange looks like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;user: make four plague-doctor character concepts for this project

agent: the generation is estimated at 150 credits. Your balance after the call
       would be 1,350 credits. Shall I run it?

user: yes
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Only after that explicit approval should the agent repeat the call with&lt;br&gt;
&lt;code&gt;dryRun: false&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;This is backed by server-side controls rather than prompt etiquette:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;API keys have separate read, write, and spend scopes;&lt;/li&gt;
&lt;li&gt;each key has a daily credit ceiling;&lt;/li&gt;
&lt;li&gt;real writes are idempotent, so a retry cannot dispatch and charge twice;&lt;/li&gt;
&lt;li&gt;writes against a busy entity are rejected instead of racing;&lt;/li&gt;
&lt;li&gt;revoking a key cancels its unfinished jobs.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;When a job reaches a terminal state, the agent should report the job's actual&lt;br&gt;
net charge rather than repeating the estimate. Four variations still come from&lt;br&gt;
one charged image call, and failed steps can change the final amount.&lt;/p&gt;

&lt;h2&gt;
  
  
  Add real motion
&lt;/h2&gt;

&lt;p&gt;The still image and its animations are intentionally separate decisions.&lt;br&gt;
&lt;code&gt;generate_character_animation&lt;/code&gt; creates image-to-video motion such as a walk,&lt;br&gt;
idle, attack, or dodge. Each generated animation is a separate paid video call,&lt;br&gt;
so the agent should ask which motions are actually needed.&lt;/p&gt;

&lt;p&gt;For directional characters, a generated direction can also produce a free&lt;br&gt;
mirrored copy in the same job. A real second generation is still the right choice&lt;br&gt;
for an asymmetric character, because mirroring moves a held item to the opposite&lt;br&gt;
hand.&lt;/p&gt;

&lt;p&gt;Recent animation work also makes the generated motion more usable downstream:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;the starting pose is checked for visual inventory so empty hands remain empty
and existing held items are preserved;&lt;/li&gt;
&lt;li&gt;occupied animation names resolve non-destructively (&lt;code&gt;jump&lt;/code&gt;, &lt;code&gt;jump_2&lt;/code&gt;,
&lt;code&gt;jump_3&lt;/code&gt;);&lt;/li&gt;
&lt;li&gt;jump animations can be split into takeoff, airborne, and landing phases;&lt;/li&gt;
&lt;li&gt;character exports carry ten skeleton-derived attachment points for equipment
and effects.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Export something the engine understands
&lt;/h2&gt;

&lt;p&gt;Once the character is ready, &lt;code&gt;get_export_command&lt;/code&gt; returns an authenticated URL&lt;br&gt;
and a ready-to-run &lt;code&gt;curl&lt;/code&gt; command for the chosen engine. The agent runs that&lt;br&gt;
command in its own shell rather than passing a multi-megabyte zip through the&lt;br&gt;
language model.&lt;/p&gt;

&lt;p&gt;An export can contain:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;sprite sheets and atlas metadata;&lt;/li&gt;
&lt;li&gt;native engine resources;&lt;/li&gt;
&lt;li&gt;animation names and frame timing;&lt;/li&gt;
&lt;li&gt;collision shapes and ground footprints;&lt;/li&gt;
&lt;li&gt;per-frame equipment attachment points;&lt;/li&gt;
&lt;li&gt;a manifest, JSON Schema, README, and SpriteShip skill instructions.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That last group matters. The bundle explains its own structure, so the coding&lt;br&gt;
agent can register the animation in the game instead of inventing a file layout.&lt;/p&gt;

&lt;h2&gt;
  
  
  A useful end-to-end prompt
&lt;/h2&gt;

&lt;p&gt;After connecting the server, try an instruction shaped like this:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Create a platformer project for a clockwork harbor game. Preview the cost of&lt;br&gt;
four character designs for a lantern-carrying mechanic. Wait for my approval&lt;br&gt;
before spending anything. When they finish, show me the options and let me pick&lt;br&gt;
one. Then quote an idle and walk animation, generate only after I approve, and&lt;br&gt;
export the result for Phaser.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That single request exercises the important boundaries: project context, cost&lt;br&gt;
preview, explicit approval, asynchronous jobs, visual selection, separate&lt;br&gt;
animation spend, and engine-native export.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where to go next
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Agent overview and setup guides: &lt;a href="https://spriteship.com/agents" rel="noopener noreferrer"&gt;https://spriteship.com/agents&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;MCP endpoint: &lt;a href="https://spriteship.com/mcp" rel="noopener noreferrer"&gt;https://spriteship.com/mcp&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;API and key management: &lt;a href="https://spriteship.com/account/api-keys" rel="noopener noreferrer"&gt;https://spriteship.com/account/api-keys&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;SpriteShip includes 1,500 starting credits and does not require a card to try the&lt;br&gt;
first workflow. Reading existing assets and re-exporting them are free; credits&lt;br&gt;
are used for new AI generations.&lt;/p&gt;

</description>
      <category>gamedev</category>
      <category>mcp</category>
      <category>ai</category>
      <category>webdev</category>
    </item>
  </channel>
</rss>
