zoukankan      html  css  js  c++  java
  • js 对原型的理解,面向对象的精灵图案例

        new的原理解释:
        new一个构造函数,如var eg = new Sprite(), new了之后的步骤是这样的
        0.立即执行Sprite构造函数
        1.在内存中开辟一块空间
        2.创建一个新的空对象 如 var t = {}
        3.把this指向这个空对象 this = t
        4.把空对象的内部原型指向构造函数的原型对象 this._proto_ = eg.prototype
        5.如果构造函数有返回值,立即把返回值给eg
        6.如果没有返回值,就把构造函数里面的this作为返回值返回给eg,也就是如果没有返回值时,构造函数里面默认有这样一句代码 return this

    一般我们把属性写在构造函数中,把方法写在构造函数的原型对象中

     function Sprite(){//在构造函数中添加属性
         this.name = "222"
            // return this 默认有这行代码
     }
     Sprite.prototype.show = function (){//在构造函数原型对象中添加方法,主要是为了节省内存空间
         console.log("jjjjg",this.name)
     }
     var s = new Sprite()//这样代码的内部执行过程就是对new的原理解释的6步
     s.show()//s.show方法执行的时候,会首先去构造函数中找show()方法,如果有该方法就被调用,如果没有则去原型对象中找show()方法

     案例代码

    页面代码

    <!doctype html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <meta name="viewport"
              content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
        <meta http-equiv="X-UA-Compatible" content="ie=edge">
        <title>面向对象的精灵图</title>
        <script src="./js/Sprite.js"></script>
    </head>
    <body>
    <div id="container">
        <canvas id="cavsElem">
            你的浏览器太垃圾了,请升级你的浏览器
        </canvas>
    </div>
    <button id="left">左</button>
    <button id="right">右</button>
    <button id="up">后</button>
    <button id="down">前</button>
    <script>
        (function (){
            var canvas = document.getElementById("cavsElem")
            var ctx = canvas.getContext('2d')
            canvas.width = 600
            canvas.height = 600
            canvas.style.border = "1px solid red"
    
            var s = new Sprite({
                x:200,
                y:200,
                w:80,
                h:130,
                fps:10,
                originW:40,
                originH:65,
                imgSrc:"imgs/DMMban.png"
            })
            s.render(ctx)
    
            // 绑定按钮的点击事件
            var left = document.getElementById("left")
            var right = document.getElementById("right")
            var up = document.getElementById("up")
            var down = document.getElementById("down")
            left.onclick = function (){
                s.changeDir("1")
            }
            right.onclick = function (){
                s.changeDir("2")
            }
            up.onclick = function (){
                s.changeDir("3")
            }
            down.onclick = function (){
                s.changeDir("0")
            }
        }())
    </script>
    </body>
    </html>

      js

    function Sprite(option){
        this._init(option)
    }
    Sprite.prototype = {
        _init:function (option){
            this.x = option.x == 0 ? 0 : (option.x || 10)
            this.y = option.y == 0 ? 0 : (option.y || 10)
            this.w = option.w || 40//绘制到画布上的宽高
            this.h = option.h || 65
            this.fps = option.fps || 10
            this.originW = option.originW || 40//截取的精灵图片的宽高
            this.originH = option.originH || 65
            this._dirIndex = 0
            this._imgSrc = option.imgSrc || ''
        },
        render:function (ctx){//把图片画到画布上去
            var img = new Image()
            img.src = this._imgSrc
            var self = this
            img.onload = function (){
                var frameIndex = 0
                setInterval(function (){
                    ctx.clearRect(0,0,ctx.canvas.width,ctx.canvas.height)
                    ctx.drawImage(
                        img,
                        frameIndex * self.originW,
                        self._dirIndex * self.originH,
                        self.originW,
                        self.originH,
                        self.x,
                        self.y,
                        self.w,
                        self.h
                    )
                    frameIndex ++
                    frameIndex %= 4
                },1000/self.fps)
            }
        },
        changeDir:function (dir){
            this._dirIndex = dir
        }
    }
    

      图片

    效果

     

  • 相关阅读:
    坦克大战
    java多线程应用场景
    java中的多线程(资料)
    设置线程名
    线程名称的设置及取得
    java调试
    文件上传细节处理
    Servlet生命周期
    java的动态绑定与静态绑定
    Mysql 连接池调用完成后close代理方法引出的设计模式
  • 原文地址:https://www.cnblogs.com/zhangying0518/p/14357723.html
Copyright © 2011-2022 走看看