Let a texture frame set where a sprite stands for Y sorting (#228)
A sprite sorted by Y stood on the bottom of its box. With a shadow or empty rows under the feet that is too low, so a figure slipped in front of a tree it should stand behind. The line belongs to the frame, not the texture, because one texture can hold several sprite sheets. - New field `sortLine` on a frame: whole image pixels up from the frame's bottom edge, 0 to the frame height. 0 is stored as nothing, so old projects stay the same. Shrinking a frame keeps the line inside it. - `feetOf` in drawOrder.ts lifts a sprite by the same share of its box. Scene view, game view, play and picking all use it. In an animation the line of the frame shown right now counts. - The texture tab draws the selected frame's line dashed in yellow with a knob left of the frame. At 0 the line shares the bottom edge with the nine-slice border and a resize handle, so the knob is tested first. A line inside the frame can be dragged directly, tested after the nine-slice lines. - The inspector has a new "Sorting" section with a "Sort line" field. Dragging or typing is one undo step each. Limit: frames of one walk cycle need the same value, set by hand. Otherwise the figure changes its place in the order while walking. Tests: - ./check.sh: 160 files, 2356 tests, CHECK EXIT 0 (before 2350). - 6 new unit tests in tests/viewport/sort-by-y.test.ts. - e2e 37 and 39-43: ALL PASSED, 162 checks. New check 37b-ii drags the knob up 6 px and undoes it, plus the inspector row. - Counter checks: if feetOf ignores the line, exactly the 3 order tests fail. If the knob cannot be grabbed, 37b-ii fails. - The e2e sum in the README is 1380, counted, not yet seen in CI. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
1 parent
50854389bb
commit
89048413f1
11 files changed
+334
-11
No files matched your search
@@ -109,6 +109,29 @@ export async function nineSlice(t) {
|
||||
);
|
||||
await redo();
|
||||
await redo();
|
||||
|
||||
// 37b-ii. The sort line (#228) sits on the bottom edge with the bottom border and the resize
|
||||
// handle, so it is dragged by its knob left of the frame: 6 pixels up, one undo step.
|
||||
const sortLine = () =>
|
||||
json(
|
||||
`__gm.state.project.assets.find((a) => a.id === ${JSON.stringify(texture.id)})` +
|
||||
`.frames.find((f) => f.id === 'ns-frame').sortLine ?? null`,
|
||||
);
|
||||
const knob = (await json('__gm.texture.drawInfo()')).sortKnob;
|
||||
const knobTo = await json('__gm.texture.pointAt(0, 18)');
|
||||
await drag(knob.x, knob.y, knob.x, knobTo.y);
|
||||
await settle();
|
||||
const lifted = await sortLine();
|
||||
const afterLift = await frame();
|
||||
await undo();
|
||||
const dropped = await sortLine();
|
||||
check(
|
||||
'dragging the knob sets the sort line and leaves the frame and its borders, undo takes it away',
|
||||
lifted === 6 && dropped === null && afterLift.h === 24 && afterLift.border?.bottom === 0,
|
||||
JSON.stringify({ knob, lifted, dropped, afterLift }),
|
||||
);
|
||||
check('the sort line is a row of the frame inspector', await has('Sort line'));
|
||||
|
||||
await mutate(`
|
||||
const f = __gm.state.project.assets.find((a) => a.id === ${JSON.stringify(texture.id)})
|
||||
.frames.find((f) => f.id === 'ns-frame');
|
||||
|
||||
Reference in new issue
Block a user