Skip to content

Commit 8da9f16

Browse files
committed
💄 优化alt+左键跳入时鼠标提示线的样子
1 parent bd4ff25 commit 8da9f16

File tree

2 files changed

+69
-4
lines changed

2 files changed

+69
-4
lines changed

app/src/core/render/canvas2d/basicRenderer/curveRenderer.tsx

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -158,4 +158,32 @@ export namespace CurveRenderer {
158158
Canvas.ctx.strokeStyle = gradient;
159159
Canvas.ctx.stroke();
160160
}
161+
/**
162+
* 绘制一条颜色渐变的贝塞尔曲线
163+
* @param curve
164+
*/
165+
export function renderGradientBezierCurve(
166+
curve: CubicBezierCurve,
167+
startColor: Color,
168+
endColor: Color,
169+
width: number,
170+
): void {
171+
const gradient = Canvas.ctx.createLinearGradient(curve.start.x, curve.start.y, curve.end.x, curve.end.y);
172+
// 添加颜色
173+
gradient.addColorStop(0, startColor.toString()); // 起始颜色
174+
gradient.addColorStop(1, endColor.toString()); // 结束颜色
175+
Canvas.ctx.beginPath();
176+
Canvas.ctx.moveTo(curve.start.x, curve.start.y);
177+
Canvas.ctx.bezierCurveTo(
178+
curve.ctrlPt1.x,
179+
curve.ctrlPt1.y,
180+
curve.ctrlPt2.x,
181+
curve.ctrlPt2.y,
182+
curve.end.x,
183+
curve.end.y,
184+
);
185+
Canvas.ctx.lineWidth = width;
186+
Canvas.ctx.strokeStyle = gradient;
187+
Canvas.ctx.stroke();
188+
}
161189
}

app/src/core/render/canvas2d/renderer.tsx

Lines changed: 41 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import { getTextSize } from "../../../utils/font";
22
import { appScale } from "../../../utils/platform";
33
import { Color, mixColors } from "../../dataStruct/Color";
44
import { Vector } from "../../dataStruct/Vector";
5+
import { CubicBezierCurve } from "../../dataStruct/shape/Curve";
56
import { Rectangle } from "../../dataStruct/shape/Rectangle";
67
import { Settings } from "../../service/Settings";
78
import { MouseLocation } from "../../service/controlService/MouseLocation";
@@ -348,19 +349,55 @@ export namespace Renderer {
348349
for (const selectedEntity of selectedEntities) {
349350
const startLocation = selectedEntity.collisionBox.getRectangle().center;
350351
const endLocation = Controller.mouseLocation;
352+
const distance = startLocation.distance(endLocation);
353+
const height = distance / 2;
354+
// 影子
351355
CurveRenderer.renderGradientLine(
352356
transformWorld2View(startLocation),
353357
transformWorld2View(endLocation),
354358
Color.Transparent,
355-
Color.Green,
356-
4 * Camera.currentScale,
359+
new Color(0, 0, 0, 0.2),
360+
8 * Camera.currentScale,
361+
);
362+
CurveRenderer.renderGradientBezierCurve(
363+
new CubicBezierCurve(
364+
transformWorld2View(startLocation),
365+
transformWorld2View(startLocation.add(new Vector(0, -height))),
366+
transformWorld2View(endLocation.add(new Vector(0, -height))),
367+
transformWorld2View(endLocation),
368+
),
369+
StageStyleManager.currentStyle.CollideBoxPreSelectedColor.toTransparent(),
370+
StageStyleManager.currentStyle.CollideBoxPreSelectedColor.toSolid(),
371+
8 * Camera.currentScale,
372+
);
373+
// 画箭头
374+
const arrowLen = 10 + distance * 0.01;
375+
CurveRenderer.renderBezierCurve(
376+
new CubicBezierCurve(
377+
transformWorld2View(endLocation),
378+
transformWorld2View(endLocation),
379+
transformWorld2View(endLocation),
380+
transformWorld2View(endLocation.add(new Vector(-arrowLen, -arrowLen * 2))),
381+
),
382+
StageStyleManager.currentStyle.CollideBoxPreSelectedColor.toSolid(),
383+
8 * Camera.currentScale,
384+
);
385+
CurveRenderer.renderBezierCurve(
386+
new CubicBezierCurve(
387+
transformWorld2View(endLocation),
388+
transformWorld2View(endLocation),
389+
transformWorld2View(endLocation),
390+
transformWorld2View(endLocation.add(new Vector(arrowLen, -arrowLen * 2))),
391+
),
392+
StageStyleManager.currentStyle.CollideBoxPreSelectedColor.toSolid(),
393+
8 * Camera.currentScale,
357394
);
358395
}
359396
TextRenderer.renderTextFromCenter(
360397
"Jump To",
361-
transformWorld2View(Controller.mouseLocation).subtract(new Vector(0, 30)),
398+
transformWorld2View(Controller.mouseLocation).subtract(new Vector(0, -30)),
362399
16,
363-
Color.Green,
400+
StageStyleManager.currentStyle.CollideBoxPreSelectedColor.toSolid(),
364401
);
365402
}
366403

0 commit comments

Comments
 (0)