Сегодня я бы хотел поделиться совсем простым небольшим кодом, который позволяет рисовать процедурную верёвку.
А если задать ей динамическую ширину, то это будет так же похоже на змейку.
Вот как это выглядит (поводите мышкой по области):
А по этой ссылке можно открыть на мобильных во весь экран.
Вот код основного состояния:
module PhaserGame.Client {
// settings
const TAIL_LEN = 1;
const TAILS_CNT = 400;
const MAX_WIDTH = 10;
const MIN_WIDTH = 2;
const DELTA_W = MAX_WIDTH - MIN_WIDTH;
const CLR = 0x67E6F2;
export class MainMenu extends Phaser.State {
private nodes = [];
private canvas: Phaser.Graphics;
create() {
for (var i = 0; i < TAILS_CNT; i++) {
this.nodes[i] = { x: 0, y: 0 };
};
this.canvas = this.game.add.graphics(0, 0);
}
update() {
var dt = this.game.time.elapsed * 0.001;
var headX = this.game.input.x;
var headY = this.game.input.y;
this.nodes[0] = { x: headX, y: headY };
this.canvas.clear();
// draw head
this.canvas.beginFill(CLR, 1);
this.canvas.drawCircle(headX, headY, MAX_WIDTH);
// draw tail
this.canvas.moveTo(headX, headY);
for (var i = 1; i < TAILS_CNT; i++) {
var nodeAngle = Math.atan2(this.nodes[i].y - this.nodes[i - 1].y, this.nodes[i].x - this.nodes[i - 1].x);
this.nodes[i] = {
x: this.nodes[i - 1].x + TAIL_LEN * Math.cos(nodeAngle),
y: this.nodes[i - 1].y + TAIL_LEN * Math.sin(nodeAngle)
}
this.canvas.lineStyle(MAX_WIDTH - DELTA_W * i / TAILS_CNT, CLR, 1);
this.canvas.lineTo(this.nodes[i].x, this.nodes[i].y);
}
this.canvas.endFill();
}
}
}
Проект сделан в VSCode.
Исходники как всегда можно скачать с репозитория на гитхабе.
Любые вопросы задавайте в комментариях.
Успешных проектов!