我们开发游戏有时候也会需要使用到二维码,但是二维码在cocos里面怎么实现呢。
首先二维码这个东西,我们不需要自己去开发,一般有现成的库,只需要传入你的数据,
库就会帮你生成对应的点阵数据。
下面我这边使用的是一个有日本人开发的QR_Encode这个库。
我这边是把他稍微改了一下,删掉一些,Windwos的东西。
下面讲一下用法
首先包含创建一个cocos的工程
在HelloWorldScene 添加头文件 #include “QR_Encode.h”
定义下成员变量
CQR_Encode m_QREncode;
在init函数最后面添加二维码生成功能
bool bRet = m_QREncode.EncodeData(0, 0, 1, -1, “test qrcode”);
下面是 cocos2.x的实现
// 添加生成图像代码, 这边我采用的是CCDrawNode这个类直接绘制
if(bRet)
{
int nSize = 5; // 定义好像素点的大小
int originalSize = m_QREncode.m_nSymbleSize + (QR_MARGIN * 2);
CCDrawNode *pQRNode = CCDrawNode::create();
CCPoint pt;
ccColor4F color;
// 先绘制一下地板
pt = ccp(0, 0);
pt = ccp((m_QREncode.m_nSymbleSize + QR_MARGIN * 2)*nSize, (m_QREncode.m_nSymbleSize + QR_MARGIN * 2)*nSize);
pt = ccp((m_QREncode.m_nSymbleSize + QR_MARGIN * 2)*nSize, 0);
pt = pt;
pt = ccp(0, (m_QREncode.m_nSymbleSize + QR_MARGIN * 2)*nSize);
pt = pt;
color = ccc4f(1, 1, 1, 1);
pQRNode->drawPolygon(pt, 6, color, 0, color);
// 绘制里面的黑白点
for (int i = 0; i < m_QREncode.m_nSymbleSize; ++i)
{
for (int j = 0; j < m_QREncode.m_nSymbleSize; ++j)
{
pt = ccp((i + QR_MARGIN)*nSize, (j + QR_MARGIN)*nSize);
pt = ccp(((i + QR_MARGIN) + 1)*nSize, ((j + QR_MARGIN) + 1)*nSize);
pt = ccp(((i + QR_MARGIN) + 1)*nSize, ((j + QR_MARGIN) + 0)nSize);
pt = pt;
pt = ccp(((i + QR_MARGIN) + 0)nSize, ((j + QR_MARGIN) + 1)nSize);
pt = pt;
if (m_QREncode.m_byModuleData == 1)
{
color = ccc4f(0, 0, 0, 1);
}
else
{
color = ccc4f(1, 1, 1, 1);
}
pQRNode->drawPolygon(pt, 6, color, 0, color);
}
}
CCSize winSize = CCDirector::sharedDirector()->getWinSize();
pQRNode->setPosition(ccp((winSize.width - nSizem_QREncode.m_nSymbleSize) / 2, winSize.height - (winSize.height - nSizem_QREncode.m_nSymbleSize) / 2));
pQRNode->setScaleY(-1);
addChild(pQRNode);
}
这边是cocos3.x的实现
if(bRet)
{
int nSize = 5; // 定义好像素点的大小
int originalSize = m_QREncode.m_nSymbleSize + (QR_MARGIN * 2);
DrawNode pQRNode = DrawNode::create();
// 绘制像素点
for (int i = 0; i < m_QREncode.m_nSymbleSize; ++i)
{
for (int j = 0; j < m_QREncode.m_nSymbleSize; ++j)
{
if (m_QREncode.m_byModuleData == 1)
{
pQRNode->drawSolidRect(Vec2((i + QR_MARGIN)*nSize, (j + QR_MARGIN)*nSize), Vec2(((i + QR_MARGIN) + 1)*nSize, ((j + QR_MARGIN) + 1)*nSize), Color4F(0, 0, 0, 1));
}
else
{
pQRNode->drawSolidRect(Vec2((i + QR_MARGIN)*nSize, (j + QR_MARGIN)*nSize), Vec2(((i + QR_MARGIN) + 1)*nSize, ((j + QR_MARGIN) + 1)*nSize), Color4F(1, 1, 1, 1));
}
}
}
// 绘制外框
pQRNode->drawSolidRect(Vec2(0, 0), Vec2((m_QREncode.m_nSymbleSize + QR_MARGIN * 2)*nSize, (QR_MARGIN)*nSize), Color4F(1, 1, 1, 1));
pQRNode->drawSolidRect(Vec2(0, 0), Vec2((QR_MARGIN)*nSize, (m_QREncode.m_nSymbleSize + QR_MARGIN * 2)*nSize), Color4F(1, 1, 1, 1));
pQRNode->drawSolidRect(Vec2((m_QREncode.m_nSymbleSize + QR_MARGIN)*nSize, 0), Vec2((m_QREncode.m_nSymbleSize + QR_MARGIN * 2)*nSize, (m_QREncode.m_nSymbleSize + QR_MARGIN * 2)*nSize), Color4F(1, 1, 1, 1));
pQRNode->drawSolidRect(Vec2(0, (m_QREncode.m_nSymbleSize + QR_MARGIN)*nSize), Vec2((m_QREncode.m_nSymbleSize + QR_MARGIN * 2)nSize, (m_QREncode.m_nSymbleSize + QR_MARGIN * 2)nSize), Color4F(1, 1, 1, 1));
Size winSize = Director::getInstance()->getWinSize();
pQRNode->setPosition(Vec2((winSize.width - nSizem_QREncode.m_nSymbleSize) / 2, winSize.height - (winSize.height - nSizem_QREncode.m_nSymbleSize) / 2));
pQRNode->setScaleY(-1);
addChild(pQRNode);
}
分享图片的时候,我们就可以采用RenderTexture把图片保存在临时目录,平台调用该图片进行分享。
// 请大家多多支持,后续会有更多的相关常用技术文章.
作者:Johance QQ:421465201*