zoukankan      html  css  js  c++  java
  • cocos2dx 2.x实现闪电效果(贴画版)

    cocos2dx 2.x实现闪电效果(非画线版)

    在网上搜索到一个直接用opengl画线实现的版本,但放在游戏中效果不太搭,要求用贴图的。我这个版本用的也是画线版的算法。

    闪动的时候效果还可以,每段衔接的地方还是不太完美,各位有其他的建议的请联系我  blue-1986@hotmail.com

    转载请注明出处 http://www.cnblogs.com/mrblue/p/4315091.html

    效果图

    //头文件

    #ifndef __LIGINTNING_H__
    #define __LIGINTNING_H__
    
    #include "cocos2d.h"
    #include <vector>
    
    class Lightning : public cocos2d::CCNode
    {
    public:
    	Lightning();
    	~Lightning();
    
    public:
        static Lightning* create(const std::string& strTextureFile, float fLength);
    	virtual bool init(const std::string& strTextureFile, float fLength);
    
    protected:
    	virtual void draw()/*override*/;
    	virtual void update(float fDelta)/*override*/;
    
    public:
    	void setTexture(cocos2d::CCTexture2D *texture);
    	void setLength(float fLength){ m_fLength = fLength; }
    
    protected:
    	void calculateVertex();
    	void addLightningSegment(float x1, float y1, float x2, float y2, float displace);
    
    protected:
    	std::vector<cocos2d::CCPoint>	m_vecLightningTrackPoint;
    	std::vector<float>				m_vecVertics;
    	std::vector<float>				m_vecCoordinates;
    	cocos2d::CCTexture2D*			m_pTexture;
    	float							m_fLength;
    };
    
    #endif // __HELLOWORLD_SCENE_H__
    

      

    //cpp

    #include "Lightning.h"
    
    USING_NS_CC;
    
    using namespace std;
    
    
    Lightning::Lightning()
        :m_pTexture(NULL)
    {
        m_vecLightningTrackPoint.reserve(64);
        m_vecVertics.reserve(256);
        m_vecCoordinates.reserve(256);
    }
    
    Lightning::~Lightning()
    {
        CC_SAFE_RELEASE(m_pTexture);
    }
    
    Lightning* Lightning::create( const std::string& strTextureFile, float fLength )
    {
        Lightning * pRet = new Lightning();
        if (pRet && pRet->init(strTextureFile,fLength))
        {
            pRet->autorelease();
        }
        else
        {
            CC_SAFE_DELETE(pRet);
        }
    
        return pRet;
    }
    
    bool Lightning::init(const string& strFile, float fLength)
    {
        CCNode::init();
    
        setShaderProgram(CCShaderCache::sharedShaderCache()->programForKey(kCCShader_PositionTexture));
        setLength(fLength);
        setTexture(CCTextureCache::sharedTextureCache()->addImage(strFile.c_str()));
        
        
        scheduleUpdate();
            
        return true;
    }
    
    void Lightning::draw()
    {
        if(m_vecVertics.empty()||m_vecCoordinates.empty()) return;
    
        CC_NODE_DRAW_SETUP();
        ccGLEnableVertexAttribs( kCCVertexAttribFlag_Position | kCCVertexAttribFlag_TexCoords );
            
        ccGLBlendFunc( CC_BLEND_SRC,CC_BLEND_DST );
        ccGLBindTexture2D( m_pTexture->getName() );
    
        glVertexAttribPointer(kCCVertexAttrib_Position, 2, GL_FLOAT, GL_FALSE, 0, (GLvoid*)(&m_vecVertics[0]));
        glVertexAttribPointer(kCCVertexAttrib_TexCoords, 2, GL_FLOAT, GL_FALSE, 0, (GLvoid*)(&m_vecCoordinates[0]));
    
        glDrawArrays(GL_TRIANGLE_STRIP, 0, m_vecVertics.size()/2);
    }
    
    void Lightning::addLightningSegment( float x1, float y1, float x2, float y2, float displace )
    {
        if (displace <=m_pTexture->getPixelsWide()/2 )
        {
            m_vecLightningTrackPoint.push_back(ccp(x2,y2));
        }
        else
        {
            float mid_x = (x2+x1)/2;
            float mid_y = (y2+y1)/2;
            mid_x += (CCRANDOM_0_1() - 0.5) * displace;
            mid_y += (CCRANDOM_0_1() - 0.5) * displace;
            addLightningSegment(x1, y1, mid_x, mid_y, displace/2);
            addLightningSegment(mid_x, mid_y,x2, y2, displace/2);
        }
    }
    
    void Lightning::update(float delta)
    {
        calculateVertex();
    }
    
    void Lightning::calculateVertex()
    {
        m_vecLightningTrackPoint.clear();
        m_vecLightningTrackPoint.push_back(CCPointZero);
        addLightningSegment(0,0,m_fLength,0,m_fLength/3);
    
        m_vecVertics.clear();
        m_vecCoordinates.clear();
    
        for (size_t i=0; i<m_vecLightningTrackPoint.size(); i++)
        {
            const auto& pt = m_vecLightningTrackPoint[i];
    
            m_vecVertics.push_back(pt.x);
            m_vecVertics.push_back(pt.y-m_pTexture->getPixelsHigh()/2);
            m_vecVertics.push_back(pt.x);
            m_vecVertics.push_back(pt.y+m_pTexture->getPixelsHigh()/2);
    
            m_vecCoordinates.push_back(i);
            m_vecCoordinates.push_back(0);
            m_vecCoordinates.push_back(i);
            m_vecCoordinates.push_back(1);
        }
    }
    
    void Lightning::setTexture( cocos2d::CCTexture2D *texture )
    {
        CC_SAFE_RETAIN(texture);
        CC_SAFE_RELEASE(m_pTexture);
        m_pTexture = texture;
      ccTexParams params = {GL_LINEAR,GL_LINEAR,GL_REPEAT,GL_REPEAT};
       m_pTexture->setTexParameters(&params);
    }

    代码下载

  • 相关阅读:
    ASP.NET CORE中控制器内return HTML 内容自动编码问题
    sql server中调用c#写的dll里的方法
    牛腩视频播放管理系统
    apicloud开发笔记
    asp.net core在linux上的部署调试
    C#-微信公众平台接口-上传临时素材
    csc.exe已退出,代码为-532462766
    牛腩记账本core版本源码
    sql server中根据地图经纬度算距离
    ASP.NET CORE做的网站运行在docker上(不用dockerfile文件部署)
  • 原文地址:https://www.cnblogs.com/mrblue/p/4315091.html
Copyright © 2011-2022 走看看