cocos2dx 简单文本输出

2015年02月12日 10:44 0 点赞 0 评论 更新于 2025-11-21 16:15

在手机上进行调试时,无法像在桌面环境那样直接实现所见即所得的日志输出,这给调试工作带来了一定的困扰。为了解决这个问题,我们可以使用多行文本作为日志输出的方式。下面将详细介绍实现该功能的代码。

日志类的定义

我们从 CCLabelTTF 派生了一个新的类 XLogView,该类主要提供了 VLogLog 两个日志输出函数。以下是具体的定义:

#ifndef _X_LOG_VIEW_H_
#define _X_LOG_VIEW_H_
#include <cocos2d.h>
#include <vector>
#include <cstring>
#include <cstdarg>
USING_NS_CC;

namespace zdh
{
using std::vector;
using std::string;

/// 滚动文本日志
/*
这是一个模板类,模板参数 N 主要用于设置一行日志缓冲的字节数。
*/
template<int N = 128>
class XLogView : public CCLabelTTF
{
public:
XLogView()
: m_LogMaxLine(10)
{
}

// 一组 create 函数,直接从 CCLabelTTF 复制过来
static XLogView * create(const char *string, const char *fontName, float fontSize)
{
return XLogView::create(string, fontName, fontSize, CCSizeZero, kCCTextAlignmentCenter, kCCVerticalTextAlignmentTop);
}

static XLogView * create(const char *string, const char *fontName, float fontSize, const CCSize& dimensions, CCTextAlignment hAlignment)
{
return XLogView::create(string, fontName, fontSize, dimensions, hAlignment, kCCVerticalTextAlignmentTop);
}

static XLogView * create(const char *string, const char *fontName, float fontSize, const CCSize& dimensions, CCTextAlignment hAlignment, CCVerticalTextAlignment vAlignment)
{
XLogView *pRet = new XLogView();
if (pRet && pRet->initWithString(string, fontName, fontSize, dimensions, hAlignment, vAlignment))
{
pRet->autorelease();
return pRet;
}
CC_SAFE_DELETE(pRet);
return NULL;
}

static XLogView * createWithFontDefinition(const char *string, ccFontDefinition &textDefinition)
{
XLogView *pRet = new XLogView();
if (pRet && pRet->initWithStringAndTextDefinition(string, textDefinition))
{
pRet->autorelease();
return pRet;
}
CC_SAFE_DELETE(pRet);
return NULL;
}

// 设置滚动日志的最大行数
void setLogMaxLine(int param_max_line)
{
if (param_max_line < 1)
{
m_LogMaxLine = 1;
}
else if (param_max_line > 1024)
{
m_LogMaxLine = 1024;
}
else
{
m_LogMaxLine = param_max_line;
}
}

// 获取滚动日志的最大行数
int getLogMaxLine() const
{
return m_LogMaxLine;
}

// 清除日志
void Clear()
{
m_LogList.clear();
setString("");
}

// 生成日志
void VLog(const char * paramFormat, va_list param_argptr)
{
char sTemp[N];
vsnprintf(sTemp, sizeof(sTemp), paramFormat, param_argptr);

// 删除超出行数的日志
while ((int)m_LogList.size() > m_LogMaxLine)
{
m_LogList.erase(m_LogList.begin());
}

m_LogList.push_back(sTemp);

// 生成日志
m_LogTemp = "";
size_t iCount = m_LogList.size();
for (size_t i = 0; i < iCount; i++)
{
if (m_LogTemp.length() > 0)
{
m_LogTemp += "\n";
}
m_LogTemp += m_LogList[i];
}
setString(m_LogTemp.c_str());

// 输出到控制台窗口
#ifdef _MSC_VER
OutputDebugStringA(sTemp);
#endif
}

void Log(const char * paramFormat, ...)
{
va_list argptr;
va_start(argptr, paramFormat);
VLog(paramFormat, argptr);
va_end(argptr);
}

private:
string m_LogTemp;                // 生成日志的临时变量
int m_LogMaxLine;                // 日志最大的行数
vector<string> m_LogList;        // 日志内容
};
}
#endif

函数说明

  • VLog(const char * paramFormat, va_list param_argptr):该函数主要用于在已经有 va_list 的情况下进行日志输出。它会根据传入的格式化字符串和参数列表生成日志,并将其添加到日志列表中。如果日志行数超过最大行数,会自动删除最早的日志。最后,将生成的日志字符串设置到 CCLabelTTF 中进行显示,并在 Windows 环境下将日志输出到控制台窗口。
  • Log(const char * paramFormat, ...):该函数是一个可变参数函数,它会调用 VLog 函数完成日志输出的具体操作。

在场景中使用日志类

Scene 类的初始化阶段,我们需要调用相应的函数来创建和初始化日志视图。以下是具体的实现:

void HelloWorld::InitLog()
{
auto visibleSize = CCDirector::sharedDirector()->getVisibleSize();
auto pLog = zdh::XLogView<>::create("", "宋体", 12, CCSizeMake(200, 200), kCCTextAlignmentLeft);
if (pLog != nullptr)
{
pLog->setAnchorPoint(ccp(0.5, 1));
pLog->setPosition(ccp(visibleSize.width - 200, visibleSize.height - 10));
this->addChild(pLog);
}
m_Log = pLog;
}

同时,我们还需要定义一个日志指针和一个 PrintLog 方法,用于在代码中输出日志:

void HelloWorld::PrintLog(const char * paramFormat, ...)
{
if (m_Log != NULL)
{
va_list argptr;
va_start(argptr, paramFormat);
m_Log->VLog(paramFormat, argptr);
va_end(argptr);
}
}

通过以上步骤,我们就可以在代码中方便地输出日志了。在需要输出日志的地方,调用 PrintLog 函数并传入相应的格式化字符串和参数即可。例如:

PrintLog("This is a test log: %d", 123);

这样,我们就实现了在 Cocos2d-x 中使用多行文本进行日志输出的功能,为手机调试提供了便利。

作者信息

boke

boke

共发布了 3994 篇文章