pixel drawer
  • JavaScript 63.4%
  • PHP 13.6%
  • CSS 12.5%
  • Python 8.1%
  • HTML 2.4%
Find a file
2026-06-01 22:48:15 +09:00
js updateeeed 2026-06-01 22:48:15 +09:00
app.js updateeeed 2026-06-01 22:48:15 +09:00
app.js.bak updateeeed 2026-06-01 22:48:15 +09:00
index.html updateeeed 2026-06-01 22:48:15 +09:00
index.html.bak updateeeed 2026-06-01 22:48:15 +09:00
README.md updateeeed 2026-06-01 22:48:15 +09:00
README.md.bak updateeeed 2026-06-01 22:48:15 +09:00
styles.css updateeeed 2026-06-01 22:48:15 +09:00
styles.css.bak updateeeed 2026-06-01 22:48:15 +09:00

Pixel Island Summoner

Browser-only prototype for a shared pixel-art island.

Run

Open index.html in a modern browser. No build step or third-party dependency is required.

Current prototype scope

  • Draw pixel assets in the in-browser editor.
  • Save assets to the local library.
  • Place static assets and summon dynamic assets onto the island.
  • Dynamic assets default to right-facing on spawn; left-facing is rendered by mirroring during movement only.
  • Local voting, hiding, remix/copy edit, and import/export tools are included.

Phase 1 changes

  • Asset data is normalized to schema 2+ compatible shape.
  • Dynamic left-facing pixels are not stored; faces.left is represented as mirror.
  • Empty depth/light metadata is omitted or normalized.
  • Editor tools include Draw, Erase, Fill, Pick, Undo, and Redo.

Phase 2 changes

  • Local save uses a compact Phase 2 envelope in localStorage.
  • Pixel planes are bbox-cropped and RLE-compressed when this is smaller than raw cropped data.
  • Compact asset bundles can be exported separately from world snapshots.
  • World snapshots contain placements, dynamic summons, and an asset manifest rather than full asset blobs.
  • Local object/asset mutations append small sync events to eventLog.
  • IndexedDB asset/snapshot cache helpers are included for future server-backed missing-asset fetches.

Phase 3 changes

  • Terrain rendering is chunk-cached instead of using one large terrain canvas.
  • Only terrain chunks intersecting the current viewport are drawn.
  • Static and dynamic objects outside the viewport margin are culled before sprite generation/sorting.
  • Dynamic runtime updates are stepped at 15 Hz and capped per frame to avoid spiral-of-death on slow devices.
  • Rendering pauses while the browser tab is hidden and resumes on visibility change.
  • Tile/object lookups use a small spatial index for inspect, erase, and nearby-target searches.
  • Data tab reports visible terrain chunks for quick performance inspection.

Phase 4 changes

  • Editor schema is now 5.
  • Added Line and Rect tools. Rect supports filled rectangles with Shift; right-click erases line/rect cells.
  • Added Select tool. Drag to select a rectangular area, then drag the selection or use arrow keys/buttons to move it.
  • Nudge buttons move the active selection; without a selection they shift the whole drawing.
  • Added horizontal/vertical flip, palette-colored outline generation, and clear selection.
  • Added editor PNG export/import. PNG import quantizes the image to the current island palette and current canvas size.
  • Added keyboard shortcuts: B/E/F/I/L/R/S for tools, Ctrl/Cmd+Z/Y for history, arrows for moving selected pixels, Escape to clear selection.

Export formats

  • Export full JSON: human-readable full local state.
  • Export compact: compact local state suitable for saving/transferring.
  • Export snapshot: placement state plus asset manifest; requires asset bundles or cache to render fully.
  • Export asset bundle: compact asset blob list for missing-asset transfer.

Phase 4 follow-up adjustments

  • PNG import now chooses the editor canvas size from the image size. Square 8/16/32/64 PNGs import at their native size; other sizes are fit into the nearest supported square canvas.
  • Depth is now three-state: high, normal, and low. High brightens sprite pixels; low darkens them.
  • Right-clicking the world canvas clears the current map selection instead of moving or placing the selected asset.
  • Dynamic sprites now pause intermittently instead of walking continuously.
  • Night rendering is darker.
  • Object picking now uses sprite-sized, per-opaque-pixel hit testing, so transparent pixels are not clickable.
  • The CSS font stack now tries 3x5 MT Pixel Font first. The font file itself is not bundled.