<?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>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>
