zoukankan      html  css  js  c++  java
  • cocos2d-js cc.RenderTexture几种用法(数字图片、刮刮乐效果)

    本文转载于:http://blog.csdn.net/realcrazysun1/article/details/42393629

    RenderTexture用法1:数字图片

    通过这张图片实现任意数字
    var PictureNumber = cc.Sprite.extend({  
        m_Number:null,  
        m_NumberTexture:null,  
        ctor:function(){  
            this._super();  
              
        },  
        buildNumber:function(paramNumber, paramTexture)  
        {  
            this.setNumber(paramNumber);  
            this.setNumberTexture(cc.textureCache.addImage(paramTexture));  
            return this.build();  
        },  
        build:function(){  
      
            var iNumCount = (this.m_Number+"").length;   //取得字符个数  
            var stSize = this.m_NumberTexture.getContentSize(); //取得纹理大小,要求纹理中每个数字都是等宽等高,并依照0123456789排列  
              
            var iNumWidth = parseInt( stSize.width / 10);   //纹理中每个数字的宽度  
            var iNumHeight =  parseInt( stSize.height);    //纹理中每个数字的高度  
      
            var pRT = new cc.RenderTexture(iNumWidth * iNumCount, iNumHeight); //创建渲染纹理对象,并数字确定宽度  
              
              
              
            pRT.begin();  
            for (var i = 0; i < iNumCount; i++)  
            {  
                var pSprite   = new cc.Sprite(); //创建精灵对象,用于绘制数字  
                pSprite.setAnchorPoint(0, 0);  
                pSprite.setTexture(this.m_NumberTexture);  
                var iNumber = (this.m_Number+"")[i];  
                //设置要显示数字的纹理区域,这个区域是指参数中paramTexture中区域  
                var stRect = new cc.rect(iNumber * iNumWidth, 0, iNumWidth, iNumHeight);  
                pSprite.setTextureRect(stRect, false, cc.size(stRect.width, stRect.height));  
                pSprite.setPosition(i * iNumWidth, 0);                //计算显示的偏移位置  
                pSprite.visit(); //渲染到pRT中  
            }  
            pRT.end();  
            //取得生成的纹理  
            this.setTexture(pRT.getSprite().getTexture());  
            //设置显示的内容  
            var stRect = new cc.rect(0, 0, iNumWidth * iNumCount, iNumHeight);  
            this.setTextureRect(stRect, false, cc.size(stRect.width, stRect.height));  
            //默认的情况下,通过CCRenderTexture得到的纹理是倒立的,这里需要做一下翻转  
            this.setFlippedY(true);  
        },  
          
        setNumber:function(paramNumber){  
            this.m_Number = paramNumber;  
        },  
        getNumber:function(){  
            return this.m_Number;  
        },  
        setNumberTexture:function(paramTexture)  
        {  
            this.m_NumberTexture = paramTexture;  
        }  
    });  

    使用方法:

    var pNum = new PictureNumber();  
    pNum.buildNumber(1234567, "res/number.png");  
    pNum.setPosition(200, 200);  
    pNum.setAnchorPoint(0, 0); 

    运行如下:

    RenderTexture用法2:刮刮乐效果

    主要代码如下:
    var HelloWorldLayer = cc.Layer.extend({  
        sprite:null,  
        pEraser:null,  
        pRTex:null,  
          
        ctor:function () {  
            //////////////////////////////  
            // 1. super init first  
            this._super();  
      
            var size = cc.winSize;  
      
            // add a "close" icon to exit the progress. it's an autorelease object  
            var closeItem = new cc.MenuItemImage(  
                res.CloseNormal_png,  
                res.CloseSelected_png,  
                function () {  
                    cc.log("Menu is clicked!");  
                }, this);  
            closeItem.attr({  
                x: size.width - 20,  
                y: 20,  
                anchorX: 0.5,  
                anchorY: 0.5  
            });  
      
            var menu = new cc.Menu(closeItem);  
            menu.x = 0;  
            menu.y = 0;  
            this.addChild(menu, 1);  
      
            /////////////////////////////  
            // 3. add your codes below...  
            // add a label shows "Hello World"  
            // create and initialize a label  
            var helloLabel = new cc.LabelTTF("Hello World", "Arial", 38);  
            // position the label on the center of the screen  
            helloLabel.x = size.width / 2;  
            helloLabel.y = size.height / 2;  
            // add the label as a child to this layer  
            this.addChild(helloLabel, 5);  
      
            // hello world 背景图片  
            this.sprite = new cc.Sprite(res.HelloWorld_png);  
            this.sprite.attr({  
                x: size.width / 2,  
                y: size.height / 2,  
            });  
            this.addChild(this.sprite, 0);  
              
            //橡皮擦  
            this.pEraser = new cc.DrawNode();     
            this.pEraser.drawDot(cc.p(0, 0), 20, cc.color(255, 255, 255, 0));  
            this.pEraser.retain();  
              
            //通过pRTex实现橡皮擦  
            this.pRTex = new cc.RenderTexture(size.width,size.height);  
            this.pRTex.setPosition(size.width/2, size.height/2);  
            this.addChild(this.pRTex, 10);  
              
            //加载等待被擦除的图片  
            var pBg = new cc.Sprite(res.dirt_png);  
            pBg.setPosition(size.width/2, size.height/2);  
            this.pRTex.begin();  
            pBg.visit();  
            this.pRTex.end();  
      
              
              
            cc.eventManager.addListener({             
                event: cc.EventListener.TOUCH_ONE_BY_ONE,         
                onTouchBegan:function(touches, event){  
                    cc.log("start");  
                    var target = event.getCurrentTarget();  
                    return true;  
                },            
                onTouchMoved:function (touch, event) {  
                    var target = event.getCurrentTarget();  
                    target.pEraser.setPosition(touch.getLocation());  
                    target.eraseByBlend();  
                }  
            }, this);  
              
            return true;  
        },  
          
        eraseByBlend :function()  
        {  

          //橡皮檫图片中间透明的图。  BlendFunc为 cc.blendFunc(cc.ZERO, cc.SRC_ALPHA)

          //如果是实心外透明  BlendFunc为 cc.blendFunc(cc.ZERO, cc.ONE_MINUS_SRC_ALPHA)

    this.pEraser.setBlendFunc(cc.ONE_MINUS_SRC_ALPHA, cc.ZERO);    
            this.pRTex.begin();  
            this.pEraser.visit();  
            this.pRTex.end();  
        }  
          
    }); 
    运行效果如下:
  • 相关阅读:
    WEB引入Google思源黑体
    Linux安装最新版Node.js
    JS判断值是否是数字
    高效jQuery的奥秘
    一个Web前端工程师或程序员的发展方向,未来困境及穷途末路
    javascript 模块化 (切记:学习思想)
    学习 正则表达式 js java c# python 通用
    Promise如何解决回调地狱
    VSCode 开发插件 推荐
    js移动端自适应动态设置html的fontsize
  • 原文地址:https://www.cnblogs.com/guangyun/p/8431285.html
Copyright © 2011-2022 走看看