fix: remove trail on move tool
todo: fix overlapping blocks
This commit is contained in:
parent
630d122e2e
commit
603e3537db
1 changed files with 30 additions and 26 deletions
|
|
@ -182,37 +182,41 @@ function Canvas() {
|
||||||
const movementX = newMouseCoords.x - oldMouseCoords.x;
|
const movementX = newMouseCoords.x - oldMouseCoords.x;
|
||||||
const movementY = newMouseCoords.y - oldMouseCoords.y;
|
const movementY = newMouseCoords.y - oldMouseCoords.y;
|
||||||
|
|
||||||
const movedBlocks: Block[] = [];
|
|
||||||
|
|
||||||
// Add movementX and movementY to each block in the selection box
|
|
||||||
// Also create air blocks to avoid other blocks inserting themself into the selection
|
|
||||||
for (let x = selectionBoxBounds.minX; x <= selectionBoxBounds.maxX - 1; x++) {
|
|
||||||
for (let y = selectionBoxBounds.minY; y <= selectionBoxBounds.maxY - 1; y++) {
|
|
||||||
const existingBlock = blocks.find((block) => block.x === x && block.y === y);
|
|
||||||
|
|
||||||
movedBlocks.push({
|
|
||||||
name: existingBlock ? existingBlock.name : "air",
|
|
||||||
x: x + movementX,
|
|
||||||
y: y + movementY,
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Avoid duplicates
|
|
||||||
const oldBlocks = blocks.filter((block) => {
|
|
||||||
return !movedBlocks.some((newBlock) => block.x === newBlock.x && block.y === newBlock.y);
|
|
||||||
});
|
|
||||||
|
|
||||||
// Remove air blocks
|
|
||||||
const nonAirBlocks = movedBlocks.filter((b) => b.name !== "air");
|
|
||||||
|
|
||||||
setSelectionBoxBounds((prev) => ({
|
setSelectionBoxBounds((prev) => ({
|
||||||
minX: prev.minX + movementX,
|
minX: prev.minX + movementX,
|
||||||
minY: prev.minY + movementY,
|
minY: prev.minY + movementY,
|
||||||
maxX: prev.maxX + movementX,
|
maxX: prev.maxX + movementX,
|
||||||
maxY: prev.maxY + movementY,
|
maxY: prev.maxY + movementY,
|
||||||
}));
|
}));
|
||||||
setBlocks([...nonAirBlocks, ...oldBlocks]);
|
|
||||||
|
setBlocks((prev) => {
|
||||||
|
const airBlocks: Block[] = [];
|
||||||
|
|
||||||
|
for (let x = selectionBoxBounds.minX; x < selectionBoxBounds.maxX; x++) {
|
||||||
|
for (let y = selectionBoxBounds.minY; y < selectionBoxBounds.maxY; y++) {
|
||||||
|
const existingBlock = prev.find((block) => block.x === x && block.y === y);
|
||||||
|
if (existingBlock) continue;
|
||||||
|
|
||||||
|
airBlocks.push({ name: "air", x, y });
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return [...prev, ...airBlocks].map((block) => {
|
||||||
|
if (
|
||||||
|
block.x >= selectionBoxBounds.minX &&
|
||||||
|
block.x <= selectionBoxBounds.maxX - 1 &&
|
||||||
|
block.y >= selectionBoxBounds.minY &&
|
||||||
|
block.y <= selectionBoxBounds.maxY - 1
|
||||||
|
) {
|
||||||
|
return {
|
||||||
|
...block,
|
||||||
|
x: block.x + movementX,
|
||||||
|
y: block.y + movementY,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
return block;
|
||||||
|
});
|
||||||
|
});
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case "rectangle-select":
|
case "rectangle-select":
|
||||||
|
|
@ -227,7 +231,7 @@ function Canvas() {
|
||||||
onToolUse();
|
onToolUse();
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
[dragging, coords, scale, tool, onToolUse, setCoords, setSelectionBoxBounds, mouseCoords, blocks, selectionBoxBounds, setBlocks]
|
[dragging, coords, scale, tool, mouseCoords, selectionBoxBounds, onToolUse, setCoords, setSelectionBoxBounds, setBlocks]
|
||||||
);
|
);
|
||||||
|
|
||||||
const onMouseDown = useCallback(() => {
|
const onMouseDown = useCallback(() => {
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue