canvas草木树木生长动画效果代码
代码语言:html
所属分类:动画
代码描述:canvas草木树木生长动画效果代码
下面为部分代码预览,完整代码请点击下载或在bfwstudio webide中打开
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <style> body { background: #111111;}#canvas_container_div { position: absolute; top: 30%; left: 50%; transform: translate(-50%,-50%);}#canvas { width: 100%; height: 100%;/* border: solid 3px #000000; */ background: #111111;} </style> </head> <body> <div id="canvas_container_div"><canvas id="canvas" width="1000" height="1000"></canvas> </div> <script> /////////////////////////////////////////////////////// //////// Plant Life Game Growth Prototype //// /////////////////////////////////////////////////////// ///////////////////// VERLET.JS //////////////////////////// ////---INITIATION---//// ///canvas (*canvas width & height must be equal to retain aspect ratio) var canvasContainerDiv = document.getElementById("canvas_container_div"); var canvas = document.getElementById("canvas"); var ctx = canvas.getContext("2d"); var canvRatio = 1;//0.8; // canvas ratio, as canvas size to lowest of window width or height ///trackers var points = [], pointCount = 0; var spans = [], spanCount = 0; var skins = [], skinCount = 0; var worldTime = 0; // time as frame count ///settings var gravity = 0.01; // (rate of y-velocity increase per frame per point mass of 1) var rigidity = 10; // global span rigidity (as iterations of position accuracy refinement) var friction = 0.999; // (proportion of previous velocity after frame refresh) var bounceLoss = 0.9; // (proportion of previous velocity after bouncing) var skidLoss = 0.8; // (proportion of previous velocity if touching the ground) var viewPoints = false; // (point visibility) var viewSpans = false; // (span visibility) var viewScaffolding = false; // (scaffolding visibility) var viewSkins = true; // (skin visibility) var breeze = 0.4; // breeziness level (applied as brief left & right gusts) ////---OBJECTS---//// ///point constructor function Point(current_x, current_y, materiality="material") { // materiality can be "material" or "immaterial" this.cx = current_x; this.cy = current_y; this.px = this.cx; // previous x value this.py = this.cy; // previous y value this.mass = 1; // (as ratio of gravity) this.materiality = materiality; this.fixed = false; this.id = pointCount; pointCount += 1; } ///span constructor function Span(point_1, point_2, visibility="visible") { // visibility can be "visible" or "hidden" this.p1 = point_1; this.p2 = point_2; this.l = distance(this.p1,this.p2); // length this.strength = 1; // (as ratio of rigidity) this.visibility = visibility; this.id = spanCount; spanCount += 1; } ///skins constructor function Skin(points_array,color) { this.points = points_array; // an array of points for skin outline path this.color = color; this.id = skinCount; skinCount += 1; } ////---FUNCTIONS---//// ///scales canvas to window function scaleToWindow() { if (window.innerWidth > window.innerHeight) { canvasContainerDiv.style.height = window.innerHeight*canvRatio+"px"; canvasContainerDiv.style.width = canvasContainerDiv.style.height; } else { canvasContainerDiv.style.width = window.innerWidth*canvRatio+"px"; canvasContainerDiv.style.height = canvasContainerDiv.style.width; } } ///converts percentage to canvas x value function xValFromPct(percent) { return percent * canvas.width / 100; } ///converts percentage to canvas y value function yValFromPct(percent) { return percent * canvas.height / 100; } ///converts canvas x value to percentage of canvas width function pctFromXVal(xValue) { return xValue * 100 / canvas.width; } ///converts canvas y value to percentage of canvas height function pctFromYVal(yValue) { return yValue * 100 / canvas.height; } ///gets a point by id number function getPt(id) { for (var i=0; i<points.length; i++) { if (points[i].id == id) { return points[i]; } } } ///gets distance between two points (pythogorian theorum) function distance(point_1, point_2) { var x_difference = point_2.cx - point_1.cx; var y_difference = point_2.cy - point_1.cy; return Math.sqrt( x_difference*x_difference + y_difference*y_difference); } ///gets a span's mid point (returns object: { x: <value>, y: <value> } ) function smp(span) { var mx = ( span.p1.cx + span.p2.cx ) / 2; // mid x value var my = ( span.p1.cy + span.p2.cy ) / 2; // mid y value return { x: mx, y: my}; } ///removes a span by id function removeSpan(id) { for( var i = 0; i < spans.length-1; i++){ if ( spans[i].id === id) { spans.splice(i, 1); } } } ///creates a point object instance function addPt(xPercent,yPercent,materiality="material") { points.push( new Point( xValFromPct(xPercent), yValFromPct(yPerce.........完整代码请登录后点击上方下载按钮下载查看
网友评论0