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

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

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

闪动的时候效果还可以,每段衔接的地方还是不太完美,各位有其他的建议的请联系我  [email protected]

转载请注明出处 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);
}

代码下载

时间: 2024-10-09 20:47:09

cocos2dx 2.x实现闪电效果(贴画版)的相关文章

cocos2d-x笔记3 : 3.0正式版调用CocoStudio

cocos2d已经有一万个新建工程的方式和一万个API改动了,而且相互不兼容...触控科技的程序员真心不怕被打哦... 网上搜到的做法大多已经不行了,原因在上一段哦... 同样都是3.0,Alpha版.Bata版.Rc版.正式版,它们调用CocoStudio的方法都不一样哦...(求超越哦...) 记录一下3.0正式版使用CocoStudio的方法,是正式版,也就是最新版哦.(当然,只相对本周而言哦...) 一.添加库: 1.右击解决方案 -> 添加 -> 现有项目 2.进入项目目录的coco

cocos2d-x的popScene的动画效果

找到CCDirector.h,找到void popScene(); 在下面加上一段类模板 template <class T> void popSceneWithTransition(float t) { CCASSERT(_runningScene != nullptr, "running scene should not null"); _scenesStack.popBack(); ssize_t c = _scenesStack.size(); if (c == 0

Cocos2d-x v3.x 官方文档]C++版如何使用WebSocket

在C++中使用 详细代码可参考引擎目录下的/samples/Cpp/TestCpp/Classes/ExtensionsTest/NetworkTest/WebSocketTest.cpp文件. 头文件中的准备工作 首先需要include WebSocket的头文件. #include "network/WebSocket.h" cocos2d::network::WebSocket::Delegate定义了使用WebScocket需要监听的回调通知接口.使用WebSocket的类,需

Cocos2d-x 水果忍者划痕效果

网上找的一个关于水果忍者划痕的,效果还算凑合.其原理就是基于OpenGL绘制直线,因为版本号过老,此处笔者改动了一些方法,粘贴后可直接使用 适用于Cocos2d-x 2.2.1 .h文件里须要添?的代码: void draw(); void drawLine(); virtual void ccTouchesBegan(CCSet *pTouches,CCEvent *pEvent); virtual void ccTouchesMoved(CCSet *pTouches,CCEvent *pE

利用LruCache加载网络图片实现图片瀑布流效果(基础版)

MainActivity如下: package cc.patience3; import android.os.Bundle; import android.app.Activity; /** * Demo描述: * 采用瀑布流的形式加载大量网络图片 * 详细分析参见WaterfallScrollView * * 参考资料: * 1 http://blog.csdn.net/guolin_blog/article/details/10470797 * 2 http://blog.csdn.net

Cocos2d-x移植android加入震动效果

cpp部分通过jni调用java静态函数 头文件: #include <jni.h> #include "cocos2d.h" #include "platform/android/jni/JniHelper.h" 在cpp类中定义方法去调用Cocos2dxSound.java中vibrate方法: static void vibrateJNI(long longtime) { JniMethodInfo methodInfo; if(!JniHelpe

cocos2d-x 弹入、弹出效果(以菜单为例子)

弹入和弹出菜单为了使动作更平滑,涉及到动作组合.(CCMoveTo .CCEaseExponentialOut)(菜单背景图位置仅为示范例子,还需调整) 以菜单的背景图为例: //生成菜单背景图 CCSprite* MainMenuBG = CCSprite::create("menu_bg.png"); MainMenuBG->setPosition(ccp(visibleSize.width/2 +10,visibleSize.height +20)); this->a

基于JQuery的桌面Dock效果(稳定版)

就算鼠标 之所以将它命名为稳定版,是因为之前已经分享了一个初级版本的,之前的初级版中存在很多bug.现在经过反复琢磨.实验,修复了之前版本存在的很多不足之处,就算鼠标快速的滑动依然表现的很稳定.已经迫不及待的想要将我的最新成果分享给大家了,其实代码和之前的版本很相似. 首相是HTML页面代码: <!DOCTYPE html> <html lang="zh-cmn-Hans-CN"> <head> <meta http-equiv="C

Cocos2dx 实现擦除即橡皮擦效果的实现

Cocos2dx实现橡皮擦效果的实现 DionysosLai([email protected])  2014/8/25 之前项目在做一个绘本游戏,要求实现擦除效果,具体效果可以参考绘本<我是一只暴龙>,当时由于项目比较紧,是直接拿网上代码来用(感谢仁兄Zrong的入门之引,具体博文,详见地址,http://zengrong.net/post/2067.htm).当时,没有对其做一些具体优化工作,一些原理,也是似懂非懂.今天,在工作之余,重写了代码,并从始至末将知识点理清楚,务必要求自己能够搞