cocos2dx-lua 简单的字体变色拼接实现

  这里主要做的是游戏公告里面用到的,因此我加入了简单的html <font>标签解析,是为了给运营小白预览,但其中的size 属性没有,因为后来没有这个需求了,所以也就懒得改了。

  实现思路很简单:设置好行宽和行高,然后一个一个字往上面添加,直到达到行宽上限或者换行符,就换行,再循环。

  

--简易html label
--[[
    暂只对以下标签进行实现
    <font> 标签进行实现,可添加 size 和 color属性
    <br> 换行
--]]

--[=[
   demo:
    html = "<font size=\"50\" color=\"#ff0000\" > ab,casdjfladfasdgasdasdgasdfasdfqwetqwetrtwqrtqwerqwerqwerqwetqwetqwerqwerqwer44444444444222222222asdugowe<br>iurlsdjlkasdhga </font><font size=\"28\" color=\"#002\" > ab,21<br>iurlsdjlkasdhga </font><font size=\"22\" color=\"#2231\" > ab,12<br>12 </font><font size=\"10\" color=\"#2202\" > ab,.21<br>1 </font>"
    local lable = require ("common.HtmlLabel").new(600,html)
    lable:setPosition(400,400)
    self._lay:addChild(lable)
--]=]

local HtmlLabel = class("HtmlLabel",function()
	return Layout:create()
end)

function HtmlLabel:ctor(width , html)
    self._width = width
    self._height = 0
    self._defaultFontSize = 18
    self._defaultFontColor = 0x000000
    self:initWithString(html)
end

local headTag = "<font .->"
local lastTag = "</font>"
function HtmlLabel:initWithString(html)
    self._html = string.lower(html)
    self:removeAllChildrenWithCleanup(true)

    local labelList = {}
    html = string.gsub(html , "<br>"  , "\n")
    while string.len(html) > 0  do
        local bPos,ePos = string.find(html,lastTag)
        local node = {}
        local headTagEndPos = 1
        if not find then
            local hbPos,hePos = string.find(html,headTag)
            if hbPos then
--                local head = string.sub(html , hbPos , (hePos-hbPos+1))
                local head = string.sub(html , hbPos+5 , (hePos-1))
                head = string.gsub(head , "#" , "0x")
                head = string.gsub(head , "(%d\")" , "%1,")
                local strFunc = " return {" .. head .. "}"
                node = assert(loadstring(strFunc))()
                if not node.color then
                    node.color = self._defaultFontColor
                else
                    node.color = tonumber(node.color)
                end
                if not node.size then
                    node.size = self._defaultFontSize
                else
                    node.size = tonumber(node.size)
                end
                headTagEndPos = hePos + 1
               -- html = string.sub(html, hePos+1 , string.len(html))
            else
                node.color = self._defaultFontColor
                node.size = self._defaultFontSize
            end

            node.str = string.sub(html,headTagEndPos,bPos-1)
            html = string.sub(html , ePos+1 , string.len(html)) --去除已处理段
        else
            node.str = html
            node.color = self._defaultFontColor
            node.size = self._defaultFontSize
            html = ""
        end
        table.insert(labelList , node)
    end

    if #labelList == 0 then
        return
    end

    local node1 = labelList[1]
    self:initRichLabel(node1.str,self._width ,node1.size*(1+0.2) , node1.size , ccc3(math.floor(node1.color/0x10000), math.floor(node1.color/0x100)%0x100 , node1.color % 0x100 ))

    for i=2,#labelList do
        node1 = labelList[i]
   --     print ("%02x%02x%02x",math.floor(node1.color/0x10000), math.floor(node1.color/0x100)%0x100 , node1.color % 0x100 )
        self:addString(node1.str, ccc3(math.floor(node1.color/0x10000), math.floor(node1.color/0x100)%0x100 , node1.color % 0x100 ))
    end
end

function HtmlLabel:initRichLabel(content ,lineWidth , lineHeight , fntSize , color)
	self.lineWidth = lineWidth
    self.lineHeight = lineHeight
    self._fntSize = fntSize
    self._defaultColor = color
	self.widthIndex = 0
	self.rowIndex = 1
	self.nodeList = {}
    self.anchorPoint = ccp(0.5,0.5)
    self:addString(content)
end

--重新设置一个string
function HtmlLabel:setString(content , color)
    self:removeAllChildrenWithCleanup(true)
	self.widthIndex = 0
	self.rowIndex = 1
    self.nodeList = {}
    self._defaultColor = color or self._defaultColor
    self:addString(content)
end

--增加一个string
function HtmlLabel:addString(labelStr , color)
    color = color or self._defaultColor

	if self.widthIndex >= self.lineWidth then
		self.widthIndex = 0
		self.rowIndex = self.rowIndex + 1
	end

	while labelStr ~= nil and labelStr ~= "" do
		local begIndex,endIndex = self:getMaxSubStr(labelStr,self.lineWidth - self.widthIndex , self._fntSize)
		if begIndex == nil then --换行
			self.widthIndex = 0
			self.rowIndex = self.rowIndex + 1
			begIndex,endIndex = self:getMaxSubStr(labelStr,self.lineWidth - self.widthIndex, self._fntSize)
		end
		local subStr = string.sub(labelStr,begIndex,endIndex)
		labelStr = string.sub(labelStr,endIndex+1,string.len(labelStr))
	    local label = Label:create()
        label:setFontSize(self._fntSize)
        local text = string.gsub(subStr, "\n", "")--去除换行符
        label:setText(text)
        label:setColor(color)

		label:setPositionX(self.widthIndex)
		self:addChild(label)
		label:setAnchorPoint(ccp(0,0))
		label.rowIndex = self.rowIndex
        label.srcX = self.widthIndex
		table.insert(self.nodeList,label)
		self.widthIndex = self.widthIndex + label:getContentSize().width
        if string.find(subStr , ‘\n‘) then --出现强制换行
			self.widthIndex = 0
			self.rowIndex = self.rowIndex + 1
        end
	end

    self:updateInset()
end

function HtmlLabel:setContentSize( w , h)
    local sz = w
    if h then
        sz = CCSize(w ,h )
    end
    self.contentSize = sz
end

function HtmlLabel:getContentSize()
    return self.contentSize
end

--更新容器所有Node的位置
function HtmlLabel:updateInset()
	local row = self.rowIndex
	if self.widthIndex == 0 then --如果最后一行还没内容
		row = row - 1
	end
    local contentSize = CCSize(self.lineWidth,row*self.lineHeight)
    local anchorY = contentSize.height * self.anchorPoint.y
    local anchorX = contentSize.width * self.anchorPoint.x
	for k,v in pairs(self.nodeList) do
		v:setPositionY((row-v.rowIndex)*self.lineHeight - anchorY)
        v:setPositionX(v.srcX - anchorX)
	end

	self:setContentSize(contentSize)
end

--设置锚点
function HtmlLabel:setAnchorPoint( x, y )
    local pt = nil
    if not y then
        pt = x
    else
        pt = ccp(x,y)
    end
    if pt.x == self.anchorPoint.x and pt.y == self.anchorPoint.y then
        return
    end
    self.anchorPoint = pt
    self:updateInset()
end

function HtmlLabel:setPosition( x , y )
    local pt = nil
    if not y then
        pt = x
    else
        pt = ccp(x,y)
    end
    CCNode.setPosition(self,pt)
end

--获取宽度范围内,最长子串
function HtmlLabel:getMaxSubStr(_string,width,fntSize)
	local result = ""
	local index = 1
	local is_end = true
	local index_max = string.len(_string)
	local label = Label:create()
    label:setFontSize(fntSize)

	while is_end  do
		local firstCase = string.byte(_string,index)
		if firstCase == nil then
			break
		end
		local caseLen = self:sizeof(firstCase)	--字符宽度
		local strCase =  string.sub(_string,index,index + caseLen-1)
	    if strCase  == "\n" then
			result = result .. strCase
			index = index + caseLen		--保留回车返回
            break
        end
		label:setText(result .. strCase)
		local t = label:getContentSize().width*label:getScale()
		if t < width then
			result = result .. strCase
			index = index + caseLen
		else
			is_end = false
		end
        if index>index_max then
            is_end=false
        end
	end
	if result == "" then
		return nil
	end
	return 1,index-1
end

--获取某字符所占字节数
function HtmlLabel:sizeof(firstCase)
	if (firstCase >= 0 and firstCase  <= 0x7f) then
       return 1
	elseif firstCase >= 0x80 and firstCase < 0xe0 then
		return 2
    elseif firstCase >= 0xe0 then
        return 3
    end
end 

function HtmlLabel:getSize()
    return CCSize(self._width , self._height)
end

return HtmlLabel

  

时间: 2024-10-10 03:45:42

cocos2dx-lua 简单的字体变色拼接实现的相关文章

Cocos2d-x Lua中使用标签

游戏场景中的文字包括了静态文字和动态文字.静态文字如下图所示游戏场景中①号文字“COCOS2DX”,动态文字如图4-1所示游戏场景中的②号文字“Hello World”.静态文字一般是由美工使用Photoshop绘制在背景图片上,这种方式的优点是表现力很丰富,例如:①号文字“COCOS2DX”中的“COCOS”.“2D”和“X”设计的风格不同,而动态文字则不能,而且静态文字无法通过程序访问,无法动态修改内容.动态文字一般是需要通过程序访问,需要动态修改内容.Cocos2d-x Lua可以通过标签

基于Cocos2dx+Lua v3.x的RichLabel

RichLabel 简介 RichLabel基于Cocos2dx+Lua v3.x解析字符串方面使用了labelparser,它可以将一定格式的字符串,转换为lua中的表结构扩展标签极其简单,只需添加一个遵守规则的标签插件即可,无需改动已存在代码!!! (标签插件都在labels文件夹下) labelparser的详解labelparser在github上的源码RichLabel在github上的源码 支持图片(缩放,旋转,是否可见) 支持文本属性(字体,大小,颜色,阴影,描边,发光) 支持标签

cocos2dx lua 3.10 使用cjson

本篇介绍如何在lua中使用cjson对数据进行json的encode与decode,首先简单介绍下cjson: Lua CJSON 是 Lua 语言提供高性能的 JSON 解析器和编码器,其性能比纯 Lua 库要高 10 到 20 倍. cocos2dx lua 3.10 默认目录中包含cjson文件(目录:/frameworks/cocos2d-x/external/lua),但是没有使用.而是用的json.lua进行解析json.效率低下,json字符串稍微大点,进行decode的时候就非常

Cocos2d-x Lua Node与Node层级架构

Cocos2d-x Lua Node与Node层级架构 Cocos2d-x Lua采用层级(树形)结构管理场景.层.精灵.菜单.文本.地图和粒子系统等节点(Node)对象.一个场景包含了多个层,一个层又包含多个精灵.菜单.文本.地图和粒子系统等对象.层级结构中的节点可以是场景.层.精灵.菜单.文本.地图和粒子系统等任何对象.节点的层级结构如下图所示. 节点的层级结构 这些节点有一个共同的父类Node,Node类图如下图所示.Node类是Cocos2d-x Lua最为重要的根类,它是场景.层.精灵

Cocos2d-x Lua 播放视频(iOS&amp;android)

最近刚转了游戏,来公司不久就接到一个任务就是做一个视频播放的功能,自己花了3天时间,暂时实现了一个简易的功能,特写篇博客,以作记录. 参考地址如下: http://blog.csdn.net/xiaominghimi/article/details/6870259 http://blog.csdn.net/kaitiren/article/details/11832851 http://blog.csdn.net/candyforever/article/details/8905852 实现功能

Cocos2d-x Lua中Sprite精灵类

Cocos2d-x Lua中Sprite精灵类 精灵类是Sprite,它的类图如下图所示. Sprite类图 Sprite类直接继承了Node类,具有Node基本特征.此外,我们还可以看到Sprite类的子类有:PhysicsSprite和Skin.PhysicsSprite是物理引擎精灵类,Skin是皮肤精灵类用于骨骼动画.创建Sprite精灵对象创建精灵对象有多种方式,其中常用的函数如下:cc.Sprite:create ().创建一个精灵对象,纹理[ 纹理(texture),表示物体表面细

Cocos2d-x Lua 读取Csv文件,更方便的使用数据

我的书上或者是我曾经出售的源码里,都有Csv文件的影子. 也许是先入为主吧,我工作那会用的最久的配置文件就是Csv,所以我在很多游戏里都会情不自禁地优先选择它. Csv文件,格式很简单,就是一行一条数据,字段之间用逗号分隔,策划也可以方便地使用Excel进行编辑. Csv格式的文件,解析起来也很简单,所以自己动手写写很快~(小若:我就喜欢拿来主义,你怎么着) 最近在用Lua写游戏,对于技能.怪物等配置,我还是选择用Csv~ 不得不说,Lua等脚本语言,在某些方面是C++没法比的,这次我就用Csv

cocos2d-x + Lua接入iOS原生SDK的实现方案[转]

相信很多朋友在使用cocos2d-x+lua开发游戏时都遇到过接入iOS原生SDK的问题,比如常见的接应用内支付SDK,广告SDK或是一些社交平台SDK等等,我也没少接过这类SDK.这篇文章主要是对我做过项目中接入iOS原生SDK实现方案的一个总结,在这里分享给大家,希望对自己和大家的开发工作都有帮助. 在展开正文之前,先做几点说明: 1.我这里说的iOS原生SDK是指那些完全用Objective-C语言开发,为原生iOS程序设计的SDK.swift很好很强大,不过我还没用过,惭愧,不过语言终归

cocos2d-x lua绑定解析

花了几天时间看了下cocos2d-x lua绑定那块,总算是基本搞明白了,下面分三部分解析lua绑定: 一.lua绑定主要用到的底层函数 lua绑定其本质就是有一个公用的lua_Stack来进行C和Lua之间的值传递,在路径[项目根目录]\frameworks\cocos2d-x\external\lua\luajit\include下有个lua.h文件,大部分lua绑定底层函数以及相关的常量都在这里. 1.lua堆栈常量 #define LUA_REGISTRYINDEX (-10000) /