cocos2dx闪电效果

2015年02月01日 09:37 0 点赞 0 评论 更新于 2017-05-09 20:57

在项目开发过程中,我需要实现 Cocos2d-x 的闪电效果。为此,我查阅了相关资料,并成功实现了该效果。下面将具体实现过程分享给大家。

实现 Cocos2d-x 闪电效果本质上是一个算法问题,下面直接给出代码实现。

1. .h 文件代码

#ifndef __HELLO_LIGHTING_H__
#define __HELLO_LIGHTING_H__

#include "cocos2d.h"
USING_NS_CC;

class HelloLighting : public cocos2d::Layer
{
public:
// 构造函数
HelloLighting(void);
// 析构函数
~HelloLighting(void);
// 初始化函数
virtual bool init();
// 更新函数
virtual void update(float delta);
// 创建场景的静态函数
static cocos2d::Scene* createScene();
// 创建对象的宏函数
CREATE_FUNC(HelloLighting);
// 绘制函数
virtual void draw(cocos2d::Renderer *renderer, const cocos2d::Mat4& transform, uint32_t flags);
// 绘制闪电的函数
void drawLighting(float x1, float y1, float x2, float y2, float displace);

private:
// 当前细节级别
float curDetail;
// 起始点
Point pos1;
// 结束点
Point pos2;
};

#endif // __HELLO_LIGHTING_H__

2. .cpp 文件代码

#include "HelloLighting.h"

HelloLighting::HelloLighting(void)
{
}

HelloLighting::~HelloLighting(void)
{
}

cocos2d::Scene* HelloLighting::createScene()
{
// 创建场景
Scene *scene = Scene::create();
// 创建 HelloLighting 图层
HelloLighting *layer = HelloLighting::create();
// 将图层添加到场景中
scene->addChild(layer);
return scene;
}

bool HelloLighting::init()
{
// 调用父类的初始化函数
if (!Layer::init())
{
return false;
}
// 获取窗口大小
auto winSize = Director::getInstance()->getWinSize();
// 设置起始点
pos1 = Point(100, winSize.height / 2);
// 设置结束点
pos2 = Point(winSize.width - 100, winSize.height / 2);
// 设置当前细节级别
curDetail = 5;
return true;
}

void HelloLighting::update(float delta)
{
// 可根据需求添加更新逻辑
}

void HelloLighting::draw(cocos2d::Renderer *renderer, const cocos2d::Mat4& transform, uint32_t flags)
{
// 设置绘制颜色
ccDrawColor4B(255, 0, 0, 0);
// 设置线宽
glLineWidth(1);
// 绘制闪电
drawLighting(pos1.x, pos1.y, pos2.x, pos2.y, 200);
// 这里多画几条线就可以看到更多效果
}

void HelloLighting::drawLighting(float x1, float y1, float x2, float y2, float displace)
{
if (displace < curDetail)
{
// 当位移小于当前细节级别时,直接绘制直线
ccDrawLine(Point(x1, y1), Point(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;
// 递归绘制闪电
drawLighting(x1, y1, mid_x, mid_y, displace / 2);
drawLighting(x2, y2, mid_x, mid_y, displace / 2);
}
}

3. 效果展示

直接加载这个场景就可以看到闪电效果了。需要注意的是,实际的运行效果与效果图可能会存在一定差异。大家可以亲自运行代码,欣赏实际的闪电效果。

作者信息

feifeila

feifeila

共发布了 570 篇文章