Skip to content

Commit

Permalink
♻️ 更新Section删除方法
Browse files Browse the repository at this point in the history
  • Loading branch information
Littlefean committed Oct 23, 2024
1 parent d88c7f2 commit 5816640
Show file tree
Hide file tree
Showing 7 changed files with 66 additions and 34 deletions.
24 changes: 14 additions & 10 deletions src/core/controller/concrete/ControllerCutting.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ import { Controller } from "../Controller";
import { ControllerClass } from "../ControllerClass";
import { Line } from "../../dataStruct/shape/Line";
import { EdgeRenderer } from "../../render/canvas2d/entityRenderer/edge/EdgeRenderer";
import { Section } from "../../stageObject/entity/Section";

/**
* 关于斩断线的控制器
Expand Down Expand Up @@ -52,13 +53,16 @@ ControllerCutting.mousemove = (event: MouseEvent) => {
ControllerCutting.lastMoveLocation,
);

Stage.warningNodes = [];
for (const node of StageManager.getTextNodes()) {
const collidePoints = node.rectangle.getCollidePointsWithLine(
Stage.cuttingLine,
);
Stage.warningEntity = [];
for (const entity of StageManager.getEntities()) {
if (entity instanceof Section) {
continue; // Section的碰撞箱比较特殊
}
const collidePoints = entity.collisionBox
.getRectangle()
.getCollidePointsWithLine(Stage.cuttingLine);
if (collidePoints.length > 0) {
Stage.warningNodes.push(node);
Stage.warningEntity.push(entity);
for (const collidePoint of collidePoints) {
Stage.effects.push(
new CircleFlameEffect(
Expand Down Expand Up @@ -104,8 +108,8 @@ ControllerCutting.mouseup = (event: MouseEvent) => {
}
Stage.isCutting = false;

StageManager.deleteEntities(Stage.warningNodes);
Stage.warningNodes = [];
StageManager.deleteEntities(Stage.warningEntity);
Stage.warningEntity = [];

for (const edge of Stage.warningEdges) {
StageManager.deleteEdge(edge);
Expand All @@ -116,9 +120,9 @@ ControllerCutting.mouseup = (event: MouseEvent) => {
for (const section of Stage.warningSections) {
StageManager.deleteSection(section);
}

Stage.warningSections = [];

StageManager.updateReferences();

Stage.warningEdges = [];
Expand Down
39 changes: 25 additions & 14 deletions src/core/controller/concrete/ControllerNodeConnection.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ import { ControllerClass } from "../ControllerClass";
import { Controller } from "../Controller";
import { RectangleNoteEffect } from "../../effect/concrete/RectangleNoteEffect";
import { EdgeRenderer } from "../../render/canvas2d/entityRenderer/edge/EdgeRenderer";
import { ConnectableEntity } from "../../stageObject/StageObject";

/**
* 右键连线功能 的控制器
Expand All @@ -29,38 +30,46 @@ ControllerNodeConnection.mousedown = (event: MouseEvent) => {
new Vector(event.clientX, event.clientY),
);
const clickedNode = StageManager.findTextNodeByLocation(pressWorldLocation);

const clickedSection = StageManager.findSectionByLocation(pressWorldLocation);
let clickedConnectableEntity: ConnectableEntity | null = null;

if (clickedNode) {
clickedConnectableEntity = clickedNode;
}
if (clickedSection) {
clickedConnectableEntity = clickedSection;
}

if (clickedConnectableEntity) {
// 右键点击了某个节点
// Stage.isCutting = false;
Stage.connectFromEntities = [];
for (const node of StageManager.getTextNodes()) {
for (const node of StageManager.getConnectableEntity()) {
if (node.isSelected) {
Stage.connectFromEntities.push(node);
}
}
if (Stage.connectFromEntities.includes(clickedNode)) {
if (Stage.connectFromEntities.includes(clickedConnectableEntity)) {
// 多重连接
for (const node of StageManager.getTextNodes()) {
for (const node of StageManager.getConnectableEntity()) {
if (node.isSelected) {
// 特效
Stage.effects.push(
new RectangleNoteEffect(
new ProgressNumber(0, 15),
node.rectangle.clone(),
node.collisionBox.getRectangle().clone(),
new Color(0, 255, 0, 1),
),
);
}
}
} else {
// 不触发多重连接
Stage.connectFromEntities = [clickedNode];
Stage.connectFromEntities = [clickedConnectableEntity];
// 特效
Stage.effects.push(
new RectangleNoteEffect(
new ProgressNumber(0, 15),
clickedNode.rectangle.clone(),
clickedConnectableEntity.collisionBox.getRectangle().clone(),
new Color(0, 255, 0, 1),
),
);
Expand All @@ -81,8 +90,8 @@ ControllerNodeConnection.mousemove = (event: MouseEvent) => {
);
// 连接线
let isFindConnectToNode = false;
for (const node of StageManager.getTextNodes()) {
if (node.collisionBox.isPointInCollisionBox(worldLocation)) {
for (const entity of StageManager.getConnectableEntity()) {
if (entity.collisionBox.isPointInCollisionBox(worldLocation)) {
if (Stage.connectToEntity === null) {
// 特效
// Stage.effects.push(
Expand All @@ -93,7 +102,7 @@ ControllerNodeConnection.mousemove = (event: MouseEvent) => {
// ),
// );
}
Stage.connectToEntity = node;
Stage.connectToEntity = entity;
isFindConnectToNode = true;

break;
Expand All @@ -113,14 +122,16 @@ ControllerNodeConnection.mouseup = (event: MouseEvent) => {
// 结束连线
if (Stage.connectFromEntities.length > 0 && Stage.connectToEntity !== null) {
let isHaveConnectResult = false; // 在多重链接的情况下,是否有连接成功
for (const node of Stage.connectFromEntities) {
const connectResult = StageManager.connectNode(node, Stage.connectToEntity);
for (const entity of Stage.connectFromEntities) {
const connectResult = StageManager.connectNode(entity, Stage.connectToEntity);
if (connectResult) {
// 连接成功,特效
isHaveConnectResult = true;
for (const effect of EdgeRenderer.getConnectedEffects(node, Stage.connectToEntity)) {
for (const effect of EdgeRenderer.getConnectedEffects(entity, Stage.connectToEntity)) {
Stage.effects.push(effect);
}
} else {
console.warn("连接失败!", entity, Stage.connectToEntity);
}
}
if (isHaveConnectResult) {
Expand Down
7 changes: 7 additions & 0 deletions src/core/render/canvas2d/entityRenderer/EntityRenderer.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,13 @@ export namespace EntityRenderer {
new Color(0, 255, 0, 0.5),
);
}
// debug
RenderUtils.renderRect(
section.collisionBox.getRectangle().transformWorld2View(),
section.color,
new Color(0, 2, 255, 1),
0.5 * Camera.currentScale
)
}

export function renderNode(node: TextNode) {
Expand Down
4 changes: 2 additions & 2 deletions src/core/render/canvas2d/renderer.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -204,7 +204,7 @@ export namespace Renderer {
}
function renderWarningEntities() {
// 待删除的节点
for (const node of Stage.warningNodes) {
for (const node of Stage.warningEntity) {
CollisionBoxRenderer.render(node.collisionBox, new Color(255, 0, 0, 0.5));
}
// 待删除的边
Expand Down Expand Up @@ -423,7 +423,7 @@ export namespace Renderer {
`框选框: ${Stage.selectingRectangle}`,
`正在移动节点: ${Controller.isMovingEntity}`,
`正在切割: ${Stage.isCutting}`,
`Stage.warningNodes: ${Stage.warningNodes.length}`,
`Stage.warningNodes: ${Stage.warningEntity.length}`,
`Stage.warningEdges: ${Stage.warningEdges.length}`,
`ConnectFromNodes: ${Stage.connectFromEntities}`,
`lastSelectedNode: ${Controller.lastSelectedEntity.size}`,
Expand Down
4 changes: 2 additions & 2 deletions src/core/stage/Stage.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ import { Serialized } from "../../types/node";
import { StageDumper } from "./StageDumper";
import { Line } from "../dataStruct/shape/Line";
import { Section } from "../stageObject/entity/Section";
import { ConnectableEntity } from "../stageObject/StageObject";
import { ConnectableEntity, Entity } from "../stageObject/StageObject";

/**
* 舞台对象
Expand Down Expand Up @@ -49,7 +49,7 @@ export namespace Stage {
/**
* 正在准备要删除的节点
*/
export let warningNodes: TextNode[] = [];
export let warningEntity: Entity[] = [];
/**
* 正在准备要删除的连线
*/
Expand Down
12 changes: 11 additions & 1 deletion src/core/stage/stageManager/StageManager.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -140,7 +140,7 @@ export namespace StageManager {
*/
export function updateReferences() {
for (const entity of getEntities()) {
if (entity instanceof TextNode) {
if (entity instanceof ConnectableEntity) {
for (const edge of getEdges()) {
if (edge.source.unknown && edge.source.uuid === entity.uuid) {
edge.source = entity;
Expand Down Expand Up @@ -176,6 +176,16 @@ export namespace StageManager {
}
return null;
}
export function getConnectableEntityByUUID(
uuid: string,
): ConnectableEntity | null {
for (const node of getConnectableEntity()) {
if (node.uuid === uuid) {
return node;
}
}
return null;
}
export function isSectionByUUID(uuid: string): boolean {
return entities.getById(uuid) instanceof Section;
}
Expand Down
10 changes: 5 additions & 5 deletions src/core/stage/stageManager/concreteMethods/stageNodeRotate.tsx
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
import { Vector } from "../../../dataStruct/Vector";
import { StageManager } from "../StageManager";
import { TextNode } from "../../../stageObject/entity/TextNode";
import { Stage } from "../../Stage";
import { LineEffect } from "../../../effect/concrete/LineEffect";
import { ProgressNumber } from "../../../dataStruct/ProgressNumber";
import { Color } from "../../../dataStruct/Color";
import { StageNodeTextMoveManager } from "./StageNodeMoveManager";
import { ConnectableEntity } from "../../../stageObject/StageObject";

/**
* 所有和旋转相关的操作
Expand Down Expand Up @@ -33,8 +33,8 @@ export namespace StageNodeRotate {
degrees = 0;
}
rotateNodeDfs(
StageManager.getTextNodeByUUID(edge.source.uuid)!,
StageManager.getTextNodeByUUID(edge.target.uuid)!,
StageManager.getConnectableEntityByUUID(edge.source.uuid)!,
StageManager.getConnectableEntityByUUID(edge.target.uuid)!,
degrees,
[edge.source.uuid],
);
Expand All @@ -50,8 +50,8 @@ export namespace StageNodeRotate {
* @param visitedUUIDs 已经访问过的节点的uuid列表,用于避免死循环
*/
export function rotateNodeDfs(
rotateCenterNode: TextNode, // 待改成ConnectedAbleEntity
currentNode: TextNode,
rotateCenterNode: ConnectableEntity,
currentNode: ConnectableEntity,
degrees: number,
visitedUUIDs: string[],
): void {
Expand Down

0 comments on commit 5816640

Please sign in to comment.