javascript - p5.js 鼠标压线动画
问题描述
在 p5.js 中,我试图创建一个动画,当按下鼠标时,线条的底点平滑地(每帧 5px)移动到画布的左下角。我可以使用lines.align 让它们达到需要达到的程度,但它们会立即移动到那里而不是动画。
let lines = []
function setup() {
createCanvas(600, 400);
for(let i = 0; i < 150; i++) {
lines[i] = new Line(random(600), 0, random(600), 400, random(149,212), random(89, 146), 1);
}
}
function draw() {
background(32, 44, 57);
for(let i = 0; i < lines.length; i++){
lines[i].show();
}
}
function mousePressed() {
for(let i = 0; i < lines.length; i++){
lines[i].align();
}
}
class Line {
constructor(xStart, yStart, xFinish, yFinish, g, b, w) {
this.xStart = xStart;
this.yStart = yStart;
this.xFinish = xFinish;
this.yFinish = yFinish;
this.g = g;
this.b = b;
this.w = w;
}
show() {
stroke(242, this.g, this.b);
strokeWeight(this.w);
line(this.xStart, this.yStart, this.xFinish, this.yFinish);
}
align() {
while (this.xFinish > 0) {
this.xFinish = this.xFinish - 5;
}
}
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/p5.js/0.6.1/p5.js"></script>
解决方案
您正在使用阻塞while
循环,这就是为什么在视觉上您会看到从线条的开始位置到结束位置的跳跃。
一种选择是使用条件并增加 中的值draw()
:
let lines = []
function setup() {
createCanvas(600, 400);
for(let i = 0; i < 150; i++) {
lines[i] = new Line(random(600), 0, random(600), 400, random(149,212), random(89, 146), 1);
}
}
function draw() {
background(32, 44, 57);
for(let i = 0; i < lines.length; i++){
lines[i].align();
lines[i].show();
}
}
class Line {
constructor(xStart, yStart, xFinish, yFinish, g, b, w) {
this.xStart = xStart;
this.yStart = yStart;
this.xFinish = xFinish;
this.yFinish = yFinish;
this.g = g;
this.b = b;
this.w = w;
}
show() {
stroke(242, this.g, this.b);
strokeWeight(this.w);
line(this.xStart, this.yStart, this.xFinish, this.yFinish);
}
align() {
if (this.xFinish > 0) {
this.xFinish = this.xFinish - 5;
}
}
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/p5.js/0.6.1/p5.min.js"></script>
您可能还想查看lerp()以在开始和结束位置之间进行插值。
此外,如果您需要更多地控制时间/缓动/等,您可以使用TweenLite之类的东西为您进行插值。(这是一个很好的练习,尽管首先手动掌握递增值/插值/补间)
推荐阅读
- java - 如何修复 NumberFormatException(来自文本文件输入)?[已解决]
- ios - 使用 SSH 在 iOS 上发送带有图像的 MMS/iMessage
- sails.js - SailsJs self 未在 production.min.js 中定义
- javascript - Chrome 扩展 - 将 chrome.cookies.get 变成一个变量
- context-free-grammar - CFG 语言
- java - 无法在 Java 中将图形添加到 JPanel
- java - Java 并发实践”清单 7.15. 为 LogWriter 添加可靠的取消。”。loggerThread.interrupt() 的意义何在?
- python - 在列表中添加项目不起作用
- ios - 在 SwiftUI 中,为什么由于 ObserverObject 更改而更新 View 会使 Navigation 自动弹出?
- python - 网站通过单击按钮发送哈希字符串