Cocos2d-X lua 学习笔记之消息弹窗

实现游戏中需要在屏幕底部弹出消息提示弹窗,经过特定时间后渐隐消失。当有新的消息提示时,原来没有消失的弹窗会上移,并继续渐隐直至消失。

转载声明:http://blog.csdn.net/operhero1990/article/details/47165365

1、使用cocostudio建立一个最简单的弹窗界面,命名为hintFrame

设置黑底的透明度为100/255,这样能起到一个蒙版的效果。两个Label分别显示消息题目和内容。

2、创建控制弹窗的lua类脚本,命名为UI_hintFrame

local SPACING = 5

--init
function UI_hintFrame:init()
	-- data
	-- ===============================

	-- ui
	-- ===============================
	self.wigetRoot = ccs.GUIReader:getInstance():widgetFromJsonFile(config.dirUI.root .. "hintFrame.json")

	self.x, self.y = self.wigetRoot:getPosition()	--保存弹窗初始位置,方便移动完后返回原位置

	self.opacity = {}   --保存初始透明度
	for i, v in ipairs(<span style="font-family: Arial, Helvetica, sans-serif;">self.wigetRoot</span>) do
		self.opacity[i] = v:getOpacity()
	end

	self:addCCNode(self.wigetRoot)
end

function UI_hintFrame:setInfo(param_)
<pre name="code" class="plain"><span style="white-space:pre">	</span>
<span style="white-space:pre">	</span>self.wigetRoot:setVisible(false)  --先隐藏

-- 初始化你的Label显示内容endfunction UI_hintFrame:pop(callBack_) --弹窗渐隐方法 并传入回调函数local x_, y_ = self.wigetRoot:getPosition()local trigOver_ = false-- call backlocal function onActionOver()if trigOver_ == true thencclog_("not possible")returnendtrigOver_
= trueself.wigetRoot:setVisible(false)self.wigetRoot:stopAllActions()for i, v in ipairs(self.component) dov:stopAllActions()endif callBack_ ~= nil thencallBack_()endendlocal function playerAnimation()local delay_ = cc.DelayTime:create(2)local fadeOut_ = cc.FadeOut:create(1)for
i, v in ipairs(self.component) dov:runAction(cc.Sequence:create(delay_:clone(), fadeOut_:clone(), cc.CallFunc:create(onActionOver)))endendself.wigetRoot:setVisible(true)-- 透明度还原for i, v in ipairs(self.component) dov:setOpacity(self.opacity[i])end-- 位置还原self.wigetRoot:setPosition(self.x,
self.y)playerAnimation()endfunction UI_hintFrame:moveUp(pos_) --弹窗上移方法local x_, y_ = self.wigetRoot:getPosition()local sz_ = self.wigetRoot:getSize()local newY_ = sz_.height + SPACING + y_self.wigetRoot:runAction(cc.MoveTo:create(1, cc.p(x_, newY_)))end


3、创建弹窗管理脚本,命名为hintFrameMgr.lua

local hintFrameMgr = {}
local index = 1

-- 本地数据
-- ==================
hintFrameMgr.hintFrameInfoList = {}  --新的弹窗需求会先储存在此
hintFrameMgr.popedHintFrame = {}     --存储需要上移的弹窗
hintFrameMgr.hintFrames = {}         --存储可用于显示的弹窗实体

local function popNextHintFrame()
	while hintFrameMgr.hintFrameInfoList[1] ~= nil do
		if table.getn(hintFrameMgr.hintFrames) > 0 then
			local function popHintFrameOver()
				table.insert(hintFrameMgr.hintFrames, hintFrameMgr.popedHintFrame[1])
				table.remove(hintFrameMgr.popedHintFrame, 1)
				popNextHintFrame()
			end
			local ui_ = hintFrameMgr.hintFrames[1]
			if ui_:setInfo(hintFrameMgr.hintFrameInfoList[1]) then
				for i, v in ipairs(hintFrameMgr.popedHintFrame) do  --第二个弹窗需求出现时,第一个才做上移操作
					v:moveUp(pos_)
				end
				ui_:pop(popHintFrameOver)
				table.insert(hintFrameMgr.popedHintFrame, ui_)
				table.remove(hintFrameMgr.hintFrames, 1)
			end
			table.remove(hintFrameMgr.hintFrameInfoList, 1)
		else
			break
		end
	end
end

-- 全局方法
-- ==================
function hintFrameMgr.popHintFrame(param_)  --提交新的弹窗需求
	table.insert(hintFrameMgr.hintFrameInfoList, param_)
	popNextHintFrame()
end

function hintFrameMgr.attachHintFrame(uis_)  --初始化弹窗实例
	hintFrameMgr.hintFrames = uis_
	hintFrameMgr.popedHintFrame = {}
end

function hintFrameMgr.detachHintFrame()
end

return hintFrameMgr

3、在scene中调用UI_hintFrame和hintFrameMgr类,进行初始化

	local HINT_MAX_FRAMES = 3  --一次显示最多弹窗数

	self.hintFrames = {}
	for i = 1, HINT_MAX_FRAMES do
		local ui_ = UI_hintFrame.new()
		self:addMsgUI(ui_.layer)
		self.hintFrames[i] = ui_
	end
	self.hintFrameMgr = require("obj/hintFrameMgr")
	self.hintFrameMgr.attachHintFrame(self.hintFrames) --调用hintFrameMgr初始化HINT_MAX_FRAMES个弹窗实例

4、在scene中提交弹窗需求

hintFrameMgr.popHintFrame(param_)

5、代码逻辑

UI_hintFrame:读取hintFrame.json,获得UI实体。并实现上移和渐隐方法

hintFrameMgr:提供方法attachHintFrame将UI实体存储在hintFrames表中。每次有新的弹窗需求,会从hintFrames提取一个实体并初始化显示信息

提供方法popHintFrame接收新的弹窗需求,并调用私有方法popNextHintFrame来实现多个弹窗显示逻辑:

1、新的弹窗需求先存储在hintFrameInfoList中。

2、从hintFrameInfoList提取一个需求,从hintFrames取出一个实例并初始化显示。

3、执行渐隐效果。

4、压入popedHintFrame中。

由于第一个弹窗不需要移动,所以没有调用上移方法。当有新的弹窗需求到来时,重复步骤1~3,执行popedHintFrame弹窗的上移方法,最后执行步骤4。这样整个显示逻辑就完整了

6、显示效果展示

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-07 04:26:22

Cocos2d-X lua 学习笔记之消息弹窗的相关文章

Lua学习笔记(七):迭代器与泛型for

1.迭代器与闭包 迭代器是一种支持指针类型的结构,它可以遍历集合的每一个元素.在Lua中我们常常使用函数来描述迭代器,每次调用该函数就返回集合的下一个元素. 迭代器需要保留上一次成功调用的状态和下一次成功调用的状态,也就是他知道来自于哪里和将要前往哪里.闭包提供的机制可以很容易实现这个任务.记住:闭包是一个内部函数,它可以访问一个或者多个外部函数的外部局部变量.每次闭包的成功调用后这些外部局部变量都保存他们的值(状态).当然如果要创建一个闭包必须要创建其外部局部变量.所以一个典型的闭包的结构包含

Lua学习笔记9:多文件

一 终端中执行多个文件:-l 加入在文件一中定义了一个变量,在另一文件中输出这个变量,代码如下: --file1.lua num = 100 --file2.lua print(num) 终端输入(注意:不是lua命令行): lua -lfile1 -lfile2 注意:不要加上文件后缀名.lua 二 命令行中加载文件 --lib.lua function norm(x, y) local n2 = x^2 + y^2 return math.sqrt(n2) end function twic

lua学习笔记10:lua简单命令行

前面多次用了命令行,这次就好好学下命令行: 一 格式 lua [options][script][args] 二 具体命令 -e 直接将命令传个lua -l 加载一个文件 -i 进入交互模式 例如,终端输入: lua -e "print(math.sin(12))" lua学习笔记10:lua简单命令行,布布扣,bubuko.com

lua学习笔记11:lua中的小技巧

lua中的小技巧,即基础lua语言本身的特种,进行一个些简化的操作 一 巧用or x = x or v 等价于: if not x then x = v end 如果x为nil或false,就给他赋值为 二 三元运算符实现 a and b or c 类似C语言: a ? b : c and 的运算由优先级高于or lua学习笔记11:lua中的小技巧,布布扣,bubuko.com

Lua学习笔记(三):表的构造

构造器是创建和初始化表的表达式.表是Lua特有的功能强大的东西.最简单的构造函数是{},用来创建一个空表.可以直接初始化数组: 1 days = {"Sunday", "Monday", "Tuesday", "Wednesday", 2 "Thursday", "Friday", "Saturday"} Lua将“Sunday”初始化days[1](第一个元素索引为

lua学习笔记之基本语法

Lua学习笔记之基本语法 1.  赋值语句 赋值是改变一个变量的值和改变表域的最基本的方法. a = "hello".."world" t.n = t.n+1 lua可以对多个变量同时赋值,变量列表和值列表的各个元素用逗号分开,赋值语句右边的值会一次赋给左边的变量. a,b = 10,2*x    <-->a = 10;b = 2*x 遇到赋值语句lua会先计算右边所有的值然后再执行赋值操纵,所以我们可以这样进行交换变量的值: x,y = y,x    

lua学习笔记之函数

Lua学习笔记之函数 1.  函数的作用 函数主要完成指定的任务,这样的情况下函数作为调用语句使用,函数可以计算并返回值,这样的情况下函数作为赋值语句的表达式使用. 语法: funcationfunc_name(arguments-list) Statements-list end 调用函数的时候,如果参数列表为空,必须使用()表示是函数调用. Print(8*9,9/8) a = math.sin(3) +math.cos(10) print(os.date()) 上述规则有一个例外,当函数只

Lua学习笔记(2) —— 风格

前一篇大概学习了lua常用的语法,都是些刚入门时应该了解的.见这里 Lua学习笔记(1) ——语法 这篇主要记录一些关于lua代码风格的经验,如果不了解它们,还是拿着函数式或传统面向对象的风格去写lua,就永远无法了解lua的精华之所在,弃之所长,取其所短. 1. 函数类型的变量 2. 匿名函数 3. 闭包 4. 表 5. 协程 6. 虚拟机

lua学习笔记之类型和值

Lua学习笔记之类型和值 1.全局变量 全局变量不需要声明,给一个变量赋值后即创建了这个全局变量,访问一个没有初始化的全局变量也不会出错,只不过得到的结果是:nil 如果需要删除一个全局变量,只需要将变量赋值为nil 2.词法约定 标识符:字母或者下划线开头的字母.下划线.数字序列,最好不要使用下划线家大写字母的标识符,因为lua的保留字也是这样的. 3.命令行方式 Lua[options][script[args]] -e:直接将命令传入lua Prompt>lua –e "print(