1. 程式人生 > >cocos2dx 圖片變灰及正常顯示實現(lua可以呼叫)

cocos2dx 圖片變灰及正常顯示實現(lua可以呼叫)

圖片變灰, 採用shader就可以實現,  

有2中方法,

1,  像CCSprite一樣create

2.  把CCSprite傳進來, 並把圖片要不要變灰的flag傳進來, 具體實現看程式碼和後面的使用方法

-----------------------------------------

GraySprite.h

//
//  GraySprite.h
//  goddess
//
//  Created by rekoo on 13-7-23.
//
//
#ifndef __goddess__GraySprite__
#define __goddess__GraySprite__
#include "cocos2d.h"
#include "cocos-ext.h"
USING_NS_CC;
USING_NS_CC_EXT;
class GraySprite : public CCSprite
{
public:
    GraySprite();
    ~GraySprite();
                                           
    bool initWithTexture(CCTexture2D* texture, const CCRect&  rect);
    void draw();
    void initProgram();
    void listenBackToForeground(CCObject *obj);
                                           
    static GraySprite* create(const char *pszFileName);
                                           
};
#endif /* defined(__goddess__GraySprite__) */

GraySprite.cpp

//
//  GraySprite.cpp
//  goddess
//
//  Created by rekoo on 13-7-23.
//
//
// 用shader建立灰度圖, 用法跟sprite一樣
//  lua用法: local sprite = GraySprite:create("pic.png")
#include "GraySprite.h"
GraySprite::GraySprite()
{
}
GraySprite::~GraySprite()
{
}
GraySprite* GraySprite::create(const char *pszFileName)
{
    GraySprite* pRet = new GraySprite();
    if (pRet && pRet->initWithFile(pszFileName))
    {
        pRet->autorelease();
    }
    else
    {
        CC_SAFE_DELETE(pRet);
    }
                                       
    return pRet;
}
void GraySprite::listenBackToForeground(CCObject *obj)
{
    setShaderProgram(NULL);
    initProgram();
}
bool GraySprite::initWithTexture(CCTexture2D* texture, const CCRect& rect)
{
    if( CCSprite::initWithTexture(texture, rect) )
    {
                                                   
        CCSize s = getTexture()->getContentSizeInPixels();
                                        
        this->initProgram();
                                           
        return true;
    }
                                       
    return false;
}
void GraySprite::initProgram()
{
//    GLchar * fragSource = (GLchar*) CCString::createWithContentsOfFile(
//                                                                       CCFileUtils::sharedFileUtils()->fullPathForFilename("Shaders/example_Blur.fsh").c_str())->getCString();
                                       
  const  GLchar * pfrag =    "#ifdef GL_ES \n \
    precision mediump float; \n \
    #endif \n\
    uniform sampler2D u_texture; \n \
    varying vec2 v_texCoord; \n \
    varying vec4 v_fragmentColor; \n \
    void main(void) \n \
    { \n \
    float alpha = texture2D(u_texture, v_texCoord).a; \n \
    float grey = dot(texture2D(u_texture, v_texCoord).rgb, vec3(0.299,0.587,0.114)); \n \
    gl_FragColor = vec4(grey, grey, grey,alpha); \n \
    } ";
                                       
                                    
    CCGLProgram* pProgram = new CCGLProgram();
    pProgram->initWithVertexShaderByteArray(ccPositionTextureColor_vert, pfrag);
    setShaderProgram(pProgram);
    pProgram->release();
                                       
    CHECK_GL_ERROR_DEBUG();
                                       
    getShaderProgram()->addAttribute(kCCAttributeNamePosition, kCCVertexAttrib_Position);
    getShaderProgram()->addAttribute(kCCAttributeNameColor, kCCVertexAttrib_Color);
    getShaderProgram()->addAttribute(kCCAttributeNameTexCoord, kCCVertexAttrib_TexCoords);
                                       
    CHECK_GL_ERROR_DEBUG();
                                       
    getShaderProgram()->link();
                                       
    CHECK_GL_ERROR_DEBUG();
                                       
    getShaderProgram()->updateUniforms();
                                       
}
void GraySprite::draw()
{
    ccGLEnableVertexAttribs(kCCVertexAttribFlag_PosColorTex );
    ccBlendFunc blend = getBlendFunc();
    ccGLBlendFunc(blend.src, blend.dst);
                                       
    getShaderProgram()->use();
    getShaderProgram()->setUniformsForBuiltins();
                                       
                                       
    ccGLBindTexture2D( getTexture()->getName());
                                       
    //
    // Attributes
    //
#define kQuadSize sizeof(m_sQuad.bl)
    long offset = (long)&m_sQuad;
                                       
    // vertex
    int diff = offsetof( ccV3F_C4B_T2F, vertices);
    glVertexAttribPointer(kCCVertexAttrib_Position, 3, GL_FLOAT, GL_FALSE, kQuadSize, (void*) (offset + diff));
                                       
    // texCoods
    diff = offsetof( ccV3F_C4B_T2F, texCoords);
    glVertexAttribPointer(kCCVertexAttrib_TexCoords, 2, GL_FLOAT, GL_FALSE, kQuadSize, (void*)(offset + diff));
                                       
    // color
    diff = offsetof( ccV3F_C4B_T2F, colors);
    glVertexAttribPointer(kCCVertexAttrib_Color, 4, GL_UNSIGNED_BYTE, GL_TRUE, kQuadSize, (void*)(offset + diff));
                                       
                                       
    glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
                                       
    CC_INCREMENT_GL_DRAWS(1);
}

--------------------------------

使用例子:

1.  GraySprite * gs = GraySprite::create("01.png");

剩下跟CCSprite一樣, 設定位置, addChild等等

2. CCSprite * cs = CCSprite::create("02.png");

GraySprite::setGray(cs, 1);   //變灰

GraySprite::setGray(cs, 0);  //原色

-----------------------------

把GraySprte暴露出去, lua就可以呼叫, 很方便


相關推薦

cocos2dx 圖片正常顯示實現(lua可以呼叫)

圖片變灰, 採用shader就可以實現,   有2中方法, 1,  像CCSprite一樣create 2.  把CCSprite傳進來, 並把圖片要不要變灰的flag傳進來, 具體實現看程式碼和後面的使用方法 ---------------------------

Cocos2dx-- 圖片實現

前言:遊戲中有很多按鈕控制元件,它們一般會有選中和未選中2種狀態。我們如果要區分這兩種狀態的表現,很多時候是直接叫美術給兩種狀態下的資源,或直接setColor設定顏色。這樣無疑增加了資源的大小或不美觀(看需求)。本節將介紹怎麼通過opengl es程式來實現圖

cocos2dx shader版本讓圖片(lua版本)

function UI.setSpriteGray( sp ) local vertShaderByteArray = "\n".. "attribute vec4 a_pos

Unity圖片的方式

灰度 約定 bar str data mod main 又一 lai http://www.tuicool.com/articles/Vruuqme NGUI中的Button差點兒是最經常使用到的控件之中的一個,而且能夠組合各種組件(比方UIButtonColor,UI

Qt點滴 QLabel Disabled時 圖片

void QLabel::paintEvent(QPaintEvent *) {     ....... #endif     if (d->pixmap && !d->pixmap->isNull()

android imageview中設定圖片

原文連結 http://blog.csdn.net/chaozhidan/article/details/51482895 將ImageView變成灰色ColorMatrix matrix = new ColorMatrix();matrix.setSaturation(

解決matplotlib繪製圖片時中文無法正常顯示的問題

from pylab import * mpl.rcParams['font.sans-serif'] = ['SimHei'] mpl.rcParams['axes.unicode_minus']

android imageview中設定圖片

原文連結 http://blog.csdn.net/chaozhidan/article/details/51482895   將ImageView變成灰色 ColorMatrix matrix = new ColorMatrix(); matrix.setSaturat

gif圖片拆幀合成[python]實現

python版本2.7,使用PIL庫,程式碼如下: import ImageGrab # from PIL import time import string from PIL import Image, ImageChops from PIL.GifImagePlugi

用asp.net(c#)如何將彩色圖片圖片

using System; using System.Collections; using System.Configuration; using System.Data; using System.Linq; using System.Web; using System.

如何使用cocos的自動繫結工具實現lua呼叫c++的類

如何使用cocos的自動繫結工具實現lua呼叫c++的類 主要分成以下步驟 1、建立自己的c++類檔案 2、然後修改和執行引擎資料夾cocos2d-x-3.7\tools\tolua 目錄下的genbindings.py 檔案, 3、編寫自己的ini檔案 4、將生成的繫

使用g++命令生成dll檔案實現lua呼叫C程式碼

首先安裝gcc環境,下載MinGW,MinGW只是一個管理工具,真正的環境還需要在裡面下載注意選中下載項後點擊選單項中Installation--->Apply Changes才會開始下載,會下載至MinGw安裝目錄下,確保bin目錄中存在lua52.dll,lua.e

lua——alien庫實現lua呼叫C動態連結庫(dll、so)

我們知道,lua通過lua_State堆疊可以很方便的與C語言進行互動 也可以呼叫專門為lua呼叫而封裝的C庫。 具體步驟: 1.原C檔案中引入lua相關標頭檔案 #include "lua.h" #include "lualib.h" #include "lauxli

(表單重複提交)jquery驗證 通過時,提交按鈕,不通過時正常顯示

原理 ,所有表單驗證通過後,form.submit();進行表單提交。 例項1 因此在在驗證回來通過之後,表單提交前 設定提交按鈕為灰 document.getElementById("signupbutton").disabled=true;             f

thinkphp5.0查詢到的數據表中的路徑是反斜杠導致無法正常顯示圖片怎麽辦?

url 顯示圖片 無法 log php pos ssi -1 str 添加到數據表中圖片的路徑有時會是反斜杠,這就導致了在url後面寫路徑的時候會識別不出來(不過src後面寫路徑就可以識別),所以就需要把路徑中的反斜杠替換成正斜杠,代碼如下: 1 $datu =

不帶插件 ,自己寫js,實現批量上傳文件進度顯示

批量上傳 發的 xhr string () .cn tom 需要 pen 今天接受項目中要完成文件批量上傳文件而且還要顯示上傳進度,一開始覺得這個應該不是很麻煩,當我在做的時候遇到了很多問題,很頭疼啊。 不過看了別人寫的代碼,自己也測試過,發現網上好多都存在一些問題,並不是

實現簡單圖片下載功能防盜鏈

nco eth coder lose ring || pro rect 下載 1.防盜鏈的基本原理就是就是一句話:通過判斷request請求頭的refer是否來源於本站。 2.HTTP Referer是header的一部分,當瀏覽器向web服務器發送請求的時候,一般會帶上R

springmvc實現圖片下載以及在瀏覽器顯示

trace input inpu con req pub servlet @override puts 一、不在同一臺主機,通過給對方文件的方式Controller@RequestMapping(value = "/down/{uuid}", metho

python3 用requests 保存網頁以及BeautifulSoup保存圖片,並且在本地可以正常顯示文章的內容和圖片

-s bs4 圖片保存 ins date xml解析 站點 mkdir post 用requests 模塊做了個簡單的爬蟲小程序,將博客的一篇文章以及圖片保存到本地,文章格式存為‘.html‘。當文章保存到本地後,圖片的連接可能是目標站點的絕對或者相對路徑,所以要是想在本地

Unity3d遊戲中實現阿拉伯語文字正常顯示

return dex p s != 漢語 div 發現 3d遊戲 let Unity3d遊戲中實現阿拉伯語文字正常顯示 由於項目需求要把遊戲文字顯示為維語版本(維語屬於阿拉伯語系),我先把維語替換進去,之後發現文字是錯的(每個字符都分開了,而且顯示方向也不對)後來在網上查了