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);
}

代码下载

原文地址:https://www.cnblogs.com/mrblue/p/4315091.html