# Shapes Collision Attachment

> Shapes, Collision, and Attachment

- Skill: `vchelaru/shapes-collision-attachment` (Agent Skill)
- Install (CLI): `npx skillmds@latest add vchelaru/shapes-collision-attachment`
- Raw SKILL.md: https://api.skillmd.com/api/skills/vchelaru/shapes-collision-attachment/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Coding & Dev Tools
- Author: vchelaru (https://skillmd.com/u/vchelaru)
- Updated: 2026-09-17
- Page: https://skillmd.com/skills/vchelaru/shapes-collision-attachment

---


# Shapes, Collision, and Attachment

Two separate things get conflated here. Don't assume one implies the other.

1. **Attachment.** A shape (Circle, AxisAlignedRectangle, Polygon, etc.) is a `PositionedObject`. `AttachTo` makes it move with a parent, same as any other child (`PositionedObject.Children`, `PositionedObject.cs:288`). This works on any entity, `ICollidable` or not.
2. **Collision membership.** `ICollidable` (`Math/Geometry/ICollidable.cs:14`) adds one more thing: a `Collision` `ShapeCollection`. A shape only affects collision detection if it's also added to `.Collision` — being attached doesn't do that on its own.

`Sprite.SetCollisionFromAnimation` (`Sprite.cs:2044`) requires `ICollidable` because it writes into `.Collision`, not because reading shapes off an animation frame needs it. Custom code can read `CurrentFrame.ShapeCollectionSave` and use it however it wants on any entity — see `Enemy.GetNewBulletPosition()` in CrankyChibiCthulhu for a non-collision example (a `BulletOrigin` circle used to position bullet spawns).

**Landmine:** `createMissingShapes: true` on `SetCollisionFromAnimation` adds *any* unmatched named shape in the current frame to `.Collision`, including one only meant as a position marker. There's currently no way to sync a shape as a child from animation without risking it becoming a live collision shape if that flag is on.

Related: `achx-format` skill for how shapes are stored per animation frame.

