processing实现canvas三维水族馆水底彩色鱼儿游动动画效果代码

代码语言:html

所属分类:动画

代码描述:processing实现canvas三维水族馆水底彩色鱼儿游动动画效果代码

代码标签: processing canvas 三维 水族馆 水底 彩色 鱼儿 游动 动画

下面为部分代码预览,完整代码请点击下载或在bfwstudio webide中打开

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
 <style>
     * {
  margin: 0;
  box-sizing: border-box;
  overflow: hidden;
}

body {
  background: #1B5F87;
  width: 100%;
  height: 100vh;
  display: flex;
  justify-content: center;
  align-items: center;
}
body canvas {
  box-shadow: 0.2em 0.2em 2em #0008;
  border: none;
  outline: none;
}
 </style>

</head>

<body>

    <canvas id="canvas"></canvas>
<script type="text/javascript" src="//repo.bfw.wiki/bfwrepo/js/processing.min.js"></script>
  
    <script>
        var sketchProc = function(processingInstance) {
     with (processingInstance) {
        size(600, 600);

        {
            var scene;

            var Scene = function() {
                this.speed = -0.3;        
                this.fishes = [];
                this.bubbles = [];
                this.algae = [];
                this.auto = true;
                this.sceneBack = this.getSceneBack();
                this.sceneFront = this.getSceneFront();
                this.rays = this.getRays();
                this.plant = null;
                this.maxFish = 4;
            };
        } //Scene

        {
            var Fish = function(config) {
                this.position = config.position || new PVector(random(width), random(height));
                this.velocity = new PVector(0, 0);
                this.acceleration = new PVector(0, 0);

                this.scale = config.scale || 1;
                this.direction = -1; //-1 is smaller, 1 is larger
                this.change = false;
                this.xOffset = 0;

                this.follow = config.follow || false;

                //widths of each segment
                this.segmentSizes = [
                    0, //head
                    2,
                    3,
                    4,
                    5,
                    5.5,
                    6,
                    6.5,
                    7,
                    7.3,
                    7,
                    6.5,
                    6,
                    5.5,
                    5,
                    4.5,
                    4,
                    3.5,
                    3,
                    2.5,
                    2,
                    1.5,
                    1,
                    0, //tail
                    0,
                    0,
                    0,
                    0
                ];

                this.segments = [];
                for(var i = 0; i < this.segmentSizes.length; i++) {
                    this.segments.push(new PVector(0, 0));
                }

                //length of each segment for the fish
                this.segmentLength = floor(random(5,7));

                //segment colors
                this.colors = [];
                this.colors.push(config.color1 || color(random(255), random(255), random(255), random() < 0.5 ? random(100, 200) : 255));
                this.colors.push(config.color2 || color(random(255), random(255), random(255), random() < 0.5 ? random(100, 200) : 255));
                this.colors.push(config.color3 || color(random(255), random(255), random(255), random() < 0.5 ? random(100, 200) : 255));

                //location of the fish food
                this.food = new PVector(0, 0);
            };

            Fish.prototype.update = function() {
                if(scene.auto === false && this.follow) {
                    this.food = new PVector(mouseX, mouseY);
                }
                var dir = PVector.sub(this.food, this.position);
                dir.normalize();
                dir.mult(0.1);
                this.acceleration = dir;
                this.velocity.add(this.acceleration);
                this.velocity.limit(4);
                this.position.add(this.velocity);
            };

            Fish.prototype.calculate = function(i, segment) {
                var dx = segment.x - this.segments[i].x;
                var dy = segment.y - this.segments[i].y;
                var angle = atan2(dy, dx);
                if(i <= 21) {
                    this.segments[i].x = segment.x - cos(angle) * this.segmentLength * this.scale;
                    this.segments[i].y = segment.y - sin(angle) * this.segmentLength * this.scale;
                }
                else {
                    this.segments[i].x = segment.x - cos(angle) * this.segmentLength * 0.7 * this.scale;
                    this.segments[i].y = segment.y - sin(angle) * this.segmentLength * 0.7 * this.scale;
                }
            };

            Fish.prototype.display = function(i) {
                pushMatrix();
                pushStyle();
                    rectMode(CENTER);
                    translate(this.segments[i].x, this.segments[i].y);
                    scale(this.scale);

                    var segColor = this.colors[i % this.colors.length];

                    //flesh
                    noStroke();
                    fill(segColor);
                    ellipse(this.segmentSizes[i], -this.segmentSizes[i], this.segmentSizes[i] * 4.5, this.segmentSizes[i] * 8);

                    //eyes
                    if(i === 3) {
                        stroke(36, 36, 36);
                        strokeWeight(3);
                        //right
                        ellipse(this.segmentSizes[i]*3.2, -this.segmentSizes[i] * 2, 2, 2);
                        //left
                        ellipse(-this.segmentSizes[i]*1.1, -this.segmentSizes[i] * 2, 2, 2);
                    }

                    noStroke();

                    //top fin
                    if(i >= 6 && i <= 15) {
                        rect(-this.segmentSizes[i] * -0.8, -this.segmentSizes[i] * 6, 1, pow((this.segmentSizes[i] * 0.5), 2.6));
                    }

                    //bottom fin
                    if(i >= 7 && i <= 10) {
                        //bottom fin
                        rect(-this.segmentSizes[i] * -0.8, -this.segmentSizes[i] * -4, 1, pow((this.segmentSizes[i] * 0.5), 2.2));
                    }

                    //side fins
                    if(i >= 5 && i <= 7) {
                        //side fins
                        rect(-this.segmentSizes[i] * 2, -this.segmentSizes[i] * 0.5, this.segmentSizes[i] * 4, 1);
                        rect(-this.segmentSizes[i] * -4, -this.segmentSizes[i] * 0.5, this.segmentSizes[i] * 4, 1);
                    }

                    //tail
                    if(i > 21) {
                        fill(this.colors[0]);
                        rect(0, 0, 3, 10 * (i - 21));
                    }
                popStyle();
                popMatrix();
            };

            Fish.run = function() {
                for(var i = 0; i < scene.fishes.length; i++) {
                    var fish = scene.fishes[i];

                    if(scene.auto === true && fish.change === true) {
                        fish.food = new PVector(fish.xOffset, fish.position.y);
                        if((fish.xOffset === -70 && fish.position.x < fish.xOffset) || (fish.xOffset === width + 70 && fish.position.x > fish.xOffset)) {
                            fish.direction *= -1;
                            fish.scale = constrain(fish.scale - 0.001 * fish.direction, 0.5, 1);
                            fish.change = false;   
                        }
                    }
                    else if(random() < 0.05) {
                        fish.food = new PVector(random(width), random(height));
                    }

                    fish.update();

                    if(scene.auto === false && fish.follow) {
                        fish.direction = -1;   
                    }

                    if(fish.change === false && (fish.scale === 0.5 || fish.scale === 1)) {
                        if(random() < 0.5) {
                            fish.xOffset = -70;
                        }
                        else {
                            fish.xOffset = width + 70;
                        }
                        fish.change = true;
                    }

                    fish.scale = constrain(fish.scale - 0.001 * fish.direction, 0.5, 1);

                    fish.calculate(0, fish.position);
                    for(var j = 0; j < fish.segments.length - 1; j++) {
                        fish.calculate(j + 1, fish.segments[j]);
                    }

                    if(fish.direction === -1) {
                        for(var k = fish.segments.length - 1; k >= 0; k--) {
                            fish.display(k);
                        }
                    }
                    else {
                        for(var k = 0; k < fish.segments.length; k++) {
                            fish.display(k);
                        }
                    }
                }

                //sort the fish so larger ones are in front
                var len = scene.fishes.length;
                for (var i = len - 1; i >= 0; i--){
                    for(var j = 1; j <= i; j++){
                        if(scene.fishes[j-1].scale > scene.fishes[j].scale){
                            var temp = scene.fishes[j-1];
                            scene.fishes[j-1] = scene.fishes[j];
                            scene.fishes[j] = temp;
                        }
                    }
                }
            };
        } //Fish

        {
            var Bubble = function(position, size) {
                this.position = position || new PVector(random(30, 70), height);
                this.velocity = new PVector(0, 0);
                this.acceleration = new PVector(0, 0);
                this.size = size || random(5, 20);
                this.color = random(100, 200);
            };

            Bubble.prototype.update = function() {
                var target = new PVector(this.position.x, -this.size);
                var dir = PVector.sub(target, this.position);
                dir.normalize();
                dir.mult(0.1);
                this.acceleration = dir;
                this.velocity.add(th.........完整代码请登录后点击上方下载按钮下载查看

网友评论0