zoukankan      html  css  js  c++  java
  • canvas+js绘制序列帧动画+面向对象

    效果:

    素材:

    源码:(一般的绘制方式)

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>绘制序列帧动画</title>
    </head>
    <body>
    <canvas id="demo"></canvas>
    <button type="button" id="up"></button>
    <button type="button" id="right"></button>
    <button type="button" id="down"></button>
    <button type="button" id="left"></button>
    <script type="text/javascript">
        (function () {
            var canvas = document.getElementById("demo");
            var up = document.getElementById("up");
            var right = document.getElementById("right");
            var down = document.getElementById("down");
            var left = document.getElementById("left");
            //设置宽高不从css中设置
            canvas.width = 200;//设置canvas宽
            canvas.height = 200;//设置canvas高
            canvas.style.border = "1px solid red";
            //获取上下文
            var ctx = canvas.getContext("2d");
            //加载图片
            var img = new Image();
            img.src = "img/dh.png";
            var frameIndex = 0,dirIndex = 0;
            up.onclick = function (ev) {
                dirIndex = 3;
            }
            right.onclick = function (ev) {
                dirIndex = 2;
            }
            down.onclick = function (ev) {
                dirIndex = 0;
            }
            left.onclick = function (ev) {
                dirIndex = 1;
            }
            img.onload = function () {
                setInterval(function () {
                    //清除 之前的 图片墨迹。
                    ctx.clearRect(0,0,canvas.width,canvas.height);
                    ctx.drawImage(
                        img
                        , frameIndex*40    //截取原始图片的 x坐标
                        , dirIndex*65    //截取原始图片的 y坐标
                        , 40    //截取原始图片的 宽度
                        , 65    // 截取的高度
                        , 20    //图片在canvas画布上的x坐标
                        , 20    //图片在canvas画布上的y坐标
                        , 80    //绘制图片的宽度
                        , 65 *2    //绘制图片的高度
                    );
                    frameIndex++;// 添加到下一帧
                    frameIndex %=4;// 取余数   7 %4 = 3   3%4 =3  4%4 =0
                    console.log(frameIndex);
                },100)
            }
        }());
    </script>
    </body>
    </html>

     源码:(面向对象的绘制方式)

     Sprite.js

    function Sprite(option) {
        this._init(option);
    }
    Sprite.prototype = {
        //初始化 imgsrc,frameIndex,dirIndex,originW,originH,x,y,w,fps
        _init:function (option) {
            this.img_src = option.img_src || "img/dh.png";//精灵图src
            this.framIndex = 0;//截取精灵图其实位置的X轴坐标
            this.dirIndex = 0;//截取精灵图其实位置的Y轴坐标
            this.originW = option.originW || 40;//截取精灵图的宽度
            this.originH = option.originH || 65;//截取精灵图的高度
            this.x = option.x || 20;//动画放置的原点X轴
            this.y = option.y || 20;//动画放置的原点Y轴
            this.w = option.w || 40*2;//动画的宽度
            this.h = option.h || 65*2;//动画的高度
            this.fps =  option.fps || 10; // 动画绘制的帧数
        },
        //渲染动画
        render:function (ctx) {
            var img = new Image();
            img.src = this.img_src;
            var self = this;
            var frameIndex = this.framIndex;
            img.onload = function (ev) {
                setInterval(function () {
                    ctx.clearRect(0,0,ctx.canvas.width,ctx.canvas.height);
                    ctx.drawImage(
                        img      //绘制的原始图片
                        , frameIndex*self.originW    //截取原始图片的 x坐标
                        , self.dirIndex*self.originH    //截取原始图片的 y坐标
                        , self.originW    //截取原始图片的 宽度
                        , self.originH    // 截取的高度
                        , self.x    //图片在canvas画布上的x坐标
                        , self.y    //图片在canvas画布上的y坐标
                        , self.w    //绘制图片的宽度
                        , self.h    //绘制图片的高度
                    )
                    frameIndex++;
                    frameIndex %= 4;
                },1000/self.fps)
            }
        },
        //改变方向:
        changeDir:function (dir) {
            if( dir == 'left' ) {
                this.dirIndex = 1;
            }
            if( dir == 'right' ) {
                this.dirIndex = 2;
            }
            if( dir == 'up' ) {
                this.dirIndex = 3;
            }
            if( dir == 'down' ) {
                this.dirIndex = 0;
            }
        }
    }

    index.html

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>js面向对象绘制序列帧动画</title>
        <script type="text/javascript" src="js/Sprite.js"></script>
    </head>
    <body>
    <canvas id="canvas"></canvas>
    <button type="button" id="up"></button>
    <button type="button" id="right"></button>
    <button type="button" id="down"></button>
    <button type="button" id="left"></button>
    <script>
        var canvas = document.getElementById("canvas");
        var up = document.getElementById("up");
        var right = document.getElementById("right");
        var down = document.getElementById("down");
        var left = document.getElementById("left");
        //设置宽高不从css中设置
        canvas.width = 200;//设置canvas宽
        canvas.height = 200;//设置canvas高
        canvas.style.border = "1px solid red";
        //获取上下文
        var ctx = canvas.getContext("2d");
        var s = new Sprite({
            img_src:"img/dh.png"      //绘制的原始图片
            , originW:40    //截取原始图片的 宽度
            , originH:65    // 截取的高度
            , x:20    //图片在canvas画布上的x坐标
            , y:20    //图片在canvas画布上的y坐标
            , w:40*2    //绘制图片的宽度
            , h:65*2    //绘制图片的高度
            , fps:10
        });
        s.render(ctx);//渲染动画
        up.onclick = function (ev) {
            s.changeDir("up");
        }
        right.onclick = function (ev) {
            s.changeDir("right");
        }
        down.onclick = function (ev) {
            s.changeDir("down");
        }
        left.onclick = function (ev) {
            s.changeDir("left");
        }
    </script>
    </body>
    </html>

  • 相关阅读:
    請問各位大大,我要將listview顯示的縮圖加入到listview2,請問該如何做呢
    一个可设置窗口透明属性的控件,可让窗口透明、半透明
    laravel he stream or file "..laravel-2019-02-14.log" could not be opened: failed to open stream: Permission denied
    每日学习-20190721
    linux centos无法删除网站根目录下的.user.ini解决办法
    laravel在使用Composer安装插件时要求输入授权用户名密码解决办法
    Centos7 日志查看工具
    Centos7 Putty SSH密钥登录
    阿里云Centos7用putty ssh链接掉线
    阿里云 centos 无法执行moodle cron
  • 原文地址:https://www.cnblogs.com/alex-xxc/p/10038877.html
Copyright © 2011-2022 走看看