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