将值增加到一个点,然后开始减小到一个点
increase value to a point, then start decreasing to a point
我正在javascript画布中制作一个简单的动画,为了完成请求的结果,我需要有一个这样的对象:
circle: {
x: scene_point.x,
y: scene_point.y,
vel_x: randomFloat(0.100, 0.500),
vel_y: randomFloat(0.100, 0.500),
r: 0,
r_max: 10,
trend: 'up'
}
现在循环动画应该是这样的:
- 增加
- 半径值直到达到最大值,增加不透明度直到圆变得完全可见
- 当 Circle 具有最大半径和完全不透明度时,我们开始减小这两个值
- 当圆半径和不透明度再次降至 0 时,我们重置圆并重新开始。
这是我在上面编写的代码:
if(circle.trend === 'up' && circle.r < circle.maxR) { // growing, to reach max
circle.r = parseFloat(circle.r) + parseFloat(circle.decayR);
}
if(circle.trend === 'up' && circle.r >= circle.maxR) { // reached max, starting to decay
circle.trend = 'down';
}
if(circle.trend === 'down' && circle.r >= 1) { // decaying, to reach min
circle.r = parseFloat(circle.r) - parseFloat(circle.decayR);
}
if(circle.trend === 'down' && circle.r < 1) { // reached min, reseting
reset(i);
}
最后绘制对象以获得适当的不透明度:
ctx.fillStyle = 'rgba(210, 210, 210, ' + circle.r / circle.maxR + ')';
问题是,是否有可能在没有"趋势"逻辑的情况下完成上述任务,它只是看起来/感觉不对。我必须使用 4 if 条件和额外的"趋势"参数来上升和下降。也许有更友好的方法可以做到这一点。我只是对画布和动画的新手,我还不知道所有的技巧;)
你可以
这样做:
circle.r += circle.decayR;
if(circle.decayR > 0 && circle.r >= circle.maxR)
circle.decayR *= -1;
if(circle.decayR < 0 && circle.r < 1)
reset(i);
基本上,只需翻转decayR
的标志即可。
工作示例:
var circle, canvas, ctx;
canvas = document.getElementById('canvas');
ctx = canvas.getContext('2d');
function reset() {
circle = {
decayR: 1,
r: 0,
maxR: 20,
x: 50 + Math.random() * 50,
y: 50 + Math.random() * 50
};
}
function update() {
circle.r += circle.decayR;
if (circle.decayR > 0 && circle.r >= circle.maxR)
circle.decayR *= -1;
if (circle.decayR < 0 && circle.r < 1)
reset();
// clear
ctx.clearRect(0, 0, canvas.width, canvas.height);
// draw
ctx.beginPath();
ctx.arc(circle.x, circle.y, circle.r, 0, Math.PI * 2);
ctx.closePath();
ctx.fill();
requestAnimationFrame(update);
}
reset();
requestAnimationFrame(update);
#canvas {
width: 200px;
height: 200px;
border: solid 1px black;
}
<canvas id="canvas" width="200" height="200"></canvas>
我认为它可以像这样缩短:
if(circle.trend === 'up'){
(circle.r >= circle.maxR) ?
circle.trend = 'down' :
circle.r += circle.decayR;
}else{
(circle.r >= 1) ?
circle.r -= circle.decayR :
reset(i);
}
相关文章:
- 希望日期开始结束于while循环中的一个房间id的一个数组
- 从工作日结束到下一个工作日开始的完整日历JS包装时间
- 如何在上一个动画结束后开始动画
- 反应点击开始动画 + 第一个动画完成后开始另一个动画
- 是否从超时内开始间隔是一个问题
- 正在加载动态日历以在一个月的正确日期开始
- 如何制作两个倒计时计时器,如果一个开始,另一个会停止
- 如何在Moment.js中从日期开始获取一个月中的星期
- Vanilla Js:在一个事件中开始一段时间的循环,然后用第二个事件打破它?('mouseover'启
- react.js每n个项目添加一个开始标签或结束标签
- 给定一个开始日期,如何在javascript中计算到当前日期的年数
- 用javascript计算上一个结束日期和下一个开始日期之间的间隔
- 事件侦听器,一个css转换结束,另一个开始
- 如何向下滑动<灯光>'从最后一个开始,等等
- 在JavaScript中,iPhone浏览器是否有一个开始滚动事件
- W3C错误:文档类型不允许元素X在这里;缺少一个Y开始标签
- Ext JS -一个开始
- 我如何通过一个开始HTML5视频在一个特定的时间代码使用URL
- 给定一个开始日期和结束日期,创建一个包含这两个日期之间日期的数组
- 如果我在JavaScript或jquery中有一个开始日期,我如何显示一周中所有日子的日期?