@@ -0,0 +1,398 @@ | |||
require("EditorGlobalFunction") | |||
local AlignTool = class("AlignTool") | |||
function AlignTool:ctor() | |||
end | |||
-- 计算最左边 | |||
local function calcLeft() | |||
local minX = 65536; | |||
for i , v in pairs(app.editor.SelectedNodes) do | |||
local node = v; | |||
minX = math.min(minX , node:getWorldPositionX() - node:getAnchorPoint().x * node:getContentSize().width * node:getScaleX()); | |||
end | |||
return minX; | |||
end | |||
-- 计算最右边 | |||
local function calcRight() | |||
local maxX = 0; | |||
for i , v in pairs(app.editor.SelectedNodes) do | |||
local node = v; | |||
maxX = math.max(maxX , node:getWorldPositionX() + (1 - node:getAnchorPoint().x) * node:getContentSize().width * node:getScaleX()); | |||
end | |||
return maxX; | |||
end | |||
-- 计算最上边 | |||
local function calcTop() | |||
local maxY = 0; | |||
for i , v in pairs(app.editor.SelectedNodes) do | |||
local node = v; | |||
maxY = math.max(maxY , node:getWorldPositionY() + (1 - node:getAnchorPoint().y) * node:getContentSize().height * node:getScaleY()); | |||
end | |||
return maxY; | |||
end | |||
-- 计算最下边 | |||
local function calcBottom() | |||
local minY = 65536; | |||
for i , v in pairs(app.editor.SelectedNodes) do | |||
local node = v; | |||
minY = math.min(minY , node:getWorldPositionY() - node:getAnchorPoint().y * node:getContentSize().height * node:getScaleY()); | |||
end | |||
return minY; | |||
end | |||
-- 获得所有选中元素的总宽高 | |||
local function calcAllSize() | |||
local size = cc.size(0,0); | |||
for i , v in pairs(app.editor.SelectedNodes) do | |||
local node = v; | |||
local s = node:getSize(); | |||
size.width = size.width + s.width; | |||
size.height = size.height + s.height; | |||
end | |||
return size; | |||
end | |||
-- 获得最后一个选中的节点 | |||
local function getLastSelectedNode() | |||
local node; | |||
for i , v in pairs(app.editor.SelectedNodes) do | |||
if node == nil or v.SelectedIndex > node.SelectedIndex then | |||
node = v; | |||
end | |||
end | |||
return node; | |||
end | |||
function AlignTool:AlignLeft() | |||
local minX = calcLeft(); | |||
local commands = {}; | |||
for i , v in pairs(app.editor.SelectedNodes) do | |||
local node = v; | |||
local pos = node:getWorldPosition(); | |||
pos.x = minX + node:getAnchorPoint().x * node:getContentSize().width * node:getScaleX(); | |||
table.insert(commands, Commands:setWorldPosition(node, pos)); | |||
end | |||
app.undoRedoManager:doCommand(Commands:batchCommand(commands)); | |||
end | |||
function AlignTool:AlignCenter() | |||
local minX = calcLeft(); | |||
local maxX = calcRight(); | |||
local width = maxX - minX; | |||
local center = minX + width / 2; | |||
local commands = {}; | |||
for i , v in pairs(app.editor.SelectedNodes) do | |||
local node = v; | |||
local offsetX = center - (node:getWorldPositionX() - node:getAnchorPoint().x * node:getContentSize().width * node:getScaleX() + node:getContentSize().width * node:getScaleX() / 2); | |||
local pos = node:getWorldPosition(); | |||
pos.x = node:getWorldPositionX() + offsetX; | |||
table.insert(commands, Commands:setWorldPosition(node, pos)); | |||
end | |||
app.undoRedoManager:doCommand(Commands:batchCommand(commands)); | |||
end | |||
function AlignTool:AlignRight() | |||
local maxX = calcRight(); | |||
local commands = {}; | |||
for i , v in pairs(app.editor.SelectedNodes) do | |||
local node = v; | |||
local pos = node:getWorldPosition(); | |||
pos.x = maxX - node:getContentSize().width * node:getScaleX() + node:getAnchorPoint().x * node:getContentSize().width * node:getScaleX(); | |||
table.insert(commands, Commands:setWorldPosition(node, pos)); | |||
end | |||
app.undoRedoManager:doCommand(Commands:batchCommand(commands)); | |||
end | |||
function AlignTool:AlignTop() | |||
local maxY = calcTop(); | |||
local commands = {}; | |||
for i , v in pairs(app.editor.SelectedNodes) do | |||
local node = v; | |||
local pos = node:getWorldPosition(); | |||
pos.y = maxY - node:getContentSize().height * node:getScaleY() + node:getAnchorPoint().y * node:getContentSize().height * node:getScaleY(); | |||
table.insert(commands, Commands:setWorldPosition(node, pos)); | |||
end | |||
app.undoRedoManager:doCommand(Commands:batchCommand(commands)); | |||
end | |||
function AlignTool:AlignMiddle() | |||
local minY = calcBottom(); | |||
local maxY = calcTop(); | |||
local height = maxY - minY; | |||
local middle = minY + height / 2; | |||
local commands = {}; | |||
for i , v in pairs(app.editor.SelectedNodes) do | |||
local node = v; | |||
local offsetY = middle - (node:getWorldPositionY() - node:getAnchorPoint().y * node:getContentSize().height * node:getScaleY() + node:getContentSize().height * node:getScaleY() / 2); | |||
local pos = node:getWorldPosition(); | |||
pos.y = node:getWorldPositionY() + offsetY; | |||
table.insert(commands, Commands:setWorldPosition(node, pos)); | |||
end | |||
app.undoRedoManager:doCommand(Commands:batchCommand(commands)); | |||
end | |||
function AlignTool:AlignBottom() | |||
local minY = calcBottom(); | |||
local commands = {}; | |||
for i , v in pairs(app.editor.SelectedNodes) do | |||
local node = v; | |||
local offsetY = minY - (node:getWorldPositionY() - node:getAnchorPoint().y * node:getContentSize().height * node:getScaleY()); | |||
local pos = node:getWorldPosition(); | |||
pos.y = node:getWorldPositionY() + offsetY; | |||
table.insert(commands, Commands:setWorldPosition(node, pos)); | |||
end | |||
app.undoRedoManager:doCommand(Commands:batchCommand(commands)); | |||
end | |||
function AlignTool:SameWidth() | |||
local lastNode = getLastSelectedNode(); | |||
if not lastNode then | |||
return; | |||
end | |||
local width = lastNode:getSize().width; | |||
local commands = {}; | |||
for i , v in pairs(app.editor.SelectedNodes) do | |||
local size = v:getSize(); | |||
size.width = width; | |||
table.insert(commands, Commands:sizeNode(v, size)); | |||
end | |||
app.undoRedoManager:doCommand(Commands:batchCommand(commands)); | |||
end | |||
function AlignTool:SameHeight() | |||
local lastNode = getLastSelectedNode(); | |||
if not lastNode then | |||
return; | |||
end | |||
local height = lastNode:getSize().height; | |||
local commands = {}; | |||
for i , v in pairs(app.editor.SelectedNodes) do | |||
local size = v:getSize(); | |||
size.height = height; | |||
table.insert(commands, Commands:sizeNode(v, size)); | |||
end | |||
app.undoRedoManager:doCommand(Commands:batchCommand(commands)); | |||
end | |||
function AlignTool:SameSize() | |||
local lastNode = getLastSelectedNode(); | |||
if not lastNode then | |||
return; | |||
end | |||
local commands = {}; | |||
for i , v in pairs(app.editor.SelectedNodes) do | |||
table.insert(commands, Commands:sizeNode(v, lastNode:getSize())); | |||
end | |||
app.undoRedoManager:doCommand(Commands:batchCommand(commands)); | |||
end | |||
function AlignTool:SameHorzSpace() | |||
local count = table.nums(app.editor.SelectedNodes); | |||
if count < 3 then | |||
return; | |||
end | |||
local allSize = calcAllSize(); | |||
local left = calcLeft(); | |||
local right = calcRight(); | |||
-- 计算间距 | |||
local space = 0; | |||
if allSize.width > right - left then | |||
space = 0; | |||
else | |||
space = ((right - left) - allSize.width) / (count - 1); | |||
end | |||
-- 计算顺序 | |||
local nodes = {}; | |||
for i , v in pairs(app.editor.SelectedNodes) do | |||
table.insert(nodes, v); | |||
end | |||
-- 从左到右排序 | |||
table.sort(nodes , function(a,b)return a:getWorldPositionX() - a:getAnchorPoint().x * a:getContentSize().width * a:getScaleX() < b:getWorldPositionX() - b:getAnchorPoint().x * b:getContentSize().width * a:getScaleX();end); | |||
local commands = {}; | |||
local posX = left; | |||
for i , node in ipairs(nodes) do | |||
local pos = node:getWorldPosition(); | |||
pos.x = posX + node:getAnchorPoint().x * node:getContentSize().width * node:getScaleX(); | |||
posX = posX + space + node:getSize().width; | |||
table.insert(commands, Commands:setWorldPosition(node, pos)); | |||
end | |||
app.undoRedoManager:doCommand(Commands:batchCommand(commands)); | |||
end | |||
function AlignTool:AddHorzSpace() | |||
end | |||
function AlignTool:SubHorzSpace() | |||
end | |||
function AlignTool:NoHorzSpace() | |||
end | |||
function AlignTool:SameVertSpace() | |||
local count = table.nums(app.editor.SelectedNodes); | |||
if count < 3 then | |||
return; | |||
end | |||
local allSize = calcAllSize(); | |||
local bottom = calcBottom(); | |||
local top = calcTop(); | |||
-- 计算间距 | |||
local space = 0; | |||
if allSize.height > top - bottom then | |||
space = 0; | |||
else | |||
space = ((top - bottom) - allSize.height) / (count - 1); | |||
end | |||
-- 计算顺序 | |||
local nodes = {}; | |||
for i , v in pairs(app.editor.SelectedNodes) do | |||
table.insert(nodes, v); | |||
end | |||
-- 从左到右排序 | |||
table.sort(nodes , function(a,b)return a:getWorldPositionY() - a:getAnchorPoint().y * a:getContentSize().height * a:getScaleY() < b:getWorldPositionY() - b:getAnchorPoint().y * b:getContentSize().height * a:getScaleY();end); | |||
local commands = {}; | |||
local posY = bottom; | |||
for i , node in ipairs(nodes) do | |||
local pos = node:getWorldPosition(); | |||
pos.y = posY + node:getAnchorPoint().y * node:getContentSize().height * node:getScaleY(); | |||
posY = posY + space + node:getSize().height; | |||
table.insert(commands, Commands:setWorldPosition(node, pos)); | |||
end | |||
app.undoRedoManager:doCommand(Commands:batchCommand(commands)); | |||
end | |||
function AlignTool:AddVertSpace() | |||
end | |||
function AlignTool:SubVertSpace() | |||
end | |||
function AlignTool:NoVertSpace() | |||
end | |||
function AlignTool:HorzCenter() | |||
local left = calcLeft(); | |||
local right = calcRight(); | |||
local size = app.setting.ResourceSize; | |||
local minX = (size.width - (right - left)) / 2; | |||
local commands = {}; | |||
for i , v in pairs(app.editor.SelectedNodes) do | |||
local node = v; | |||
local pos = node:getWorldPosition(); | |||
pos.x = minX + ((node:getWorldPositionX() - node:getAnchorPoint().x * node:getContentSize().width * node:getScaleX()) - left); | |||
table.insert(commands, Commands:setWorldPosition(node, pos)); | |||
end | |||
app.undoRedoManager:doCommand(Commands:batchCommand(commands)); | |||
end | |||
function AlignTool:VertCenter() | |||
local bottom = calcBottom(); | |||
local top = calcTop(); | |||
local size = app.setting.ResourceSize; | |||
local minY = (size.height - (top - bottom)) / 2; | |||
local commands = {}; | |||
for i , v in pairs(app.editor.SelectedNodes) do | |||
local node = v; | |||
local pos = node:getWorldPosition(); | |||
pos.y = minY + ((node:getWorldPositionY() - node:getAnchorPoint().y * node:getContentSize().height * node:getScaleY()) - bottom); | |||
table.insert(commands, Commands:setWorldPosition(node, pos)); | |||
end | |||
app.undoRedoManager:doCommand(Commands:batchCommand(commands)); | |||
end | |||
function AlignTool:MoveUp() | |||
local lastNode = getLastSelectedNode(); | |||
if not lastNode then | |||
return; | |||
end | |||
local children = lastNode:getParent():getChildren(); | |||
local node; | |||
for i , v in ipairs(children) do | |||
if v == lastNode then | |||
node = children[i - 1]; | |||
break; | |||
end | |||
end | |||
if node and node ~= lastNode then | |||
app.undoRedoManager:doCommand(Commands:swapNode(lastNode, node)) | |||
end | |||
end | |||
function AlignTool:MoveDown() | |||
local lastNode = getLastSelectedNode(); | |||
if not lastNode then | |||
return; | |||
end | |||
local children = lastNode:getParent():getChildren(); | |||
local node; | |||
for i , v in ipairs(children) do | |||
if v == lastNode then | |||
node = children[i + 1]; | |||
break; | |||
end | |||
end | |||
if node and node ~= lastNode then | |||
app.undoRedoManager:doCommand(Commands:swapNode(lastNode, node)) | |||
end | |||
end | |||
function AlignTool:MoveTop() | |||
local lastNode = getLastSelectedNode(); | |||
if not lastNode then | |||
return; | |||
end | |||
local children = lastNode:getParent():getChildren(); | |||
local node = children[1]; | |||
if node and node ~= lastNode then | |||
local commands = {}; | |||
local found = false; | |||
for i = #children , 1 , -1 do | |||
local child = children[i]; | |||
if found then | |||
print("交换一个"); | |||
table.insert(commands, Commands:swapNode(child, lastNode)); | |||
end | |||
if child == lastNode then | |||
found = true; | |||
end | |||
end | |||
app.undoRedoManager:doCommand(Commands:batchCommand(commands)); | |||
end | |||
end | |||
function AlignTool:MoveBottom() | |||
local lastNode = getLastSelectedNode(); | |||
if not lastNode then | |||
return; | |||
end | |||
local children = lastNode:getParent():getChildren(); | |||
local node = children[#children]; | |||
if node and node ~= lastNode then | |||
local commands = {}; | |||
local found = false; | |||
for i = 1 , #children do | |||
local child = children[i]; | |||
if found then | |||
table.insert(commands, Commands:swapNode(child, lastNode)); | |||
end | |||
if child == lastNode then | |||
found = true; | |||
end | |||
end | |||
app.undoRedoManager:doCommand(Commands:batchCommand(commands)); | |||
end | |||
end | |||
return AlignTool; |
@@ -0,0 +1,137 @@ | |||
require("Editor.CompileFile") | |||
require("luaScript.Tools.Widgets.UIWidget") | |||
-- 收集languageCN.lua里的语言 | |||
local function collectLanguages(transDict) | |||
local Languages = require("languageCN"); | |||
local newLn = {}; | |||
for i , v in pairs(Languages) do | |||
print("收集Lang文本" , v); | |||
local translated = transDict[XmlTranslator:collect(v)]; | |||
if translated then | |||
newLn[i] = XmlTranslator:translate(v , translated); | |||
else | |||
newLn[i] = v; | |||
end | |||
end | |||
for i , v in pairs(newLn) do | |||
Languages[i] = v; | |||
end | |||
table.saveFile(Languages , "luaScript/Config/Languages/languageEN.lua"); | |||
end | |||
-- 收集一个语言片 | |||
local function collectConfig(transDict , record , fieldName , translator) | |||
local v = record[fieldName]; | |||
if v then | |||
local translated = transDict[translator:collect(v)]; | |||
if translated then | |||
record[fieldName] = translator:translate(v , translated); | |||
end | |||
end | |||
end | |||
-- 收集一个配置 | |||
local function collectLanguageConfig(transDict , config) | |||
local desc = config:getConfigDesc(); | |||
print("正在收集配置的语言:" , desc.XMLFile); | |||
if desc.Translation then | |||
for i , v in pairs(desc.Translation) do | |||
print("正在收集字段:" , i); | |||
for ii , vv in pairs(config) do | |||
if desc.SecondKeyName then | |||
for iii , vvv in pairs(vv) do | |||
collectConfig(transDict , vvv , i , v); | |||
end | |||
else | |||
collectConfig(transDict , vv , i , v); | |||
end | |||
end | |||
end | |||
saveLuaXMLConfig(config , desc, "dataconfig/" .. desc.XMLFile .. ".lua"); | |||
end | |||
end | |||
-- 收集一个ui | |||
local function collectSingleUI(transDict , ui) | |||
if ui.applyDict then | |||
ui:applyDict(transDict); | |||
end | |||
end | |||
-- 收集一个ui | |||
local function collectUI(transDict , ui) | |||
collectSingleUI(transDict , ui); | |||
-- 递归所有子 | |||
for i , v in pairs(ui:getChildren()) do | |||
collectUI(transDict , v); | |||
end | |||
end | |||
-- 收集所有UI的语言 | |||
local function collectUILanguage(transDict) | |||
local function saveui(fileName) | |||
-- 返回pathName , baseName , ext | |||
local pathName , baseName , ext = string.splitFilename(fileName); | |||
print(pathName , baseName , ext); | |||
if ext ~= "ui" then | |||
return false; | |||
end | |||
print("\n\n"); | |||
print("正在加载UI:" , fileName); | |||
local ui = cc.StreamObject:loadFromFile(fileName); | |||
collectUI(transDict , ui); | |||
ui:recalcAllPList(); | |||
ui:saveToFile(fileName); | |||
end | |||
visitPath("res/ui" , saveui); | |||
end | |||
-- 载入字典文件,返回字典表 | |||
local function loadDict(dictFile) | |||
local dict = {}; | |||
local function onStartElement(name , atts) | |||
if name == "item" then | |||
dict[atts.source] = atts.target; | |||
end | |||
end | |||
local result , err = tiny.load(dictFile , onStartElement); | |||
if not result then | |||
error(err); | |||
end | |||
return dict; | |||
end | |||
-- 生成所有语言 | |||
function applyDict(dictFile) | |||
-- initialize director | |||
local director = cc.Director:getInstance(); | |||
local glview = director:getOpenGLView(); | |||
if not glview then | |||
glview = cc.GLView:createWithRect("applyDict", {x=0,y=0,width=100,height=100}); | |||
director:setOpenGLView(glview); | |||
end | |||
local transDict = loadDict(dictFile) | |||
-- 加载xml | |||
loadAllXML() | |||
-- 生成所有配置的语言 | |||
for i , v in pairs(app.config) do | |||
if i ~= "Setting" and i ~= "RomSetting" then | |||
local desc = v:getConfigDesc(); | |||
local filename = desc.XMLFile; | |||
collectLanguageConfig(transDict , v); | |||
end | |||
end | |||
-- 收集languageCN.lua里的语言 | |||
collectLanguages(transDict); | |||
collectUILanguage(transDict); | |||
end |
@@ -0,0 +1,29 @@ | |||
-- 画鼠标框选的时候那个白框 | |||
cc.BoxNode = { | |||
} | |||
function cc.BoxNode:create() | |||
local glNode = gl.glNodeCreate() | |||
glNode:setAnchorPoint(cc.p(0.5, 0.5)) | |||
local function primitivesDraw(transform, transformUpdated) | |||
-- 绑定相机、世界矩阵 | |||
cc.DrawPrimitives.setCamera(cc.Director:getInstance():getFixedCamera()); | |||
cc.DrawPrimitives.setWorldTransform(cc.Mat4:identity()); | |||
-- 画矩形 | |||
gl.lineWidth( 1 ) | |||
cc.DrawPrimitives.drawColor4B(255, 255, 255, 255) | |||
cc.DrawPrimitives.drawRect(glNode.startPos, glNode.endPos) | |||
-- 状态恢复 | |||
gl.lineWidth(1) | |||
cc.DrawPrimitives.drawColor4B(255,255,255,255) | |||
cc.DrawPrimitives.setPointSize(1) | |||
end | |||
glNode:registerScriptDrawHandler(primitivesDraw) | |||
return glNode | |||
end |
@@ -0,0 +1,57 @@ | |||
-- 被选择节点显示高亮框 | |||
cc.RectNode = { | |||
} | |||
function cc.RectNode:create(node) | |||
local glNode = gl.glNodeCreate() | |||
glNode:setAnchorPoint(cc.p(0.5, 0.5)) | |||
function glNode:setNode(node) | |||
local function onNodeEvent(node , eventType) | |||
if eventType == cc.NodeEvent.OnExit then | |||
if self.Node == node then | |||
self.Node = nil; | |||
end | |||
end | |||
end | |||
if node then | |||
node:addNodeEventListener(onNodeEvent) | |||
end | |||
self.Node = node; | |||
end | |||
glNode:setNode(node) | |||
local material3d = cc.MaterialCache:getInstance():load("core/preload/shaders/ccDefault.material#ShaderPosition_uColor3D"); | |||
cc.Default2DMaterials:getInstance():bindValue(material3d:getParameter("CC_MVPMatrix") , "WORLD_VIEW_PROJECTION_MATRIX"); | |||
local function primitivesDraw(transform, transformUpdated) | |||
local node = glNode.Node; | |||
if not tolua.isnull(node) then | |||
cc.DrawPrimitives.setMaterial(material3d); | |||
-- 绑定相机、世界矩阵 | |||
cc.DrawPrimitives.setCamera(node:getActiveCamera()); | |||
cc.DrawPrimitives.setWorldTransform(cc.Mat4:identity()); | |||
-- 画矩形 | |||
gl.lineWidth( 1 ) | |||
cc.DrawPrimitives.drawColor4B(0, 255, 0, 255) | |||
cc.DrawPrimitives.drawBoundingBox(node:getSelectBox()) | |||
-- 状态恢复 | |||
gl.lineWidth(1) | |||
cc.DrawPrimitives.drawColor4B(255,255,255,255) | |||
cc.DrawPrimitives.setPointSize(1) | |||
-- 材质状态恢复 | |||
cc.DrawPrimitives.setCamera(nil); | |||
cc.DrawPrimitives.setMaterial(nil); | |||
end | |||
end | |||
glNode:registerScriptDrawHandler(primitivesDraw) | |||
return glNode | |||
end | |||
@@ -0,0 +1,808 @@ | |||
MouseButtons = | |||
{ | |||
-- 摘要: | |||
-- 未曾按下鼠标按钮。 | |||
None = 0, | |||
-- | |||
-- 摘要: | |||
-- 鼠标左按钮曾按下。 | |||
Left = 1048576, | |||
-- | |||
-- 摘要: | |||
-- 鼠标右按钮曾按下。 | |||
Right = 2097152, | |||
-- | |||
-- 摘要: | |||
-- 鼠标中按钮曾按下。 | |||
Middle = 4194304, | |||
-- | |||
-- 摘要: | |||
-- 第 1 个 XButton 曾按下。 | |||
XButton1 = 8388608, | |||
-- | |||
-- 摘要: | |||
-- 第 2 个 XButton 曾按下。 | |||
XButton2 = 16777216, | |||
} | |||
-- 摘要: | |||
-- 指定键代码和修饰符。 | |||
Keys = | |||
{ | |||
-- 摘要: | |||
-- 从键值提取修饰符的位屏蔽。 | |||
Modifiers = -65536, | |||
-- | |||
-- 摘要: | |||
-- 没有按任何键。 | |||
None = 0, | |||
-- | |||
-- 摘要: | |||
-- 鼠标左按钮。 | |||
LButton = 1, | |||
-- | |||
-- 摘要: | |||
-- 鼠标右按钮。 | |||
RButton = 2, | |||
-- | |||
-- 摘要: | |||
-- Cancel 键。 | |||
Cancel = 3, | |||
-- | |||
-- 摘要: | |||
-- 鼠标中按钮(三个按钮的鼠标)。 | |||
MButton = 4, | |||
-- | |||
-- 摘要: | |||
-- 第一个 X 鼠标按钮(五个按钮的鼠标)。 | |||
XButton1 = 5, | |||
-- | |||
-- 摘要: | |||
-- 第二个 X 鼠标按钮(五个按钮的鼠标)。 | |||
XButton2 = 6, | |||
-- | |||
-- 摘要: | |||
-- Backspace 键。 | |||
Back = 8, | |||
-- | |||
-- 摘要: | |||
-- The TAB key. | |||
Tab = 9, | |||
-- | |||
-- 摘要: | |||
-- LINEFEED 键。 | |||
LineFeed = 10, | |||
-- | |||
-- 摘要: | |||
-- Clear 键。 | |||
Clear = 12, | |||
-- | |||
-- 摘要: | |||
-- Enter 键。 | |||
Enter = 13, | |||
-- | |||
-- 摘要: | |||
-- Return 键。 | |||
Return = 13, | |||
-- | |||
-- 摘要: | |||
-- Shift 键。 | |||
ShiftKey = 16, | |||
-- | |||
-- 摘要: | |||
-- The CTRL key. | |||
ControlKey = 17, | |||
-- | |||
-- 摘要: | |||
-- Alt 键。 | |||
Menu = 18, | |||
-- | |||
-- 摘要: | |||
-- Pause 键。 | |||
Pause = 19, | |||
-- | |||
-- 摘要: | |||
-- The CAPS LOCK key. | |||
CapsLock = 20, | |||
-- | |||
-- 摘要: | |||
-- The CAPS LOCK key. | |||
Capital = 20, | |||
-- | |||
-- 摘要: | |||
-- IME Kana 模式键。 | |||
KanaMode = 21, | |||
-- | |||
-- 摘要: | |||
-- IME Hanguel 模式键。(为了保持兼容性而设置;使用 HangulMode) | |||
HanguelMode = 21, | |||
-- | |||
-- 摘要: | |||
-- IME Hangul 模式键。 | |||
HangulMode = 21, | |||
-- | |||
-- 摘要: | |||
-- IME Junja 模式键。 | |||
JunjaMode = 23, | |||
-- | |||
-- 摘要: | |||
-- IME 最终模式键。 | |||
FinalMode = 24, | |||
-- | |||
-- 摘要: | |||
-- IME Kanji 模式键。 | |||
KanjiMode = 25, | |||
-- | |||
-- 摘要: | |||
-- IME Hanja 模式键。 | |||
HanjaMode = 25, | |||
-- | |||
-- 摘要: | |||
-- The ESC key. | |||
Escape = 27, | |||
-- | |||
-- 摘要: | |||
-- IME 转换键。 | |||
IMEConvert = 28, | |||
-- | |||
-- 摘要: | |||
-- IME 非转换键。 | |||
IMENonconvert = 29, | |||
-- | |||
-- 摘要: | |||
-- IME 接受键。已过时,请改用 System.Windows.Forms.Keys.IMEAccept。 | |||
IMEAceept = 30, | |||
-- | |||
-- 摘要: | |||
-- IME 接受键,替换 System.Windows.Forms.Keys.IMEAceept。 | |||
IMEAccept = 30, | |||
-- | |||
-- 摘要: | |||
-- IME 模式更改键。 | |||
IMEModeChange = 31, | |||
-- | |||
-- 摘要: | |||
-- 空格键。 | |||
Space = 32, | |||
-- | |||
-- 摘要: | |||
-- The PAGE UP key. | |||
Prior = 33, | |||
-- | |||
-- 摘要: | |||
-- The PAGE UP key. | |||
PageUp = 33, | |||
-- | |||
-- 摘要: | |||
-- The PAGE DOWN key. | |||
Next = 34, | |||
-- | |||
-- 摘要: | |||
-- The PAGE DOWN key. | |||
PageDown = 34, | |||
-- | |||
-- 摘要: | |||
-- The END key. | |||
End = 35, | |||
-- | |||
-- 摘要: | |||
-- The HOME key. | |||
Home = 36, | |||
-- | |||
-- 摘要: | |||
-- 向左键。 | |||
Left = 37, | |||
-- | |||
-- 摘要: | |||
-- 向上键。 | |||
Up = 38, | |||
-- | |||
-- 摘要: | |||
-- 向右键。 | |||
Right = 39, | |||
-- | |||
-- 摘要: | |||
-- 向下键。 | |||
Down = 40, | |||
-- | |||
-- 摘要: | |||
-- Select 键。 | |||
Select = 41, | |||
-- | |||
-- 摘要: | |||
-- Print 键。 | |||
Print = 42, | |||
-- | |||
-- 摘要: | |||
-- EXECUTE 键。 | |||
Execute = 43, | |||
-- | |||
-- 摘要: | |||
-- Print Screen 键。 | |||
PrintScreen = 44, | |||
-- | |||
-- 摘要: | |||
-- Print Screen 键。 | |||
Snapshot = 44, | |||
-- | |||
-- 摘要: | |||
-- The INS key. | |||
Insert = 45, | |||
-- | |||
-- 摘要: | |||
-- The DEL key. | |||
Delete = 46, | |||
-- | |||
-- 摘要: | |||
-- The HELP key. | |||
Help = 47, | |||
-- | |||
-- 摘要: | |||
-- The 0 key. | |||
D0 = 48, | |||
-- | |||
-- 摘要: | |||
-- The 1 key. | |||
D1 = 49, | |||
-- | |||
-- 摘要: | |||
-- The 2 key. | |||
D2 = 50, | |||
-- | |||
-- 摘要: | |||
-- The 3 key. | |||
D3 = 51, | |||
-- | |||
-- 摘要: | |||
-- The 4 key. | |||
D4 = 52, | |||
-- | |||
-- 摘要: | |||
-- The 5 key. | |||
D5 = 53, | |||
-- | |||
-- 摘要: | |||
-- The 6 key. | |||
D6 = 54, | |||
-- | |||
-- 摘要: | |||
-- The 7 key. | |||
D7 = 55, | |||
-- | |||
-- 摘要: | |||
-- The 8 key. | |||
D8 = 56, | |||
-- | |||
-- 摘要: | |||
-- The 9 key. | |||
D9 = 57, | |||
-- | |||
-- 摘要: | |||
-- A 键。 | |||
A = 65, | |||
-- | |||
-- 摘要: | |||
-- B 键。 | |||
B = 66, | |||
-- | |||
-- 摘要: | |||
-- C 键。 | |||
C = 67, | |||
-- | |||
-- 摘要: | |||
-- D 键。 | |||
D = 68, | |||
-- | |||
-- 摘要: | |||
-- E 键。 | |||
E = 69, | |||
-- | |||
-- 摘要: | |||
-- F 键。 | |||
F = 70, | |||
-- | |||
-- 摘要: | |||
-- G 键。 | |||
G = 71, | |||
-- | |||
-- 摘要: | |||
-- H 键。 | |||
H = 72, | |||
-- | |||
-- 摘要: | |||
-- I 键。 | |||
I = 73, | |||
-- | |||
-- 摘要: | |||
-- J 键。 | |||
J = 74, | |||
-- | |||
-- 摘要: | |||
-- K 键。 | |||
K = 75, | |||
-- | |||
-- 摘要: | |||
-- L 键。 | |||
L = 76, | |||
-- | |||
-- 摘要: | |||
-- M 键。 | |||
M = 77, | |||
-- | |||
-- 摘要: | |||
-- N 键。 | |||
N = 78, | |||
-- | |||
-- 摘要: | |||
-- O 键。 | |||
O = 79, | |||
-- | |||
-- 摘要: | |||
-- P 键。 | |||
P = 80, | |||
-- | |||
-- 摘要: | |||
-- Q 键。 | |||
Q = 81, | |||
-- | |||
-- 摘要: | |||
-- R 键。 | |||
R = 82, | |||
-- | |||
-- 摘要: | |||
-- S 键。 | |||
S = 83, | |||
-- | |||
-- 摘要: | |||
-- T 键。 | |||
T = 84, | |||
-- | |||
-- 摘要: | |||
-- U 键。 | |||
U = 85, | |||
-- | |||
-- 摘要: | |||
-- V 键。 | |||
V = 86, | |||
-- | |||
-- 摘要: | |||
-- W 键。 | |||
W = 87, | |||
-- | |||
-- 摘要: | |||
-- X 键。 | |||
X = 88, | |||
-- | |||
-- 摘要: | |||
-- Y 键。 | |||
Y = 89, | |||
-- | |||
-- 摘要: | |||
-- Z 键。 | |||
Z = 90, | |||
-- | |||
-- 摘要: | |||
-- 左 Windows 徽标键(Microsoft Natural Keyboard,人体工程学键盘)。 | |||
LWin = 91, | |||
-- | |||
-- 摘要: | |||
-- 右 Windows 徽标键(Microsoft Natural Keyboard,人体工程学键盘)。 | |||
RWin = 92, | |||
-- | |||
-- 摘要: | |||
-- 应用程序键(Microsoft Natural Keyboard,人体工程学键盘)。 | |||
Apps = 93, | |||
-- | |||
-- 摘要: | |||
-- 计算机睡眠键。 | |||
Sleep = 95, | |||
-- | |||
-- 摘要: | |||
-- The 0 key on the numeric keypad. | |||
NumPad0 = 96, | |||
-- | |||
-- 摘要: | |||
-- The 1 key on the numeric keypad. | |||
NumPad1 = 97, | |||
-- | |||
-- 摘要: | |||
-- 数字键盘上的 2 键。 | |||
NumPad2 = 98, | |||
-- | |||
-- 摘要: | |||
-- 数字键盘上的 3 键。 | |||
NumPad3 = 99, | |||
-- | |||
-- 摘要: | |||
-- 数字键盘上的 4 键。 | |||
NumPad4 = 100, | |||
-- | |||
-- 摘要: | |||
-- 数字键盘上的 5 键。 | |||
NumPad5 = 101, | |||
-- | |||
-- 摘要: | |||
-- 数字键盘上的 6 键。 | |||
NumPad6 = 102, | |||
-- | |||
-- 摘要: | |||
-- 数字键盘上的 7 键。 | |||
NumPad7 = 103, | |||
-- | |||
-- 摘要: | |||
-- The 8 key on the numeric keypad. | |||
NumPad8 = 104, | |||
-- | |||
-- 摘要: | |||
-- The 9 key on the numeric keypad. | |||
NumPad9 = 105, | |||
-- | |||
-- 摘要: | |||
-- 乘号键。 | |||
Multiply = 106, | |||
-- | |||
-- 摘要: | |||
-- 加号键。 | |||
Add = 107, | |||
-- | |||
-- 摘要: | |||
-- 分隔符键。 | |||
Separator = 108, | |||
-- | |||
-- 摘要: | |||
-- 减号键。 | |||
Subtract = 109, | |||
-- | |||
-- 摘要: | |||
-- 句点键。 | |||
Decimal = 110, | |||
-- | |||
-- 摘要: | |||
-- 除号键。 | |||
Divide = 111, | |||
-- | |||
-- 摘要: | |||
-- The F1 key. | |||
F1 = 112, | |||
-- | |||
-- 摘要: | |||
-- The F2 key. | |||
F2 = 113, | |||
-- | |||
-- 摘要: | |||
-- The F3 key. | |||
F3 = 114, | |||
-- | |||
-- 摘要: | |||
-- The F4 key. | |||
F4 = 115, | |||
-- | |||
-- 摘要: | |||
-- The F5 key. | |||
F5 = 116, | |||
-- | |||
-- 摘要: | |||
-- The F6 key. | |||
F6 = 117, | |||
-- | |||
-- 摘要: | |||
-- The F7 key. | |||
F7 = 118, | |||
-- | |||
-- 摘要: | |||
-- The F8 key. | |||
F8 = 119, | |||
-- | |||
-- 摘要: | |||
-- The F9 key. | |||
F9 = 120, | |||
-- | |||
-- 摘要: | |||
-- The F10 key. | |||
F10 = 121, | |||
-- | |||
-- 摘要: | |||
-- The F11 key. | |||
F11 = 122, | |||
-- | |||
-- 摘要: | |||
-- The F12 key. | |||
F12 = 123, | |||
-- | |||
-- 摘要: | |||
-- The F13 key. | |||
F13 = 124, | |||
-- | |||
-- 摘要: | |||
-- The F14 key. | |||
F14 = 125, | |||
-- | |||
-- 摘要: | |||
-- The F15 key. | |||
F15 = 126, | |||
-- | |||
-- 摘要: | |||
-- The F16 key. | |||
F16 = 127, | |||
-- | |||
-- 摘要: | |||
-- The F17 key. | |||
F17 = 128, | |||
-- | |||
-- 摘要: | |||
-- The F18 key. | |||
F18 = 129, | |||
-- | |||
-- 摘要: | |||
-- The F19 key. | |||
F19 = 130, | |||
-- | |||
-- 摘要: | |||
-- The F20 key. | |||
F20 = 131, | |||
-- | |||
-- 摘要: | |||
-- The F21 key. | |||
F21 = 132, | |||
-- | |||
-- 摘要: | |||
-- The F22 key. | |||
F22 = 133, | |||
-- | |||
-- 摘要: | |||
-- The F23 key. | |||
F23 = 134, | |||
-- | |||
-- 摘要: | |||
-- The F24 key. | |||
F24 = 135, | |||
-- | |||
-- 摘要: | |||
-- The NUM LOCK key. | |||
NumLock = 144, | |||
-- | |||
-- 摘要: | |||
-- Scroll Lock 键。 | |||
Scroll = 145, | |||
-- | |||
-- 摘要: | |||
-- 左 Shift 键。 | |||
LShiftKey = 160, | |||
-- | |||
-- 摘要: | |||
-- 右 Shift 键。 | |||
RShiftKey = 161, | |||
-- | |||
-- 摘要: | |||
-- 左 Ctrl 键。 | |||
LControlKey = 162, | |||
-- | |||
-- 摘要: | |||
-- 右 Ctrl 键。 | |||
RControlKey = 163, | |||
-- | |||
-- 摘要: | |||
-- 左 Alt 键。 | |||
LMenu = 164, | |||
-- | |||
-- 摘要: | |||
-- 右 Alt 键。 | |||
RMenu = 165, | |||
-- | |||
-- 摘要: | |||
-- 浏览器后退键(Windows 2000 或更高版本)。 | |||
BrowserBack = 166, | |||
-- | |||
-- 摘要: | |||
-- 浏览器前进键(Windows 2000 或更高版本)。 | |||
BrowserForward = 167, | |||
-- | |||
-- 摘要: | |||
-- 浏览器刷新键(Windows 2000 或更高版本)。 | |||
BrowserRefresh = 168, | |||
-- | |||
-- 摘要: | |||
-- 浏览器停止键(Windows 2000 或更高版本)。 | |||
BrowserStop = 169, | |||
-- | |||
-- 摘要: | |||
-- 浏览器搜索键(Windows 2000 或更高版本)。 | |||
BrowserSearch = 170, | |||
-- | |||
-- 摘要: | |||
-- 浏览器收藏夹键(Windows 2000 或更高版本)。 | |||
BrowserFavorites = 171, | |||
-- | |||
-- 摘要: | |||
-- 浏览器主页键(Windows 2000 或更高版本)。 | |||
BrowserHome = 172, | |||
-- | |||
-- 摘要: | |||
-- 静音键(Windows 2000 或更高版本)。 | |||
VolumeMute = 173, | |||
-- | |||
-- 摘要: | |||
-- 减小音量键(Windows 2000 或更高版本)。 | |||
VolumeDown = 174, | |||
-- | |||
-- 摘要: | |||
-- 增大音量键(Windows 2000 或更高版本)。 | |||
VolumeUp = 175, | |||
-- | |||
-- 摘要: | |||
-- 媒体下一曲目键(Windows 2000 或更高版本)。 | |||
MediaNextTrack = 176, | |||
-- | |||
-- 摘要: | |||
-- 媒体上一曲目键(Windows 2000 或更高版本)。 | |||
MediaPreviousTrack = 177, | |||
-- | |||
-- 摘要: | |||
-- 媒体停止键(Windows 2000 或更高版本)。 | |||
MediaStop = 178, | |||
-- | |||
-- 摘要: | |||
-- 媒体播放暂停键(Windows 2000 或更高版本)。 | |||
MediaPlayPause = 179, | |||
-- | |||
-- 摘要: | |||
-- 启动邮件键(Windows 2000 或更高版本)。 | |||
LaunchMail = 180, | |||
-- | |||
-- 摘要: | |||
-- 选择媒体键(Windows 2000 或更高版本)。 | |||
SelectMedia = 181, | |||
-- | |||
-- 摘要: | |||
-- 启动应用程序一键(Windows 2000 或更高版本)。 | |||
LaunchApplication1 = 182, | |||
-- | |||
-- 摘要: | |||
-- 启动应用程序二键(Windows 2000 或更高版本)。 | |||
LaunchApplication2 = 183, | |||
-- | |||
-- 摘要: | |||
-- The OEM 1 key. | |||
Oem1 = 186, | |||
-- | |||
-- 摘要: | |||
-- 美式标准键盘上的 OEM 分号键(Windows 2000 或更高版本)。 | |||
OemSemicolon = 186, | |||
-- | |||
-- 摘要: | |||
-- 任何国家/地区键盘上的 OEM 加号键(Windows 2000 或更高版本)。 | |||
Oemplus = 187, | |||
-- | |||
-- 摘要: | |||
-- 任何国家/地区键盘上的 OEM 逗号键(Windows 2000 或更高版本)。 | |||
Oemcomma = 188, | |||
-- | |||
-- 摘要: | |||
-- 任何国家/地区键盘上的 OEM 减号键(Windows 2000 或更高版本)。 | |||
OemMinus = 189, | |||
-- | |||
-- 摘要: | |||
-- 任何国家/地区键盘上的 OEM 句点键(Windows 2000 或更高版本)。 | |||
OemPeriod = 190, | |||
-- | |||
-- 摘要: | |||
-- 美式标准键盘上的 OEM 问号键(Windows 2000 或更高版本)。 | |||
OemQuestion = 191, | |||
-- | |||
-- 摘要: | |||
-- The OEM 2 key. | |||
Oem2 = 191, | |||
-- | |||
-- 摘要: | |||
-- 美式标准键盘上的 OEM 波形符键(Windows 2000 或更高版本)。 | |||
Oemtilde = 192, | |||
-- | |||
-- 摘要: | |||
-- The OEM 3 key. | |||
Oem3 = 192, | |||
-- | |||
-- 摘要: | |||
-- The OEM 4 key. | |||
Oem4 = 219, | |||
-- | |||
-- 摘要: | |||
-- 美式标准键盘上的 OEM 左括号键(Windows 2000 或更高版本)。 | |||
OemOpenBrackets = 219, | |||
-- | |||
-- 摘要: | |||
-- 美式标准键盘上的 OEM 管道键(Windows 2000 或更高版本)。 | |||
OemPipe = 220, | |||
-- | |||
-- 摘要: | |||
-- The OEM 5 key. | |||
Oem5 = 220, | |||
-- | |||
-- 摘要: | |||
-- The OEM 6 key. | |||
Oem6 = 221, | |||
-- | |||
-- 摘要: | |||
-- 美式标准键盘上的 OEM 右括号键(Windows 2000 或更高版本)。 | |||
OemCloseBrackets = 221, | |||
-- | |||
-- 摘要: | |||
-- The OEM 7 key. | |||
Oem7 = 222, | |||
-- | |||
-- 摘要: | |||
-- 美式标准键盘上的 OEM 单/双引号键(Windows 2000 或更高版本)。 | |||
OemQuotes = 222, | |||
-- | |||
-- 摘要: | |||
-- The OEM 8 key. | |||
Oem8 = 223, | |||
-- | |||
-- 摘要: | |||
-- The OEM 102 key. | |||
Oem102 = 226, | |||
-- | |||
-- 摘要: | |||
-- RT 102 键的键盘上的 OEM 尖括号或反斜杠键(Windows 2000 或更高版本)。 | |||
OemBackslash = 226, | |||
-- | |||
-- 摘要: | |||
-- Process Key 键。 | |||
ProcessKey = 229, | |||
-- | |||
-- 摘要: | |||
-- 用于将 Unicode 字符当作键击传递。Packet 键值是用于非键盘输入法的 32 位虚拟键值的低位字。 | |||
Packet = 231, | |||
-- | |||
-- 摘要: | |||
-- The ATTN key. | |||
Attn = 246, | |||
-- | |||
-- 摘要: | |||
-- Crsel 键。 | |||
Crsel = 247, | |||
-- | |||
-- 摘要: | |||
-- Exsel 键。 | |||
Exsel = 248, | |||
-- | |||
-- 摘要: | |||
-- ERASE EOF 键。 | |||
EraseEof = 249, | |||
-- | |||
-- 摘要: | |||
-- The PLAY key. | |||
Play = 250, | |||
-- | |||
-- 摘要: | |||
-- The ZOOM key. | |||
Zoom = 251, | |||
-- | |||
-- 摘要: | |||
-- 保留以备将来使用的常数。 | |||
NoName = 252, | |||
-- | |||
-- 摘要: | |||
-- PA1 键。 | |||
Pa1 = 253, | |||
-- | |||
-- 摘要: | |||
-- Clear 键。 | |||
OemClear = 254, | |||
-- | |||
-- 摘要: | |||
-- 从键值提取键代码的位屏蔽。 | |||
KeyCode = 65535, | |||
-- | |||
-- 摘要: | |||
-- Shift 修改键。 | |||
Shift = 65536, | |||
-- | |||
-- 摘要: | |||
-- Ctrl 修改键。 | |||
Control = 131072, | |||
-- | |||
-- 摘要: | |||
-- Alt 修改键。 | |||
Alt = 262144, | |||
} |
@@ -0,0 +1,145 @@ | |||
-- 显示鼠标当前位置(客户端窗口位置、坐标系的位置、GLView的位置) | |||
-- 处理按下鼠标中键移动场景的功能 | |||
require("CSharpConstants") | |||
local Camera2DControllerTool = class("Camera2DControllerTool") | |||
function Camera2DControllerTool:moveTo(endPos) | |||
local offset = cc.pSub(endPos , self.startPos); | |||
local scale = app.setting.ScreenScale; | |||
offset.x = -offset.x / scale; | |||
offset.y = -offset.y / scale; | |||
local newWorld = cc.pAdd(self.originPos , offset); | |||
app.mainCamera:getNode():setTranslation(newWorld); | |||
end | |||
function Camera2DControllerTool:MouseMove(button , x , y) | |||
local glViewPos = app.visibleRect:convertScreenToGLView(x, y); | |||
if self.startPos then | |||
-- 计算结束点 | |||
self:moveTo(glViewPos); | |||
end | |||
local point = app.visibleRect:convertScreenToCoordinate(x, y); | |||
local strMapCoord = ""; | |||
if app.editor and app.editor.Map then | |||
local tilePos = app.editor.Map:getTilePosition(point.x , point.y); | |||
strMapCoord = string.format(" TilePos:%d,%d" , tilePos.x , tilePos.y); | |||
end | |||
return string.format("Mouse:%d,%d Coordinate:%d,%d GLView:%d,%d" .. strMapCoord , x , y , point.x , point.y , glViewPos.x , glViewPos.y); | |||
end | |||
function Camera2DControllerTool:MoveDown(button, x, y) | |||
-- 鼠标中键按下可以移动场景 | |||
if button ~= MouseButtons.Middle then return end | |||
-- 鼠标的按下位置 | |||
self.startPos = app.visibleRect:convertScreenToGLView(x, y); | |||
-- 场景的位置 | |||
self.originPos = app.mainCamera:getNode():getTranslation(); | |||
end | |||
function Camera2DControllerTool:MoveUp(button, x, y) | |||
if not self.startPos then return end | |||
-- 计算结束点 | |||
self:moveTo(app.visibleRect:convertScreenToGLView(x, y)); | |||
self.startPos = nil; | |||
self.originPos = nil; | |||
end | |||
function Camera2DControllerTool:KeyDown(Control , Alt , Shift , KeyCode) | |||
end | |||
function Camera2DControllerTool:update() | |||
end | |||
-- 摆放物件时使用这个函数计算物件应该放在什么位置 | |||
function Camera2DControllerTool:convertScreenToWorldPos(mouseX , mouseY) | |||
return app.visibleRect:convertScreenToWorldPos2D(mouseX , mouseY); | |||
end | |||
-- 刷新设置时调用 | |||
function Camera2DControllerTool:refreshSetting() | |||
app.setting.ScreenScale = cc.clampf(app.setting.ScreenScale , app.setting.ScreenScaleMin , app.setting.ScreenScaleMax); | |||
-- 设置相机缩放 | |||
app.mainCamera:getNode():setScale(1 / app.setting.ScreenScale); | |||
app.background:removeAllChildren(); | |||
-- 设置OpenGL背景颜色 | |||
gl.clearColor(0,0,0,0); | |||
-- 画手机外壳 | |||
if app.setting.ShowIPhone5 then | |||
local bgIphone5 = cc.Sprite:create("Editor/iphone5.png"); | |||
app.background:addChild(bgIphone5) | |||
end | |||
-- 设置背景颜色 | |||
local bgColor = cc.LayerColor:create(app.setting.BackgroundColor); | |||
bgColor:setContentSize(cc.size(app.setting.ResourceSize.width,app.setting.ResourceSize.height)) | |||
bgColor:setAnchorPoint(app.setting.OriginAnchor) | |||
bgColor:ignoreAnchorPointForPosition(false); | |||
bgColor:setGlobalZOrder(-100000000); | |||
--app.background:addChild(bgColor) | |||
-- 创建背景图 | |||
if app.setting.BackgroundImage ~= "" then | |||
local bg = cc.Sprite:create(app.setting.BackgroundImage); | |||
local size = bg:getContentSize(); | |||
bg:setAnchorPoint(app.setting.OriginAnchor) | |||
app.background:addChild(bg) | |||
end | |||
if app.setting.ShowGrid then | |||
-- 创建网格 | |||
local vertices = {}; | |||
local viewSize = cc.size(app.setting.ResourceSize.width,app.setting.ResourceSize.height); | |||
local gridWidth = app.setting.GridSize.width | |||
local gridHeight = app.setting.GridSize.height | |||
local gridCountY = math.floor(viewSize.height / gridHeight); | |||
local vertexFormat = {}; | |||
table.insert(vertexFormat , {size = 3 , usage = cc.VertexFormatUsage.POSITION}); | |||
table.insert(vertexFormat , {size = 4 , usage = cc.VertexFormatUsage.COLOR}); | |||
local vertices = ManualVertices:new(vertexFormat); | |||
vertices:setColor(app.setting.GridColor); | |||
-- 画横向网格 | |||
for i = -gridCountY , gridCountY do | |||
vertices:drawLine(cc.vec3(-viewSize.width , i * gridHeight , 0) , cc.vec3(viewSize.width , i * gridHeight , 0)); | |||
end | |||
-- 画竖向网格 | |||
local gridCountX = math.floor(viewSize.width / gridWidth); | |||
for i = -gridCountX , gridCountX do | |||
vertices:drawLine(cc.vec3(i * gridWidth , -viewSize.height , 0) , cc.vec3(i * gridWidth , viewSize.height , 0)) | |||
end | |||
vertices:setColor(app.setting.AxisColor); | |||
-- 画轴 | |||
vertices:drawLine(cc.vec3(-viewSize.width , 0 , 0) , cc.vec3(viewSize.width , 0 , 0)) | |||
vertices:drawLine(cc.vec3(0 , -viewSize.height , 0) , cc.vec3(0 , viewSize.height , 0)) | |||
local mesh = cc.Mesh:createMesh(vertexFormat , vertices:getVertexCount()); | |||
mesh:setPrimitiveType(cc.PrimitiveType.LINES); | |||
mesh:setVertexData(vertices:getVertices() , 0 , vertices:getVertexCount()); | |||
mesh:setBoundingBox(vertices:getBoundingBox()); | |||
local model = cc.Model:create(mesh); | |||
local material = cc.Material:create("core/preload/shaders/ccDefault.material#ShaderPositionColor"); | |||
material:setParameterAutoBinding("CC_MVPMatrix" , "WORLD_VIEW_PROJECTION_MATRIX"); | |||
model:setMaterialPointer(material); | |||
local node = cc.Node3D:create(); | |||
node:addComponent(model); | |||
app.background:addChild(node); | |||
end | |||
end | |||
return Camera2DControllerTool; |
@@ -0,0 +1,218 @@ | |||
-- 处理3D相机的移动控制 | |||
require("CSharpConstants") | |||
local Camera3DControllerTool = class("Camera3DControllerTool") | |||
function Camera3DControllerTool:ctor() | |||
-- 相机的球面坐标系 | |||
-- 半径,离原点的距离,一般是一个正数 | |||
-- 经度,0~2PI,0代表正前方,PI代表正后方 | |||
-- 纬度,HALF_PI代表水平位置,+PI代表底,0代表顶 | |||
self.spherical = cc.vec3(30,1.4,1.4); | |||
-- 相机旋转中心点 | |||
self.rotationCenter = cc.vec3(0,0,0); | |||
end | |||
function Camera3DControllerTool:moveTo(button , offsetPos) | |||
-- ALT + 鼠标右键拉近拉远 | |||
if button == MouseButtons.Right then | |||
--local offset = (offsetPos.x + -offsetPos.y) * 0.1; | |||
local offset = -offsetPos.x + offsetPos.y; | |||
self.spherical.x = math.max(self.spherical.x + offset * 0.00075 * self.spherical.x); | |||
-- 拉得太近了,就把原点丢远一点 | |||
if self.spherical.x <= 1 then | |||
-- 丢10格 | |||
local fullOut = 30; | |||
local ray = app.mainCamera:pickRay(0.5,0.5); | |||
-- 沿着屏幕射线把旋转中心点往前移动 | |||
self.rotationCenter = cc.vec3Add(cc.vec3Mul(ray:getDirection() , fullOut) , self.rotationCenter); | |||
self.spherical.x = self.spherical.x + fullOut; | |||
end | |||
-- ALT + 鼠标中键平移 | |||
elseif button == MouseButtons.Middle then | |||
local offset = app.mainCamera:moveByViewPlane(cc.vec3(offsetPos.x * 0.00075 * self.spherical.x , -offsetPos.y * 0.00075 * self.spherical.x, 0)); | |||
self.rotationCenter.x = self.rotationCenter.x + offset.x; | |||
self.rotationCenter.y = self.rotationCenter.y + offset.y; | |||
self.rotationCenter.z = self.rotationCenter.z + offset.z; | |||
-- ALT + 鼠标左键旋转 | |||
elseif button == MouseButtons.Left then | |||
self.spherical.y = self.spherical.y + offsetPos.x * 0.003; | |||
self.spherical.z = self.spherical.z + offsetPos.y * 0.003; | |||
end | |||
self:update(); | |||
end | |||
function Camera3DControllerTool:update() | |||
-- 计算相对rotationCenter的位置 | |||
local pos = Math.SphericalToCartesian(cc.vec3(self.spherical.x , self.spherical.y , self.spherical.z)); | |||
pos.x = pos.x + self.rotationCenter.x | |||
pos.y = pos.y + self.rotationCenter.y | |||
pos.z = pos.z + self.rotationCenter.z | |||
app.mainCamera:getNode():setTranslation(pos); | |||
app.mainCamera:lookAt(self.rotationCenter); | |||
end | |||
function Camera3DControllerTool:MoveDown(button, x, y) | |||
-- 按下ALT控制相机 | |||
if app.cs.getModifierKeys() ~= Keys.Alt then return end | |||
-- 鼠标的按下位置 | |||
self.startPos = app.visibleRect:convertScreenToGLView(x, y); | |||
-- 相机的位置 | |||
self.originPos = app.mainCamera:getNode():getPosition(); | |||
end | |||
function Camera3DControllerTool:MouseMove(button , x , y) | |||
local glViewPos = app.visibleRect:convertScreenToGLView(x, y); | |||
if self.startPos then | |||
local delta = cc.pSub(glViewPos , self.startPos); | |||
-- 计算结束点 | |||
self:moveTo(button , delta); | |||
self.startPos = glViewPos; | |||
end | |||
local point = self:convertScreenToWorldPos(x, y); | |||
local strMapCoord = ""; | |||
if app.editor and app.editor.Map then | |||
local tilePos = app.editor.Map:getTilePosition(point.x , point.z); | |||
strMapCoord = string.format(" TilePos:%d,%d" , tilePos.x , tilePos.y); | |||
end | |||
local ort = cc.Orientation:new(); | |||
ort:fromQuaternion(app.mainCamera:getNode():getQuaternion()); | |||
local dir = ort:toDirection(); | |||
return string.format("Mouse:%d,%d Coordinate:%.2f,%.2f,%.2f GLView:%d,%d CameraPos:%.2f,%.2f,%.2f CameraDir:%.2f,%.2f,%.2f" .. strMapCoord , x , y , point.x , point.y , point.z , glViewPos.x , glViewPos.y | |||
, app.mainCamera:getNode():getTranslationX() | |||
, app.mainCamera:getNode():getTranslationY() | |||
, app.mainCamera:getNode():getTranslationZ() | |||
, dir.x | |||
, dir.y | |||
, dir.z | |||
); | |||
end | |||
function Camera3DControllerTool:MoveUp(button, x, y) | |||
if not self.startPos then return end | |||
-- 计算结束点 | |||
--self:moveTo(app.visibleRect:convertScreenToGLView(x, y)); | |||
self.startPos = nil; | |||
self.originPos = nil; | |||
end | |||
function Camera3DControllerTool:KeyDown(Control , Alt , Shift , KeyCode) | |||
-- F按下 | |||
if Control == false and Alt == false and Shift == false and KeyCode == Keys.F then | |||
local node; | |||
-- 如果有物件被选中,就定位到第一个物件 | |||
if app.editor and app.editor.SelectedNodes and next(app.editor.SelectedNodes) then | |||
node = next(app.editor.SelectedNodes); | |||
end | |||
-- 如果没物件被选中,则定位到当前物件 | |||
if not node and app.editor and app.editor.node then | |||
node = app.editor.node; | |||
end | |||
if node then | |||
self.rotationCenter = node:getWorldTranslation(); | |||
local box = node:getSelectBox(); | |||
local max = box:getMax(); | |||
local distance = math.max(max.x , max.y , max.z , 1) | |||
self.spherical = cc.vec3(distance ,1.4,1.4); | |||
else | |||
self.rotationCenter = cc.vec3(0,0,0); | |||
self.spherical = cc.vec3(30,1.4,1.4); | |||
end | |||
self:update(); | |||
end | |||
end | |||
-- 摆放物件时使用这个函数计算物件应该放在什么位置 | |||
function Camera3DControllerTool:convertScreenToWorldPos(mouseX , mouseY) | |||
local floorPlane = cc.Plane:new(cc.vec3(0,1,0) , 0); | |||
-- 计算出mainlayer的世界位置 | |||
local screenSize = cc.Director:getInstance():getWinSizeInPixels(); | |||
local ray = app.mainCamera:pickRay(mouseX / screenSize.width , mouseY / screenSize.height); | |||
local distance = ray:intersectsPlane(floorPlane); | |||
if distance >= 0 then | |||
return ray:getPoint(distance); | |||
else | |||
return ray:getPoint(0); | |||
end | |||
end | |||
-- 刷新设置时调用 | |||
function Camera3DControllerTool:refreshSetting() | |||
app.background:removeAllChildren(); | |||
-- 画手机外壳 | |||
if app.setting.ShowIPhone5 then | |||
local bgIphone5 = cc.Sprite:create("Editor/iphone5.png"); | |||
app.background:addChild(bgIphone5) | |||
end | |||
-- 设置OpenGL背景颜色 | |||
gl.clearColor(app.setting.BackgroundColor.r / 255 , app.setting.BackgroundColor.g / 255 , app.setting.BackgroundColor.b / 255 ,0); | |||
if app.setting.ShowGrid then | |||
-- 创建网格 | |||
local vertexFormat = {}; | |||
table.insert(vertexFormat , {size = 3 , usage = cc.VertexFormatUsage.POSITION}); | |||
table.insert(vertexFormat , {size = 4 , usage = cc.VertexFormatUsage.COLOR}); | |||
local vertices = ManualVertices:new(vertexFormat); | |||
vertices:setColor(app.setting.GridColor); | |||
local viewSize = cc.size(100,100); | |||
local gridWidth = app.setting.GridSize.width | |||
local gridHeight = app.setting.GridSize.height | |||
local gridCountY = math.floor(viewSize.height / gridHeight); | |||
vertices:setColor(app.setting.GridColor); | |||
-- 画横向网格 | |||
for i = -gridCountY , gridCountY do | |||
if i ~= 0 then | |||
vertices:drawLine(cc.vec3(-viewSize.width , 0 , i * gridHeight) , cc.vec3(viewSize.width , 0 , i * gridHeight)) | |||
end | |||
end | |||
vertices:setColor(app.setting.GridColor); | |||
-- 画竖向网格 | |||
local gridCountX = math.floor(viewSize.width / gridWidth); | |||
for i = -gridCountX , gridCountX do | |||
if i ~= 0 then | |||
vertices:drawLine(cc.vec3(i * gridWidth , 0 , -viewSize.height) , cc.vec3(i * gridWidth , 0 , viewSize.height)) | |||
end | |||
end | |||
vertices:setColor(app.setting.AxisColor); | |||
-- 画轴 | |||
vertices:drawLine(cc.vec3(-viewSize.width , 0 , 0) , cc.vec3(viewSize.width , 0 , 0)) | |||
vertices:drawLine(cc.vec3(0 , 0 , -viewSize.height) , cc.vec3(0 , 0 , viewSize.height)) | |||
local mesh = cc.Mesh:createMesh(vertexFormat , vertices:getVertexCount()); | |||
mesh:setPrimitiveType(cc.PrimitiveType.LINES); | |||
mesh:setVertexData(vertices:getVertices() , 0 , vertices:getVertexCount()); | |||
mesh:setBoundingBox(vertices:getBoundingBox()); | |||
local model = cc.Model:create(mesh); | |||
local material = cc.Material:create("core/preload/shaders/ccDefault.material#ShaderPositionColor3D"); | |||
material:setParameterAutoBinding("CC_MVPMatrix" , "WORLD_VIEW_PROJECTION_MATRIX"); | |||
model:setMaterialPointer(material); | |||
local node = cc.Node3D:create(); | |||
node:addComponent(model); | |||
app.background:addChild(node); | |||
end | |||
end | |||
return Camera3DControllerTool; |
@@ -0,0 +1,111 @@ | |||
-- 技能撤销操作 | |||
-- 删除技能轨迹 | |||
function Commands:deleteTrack(ce, track) | |||
local releaseTrack = false | |||
local function redo() | |||
-- 如果preTrack不为空 | |||
local preTrack = track:getPrevTrack() | |||
if preTrack ~= nil then | |||
track.PrevTrack = preTrack; | |||
preTrack:setNextTrack(-1); | |||
end | |||
-- nextTrack不为空 | |||
local nextTrack = track:getNextTrack() | |||
if nextTrack ~= nil then | |||
track.NextTrack = nextTrack | |||
track:setNextTrack(-1) | |||
end | |||
track:retain() | |||
releaseTrack = true | |||
-- 移除这个轨迹 | |||
track:removeFromParent(); | |||
-- 更新树 | |||
app.cs.updateCombineTree(); | |||
-- 选中空 | |||
app.cs.selectTrackObject(ce); | |||
return true; | |||
end | |||
local function undo() | |||
ce:addTrack(track); | |||
track:release() | |||
releaseTrack = false | |||
if not tolua.isnull(track.PrevTrack) then | |||
track.PrevTrack:setNextTrack(track:getTrackId()) | |||
end | |||
if not tolua.isnull(track.NextTrack) then | |||
track:setNextTrack(track.NextTrack:getTrackId()) | |||
end | |||
app.cs.updateCombineTree(); | |||
app.cs.selectTrackObject(track); | |||
end | |||
local function clear() | |||
if releaseTrack then | |||
track:release() | |||
end | |||
end | |||
return {redo = redo , undo = undo, clear = clear}; | |||
end | |||
-- 创建技能轨迹 | |||
function Commands:createTrack(ce, track) | |||
local releaseTrack = false | |||
local function redo() | |||
-- 如果preTrack不为空 | |||
local preTrack = track:getPrevTrack() | |||
if preTrack ~= nil then | |||
track.PrevTrack = preTrack; | |||
preTrack:setNextTrack(-1); | |||
end | |||
-- nextTrack不为空 | |||
local nextTrack = track:getNextTrack() | |||
if nextTrack ~= nil then | |||
track.NextTrack = nextTrack | |||
track:setNextTrack(-1) | |||
end | |||
-- 添加 | |||
ce:addTrack(track); | |||
if releaseTrack then | |||
track:release() | |||
releaseTrack = false | |||
end | |||
-- 更新树 | |||
app.cs.updateCombineTree(); | |||
-- 选中空 | |||
app.cs.selectTrackObject(track); | |||
return true; | |||
end | |||
local function undo() | |||
if not tolua.isnull(track.PrevTrack) then | |||
track.PrevTrack:setNextTrack(track:getTrackId()) | |||
end | |||
if not tolua.isnull(track.NextTrack) then | |||
track:setNextTrack(track.NextTrack:getTrackId()) | |||
end | |||
track:retain() | |||
releaseTrack = true | |||
-- 移除这个轨迹 | |||
track:removeFromParent(); | |||
app.cs.updateCombineTree(); | |||
app.cs.selectTrackObject(ce); | |||
end | |||
local function clear() | |||
if releaseTrack then | |||
track:release() | |||
end | |||
end | |||
return {redo = redo , undo = undo, clear = clear}; | |||
end |
@@ -0,0 +1,378 @@ | |||
local CombineEffectEditor = class("CombineEffectEditor" , require("NodeEditor")); | |||
function CombineEffectEditor:ctor() | |||
CombineEffectEditor.super.ctor(self); | |||
-- 根节点 | |||
self.node = nil; | |||
-- 源模型集合的父节点 | |||
self.sourceRootNode = nil; | |||
-- 源点集合的父节点 | |||
self.sourcePosRootNode = nil; | |||
-- 目标模型集合的父节点 | |||
self.targetRootNode = nil; | |||
-- 目标点集合的父节点 | |||
self.targetPosRootNode = nil; | |||
-- 技能action | |||
self.CombineEffectAction = nil; | |||
-- 背景场景 | |||
self.SceneFile = nil; | |||
end | |||
function CombineEffectEditor:activate() | |||
-- 基类 | |||
CombineEffectEditor.super.ctor(self); | |||
-- 设置锚点位置 | |||
app.setting.OriginAnchor = cc.p(0.5,0.5); | |||
app:refreshSetting(); | |||
-- 初始化技能环境 | |||
self:initCombineEffectEnv(); | |||
-- 创建一个文本框,用于显示技能是否为无限长 | |||
local debugLabel = cc.Text:createNode(); | |||
debugLabel:setDefaults(); | |||
local config = debugLabel:getFontConfig(); | |||
config.fontSize = 40; | |||
config.texColor = cc.c4b(255,0,0,255); | |||
debugLabel:setFontConfig(config); | |||
-- 获取可见视野的像素大小 | |||
local screenSize = cc.Director:getInstance():getWinSizeInPixels(); | |||
debugLabel:setTranslation(screenSize.width / 2 , 100 , 0) | |||
debugLabel:setText(""); | |||
self.debugText = debugLabel; | |||
self.InfinityTipTextNode = cc.Scene:create() | |||
self.InfinityTipTextNode:setActiveCamera(cc.Director:getInstance():getFixedCamera()) | |||
self.InfinityTipTextNode:addChild(self.debugText) | |||
app.mainScene:addChild(self.InfinityTipTextNode); | |||
self.InfinityTipTextNode:setVisible(false) | |||
end | |||
function CombineEffectEditor:unactivate() | |||
if self.SceneFile then | |||
self.SceneFile:removeFromParent(); | |||
self.SceneFile = nil; | |||
end | |||
self.InfinityTipTextNode:removeFromParent(); | |||
-- 清空技能环境 | |||
self:unInitCombineEffectEnv(); | |||
self:closeCombineEffect(); | |||
end | |||
-- 是否可以选中此节点 | |||
function CombineEffectEditor:canSelectNode(flag, node) | |||
return true; | |||
end | |||
-- 保存技能文件 | |||
function CombineEffectEditor:save(filename) | |||
self.ce:saveToFile(filename); | |||
-- 清空undoredoManager | |||
app.undoRedoManager:clear(); | |||
end | |||
-- 创建测试模型 | |||
local function createTestHero(modelFile) | |||
-- 这里需要跟游戏里面保持一致 | |||
-- 所有需要创建一个中间节点 | |||
local heroView; | |||
local pathName , baseName , ext = string.splitFilename(modelFile); | |||
if string.lower(ext) == "gpb" then | |||
heroView = cc.Node:create(); | |||
local skeleton = cc.ModelNode:create(modelFile); | |||
createHeroEntity(skeleton); | |||
skeleton.selectTest = function(rect)return false end | |||
heroView:addChild(skeleton); | |||
heroView.ModelNode = skeleton; | |||
heroView.getSelectBox = function()return skeleton:getSelectBox()end | |||
-- 默认播放站立动画 | |||
--animEntity:setValue("", ); | |||
else | |||
heroView = cc.Node2D:create(); | |||
heroView:setContentSize(app.setting.ResourceSize); | |||
local node = createNodeFromFile(modelFile); | |||
heroView.ModelNode = node; | |||
heroView:addChild(node); | |||
heroView.getSelectBox = function()return node:getSelectBox();end; | |||
node:visitNode(function(n) | |||
n.selectTest = function(rect)return false;end; | |||
end); | |||
end | |||
return heroView; | |||
end | |||
-- 创建目标点和目标模型 | |||
local function createPositionNode() | |||
local skeleton = cc.ModelNode:create("res/default/DefaultPoint/DefaultPoint.gpb"); | |||
-- 默认播放站立动画 | |||
--animEntity:setValue("", ); | |||
return skeleton; | |||
end | |||
-- 激活技能编辑器时创建技能环境 | |||
function CombineEffectEditor:initCombineEffectEnv() | |||
--创建一个源模型、源点、目标模型、目标点 | |||
self.defaultCEParams = createDefaultCombineEffectParams(); | |||
-- 创建所有的根节点 | |||
self.node = cc.Node:create(); | |||
app.mainLayer:addChild(self.node); | |||
self.sourceRootNode = cc.Node:create(); | |||
self.node:addChild(self.sourceRootNode); | |||
self.sourcePosRootNode = cc.Node:create(); | |||
self.node:addChild(self.sourcePosRootNode); | |||
self.targetRootNode = cc.Node:create(); | |||
self.node:addChild(self.targetRootNode); | |||
self.targetPosRootNode = cc.Node:create(); | |||
self.node:addChild(self.targetPosRootNode); | |||
end | |||
-- 激活技能编辑器时创建技能环境 | |||
function CombineEffectEditor:unInitCombineEffectEnv() | |||
self.defaultCEParams = nil; | |||
self.node:removeFromParent(); | |||
end | |||
--C#那边调用 | |||
function CombineEffectEditor:createCEParamsNode(paramType, posWithMouse) | |||
local node = nil; | |||
if paramType == "SourceModel" then | |||
-- 创建一个源模型 | |||
node = createTestHero(app.setting.SourceModelFile); | |||
-- 加入到节点系统 | |||
self.sourceRootNode:addChild(node); | |||
elseif paramType == "TargetModel" then | |||
-- 创建一个源模型 | |||
node = createTestHero(app.setting.TargetModelFile); | |||
-- 加入到节点系统 | |||
self.targetRootNode:addChild(node); | |||
elseif paramType == "SourcePos" then | |||
-- 创建一个源模型 | |||
node = createPositionNode(); | |||
-- 加入到节点系统 | |||
self.sourcePosRootNode:addChild(node); | |||
elseif paramType == "TargetPos" then | |||
-- 创建一个源模型 | |||
node = createPositionNode(); | |||
-- 加入到节点系统 | |||
self.targetPosRootNode:addChild(node); | |||
end | |||
-- 设置世界坐标 | |||
if posWithMouse then | |||
local worldPos = app.cameraController:convertScreenToWorldPos(posWithMouse.x , posWithMouse.y); | |||
local nodePos = node:getParent():convertToNodeSpace(worldPos); | |||
node:setTranslation(worldPos); | |||
end | |||
return node; | |||
end | |||
function CombineEffectEditor:play() | |||
-- 播放一个技能 | |||
if self.ce == nil then | |||
return; | |||
end | |||
-- 先停止技能 | |||
self:stop() | |||
-- 清空数据 | |||
self.defaultCEParams.SourceNode = {}; | |||
self.defaultCEParams.TargetNode = {}; | |||
self.defaultCEParams.SourcePos = {}; | |||
self.defaultCEParams.TargetPos = {}; | |||
-- 收集技能参数 | |||
self.defaultCEParams.ParentNode = app.mainLayer; | |||
self.defaultCEParams.CameraNode = app:getMainCameraShakeNode() | |||
-- 源模型 | |||
for i, v in pairs(self.sourceRootNode:getChildren()) do | |||
table.insert(self.defaultCEParams.SourceNode, v.ModelNode); | |||
end | |||
-- 目标模型 | |||
for i, v in pairs(self.targetRootNode:getChildren()) do | |||
table.insert(self.defaultCEParams.TargetNode, v.ModelNode); | |||
end | |||
-- 源点 | |||
for i, v in pairs(self.sourcePosRootNode:getChildren()) do | |||
-- 获取坐标点 | |||
local pos = getWorldPositionToNode(v, self.defaultCEParams.ParentNode); | |||
table.insert(self.defaultCEParams.SourcePos, pos); | |||
end | |||
-- 目标点 | |||
for i, v in pairs(self.targetPosRootNode:getChildren()) do | |||
-- 获取坐标点 | |||
local pos = getWorldPositionToNode(v, self.defaultCEParams.ParentNode); | |||
table.insert(self.defaultCEParams.TargetPos, pos); | |||
end | |||
-- 创建一个action来播放 | |||
self.CombineEffectAction = cc.CombineEffectAction:createWithInstance(self.ce, self.defaultCEParams, nil, nil) | |||
self.node:runAction(self.CombineEffectAction) | |||
-- 检查技能是否为无限长 | |||
self:checkCombineEffectInfinity() | |||
end | |||
function CombineEffectEditor:stop() | |||
if not tolua.isnull(self.CombineEffectAction) then | |||
self.node:stopAction(self.CombineEffectAction) | |||
self.CombineEffectAction = nil | |||
end | |||
if not tolua.isnull(self.ce) then | |||
self.ce:stop() | |||
end | |||
end | |||
-- 检测技能是否无限长 | |||
function CombineEffectEditor:checkCombineEffectInfinity() | |||
if self.ce == nil then | |||
return | |||
end | |||
local text = "" | |||
local hitCount = 0; | |||
for i , v in pairs(self.ce:getChildren()) do | |||
if v:isInfinite() then | |||
text = text .. "轨迹名字:" .. v:getName() .. " 轨迹ID:" .. tostring(v:getTrackId()) .. "为无限长,请注意!!!\n"; | |||
end | |||
if v:getStartEventName() == "OnHit" then | |||
hitCount = hitCount + 1; | |||
end | |||
end | |||
if hitCount ~= 1 then | |||
if hitCount == 0 then | |||
text = text .. "OnHit事件没配置,必须配置一个OnHit事件!!\n"; | |||
else | |||
text = text .. "OnHit事件被配置了多于1个,只能配置一个OnHit事件!!\n"; | |||
end | |||
end | |||
if text == "" then | |||
self.InfinityTipTextNode:setVisible(false) | |||
else | |||
self.debugText:setText(text); | |||
self.InfinityTipTextNode:setVisible(true) | |||
end | |||
end | |||
-- 关闭光效 | |||
function CombineEffectEditor:closeCombineEffect() | |||
if not tolua.isnull(self.CombineEffectAction) then | |||
self.node:stopAction(self.CombineEffectAction) | |||
self.CombineEffectAction = nil | |||
end | |||
-- 释放技能 | |||
if not tolua.isnull(self.ce) then | |||
self.ce:release() | |||
end | |||
end | |||
-- 创建新的光效 | |||
function CombineEffectEditor:newCombineEffect() | |||
self:closeCombineEffect(); | |||
self.ce = cc.CombineEffect:create(); | |||
self.ce:retain() | |||
return self.ce; | |||
end | |||
function CombineEffectEditor:loadCombineEffect(ceFile) | |||
self:closeCombineEffect(); | |||
local ce = createCombineEffect(ceFile); | |||
self.ce = ce; | |||
self.ce:retain() | |||
-- 检查技能是否为无限长 | |||
self:checkCombineEffectInfinity() | |||
return self.ce; | |||
end | |||
-- 删除所有选中的节点 | |||
-- 技能编辑器根其他编辑器不一样,这里不支持撤销 | |||
function CombineEffectEditor:commandDeleteSelectNodes() | |||
if next(self.SelectedNodes) == nil then | |||
return; | |||
end | |||
-- 这里需要自己搜集,因为self.sourceRootNode等空节点也会被select出来所以这里需要手动搜索 | |||
-- 搜集技能参数 | |||
local ceNodes = {} | |||
-- 源模型 | |||
for i, v in pairs(self.sourceRootNode:getChildren()) do | |||
if self.SelectedNodes[v] then | |||
table.insert(ceNodes, v); | |||
end | |||
end | |||
-- 目标模型 | |||
for i, v in pairs(self.targetRootNode:getChildren()) do | |||
if self.SelectedNodes[v] then | |||
table.insert(ceNodes, v); | |||
end | |||
end | |||
-- 源点 | |||
for i, v in pairs(self.sourcePosRootNode:getChildren()) do | |||
if self.SelectedNodes[v] then | |||
table.insert(ceNodes, v); | |||
end | |||
end | |||
-- 目标点 | |||
for i, v in pairs(self.targetPosRootNode:getChildren()) do | |||
if self.SelectedNodes[v] then | |||
table.insert(ceNodes, v); | |||
end | |||
end | |||
for i,v in pairs(ceNodes) do | |||
self:deleteNode(v); | |||
end | |||
end | |||
-- 删除一个轨迹 | |||
function CombineEffectEditor:commandDeleteTrack(track) | |||
local command = Commands:deleteTrack(self.ce, track); | |||
app.undoRedoManager:doCommand(command); | |||
end | |||
-- 通过命令创建一个轨迹 | |||
function CombineEffectEditor:commandCreateTrack(trackType) | |||
local track = cc[trackType]:create(); | |||
local command = Commands:createTrack(self.ce, track); | |||
app.undoRedoManager:doCommand(command); | |||
end | |||
-- 复制节点到另一个节点下面 | |||
function CombineEffectEditor:commandCopyNode(track) | |||
track:setTrackId(0) | |||
local command = Commands:createTrack(self.ce, track); | |||
app.undoRedoManager:doCommand(command); | |||
end | |||
-- 设置背景场景 | |||
function CombineEffectEditor:setSceneFile(sceneFile) | |||
if self.SceneFile then | |||
self.SceneFile:removeFromParent(); | |||
end | |||
local node = createNodeFromFile(sceneFile); | |||
self.SceneFile = node; | |||
self.node:addChild(node); | |||
end | |||
return CombineEffectEditor; | |||
@@ -0,0 +1,471 @@ | |||
Commands = {} | |||
-- 批量命令 | |||
function Commands:batchCommand(commands) | |||
--[[ | |||
local function isParent(node , parent) | |||
local myParent = node:getParent(); | |||
if myParent == parent then | |||
return true; | |||
else | |||
if myParent then | |||
return isParent(myParent , parent); | |||
end | |||
end | |||
end | |||
local function sortFunction(a , b) | |||
return isParent(b.node , a.node); | |||
end | |||
table.sort(commands , sortFunction); | |||
print("BatchStart"); | |||
for i, v in ipairs(commands) do | |||
print("节点" , v.node:getName()); | |||
end | |||
print("BatchEnd"); | |||
]] | |||
local function redo() | |||
if next(commands) == nil then | |||
return false; | |||
end | |||
for i, v in ipairs(commands) do | |||
v:redo(); | |||
end | |||
return true; | |||
end | |||
-- | |||
local function undo() | |||
for i = #commands , 1 , -1 do | |||
commands[i]:undo(); | |||
end | |||
end | |||
local function clear() | |||
for i, v in ipairs(commands) do | |||
if type(v.clear) == "function" then | |||
v:clear(); | |||
end | |||
end | |||
end | |||
return { redo = redo, undo = undo, clear = clear }; | |||
end | |||
-- 选中命令 | |||
--[[function Commands:select(nodes) | |||
local selectNodes = clone(nodes); | |||
-- 恢复操作 | |||
local function redo() | |||
if table.nums(selectNodes) <= 0 then | |||
return false; | |||
end | |||
-- 通知c#那边选中第一个 | |||
if selectNodes[1] then | |||
app.cs.setPropertyObject(selectNodes[1]); | |||
end | |||
for i , v in pairs(selectNodes) do | |||
app.editor:selectNode(v); | |||
end | |||
return true; | |||
end | |||
-- 撤销操作 | |||
local function undo() | |||
for i , v in pairs(selectNodes) do | |||
app.editor:unSelectNode(v); | |||
end | |||
end | |||
return {redo = redo , undo = undo}; | |||
end | |||
-- 取消选中命令 | |||
function Commands:unselect(nodes) | |||
local selectNodes = clone(nodes); | |||
-- 恢复操作 | |||
local function redo() | |||
if table.nums(selectNodes) <= 0 then | |||
return false; | |||
end | |||
for i , v in pairs(selectNodes) do | |||
app.editor:unSelectNode(v); | |||
end | |||
return true; | |||
end | |||
-- 撤销操作 | |||
local function undo() | |||
for i , v in pairs(selectNodes) do | |||
app.editor:selectNode(v); | |||
end | |||
end | |||
return {redo = redo , undo = undo}; | |||
end--]] | |||
-- 移动命令 | |||
-- 这里使用的node的父节点空间的位置,使用者要在外部转换好 | |||
function Commands:moveNode(node , newPos) | |||
local originalPos; | |||
-- 恢复操作 | |||
local function redo() | |||
if not node then | |||
return false; | |||
end | |||
originalPos = node:getTranslation(); | |||
node:setTranslation(newPos); | |||
-- 通知c#设置关键帧 | |||
if app.cs.setKeyFrame then | |||
app.cs.setKeyFrame(node , "位置"); | |||
end | |||
return true; | |||
end | |||
-- 撤销操作 | |||
local function undo() | |||
node:setTranslation(originalPos); | |||
-- 通知c#设置关键帧 | |||
if app.cs.setKeyFrame then | |||
app.cs.setKeyFrame(node , "位置"); | |||
end | |||
end | |||
return {redo = redo , undo = undo , node = node}; | |||
end | |||
-- 旋转命令 | |||
-- 这里使用的node的父节点空间的位置,使用者要在外部转换好 | |||
function Commands:rotateNode(node , newPos) | |||
local originalPos; | |||
-- 恢复操作 | |||
local function redo() | |||
if not node then | |||
return false; | |||
end | |||
originalPos = node:getEulerRotation(); | |||
node:setEulerRotation(newPos); | |||
-- 通知c#设置关键帧 | |||
if app.cs.setKeyFrame then | |||
app.cs.setKeyFrame(node , "旋转"); | |||
end | |||
return true; | |||
end | |||
-- 撤销操作 | |||
local function undo() | |||
node:setEulerRotation(originalPos); | |||
-- 通知c#设置关键帧 | |||
if app.cs.setKeyFrame then | |||
app.cs.setKeyFrame(node , "旋转"); | |||
end | |||
end | |||
return {redo = redo , undo = undo , node = node}; | |||
end | |||
-- 移动命令 | |||
-- 这里使用的node的父节点空间的位置,使用者要在外部转换好 | |||
function Commands:setWorldPosition(node , newPos) | |||
local originalPos; | |||
-- 恢复操作 | |||
local function redo() | |||
if not node then | |||
return false; | |||
end | |||
originalPos = node:getWorldPosition(); | |||
node:setWorldPosition(newPos); | |||
-- 通知c#设置关键帧 | |||
if app.cs.setKeyFrame then | |||
app.cs.setKeyFrame(node , "位置"); | |||
end | |||
return true; | |||
end | |||
-- 撤销操作 | |||
local function undo() | |||
node:setWorldPosition(originalPos); | |||
-- 通知c#设置关键帧 | |||
if app.cs.setKeyFrame then | |||
app.cs.setKeyFrame(node , "位置"); | |||
end | |||
end | |||
return {redo = redo , undo = undo , node = node}; | |||
end | |||
-- 改变大小命令 | |||
-- 这里使用的node的父节点空间的位置,使用者要在外部转换好 | |||
function Commands:sizeNode(node , newSize) | |||
local originalSize; | |||
-- 恢复操作 | |||
local function redo() | |||
if not node then | |||
return false; | |||
end | |||
originalSize = node:getSize(); | |||
node:setSize(newSize); | |||
-- 通知c#设置关键帧 | |||
if app.cs.setKeyFrame then | |||
app.cs.setKeyFrame(node , "尺寸"); | |||
end | |||
app.editor:relayoutAll(); | |||
return true; | |||
end | |||
-- 撤销操作 | |||
local function undo() | |||
node:setSize(originalSize); | |||
-- 通知c#设置关键帧 | |||
if app.cs.setKeyFrame then | |||
app.cs.setKeyFrame(node , "尺寸"); | |||
end | |||
app.editor:relayoutAll(); | |||
end | |||
return {redo = redo , undo = undo , node = node}; | |||
end | |||
-- 删除一个节点 | |||
function Commands:deleteNode(node) | |||
local parent; | |||
local childrenIndexs = {}; | |||
local releaseNode = true; | |||
-- 恢复操作 | |||
local function redo() | |||
parent = node:getParent(); | |||
-- 记录子节点的索引位置 | |||
for i, v in pairs(parent:getChildren()) do | |||
childrenIndexs[v] = i; | |||
end | |||
node:retain(); | |||
node:removeFromParent(); | |||
-- 通知c#更新树状结构 | |||
app.cs.deleteNode(node); | |||
-- 删除这个节点 | |||
app.editor:deleteNode(node); | |||
-- 选中当前节点 | |||
app.cs.setPropertyObject(parent); | |||
--app.editor:selectNode(parent); | |||
releaseNode = true; | |||
app.editor:relayoutAll(); | |||
return true; | |||
end | |||
-- 撤销操作 | |||
local function undo() | |||
parent:addChild(node); | |||
app.editor:autoSetNodeName(node); | |||
for i, v in pairs(parent:getChildren()) do | |||
v:setOrderOfArrival(childrenIndexs[v]); | |||
end | |||
-- 重新排序 | |||
parent:sortAllChildren(); | |||
node:release(); | |||
-- 更新下树形结构 | |||
app.cs.addNode(node , node , childrenIndexs[node] - 1); | |||
-- 清空序列 | |||
childrenIndexs = {}; | |||
-- 选中这个节点 | |||
app.editor:selectNode(node); | |||
releaseNode = false; | |||
app.editor:relayoutAll(); | |||
end | |||
-- 清空操作 | |||
local function clear() | |||
if releaseNode then | |||
node:release(); | |||
end | |||
end | |||
return {redo = redo , undo = undo, clear = clear , node = node}; | |||
end | |||
-- 改变节点 | |||
function Commands:modifyNode(node, newParent) | |||
local originParent; | |||
-- 恢复操作 | |||
local function redo() | |||
if not node or not newParent or not node:getParent() then | |||
return false; | |||
end | |||
originParent = node:getParent(); | |||
node:retain(); | |||
node:removeFromParent(); | |||
newParent:addChild(node); | |||
app.editor:autoSetNodeName(node); | |||
node:release(); | |||
-- 通知编辑器的树更新 | |||
app.cs.modifyNode(node, newParent); | |||
app.editor:relayoutAll(); | |||
return true; | |||
end | |||
-- 撤销操作 | |||
local function undo() | |||
node:retain(); | |||
node:removeFromParent(); | |||
originParent:addChild(node); | |||
app.editor:autoSetNodeName(node); | |||
node:release(); | |||
-- 通知编辑器的树更新 | |||
app.cs.modifyNode(node, originParent); | |||
app.editor:relayoutAll(); | |||
end | |||
return {redo = redo , undo = undo , node = node}; | |||
end | |||
-- 交换节点 | |||
function Commands:swapNode(node1, node2) | |||
local originParent; | |||
-- 恢复操作 | |||
local function redo() | |||
if not node1 or not node1:getParent() or node1:getParent() ~= node2:getParent() then | |||
return false; | |||
end | |||
originParent = node1:getParent(); | |||
originParent:swapChild(node1 , node2); | |||
-- 通知编辑器的树更新 | |||
app.cs.swapNode(node1, node2); | |||
app.editor:relayoutAll(); | |||
return true; | |||
end | |||
-- 撤销操作 | |||
local function undo() | |||
originParent:swapChild(node1 , node2); | |||
-- 通知编辑器的树更新 | |||
app.cs.swapNode(node1, node2); | |||
app.editor:relayoutAll(); | |||
end | |||
return {redo = redo , undo = undo , node = node1}; | |||
end | |||
-- 拷贝一个节点 | |||
function Commands:addNode(node, parentNode) | |||
local releaseNode = false; | |||
local function redo() | |||
if node == nil or parentNode == nil then | |||
return false; | |||
end | |||
local oldCount = node:getReferenceCount(); | |||
-- 添加节点 | |||
parentNode:addChild(node); | |||
app.editor:autoSetNodeName(node); | |||
local newCount = node:getReferenceCount(); | |||
-- 添加节点失败,例如UIPageView不支持添加非Layout派生的节点成为他的子节点 | |||
if newCount == oldCount then | |||
return false; | |||
end | |||
if releaseNode then | |||
node:release(); | |||
end | |||
-- 更新树形结构 | |||
app.cs.addNode(node , node , -1); | |||
-- 选中当前节点 | |||
app.cs.setPropertyObject(node); | |||
releaseNode = false; | |||
app.editor:relayoutAll(); | |||
return true; | |||
end | |||
local function undo() | |||
if node == nil or parentNode == nil then | |||
return; | |||
end | |||
-- 这里需要保存下 | |||
node:retain(); | |||
node:removeFromParent(); | |||
-- 更新树形结构 | |||
app.cs.deleteNode(node); | |||
app.cs.setPropertyObject(parentNode); | |||
releaseNode = true; | |||
app.editor:relayoutAll(); | |||
end | |||
local function clear() | |||
if releaseNode then | |||
node:release(); | |||
end | |||
end | |||
return { redo = redo, undo = undo, clear = clear , node = node }; | |||
end | |||
-- 拷贝一个节点动画 | |||
function Commands:copyNodeAnim(node, parentNode) | |||
local releaseNode = false; | |||
local copyAnim = parentNode:saveAnimation(cc.CURVE_ANIMATION); | |||
local function redo() | |||
if node == nil or parentNode == nil then | |||
return false; | |||
end | |||
-- 复制动画 | |||
parentNode:removeAllAnimations(); | |||
node:cloneIntoAnim(parentNode); | |||
if releaseNode and not tolua.isnull(node) then | |||
node:release(); | |||
end | |||
-- 选中当前节点 | |||
app.cs.setPropertyObject(parentNode); | |||
releaseNode = false; | |||
app.editor:relayoutAll(); | |||
return true; | |||
end | |||
local function undo() | |||
if node == nil or parentNode == nil then | |||
return; | |||
end | |||
parentNode:removeAllAnimations(); | |||
local anim = parentNode:loadAnimation(copyAnim) | |||
parentNode:addAnimation(anim); | |||
-- 更新树形结构 | |||
app.cs.setPropertyObject(parentNode); | |||
releaseNode = true; | |||
app.editor:relayoutAll(); | |||
end | |||
local function clear() | |||
if releaseNode and not tolua.isnull(node) then | |||
node:release(); | |||
end | |||
end | |||
return { redo = redo, undo = undo, clear = clear , node = node }; | |||
end | |||
require("CombineEffectCommands") |
@@ -0,0 +1,113 @@ | |||
-- 版本对比功能 | |||
local newRes = {} | |||
local oldRes = {} | |||
-- 读取xml文件 | |||
local function readXml(sourceFile, resList) | |||
local pathName, baseName, ext = string.splitFilename(sourceFile); | |||
if ext ~= "xml" or baseName == "update.json" then | |||
return | |||
end | |||
if resList[baseName] == nil then | |||
resList[baseName] = {} | |||
end | |||
-- 读取xml文件 | |||
local fileData = loadfileData(sourceFile) | |||
-- 解密解压数据 | |||
local romFileData = cc.FilePackage:decrypt(FilePackage.uncompress(fileData)) | |||
-- 解析xml文件 | |||
local function onStartElement(name , atts) | |||
if name == "file" then | |||
resList[baseName][atts.name] = atts | |||
end | |||
end | |||
local ret, result = tiny.eval(romFileData , onStartElement) | |||
if ret == nil then | |||
print("文件" .. sourceFile .. "解析失败", result); | |||
end | |||
end | |||
-- 比较具体的目录 | |||
local function _compareRes(newPath, oldPath, resultPath, resVersion) | |||
local newResPath = newPath .. "/" .. resVersion | |||
local oldResPath = oldPath .. "/" .. resVersion | |||
local resultResPath = resultPath .. "/" .. resVersion | |||
createDir(newResPath); | |||
createDir(oldResPath); | |||
createDir(resultResPath); | |||
-- 清空下资源 | |||
newRes.resVersion = {} | |||
oldRes.resVersion = {} | |||
-- 载入对应目录的xml文件 | |||
visitPath(newResPath, readXml, newRes.resVersion); | |||
visitPath(oldResPath, readXml, oldRes.resVersion); | |||
-- 创建一个xml文件 | |||
local versionInfo = xml.new("root"); | |||
-- 需要更新文件的数量 | |||
versionInfo.updateFileCount = 0 | |||
-- 需要更新文件的大小 | |||
versionInfo.updateFileSize = 0 | |||
local xmlFileName | |||
-- 逐个文件对比 | |||
for i, v in pairs(newRes.resVersion) do | |||
-- 创建一个xml文件 | |||
local fileXml = xml.new("root") | |||
fileXml.updateFileCount = 0 | |||
fileXml.updateFileSize = 0 | |||
for name, fileInfo in pairs(v) do | |||
-- 获取老版本对应的资源 | |||
local oldFileInfo | |||
if oldRes.resVersion[i] == nil then | |||
oldFileInfo = nil | |||
else | |||
oldFileInfo = oldRes.resVersion[i][name] | |||
end | |||
if oldFileInfo == nil or fileInfo.md5 ~= oldFileInfo.md5 then | |||
-- 需要更新这个文件 | |||
local fileItem = xml.new("file") | |||
fileItem.origin = fileInfo.origin | |||
fileItem.name = fileInfo.name | |||
fileItem.md5 = fileInfo.md5 | |||
fileItem.compressedSize = fileInfo.compressedSize | |||
fileItem.size = fileInfo.size | |||
fileItem.offset = fileInfo.offset | |||
table.insert(fileXml, fileItem) | |||
fileXml.updateFileCount = fileXml.updateFileCount + 1 | |||
fileXml.updateFileSize = fileXml.updateFileSize + fileInfo.compressedSize | |||
end | |||
end | |||
-- 保存这个包需要更新的文件 | |||
versionInfo.updateFileCount = versionInfo.updateFileCount + fileXml.updateFileCount | |||
versionInfo.updateFileSize = versionInfo.updateFileSize + fileXml.updateFileSize | |||
local xmlInfoData = fileXml:toString(); | |||
saveFile(xmlInfoData, resultResPath .. "/" .. i); | |||
end | |||
-- 保存整个需要更新的文件 | |||
local xmlData = versionInfo:toString() | |||
saveFile(xmlData, resultResPath .. "/" .. "result.xml"); | |||
-- 打印出这次需要更新资源的大小 | |||
local updateSizeStr | |||
if versionInfo.updateFileSize / 1024 / 1024 >= 1 then | |||
updateSizeStr = versionInfo.updateFileSize / 1024 / 1024 .. "M" | |||
else | |||
updateSizeStr = versionInfo.updateFileSize / 1024 .. "KB" | |||
end | |||
print(resVersion .. "需要更新的资源包大小:", updateSizeStr) | |||
end | |||
-- 对比两个目录下的资源版本 | |||
function compareVersion(newPath, oldPath, resultPath) | |||
-- 比较png | |||
_compareRes(newPath, oldPath, resultPath, "png") | |||
-- 比较etc | |||
_compareRes(newPath, oldPath, resultPath, "etc") | |||
-- 比较pvr | |||
_compareRes(newPath, oldPath, resultPath, "pvr") | |||
end |
@@ -0,0 +1,654 @@ | |||
local bit32 = (bit32 or require("bit")) | |||
-- 一个缓存文件 | |||
local CacheFile = defClass("CacheFile" | |||
, defVar("origin" , VT_String) | |||
, defVar("name" , VT_String) | |||
, defVar("md5" , VT_String) | |||
, defVar("originSize" , VT_Double) | |||
, defVar("compileSize" , VT_Double) | |||
, defVar("encryptSize" , VT_Double) | |||
, defVar("compressedSize" , VT_Double) | |||
, defVar("modifyTime" , VT_Double) | |||
, defVar("compressedFile" , VT_String) | |||
, defVar("encryptFile" , VT_String) | |||
); | |||
-- 一组缓存文件 | |||
local CacheFileList = defClass("CacheFileList" | |||
, defVar("list" , VT_Map(VT_String , CacheFile)) | |||
); | |||
-- 保存所有缓存的文件 | |||
gCacheFiles = CacheFileList:new(); | |||
-- 所有配置文件的缓存 | |||
gConfigDescCacheFiles = nil | |||
-- 保存所有的xml文件对应的desc解析文件 | |||
gConfigXmlToDesc = {} | |||
local function getNextPowerOfTwo(value) | |||
local i = 1; | |||
while i < value do | |||
i = i * 2; | |||
end | |||
return i; | |||
end | |||
local function isPow2(size) | |||
return getNextPowerOfTwo(size) == size; | |||
end | |||
-- 载入文件数据 | |||
function loadfileData(filename) | |||
local fileData; | |||
-- 读取整个文件数据 | |||
local file = io.open(filename , "rb"); | |||
fileData = file:read("*a"); | |||
file:close(); | |||
return fileData; | |||
end | |||
--/* These describe the color_type field in png_info. */ | |||
--/* color type masks */ | |||
PNG_COLOR_MASK_PALETTE = 1 | |||
PNG_COLOR_MASK_COLOR = 2 | |||
PNG_COLOR_MASK_ALPHA = 4 | |||
--/* color types. Note that not all combinations are legal */ | |||
PNG_COLOR_TYPE_GRAY = 0 | |||
PNG_COLOR_TYPE_PALETTE = (PNG_COLOR_MASK_COLOR + PNG_COLOR_MASK_PALETTE) | |||
PNG_COLOR_TYPE_RGB = (PNG_COLOR_MASK_COLOR) | |||
PNG_COLOR_TYPE_RGB_ALPHA = (PNG_COLOR_MASK_COLOR + PNG_COLOR_MASK_ALPHA) | |||
PNG_COLOR_TYPE_GRAY_ALPHA =(PNG_COLOR_MASK_ALPHA) | |||
-- 编译png文件成pvr文件,并返回pvr文件名 | |||
local function _compilePngToPvr(sourceFile) | |||
local pathName , baseName , ext = string.splitFilename(sourceFile); | |||
-- 只打包这三个目录 | |||
if not (string.startsWith(pathName , "res/effect/") | |||
or string.startsWith(pathName , "res/animation/") | |||
or string.startsWith(pathName , "res/scene/")) then | |||
return sourceFile; | |||
end | |||
local image = cc.Image:analysisPngFile(sourceFile); | |||
-- PVR转换规则,长宽相等,大小是2次幂。 | |||
if image.image_width ~= image.image_height then | |||
return sourceFile; | |||
end | |||
-- 不是2次幂 | |||
if not isPow2(image.image_width) or not isPow2(image.image_height) then | |||
return sourceFile; | |||
end | |||
-- 最小8*8 | |||
if image.image_width < 8 or image.image_height < 8 then | |||
return sourceFile; | |||
end | |||
local pvrFormat; | |||
print("image" , table.tostring(image)); | |||
-- 根据纹理格式来决定pvr格式 | |||
if image.color_type == PNG_COLOR_TYPE_RGB then | |||
pvrFormat = "PVRTC1_4_RGB"; | |||
elseif image.color_type == PNG_COLOR_TYPE_RGB_ALPHA then | |||
pvrFormat = "PVRTC1_4"; | |||
elseif image.color_type == PNG_COLOR_TYPE_GRAY_ALPHA then | |||
pvrFormat = "PVRTC1_2"; | |||
elseif image.color_type == PNG_COLOR_TYPE_GRAY then | |||
pvrFormat = "PVRTC1_2_RGB"; | |||
elseif image.color_type == PNG_COLOR_TYPE_PALETTE then | |||
if image.expand_color_type == PNG_COLOR_TYPE_RGB_ALPHA then | |||
print("调色板带透明"); | |||
pvrFormat = "PVRTC1_4"; | |||
else | |||
print("调色板不带透明"); | |||
pvrFormat = "PVRTC1_2_RGB"; | |||
end | |||
else | |||
return sourceFile; | |||
end | |||
local pvrFile = "cache/" .. baseName .. "." .. pvrFormat .. ".pvr"; | |||
local exFlags = ""; | |||
-- 场景光效人物,要用mipmap | |||
--exFlags = exFlags .. " -m"; | |||
local cmdLine = string.format('PVRTexTool -i "%s" -o "%s" -f "%s"%s' , sourceFile , pvrFile , pvrFormat , exFlags); | |||
local out = io.popen(cmdLine , "r"); | |||
print("正在转换成pvr:" .. cmdLine); | |||
print(out:read("*a")); | |||
out:close(); | |||
local atts = lfs.attributes(pvrFile , "modification"); | |||
if not atts then | |||
error("转换pvr失败" .. sourceFile); | |||
return sourceFile; | |||
end | |||
return pvrFile; | |||
end | |||
-- 编译png文件成pvr文件,并返回pvr文件数据 | |||
local function compilePngToPvr(sourceFile) | |||
local fileName = _compilePngToPvr(sourceFile); | |||
return loadfileData(fileName); | |||
end | |||
-- 编译png文件成etc文件,并返回etc文件名 | |||
local function _compilePngToEtc(sourceFile) | |||
local pathName , baseName , ext = string.splitFilename(sourceFile); | |||
-- 只打包这三个目录 | |||
if not (string.startsWith(pathName , "res/effect/") | |||
or string.startsWith(pathName , "res/animation/") | |||
or string.startsWith(pathName , "res/scene/")) then | |||
return sourceFile; | |||
end | |||
local image = cc.Image:analysisPngFile(sourceFile); | |||
-- 不是2次幂 | |||
if not isPow2(image.image_width) or not isPow2(image.image_height) then | |||
return sourceFile; | |||
end | |||
-- 最小8*8 | |||
if image.image_width < 8 or image.image_height < 8 then | |||
return sourceFile; | |||
end | |||
local etcFormat; | |||
-- 根据纹理格式来决定etc格式 | |||
if image.expand_color_type == PNG_COLOR_TYPE_RGB or image.expand_color_type == PNG_COLOR_TYPE_GRAY then | |||
etcFormat = "ETC1"; | |||
else | |||
return sourceFile; | |||
end | |||
local etcFile = "cache/" .. baseName .. "." .. etcFormat .. ".pvr"; | |||
local exFlags = ""; | |||
-- 场景光效人物,要用mipmap | |||
--exFlags = exFlags .. " -m"; | |||
local cmdLine = string.format('PVRTexTool -i "%s" -o "%s" -f "%s"%s' , sourceFile , etcFile , etcFormat , exFlags); | |||
local out = io.popen(cmdLine , "r"); | |||
print("正在转换成etc:" .. cmdLine); | |||
print(out:read("*a")); | |||
out:close(); | |||
local atts = lfs.attributes(etcFile , "modification"); | |||
if not atts then | |||
error("转换etc失败" .. sourceFile); | |||
return sourceFile; | |||
end | |||
return etcFile; | |||
end | |||
-- 编译png文件成etc文件,并返回etc文件数据 | |||
local function compilePngToEtc(sourceFile) | |||
local fileName = _compilePngToEtc(sourceFile); | |||
return loadfileData(fileName); | |||
end | |||
-- 编译png文件成etc文件,并返回etc文件名 | |||
local function _compilePngToAtc(sourceFile) | |||
local pathName , baseName , ext = string.splitFilename(sourceFile); | |||
if string.startsWith(pathName , "res/scene/scene_maoxian_002") then | |||
print("res/scene/scene_maoxian_002不能压缩纹理,文件名" .. sourceFile); | |||
return sourceFile; | |||
end | |||
-- 只打包这三个目录 | |||
if not (string.startsWith(pathName , "res/effect/") | |||
or string.startsWith(pathName , "res/animation/") | |||
or string.startsWith(pathName , "res/ui/") | |||
or string.startsWith(pathName , "res/scene/"))then | |||
print("指定目录之外的纹理不需要压缩,文件名" .. sourceFile); | |||
return sourceFile; | |||
end | |||
local image = cc.Image:analysisPngFile(sourceFile); | |||
-- 最小8*8 | |||
if image.image_width < 8 or image.image_height < 8 then | |||
print("长宽小于8不能压缩纹理,文件名" .. sourceFile); | |||
return sourceFile; | |||
end | |||
local etcFormat; | |||
-- 根据纹理格式来决定atc格式 | |||
if image.color_type == PNG_COLOR_TYPE_RGB or image.expand_color_type == PNG_COLOR_TYPE_RGB then | |||
etcFormat = "RGB"; | |||
elseif image.color_type == PNG_COLOR_TYPE_RGB_ALPHA or image.expand_color_type == PNG_COLOR_TYPE_RGB_ALPHA then | |||
etcFormat = "RGBA" | |||
else | |||
print("Texture color type is", image.color_type) | |||
print("Texture expand color type is", image.expand_color_type) | |||
print("纹理格式不是RGB或者是RGBA格式,不能转换成压缩纹理,文件名" .. sourceFile); | |||
return sourceFile; | |||
end | |||
-- | |||
local atcFile = "cache/" .. baseName .. "." .. etcFormat .. ".atc"; | |||
local cmdLine = string.format('atc_texture "%s" "%s"' , sourceFile , atcFile); | |||
local out = io.popen(cmdLine , "r"); | |||
print("正在转换成atc:" .. cmdLine); | |||
print(out:read("*a")); | |||
out:close(); | |||
local atts = lfs.attributes(atcFile , "modification"); | |||
if not atts then | |||
error("转换atc失败" .. sourceFile); | |||
return sourceFile; | |||
end | |||
return atcFile; | |||
end | |||
-- 编译png文件成atc文件,并返回atc文件数据 | |||
local function compilePngToAtc(sourceFile) | |||
local fileName = _compilePngToAtc(sourceFile); | |||
return loadfileData(fileName); | |||
end | |||
-- 编译lua文件,并返回编译后的数据 | |||
function compileLua52(filename) | |||
-- 编译lua | |||
print("正在编译Lua52:" , filename); | |||
local cmdLine = string.format('luac.exe -o "luac_tmp.bin" "%s"' , cc.FileUtils:getInstance():fullPathForFilename(filename)); | |||
local out = io.popen(cmdLine , "r"); | |||
print("正在运行:" .. cmdLine); | |||
print(out:read("*a")); | |||
local r , what , code = out:close(); | |||
if code ~= 0 then | |||
error("编译脚本出错:" .. filename); | |||
end | |||
return loadfileData(cc.FileUtils:getInstance():fullPathForFilename("luac_tmp.bin")); | |||
end | |||
-- 编译lua文件,并返回编译后的数据 | |||
function compileLuajit(filename) | |||
-- 编译lua | |||
print("正在编译Luajit:" , filename); | |||
local cmdLine = string.format('luajit -b -g "%s" "luac_tmp.bin"' , cc.FileUtils:getInstance():fullPathForFilename(filename)); | |||
local out = io.popen(cmdLine , "r"); | |||
print("正在运行:" .. cmdLine); | |||
print(out:read("*a")); | |||
local r , what , code = out:close(); | |||
if code ~= 0 then | |||
error("编译脚本出错:" .. filename); | |||
end | |||
return loadfileData(cc.FileUtils:getInstance():fullPathForFilename("luac_tmp.bin")); | |||
end | |||
function compileLua(filename) | |||
if hasCmdArg("-lua") then | |||
return compileLua52(filename); | |||
else | |||
return compileLuajit(filename); | |||
end | |||
end | |||
local ConfigLoaded = false; | |||
function loadAllXML() | |||
if ConfigLoaded then return; end | |||
ConfigLoaded = true; | |||
local s = app.config.Setting; | |||
local r = app.config.RomSetting; | |||
app.config = require("LoadAllConfigs") | |||
app.config.Setting = s; | |||
app.config.RomSetting = r; | |||
for i, v in pairs(app.config) do | |||
if type(v) == "function" then | |||
app.config[i] = v() | |||
end | |||
end | |||
end | |||
-- 获取对应版本的lua后缀名 | |||
local function getLuaExtName(baseName) | |||
local saveBaseName | |||
if hasCmdArg("-lua") then | |||
saveBaseName = baseName .. ".lua52"; | |||
else | |||
saveBaseName = baseName .. ".luajit"; | |||
end | |||
return saveBaseName | |||
end | |||
-- 判断一个策划配置的xml文件依赖的desc文件是否改变 | |||
local function isConfigXmlDescChanged(xmlFileName) | |||
local descFileName = gConfigXmlToDesc[xmlFileName] | |||
if not descFileName then | |||
print("配置文件:" .. xmlFileName .. "统计不到对应的desc缓存文件,xml文件需要重新打包") | |||
return true | |||
end | |||
-- 读取文件 | |||
local atts = lfs.attributes(descFileName); | |||
if not atts then | |||
error("找不到文件" .. descFileName); | |||
return true; | |||
end | |||
-- 拆分desc文件名 | |||
local pathName, baseName, ext = string.splitFilename(descFileName); | |||
local saveBaseName = getLuaExtName(baseName) | |||
local cacheFile = gConfigDescCacheFiles.list[saveBaseName]; | |||
if cacheFile then | |||
if cacheFile.origin == descFileName and cacheFile.modifyTime == atts.modification and cacheFile.originSize == atts.size then | |||
-- 文件没有改变则不需要重新生成 | |||
return false | |||
end | |||
end | |||
print("配置文件:" .. xmlFileName .. "对应的desc文件:" .. descFileName .. "改变了,xml文件需要重新打包") | |||
return true | |||
end | |||
local function optimiseRewardConfig(RewardConfig) | |||
local deleted = {} | |||
for i , v in pairs(RewardConfig) do | |||
--print("删掉空奖励:" , table.tostring(v)); | |||
if not v.epFull | |||
and not v.apFull | |||
and #v.gold == 1 and v.gold[1] == "" | |||
and #v.ticket == 1 and v.ticket[1] == "" | |||
and #v.redGem == 1 and v.redGem[1] == "" | |||
and #v.goods == 1 and #v.goods[1] == 1 and v.goods[1][1] == "" | |||
and #v.treasure == 0 | |||
and #v.awardHero == 0 | |||
and #v.awardHeroSaga == 0 | |||
and #v.awardRune == 0 | |||
and #v.awardRuneChip == 0 | |||
and #v.awardHeroSoul == 0 | |||
and (not v.awardPrivilege or v.awardPrivilege == 0) | |||
then | |||
table.insert(deleted , i); | |||
print("删掉空奖励:" , i); | |||
end | |||
end | |||
print("总共删掉空奖励:" , #deleted); | |||
for i , v in ipairs(deleted) do | |||
RewardConfig[v] = nil; | |||
end | |||
end | |||
local function optimiseHeroAwardConfig(AwardConfig) | |||
local deleted = {} | |||
for i , v in pairs(AwardConfig) do | |||
if #v.awardValue == 0 or (#v.awardDungeon == 1 and #v.awardDungeon[1] == 0) then | |||
table.insert(deleted , i); | |||
print("删掉如何获得的空配置:" , i); | |||
end | |||
end | |||
print("总共删掉如何获得空配置:" , #deleted); | |||
for i , v in ipairs(deleted) do | |||
AwardConfig[v] = nil; | |||
end | |||
end | |||
local function copyFile(dstFile , srcFile) | |||
local src = io.open(srcFile , "rb"); | |||
local dst = io.open(dstFile , "wb"); | |||
dst:write(src:read("*a")); | |||
dst:close(); | |||
src:close(); | |||
end | |||
-- 编译xml文件,并返回编译后的数据 | |||
function compileXml(sourceFile) | |||
loadAllXML(); | |||
local luaData; | |||
for i , v in pairs(app.config) do | |||
if i ~= "Setting" and i ~= "RomSetting" then | |||
if type(v.LuaFile) == "string" then | |||
local filename = v.XmlFile; | |||
if "dataconfig/" .. filename == sourceFile then | |||
local luaFile = "cache/" .. filename .. ".lua"; | |||
if filename == "pvpRewardConfig.xml" | |||
or filename == "riftRewardConfig.xml" | |||
or filename == "castleRewardConfig.xml" | |||
or filename == "vipRewardConfig.xml" | |||
or filename == "commonRewardConfig.xml" | |||
or filename == "appRewardConfig.xml" | |||
or filename == "rankRewardConfig.xml" | |||
or filename == "pveRewardConfig.xml" | |||
or filename == "achieveRewardConfig.xml" then | |||
optimiseRewardConfig(v); | |||
end | |||
if filename == "awardHeroSoulConfig.xml" | |||
or filename == "awardStarUpFoodConfig.xml" then | |||
optimiseHeroAwardConfig(v); | |||
end | |||
copyFile(luaFile , v.LuaFile); | |||
luaData = compileLua(luaFile); | |||
break; | |||
end | |||
else | |||
local desc = v:getConfigDesc(); | |||
local filename = desc.XMLFile; | |||
if "dataconfig/" .. filename == sourceFile then | |||
local luaFile = "cache/" .. filename .. ".lua"; | |||
if filename == "pvpRewardConfig.xml" | |||
or filename == "riftRewardConfig.xml" | |||
or filename == "castleRewardConfig.xml" | |||
or filename == "vipRewardConfig.xml" | |||
or filename == "commonRewardConfig.xml" | |||
or filename == "appRewardConfig.xml" | |||
or filename == "rankRewardConfig.xml" | |||
or filename == "pveRewardConfig.xml" | |||
or filename == "achieveRewardConfig.xml" then | |||
optimiseRewardConfig(v); | |||
end | |||
if filename == "awardHeroSoulConfig.xml" | |||
or filename == "awardStarUpFoodConfig.xml" then | |||
optimiseHeroAwardConfig(v); | |||
end | |||
saveLuaXMLConfig(v , desc, luaFile); | |||
luaData = compileLua(luaFile); | |||
break; | |||
end | |||
end | |||
end | |||
end | |||
if luaData ~= nil then | |||
return lzma.compress(luaData); | |||
end | |||
end | |||
local keepFiles = {}; | |||
-- 编译文件 | |||
function compileFile(sourceFile, targetPath) | |||
local pathName , baseName , ext = string.splitFilename(sourceFile); | |||
local lowerExt = string.lower(ext); | |||
if isIgnoreFile(pathName , baseName , ext) then | |||
return; | |||
end | |||
local atts = lfs.attributes(sourceFile); | |||
if not atts then | |||
error("找不到文件" .. sourceFile); | |||
return; | |||
end | |||
local keepFile = keepFiles[pathName]; | |||
if not keepFile then | |||
keepFile = {}; | |||
keepFiles[pathName] = keepFile; | |||
local f , r = io.open(pathName .. "/keep.txt" , "rb"); | |||
print("open keep" , f , r); | |||
if f then | |||
while true do | |||
local fileName = f:read("*l"); | |||
print("read keep" , fileName); | |||
if fileName then | |||
fileName = string.trim(fileName); | |||
keepFile[fileName] = true; | |||
print("set keep " , fileName); | |||
else | |||
break; | |||
end | |||
end | |||
f:close(); | |||
end | |||
end | |||
local saveBaseName = baseName; | |||
if not keepFile[baseName] then | |||
-- 处理png | |||
if lowerExt == "png" then | |||
-- preload要用png格式,有些机子不支持etc | |||
if pathName ~= "preload" then | |||
-- 是否支持PVR格式 | |||
if hasCmdArg("-pvr") then | |||
saveBaseName = saveBaseName .. ".pvr"; | |||
end | |||
-- 是否支持PVR格式 | |||
if hasCmdArg("-etc") then | |||
saveBaseName = saveBaseName .. ".etc"; | |||
end | |||
-- 是否支持PVR格式 | |||
if hasCmdArg("-atc") then | |||
saveBaseName = saveBaseName .. ".atc"; | |||
end | |||
end | |||
end | |||
-- lua文件 | |||
if (isLuaFileExt(lowerExt) or (lowerExt == "xml" and pathName == "dataconfig")) then | |||
saveBaseName = getLuaExtName(saveBaseName) | |||
end | |||
else | |||
print("file keeped : " , baseName); | |||
saveBaseName = baseName .. ".keep"; | |||
end | |||
local cacheFile = gCacheFiles.list[saveBaseName]; | |||
if cacheFile then | |||
if cacheFile.origin == sourceFile and cacheFile.modifyTime == atts.modification and cacheFile.originSize == atts.size then | |||
-- 如果是dataconfig里面的xml则需要对比下desc文件是否改变了 | |||
if lowerExt == "xml" and pathName == "dataconfig" then | |||
if isConfigXmlDescChanged(baseName) == false then | |||
print("配置文件没有改变,不需要重新打包", baseName) | |||
return cacheFile | |||
end | |||
elseif baseName ~= "Setting.lua" then | |||
return cacheFile; | |||
end | |||
end | |||
end | |||
print("编译文件" .. sourceFile) | |||
local fileData; | |||
if not keepFile[baseName] then | |||
print("skip keeped : " , baseName); | |||
-- 处理png | |||
if lowerExt == "png" then | |||
-- preload要用png格式,有些机子不支持etc | |||
if pathName ~= "preload" then | |||
-- 是否支持PVR格式 | |||
if hasCmdArg("-pvr") then | |||
fileData = compilePngToPvr(sourceFile); | |||
end | |||
if hasCmdArg("-etc") then | |||
fileData = compilePngToEtc(sourceFile); | |||
end | |||
if hasCmdArg("-atc") then | |||
fileData = compilePngToAtc(sourceFile); | |||
end | |||
else | |||
print("preload的文件不用编译png" , sourceFile); | |||
end | |||
-- 编译配置文件 | |||
elseif lowerExt == "xml" then | |||
fileData = compileXml(sourceFile); | |||
-- 编译lua文件 | |||
elseif isLuaFileExt(lowerExt) then | |||
fileData = compileLua(sourceFile); | |||
end | |||
end | |||
-- 普通文件加载 | |||
if fileData == nil then | |||
fileData = loadfileData(sourceFile); | |||
end | |||
-- 计算文件信息 | |||
local fileInfo = CacheFile:new(); | |||
fileInfo.origin = sourceFile; | |||
fileInfo.name = baseName; | |||
fileInfo.md5 = md5.sumhexa(fileData); | |||
fileInfo.compileSize = #fileData; | |||
fileInfo.originSize = atts.size; | |||
-- 保存修改时间 | |||
fileInfo.modifyTime = atts.modification; | |||
-- 加密文件 | |||
local encryptData = FilePackage.encrypt(fileData) | |||
fileInfo.encryptSize = string.len(encryptData); | |||
-- 加密完毕后,计算出加密后大小 | |||
fileInfo.encryptFile = targetPath .. "/cache/" .. saveBaseName .. ".encrypt"; | |||
saveFile(encryptData , fileInfo.encryptFile); | |||
-- 压缩文件 | |||
local compressedData = FilePackage.compress(encryptData) | |||
fileInfo.compressedSize = string.len(compressedData); | |||
-- 压缩完毕后,计算出压缩后大小 | |||
fileInfo.compressedFile = targetPath .."/cache/" .. saveBaseName .. ".compressed"; | |||
saveFile(compressedData , fileInfo.compressedFile); | |||
gCacheFiles.list[saveBaseName] = fileInfo; | |||
--print("编译文件完毕" .. sourceFile); | |||
return fileInfo; | |||
end | |||
-- 保存文件列表 | |||
function saveCacheFile(filename) | |||
local stream = NetStream.new(); | |||
gCacheFiles:write(stream); | |||
print("保存缓存数据:" , #gCacheFiles.list) | |||
local cacheData = NetStream.getWriteData(stream); | |||
saveFile(cacheData , filename); | |||
NetStream.delete(stream); | |||
end | |||
-- 载入文件列表 | |||
function loadCacheFile(filename) | |||
gCacheFiles = CacheFileList:new(); | |||
local cacheData = loadFile(filename); | |||
if cacheData then | |||
local stream = NetStream.new(cacheData); | |||
gCacheFiles = CacheFileList:read(stream); | |||
print("载入缓存数据:" , #gCacheFiles.list) | |||
NetStream.delete(stream); | |||
end | |||
end | |||
-- 载入配置描述列表 | |||
function loadConfigDescCacheFile(configDescFileName) | |||
gConfigDescCacheFiles = CacheFileList:new(); | |||
local cacheData = loadFile(configDescFileName); | |||
if cacheData then | |||
local stream = NetStream.new(cacheData); | |||
gConfigDescCacheFiles = CacheFileList:read(stream); | |||
NetStream.delete(stream); | |||
end | |||
end |
@@ -0,0 +1,61 @@ | |||
local Editor = class("Editor") | |||
function Editor:activate() | |||
end | |||
function Editor:unactivate() | |||
end | |||
function Editor:play() | |||
end | |||
function Editor:stop() | |||
end | |||
function Editor:save(filename) | |||
end | |||
function Editor:relayoutAll() | |||
end | |||
-- 自动命名成不重名 | |||
function Editor:autoSetNodeName(node) | |||
if not self.node then | |||
return; | |||
end | |||
local names = {}; | |||
self.node:visitNode(function(child) | |||
if child ~= node then | |||
names[child:getName()] = child; | |||
end | |||
return true; | |||
end); | |||
while(names[node:getName()]) do | |||
local name = node:getName(); | |||
local ret , matchNum = string.gsub(name , "(.*_)([0-9]+)$" , function(...) | |||
local args = {...} | |||
return args[1] .. tostring(tonumber(args[2]) + 1); | |||
end); | |||
if matchNum == 0 then | |||
node:setName(ret .. "_1"); | |||
else | |||
node:setName(ret); | |||
end | |||
end | |||
-- 所有子节点也要做这个处理 | |||
for i , child in pairs(node:getChildren()) do | |||
self:autoSetNodeName(child); | |||
end | |||
end | |||
return Editor; |
@@ -0,0 +1,738 @@ | |||
-- package.path = ";preload/?.lua" | |||
-- package.path = package.path .. "?;?.lua;preload/?.lua" | |||
-- package.path = package.path .. ";preload/tools/?.lua" | |||
-- package.path = package.path .. ";Editor/?.lua" | |||
-- package.path = package.path .. ";luaScript/?.lua" | |||
-- package.path = package.path .. ";dataconfig/?.lua" | |||
-- package.path = package.path .. ";romFiles/?.lua" | |||
-- package.path = package.path .. ";luaScript/cc/?.lua" | |||
-- package.path = package.path .. ";luaScript/Tools/?.lua" | |||
-- package.path = package.path .. ";luaScript/Tools/Nodes/?.lua" | |||
-- package.path = package.path .. ";luaScript/Tools/Widgets/?.lua" | |||
-- package.path = package.path .. ";luaScript/Tools/Tracks/?.lua" | |||
-- package.path = package.path .. ";luaScript/Tools/Effect/?.lua" | |||
-- package.path = package.path .. ";luaScript/Tools/Other/?.lua" | |||
-- package.path = package.path .. ";luaScript/Tools/Effect/ParticleSystem/?.lua" | |||
-- package.path = package.path .. ";luaScript/Tools/Effect/ParticleSystem/Affector/?.lua" | |||
-- package.path = package.path .. ";luaScript/Tools/Effect/ParticleSystem/Emitter/?.lua" | |||
-- package.path = package.path .. ";luaScript/Protocol/?.lua" | |||
-- package.path = package.path .. ";luaScript/Config/?.lua" | |||
-- package.path = package.path .. ";luaScript/Extension/?.lua" | |||
-- package.path = package.path .. ";luaScript/Map/?.lua" | |||
-- package.path = package.path .. ";luaScript/Views/?.lua" | |||
-- package.path = package.path .. ";luaScript/Config/Languages/?.lua" | |||
-- package.path = package.path .. ";luaScript/Config/ConfigDesc/?.lua" | |||
-- package.path = package.path .. ";luaScript/User/?.lua" | |||
-- package.path = package.path .. ";luaScript/Learning/?.lua" | |||
-- package.path = package.path .. ";luaScript/Learning/Script/?.lua" | |||
-- cc.FileUtils:getInstance():addSearchPath("core") | |||
-- cc.FileUtils:getInstance():addSearchPath("core/preload") | |||
-- cc.FileUtils:getInstance():addSearchPath("core/preload/tools") | |||
-- cc.FileUtils:getInstance():addSearchPath("core/Editor") | |||
-- cc.FileUtils:getInstance():addSearchPath("core/luaScript") | |||
-- cc.FileUtils:getInstance():addSearchPath("core/dataconfig") | |||
-- cc.FileUtils:getInstance():addSearchPath("core/romFiles") | |||
-- cc.FileUtils:getInstance():addSearchPath("core/luaScript/cc") | |||
-- cc.FileUtils:getInstance():addSearchPath("core/luaScript/Tools") | |||
-- cc.FileUtils:getInstance():addSearchPath("core/luaScript/Tools/Other") | |||
-- cc.FileUtils:getInstance():addSearchPath("core/luaScript/Tools/Nodes") | |||
-- cc.FileUtils:getInstance():addSearchPath("core/luaScript/Tools/Widgets") | |||
-- cc.FileUtils:getInstance():addSearchPath("core/luaScript/Tools/Tracks") | |||
-- cc.FileUtils:getInstance():addSearchPath("core/luaScript/Tools/Effect") | |||
-- cc.FileUtils:getInstance():addSearchPath("core/luaScript/Tools/Effect/ParticleSystem") | |||
-- cc.FileUtils:getInstance():addSearchPath("core/luaScript/Tools/Effect/ParticleSystem/Affector") | |||
-- cc.FileUtils:getInstance():addSearchPath("core/luaScript/Tools/Effect/ParticleSystem/Emitter") | |||
-- cc.FileUtils:getInstance():addSearchPath("core/luaScript/Protocol") | |||
-- cc.FileUtils:getInstance():addSearchPath("core/luaScript/Config") | |||
-- cc.FileUtils:getInstance():addSearchPath("core/luaScript/Extension") | |||
-- cc.FileUtils:getInstance():addSearchPath("core/luaScript/Map") | |||
-- cc.FileUtils:getInstance():addSearchPath("core/luaScript/Views") | |||
-- cc.FileUtils:getInstance():addSearchPath("core/luaScript/Config/Languages") | |||
-- cc.FileUtils:getInstance():addSearchPath("core/luaScript/Config/ConfigDesc") | |||
-- cc.FileUtils:getInstance():addSearchPath("core/luaScript/User") | |||
-- cc.FileUtils:getInstance():addSearchPath("core/luaScript/Plugins") | |||
-- cc.FileUtils:getInstance():addSearchPath("core/luaScript/PluginAdvertise") | |||
-- cc.FileUtils:getInstance():addSearchPath("core/luaScript/Learning") | |||
-- cc.FileUtils:getInstance():addSearchPath("core/luaScript/Learning/Script") | |||
require("EditorGlobalFunction") | |||
require("CCBoxNode") | |||
require("NodeEditor") | |||
require("ObstacleTool") | |||
require("CombineEffectEditor") | |||
require("CCNode") | |||
require("CCEffectNode") | |||
require("CCEffectFileEffectNode") | |||
require("CCParticleEffectNode") | |||
require("CCCombineEffect") | |||
require("MapEditor") | |||
require("EditorNodeZorder") | |||
require("AnimEntityInstance") | |||
require("UndoRedoManager") | |||
require("MoveTool") | |||
require("Move2DTool") | |||
require("Move3DTool") | |||
require("preload") | |||
local EditorApp = class("EditorApp", cc.mvc.AppBase) | |||
function EditorApp:ctor() | |||
EditorApp.super.ctor(self); | |||
-- 用来保存C#提供的回调函数 | |||
-- NodeEditor提供setPropertyObject | |||
self.cs = {}; | |||
-- 当前的编辑器 | |||
self.editor = nil; | |||
-- 鼠标移动工具 | |||
self.cameraController = require("Camera2DControllerTool"):new(); | |||
-- 撤销管理器 | |||
self.undoRedoManager = require("UndoRedoManager"):new(); | |||
-- 主场景 | |||
self.mainScene = nil | |||
-- 主画布 | |||
self.mainLayer = nil | |||
-- 主相机 | |||
self.mainCamera = nil | |||
-- 移动工具 | |||
self.activeMoveTool = require("Move2DTool"):new(); | |||
-- 底图 | |||
self.background = nil | |||
-- 自定义侦听渲染的listener | |||
self.eventAfterDrawListener = nil | |||
-- 对齐工具 | |||
self.alignTool = require("AlignTool"):new(); | |||
self.setting = | |||
{ | |||
GridColor = cc.c4f(1,1,0,1), | |||
AxisColor = cc.c4f(1,1,1,1), | |||
GridSize = cc.size(100,100), | |||
ResourceSize = cc.size(1280,720), | |||
BackgroundColor = cc.c4b(0,0,0 , 255), | |||
BackgroundImage = "", | |||
ShowFPS = false, | |||
ShowGrid = true, | |||
ShowIPhone5 = false, | |||
ScreenScale = 1, | |||
ScreenScaleMax = 16, | |||
ScreenScaleMin = 0.1, | |||
-- 技能源模型文件 | |||
SourceModelFile = "res/default/DefaultModel/DefaultModel.gpb"; | |||
-- 技能目标模型文件 | |||
TargetModelFile = "res/default/DefaultModel/DefaultModel.gpb"; | |||
-- 显示碰撞体的调试信息 | |||
ShowCollision = false; | |||
OriginAnchor = cc.p(0.5,0.5), | |||
DisableAudio = false; | |||
-- 默认是否播放UI动画 | |||
PlayUIAnimation = false; | |||
} | |||
self.config = {Setting = self.setting}; | |||
-- 可见区域 | |||
self.visibleRect = require("VisibleRect"):new(); | |||
self.cameraNode3D = nil; | |||
end | |||
function EditorApp:createObject(name) | |||
return require(name):new(); | |||
end | |||
-- 获取操作的相机 | |||
function EditorApp:getMainCameraShakeNode() | |||
return self.mainCamera:getNode(); | |||
end | |||
-- 激活一个编辑器 | |||
function EditorApp:activateEditor(editorName) | |||
if self.editor then | |||
self.editor:unactivate(); | |||
end | |||
self.editor = require(editorName):new(); | |||
self.editor:activate(); | |||
-- 清空undo redo列表 | |||
self.undoRedoManager:clear(); | |||
end | |||
function EditorApp:activate2DCamera() | |||
self.mainCamera = cc.Director:getInstance():getActiveCamera(); | |||
self.cameraController = require("Camera2DControllerTool"):new(); | |||
self.mainLayer:setActiveCamera(nil); | |||
self.cameraController:update(); | |||
self.cameraController:refreshSetting(); | |||
-- 切换移动工具 | |||
self.activeMoveTool:clear(); | |||
self.activeMoveTool = require("Move2DTool"):new(); | |||
cc.AudioListener:getInstance():setCamera(self.mainCamera); | |||
end | |||
function EditorApp:activate3DCamera() | |||
if not self.cameraNode3D then | |||
-- 创建透视投影相机 | |||
local camera = cc.Camera:createPerspective(45 , 1 , 1 , 1000); | |||
cc.Director:getInstance():getActiveCamera():getNode():setScale(1.0); | |||
local cameraNode = cc.Node3D:create("CameraNode3D"); | |||
cameraNode:addComponent(camera); | |||
local cameraParentNode = cc.Node3D:create(); | |||
cameraParentNode:addChild(cameraNode) | |||
self.mainLayer:addChild(cameraParentNode); | |||
self.cameraNode3D = cameraNode; | |||
end | |||
self.mainLayer:setActiveCamera(self.cameraNode3D:getCamera()); | |||
self.mainCamera = self.cameraNode3D:getCamera(); | |||
self.mainCamera:setAspectRatio(cc.Director:getInstance():getWinSize().width / cc.Director:getInstance():getWinSize().height); | |||
self.cameraController = require("Camera3DControllerTool"):new(); | |||
self.cameraController:update(); | |||
self.cameraController:refreshSetting(); | |||
-- 切换移动工具 | |||
self.activeMoveTool:clear(); | |||
self.activeMoveTool = require("Move3DTool"):new(); | |||
cc.AudioListener:getInstance():setCamera(self.mainCamera); | |||
end | |||
-- 获取相机 | |||
function EditorApp:getActivateCamera() | |||
return self.mainCamera | |||
end | |||
-- 激活一个自定义相机 | |||
function EditorApp:activateCustomCamera(camera) | |||
self.mainLayer:setActiveCamera(camera); | |||
self.mainCamera = camera; | |||
self.cameraController = require("Camera3DControllerTool"):new(); | |||
self.cameraController:update(); | |||
self.cameraController:refreshSetting(); | |||
-- 切换移动工具 | |||
self.activeMoveTool:clear(); | |||
self.activeMoveTool = require("Move3DTool"):new(); | |||
cc.AudioListener:getInstance():setCamera(self.mainCamera); | |||
end | |||
function EditorApp:isActiveCamera(camera) | |||
return self.mainCamera == camera; | |||
end | |||
function EditorApp:is3DCamera() | |||
if self.mainLayer:getActiveCamera() == nil or self.mainLayer:getActiveCamera() then | |||
return false; | |||
end | |||
return true; | |||
end | |||
-- 反激活一个编辑器 | |||
function EditorApp:unactivateEditor(editorName) | |||
if self.editor and iskindof(self.editor , editorName) then | |||
self.editor:unactivate(); | |||
self.editor = nil; | |||
end | |||
-- 清空undo redo列表 | |||
self.undoRedoManager:clear(); | |||
end | |||
function EditorApp:run() | |||
-- 创建默认场景 | |||
self.mainScene = cc.Scene:create(); | |||
local layer = cc.Scene:create(); | |||
layer:setContentSize(self.setting.ResourceSize); | |||
layer:setAnchorPoint(cc.p(0,0)); | |||
self.mainLayer = layer; | |||
self.mainScene:addChild(layer); | |||
-- 默认不使用这个2D相机 | |||
self.mainLayer:setActiveCamera(nil); | |||
local background = cc.Layer:create(); | |||
self.background = background; | |||
self.mainLayer:addChild(background, EditorNodeZorder.CoordinateNodeZorder); | |||
-- 默认加载通用图 | |||
cc.SpriteFrameCache:getInstance():addSpriteFramesWithFile("res/default/default-textures.plist"); | |||
cc.SpriteFrameCache:getInstance():addSpriteFramesWithFile("res/ui/zy_tongyong/t_tongyong_1.plist"); | |||
cc.SpriteFrameCache:getInstance():addSpriteFramesWithFile("res/ui/zy_tongyong/t_tongyong_2.plist"); | |||
-- 默认使用2D相机 | |||
self:activate2DCamera(); | |||
cc.StreamObject:addIgnoreDir("core"); | |||
cc.StreamObject:addIgnoreDir("huanle"); | |||
cc.StreamObject:addIgnoreDir("chuannan"); | |||
cc.StreamObject:addIgnoreDir("youxianmj"); | |||
cc.StreamObject:addIgnoreDir("chongqing"); | |||
cc.StreamObject:addIgnoreDir("shuzhou"); | |||
cc.Director:getInstance():runWithScene(self.mainScene) | |||
self:refreshSetting(); | |||
end | |||
function EditorApp:getOriginOffset() | |||
return cc.p(cc.Director:getInstance():getWinSize().width * self.setting.OriginAnchor.x , cc.Director:getInstance():getWinSize().height * self.setting.OriginAnchor.y); | |||
end | |||
-- 改变编辑器大小 | |||
function EditorApp:resize(w , h) | |||
self.mainCamera:setAspectRatio(w/h); | |||
cc.Application:getInstance():applicationScreenSizeChanged(w, h); | |||
cc.Director:getInstance():getOpenGLView():setDesignResolutionSize(w , h , cc.ResolutionPolicy.EXACT_FIT); | |||
self.mainScene:setScale(self.setting.ScreenScale); | |||
-- 通知可见区域更新 | |||
self.visibleRect:updateVisibleRect(); | |||
--self.mainScene:setContentSize(cc.Director:getInstance():getWinSize()); | |||
self.background:setContentSize(cc.Director:getInstance():getWinSize()); | |||
--self.mainLayer:setContentSize(cc.Director:getInstance():getWinSize()); | |||
self:refreshSetting(); | |||
end | |||
-- 创建网格 | |||
function EditorApp:refreshSetting() | |||
-- 设置全局缩放 | |||
local pDirector = cc.Director:getInstance(); | |||
local pEGLView = cc.Director:getInstance():getOpenGLView(); | |||
cc.Director:getInstance():getOpenGLView():setDesignResolutionSize(pEGLView:getFrameSize().width , pEGLView:getFrameSize().height , cc.ResolutionPolicy.EXACT_FIT); | |||
--self.mainScene:setScale(self.setting.ScreenScale); | |||
-- 居中 | |||
--self.mainLayer:setPosition(self:getOriginOffset()); | |||
-- 更新相机控制器 | |||
self.cameraController:refreshSetting(); | |||
local pDirector = cc.Director:getInstance(); | |||
pDirector:setDisplayStats(self.setting.ShowFPS); | |||
-- 是否需要显示碰撞体 | |||
if self.setting.ShowCollision == true and self.eventAfterDrawListener == nil then | |||
self.eventAfterDrawListener = cc.EventListenerCustom:create("director_after_draw" , handler(self , self.onUpdate)); | |||
cc.Director:getInstance():getEventDispatcher():addEventListenerWithFixedPriority(self.eventAfterDrawListener, 1); | |||
elseif self.setting.ShowCollision == false and self.eventAfterDrawListener ~= nil then | |||
cc.Director:getInstance():getEventDispatcher():removeEventListener(self.eventAfterDrawListener) | |||
self.eventAfterDrawListener = nil | |||
end | |||
local winSize = self.setting.ResourceSize; | |||
local resourceSize = {width = 1280 ; height = 720}; | |||
-- 实际比率 | |||
local radio = winSize.width / winSize.height; | |||
-- 标准比率 | |||
local resourceRadio = resourceSize.width / resourceSize.height; | |||
print("实际分辨率" , winSize.width , winSize.height); | |||
local finalResourceSize; | |||
-- 比16:9还扁,就用标准高度,让宽度变宽 | |||
if radio > resourceRadio then | |||
finalResourceSize = {width = resourceSize.height * radio ; height = resourceSize.height}; | |||
-- 比16:9高,就固定宽度,让高度变高 | |||
else | |||
finalResourceSize = {width = resourceSize.width ; height = resourceSize.width / radio}; | |||
end | |||
print("资源分辨率" , finalResourceSize.width , finalResourceSize.height); | |||
-- 改变屏幕大小 | |||
self.mainLayer:setContentSize(finalResourceSize); | |||
-- 更新UI尺寸 | |||
if self.editor and self.editor.node and self.editor.node.updateSizeAndPosition then | |||
self.editor.node:updateSizeAndPosition(); | |||
end | |||
end | |||
function EditorApp:onUpdate() | |||
cc.PhysicsController:getInstance():drawDebug(self.mainCamera:getViewProjectionMatrix()) | |||
end | |||
function EditorApp:reload() | |||
if self.effect then | |||
local xmlNode = self.effect:createXmlNode(); | |||
self.effect:removeFromParent(); | |||
cc.TextureCache:sharedTextureCache():removeUnusedTextures(); | |||
self.effect = createEffectFromXmlNode(xmlNode); | |||
self:initEffect(self.effect) | |||
return self.effect; | |||
elseif self.combineEffect then | |||
cc.TextureCache:sharedTextureCache():removeUnusedTextures(); | |||
return self.combineEffect; | |||
end | |||
end | |||
-- 生成一个目录 | |||
local function visitPath(sourcePath , func , ...) | |||
print("开始生成目录" .. sourcePath) | |||
-- 递归遍历sourcePath的所有目录 | |||
for file in lfs.dir(sourcePath) do | |||
if file ~= "." and file ~= ".." then | |||
local f = sourcePath..'/'..file | |||
local attr = lfs.attributes (f , "mode") | |||
if attr == "directory" then | |||
if visitPath(f , func , ...) then | |||
return true; | |||
end | |||
else | |||
if func(f , ...) then | |||
return true; | |||
end | |||
end | |||
end | |||
end | |||
print("生成目录完毕" .. sourcePath) | |||
end | |||
-- 重新保存所有UI | |||
function EditorApp:resaveAllUI() | |||
local function saveui(fileName) | |||
-- 返回pathName , baseName , ext | |||
local pathName , baseName , ext = string.splitFilename(fileName); | |||
print(pathName , baseName , ext); | |||
if ext ~= "ui" then | |||
return false; | |||
end | |||
local function resaveUI() | |||
print("\n\n"); | |||
print("正在加载UI:" , fileName); | |||
local node = createNodeFromFile(fileName); | |||
print("正在重新计算PList"); | |||
node:recalcAllPList(); | |||
print("正在保存UI:" , fileName); | |||
node:saveToFile(fileName); | |||
end | |||
xpcall(resaveUI , function(msg)print("处理界面“" .. fileName .. "”时出错了:" , msg , debug.traceback());alert("处理界面“" .. fileName .. "”时出错了");end); | |||
end | |||
cc.BaseObject:setUpgradingMode(true); | |||
visitPath("res" , saveui); | |||
cc.BaseObject:setUpgradingMode(false); | |||
end | |||
-- 重新保存所有Model | |||
function EditorApp:resaveAllModel() | |||
local function saveui(fileName) | |||
-- 返回pathName , baseName , ext | |||
local pathName , baseName , ext = string.splitFilename(fileName); | |||
print(pathName , baseName , ext); | |||
if ext ~= "gpb" then | |||
return false; | |||
end | |||
local function resaveUI() | |||
print("\n\n"); | |||
print("正在加载Model:" , fileName); | |||
local node = cc.ModelNode:create(fileName); | |||
local function onLoad(index) | |||
local skinMesh = node:_getFirstMeshSkin(); | |||
if skinMesh then | |||
print("蒙皮骨头数量:" , skinMesh:getJointCount()); | |||
if skinMesh:getJointCount() >= 39 then | |||
print("蒙皮骨头数量超过了39个:" , skinMesh:getJointCount()); | |||
end | |||
end | |||
node:autorelease(); | |||
end | |||
node:runOnLoad(onLoad); | |||
node:retain(); | |||
print("正在保存Model:" , fileName); | |||
--node:saveToFile(fileName); | |||
end | |||
xpcall(resaveUI , function()print("处理Effect“" .. fileName .. "”时出错了");alert("处理Effect“" .. fileName .. "”时出错了");end); | |||
end | |||
cc.BaseObject:setUpgradingMode(true); | |||
visitPath("res" , saveui); | |||
cc.BaseObject:setUpgradingMode(false); | |||
end | |||
-- 重新保存所有Effect | |||
function EditorApp:resaveAllEffect() | |||
local function saveui(fileName) | |||
-- 返回pathName , baseName , ext | |||
local pathName , baseName , ext = string.splitFilename(fileName); | |||
print(pathName , baseName , ext); | |||
if ext ~= "effect" then | |||
return false; | |||
end | |||
local function resaveUI() | |||
print("\n\n"); | |||
print("正在加载Effect:" , fileName); | |||
local node = createNodeFromFile(fileName); | |||
print("正在保存Effect:" , fileName); | |||
node:saveToFile(fileName); | |||
end | |||
xpcall(resaveUI , function()print("处理Effect“" .. fileName .. "”时出错了");alert("处理Effect“" .. fileName .. "”时出错了");end); | |||
end | |||
cc.BaseObject:setUpgradingMode(true); | |||
visitPath("res" , saveui); | |||
cc.BaseObject:setUpgradingMode(false); | |||
end | |||
-- 重新保存所有CE | |||
function EditorApp:resaveAllCE() | |||
local function saveCE(fileName) | |||
-- 返回pathName , baseName , ext | |||
local pathName , baseName , ext = string.splitFilename(fileName); | |||
print(pathName , baseName , ext); | |||
if ext ~= "ce" then | |||
return false; | |||
end | |||
local function resaveCE() | |||
print("\n\n"); | |||
print("正在加载CE:" , fileName); | |||
local node = createCombineEffectFromXmlFile(fileName); | |||
print("正在保存CE:" , fileName); | |||
node:saveToFile(fileName); | |||
end | |||
xpcall(resaveCE , function()print("处理CE“" .. fileName .. "”时出错了");alert("处理CE“" .. fileName .. "”时出错了");end); | |||
end | |||
cc.BaseObject:setUpgradingMode(true); | |||
visitPath("res" , saveCE); | |||
cc.BaseObject:setUpgradingMode(false); | |||
end | |||
-- 重新保存所有Scene | |||
function EditorApp:resaveAllScene() | |||
-- 载入场景文件 | |||
local function loadScene(nodeFile) | |||
print("加载场景" , nodeFile); | |||
TimeSpan:enterSpan("loadScene" .. nodeFile); | |||
TimeSpan:enterSpan("createNodeFromFile"); | |||
print("加载模型"); | |||
LoadingScene = true; | |||
local node = createNodeFromFile(nodeFile); | |||
LoadingScene = false; | |||
node:setCollectAnimationClip(false); | |||
TimeSpan:leaveSpan(); | |||
if not EditorMode then | |||
-- 普通模式,屏蔽掉HD内容 | |||
local hd = node:findNode("HD"); | |||
if hd then | |||
local function onQualityChanged(key , value) | |||
-- 高质量 | |||
hd:setVisible(value == 1); | |||
end | |||
hd:bind(app.systemSetting.info , "graphicQuality" , onQualityChanged); | |||
end | |||
end | |||
-- 创建一个题图载入资源 | |||
TimeSpan:enterSpan("requireMap"); | |||
print("加载障碍块"); | |||
local map = require("Map"):new(); | |||
local arr = string.split(nodeFile, "."); | |||
map:loadLua(arr[1] .. ".lmap"); | |||
TimeSpan:leaveSpan(); | |||
TimeSpan:leaveSpan(); | |||
return node , map; | |||
end | |||
local function saveui(fileName) | |||
-- 返回pathName , baseName , ext | |||
local pathName , baseName , ext = string.splitFilename(fileName); | |||
print(pathName , baseName , ext); | |||
if ext ~= "scene" then | |||
return false; | |||
end | |||
local function resaveUI() | |||
print("\n\n"); | |||
print("正在加载Scene:" , fileName); | |||
local scene , map = loadScene(fileName); | |||
print("正在保存Scene:" , fileName); | |||
scene:saveToFile(fileName); | |||
local arr = string.split(fileName, "."); | |||
map:saveLua(arr[1] .. ".lmap"); | |||
map:saveXml(arr[1] .. ".map"); | |||
end | |||
xpcall(resaveUI , function(msg)print("处理Scene“" .. fileName .. "”时出错了:" , msg);alert("处理Scene“" .. fileName .. "”时出错了:" .. tostring(msg));end); | |||
end | |||
cc.BaseObject:setUpgradingMode(true); | |||
visitPath("res" , saveui); | |||
cc.BaseObject:setUpgradingMode(false); | |||
end | |||
-- 解析所有的配置,导出所有使用过的资源 | |||
function EditorApp:exportAllRes(destPath) | |||
local fileVisitor = cc.ReferanceResourceVisitor:new() | |||
local function exportRes(resFile) | |||
print("资源名字", resFile) | |||
if string.endsWith(resFile, ".gpb") then | |||
local model = cc.ModelNode:create(resFile); | |||
model:visitReferanceResource(fileVisitor) | |||
elseif string.endsWith(resFile, ".scene") then | |||
local object = cc.StreamObject:loadFromFile(resFile) | |||
if object then | |||
object:visitReferanceResource(fileVisitor) | |||
-- 保存地图相关的资源 | |||
fileVisitor:visitFile(resFile) | |||
local stringArr = string.split(resFile, "."); | |||
fileVisitor:visitFile(stringArr[1] .. ".lmap") | |||
fileVisitor:visitFile(stringArr[1] .. ".lmap.blocks") | |||
fileVisitor:visitFile(stringArr[1] .. ".map") | |||
end | |||
elseif string.endsWith(resFile, ".ui") | |||
or string.endsWith(resFile, ".ce") | |||
or string.endsWith(resFile, ".effect") then | |||
-- 导出资源本身 | |||
local object = cc.StreamObject:loadFromFile(resFile) | |||
if object then | |||
fileVisitor:visitFile(resFile) | |||
object:visitReferanceResource(fileVisitor) | |||
end | |||
elseif string.endsWith(resFile, ".ogg") | |||
or string.endsWith(resFile, ".png") | |||
or string.endsWith(resFile, ".jpg") then | |||
fileVisitor:visitFile(resFile) | |||
elseif string.endsWith(resFile, ".plist") then | |||
local stringArr = string.split(resFile, "."); | |||
fileVisitor:visitFile(resFile) | |||
fileVisitor:visitFile(stringArr[1] .. ".png") | |||
end | |||
end | |||
local function visitOneData(cf) | |||
if table.nums(cf) <= 0 then | |||
return | |||
end | |||
for i, v in pairs(cf) do | |||
if type(v) == "string" and v ~= "" then | |||
local strs = string.split(v, ";") | |||
for ii, vv in pairs(strs) do | |||
exportRes(vv) | |||
end | |||
end | |||
end | |||
end | |||
local function parseXmlFile(fileName) | |||
print("解析xml文件", fileName) | |||
-- 读取整个文件数据 | |||
local file = io.open(fileName , "rb"); | |||
local fileData = file:read("*a"); | |||
file:close(); | |||
-- 解析数据 | |||
local function onElementStart(name, atts) | |||
visitOneData(atts) | |||
end | |||
-- 这里不能使用xml.eval来解析,android下面,如果下载的文件不是xml格式的,则会宕机 | |||
local result , err = tiny.eval(fileData, onElementStart) | |||
if not result then | |||
print("xml文件解析失败", fileName) | |||
return; | |||
end | |||
end | |||
local function parseLuaFile(fileName) | |||
print("处理lua文件", fileName) | |||
local file = io.open(fileName , "rb"); | |||
local fileData = file:read("*a"); | |||
file:close(); | |||
local uiFile = nil | |||
-- 导出UI | |||
for w in string.gmatch(fileData, '"([%w_/]+)%.ui"') do | |||
uiFile = w .. ".ui" | |||
exportRes(uiFile) | |||
end | |||
-- 导出技能 | |||
for w in string.gmatch(fileData, '"([%w_/]+)%.ce"') do | |||
uiFile = w .. ".ce" | |||
exportRes(uiFile) | |||
end | |||
-- 导出光效 | |||
for w in string.gmatch(fileData, '"([%w_/]+)%.effect"') do | |||
uiFile = w .. ".effect" | |||
exportRes(uiFile) | |||
end | |||
-- 导出模型 | |||
for w in string.gmatch(fileData, '"([%w_/]+)%.gpb"') do | |||
uiFile = w .. ".gpb" | |||
exportRes(uiFile) | |||
end | |||
-- 导出plist | |||
for w in string.gmatch(fileData, '"([%w_/]+)%.plist"') do | |||
uiFile = w .. ".plist" | |||
exportRes(uiFile) | |||
end | |||
-- 导出png | |||
for w in string.gmatch(fileData, '"([%w_/]+)%.png"') do | |||
uiFile = w .. ".png" | |||
exportRes(uiFile) | |||
end | |||
-- 导出jpg | |||
for w in string.gmatch(fileData, '"([%w_/]+)%.jpg"') do | |||
uiFile = w .. ".jpg" | |||
exportRes(uiFile) | |||
end | |||
-- 导出声音 | |||
for w in string.gmatch(fileData, '"([%w_/]+)%.ogg"') do | |||
uiFile = w .. ".ogg" | |||
exportRes(uiFile) | |||
end | |||
-- 字体 | |||
for w in string.gmatch(fileData, '"([%w_/]+)%.fnt"') do | |||
uiFile = w .. ".fnt" | |||
exportRes(uiFile) | |||
end | |||
end | |||
-- 遍历dataconfig目录的所有文件 | |||
visitPath("dataconfig", parseXmlFile); | |||
visitPath("luaScript", parseLuaFile); | |||
visitPath("preload", parseLuaFile); | |||
--exportRes("res/animation/XJL_1/XJL_1.effect") | |||
fileVisitor:saveAllRes(destPath) | |||
print("导出资源路径", destPath) | |||
alert("资源导出完毕") | |||
end | |||
return EditorApp; |
@@ -0,0 +1,20 @@ | |||
require("XMLConfigReader") | |||
Config = {} | |||
-- 一般设置 | |||
Config.Setting = require("Setting") | |||
-- 客户端效果配置 | |||
Config.ClientEffect = loadXMLConfig(require("ClientEffectConfigDesc")) | |||
-- 编辑器模式 | |||
Config.IsEditor = true; | |||
runXMLPostload(); | |||
-- 所有语言存在这里 | |||
local Languages = require("languages"); | |||
local Language = Languages[Config.Setting.Language] or Languages[kLanguageChinese]; | |||
-- 根据传入的文字字符串,自动翻译成玩家机器所设定的语言 | |||
function RT(str) | |||
return Language[str]; | |||
end | |||
@@ -0,0 +1,27 @@ | |||
-- 编辑器里面的全局函数 | |||
-- 判断一个节点的付节点是否在一个列表里面 | |||
-- table的格式是 | |||
--{ | |||
-- xxx : node, | |||
--} | |||
function ParentNodeIsInTable(node, nodeTable) | |||
if node:getParent() == nil then | |||
return false; | |||
end | |||
if table.find(nodeTable, node:getParent()) then | |||
return true; | |||
end | |||
local parentNode = node:getParent(); | |||
return ParentNodeIsInTable(parentNode, nodeTable); | |||
end | |||
function createLuaTable() | |||
local tab = {}; | |||
return tab; | |||
end | |||
function addValueToTable(tab, value) | |||
table.insert(tab, value) | |||
end |
@@ -0,0 +1,8 @@ | |||
EditorNodeZorder = | |||
{ | |||
-- 坐标系Node | |||
CoordinateNodeZorder = -100, | |||
-- 地图网格Node | |||
MapGridNodeZorder = -90 | |||
} |
@@ -0,0 +1,124 @@ | |||
local EffectEditor = class("EffectEditor" , require("NodeEditor")); | |||
function EffectEditor:ctor() | |||
EffectEditor.super.ctor(self); | |||
end | |||
function EffectEditor:activate() | |||
EffectEditor.super.activate(self); | |||
app.setting.OriginAnchor = cc.p(0.5,0.5); | |||
app:refreshSetting(); | |||
-- 创建一个文本框,用于显示光效是否为无限长 | |||
local debugLabel = cc.Text:createNode(); | |||
debugLabel:setDefaults(); | |||
local config = debugLabel:getFontConfig(); | |||
config.fontSize = 40; | |||
config.texColor = cc.c4b(255,0,0,255); | |||
debugLabel:setFontConfig(config); | |||
-- 获取可见视野的像素大小 | |||
local screenSize = cc.Director:getInstance():getWinSizeInPixels(); | |||
debugLabel:setTranslation(screenSize.width / 2 , 100 , 0) | |||
debugLabel:setText("这个光效是无限长的,请注意!!!!"); | |||
self.debugText = debugLabel; | |||
self.InfinityTipTextNode = cc.Scene:create() | |||
self.InfinityTipTextNode:setActiveCamera(cc.Director:getInstance():getFixedCamera()) | |||
self.InfinityTipTextNode:addChild(self.debugText) | |||
app.mainScene:addChild(self.InfinityTipTextNode); | |||
self.InfinityTipTextNode:setVisible(false) | |||
end | |||
function EffectEditor:unactivate() | |||
-- 移除提示框 | |||
self.InfinityTipTextNode:removeFromParent() | |||
EffectEditor.super.unactivate(self); | |||
end | |||
function EffectEditor:play() | |||
-- supper class | |||
EffectEditor.super.play(self); | |||
self:checkInfinity(); | |||
end | |||
-- 检测光效是否为无限长的 | |||
function EffectEditor:checkInfinity() | |||
-- 如果是光效并且是无限长需要给出提示 | |||
if self.node and self.node.ClassName == "EffectNode" and self.node:isInfinite() then | |||
self.InfinityTipTextNode:setVisible(true) | |||
else | |||
self.InfinityTipTextNode:setVisible(false) | |||
end | |||
end | |||
-- 创建新的光效 | |||
function EffectEditor:newNode() | |||
self:closeNode(); | |||
local node = self:createNode("EffectNode"); | |||
self:initNode(node) | |||
return node; | |||
end | |||
-- 关闭光效 | |||
function EffectEditor:closeNode() | |||
EffectEditor.super.closeNode(self); | |||
end | |||
function EffectEditor:createNode(nodeType) | |||
local node = EffectEditor.super.createNode(self , nodeType); | |||
-- 默认播放一下 | |||
node:play(); | |||
return node; | |||
end | |||
-- 从文件载入节 | |||
-- 初始化光效,添加到场景中 | |||
function EffectEditor:initNode(node) | |||
EffectEditor.super.initNode(self , node) | |||
end | |||
-- 从文件载入节点 | |||
function EffectEditor:loadNode(nodeFile) | |||
local effectNode = EffectEditor.super.loadNode(self , nodeFile); | |||
effectNode:play(); | |||
self:checkInfinity(); | |||
return effectNode; | |||
end | |||
function EffectEditor:loadModelNode(filename) | |||
self:closeNode(); | |||
self.node = cc.ModelNode:createNode(); | |||
self.node:setName("ModelNode") | |||
self.node:setMeshFile(filename); | |||
self:initNode(self.node); | |||
return self.node; | |||
end | |||
-- 创建新的光效 | |||
function EffectEditor:newModelNode() | |||
self:closeNode(); | |||
local node = self:createNode("ModelNode"); | |||
self:initNode(node) | |||
return node; | |||
end | |||
function EffectEditor:loadSoundNode(filename) | |||
self:closeNode(); | |||
self.node = cc.SoundSourceNode:createNode(); | |||
self.node.SoundSource:setAudioFile(filename); | |||
self:initNode(self.node); | |||
return self.node; | |||
end | |||
-- 创建新的光效 | |||
function EffectEditor:newSoundNode() | |||
self:closeNode(); | |||
local node = self:createNode("SoundSourceNode"); | |||
self:initNode(node) | |||
return node; | |||
end | |||
return EffectEditor; |
@@ -0,0 +1,22 @@ | |||
require("Editor.CompileFile") | |||
local function processAnimation(fileName) | |||
local animationClip = cc.AnimationClipFileCache:getInstance():load(fileName); | |||
print("载入AnimationClip:" , fileName); | |||
end | |||
-- 生成所有语言 | |||
function generateAnimationClips(textureFile) | |||
local function saveui(fileName) | |||
-- 返回pathName , baseName , ext | |||
local pathName , baseName , ext = string.splitFilename(fileName); | |||
print(pathName , baseName , ext); | |||
if string.lower(ext) == "animation" then | |||
processAnimation(fileName); | |||
end | |||
end | |||
visitPath("res" , saveui); | |||
cc.AnimationClipFileCache:getInstance():saveToFile(textureFile); | |||
end |
@@ -0,0 +1,121 @@ | |||
require("Editor.CompileFile") | |||
-- 收集languageCN.lua里的语言 | |||
local function collectLanguages(transDict) | |||
local Languages = require("languageCN"); | |||
for i , v in pairs(Languages) do | |||
print("收集Lang文本" , v); | |||
local trans = XmlTranslator:collect(v); | |||
transDict[trans] = ""; | |||
end | |||
end | |||
-- 收集一个语言片 | |||
local function collectConfig(transDict , record , fieldName , translator) | |||
local trans = translator:collect(record[fieldName]); | |||
if type(trans) ~= "string" then | |||
error("trans不是字符串" .. type(trans) .. tostring(trans)); | |||
end | |||
transDict[trans] = ""; | |||
end | |||
-- 收集一个配置 | |||
local function collectLanguageConfig(transDict , config) | |||
local desc = config:getConfigDesc(); | |||
print("正在收集配置的语言:" , desc.XMLFile); | |||
if desc.Translation then | |||
for i , v in pairs(desc.Translation) do | |||
print("正在收集字段:" , i); | |||
for ii , vv in pairs(config) do | |||
if desc.SecondKeyName then | |||
for iii , vvv in pairs(vv) do | |||
collectConfig(transDict , vvv , i , v); | |||
end | |||
else | |||
collectConfig(transDict , vv , i , v); | |||
end | |||
end | |||
end | |||
end | |||
end | |||
-- 保存到文件 | |||
local function saveXmlFile(transDict , dictFile) | |||
local f = io.open(dictFile , "wb"); | |||
for i , v in pairsByKeys(transDict)do | |||
f:write(i); | |||
f:write("\n"); | |||
end | |||
f:close(); | |||
end | |||
-- 收集一个ui | |||
local function collectSingleUI(transDict , ui) | |||
if ui.collectText then | |||
local result = ui:collectText(); | |||
for i , v in ipairs(result) do | |||
print("收集到UI语言:" , v); | |||
transDict[v] = ""; | |||
end | |||
end | |||
end | |||
-- 收集一个ui | |||
local function collectUI(transDict , ui) | |||
collectSingleUI(transDict , ui); | |||
-- 递归所有子 | |||
for i , v in pairs(ui:getChildren()) do | |||
collectUI(transDict , v); | |||
end | |||
end | |||
-- 收集所有UI的语言 | |||
local function collectUILanguage(transDict) | |||
local function saveui(fileName) | |||
-- 返回pathName , baseName , ext | |||
local pathName , baseName , ext = string.splitFilename(fileName); | |||
print(pathName , baseName , ext); | |||
if ext ~= "ui" then | |||
return false; | |||
end | |||
print("\n\n"); | |||
print("正在加载UI:" , fileName); | |||
local ui = cc.StreamObject:loadFromFile(fileName); | |||
collectUI(transDict , ui); | |||
end | |||
visitPath("res/ui" , saveui); | |||
end | |||
-- 生成所有语言 | |||
function generateDict(dictFile) | |||
-- initialize director | |||
local director = cc.Director:getInstance(); | |||
local glview = director:getOpenGLView(); | |||
if not glview then | |||
glview = cc.GLView:createWithRect("applyDict", {x=0,y=0,width=100,height=100}); | |||
director:setOpenGLView(glview); | |||
end | |||
-- 加载xml | |||
loadAllXML() | |||
local transDict = {}; | |||
-- 生成所有配置的语言 | |||
for i , v in pairs(app.config) do | |||
if i ~= "Setting" and i ~= "RomSetting" then | |||
local desc = v:getConfigDesc(); | |||
local filename = desc.XMLFile; | |||
collectLanguageConfig(transDict , v); | |||
end | |||
end | |||
-- 收集languageCN.lua里的语言 | |||
collectLanguages(transDict); | |||
collectUILanguage(transDict); | |||
saveXmlFile(transDict , dictFile); | |||
end |
@@ -0,0 +1,22 @@ | |||
require("Editor.CompileFile") | |||
local function processAnimation(fileName) | |||
local Material = cc.MaterialFileCache:getInstance():load(fileName); | |||
print("载入Material:" , fileName); | |||
end | |||
-- 生成所有语言 | |||
function generateMaterials(textureFile) | |||
local function saveui(fileName) | |||
-- 返回pathName , baseName , ext | |||
local pathName , baseName , ext = string.splitFilename(fileName); | |||
print(pathName , baseName , ext); | |||
if string.lower(ext) == "animation" then | |||
processAnimation(fileName); | |||
end | |||
end | |||
visitPath("res" , saveui); | |||
cc.MaterialFileCache:getInstance():saveToFile(textureFile); | |||
end |
@@ -0,0 +1,31 @@ | |||
require("Editor.CompileFile") | |||
local function processPng(fileName) | |||
local image = cc.Image:analysisPngFile(fileName); | |||
print("png图片大小:" , fileName , image.image_width , image.image_height); | |||
cc.Director:getInstance():getTextureCache():addTextureSize(fileName , cc.size(image.image_width , image.image_height)); | |||
end | |||
local function processJpg(fileName) | |||
local image = cc.Image:analysisJpgFile(fileName); | |||
print("jpg图片大小:" , fileName , image.image_width , image.image_height); | |||
cc.Director:getInstance():getTextureCache():addTextureSize(fileName , cc.size(image.image_width , image.image_height)); | |||
end | |||
-- 生成所有语言 | |||
function generateTextureSize(textureFile) | |||
local function saveui(fileName) | |||
-- 返回pathName , baseName , ext | |||
local pathName , baseName , ext = string.splitFilename(fileName); | |||
print(pathName , baseName , ext); | |||
if string.lower(ext) == "png" then | |||
processPng(fileName); | |||
elseif string.lower(ext) == "jpg" then | |||
processJpg(fileName); | |||
end | |||
end | |||
visitPath("res" , saveui); | |||
cc.Director:getInstance():getTextureCache():saveTextureSize(textureFile); | |||
end |
@@ -0,0 +1,274 @@ | |||
require("preload.tools.socket") | |||
require("preload.tools.url") | |||
url = require("socket.url") | |||
require("preload.tools.headers") | |||
require("preload.tools.http") | |||
http = require("socket.http") | |||
require("luaScript.all") | |||
require("luaScript.Tools.LuaXml") | |||
require("luaScript.Tools.GlobalFunction") | |||
require("luaScript.Protocol.Protocol"); | |||
require("luaScript.Protocol.ProtoDef"); | |||
require("luaScript.Protocol.ModuleName"); | |||
require("Editor.GenerateDict"); | |||
require("Editor.GenerateTextureSize"); | |||
require("Editor.GenerateAnimationClips"); | |||
require("Editor.GenerateMaterials"); | |||
require("Editor.ApplyDict"); | |||
require("Editor.CompileFile") | |||
require("Editor.LinkFile") | |||
require("Editor.CompareVersion") | |||
local bit32 = (bit32 or require("bit")) | |||
local lfs = lfs or require("lfs") | |||
-- avoid memory leak | |||
collectgarbage("setpause", 100) | |||
collectgarbage("setstepmul", 5000) | |||
-- 调试信息 | |||
function __G__TRACKBACK__(msg) | |||
print("----------------------------------------") | |||
print("LUA ERROR: " .. tostring(msg) .. "\n") | |||
print(debug.traceback()) | |||
print("----------------------------------------") | |||
end | |||
FilePackage = {}; | |||
function FilePackage.encrypt(data) | |||
return cc.FilePackage:getInstance():encrypt(data); | |||
end | |||
function FilePackage.compress(data) | |||
return lzma.compress(data); | |||
end | |||
function FilePackage.uncompress(data) | |||
return lzma.uncompress(data); | |||
end | |||
-- 是否有命令行参数被指定 | |||
function hasCmdArg(name) | |||
for i , v in pairs(CommandArguments) do | |||
if v == name then | |||
return true; | |||
end | |||
end | |||
return false; | |||
end | |||
-- 深度创建目录 | |||
function createDir(targetPath) | |||
local path = string.gsub(targetPath , "\\" , "/") | |||
local paths = string.split(path , "/"); | |||
local currentPath = ""; | |||
for i , v in ipairs(paths) do | |||
if i == 1 then | |||
currentPath = v; | |||
else | |||
currentPath = currentPath .. "/" .. v; | |||
end | |||
if lfs.attributes(currentPath , "mode") ~= "directory" then | |||
lfs.mkdir(currentPath); | |||
end | |||
end | |||
end | |||
-- 加密文件 | |||
function encryptFile(fileData , targetFile) | |||
targetFile:write(FilePackage.encrypt(fileData)); | |||
end | |||
function saveFile(str , targetFile) | |||
local file = io.open(targetFile , "wb"); | |||
file:write(str); | |||
file:close(); | |||
end | |||
function loadFile(filename) | |||
-- 读取整个文件数据 | |||
local file = io.open(filename , "rb"); | |||
if not file then | |||
return; | |||
end | |||
fileData = file:read("*a"); | |||
file:close(); | |||
return fileData; | |||
end | |||
-- 遍历一个目录,对目录中的每个文件执行 func 回调 | |||
function visitPath(sourcePath , func , ...) | |||
print("开始生成目录" .. sourcePath) | |||
-- 递归遍历sourcePath的所有目录 | |||
--local sourcePath = "d:\\WorkSpace\\DingDing\\Core\\debug\\src\\logs" | |||
for file in lfs.dir(sourcePath) do | |||
if file ~= "." and file ~= ".." and file ~= ".svn" then | |||
local f = sourcePath..'/'..file | |||
local attr = lfs.attributes (f , "mode") | |||
if attr == "directory" then | |||
if visitPath(f , func , ...) then | |||
return true; | |||
end | |||
else | |||
if func(f , ...) then | |||
return true; | |||
end | |||
end | |||
end | |||
end | |||
print("生成目录完毕" .. sourcePath) | |||
end | |||
-- 执行一个系统命令 | |||
local function runCmd(cmd) | |||
local out = io.popen(cmd , "r"); | |||
print(out:read("*a")); | |||
local exit_code = out:close(); | |||
return exit_code | |||
end | |||
local index = 0; | |||
local stackMap = {} | |||
local function decodeLog(fileName) | |||
index = index + 1 | |||
-- 返回pathName , baseName , ext | |||
local basePath , baseName , ext = string.splitFilename(fileName); | |||
print(index, basePath, baseName, ext); | |||
if ext ~= "7z" then | |||
return false; | |||
end | |||
-- 3_1033_7004668_97d3fd7fcf8a2c046905f4c0c85d1655_20180106003900_7A97365E.7z | |||
--[[ | |||
names = | |||
{ | |||
[1] = "平台", | |||
[2] = "资源版本", | |||
[3] = "玩家ID", | |||
[4] = "堆栈MD5", | |||
[5] = "日期", | |||
[6] = "随机数", | |||
} | |||
fileName = "logs/堆栈/日期_版本_平台_玩家ID_随机数.log" | |||
]]-- | |||
local names = string.split(baseName , "_"); | |||
local platform = names[1] | |||
local version = names[2] | |||
local user_id = names[3] | |||
local stack = names[4] | |||
local log_date = names[5] | |||
local randnum = names[6] | |||
local logFilePath = "logs" .. "/" .. stack .. "/"; | |||
local logFileName = log_date .. "_" .. version .. "_" .. platform .. "_" .. user_id .. "_" .. randnum .. ".log"; | |||
if not stackMap[stack] then | |||
stackMap[stack] = {} | |||
end | |||
table.insert(stackMap[stack], logFileName) | |||
pathName = basePath .. "/" .. logFilePath; | |||
if #names == 6 then | |||
createDir(pathName); | |||
local newFileName = pathName .. logFileName; | |||
local logFile = io.open(fileName , "rb"); | |||
local allData = logFile:read("*a"); | |||
logFile:close(); | |||
local uncompressData = lzma.uncompress(allData); | |||
if uncompressData ~= nil then | |||
local newLogFile = io.open(newFileName , "wb"); | |||
newLogFile:write(lzma.decodeLog(uncompressData)); | |||
newLogFile:close(); | |||
end | |||
-- 删除原始文件 | |||
os.remove(fileName) | |||
end | |||
end | |||
local function decodeLogs() | |||
visitPath("logs" , decodeLog); | |||
end | |||
local function decodeCrash(fileName) | |||
-- 返回pathName , baseName , ext | |||
local pathName , baseName , ext = string.splitFilename(fileName); | |||
print("pathName, baseName, ext:", pathName , baseName , ext); | |||
if ext ~= "7z" then | |||
return false; | |||
end | |||
local names = string.split(baseName , "_"); | |||
local newFileName, baseFileName, logFlag | |||
-- 如果是android则需要分平台创建 | |||
if tonumber(names[2]) == 3 or tonumber(names[2]) == 4 or tonumber(names[2]) == 5 then | |||
pathName = pathName .. "/" .. names[2] .. "/" .. names[3] .. "/" .. names[4] .. "/"; | |||
baseFileName = names[5] | |||
logFlag = names[6] | |||
else | |||
-- 其他平台 | |||
pathName = pathName .. "/" .. names[2] .. "/" .. names[3] .. "/"; | |||
baseFileName = names[4] | |||
logFlag = names[5] | |||
end | |||
local dumpPathName = pathName .. "dump/" | |||
local logPathName = pathName .. "log/" | |||
-- 创建dump目录 | |||
createDir(dumpPathName) | |||
-- 创建对应的log目录 | |||
createDir(logPathName) | |||
-- 再拆分一次 | |||
local secNames = string.split(baseFileName, "."); | |||
if logFlag then | |||
-- 解析log | |||
newFileName = logPathName .. secNames[1] .. ".log"; | |||
local logFile = io.open(fileName , "rb"); | |||
local allData = logFile:read("*a"); | |||
logFile:close(); | |||
local uncompressData = lzma.uncompress(allData); | |||
if uncompressData ~= nil then | |||
local newLogFile = io.open(newFileName , "wb"); | |||
newLogFile:write(lzma.decodeLog(uncompressData)); | |||
newLogFile:close(); | |||
end | |||
else | |||
-- 解析dump | |||
newFileName = dumpPathName .. secNames[1] .. ".dmp"; | |||
local logFile = io.open(fileName , "rb"); | |||
local allData = logFile:read("*a"); | |||
logFile:close(); | |||
local uncompressData = lzma.uncompress(allData); | |||
if uncompressData ~= nil then | |||
local newLogFile = io.open(newFileName , "wb"); | |||
newLogFile:write(uncompressData); | |||
newLogFile:close(); | |||
end | |||
end | |||
end | |||
local function decodeCrashs() | |||
visitPath("crash" , decodeCrash); | |||
end | |||
function main() | |||
print("CommandArguments" , CommandArguments); | |||
if hasCmdArg("-BuildLogs") then | |||
print("请把log文件拷贝到logs目录") | |||
decodeLogs(); | |||
elseif hasCmdArg("-BuildCrash") then | |||
print("请把crash文件拷贝到crash目录") | |||
decodeCrashs(); | |||
end | |||
end | |||
local result = nil | |||
local function main_exe() | |||
result = main() | |||
end | |||
xpcall(main_exe, __G__TRACKBACK__) | |||
return result |
@@ -0,0 +1,46 @@ | |||
-- 保存已经生成过的文件, | |||
-- 如果当前要生成的文件在列表里面已经存在了, | |||
-- 则表示文件重名 | |||
g_files = {}; | |||
-- 生成一个文件 | |||
function linkFile(sourceFile , targetPath, targetFile , versionInfo) | |||
print("linkFile" , sourceFile); | |||
local pathName , baseName , ext = string.splitFilename(sourceFile); | |||
if isIgnoreFile(pathName , baseName , ext) then | |||
return; | |||
end | |||
--print("链接文件" .. sourceFile) | |||
local fileInfo = g_files[baseName]; | |||
if fileInfo then | |||
error("文件重名:[" .. sourceFile .. "] 与 [" .. fileInfo.origin .. "]"); | |||
end | |||
fileInfo = xml.new("file"); | |||
versionInfo.files[baseName] = fileInfo; | |||
-- 保存全局文件列表 | |||
g_files[baseName] = fileInfo; | |||
local cacheFile = compileFile(sourceFile, targetPath); | |||
fileInfo.origin = cacheFile.origin; | |||
fileInfo.name = cacheFile.name; | |||
fileInfo.md5 = cacheFile.md5; | |||
fileInfo.size = cacheFile.compileSize; | |||
fileInfo.preload = false -- 是否新手期文件 | |||
if not hasCmdArg("-onlyServer") then | |||
-- 保存加密文件到客户端 | |||
local assetFileName = targetPath .. "/assets/" .. fileInfo.md5 | |||
local targetClientFile = io.open(assetFileName, "wb"); | |||
targetClientFile:write(loadFile(cacheFile.encryptFile)); | |||
targetClientFile:close(); | |||
end | |||
-- 保存加密并压缩后的文件到服务端 | |||
fileInfo.offset = targetFile:seek(); | |||
local compressedData = loadFile(cacheFile.compressedFile); | |||
targetFile:write(compressedData); | |||
fileInfo.compressedSize = string.len(compressedData) | |||
end |
@@ -0,0 +1,23 @@ | |||
local MapEditor = class("MapEditor") | |||
function MapEditor:ctor() | |||
end | |||
function MapEditor:init() | |||
-- 创建障碍块和地图可见范围 | |||
self.ObstacleNode = app.editor.Map:createObstacleNode(); | |||
app.mainLayer:addChild(self.ObstacleNode); | |||
-- 创建菱形网格 | |||
self.GridNode = app.editor.Map:createGridNode(); | |||
app.mainLayer:addChild(self.GridNode); | |||
end | |||
-- 关闭光效 | |||
function MapEditor:close() | |||
-- 移除glNode | |||
self.GridNode:removeFromParent(); | |||
-- 移除障碍块 | |||
self.ObstacleNode:removeFromParent(); | |||
end | |||
return MapEditor; |
@@ -0,0 +1,139 @@ | |||
MoveLockedMode = | |||
{ | |||
no = 0; | |||
x = 1; | |||
y = 2; | |||
} | |||
-- 2D平移工具功能 | |||
local Move2DTool = class("Move2DTool", require("MoveTool")) | |||
function Move2DTool:ctor() | |||
-- 当前锁定模式 | |||
self.lockedMode = MoveLockedMode.no; | |||
self.super.ctor(self); | |||
end | |||
function Move2DTool:clear() | |||
self.super.clear(self); | |||
end | |||
function Move2DTool:MouseDown(button , x , y) | |||
self.super.MouseDown(self, button, x, y) | |||
end | |||
local function roundVec3(vec) | |||
vec.x = math.floor(vec.x + 0.5) | |||
vec.y = math.floor(vec.y + 0.5) | |||
vec.z = math.floor(vec.z + 0.5) | |||
return vec; | |||
end | |||
-- 根据Shift键决定锁定哪个轴,并返回移动目标 | |||
function Move2DTool:getMoveEndPos(screenX , screenY) | |||
-- 转换坐标,将屏幕坐标转换成GLView的坐标 | |||
local startPos = app.visibleRect:convertScreenToGLView(self.startPos.x , self.startPos.y); | |||
local endPos = app.visibleRect:convertScreenToGLView(screenX , screenY); | |||
local key = app.cs.getModifierKeys(); | |||
-- Shift锁定横竖移动 | |||
if key == Keys.Shift then | |||
if self.lockedMode == MoveLockedMode.no then | |||
-- x 方向移动的距离更远 | |||
if math.abs(endPos.x - startPos.x) > math.abs(endPos.y - startPos.y) then | |||
self.lockedMode = MoveLockedMode.x; | |||
else | |||
self.lockedMode = MoveLockedMode.y; | |||
end | |||
end | |||
-- x 方向移动的距离更远 | |||
if self.lockedMode == MoveLockedMode.x then | |||
endPos.y = startPos.y; | |||
else | |||
endPos.x = startPos.x; | |||
end | |||
else | |||
self.lockedMode = MoveLockedMode.no; | |||
end | |||
return {startPos = startPos , endPos =endPos}; | |||
end | |||
function Move2DTool:moveTo(screenX, screenY) | |||
-- 转换坐标,将屏幕坐标转换成GLView的坐标 | |||
local startEndPos = self:getMoveEndPos(screenX , screenY); | |||
local startPos = startEndPos.startPos; | |||
local endPos = startEndPos.endPos; | |||
-- 通过命令来移动 | |||
local scale = app.setting.ScreenScale; | |||
local scale = app.setting.ScreenScale; | |||
local offset = cc.pSub(endPos , startPos) | |||
-- 增量 | |||
local targetOffset = cc.vec3(offset.x / scale, offset.y / scale, 0); | |||
for i , v in pairs(self.originPoies) do | |||
local originWorld = i:getParent():convertToWorldSpace(v.pos); | |||
local newWorld = cc.vec3Add(originWorld , targetOffset); | |||
local newLocal = roundVec3(i:getParent():convertToNodeSpace(newWorld)); | |||
i:setTranslation(newLocal); | |||
end | |||
end | |||
function Move2DTool:commandMoveTo(screenX, screenY) | |||
-- 转换坐标,将屏幕坐标转换成GLView的坐标 | |||
local startEndPos = self:getMoveEndPos(screenX , screenY); | |||
local startPos = startEndPos.startPos; | |||
local endPos = startEndPos.endPos; | |||
-- 如果没有发生偏移则不需要移动 | |||
if cc.pEqual(endPos, startPos) then | |||
return; | |||
end | |||
-- 通过命令来移动 | |||
local commands = {}; | |||
local scale = app.setting.ScreenScale; | |||
local offset = cc.pSub(endPos , startPos); | |||
-- 增量 | |||
local targetOffset = cc.vec3(offset.x / scale, offset.y / scale, 0); | |||
for i , v in pairs(self.originPoies) do | |||
local originWorld = i:getParent():convertToWorldSpace(v.pos); | |||
local newWorld = cc.vec3Add(originWorld , targetOffset); | |||
local newLocal = roundVec3(i:getParent():convertToNodeSpace(newWorld)); | |||
-- 将节点的位置恢复到原始位置 | |||
i:setTranslation(v.pos); | |||
table.insert(commands, Commands:moveNode(i, newLocal)); | |||
end | |||
app.undoRedoManager:doCommand(Commands:batchCommand(commands)); | |||
end | |||
function Move2DTool:commandMoveBy(offset) | |||
-- 如果没有发生偏移则不需要移动 | |||
if cc.pEqual(offset, {x = 0, y = 0}) then | |||
return; | |||
end | |||
-- 增量 | |||
local scale = app.setting.ScreenScale; | |||
local targetOffset = cc.vec3(offset.x, offset.y, 0); | |||
-- 通过命令来移动 | |||
local commands = {}; | |||
for i , v in pairs(app.editor.SelectedNodes) do | |||
local originWorld = v:getParent():convertToWorldSpace(v:getPosition()); | |||
local newWorld = cc.vec3Add(originWorld , targetOffset); | |||
local newLocal = roundVec3(v:getParent():convertToNodeSpace(newWorld)); | |||
-- v:setPosition(newLocal); | |||
table.insert(commands, Commands:moveNode(v, newLocal)); | |||
end | |||
app.undoRedoManager:doCommand(Commands:batchCommand(commands)); | |||
end | |||
return Move2DTool; |
@@ -0,0 +1,171 @@ | |||
-- 3D平訂伽邿佴艤 | |||
local Move3DTool = class("Move3DTool", require("MoveTool")) | |||
function Move3DTool:ctor() | |||
self.super.ctor(self); | |||
self.factor = 1.0; | |||
self.startScreenPos = nil; | |||
end | |||
function Move3DTool:clear() | |||
self.super.clear(self); | |||
self.startScreenPos = nil; | |||
end | |||
function Move3DTool:MouseDown(button , x , y) | |||
if self.super.MouseDown(self, button, x, y) then | |||
self.startScreenPos = cc.p(x, y); | |||
end | |||
end | |||
function Move3DTool:convertScreenToWorldPos(mouseX, mouseY, planeNormal, planeDistance) | |||
local floorPlane = cc.Plane:new(planeNormal , planeDistance); | |||
-- 輪蹋远mainlayer謩藔蕨位變 | |||
local screenSize = cc.Director:getInstance():getWinSizeInPixels(); | |||
local ray = app.mainCamera:pickRay(mouseX / screenSize.width , mouseY / screenSize.height); | |||
local dist = ray:intersectsPlane(floorPlane); | |||
if dist >= 0 then | |||
return ray:getPoint(dist); | |||
else | |||
return ray:getPoint(0); | |||
end | |||
end | |||
function Move3DTool:moveTo(screenX, screenY) | |||
-- 斩 | |||
local targetOffset; | |||
--[[local offset = cc.pSub(endPos , self.startPos); | |||
if app.cs.getModifierKeys() == Keys.Control then | |||
-- 只艤覙Y住蕪袀訂织 | |||
targetOffset = cc.vec3(0, offset.y * self.factor, 0); | |||
else | |||
-- 諝XZ平摩蕪摩平訂 | |||
targetOffset = cc.vec3(offset.x * self.factor, 0, offset.y * self.factor); | |||
end--]] | |||
-- Shift酄樧喲阶? | |||
if app.cs.getModifierKeys() == Keys.Shift then | |||
for i , v in pairs(self.originPoies) do | |||
local originWorld = v.rotate; | |||
i:setEulerRotation(originWorld.x , originWorld.y + (screenX - self.startScreenPos.x) , originWorld.z); | |||
end | |||
else | |||
for i , v in pairs(self.originPoies) do | |||
local originWorld = i:getParent():convertToWorldSpace(v.pos); | |||
if app.cs.getModifierKeys() == Keys.Control then | |||
-- 只艤覙Y住蕪袀訂织 | |||
-- 顺要写袀时謩藔蕨位變 | |||
local normal | |||
if originWorld.z > 0 then | |||
normal = cc.vec3(0,0,-1) | |||
else | |||
normal = cc.vec3(0,0,1) | |||
end | |||
local downWorldPos = self:convertScreenToWorldPos(self.startScreenPos.x, self.startScreenPos.y, normal, originWorld.z); | |||
-- 毡前顺要謩藔蕨位變 | |||
local curWorldPos = self:convertScreenToWorldPos(screenX, screenY, normal, originWorld.z); | |||
targetOffset = cc.vec3(0, curWorldPos.y - downWorldPos.y, 0); | |||
else | |||
local normal | |||
if originWorld.y > 0 then | |||
normal = cc.vec3(0,-1,0) | |||
else | |||
normal = cc.vec3(0,1,0) | |||
end | |||
-- 顺要写袀时謩藔蕨位變 | |||
local downWorldPos = self:convertScreenToWorldPos(self.startScreenPos.x, self.startScreenPos.y, normal, originWorld.y); | |||
-- 毡前顺要謩藔蕨位變 | |||
local curWorldPos = self:convertScreenToWorldPos(screenX, screenY, normal, originWorld.y); | |||
targetOffset = cc.vec3(curWorldPos.x - downWorldPos.x, 0, curWorldPos.z - downWorldPos.z); | |||
end | |||
local newWorld = cc.vec3Add(originWorld , targetOffset); | |||
local newLocal = i:getParent():convertToNodeSpace(newWorld); | |||
i:setTranslation(newLocal); | |||
end | |||
end | |||
end | |||
function Move3DTool:commandMoveTo(screenX, screenY) | |||
local endPos = cc.p(screenX, screenY); | |||
-- 骚诨没詯注屎偏訂詹一穴要訂织 | |||
if cc.pEqual(endPos, self.startPos) then | |||
return; | |||
end | |||
-- 通诮募庐4訂织 | |||
local commands = {}; | |||
-- 斩 | |||
local targetOffset; | |||
if app.cs.getModifierKeys() == Keys.Shift then | |||
for i , v in pairs(self.originPoies) do | |||
local originWorld = v.rotate; | |||
local newLocal = cc.vec3(originWorld.x , originWorld.y + (screenX - self.startScreenPos.x) , originWorld.z); | |||
i:setEulerRotation(v.rotate); | |||
table.insert(commands, Commands:rotateNode(i, newLocal)); | |||
end | |||
else | |||
for i , v in pairs(self.originPoies) do | |||
local originWorld = i:getParent():convertToWorldSpace(v.pos); | |||
if app.cs.getModifierKeys() == Keys.Control then | |||
-- 只艤覙Y住蕪袀訂织 | |||
-- 顺要写袀时謩藔蕨位變 | |||
local normal | |||
if originWorld.z > 0 then | |||
normal = cc.vec3(0,0,-1) | |||
else | |||
normal = cc.vec3(0,0,1) | |||
end | |||
local downWorldPos = self:convertScreenToWorldPos(self.startScreenPos.x, self.startScreenPos.y, normal, originWorld.z); | |||
-- 毡前顺要謩藔蕨位變 | |||
local curWorldPos = self:convertScreenToWorldPos(screenX, screenY, normal, originWorld.z); | |||
targetOffset = cc.vec3(0, curWorldPos.y - downWorldPos.y, 0); | |||
else | |||
local normal | |||
if originWorld.y > 0 then | |||
normal = cc.vec3(0,-1,0) | |||
else | |||
normal = cc.vec3(0,1,0) | |||
end | |||
-- 顺要写袀时謩藔蕨位變 | |||
local downWorldPos = self:convertScreenToWorldPos(self.startScreenPos.x, self.startScreenPos.y, normal, originWorld.y); | |||
-- 毡前顺要謩藔蕨位變 | |||
local curWorldPos = self:convertScreenToWorldPos(screenX, screenY, normal, originWorld.y); | |||
targetOffset = cc.vec3(curWorldPos.x - downWorldPos.x, 0, curWorldPos.z - downWorldPos.z); | |||
end | |||
local newWorld = cc.vec3Add(originWorld , targetOffset); | |||
local newLocal = i:getParent():convertToNodeSpace(newWorld); | |||
i:setTranslation(v.pos); | |||
table.insert(commands, Commands:moveNode(i, newLocal)); | |||
end | |||
end | |||
app.undoRedoManager:doCommand(Commands:batchCommand(commands)); | |||
end | |||
function Move3DTool:commandMoveBy(offset) | |||
-- 骚诨没詯注屎偏訂詹一穴要訂织 | |||
if cc.pEqual(offset, {x = 0, y = 0}) then | |||
return; | |||
end | |||
-- 斩 | |||
local targetOffset = cc.vec3(offset.x, 0, offset.y); | |||
-- 通诮募庐4訂织 | |||
local commands = {}; | |||
for i , v in pairs(app.editor.SelectedNodes) do | |||
local originWorld = v:getParent():convertToWorldSpace(v:getPosition()); | |||
local newWorld = cc.vec3Add(originWorld , targetOffset); | |||
local newLocal = v:getParent():convertToNodeSpace(newWorld); | |||
table.insert(commands, Commands:moveNode(v, newLocal)); | |||
end | |||
app.undoRedoManager:doCommand(Commands:batchCommand(commands)); | |||
end | |||
return Move3DTool; |
@@ -0,0 +1,292 @@ | |||
require("EditorGlobalFunction") | |||
local MoveTool = class("MoveTool") | |||
function MoveTool:ctor() | |||
self.onSelect = nil; | |||
end | |||
function MoveTool:clear() | |||
self.startPos = nil; | |||
self.originPoies = nil; | |||
if self.selectRectNode then | |||
self.selectRectNode:removeFromParent(); | |||
self.selectRectNode = nil; | |||
end | |||
end | |||
-- 计算节点是否跟矩形相交,如果相交,则插入到intersects表中 | |||
local function intersectNode(node , rect , intersects , all) | |||
-- 隐藏节点不给选中 | |||
if not node:isVisible() then | |||
return; | |||
end | |||
node:sortAllChildren(); | |||
-- 递归 | |||
local children = node:getChildren(); | |||
for i = #children , 1 , -1 do | |||
intersectNode(children[i] , rect , intersects , all) | |||
end | |||
if node:selectTest(rect) then | |||
-- 是否忽略空节点 | |||
if app.editor:canSelectNode(all, node) then | |||
table.insert(intersects , node); | |||
end | |||
end | |||
end | |||
function MoveTool:MouseDown(button , x , y) | |||
-- 按下ALT控制相机 | |||
if app.cs.getModifierKeys() == Keys.Alt then | |||
return false; | |||
end | |||
-- 不是鼠标左键按下不处理 | |||
if button ~= MouseButtons.Left then | |||
if button == MouseButtons.Right then | |||
return true; | |||
end | |||
return false; | |||
end | |||
self.startPos = cc.p(x, y); | |||
self.originPoies = {}; | |||
local size = cc.Director:getInstance():getWinSize(); | |||
local screenSize = cc.Director:getInstance():getWinSizeInPixels(); | |||
local ray = app.mainCamera:pickRay(self.startPos.x / screenSize.width , self.startPos.y / screenSize.height); | |||
--[[local hitTest = cc.PhysicsController:getInstance():rayTest(ray, 100000) | |||
if hitTest == true then | |||
print("击中目标了") | |||
end--]] | |||
-- 计算点选的区域 | |||
local rect = cc.Rectangle:new(self.startPos.x / size.width , self.startPos.y / size.height , 1 / size.width , 1 / size.height); | |||
-- 看是否点中的是已选择的,如果是,则只是记录点选位置 | |||
local hitNode; | |||
for i , v in pairs(app.editor.SelectedNodes) do | |||
if v:selectTest(rect) then | |||
hitNode = v; | |||
end | |||
end | |||
-- 没选中任何东西 | |||
if not hitNode then | |||
if self.selectRectNode then | |||
self.selectRectNode:removeFromParent(); | |||
self.selectRectNode = nil; | |||
end | |||
-- 这里需要支持撤销 | |||
--[[local commands = {}; | |||
-- 有选中的东西则需要通过命令来撤销 | |||
if next(app.editor.SelectedNodes) ~= nil then | |||
local command = Commands:unselect(app.editor.SelectedNodes); | |||
table.insert(commands, command); | |||
end--]] | |||
-- 实现Ctrl按住可以多选 | |||
if app.cs.getModifierKeys() ~= Keys.Control then | |||
app.editor:clearSelect(); | |||
end | |||
local intersects = {}; | |||
-- 递归计算哪些节点相交 | |||
intersectNode(app.editor.node , rect , intersects); | |||
-- 选中第一个 | |||
local selectedNode = intersects[1]; | |||
if selectedNode then | |||
-- 选中 | |||
app.cs.selectNodes({selectedNode}); | |||
app.editor:selectNode(selectedNode); | |||
app.cs.setPropertyObject(selectedNode); | |||
-- 通过命令来选中 | |||
--[[local command = Commands:select(intersects); | |||
table.insert(commands, command);--]] | |||
else | |||
self.selectRectNode = cc.BoxNode:create(); | |||
self.selectRectNode.startPos = app.visibleRect:convertScreenToGLView(self.startPos.x, self.startPos.y); | |||
self.selectRectNode.endPos = app.visibleRect:convertScreenToGLView(self.startPos.x, self.startPos.y); | |||
-- 计算开始点 | |||
app.mainLayer:addChild(self.selectRectNode); | |||
end | |||
--app.undoRedoManager:doCommand(Commands:batchCommand(commands)); | |||
end | |||
-- 记录下所有节点的位置 | |||
for i , v in pairs(app.editor.SelectedNodes) do | |||
-- 如果自己的父节点在这个列表里面则不需要统计了 | |||
if not ParentNodeIsInTable(v, app.editor.SelectedNodes) then | |||
self.originPoies[v] = | |||
{ | |||
pos = v:getTranslation(); | |||
rotate = v:getEulerRotation(); | |||
} | |||
end | |||
end | |||
return true; | |||
end | |||
-- 派生类重写 | |||
function MoveTool:moveTo(screenX, screenY) | |||
end | |||
-- 派生类重写 | |||
function MoveTool:commandMoveTo(screenX, screenY) | |||
end | |||
-- 派生类重写 | |||
function MoveTool:commandMoveBy(offset) | |||
end | |||
-- 派生类重写 | |||
function MoveTool:MouseMove(button , x , y) | |||
if not self.startPos then return end | |||
-- 计算结束点 | |||
if self.selectRectNode then | |||
self.selectRectNode.endPos = app.visibleRect:convertScreenToGLView(x, y); | |||
end | |||
self:moveTo(x, y); | |||
end | |||
function MoveTool:MouseUp(button , x , y) | |||
if button == MouseButtons.Right then | |||
local editor = app.editor; | |||
--editor:clearSelect (); | |||
local size = cc.Director:getInstance():getWinSize(); | |||
local intersects = {}; | |||
local rect = cc.Rectangle:new(x / size.width , y / size.height , 1 / size.width , 1 / size.height); | |||
-- 递归计算哪些节点相交 | |||
intersectNode(editor.node ,rect, intersects, true); | |||
local items = {}; | |||
for _ , item in pairs(intersects) do | |||
table.insert(items , { | |||
text = item:getName () ; | |||
func = function() | |||
editor:clearSelect (); | |||
editor:selectNode (item); | |||
app.cs.selectNodes ({item}); | |||
app.cs.setPropertyObject (item); | |||
end; | |||
}); | |||
end | |||
app.cs.popMenu(items,{x=x;y=y;}); | |||
return; | |||
end | |||
if not self.startPos then return end | |||
-- 计算结束点 | |||
self:commandMoveTo(x, y); | |||
-- 如果没有元素 | |||
if next(app.editor.SelectedNodes) == nil then | |||
local startPos = self.startPos; | |||
local endPos = cc.p(x, y); | |||
-- 计算框选的区域 | |||
local size = cc.Director:getInstance():getWinSize(); | |||
local rect = cc.Rectangle:new(math.min(startPos.x , endPos.x) / size.width | |||
, math.min(startPos.y , endPos.y) / size.height | |||
, math.abs(endPos.x - startPos.x) / size.width | |||
, math.abs(endPos.y - startPos.y) / size.height | |||
); | |||
local intersects = {}; | |||
-- 计算哪些节点相交 | |||
-- 递归 | |||
intersectNode(app.editor.node , rect , intersects); | |||
-- 实现Ctrl按住可以多选 | |||
if app.cs.getModifierKeys() ~= Keys.Control then | |||
app.editor:clearSelect(); | |||
end | |||
-- 通过命令来选中 | |||
--[[local command = Commands:select(intersects); | |||
app.undoRedoManager:doCommand(command);--]] | |||
if intersects[1] then | |||
app.cs.setPropertyObject(intersects[1]); | |||
end | |||
app.cs.selectNodes(intersects); | |||
for i , v in pairs(intersects) do | |||
app.editor:selectNode(v); | |||
end | |||
end | |||
self:clear(); | |||
end | |||
function MoveTool:KeyDown(Control, Alt, Shift, KeyCode) | |||
end | |||
function MoveTool:KeyUp(Control, Alt, Shift, KeyCode) | |||
end | |||
function MoveTool:DialogKey(Control, Alt, Shift, KeyCode) | |||
if Alt then | |||
if KeyCode == Keys.Up then | |||
local maxY = 0; | |||
for i , v in pairs(app.editor.SelectedNodes) do | |||
local node = v; | |||
maxY = math.max(maxY , node:getPositionY() + node:getAnchorPoint().y * node:getContentSize().height); | |||
end | |||
for i , v in pairs(app.editor.SelectedNodes) do | |||
local node = v; | |||
local offsetY = maxY - (node:getPositionY() + node:getAnchorPoint().y * node:getContentSize().height); | |||
node:setPositionY(node:getPositionY() + offsetY); | |||
end | |||
elseif KeyCode == Keys.Down then | |||
local minY = 65536; | |||
for i , v in pairs(app.editor.SelectedNodes) do | |||
local node = v; | |||
minY = math.min(minY , node:getPositionY() - node:getAnchorPoint().y * node:getContentSize().height); | |||
end | |||
for i , v in pairs(app.editor.SelectedNodes) do | |||
local node = v; | |||
local offsetY = minY - (node:getPositionY() - node:getAnchorPoint().y * node:getContentSize().height); | |||
node:setPositionY(node:getPositionY() + offsetY); | |||
end | |||
elseif KeyCode == Keys.Left then | |||
local minX = 65536; | |||
for i , v in pairs(app.editor.SelectedNodes) do | |||
local node = v; | |||
minX = math.min(minX , node:getPositionX() - node:getAnchorPoint().x * node:getContentSize().width); | |||
end | |||
for i , v in pairs(app.editor.SelectedNodes) do | |||
local node = v; | |||
local offsetX = minX - (node:getPositionX() - node:getAnchorPoint().x * node:getContentSize().width); | |||
node:setPositionX(node:getPositionX() + offsetX); | |||
end | |||
elseif KeyCode == Keys.Right then | |||
local maxX = 0; | |||
for i , v in pairs(app.editor.SelectedNodes) do | |||
local node = v; | |||
maxX = math.max(maxX , node:getPositionX() + node:getAnchorPoint().x * node:getContentSize().width); | |||
end | |||
for i , v in pairs(app.editor.SelectedNodes) do | |||
local node = v; | |||
local offsetX = maxX - (node:getPositionX() + node:getAnchorPoint().x * node:getContentSize().width); | |||
node:setPositionX(node:getPositionX() + offsetX); | |||
end | |||
end | |||
else | |||
local offset = cc.p(0,0); | |||
if KeyCode == Keys.Up then | |||
offset.y = 1; | |||
end | |||
if KeyCode == Keys.Down then | |||
offset.y = -1; | |||
end | |||
if KeyCode == Keys.Left then | |||
offset.x = -1; | |||
end | |||
if KeyCode == Keys.Right then | |||
offset.x = 1; | |||
end | |||
self:commandMoveBy(offset); | |||
end | |||
end | |||
return MoveTool; |
@@ -0,0 +1,269 @@ | |||
require("UIWidget"); | |||
require("CCRectNode"); | |||
local NodeEditor = class("NodeEditor" , require("Editor")); | |||
function NodeEditor:ctor() | |||
self.SelectedNodes = {} | |||
-- 节点计数器 | |||
self.NodeCount = 1 | |||
self.SelectedIndex = 1; | |||
end | |||
function NodeEditor:activate() | |||
-- 恢复场景的位置 | |||
app.mainScene:setPosition(cc.p(0,0)); | |||
-- 恢复下场景的缩放 | |||
app.setting.ScreenScale = 1; | |||
app.mainScene:setScale(app.setting.ScreenScale); | |||
end | |||
function NodeEditor:unactivate() | |||
self:closeNode(); | |||
end | |||
function NodeEditor:play() | |||
if self.node then | |||
self.node:playCurveAnimation(); | |||
if self.node.stop then | |||
self.node:stop(); | |||
end | |||
if self.node.play then | |||
self.node:play(); | |||
end | |||
end | |||
end | |||
-- 是否可以选中此节点 | |||
function NodeEditor:canSelectNode(flag, node) | |||
-- 忽略空节点 | |||
if not flag and table.valueOfItem({"Layout", "GridLine" , "Scaler" , "Node" , "Scene"} , node.ClassName) then | |||
return false; | |||
end | |||
return true; | |||
end | |||
function NodeEditor:stop() | |||
if self.node then | |||
self.node:stopCurveAnimation(); | |||
if self.node.stop then | |||
self.node:stop(); | |||
end | |||
end | |||
end | |||
-- 各个派生类可以重写这个函数 | |||
function NodeEditor:save(filename) | |||
NodeEditor.super.save(self, filename); | |||
--self.node:save(filename); | |||
self.node:saveToFile(filename); | |||
-- 清空undoredoManager | |||
app.undoRedoManager:clear(); | |||
end | |||
-- 关闭光效 | |||
function NodeEditor:closeNode() | |||
if self.node then | |||
self.node:removeFromParent(); | |||
self.node = nil; | |||
end | |||
self:clearSelect(); | |||
end | |||
-- 初始化光效,添加到场景中 | |||
function NodeEditor:initNode(node) | |||
self.node = node | |||
app.mainLayer:addChild(self.node) | |||
end | |||
function NodeEditor:createNode(nodeType) | |||
local node = cc[nodeType]:createNode() | |||
-- 设置节点的名字 | |||
node:setName(nodeType) | |||
if type(node.setDefaults) == "function" then | |||
node:setDefaults(); | |||
end | |||
self:autoSetNodeName(node); | |||
return node; | |||
end | |||
-- 从文件载入节点 | |||
function NodeEditor:loadNode(nodeFile) | |||
self:closeNode(); | |||
--self.node = createNodeFromFile(nodeFile); | |||
self.node = tolua.cast(cc.StreamObject:loadFromFile(nodeFile) , "cc.Node3D"); | |||
self:initNode(self.node); | |||
return self.node; | |||
end | |||
-- 清除所有选择 | |||
function NodeEditor:clearSelect() | |||
for i , v in pairs(self.SelectedNodes) do | |||
v.selectedNode:removeFromParent(); | |||
v.selectedNode = nil; | |||
end | |||
self.SelectedNodes = {}; | |||
end | |||
--[[-- 通过命令清除所有选择 | |||
function NodeEditor:commandClearSelect() | |||
if table.nums(self.SelectedNodes) <= 0 then | |||
return; | |||
end | |||
-- 通过command来清空选择 | |||
local command = Commands:unselect(self.SelectedNodes); | |||
app.undoRedoManager:doCommand(command); | |||
end--]] | |||
-- 取消选择一个节点 | |||
function NodeEditor:unSelectNode(node) | |||
if not self.SelectedNodes[node] then | |||
return | |||
end | |||
-- 去掉选择框 | |||
local curNode = self.SelectedNodes[node]; | |||
curNode.selectedNode:removeFromParent(); | |||
curNode.selectedNode = nil; | |||
-- 从列表中去掉 | |||
self.SelectedNodes[node] = nil; | |||
end | |||
-- 通过命令取消选择一个节点 | |||
--[[function NodeEditor:commandUnselectNode(node) | |||
local nodes = {}; | |||
table.insert(nodes, node); | |||
local command = Commands:unselect(nodes); | |||
app.undoRedoManager:doCommand(command); | |||
end--]] | |||
-- 选择一个节点 | |||
function NodeEditor:selectNode(node) | |||
if self.SelectedNodes[node] then | |||
return; | |||
end | |||
self.SelectedNodes[node] = node; | |||
-- 保存计数值,记录选中的顺序 | |||
node.SelectedIndex = self.SelectedIndex; | |||
self.SelectedIndex = self.SelectedIndex + 1; | |||
local rectNode = cc.RectNode:create(node); | |||
node.selectedNode = rectNode; | |||
app.mainLayer:addChild(rectNode); | |||
end | |||
-- 通过命令选择一个节点 | |||
--[[function NodeEditor:commandSelectNode(node) | |||
local nodes = {}; | |||
table.insert(nodes, node); | |||
local command = Commands:select(nodes); | |||
app.undoRedoManager:doCommand(command); | |||
end--]] | |||
-- 删除选中的节点 | |||
function NodeEditor:deleteNode(node) | |||
-- 不在选中队列里不能删除 | |||
if not self.SelectedNodes[node] then | |||
return; | |||
end | |||
-- 去掉选择框 | |||
local curNode = self.SelectedNodes[node]; | |||
curNode.selectedNode:removeFromParent(); | |||
curNode.selectedNode = nil; | |||
-- 从列表中去掉 | |||
self.SelectedNodes[node] = nil; | |||
node:removeFromParent(); | |||
end | |||
-- 通过命令删除一个节点 | |||
function NodeEditor:commandDeleteNode(node) | |||
local command = Commands:deleteNode(node); | |||
app.undoRedoManager:doCommand(command); | |||
end | |||
-- 删除所有选中的节点 | |||
function NodeEditor:commandDeleteSelectNodes() | |||
if next(self.SelectedNodes) == nil then | |||
return; | |||
end | |||
-- 如果子节点和父节点都在删除的范围里面则只删除父节点就可以了 | |||
local deleteNodes = {}; | |||
for i, v in pairs(self.SelectedNodes) do | |||
if not ParentNodeIsInTable(v, self.SelectedNodes) then | |||
table.insert(deleteNodes, v); | |||
end | |||
end | |||
local commands = {}; | |||
for i, v in pairs(deleteNodes) do | |||
local command = Commands:deleteNode(v); | |||
table.insert(commands, command); | |||
end | |||
-- 清空所有选中 | |||
self:clearSelect(); | |||
app.undoRedoManager:doCommand(Commands:batchCommand(commands)); | |||
end | |||
-- 改变节点的父子关系 | |||
function NodeEditor:commandModityNode(node, newParent) | |||
local command = Commands:modifyNode(node, newParent); | |||
app.undoRedoManager:doCommand(command); | |||
end | |||
-- 复制节点到另一个节点下面 | |||
function NodeEditor:commandCopyNode(node, parentNode) | |||
local command = Commands:addNode(node, parentNode); | |||
app.undoRedoManager:doCommand(command); | |||
end | |||
-- 复制一个节点的动画到另一个节点下面 | |||
function NodeEditor:commandCopyNodeAnim(node, parentNode) | |||
local command = Commands:copyNodeAnim(node, parentNode); | |||
app.undoRedoManager:doCommand(command); | |||
end | |||
function NodeEditor:sceneToMouse(x , y) | |||
return app.mainLayer:convertToWorldSpace(cc.p(x,y)); | |||
end | |||
function NodeEditor:mouseToScene(x , y) | |||
return app.mainLayer:convertToNodeSpace(cc.p(x,y)); | |||
end | |||
-- 摆放一个节点到场景中 | |||
-- @nodeType 节点类型名字 | |||
-- @parentNode 父节点 | |||
-- @posWithMouse 鼠标的窗口位置 | |||
function NodeEditor:placeNode(nodeType , parentNode , posWithMouse) | |||
local node = self:createNode(nodeType); | |||
local pNode = nil; | |||
if parentNode then | |||
pNode = parentNode; | |||
else | |||
pNode = self.node; | |||
end | |||
-- 设置世界坐标 | |||
if posWithMouse then | |||
local worldPos = app.cameraController:convertScreenToWorldPos(posWithMouse.x , posWithMouse.y); | |||
local nodePos = pNode:convertToNodeSpace(worldPos); | |||
node:setTranslation(nodePos); | |||
end | |||
-- 通过命令添加到节点树里面 | |||
local command = Commands:addNode(node, pNode); | |||
app.undoRedoManager:doCommand(command); | |||
return node; | |||
end | |||
return NodeEditor; |
@@ -0,0 +1,101 @@ | |||
-- 填充障碍块工具 | |||
local ObstacleTool = class("ObstacleTool") | |||
local ToolSize = 0; | |||
function ObstacleTool:MouseDown(button , x , y) | |||
-- 按下ALT控制相机 | |||
if app.cs.getModifierKeys() == Keys.Alt then return end | |||
-- 转换坐标 | |||
local worldPos = app.cameraController:convertScreenToWorldPos(x, y); | |||
-- 将像素坐标转换成逻辑坐标 | |||
local logicalPos = app.editor.Map:getTilePosition(worldPos.x, worldPos.z); | |||
-- 左键按下添加障碍快 | |||
if (button == MouseButtons.Left) then | |||
for x = -ToolSize , ToolSize do | |||
for y = -ToolSize , ToolSize do | |||
app.editor.Map:addObstacle(logicalPos.x + x, logicalPos.y + y); | |||
end | |||
end | |||
end | |||
-- 右键按下删除障碍块 | |||
if (button == MouseButtons.Right) then | |||
for x = -ToolSize , ToolSize do | |||
for y = -ToolSize , ToolSize do | |||
app.editor.Map:removeObstacle(logicalPos.x + x, logicalPos.y + y); | |||
end | |||
end | |||
end | |||
-- 中间填充 | |||
if button == MouseButtons.Middle then | |||
local map = app.editor.Map; | |||
local function FillShape(x, y) | |||
if not map:isInMap(x , y) then | |||
return | |||
end | |||
if not map:isObstacle(x,y) then | |||
map:addObstacle(x, y); | |||
FillShape(x+1, y); | |||
FillShape(x-1, y); | |||
FillShape(x, y+1); | |||
FillShape(x, y-1); | |||
end | |||
end | |||
FillShape(logicalPos.x , logicalPos.y); | |||
end | |||
end | |||
function ObstacleTool:MouseMove(button, x , y) | |||
-- 按下ALT控制相机 | |||
if app.cs.getModifierKeys() == Keys.Alt then return end | |||
-- 转换坐标 | |||
local worldPos = app.cameraController:convertScreenToWorldPos(x, y); | |||
-- 将像素坐标转换成逻辑坐标 | |||
local logicalPos = app.editor.Map:getTilePosition(worldPos.x, worldPos.z); | |||
-- 左键按下添加障碍快 | |||
if (button == MouseButtons.Left) then | |||
for x = -ToolSize , ToolSize do | |||
for y = -ToolSize , ToolSize do | |||
app.editor.Map:addObstacle(logicalPos.x + x, logicalPos.y + y); | |||
end | |||
end | |||
end | |||
-- 右键按下删除障碍块 | |||
if (button == MouseButtons.Right) then | |||
for x = -ToolSize , ToolSize do | |||
for y = -ToolSize , ToolSize do | |||
app.editor.Map:removeObstacle(logicalPos.x + x, logicalPos.y + y); | |||
end | |||
end | |||
end | |||
end | |||
function ObstacleTool:DialogKey(Control, Alt, Shift, KeyCode) | |||
if KeyCode == Keys.Up then | |||
ToolSize = ToolSize + 1; | |||
elseif KeyCode == Keys.Down then | |||
ToolSize = ToolSize - 1; | |||
elseif KeyCode == Keys.Left then | |||
ToolSize = ToolSize - 10; | |||
elseif KeyCode == Keys.Right then | |||
ToolSize = ToolSize + 10; | |||
end | |||
if ToolSize > 100 then | |||
ToolSize = 100; | |||
elseif ToolSize < 0 then | |||
ToolSize = 0; | |||
end | |||
ToolSize = math.ceil(ToolSize); | |||
end | |||
function ObstacleTool:MouseUp(button, x, y) | |||
end | |||
return ObstacleTool; |
@@ -0,0 +1,453 @@ | |||
--这里指定客户端后期加载 | |||
return | |||
{ | |||
--后期加载的目录 | |||
Dirs= | |||
{ | |||
["res/ui/b_baowu"]=true, | |||
["res/ui/c_chengjiu"]=true, | |||
["res/ui/d_dixiacheng"]=true, | |||
["res/ui/c_chongzhi"]=true, | |||
["res/ui/h_haoyou"]=true, | |||
["res/ui/z_zhulizhongzu"]=true, | |||
["res/ui/ui_lianmeng"]=true, | |||
["res/ui/j_jiuguan"]=true, | |||
["res/ui/q_qianghua"]=true, | |||
["res/ui/ui_wjinchanglang"]=true, | |||
["res/ui/z_zhuangbeihecheng"]=true, | |||
["res/ui/ui_huodong"]=true, | |||
["res/ui/s_shangdian"]=true, | |||
["res/sound/BattleVoice"]=true, | |||
["res/ui/ui_chongzhi"]=true, | |||
["res/animation/YM_1"]=true, | |||
["res/animation/SFMN"]=true, | |||
["res/animation/SDHB"]=true, | |||
["res/animation/DXLZ"]=true, | |||
["res/animation/JSZZ"]=true, | |||
["res/animation/WTQS"]=true, | |||
["res/animation/XGJ"]=true, | |||
["res/animation/BSWY"]=true, | |||
["res/animation/LXZY"]=true, | |||
["res/animation/TKBZ"]=true, | |||
["res/animation/CJZ"]=true, | |||
["res/animation/TQBZ"]=true, | |||
["res/animation/XDZ"]=true, | |||
["res/animation/EMZS"]=true, | |||
["res/animation/KJMW"]=true, | |||
["res/animation/TLWN"]=true, | |||
["res/animation/AYLR"]=true, | |||
["res/animation/XSNW"]=true, | |||
["res/animation/TYS"]=true, | |||
["res/animation/HYS"]=true, | |||
["res/animation/SYS"]=true, | |||
["res/animation/FYS"]=true, | |||
["res/animation/LL"]=true, | |||
["res/animation/DLY"]=true, | |||
["res/animation/XJL"]=true, | |||
["res/animation/KMJY"]=true, | |||
["res/animation/JDZY"]=true, | |||
["res/animation/YXZ"]=true, | |||
["res/animation/ZZMR"]=true, | |||
["res/animation/monster/JXBB"]=true, | |||
["res/animation/monster/JS"]=true, | |||
["res/animation/monster/HAIBO"]=true, | |||
["res/animation/monster/WLTF"]=true, | |||
["res/animation/monster/TC"]=true, | |||
["res/animation/monster/DZZ"]=true, | |||
["res/animation/monster/DJEM"]=true, | |||
["res/animation/monster/YJ"]=true, | |||
["res/animation/monster/XX"]=true, | |||
["res/animation/monster/NJS"]=true, | |||
["res/animation/monster/BMX"]=true, | |||
["res/animation/monster/LX"]=true, | |||
["res/animation/monster/HB"]=true, | |||
["res/animation/monster/XEJXS"]=true, | |||
["res/animation/monster/JBGX"]=true, | |||
["res/animation/monster/KLGS"]=true, | |||
["res/animation/BH_1"]=true, | |||
["res/animation/BSWY_1"]=true, | |||
["res/animation/EMZS_1"]=true, | |||
["res/animation/LL_1"]=true, | |||
["res/animation/SDHB_1"]=true, | |||
["res/animation/TYS_1"]=true, | |||
["res/animation/XCJS_1"]=true, | |||
["res/animation/XJL_1"]=true, | |||
["res/animation/ZZMR_1"]=true, | |||
["res/animation/YM"]=true, | |||
["res/effect/ActorSkillEffect/YM"]=true, | |||
["res/effect/ActorSkillEffect/SFMN"]=true, | |||
["res/effect/ActorSkillEffect/SDHB"]=true, | |||
["res/effect/ActorSkillEffect/DXLZ"]=true, | |||
["res/effect/ActorSkillEffect/JSZZ"]=true, | |||
["res/effect/ActorSkillEffect/WTQS"]=true, | |||
["res/effect/ActorSkillEffect/XGJ"]=true, | |||
["res/effect/ActorSkillEffect/BSWY"]=true, | |||
["res/effect/ActorSkillEffect/LXZY"]=true, | |||
["res/effect/ActorSkillEffect/TKBZ"]=true, | |||
["res/effect/ActorSkillEffect/CJZ"]=true, | |||
["res/effect/ActorSkillEffect/TQBZ"]=true, | |||
["res/effect/ActorSkillEffect/XDZ"]=true, | |||
["res/effect/ActorSkillEffect/EMZS"]=true, | |||
["res/effect/ActorSkillEffect/KJMW"]=true, | |||
["res/effect/ActorSkillEffect/XCJS"]=true, | |||
["res/effect/ActorSkillEffect/TLWN"]=true, | |||
["res/effect/ActorSkillEffect/AYLR"]=true, | |||
["res/effect/ActorSkillEffect/XSNW"]=true, | |||
["res/effect/ActorSkillEffect/TYS"]=true, | |||
["res/effect/ActorSkillEffect/HYS"]=true, | |||
["res/effect/ActorSkillEffect/SYS"]=true, | |||
["res/effect/ActorSkillEffect/FYS"]=true, | |||
["res/effect/ActorSkillEffect/LL"]=true, | |||
["res/effect/ActorSkillEffect/DLY"]=true, | |||
["res/effect/ActorSkillEffect/XJL"]=true, | |||
["res/effect/ActorSkillEffect/KMJY"]=true, | |||
["res/effect/ActorSkillEffect/JDZY"]=true, | |||
["res/effect/ActorSkillEffect/YXZ"]=true, | |||
["res/effect/ActorSkillEffect/ZZMR"]=true, | |||
["res/scene/scene_LMDT_001"]=true, | |||
["res/scene/scene_LMDT_zhanchang_001"]=true, | |||
["res/scene/scene_fukongdao_pve_001"]=true, | |||
["res/scene/scene_fukongdao_pvp_002"]=true, | |||
["res/scene/sc_hd_zhanchang"]=true, | |||
["res/scene/sc_mx_hd_001"]=true, | |||
}, | |||
--后期加载的文件 | |||
Files= | |||
{ | |||
["res/ui/gengengxinbao/jingyingdixiachengditu_01.png"]=true, | |||
["res/ui/gengengxinbao/jingyingdixiachengditu_02.png"]=true, | |||
["res/ui/gengengxinbao/qianghua_quan_di.png"]=true, | |||
["res/ui/gengengxinbao/kaifuhuodong_renwu.png"]=true, | |||
["res/ui/gengengxinbao/chognzhi_mingzilibao.jpg"]=true, | |||
["res/ui/gengengxinbao/kaiqikunnanmoashi.jpg"]=true, | |||
["res/ui/gengengxinbao/kaifuhuodong_wenzi.png"]=true, | |||
["res/ui/gengengxinbao/pingjia_app_01.png"]=true, | |||
["res/ui/gengengxinbao/q_jing_09_faguang.png"]=true, | |||
["res/ui/gengengxinbao/shaungbei_yeqian_03.png"]=true, | |||
["res/ui/gengengxinbao/zuiqiangzhengduo_shang.png"]=true, | |||
["res/ui/gengengxinbao/q_jing_09.png"]=true, | |||
["res/ui/gengengxinbao/q_jing_10_faguang.png"]=true, | |||
["res/ui/gengengxinbao/shaungbei_yeqian_01.png"]=true, | |||
["res/ui/gengengxinbao/zuiqiangzhengduo_xia.png"]=true, | |||
["res/ui/gengengxinbao/q_jing_10.png"]=true, | |||
["res/ui/gengengxinbao/chunjie_beijing.png"]=true, | |||
["res/ui/gengengxinbao/shaungbei_yeqian_02.png"]=true, | |||
["res/ui/gengengxinbao/shaungbei_yeqian_04.png"]=true, | |||
["res/sound/scene/map_3.ogg"]=true, | |||
["res/sound/scene/zhanchang_PVP_002.ogg"]=true, | |||
["res/sound/scene/zhanchang_PVE_005.ogg"]=true, | |||
["res/sound/scene/map_4.ogg"]=true, | |||
["res/sound/scene/zhanchang_PVP_001.ogg"]=true, | |||
["res/sound/scene/zhanchang_PVE_003.ogg"]=true, | |||
["res/sound/scene/zhucheng_1.ogg"]=true, | |||
["res/sound/scene/zhanchang_PVE_006.ogg"]=true, | |||
["res/sound/scene/zhanchang_PVP_003.ogg"]=true, | |||
["res/sound/scene/zhanchang_PVE_002.ogg"]=true, | |||
["res/sound/scene/zhanchang_PVE_001.ogg"]=true, | |||
["res/sound/scene/Sweeping.ogg"]=true, | |||
["res/sound/scene/zhanchang_PVE_004.ogg"]=true, | |||
["res/sound/scene/zhanchang_PVS_001.ogg"]=true, | |||
["res/sound/scene/zhanchang_PVS_002.ogg"]=true, | |||
["res/sound/scene/zhanchang_PVS_003.ogg"]=true, | |||
["res/sound/scene/jingjichang_1.ogg"]=true, | |||
["res/sound/scene/map_1.ogg"]=true, | |||
["res/sound/scene/LianMeng_2.ogg"]=true, | |||
["res/sound/scene/jingjichang_2.ogg"]=true, | |||
["res/sound/scene/JiuGuan_1.ogg"]=true, | |||
["res/sound/scene/JiuGuan_2.ogg"]=true, | |||
["res/sound/scene/JiuGuan_3.ogg"]=true, | |||
["res/sound/scene/AHorseThrough.ogg"]=true, | |||
["res/sound/scene/RunToMainCity.ogg"]=true, | |||
["res/sound/Nico/Nico_02.ogg"]=true, | |||
["res/sound/Nico/Nico_03.ogg"]=true, | |||
["res/sound/Nico/Nico_05.ogg"]=true, | |||
["res/sound/Nico/Nico_06.ogg"]=true, | |||
["res/sound/Nico/Nico_07.ogg"]=true, | |||
["res/sound/Nico/Nico_08.ogg"]=true, | |||
["res/sound/Nico/Nico_09.ogg"]=true, | |||
["res/sound/Nico/Nico_10.ogg"]=true, | |||
["res/sound/Nico/Nico_11.ogg"]=true, | |||
["res/sound/Nico/Nico_12.ogg"]=true, | |||
["res/sound/Nico/Nico_13.ogg"]=true, | |||
["res/sound/Nico/Nico_14.ogg"]=true, | |||
["res/sound/Nico/Nico_17.ogg"]=true, | |||
["res/sound/Nico/Nico_18.ogg"]=true, | |||
["res/sound/Nico/Nico_19.ogg"]=true, | |||
["res/sound/Nico/Nico_21.ogg"]=true, | |||
["res/sound/Nico/Nico_23.ogg"]=true, | |||
["res/sound/Nico/Nico_24.ogg"]=true, | |||
["res/sound/Nico/Nico_27.ogg"]=true, | |||
["res/sound/Nico/Nico_28.ogg"]=true, | |||
["res/sound/Nico/Nico_29.ogg"]=true, | |||
["res/sound/Nico/Nico_30.ogg"]=true, | |||
["res/sound/Nico/Nico_31.ogg"]=true, | |||
["res/sound/Nico/Nico_32.ogg"]=true, | |||
["res/sound/Nico/Nico_33.ogg"]=true, | |||
["res/sound/Nico/Nico_34.ogg"]=true, | |||
["res/sound/Nico/Nico_35.ogg"]=true, | |||
["res/sound/Nico/Nico_36.ogg"]=true, | |||
["res/sound/Nico/Nico_37.ogg"]=true, | |||
["res/sound/Nico/Nico_38.ogg"]=true, | |||
["res/sound/Nico/Nico_39.ogg"]=true, | |||
["res/sound/Nico/Nico_40.ogg"]=true, | |||
["res/sound/Nico/Nico_44.ogg"]=true, | |||
["res/sound/Nico/Nico_45.ogg"]=true, | |||
["res/sound/Nico/Nico_46.ogg"]=true, | |||
["res/sound/Nico/Nico_47.ogg"]=true, | |||
["res/sound/Nico/Nico_48.ogg"]=true, | |||
["res/sound/Nico/Nico_49.ogg"]=true, | |||
["res/sound/Nico/Nico_50.ogg"]=true, | |||
["res/sound/Nico/Nico_51.ogg"]=true, | |||
["res/sound/Nico/Nico_52.ogg"]=true, | |||
["res/sound/Nico/Nico_53.ogg"]=true, | |||
["res/sound/Nico/Nico_54.ogg"]=true, | |||
["res/sound/Nico/Nico_55.ogg"]=true, | |||
["res/sound/Nico/Nico_56.ogg"]=true, | |||
["res/sound/Nico/Nico_57.ogg"]=true, | |||
["res/sound/Nico/Nico_58.ogg"]=true, | |||
["res/sound/Nico/Nico_59.ogg"]=true, | |||
["res/sound/Nico/Nico_60.ogg"]=true, | |||
["res/sound/Nico/Nico_62.ogg"]=true, | |||
["res/sound/Nico/Nico_63.ogg"]=true, | |||
["res/sound/UI/EnterWounder.ogg"]=true, | |||
["res/sound/UI/EnterKingView.ogg"]=true, | |||
["res/sound/UI/Lose.ogg"]=true, | |||
["res/sound/UI/EnterAchieveView.ogg"]=true, | |||
["res/sound/UI/SagaSynthesis.ogg"]=true, | |||
["res/sound/AYLR/AYLR_born_1.ogg"]=true, | |||
["res/sound/AYLR/AYLR_born_2.ogg"]=true, | |||
["res/sound/AYLR/AYLR_born_3.ogg"]=true, | |||
["res/sound/BH/BH_born_1.ogg"]=true, | |||
["res/sound/BH/BH_born_2.ogg"]=true, | |||
["res/sound/BH/BH_born_3.ogg"]=true, | |||
["res/sound/BSWY/BSWY_born_1.ogg"]=true, | |||
["res/sound/BSWY/BSWY_born_2.ogg"]=true, | |||
["res/sound/BSWY/BSWY_born_3.ogg"]=true, | |||
["res/sound/CJTS/CJTS_born_1.ogg"]=true, | |||
["res/sound/CJTS/CJTS_born_2.ogg"]=true, | |||
["res/sound/CJTS/CJTS_born_3.ogg"]=true, | |||
["res/sound/CJZ/CJZ_born_1.ogg"]=true, | |||
["res/sound/CJZ/CJZ_born_2.ogg"]=true, | |||
["res/sound/CJZ/CJZ_born_3.ogg"]=true, | |||
["res/sound/DJSS/DJSS_born_1.ogg"]=true, | |||
["res/sound/DJSS/DJSS_born_2.ogg"]=true, | |||
["res/sound/DJSS/DJSS_born_3.ogg"]=true, | |||
["res/sound/DLY/DLY_born_1.ogg"]=true, | |||
["res/sound/DLY/DLY_born_2.ogg"]=true, | |||
["res/sound/DLY/DLY_born_3.ogg"]=true, | |||
["res/sound/DMFS/DMFS_born_1.ogg"]=true, | |||
["res/sound/DMFS/DMFS_born_2.ogg"]=true, | |||
["res/sound/DMFS/DMFS_born_3.ogg"]=true, | |||
["res/sound/DSPG/DSPG_born_1.ogg"]=true, | |||
["res/sound/DSPG/DSPG_born_2.ogg"]=true, | |||
["res/sound/DSPG/DSPG_born_3.ogg"]=true, | |||
["res/sound/DXLZ/DXLZ_born_1.ogg"]=true, | |||
["res/sound/DXLZ/DXLZ_born_2.ogg"]=true, | |||
["res/sound/DXLZ/DXLZ_born_3.ogg"]=true, | |||
["res/sound/DYH/DYH_born_1.ogg"]=true, | |||
["res/sound/DYH/DYH_born_2.ogg"]=true, | |||
["res/sound/DYH/DYH_born_3.ogg"]=true, | |||
["res/sound/EMZS/EMZS_born_1.ogg"]=true, | |||
["res/sound/EMZS/EMZS_born_2.ogg"]=true, | |||
["res/sound/EMZS/EMZS_born_3.ogg"]=true, | |||
["res/sound/FYS/FYS_born_1.ogg"]=true, | |||
["res/sound/FYS/FYS_born_2.ogg"]=true, | |||
["res/sound/FYS/FYS_born_3.ogg"]=true, | |||
["res/sound/GSZZ/GSZZ_born_1.ogg"]=true, | |||
["res/sound/GSZZ/GSZZ_born_2.ogg"]=true, | |||
["res/sound/GSZZ/GSZZ_born_3.ogg"]=true, | |||
["res/sound/HBNW/HBNW_born_1.ogg"]=true, | |||
["res/sound/HBNW/HBNW_born_2.ogg"]=true, | |||
["res/sound/HBNW/HBNW_born_3.ogg"]=true, | |||
["res/sound/HJSJ/HJSJ_born_1.ogg"]=true, | |||
["res/sound/HJSJ/HJSJ_born_2.ogg"]=true, | |||
["res/sound/HJSJ/HJSJ_born_3.ogg"]=true, | |||
["res/sound/HLLZ/HLLZ_born_1.ogg"]=true, | |||
["res/sound/HLLZ/HLLZ_born_2.ogg"]=true, | |||
["res/sound/HLLZ/HLLZ_born_3.ogg"]=true, | |||
["res/sound/HYS/HYS_born_1.ogg"]=true, | |||
["res/sound/HYS/HYS_born_2.ogg"]=true, | |||
["res/sound/HYS/HYS_born_3.ogg"]=true, | |||
["res/sound/HYZD/HYZD_born_1.ogg"]=true, | |||
["res/sound/HYZD/HYZD_born_2.ogg"]=true, | |||
["res/sound/HYZD/HYZD_born_3.ogg"]=true, | |||
["res/sound/JDZY/JDZY_born_1.ogg"]=true, | |||
["res/sound/JDZY/JDZY_born_2.ogg"]=true, | |||
["res/sound/JDZY/JDZY_born_3.ogg"]=true, | |||
["res/sound/JSZZ/JSZZ_born_1.ogg"]=true, | |||
["res/sound/JSZZ/JSZZ_born_2.ogg"]=true, | |||
["res/sound/JSZZ/JSZZ_born_3.ogg"]=true, | |||
["res/sound/KCHY/KCHY_born_1.ogg"]=true, | |||
["res/sound/KCHY/KCHY_born_2.ogg"]=true, | |||
["res/sound/KCHY/KCHY_born_3.ogg"]=true, | |||
["res/sound/KJMW/KJMW_born_1.ogg"]=true, | |||
["res/sound/KJMW/KJMW_born_2.ogg"]=true, | |||
["res/sound/KJMW/KJMW_born_3.ogg"]=true, | |||
["res/sound/KMJY/KMJY_born_1.ogg"]=true, | |||
["res/sound/KMJY/KMJY_born_2.ogg"]=true, | |||
["res/sound/KMJY/KMJY_born_3.ogg"]=true, | |||
["res/sound/KSYR/KSYR_born_1.ogg"]=true, | |||
["res/sound/KSYR/KSYR_born_2.ogg"]=true, | |||
["res/sound/KSYR/KSYR_born_3.ogg"]=true, | |||
["res/sound/LJSS/LJSS_born_1.ogg"]=true, | |||
["res/sound/LJSS/LJSS_born_2.ogg"]=true, | |||
["res/sound/LJSS/LJSS_born_3.ogg"]=true, | |||
["res/sound/LL/LL_born_1.ogg"]=true, | |||
["res/sound/LL/LL_born_2.ogg"]=true, | |||
["res/sound/LL/LL_born_3.ogg"]=true, | |||
["res/sound/LN/LN_born_1.ogg"]=true, | |||
["res/sound/LN/LN_born_2.ogg"]=true, | |||
["res/sound/LN/LN_born_3.ogg"]=true, | |||
["res/sound/LXZY/LXZY_born_1.ogg"]=true, | |||
["res/sound/LXZY/LXZY_born_2.ogg"]=true, | |||
["res/sound/LXZY/LXZY_born_3.ogg"]=true, | |||
["res/sound/SDHB/SDHB_born_1.ogg"]=true, | |||
["res/sound/SDHB/SDHB_born_2.ogg"]=true, | |||
["res/sound/SDHB/SDHB_born_3.ogg"]=true, | |||
["res/sound/SFMN/SFMN_born_1.ogg"]=true, | |||
["res/sound/SFMN/SFMN_born_2.ogg"]=true, | |||
["res/sound/SFMN/SFMN_born_3.ogg"]=true, | |||
["res/sound/SH/SH_born_1.ogg"]=true, | |||
["res/sound/SH/SH_born_2.ogg"]=true, | |||
["res/sound/SH/SH_born_3.ogg"]=true, | |||
["res/sound/SLJR/SLJR_born_1.ogg"]=true, | |||
["res/sound/SLJR/SLJR_born_2.ogg"]=true, | |||
["res/sound/SLJR/SLJR_born_3.ogg"]=true, | |||
["res/sound/STMQ/STMQ_born_1.ogg"]=true, | |||
["res/sound/STMQ/STMQ_born_2.ogg"]=true, | |||
["res/sound/STMQ/STMQ_born_3.ogg"]=true, | |||
["res/sound/SYS/SYS_born_1.ogg"]=true, | |||
["res/sound/SYS/SYS_born_2.ogg"]=true, | |||
["res/sound/SYS/SYS_born_3.ogg"]=true, | |||
["res/sound/TKBZ/TKBZ_born_1.ogg"]=true, | |||
["res/sound/TKBZ/TKBZ_born_2.ogg"]=true, | |||
["res/sound/TKBZ/TKBZ_born_3.ogg"]=true, | |||
["res/sound/TLNW/TLNW_born_1.ogg"]=true, | |||
["res/sound/TLNW/TLNW_born_2.ogg"]=true, | |||
["res/sound/TLNW/TLNW_born_3.ogg"]=true, | |||
["res/sound/TQBZ/TQBZ_born_1.ogg"]=true, | |||
["res/sound/TQBZ/TQBZ_born_2.ogg"]=true, | |||
["res/sound/TQBZ/TQBZ_born_3.ogg"]=true, | |||
["res/sound/TYS/TYS_born_1.ogg"]=true, | |||
["res/sound/TYS/TYS_born_2.ogg"]=true, | |||
["res/sound/TYS/TYS_born_3.ogg"]=true, | |||
["res/sound/WTQS/WTQS_born_1.ogg"]=true, | |||
["res/sound/WTQS/WTQS_born_2.ogg"]=true, | |||
["res/sound/WTQS/WTQS_born_3.ogg"]=true, | |||
["res/sound/XCJS/XCJS_born_1.ogg"]=true, | |||
["res/sound/XCJS/XCJS_born_2.ogg"]=true, | |||
["res/sound/XCJS/XCJS_born_3.ogg"]=true, | |||
["res/sound/XDMM/XDMM_born_1.ogg"]=true, | |||
["res/sound/XDMM/XDMM_born_2.ogg"]=true, | |||
["res/sound/XDMM/XDMM_born_3.ogg"]=true, | |||
["res/sound/XDZ/XDZ_born_1.ogg"]=true, | |||
["res/sound/XDZ/XDZ_born_2.ogg"]=true, | |||
["res/sound/XDZ/XDZ_born_3.ogg"]=true, | |||
["res/sound/XGJ/XGJ_born_1.ogg"]=true, | |||
["res/sound/XGJ/XGJ_born_2.ogg"]=true, | |||
["res/sound/XGJ/XGJ_born_3.ogg"]=true, | |||
["res/sound/XJL/XJL_born_1.ogg"]=true, | |||
["res/sound/XJL/XJL_born_2.ogg"]=true, | |||
["res/sound/XJL/XJL_born_3.ogg"]=true, | |||
["res/sound/XSNW/XSNW_born_1.ogg"]=true, | |||
["res/sound/XSNW/XSNW_born_2.ogg"]=true, | |||
["res/sound/XSNW/XSNW_born_3.ogg"]=true, | |||
["res/sound/XXJTS/XXJTS_born_1.ogg"]=true, | |||
["res/sound/XXJTS/XXJTS_born_2.ogg"]=true, | |||
["res/sound/XXJTS/XXJTS_born_3.ogg"]=true, | |||
["res/sound/YM/YM_born_1.ogg"]=true, | |||
["res/sound/YM/YM_born_2.ogg"]=true, | |||
["res/sound/YM/YM_born_3.ogg"]=true, | |||
["res/sound/YXZ/YXZ_born_1.ogg"]=true, | |||
["res/sound/YXZ/YXZ_born_2.ogg"]=true, | |||
["res/sound/YXZ/YXZ_born_3.ogg"]=true, | |||
["res/sound/ZZMR/ZZMR_born_1.ogg"]=true, | |||
["res/sound/ZZMR/ZZMR_born_2.ogg"]=true, | |||
["res/sound/ZZMR/ZZMR_born_3.ogg"]=true, | |||
["res/sound/HJSJ/HJSJ_death.ogg"]=true, | |||
["res/sound/DMFS/DMFS_death.ogg"]=true, | |||
["res/sound/YM/YM_death.ogg"]=true, | |||
["res/sound/SFMN/SFMN_death.ogg"]=true, | |||
["res/sound/SDHB/SDHB_death.ogg"]=true, | |||
["res/sound/DXLZ/DXLZ_death.ogg"]=true, | |||
["res/sound/LJSS/LJSS_death.ogg"]=true, | |||
["res/sound/SLJR/SLJR_death.ogg"]=true, | |||
["res/sound/LN/LN_death.ogg"]=true, | |||
["res/sound/DJSS/DJSS_death.ogg"]=true, | |||
["res/sound/DSPG/DSPG_death.ogg"]=true, | |||
["res/sound/CJTS/CJTS_death.ogg"]=true, | |||
["res/sound/JSZZ/JSZZ_death.ogg"]=true, | |||
["res/sound/WTQS/WTQS_death.ogg"]=true, | |||
["res/sound/XGJ/XGJ_death.ogg"]=true, | |||
["res/sound/BSWY/BSWY_death.ogg"]=true, | |||
["res/sound/LXZY/LXZY_death.ogg"]=true, | |||
["res/sound/TKBZ/TKBZ_death.ogg"]=true, | |||
["res/sound/CJZ/CJZ_death.ogg"]=true, | |||
["res/sound/TQBZ/TQBZ_death.ogg"]=true, | |||
["res/sound/STMQ/STMQ_death.ogg"]=true, | |||
["res/sound/DYH/DYH_death.ogg"]=true, | |||
["res/sound/HYZD/HYZD_death.ogg"]=true, | |||
["res/sound/KSYR/KSYR_death.ogg"]=true, | |||
["res/sound/KCHY/KCHY_death.ogg"]=true, | |||
["res/sound/XXJTS/XXJTS_death.ogg"]=true, | |||
["res/sound/BH/BH_death.ogg"]=true, | |||
["res/sound/SH/SH_death.ogg"]=true, | |||
["res/sound/XDMM/XDMM_death.ogg"]=true, | |||
["res/sound/HBNW/HBNW_death.ogg"]=true, | |||
["res/sound/HLLZ/HLLZ_death.ogg"]=true, | |||
["res/sound/XDZ/XDZ_death.ogg"]=true, | |||
["res/sound/EMZS/EMZS_death.ogg"]=true, | |||
["res/sound/KJMW/KJMW_death.ogg"]=true, | |||
["res/sound/XCJS/XCJS_death.ogg"]=true, | |||
["res/sound/TLNW/TLNW_death.ogg"]=true, | |||
["res/sound/AYLR/AYLR_death.ogg"]=true, | |||
["res/sound/XSNW/XSNW_death.ogg"]=true, | |||
["res/sound/TYS/TYS_death.ogg"]=true, | |||
["res/sound/HYS/HYS_death.ogg"]=true, | |||
["res/sound/SYS/SYS_death.ogg"]=true, | |||
["res/sound/FYS/FYS_death.ogg"]=true, | |||
["res/sound/LL/LL_death.ogg"]=true, | |||
["res/sound/DLY/DLY_death.ogg"]=true, | |||
["res/sound/XJL/XJL_death.ogg"]=true, | |||
["res/sound/GSZZ/GSZZ_death.ogg"]=true, | |||
["res/sound/KMJY/KMJY_death.ogg"]=true, | |||
["res/sound/JDZY/JDZY_death.ogg"]=true, | |||
["res/sound/YXZ/YXZ_death.ogg"]=true, | |||
["res/sound/ZZMR/ZZMR_death.ogg"]=true, | |||
["res/ui/icons/yingxiongyuanhua/anyinglangren.jpg"]=true, | |||
["res/ui/icons/yingxiongyuanhua/bushiwuyao.jpg"]=true, | |||
["res/ui/icons/yingxiongyuanhua/chongjizhe.jpg"]=true, | |||
["res/ui/icons/yingxiongyuanhua/dixuelingzhu.jpg"]=true, | |||
["res/ui/icons/yingxiongyuanhua/dushetuteng.jpg"]=true, | |||
["res/ui/icons/yingxiongyuanhua/emozhishou.jpg"]=true, | |||
["res/ui/icons/yingxiongyuanhua/fengyuansu.jpg"]=true, | |||
["res/ui/icons/yingxiongyuanhua/heilonglingzhu.jpg"]=true, | |||
["res/ui/icons/yingxiongyuanhua/huoyuansu.jpg"]=true, | |||
["res/ui/icons/yingxiongyuanhua/jiangshizhizhu.jpg"]=true, | |||
["res/ui/icons/yingxiongyuanhua/juduzhiyuan.jpg"]=true, | |||
["res/ui/icons/yingxiongyuanhua/jumoyuanhua.jpg"]=true, | |||
["res/ui/icons/yingxiongyuanhua/kongjumownang.jpg"]=true, | |||
["res/ui/icons/yingxiongyuanhua/kumujuyi.jpg"]=true, | |||
["res/ui/icons/yingxiongyuanhua/linglong.jpg"]=true, | |||
["res/ui/icons/yingxiongyuanhua/luxingzhanying.jpg"]=true, | |||
["res/ui/icons/yingxiongyuanhua/niutouqiuzhang.jpg"]=true, | |||
["res/ui/icons/yingxiongyuanhua/shefamonv.jpg"]=true, | |||
["res/ui/icons/yingxiongyuanhua/shenlinshouwei.jpg"]=true, | |||
["res/ui/icons/yingxiongyuanhua/shuangdaomobao.jpg"]=true, | |||
["res/ui/icons/yingxiongyuanhua/shuiyuansu.jpg"]=true, | |||
["res/ui/icons/yingxiongyuanhua/taluowunv.jpg"]=true, | |||
["res/ui/icons/yingxiongyuanhua/tiankongbazhu.jpg"]=true, | |||
["res/ui/icons/yingxiongyuanhua/tianqibazhu.jpg"]=true, | |||
["res/ui/icons/yingxiongyuanhua/tuyuansu.jpg"]=true, | |||
["res/ui/icons/yingxiongyuanhua/wutouqishi.jpg"]=true, | |||
["res/ui/icons/yingxiongyuanhua/xiaochoujingshen.jpg"]=true, | |||
["res/ui/icons/yingxiongyuanhua/xiaojingling.jpg"]=true, | |||
["res/ui/icons/yingxiongyuanhua/xieduzhe.jpg"]=true, | |||
["res/ui/icons/yingxiongyuanhua/xuegongjue.jpg"]=true, | |||
["res/ui/icons/yingxiongyuanhua/xunshounvwang.jpg"]=true, | |||
["res/ui/icons/yingxiongyuanhua/yanmo.jpg"]=true, | |||
["res/ui/icons/yingxiongyuanhua/yinxingzhe.jpg"]=true, | |||
["res/ui/icons/yingxiongyuanhua/zhaozhejuren.jpg"]=true, | |||
["res/ui/icons/yingxiongyuanhua/ziranchanrao.jpg"]=true, | |||
} | |||
} |
@@ -0,0 +1,140 @@ | |||
local SceneEditor = class("SceneEditor" , require("NodeEditor")); | |||
function SceneEditor:ctor() | |||
SceneEditor.super.ctor(self); | |||
end | |||
function SceneEditor:activate() | |||
SceneEditor.super.activate(self); | |||
app.setting.OriginAnchor = cc.p(0,0); | |||
app:refreshSetting(); | |||
end | |||
function SceneEditor:unactivate() | |||
SceneEditor.super.unactivate(self); | |||
if self.MapEditor ~= nil then | |||
self.MapEditor:close(); | |||
end | |||
end | |||
function SceneEditor:play() | |||
if self.node then | |||
self.node:playCurveAnimation(); | |||
local cameraSphericlNode = self.node:findNode("SphericalCameraNode") | |||
if cameraSphericlNode then | |||
cameraSphericlNode:setCollectAnimationClip(false) | |||
local function curveAnimationEnd() | |||
-- 编辑器里需要更新 | |||
if cameraSphericlNode:isSphericalActive() then | |||
cameraSphericlNode:startUpdate() | |||
end | |||
end | |||
cameraSphericlNode:playCurveAnimation(curveAnimationEnd) | |||
end | |||
-- 递归遍历下面的所有子节点 | |||
local function visit(node) | |||
if node.stop then | |||
node:stop(); | |||
end | |||
if node.play then | |||
node:play(); | |||
end | |||
end | |||
self.node:visitNode(visit); | |||
end | |||
end | |||
function SceneEditor:stop() | |||
if self.node then | |||
self.node:stopCurveAnimation(); | |||
local cameraSphericlNode = self.node:findNode("SphericalCameraNode") | |||
if cameraSphericlNode then | |||
cameraSphericlNode:stopCurveAnimation() | |||
-- 编辑器里需要更新 | |||
if cameraSphericlNode:isSphericalActive() then | |||
cameraSphericlNode:startUpdate() | |||
end | |||
end | |||
-- 递归遍历下面的所有子节点 | |||
local function visit(node) | |||
if node.stop then | |||
node:stop(); | |||
end | |||
end | |||
self.node:visitNode(visit); | |||
end | |||
end | |||
-- 创建新的光效 | |||
function SceneEditor:newNode() | |||
self:closeNode(); | |||
local node = self:createNode("Scene"); | |||
node:setName("Root"); | |||
self:initNode(node) | |||
-- 创建一个新的地图 | |||
self.Map = require("Map"):new(); | |||
self.MapEditor = require("MapEditor"):new(); | |||
return node; | |||
end | |||
-- 设置地图的宽度和高度 | |||
function SceneEditor:initMap(mapWidth, mapHeight, tileWidth, tileHeight) | |||
if self.Map == nil then | |||
error("没有创建地图"); | |||
end | |||
-- 初始化地图宽度和高度 | |||
self.Map:initWidthAndHeight(mapWidth, mapHeight, tileWidth, tileHeight); | |||
self.Map:initObstacles(); | |||
self.MapEditor:init(); | |||
end | |||
-- 从文件载入节点 | |||
function SceneEditor:loadNode(nodeFile) | |||
local node = SceneEditor.super.loadNode(self, nodeFile); | |||
-- 创建一个题图载入资源 | |||
self.Map = require("Map"):new(); | |||
local arr = string.split(nodeFile, "."); | |||
self.Map:loadLua(arr[1] .. ".lmap"); | |||
self.MapEditor = require("MapEditor"):new(); | |||
self.MapEditor:init(); | |||
--[[-- 获取相机 | |||
local cameraNode = node:findNode("main_camera"); | |||
app.mainLayer:setActiveCamera(cameraNode:getCamera()); | |||
app.mainCamera = cameraNode:getCamera(); | |||
local winSize = cc.Director:getInstance():getWinSize(); | |||
app.mainCamera:setAspectRatio(winSize.width / winSize.height); | |||
app.cameraController:refreshSetting();--]] | |||
return node; | |||
end | |||
function SceneEditor:save(filename) | |||
SceneEditor.super.save(self, filename); | |||
local arr = string.split(filename, "."); | |||
-- 保存地图 | |||
self.Map:saveLua(arr[1] .. ".lmap"); | |||
self.Map:saveXml(arr[1] .. ".map"); | |||
end | |||
-- 关闭光效 | |||
function SceneEditor:closeNode() | |||
SceneEditor.super.closeNode(self); | |||
end | |||
-- 初始化光效,添加到场景中 | |||
function SceneEditor:initNode(node) | |||
SceneEditor.super.initNode(self , node); | |||
end | |||
function SceneEditor:createNode(nodeType) | |||
local node = SceneEditor.super.createNode(self , nodeType); | |||
if node.enableAutoPlay then | |||
node:enableAutoPlay(); | |||
end | |||
return node; | |||
end | |||
return SceneEditor; |
@@ -0,0 +1,147 @@ | |||
local UIEditor = class("UIEditor" , require("NodeEditor")); | |||
function UIEditor:ctor() | |||
UIEditor.super.ctor(self); | |||
end | |||
function UIEditor:activate() | |||
UIEditor.super.activate(self); | |||
app.setting.OriginAnchor = cc.p(0,0); | |||
app.setting.SourceNodeNum = 0; | |||
app.setting.TargetNodeNum = 0; | |||
app:refreshSetting(); | |||
self.mBackgroundNode = self:createUIBackground(); | |||
app.mainLayer:addChild(self.mBackgroundNode , -100); | |||
end | |||
function UIEditor:unactivate() | |||
UIEditor.super.unactivate(self); | |||
if self.mBackgroundNode then | |||
self.mBackgroundNode:removeFromParent(); | |||
self.mBackgroundNode = nil; | |||
end | |||
end | |||
-- 创建UI底图 | |||
-- 创建UI底图 | |||
-- 创建UI底图 | |||
-- 创建UI底图 | |||
-- 创建UI底图 | |||
-- 创建UI底图 | |||
-- 创建UI底图 | |||
-- 创建UI底图 | |||
-- 创建UI底图 | |||
-- 创建UI底图 | |||
-- 创建UI底图 | |||
-- 创建UI底图 | |||
function UIEditor:createUIBackground() | |||
local glNode = gl.glNodeCreate() | |||
glNode:setAnchorPoint(cc.p(0, 0)) | |||
local function primitivesDraw(transform, transformUpdated) | |||
local node = self.node; | |||
if node then | |||
-- 绑定相机、世界矩阵 | |||
cc.DrawPrimitives.setCamera(cc.Director:getInstance():getActiveCamera()); | |||
cc.DrawPrimitives.setWorldTransform(node:getNodeToWorldTransform()); | |||
-- 画矩形 | |||
local rect = cc.rect(0 , 0 , node:getContentSize().width , node:getContentSize().height); | |||
cc.DrawPrimitives.drawSolidRect(cc.p(rect.x , rect.y), cc.p(rect.x + rect.width , rect.y + rect.height) , cc.c4f(0.6,0.6,0.6,1)) | |||
-- 状态恢复 | |||
gl.lineWidth(1) | |||
cc.DrawPrimitives.drawColor4B(255,255,255,255) | |||
cc.DrawPrimitives.setPointSize(1) | |||
end | |||
end | |||
glNode:registerScriptDrawHandler(primitivesDraw) | |||
return glNode; | |||
end | |||
function UIEditor:play() | |||
UIEditor.super.play(self) | |||
-- UIEffectNode需要重新播放下 | |||
local function visit(node) | |||
if node.stop then | |||
node:stop() | |||
end | |||
if node.play then | |||
node:play() | |||
end | |||
end | |||
self.node:visitNode(visit); | |||
end | |||
-- 创建新的光效 | |||
function UIEditor:newNode() | |||
self:closeNode(); | |||
local node = self:createNode("Layout"); | |||
self:initNode(node) | |||
node:ignoreContentAdaptWithSize(false); | |||
node:setSizeType(1); | |||
node:setSizePercent(cc.p(1,1)); | |||
node:setAnchorPoint(cc.p(0,0)); | |||
node:setBackGroundColorType(cc.LayoutBackGroundColorType.none); | |||
return node; | |||
end | |||
-- 关闭光效 | |||
function UIEditor:closeNode() | |||
UIEditor.super.closeNode(self); | |||
end | |||
-- 初始化光效,添加到场景中 | |||
function UIEditor:initNode(node) | |||
UIEditor.super.initNode(self , node); | |||
-- 默认播放更节点的动画 | |||
if app.setting.PlayUIAnimation then | |||
self.node:playCurveAnimation() | |||
end | |||
end | |||
function UIEditor:relayoutAll() | |||
local function onNode(node) | |||
if type(node.requestDoLayout) == "function" then | |||
node:requestDoLayout(); | |||
end | |||
return true; | |||
end | |||
-- 遍历所有子节点,把子UI取出来统一放在Items里 | |||
if self.node then | |||
self.node:visitNode(onNode); | |||
end | |||
end | |||
-- 属性改变通知 | |||
function UIEditor:onPropertyValueChanged(propName , newValue , oldValue) | |||
self:relayoutAll(); | |||
end | |||
function UIEditor:createNode(nodeType) | |||
local node = UIEditor.super.createNode(self , nodeType); | |||
if node.enableAutoPlay then | |||
node:enableAutoPlay(); | |||
end | |||
return node; | |||
end | |||
-- 各个派生类可以重写这个函数 | |||
function UIEditor:save(filename) | |||
self.node:recalcAllPList(); | |||
UIEditor.super.save(self, filename); | |||
local images = self.node:collectAllImage(); | |||
if images then | |||
local msg = "保存UI" .. filename .. "成功,这个UI用到了这些图片:\r\n"; | |||
for i , v in pairs(images) do | |||
msg = msg .. i .. " 用了 " .. v .. " 次\r\n"; | |||
end | |||
alert(msg); | |||
end | |||
end | |||
return UIEditor; |
@@ -0,0 +1,172 @@ | |||
local UIPreviewEditor = class("UIPreviewEditor" , require("Editor")); | |||
function UIPreviewEditor:ctor() | |||
UIPreviewEditor.super.ctor(self); | |||
-- 挂接UI的根节点 | |||
self.node = nil | |||
end | |||
function UIPreviewEditor:activate() | |||
UIPreviewEditor.super.activate(self); | |||
-- 恢复场景的位置 | |||
app.mainScene:setPosition(cc.p(0,0)); | |||
-- 恢复下场景的缩放 | |||
app.setting.ScreenScale = 1; | |||
app.mainScene:setScale(app.setting.ScreenScale); | |||
app.setting.OriginAnchor = cc.p(0,0); | |||
app.setting.SourceNodeNum = 0; | |||
app.setting.TargetNodeNum = 0; | |||
app:refreshSetting(); | |||
self.mBackgroundNode = self:createUIBackground(); | |||
app.mainLayer:addChild(self.mBackgroundNode , -100); | |||
end | |||
function UIPreviewEditor:unactivate() | |||
UIPreviewEditor.super.unactivate(self); | |||
self:closeNode() | |||
if self.mBackgroundNode then | |||
self.mBackgroundNode:removeFromParent(); | |||
self.mBackgroundNode = nil; | |||
end | |||
end | |||
-- 关闭当前打开的UI | |||
function UIPreviewEditor:closeNode() | |||
if self.node then | |||
self.node:removeFromParent(); | |||
self.node = nil; | |||
end | |||
end | |||
-- 从文件载入节点 | |||
function UIPreviewEditor:loadNode(nodeFile) | |||
self:closeNode(); | |||
self.node = tolua.cast(cc.StreamObject:loadFromFile(nodeFile) , "cc.Node3D"); | |||
self:initNode(self.node); | |||
return self.node; | |||
end | |||
-- 创建UI底图 | |||
function UIPreviewEditor:createUIBackground() | |||
local glNode = gl.glNodeCreate() | |||
glNode:setAnchorPoint(cc.p(0, 0)) | |||
local function primitivesDraw(transform, transformUpdated) | |||
local node = self.node; | |||
if node then | |||
-- 绑定相机、世界矩阵 | |||
cc.DrawPrimitives.setCamera(cc.Director:getInstance():getActiveCamera()); | |||
cc.DrawPrimitives.setWorldTransform(node:getNodeToWorldTransform()); | |||
-- 画矩形 | |||
local rect = cc.rect(0 , 0 , node:getContentSize().width , node:getContentSize().height); | |||
cc.DrawPrimitives.drawSolidRect(cc.p(rect.x , rect.y), cc.p(rect.x + rect.width , rect.y + rect.height) , cc.c4f(0.6,0.6,0.6,1)) | |||
-- 状态恢复 | |||
gl.lineWidth(1) | |||
cc.DrawPrimitives.drawColor4B(255,255,255,255) | |||
cc.DrawPrimitives.setPointSize(1) | |||
end | |||
end | |||
glNode:registerScriptDrawHandler(primitivesDraw) | |||
return glNode; | |||
end | |||
function UIPreviewEditor:play() | |||
UIPreviewEditor.super.play(self) | |||
if self.node then | |||
self.node:playCurveAnimation(); | |||
if self.node.stop then | |||
self.node:stop(); | |||
end | |||
if self.node.play then | |||
self.node:play(); | |||
end | |||
-- UIEffectNode需要重新播放下 | |||
local function visit(node) | |||
if node.stop then | |||
node:stop() | |||
end | |||
if node.play then | |||
node:play() | |||
end | |||
end | |||
self.node:visitNode(visit); | |||
end | |||
end | |||
function UIPreviewEditor:stop() | |||
if self.node then | |||
self.node:stopCurveAnimation(); | |||
if self.node.stop then | |||
self.node:stop(); | |||
end | |||
end | |||
end | |||
-- 创建新的光效 | |||
function UIPreviewEditor:newNode() | |||
local node = self:createNode("Layout"); | |||
self:initNode(node) | |||
node:ignoreContentAdaptWithSize(false); | |||
node:setSizeType(1); | |||
node:setSizePercent(cc.p(1,1)); | |||
node:setAnchorPoint(cc.p(0,0)); | |||
node:setBackGroundColorType(cc.LayoutBackGroundColorType.none); | |||
return node; | |||
end | |||
-- 初始化光效,添加到场景中 | |||
function UIPreviewEditor:initNode(node) | |||
self.node = node | |||
app.mainLayer:addChild(self.node) | |||
-- 默认播放更节点的动画 | |||
if app.setting.PlayUIAnimation then | |||
self.node:playCurveAnimation() | |||
end | |||
end | |||
function UIPreviewEditor:relayoutAll() | |||
local function onNode(node) | |||
if type(node.requestDoLayout) == "function" then | |||
node:requestDoLayout(); | |||
end | |||
return true; | |||
end | |||
-- 遍历所有子节点,把子UI取出来统一放在Items里 | |||
if self.node then | |||
self.node:visitNode(onNode); | |||
end | |||
end | |||
-- 属性改变通知 | |||
function UIPreviewEditor:onPropertyValueChanged(propName , newValue , oldValue) | |||
self:relayoutAll(); | |||
end | |||
function UIPreviewEditor:createNode(nodeType) | |||
local node = UIPreviewEditor.super.createNode(self , nodeType); | |||
if node.enableAutoPlay then | |||
node:enableAutoPlay(); | |||
end | |||
return node; | |||
end | |||
-- 各个派生类可以重写这个函数 | |||
function UIPreviewEditor:save(filename) | |||
self.node:recalcAllPList(); | |||
UIPreviewEditor.super.save(self, filename); | |||
local images = self.node:collectAllImage(); | |||
if images then | |||
local msg = "保存UI" .. filename .. "成功,这个UI用到了这些图片:\r\n"; | |||
for i , v in pairs(images) do | |||
msg = msg .. i .. " 用了 " .. v .. " 次\r\n"; | |||
end | |||
alert(msg); | |||
end | |||
end | |||
return UIPreviewEditor; |
@@ -0,0 +1,114 @@ | |||
require("Commands") | |||
-- Undo redo管理器 | |||
-- 负责编辑器的撤销和恢复操作 | |||
local UndoRedoManager = class("UndoRedoManager") | |||
function UndoRedoManager:ctor() | |||
-- redo 列表 | |||
self.redoStack = {}; | |||
-- undo 列表 | |||
self.undoStack = {}; | |||
-- 最大的撤销步数 | |||
self.maxStack = 100; | |||
end | |||
-- 执行一个操作 | |||
function UndoRedoManager:doCommand(command) | |||
if command:redo() then | |||
self:addCommand(command); | |||
else | |||
if type(command.clear) == "function" then | |||
command:clear(); | |||
end | |||
end | |||
end | |||
-- 压入一个操作 | |||
function UndoRedoManager:addCommand(command) | |||
-- 清空恢复操作列表 | |||
self:clearRedo(); | |||
-- 如果队列满了则需要踢出最久的那个操作 | |||
if #self.undoStack > self.maxStack then | |||
local undoIt = self.undoStack[table.nums(self.undoStack)]; | |||
if type(undoIt.clear) == "function" then | |||
undoIt.clear(); | |||
end | |||
table.remove(self.undoStack, #self.undoStack); | |||
end | |||
table.insert(self.undoStack, command); | |||
end | |||
-- redo操作 | |||
function UndoRedoManager:redo() | |||
if #self.redoStack <= 0 then | |||
return | |||
end | |||
local redoT = self.redoStack[table.nums(self.redoStack)]; | |||
redoT:redo(); | |||
-- 加入到恢复列表里面去 | |||
table.insert(self.undoStack, redoT); | |||
-- 从撤销列表里面去掉这个操作 | |||
table.remove(self.redoStack, #self.redoStack); | |||
end | |||
-- undo操作 | |||
function UndoRedoManager:undo() | |||
if #self.undoStack <= 0 then | |||
return | |||
end | |||
local undoT = self.undoStack[table.nums(self.undoStack)]; | |||
undoT:undo(); | |||
-- 加入到撤销列表里面去 | |||
table.insert(self.redoStack, undoT); | |||
-- 从恢复列表里面去掉这个操作 | |||
table.remove(self.undoStack, #self.undoStack); | |||
end | |||
function UndoRedoManager:canRedo() | |||
return #self.redoStack > 0; | |||
end | |||
function UndoRedoManager:canUndo() | |||
return #self.undoStack > 0; | |||
end | |||
function UndoRedoManager:clearRedo() | |||
-- 清空一些数据 | |||
for i, v in pairs(self.redoStack) do | |||
if type(v.clear) == "function" then | |||
v:clear(); | |||
end | |||
end | |||
-- 清空恢复列表 | |||
self.redoStack = {}; | |||
end | |||
function UndoRedoManager:clearUndo() | |||
-- 清空一些数据 | |||
for i, v in pairs(self.undoStack) do | |||
if type(v.clear) == "function" then | |||
v:clear(); | |||
end | |||
end | |||
-- 清空撤销列表 | |||
self.undoStack = {}; | |||
end | |||
-- 清空所有的撤销、恢复操作 | |||
function UndoRedoManager:clear() | |||
self:clearRedo(); | |||
self:clearUndo(); | |||
end | |||
return UndoRedoManager |
@@ -0,0 +1,126 @@ | |||
local VisibleRect = class("VisibleRect") | |||
function VisibleRect:ctor() | |||
self.s_visibleRect = cc.rect(0,0,0,0) | |||
end | |||
-- 初始化可见区域 | |||
function VisibleRect:lazyInit() | |||
if (self.s_visibleRect.width == 0.0 and self.s_visibleRect.height == 0.0) then | |||
self.s_visibleRect.x = 0 | |||
self.s_visibleRect.y = 0 | |||
local size = cc.Director:getInstance():getWinSize() | |||
self.s_visibleRect.width = size.width | |||
self.s_visibleRect.height = size.height | |||
end | |||
end | |||
function VisibleRect:updateVisibleRect() | |||
-- 这里只更新大小 | |||
local size = cc.Director:getInstance():getWinSize() | |||
self.s_visibleRect.width = size.width | |||
self.s_visibleRect.height = size.height | |||
end | |||
function VisibleRect:getVisibleRect() | |||
self:lazyInit() | |||
return cc.rect(self.s_visibleRect.x, self.s_visibleRect.y, self.s_visibleRect.width, self.s_visibleRect.height) | |||
end | |||
-- 将屏幕坐标转换成GLView坐标 | |||
function VisibleRect:convertScreenToGLView(x, y) | |||
self:lazyInit() | |||
return cc.p(x , self:getVisibleRect().height - y) | |||
end | |||
-- 将屏幕坐标转换成坐标系的坐标 | |||
function VisibleRect:convertScreenToCoordinate(x, y) | |||
self:lazyInit() | |||
local floorPlane = cc.Plane:new(cc.vec3(0,1,0) , 0); | |||
-- 计算出mainlayer的世界位置 | |||
local ray = app.mainCamera:pickRay(x / self.s_visibleRect.width , y / self.s_visibleRect.height); | |||
local distance = ray:intersectsPlane(floorPlane); | |||
if distance >= 0 then | |||
return ray:getPoint(distance); | |||
else | |||
return ray:getPoint(0); | |||
end | |||
end | |||
-- 将屏幕坐标转换成坐标系的坐标 | |||
function VisibleRect:convertScreenToCoordinate2D(x, y) | |||
self:lazyInit() | |||
local floorPlane = cc.Plane:new(cc.vec3(0,0,1) , 0); | |||
-- 计算出mainlayer的世界位置 | |||
local ray = app.mainCamera:pickRay(x / self.s_visibleRect.width , y / self.s_visibleRect.height); | |||
local distance = ray:intersectsPlane(floorPlane); | |||
if distance >= 0 then | |||
return ray:getPoint(distance); | |||
else | |||
return ray:getPoint(0); | |||
end | |||
end | |||
-- 鼠标位置转换成世界坐标 | |||
function VisibleRect:convertScreenToWorldPos(x , y) | |||
local pos = self:convertScreenToCoordinate(x , y); | |||
return app.mainLayer:convertToWorldSpace(pos); | |||
end | |||
-- 鼠标位置转换成世界坐标 | |||
function VisibleRect:convertScreenToWorldPos2D(x , y) | |||
local pos = self:convertScreenToCoordinate2D(x , y); | |||
return app.mainLayer:convertToWorldSpace(pos); | |||
end | |||
function VisibleRect:left() | |||
self:lazyInit() | |||
return cc.p(self.s_visibleRect.x, self.s_visibleRect.y+self.s_visibleRect.height/2) | |||
end | |||
function VisibleRect:right() | |||
self:lazyInit() | |||
return cc.p(self.s_visibleRect.x+self.s_visibleRect.width, self.s_visibleRect.y+self.s_visibleRect.height/2) | |||
end | |||
function VisibleRect:top() | |||
self:lazyInit() | |||
return cc.p(self.s_visibleRect.x+self.s_visibleRect.width/2, self.s_visibleRect.y+self.s_visibleRect.height) | |||
end | |||
function VisibleRect:bottom() | |||
self:lazyInit() | |||
return cc.p(self.s_visibleRect.x+self.s_visibleRect.width/2, self.s_visibleRect.y) | |||
end | |||
function VisibleRect:center() | |||
self:lazyInit() | |||
return cc.p(self.s_visibleRect.x+self.s_visibleRect.width/2, self.s_visibleRect.y+self.s_visibleRect.height/2) | |||
end | |||
function VisibleRect:leftTop() | |||
self:lazyInit() | |||
return cc.p(self.s_visibleRect.x, self.s_visibleRect.y+self.s_visibleRect.height) | |||
end | |||
function VisibleRect:rightTop() | |||
self:lazyInit() | |||
return cc.p(self.s_visibleRect.x+self.s_visibleRect.width, self.s_visibleRect.y+self.s_visibleRect.height) | |||
end | |||
function VisibleRect:leftBottom() | |||
self:lazyInit() | |||
return cc.p(self.s_visibleRect.x,self.s_visibleRect.y) | |||
end | |||
function VisibleRect:rightBottom() | |||
self:lazyInit() | |||
return cc.p(self.s_visibleRect.x+self.s_visibleRect.width, self.s_visibleRect.y) | |||
end | |||
return VisibleRect; |
@@ -0,0 +1,74 @@ | |||
cc.FileUtils:getInstance():addSearchPath("core") | |||
local writablePath = cc.FileUtils:getInstance():getWritablePath() | |||
local paths = cc.FileUtils:getInstance():getSearchPaths() | |||
--RomSetting 其他平台的对应的配置会在打包的时候覆盖core里面的 然后通过此文件加载对应平台的路径 | |||
local RomSetting = require("romFiles.RomSetting") | |||
if #paths<=3 then | |||
table.insert(paths,1,RomSetting.Platform) | |||
-- table.insert(paths,1,writablePath..RomSetting.Platform.."/") | |||
-- table.insert(paths,3,writablePath) | |||
cc.FileUtils:getInstance():setSearchPaths(paths) | |||
end | |||
cc.FileUtils:getInstance():addSearchPath("core/preload") | |||
cc.FileUtils:getInstance():addSearchPath("core/preload/tools") | |||
cc.FileUtils:getInstance():addSearchPath("Editor") | |||
cc.FileUtils:getInstance():addSearchPath("core/luaScript") | |||
cc.FileUtils:getInstance():addSearchPath("core/dataconfig") | |||
cc.FileUtils:getInstance():addSearchPath("core/romFiles") | |||
cc.FileUtils:getInstance():addSearchPath("core/luaScript/cc") | |||
cc.FileUtils:getInstance():addSearchPath("core/luaScript/Tools") | |||
cc.FileUtils:getInstance():addSearchPath("core/luaScript/Tools/Other") | |||
cc.FileUtils:getInstance():addSearchPath("core/luaScript/Tools/Nodes") | |||
cc.FileUtils:getInstance():addSearchPath("core/luaScript/Tools/Widgets") | |||
cc.FileUtils:getInstance():addSearchPath("core/luaScript/Tools/Tracks") | |||
cc.FileUtils:getInstance():addSearchPath("core/luaScript/Tools/Effect") | |||
cc.FileUtils:getInstance():addSearchPath("core/luaScript/Tools/Effect/ParticleSystem") | |||
cc.FileUtils:getInstance():addSearchPath("core/luaScript/Tools/Effect/ParticleSystem/Affector") | |||
cc.FileUtils:getInstance():addSearchPath("core/luaScript/Tools/Effect/ParticleSystem/Emitter") | |||
cc.FileUtils:getInstance():addSearchPath("core/luaScript/Protocol") | |||
cc.FileUtils:getInstance():addSearchPath("core/luaScript/Config") | |||
cc.FileUtils:getInstance():addSearchPath("core/luaScript/Extension") | |||
cc.FileUtils:getInstance():addSearchPath("core/luaScript/Map") | |||
cc.FileUtils:getInstance():addSearchPath("core/luaScript/Views") | |||
cc.FileUtils:getInstance():addSearchPath("core/luaScript/Config/Languages") | |||
cc.FileUtils:getInstance():addSearchPath("core/luaScript/Config/ConfigDesc") | |||
cc.FileUtils:getInstance():addSearchPath("core/luaScript/User") | |||
cc.FileUtils:getInstance():addSearchPath("core/luaScript/Plugins") | |||
cc.FileUtils:getInstance():addSearchPath("core/luaScript/PluginAdvertise") | |||
cc.FileUtils:getInstance():addSearchPath("core/luaScript/Learning") | |||
cc.FileUtils:getInstance():addSearchPath("core/luaScript/Learning/Script") | |||
-- 开启调试器 | |||
--require("debugger")("127.0.0.1", 10000, "luaidekey") | |||
-- 编辑器模式 | |||
EditorMode = true; | |||
cc.BaseObject:setEditorMode(true); | |||
-- avoid memory leak | |||
collectgarbage("setpause", 100) | |||
collectgarbage("setstepmul", 5000) | |||
-- 调试信息 | |||
function __G__TRACKBACK__(msg) | |||
print("----------------------------------------") | |||
print("LUA ERROR: " .. tostring(msg) .. "\n") | |||
print(debug.traceback()) | |||
print("----------------------------------------") | |||
local err = "脚本出错,速度截图后找程序麻烦,错误信息:" .. msg .. "\r\n" .. debug.traceback(); | |||
CCMessageBox(err , "脚本出错"); | |||
end | |||
local function main() | |||
-- 初始化随机种子 | |||
math.randomseed(os.time()); | |||
require("all") | |||
require("EditorApp"):new():run() | |||
end | |||
xpcall(main, __G__TRACKBACK__) |
@@ -0,0 +1,59 @@ | |||
# AngelCode Bitmap Font Generator configuration file | |||
fileVersion=1 | |||
# font settings | |||
fontName=·½ÕýÀ¼Í¤×¼ºÚ_GBK | |||
fontFile= | |||
charSet=134 | |||
fontSize=30 | |||
aa=1 | |||
scaleH=100 | |||
useSmoothing=1 | |||
isBold=0 | |||
isItalic=0 | |||
useUnicode=1 | |||
disableBoxChars=1 | |||
outputInvalidCharGlyph=0 | |||
dontIncludeKerningPairs=0 | |||
useHinting=1 | |||
renderFromOutline=0 | |||
useClearType=1 | |||
# character alignment | |||
paddingDown=0 | |||
paddingUp=0 | |||
paddingRight=0 | |||
paddingLeft=0 | |||
spacingHoriz=1 | |||
spacingVert=1 | |||
useFixedHeight=0 | |||
forceZero=0 | |||
# output file | |||
outWidth=512 | |||
outHeight=256 | |||
outBitDepth=32 | |||
fontDescFormat=0 | |||
fourChnlPacked=0 | |||
textureFormat=png | |||
textureCompression=0 | |||
alphaChnl=0 | |||
redChnl=4 | |||
greenChnl=4 | |||
blueChnl=4 | |||
invA=0 | |||
invR=0 | |||
invG=0 | |||
invB=0 | |||
# outline | |||
outlineThickness=0 | |||
# selected chars | |||
chars=32-126,12290,19979,20013,20102,20214,20449,20505,20687,20837,20986,21040,21151,21247,21387,21407 | |||
chars=21487-21488,21495,21518,21542,22240,22312,22833,22909,22987,23433,23436,24050,24320,24369,25103 | |||
chars=25104,25991,26032,26159,26356,26368,26412,26512,26597,26657,26816,27491,27605,27979,28216,28304 | |||
chars=28385,29256,30424,30913,31245,31957,31967,32476,32593,32622,33021,35013,35299,35831,36133,36164 | |||
chars=36733,36827,36864,37197,38169,39564,65281,65292,65306 | |||
# imported icon images |
@@ -0,0 +1,2 @@ | |||
# Client_Src | |||
@@ -0,0 +1,8 @@ | |||
git fetch origin | |||
git fetch upstream | |||
git remote prune origin | |||
git remote prune upstream | |||
pause |
@@ -0,0 +1,3 @@ | |||
git rebase remotes/origin/master | |||
pause |
@@ -0,0 +1,3 @@ | |||
git rebase remotes/upstream/master | |||
pause |
@@ -0,0 +1,7 @@ | |||
call _fetch.bat | |||
git checkout master | |||
git rebase upstream/master | |||
git push | |||
pause |
@@ -0,0 +1 @@ | |||
python changeProject.py |
@@ -0,0 +1,225 @@ | |||
# -*- coding: utf-8 -* | |||
import sys | |||
import os, os.path | |||
import time | |||
import zipfile | |||
import difflib | |||
import shutil | |||
import json | |||
import hashlib | |||
import httplib | |||
import urllib | |||
from ctypes import * | |||
from struct import * | |||
import re | |||
import base64 | |||
import math | |||
import subprocess | |||
import time | |||
reload(sys) | |||
sys.setdefaultencoding("utf-8") | |||
_srcPath = "storage" | |||
_platforms = { | |||
"1": {"name": u"-欢乐debug", "devMode": "debug","mark":"hl","platform":"huanle"}, | |||
"2": {"name": u"-欢乐release", "devMode": "release","mark":"hl","platform":"huanle"}, | |||
"3": {"name": u"-川南debug", "devMode": "debug","mark":"cn","platform":"chuannan"}, | |||
"4": {"name": u"-川南release", "devMode": "release","mark":"cn","platform":"chuannan"}, | |||
"5": {"name": u"-悠闲跑胡子debug", "devMode": "debug","mark":"yx","platform":"youxianmj"}, | |||
"6": {"name": u"-悠闲跑胡子release", "devMode": "release","mark":"yx","platform":"youxianmj"}, | |||
"7": {"name": u"-悠闲重庆debug", "devMode": "debug","mark":"cq","platform":"chongqing"}, | |||
"8": {"name": u"-悠闲重庆release", "devMode": "release","mark":"cq","platform":"chongqing"}, | |||
"9": {"name": u"-蜀州麻将debug", "devMode": "debug","mark":"sz","platform":"shuzhou"}, | |||
"10": {"name": u"-蜀州麻将release", "devMode": "release","mark":"sz","platform":"shuzhou"}, | |||
"11": {"name": u"-天天麻将debug", "devMode": "debug","mark":"tt","platform":"tiantian"}, | |||
"12": {"name": u"-天天麻将release", "devMode": "release","mark":"tt","platform":"tiantian"}, | |||
} | |||
def runCommand(cmd, isNeedLog = False): | |||
print("[Command] " + cmd) | |||
if cmd == None: | |||
return | |||
if isNeedLog: | |||
p = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE) | |||
p.wait() | |||
return p.stdout.readlines() | |||
else: | |||
subprocess.call(cmd, shell=True) | |||
def copyFile(source_path, target_path): | |||
if os.path.exists(source_path): | |||
global g_fileNumAll | |||
g_fileNumAll += 1 | |||
open(target_path, "wb").write(open(source_path, "rb").read()) | |||
def copyFiles(sourceDir, targetDir): | |||
if not os.path.isdir(sourceDir): | |||
print ("不存在路径:").encode("gbk"), sourceDir | |||
return | |||
# copyFileCounts = 'copyFileCounts' in globals() | |||
# print sourceDir | |||
# print u"%s 当前处理文件夹%s已处理%s 个文件" %(time.strftime('%Y-%m-%d %H:%M:%S',time.localtime(time.time())), sourceDir,copyFileCounts) | |||
for f in os.listdir(sourceDir): | |||
if f == ".git": | |||
pass | |||
else: | |||
sourceF = os.path.join(sourceDir, f) | |||
targetF = os.path.join(targetDir, f) | |||
if os.path.isfile(sourceF): | |||
if sourceF.find("README") > 0: | |||
continue | |||
# 创建目录 | |||
if not os.path.exists(targetDir): | |||
os.makedirs(targetDir) | |||
# copyFileCounts += 1 | |||
# 文件不存在,或者存在但是大小不同,覆盖 | |||
if not os.path.exists(targetF) or ( | |||
os.path.exists(targetF) and (os.path.getsize(targetF) != os.path.getsize(sourceF))): | |||
# 2进制文件 | |||
open(targetF, "wb").write(open(sourceF, "rb").read()) | |||
global g_fileNumAll | |||
g_fileNumAll += 1 | |||
# print u"%s %s 复制完毕" %(time.strftime('%Y-%m-%d %H:%M:%S',time.localtime(time.time())), targetF) | |||
else: | |||
# print u"%s %s 已存在,不重复复制" % ( | |||
# time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time())), targetF) | |||
pass | |||
if os.path.isdir(sourceF): | |||
copyFiles(sourceF, targetF) | |||
def removeFiles(sourceDir, prefix): | |||
for f in os.listdir(sourceDir): | |||
sourceF = os.path.join(sourceDir, f) | |||
if os.path.isfile(sourceF) and f.endswith(prefix): | |||
os.remove(sourceF) | |||
if os.path.isdir(sourceF): | |||
removeFiles(sourceF, prefix) | |||
def openFile(filename): | |||
with open(filename, 'rb') as f: # , 'r', encoding='UTF-8' | |||
str = f.read() | |||
f.close() | |||
return str | |||
def writeFile(filename, content): | |||
with open(filename, 'wb') as f: # , 'r', encoding='UTF-8' | |||
f.write(content) | |||
f.close() | |||
# 更新RoomSetting.lua文件时面的platform字段和isDevMode字段 | |||
def updateRomSetting(platform, mode): | |||
filePath = "romFiles/RomSetting.lua" | |||
fileContent = openFile(filePath) | |||
pattern = re.compile('Platform[\s]=[\s]\"[a-zA-Z]+\"') | |||
fileContent = re.sub(pattern, "Platform = \"{0}\"".format(platform), fileContent) | |||
pattern2 = re.compile('isDevMode[\s]=[\s][a-zA-Z]+') | |||
strDevMode = "false" if (mode == "master" or mode == "release") else "true" | |||
fileContent = re.sub(pattern2, "isDevMode = {0}".format(strDevMode), fileContent) | |||
writeFile(filePath, fileContent) | |||
# 更新RoomSetting.lua文件时面的platform字段和isDevMode字段 | |||
def getRomSettingData(): | |||
filePath = "romFiles/RomSetting.lua" | |||
fileContent = openFile(filePath) | |||
pattern = re.compile('Platform[\s]=[\s]\"[a-zA-Z]+\"') | |||
platform = re.findall(pattern, fileContent) | |||
# | |||
str_value = str(platform) | |||
str_value = str_value[:-3] | |||
str_value = str_value[14:] | |||
platform = str_value | |||
#print(platform) | |||
pattern2 = re.compile('isDevMode[\s]=[\s][a-zA-Z]+') | |||
devMode = re.findall(pattern2, fileContent) | |||
str_value = str(devMode) | |||
str_value = str_value[:-2] | |||
str_value = str_value[14:] | |||
#print(str_value) | |||
strDevMode = "debug" if (str_value == "true") else "release" | |||
return platform,strDevMode | |||
def yxPrint(str): | |||
print("====================================") | |||
print(str).encode('gbk') | |||
print("====================================") | |||
def main(): | |||
# 平台 | |||
inputStr = None | |||
inputTargetStr = None | |||
print "" | |||
oriPlatform,devMode = getRomSettingData() | |||
print("==============RomSetting Data:"+str(oriPlatform + devMode+"=================")) | |||
print "" | |||
for i in sorted(_platforms): | |||
if (_platforms[i]["platform"] + _platforms[i]["devMode"]) == str(oriPlatform + devMode): | |||
inputStr = i | |||
#print(i) | |||
break | |||
if not inputStr: | |||
print ("读取romsetting失败").encode('gbk') | |||
return | |||
for i in sorted(_platforms): | |||
print i, _platforms[i]["name"] | |||
print "" | |||
while True: | |||
print "" | |||
inputTargetStr = raw_input(unicode('输入要转到目标的平台:', 'utf-8').encode('gbk')) | |||
if _platforms.has_key(inputTargetStr): | |||
break | |||
else: | |||
yxPrint("【温馨提示:】未找到对应平台,请重新输入!") | |||
platformConfig = _platforms[inputStr] | |||
platformTargetConfig = _platforms[inputTargetStr] | |||
_targetDir = _srcPath + platformConfig["mark"] + platformConfig["devMode"] | |||
_secondDir = _srcPath + platformTargetConfig["mark"] + platformTargetConfig["devMode"] | |||
if os.path.isdir(_targetDir) or not os.path.isdir(_srcPath): | |||
yxPrint("【温馨提示:】源缓存"+_srcPath+"不存在或者源缓存重命名后的目标文件夹"+_targetDir + "已经存在") | |||
return | |||
elif not os.path.isdir(_secondDir): | |||
yxPrint("【温馨提示:】原目标缓存存在,但是目标平台文件夹缓存不存在,无法改为"+_srcPath) | |||
return | |||
else: | |||
os.rename(_srcPath,_targetDir) | |||
os.rename(_secondDir,_srcPath) | |||
yxPrint("切换到" + platformTargetConfig["name"] + "成功!! 奥力给!") | |||
# 更新项目配置 | |||
updateRomSetting(platformTargetConfig["platform"], platformTargetConfig["devMode"]) | |||
yxPrint ("更新项目配置成功!!") | |||
os.system("pause") | |||
# -------------- main -------------- | |||
if __name__ == '__main__': | |||
main() |
@@ -0,0 +1,2 @@ | |||
cd tools | |||
python git_update_minigames.py |
@@ -0,0 +1,42 @@ | |||
local Config = {} | |||
--开启测试登入模式 | |||
Config.isDebugLogion = false | |||
--关闭更新设置 | |||
Config.isCloseUpdate = false | |||
-- Rom中固化的设置 | |||
Config.RomSetting = loadRomSettingScript() | |||
-- 其他配置 | |||
Config.Setting = require("luaScript.Config.Setting") | |||
-- 子游戏配置信息 | |||
Config.SubGameConfigs = {} | |||
for _, gameId in pairs(GAME_IDS) do | |||
local filePath = string.format("luaScript/Config/SubGame/GameConfig_%03d", gameId) | |||
if isLuaFuleExist(filePath) then | |||
local strFileName = string.format("luaScript.Config.SubGame.GameConfig_%03d", gameId) | |||
local config = require(strFileName) | |||
Config.SubGameConfigs[gameId] = config | |||
end | |||
end | |||
local DefaultModuleConfig = require("luaScript.Config.DefaultModuleConfig") | |||
--当前项目的配置(没有写默认用core的) | |||
local moduleConfig = nil | |||
if cc.FileUtils:getInstance():isFileExist("luaScript/Config/ModuleConfig.luac") or | |||
cc.FileUtils:getInstance():isFileExist("luaScript/Config/ModuleConfig.lua") then | |||
moduleConfig = require("luaScript.Config.ModuleConfig") | |||
end | |||
for k, v in pairs(moduleConfig or {}) do | |||
DefaultModuleConfig[k] = v | |||
end | |||
Config.ModuleConfig = DefaultModuleConfig; | |||
return Config; |
@@ -0,0 +1,49 @@ | |||
-- --------------------- | |||
-- 大厅功能模块开关配置 | |||
-- 该文件只是默认配置,需要修改其中个别配置,请在平台Config目录下新增ModuleConfig.lua | |||
-- 并按下面格式,返回指定的开关配置即可,无需全部重写 | |||
-- --------------------- | |||
local ModuleConfig = {} | |||
-- 是否支持红包券功能 | |||
ModuleConfig.IsSupportHongBaoKa = true | |||
-- 是否支持金币场功能 | |||
ModuleConfig.IsSupportCoin = true | |||
-- 是否支持合伙人功能 | |||
ModuleConfig.IsSupportHeHuoRen = true | |||
-- 是否支持邀请拉新功能 | |||
ModuleConfig.IsSupportInviteNewFriend = true | |||
-- 是否支持金币场免费金币功能 | |||
ModuleConfig.IsSupportCoinFreeCoin = false | |||
-- 大厅红点管理 | |||
ModuleConfig.IsSupportRedPoint = false | |||
-- 是否支持比赛场功能 | |||
ModuleConfig.IsSupportMatch = false | |||
-- 是否支持道具商城显示 | |||
ModuleConfig.IsSupportPropShop = false | |||
-- 是否支持排位赛功能 | |||
ModuleConfig.IsSupportDaLianMeng = false | |||
-- 是否支持网页战绩 | |||
ModuleConfig.IsSupportZhanJiUrl = true | |||
-- 是否支持官方活动 | |||
ModuleConfig.IsSupportOfficeActivity = true | |||
-- 是否支持地区选择 | |||
ModuleConfig.IsSupportAddressSelector = false | |||
ModuleConfig.IsSupportMatchTuoGuan = false | |||
--是否支持悠闲豆 | |||
ModuleConfig.IsSupportYouXianBean = false | |||
---------------俱乐部--------------- | |||
-- 是否支持俱乐部桌子列表分页功能 | |||
ModuleConfig.IsSupportGetClubTableListWithPage = false | |||
--是否支持排名赛 | |||
ModuleConfig.IsSupportRankMatch = true | |||
--是否支持合盟 | |||
ModuleConfig.IsSupportUnion = false | |||
--是否支持普通场排行榜/上报排名 | |||
ModuleConfig.IsSupportNormalRank = false | |||
--是否支持三级合伙人(默认不支持,暂对重庆开启) | |||
ModuleConfig.IsSupportThirdCopartner = false | |||
return ModuleConfig |
@@ -0,0 +1,28 @@ | |||
-- ¶à΢ÐŲÎÊý | |||
local config = { | |||
--[[ | |||
{ | |||
appId = "wx9e0654fad4ac27c4", | |||
appKey = "e820dfdd8b295e34d9ad79448d2ee2a4", | |||
}, | |||
{ | |||
appId = "wxbe12c718df257ff0", | |||
appKey = "1c5445ba52c397802194420962c2a30c", | |||
}, | |||
{ | |||
appId = "wxa8a89f416bc9f968", | |||
appKey = "cc43ae995b7971e4223096e07bc7cd77", | |||
}, | |||
{ | |||
appId = "wxcc01cfef43acd4ee", | |||
appKey = "976fbe75dc0eae0a7c4f1ebdb07ef54e", | |||
}, | |||
{ | |||
appId = "wx1dafec29f245318b", | |||
appKey = "8d3baaf38f6ace6d8da32d2cd8ebad8e", | |||
} | |||
--]] | |||
}; | |||
return config; |
@@ -0,0 +1,15 @@ | |||
local setting = { | |||
-- 资源版本号 | |||
ResourceVersion = "1000"; | |||
-- IpServer | |||
IpServer = "http://shibaip.dingdingqipai.com/iplist.php", | |||
-- 官方下载地址 | |||
-- app.config.Setting.appDownloadUrl | |||
appDownloadUrl = "http://m.dingdingqipai.com/cnzp.php", | |||
}; | |||
return setting; |
@@ -0,0 +1,61 @@ | |||
cc.Point = cc.Point or {} | |||
cc.Color4F = cc.Color4F or {} | |||
cc.Color3B = cc.Color3B or {} | |||
cc.Size = cc.Size or {} | |||
cc.Rect = cc.Rect or {} | |||
cc.Margin = cc.Margin or {} | |||
function cc.Point:toString() | |||
return tostring(self.x) .. " " .. tostring(self.y); | |||
end | |||
function cc.Point.fromString(str) | |||
local arr = string.split(str , " "); | |||
return cc.p(arr[1] , arr[2]); | |||
end | |||
function cc.Color4F:toString() | |||
return tostring(self.r) .. " " .. tostring(self.g) .. " " .. tostring(self.b) .. " " .. tostring(self.a); | |||
end | |||
function cc.Color4F.fromString(str) | |||
local arr = string.split(str , " "); | |||
return cc.c4f(arr[1] , arr[2] , arr[3] , arr[4]) | |||
end | |||
function cc.Color3B:toString() | |||
return tostring(self.r) .. " " .. tostring(self.g) .. " " .. tostring(self.b); | |||
end | |||
function cc.Color3B.fromString(str) | |||
local arr = string.split(str , " "); | |||
return cc.c3b(arr[1] , arr[2] , arr[3]) | |||
end | |||
function cc.Size:toString() | |||
return tostring(self.width) .. " " .. tostring(self.height); | |||
end | |||
function cc.Size.fromString(str) | |||
local arr = string.split(str , " "); | |||
return cc.size(arr[1] , arr[2]); | |||
end | |||
function cc.Rect:toString() | |||
return tostring(self.x) .. " " .. tostring(self.y) .. " " ..tostring(self.width) .. " " .. tostring(self.height); | |||
end | |||
function cc.Rect.fromString(str) | |||
local arr = string.split(str , " "); | |||
return cc.rect(arr[1] , arr[2] , arr[3] , arr[4]); | |||
end | |||
function cc.margin(l,t,r,b) | |||
return {left = l;top = t;right = r;bottom = b}; | |||
end | |||
function cc.Margin:toString() | |||
return tostring(self.left) .. " " .. tostring(self.top) .. " " .. tostring(self.right) .. " " .. tostring(self.bottom); | |||
end | |||
function cc.Margin.fromString(str) | |||
local arr = string.split(str , " "); | |||
return cc.margin(arr[1] , arr[2] , arr[3] , arr[4]); | |||
end | |||
require("luaScript.Tools.ObjectBinder") |
@@ -0,0 +1,70 @@ | |||
-- 扩展io一些功能 | |||
function io.exists(path) | |||
local file = io.open(path, "r") | |||
if file then | |||
io.close(file) | |||
return true | |||
end | |||
return false | |||
end | |||
function io.readfile(path) | |||
local file = io.open(path, "r") | |||
if file then | |||
local content = file:read("*a") | |||
io.close(file) | |||
return content | |||
end | |||
return nil | |||
end | |||
function io.writefile(path, content, mode) | |||
mode = mode or "w+b" | |||
local file = io.open(path, mode) | |||
if file then | |||
if file:write(content) == nil then return false end | |||
io.close(file) | |||
return true | |||
else | |||
return false | |||
end | |||
end | |||
function io.pathinfo(path) | |||
local pos = string.len(path) | |||
local extpos = pos + 1 | |||
while pos > 0 do | |||
local b = string.byte(path, pos) | |||
if b == 46 then -- 46 = char "." | |||
extpos = pos | |||
elseif b == 47 then -- 47 = char "/" | |||
break | |||
end | |||
pos = pos - 1 | |||
end | |||
local dirname = string.sub(path, 1, pos) | |||
local filename = string.sub(path, pos + 1) | |||
extpos = extpos - pos | |||
local basename = string.sub(filename, 1, extpos - 1) | |||
local extname = string.sub(filename, extpos) | |||
return { | |||
dirname = dirname, | |||
filename = filename, | |||
basename = basename, | |||
extname = extname | |||
} | |||
end | |||
function io.filesize(path) | |||
local size = false | |||
local file = io.open(path, "r") | |||
if file then | |||
local current = file:seek() | |||
size = file:seek("end") | |||
file:seek("set", current) | |||
io.close(file) | |||
end | |||
return size | |||
end |
@@ -0,0 +1,64 @@ | |||
Math = math | |||
Math.E = 2.718281828459045 -- 自然数 | |||
Math.LN2 = 0.6931471805599453 -- 2的自然对数 | |||
Math.LN10 = 2.302585092994046 -- 10的自然对数 | |||
Math.LOG2E = 1.4426950408889634 -- log 2 为底的自然数 | |||
Math.LOG10E = 0.4342944819032518 -- log 10 为底的自然数 | |||
Math.PI = 3.141592653589793 -- π | |||
Math.HALF_PI = 1.57079632679489661923 -- 1/2 π | |||
Math.SQRT1_2 = 0.7071067811865476 -- 1/2的平方根 | |||
Math.SQRT2 = 1.4142135623730951 -- 2的平方根 | |||
-- p, q is on the same of line 1 | |||
function Math.isSame(line1, p, q) | |||
local dx = line1.endPoint.x - line1.startPoint.x; | |||
local dy = line1.endPoint.y - line1.startPoint.y; | |||
local dx1 = p.x - line1.startPoint.x; | |||
local dy1 = p.y - line1.startPoint.y; | |||
local dx2 = q.x - line1.endPoint.x; | |||
local dy2 = q.y - line1.endPoint.y; | |||
return (dx*dy1-dy*dx1)*(dx*dy2-dy*dx2) > 0; | |||
end | |||
-- 2 line segments (s1, s2) are intersect? | |||
function Math.isIntersect(line1, line2) | |||
local b1 = Math.isSame(line1, line2.startPoint, line2.endPoint); | |||
local b2 = Math.isSame(line2, line1.startPoint, line1.endPoint); | |||
return not b1 and not b2; | |||
end | |||
function Math.round(num) | |||
return math.floor(num + 0.5) | |||
end | |||
function Math.angle2Radian(angle) | |||
return angle*math.pi/180 | |||
end | |||
function Math.radian2Angle(radian) | |||
return radian/math.pi*180 | |||
end | |||
-- 从球面坐标系(半径,经度,纬度)转换到笛卡尔坐标系(XYZ) | |||
-- 半径,离原点的距离,一般是一个正数 | |||
-- 经度,0~2PI,0代表正前方,PI代表正后方 | |||
-- 纬度,HALF_PI代表水平位置,+PI代表底,0代表顶 | |||
function Math.SphericalToCartesian(sphericalPos) | |||
return { | |||
x = sphericalPos.x * math.cos(sphericalPos.y) * math.sin(sphericalPos.z); | |||
z = sphericalPos.x * math.sin(sphericalPos.y) * math.sin(sphericalPos.z); | |||
y = sphericalPos.x * math.cos(sphericalPos.z); | |||
} | |||
end | |||
-- 从笛卡尔坐标系(XYZ)转换到球面坐标系(半径,经度,纬度) | |||
function Math.CartesianToSpherical(cartesianPos) | |||
local r = math.sqrt(cartesianPos.x * cartesianPos.x + cartesianPos.y * cartesianPos.y + cartesianPos.z * cartesianPos.z) | |||
local lon = math.atan2(cartesianPos.z, cartesianPos.x) | |||
local lat = math.acos(cartesianPos.y / r) | |||
return cc.vec3(r, lon, lat) | |||
end |
@@ -0,0 +1,144 @@ | |||
-- 扩展string的一些功能 | |||
function string.htmlspecialchars(input) | |||
for k, v in pairs(string._htmlspecialchars_set) do | |||
input = string.gsub(input, k, v) | |||
end | |||
return input | |||
end | |||
string._htmlspecialchars_set = {} | |||
string._htmlspecialchars_set["&"] = "&" | |||
string._htmlspecialchars_set["\""] = """ | |||
string._htmlspecialchars_set["'"] = "'" | |||
string._htmlspecialchars_set["<"] = "<" | |||
string._htmlspecialchars_set[">"] = ">" | |||
function string.htmlspecialcharsDecode(input) | |||
for k, v in pairs(string._htmlspecialchars_set) do | |||
input = string.gsub(input, v, k) | |||
end | |||
return input | |||
end | |||
function string.nl2br(input) | |||
return string.gsub(input, "\n", "<br />") | |||
end | |||
function string.text2html(input) | |||
input = string.gsub(input, "\t", " ") | |||
input = string.htmlspecialchars(input) | |||
input = string.gsub(input, " ", " ") | |||
input = string.nl2br(input) | |||
return input | |||
end | |||
function string.split(str, delimiter) | |||
str = tostring(str) | |||
delimiter = tostring(delimiter) | |||
if (delimiter=='') then return false end | |||
local pos,arr = 0, {} | |||
-- for each divider found | |||
for st,sp in function() return string.find(str, delimiter, pos, true) end do | |||
table.insert(arr, string.sub(str, pos, st - 1)) | |||
pos = sp + 1 | |||
end | |||
table.insert(arr, string.sub(str, pos)) | |||
return arr | |||
end | |||
function string.ltrim(str) | |||
return string.gsub(str, "^[ \t\n\r]+", "") | |||
end | |||
function string.rtrim(str) | |||
return string.gsub(str, "[ \t\n\r]+$", "") | |||
end | |||
function string.trim(str) | |||
str = string.gsub(str, "^[ \t\n\r]+", "") | |||
return string.gsub(str, "[ \t\n\r]+$", "") | |||
end | |||
function string.ucfirst(str) | |||
return string.upper(string.sub(str, 1, 1)) .. string.sub(str, 2) | |||
end | |||
local function urlencodeChar(char) | |||
return "%" .. string.format("%02X", string.byte(char)) | |||
end | |||
function string.urlencode(str) | |||
-- convert line endings | |||
str = string.gsub(tostring(str), "\n", "\r\n") | |||
-- escape all characters but alphanumeric, '.' and '-' | |||
str = string.gsub(str, "([^%w%.%- ])", urlencodeChar) | |||
-- convert spaces to "+" symbols | |||
return string.gsub(str, " ", "+") | |||
end | |||
function string.urldecode(str) | |||
str = string.gsub (str, "+", " ") | |||
str = string.gsub (str, "%%(%x%x)", function(h) return string.char(tonum(h,16)) end) | |||
str = string.gsub (str, "\r\n", "\n") | |||
return str | |||
end | |||
function string.utf8len(str) | |||
local len = #str | |||
local left = len | |||
local cnt = 0 | |||
local arr = {0, 0xc0, 0xe0, 0xf0, 0xf8, 0xfc} | |||
while left ~= 0 do | |||
local tmp = string.byte(str, -left) | |||
local i = #arr | |||
while arr[i] do | |||
if tmp >= arr[i] then | |||
left = left - i | |||
break | |||
end | |||
i = i - 1 | |||
end | |||
cnt = cnt + 1 | |||
end | |||
return cnt | |||
end | |||
function string.formatNumberThousands(num) | |||
local formatted = tostring(tonum(num)) | |||
local k | |||
while true do | |||
formatted, k = string.gsub(formatted, "^(-?%d+)(%d%d%d)", '%1,%2') | |||
if k == 0 then break end | |||
end | |||
return formatted | |||
end | |||
-- 把文件名分割成目录名和文件名 | |||
-- 返回pathName , baseName , ext | |||
function string.splitFilename(filename) | |||
local reverseFile = string.reverse(filename); | |||
local pos = string.find(reverseFile , "[/\\]"); | |||
local dotPos = string.find(reverseFile , "%."); | |||
return string.sub(filename , 1 , #filename - pos) , string.sub(filename , #filename - pos + 2) , string.sub(filename , #filename - dotPos + 2); | |||
end | |||
-- 是否是某字符串结束 | |||
function string.endsWith(filename , ends) | |||
return string.sub(filename , - #ends) == ends; | |||
end | |||
-- 是否是以字符串开头 | |||
function string.startsWith(filename , starts) | |||
return string.sub(filename , 1 , #starts) == starts; | |||
end | |||
-- 转换到lua源码格式的字符串 | |||
function string.toLuaString(str) | |||
local buffer = {"\""}; | |||
for i = 1 , string.len(str) do | |||
table.insert(buffer , [[\]] .. string.byte(str , i)); | |||
end | |||
table.insert(buffer , "\""); | |||
return table.concat(buffer); | |||
end; |
@@ -0,0 +1,354 @@ | |||
-- 这里是扩充table的一些功能 | |||
function table.nums(t) | |||
local count = 0 | |||
for k, v in pairs(t) do | |||
count = count + 1 | |||
end | |||
return count | |||
end | |||
function table.empty(t) | |||
for k, v in pairs(t) do | |||
return false; | |||
end | |||
return true; | |||
end | |||
function table.keys(t) | |||
local keys = {} | |||
for k, v in pairs(t) do | |||
keys[#keys + 1] = k | |||
end | |||
return keys | |||
end | |||
function table.values(t) | |||
local values = {} | |||
for k, v in pairs(t) do | |||
values[#values + 1] = v | |||
end | |||
return values | |||
end | |||
function table.merge(dest, src) | |||
for k, v in pairs(src) do | |||
dest[k] = v | |||
end | |||
end | |||
function table.mergeAll(src , dest) | |||
for k, v in pairs(src) do | |||
if type(v) == "table" then | |||
if not dest[k] then | |||
dest[k] = v; | |||
else | |||
table.mergeAll(v , dest[k]); | |||
end | |||
else | |||
dest[k] = v | |||
end | |||
end | |||
end | |||
function table.imerge(dest, src) | |||
for k, v in ipairs(src) do | |||
table.insert(dest , v) | |||
end | |||
end | |||
--[[-- | |||
insert list. | |||
**Usage:** | |||
local dest = {1, 2, 3} | |||
local src = {4, 5, 6} | |||
table.insertTo(dest, src) | |||
-- dest = {1, 2, 3, 4, 5, 6} | |||
dest = {1, 2, 3} | |||
table.insertTo(dest, src, 5) | |||
-- dest = {1, 2, 3, nil, 4, 5, 6} | |||
@param table dest | |||
@param table src | |||
@param table begin insert position for dest | |||
]] | |||
function table.insertTo(dest, src, begin) | |||
begin = tonumber(begin) | |||
if begin == nil then | |||
begin = #dest + 1 | |||
end | |||
local len = #src | |||
for i = 0, len - 1 do | |||
dest[i + begin] = src[i + 1] | |||
end | |||
end | |||
--[[ | |||
search target index at list. | |||
@param table list | |||
@param * target | |||
@param int from idx, default 1 | |||
@param bool useNaxN, the len use table.maxn(true) or #(false) default:false | |||
@param return index of target at list, if not return -1 | |||
]] | |||
function table.indexOf(list, target, from, useMaxN) | |||
local len = (useMaxN and #list) or table.maxn(list) | |||
if from == nil then | |||
from = 1 | |||
end | |||
for i = from, len do | |||
if list[i] == target then | |||
return i | |||
end | |||
end | |||
return -1 | |||
end | |||
function table.indexOfKey(list, key, value, from, useMaxN) | |||
local len = (useMaxN and #list) or table.maxn(list) | |||
if from == nil then | |||
from = 1 | |||
end | |||
local item = nil | |||
for i = from, len do | |||
item = list[i] | |||
if item ~= nil and item[key] == value then | |||
return i | |||
end | |||
end | |||
return -1 | |||
end | |||
function table.removeItem(t, item, removeAll) | |||
for i = #t, 1, -1 do | |||
if t[i] == item then | |||
table.remove(t, i) | |||
if not removeAll then break end | |||
end | |||
end | |||
end | |||
function table.map(t, fun) | |||
for k,v in pairs(t) do | |||
t[k] = fun(v, k) | |||
end | |||
end | |||
function table.walk(t, fun) | |||
for k,v in pairs(t) do | |||
fun(v, k) | |||
end | |||
end | |||
function table.filter(t, fun) | |||
for k,v in pairs(t) do | |||
if not fun(v, k) then | |||
t[k] = nil | |||
end | |||
end | |||
end | |||
function table.find(t, item) | |||
return table.keyOfItem(t, item) ~= nil | |||
end | |||
function table.unique(t) | |||
local r = {} | |||
local n = {} | |||
for i = #t, 1, -1 do | |||
local v = t[i] | |||
if not r[v] then | |||
r[v] = true | |||
n[#n + 1] = v | |||
end | |||
end | |||
return n | |||
end | |||
function table.keyOfItem(t, item) | |||
for k,v in pairs(t) do | |||
if v == item then return k end | |||
end | |||
return nil | |||
end | |||
function table.valueOfItem(t, item) | |||
for k,v in pairs(t) do | |||
if v == item then return v end | |||
end | |||
return nil | |||
end | |||
-- 把表转换成类似这种格式的字符串{a='b';};,字符串用二进制格式表示"\01\02"之类 | |||
function table.toString(t) | |||
local tableString = vardump(t , ""); | |||
return tableString:sub(8); | |||
end | |||
-- 把表转换成类似这种格式的字符串{a='b';};,字符串用可见文本形式表示 | |||
function table.tostring(t) | |||
if not t then | |||
return "nil" | |||
end | |||
local oldFunc = string.toLuaString; | |||
string.toLuaString = tostring; | |||
local tableString = vardump(t , ""); | |||
string.toLuaString = oldFunc | |||
return tableString:sub(8); | |||
end | |||
-- 把表转换成类似这种格式的字符串return {a='b';}; | |||
function table.saveString(t) | |||
return "return " .. table.toString(t); | |||
end | |||
-- 从字符串中载入一个表 | |||
function table.loadString(tableString) | |||
local data , err = loadstring(tableString); | |||
if data == nil then | |||
print("table.loadString()", tostring(tableString)) | |||
--error(err); | |||
uploadLogs(GAME_ERROR_TYPE.TABLELOADSTRING) | |||
return nil | |||
else | |||
return data(); | |||
end | |||
end | |||
-- 将一个table数据保存到本地文件 | |||
function table.saveToLocFile(t, filename) | |||
if not t or not filename then | |||
return | |||
end | |||
local tableString = table.saveString(t) | |||
saveStringToFile(tableString, filename) | |||
end | |||
-- 从本地文件读取一个table数据 | |||
function table.loadFromLocFile(filename) | |||
if not filename then | |||
return | |||
end | |||
local tableString = loadStringFromFile(filename) | |||
if not tableString then | |||
return nil | |||
end | |||
return table.loadString(tableString) | |||
end | |||
-- 把表保存到文件中 | |||
function table.saveFile(t , filename) | |||
local file , err = io.open(filename , "w"); | |||
if file == nil then | |||
error(err); | |||
return; | |||
end | |||
file:write("return ") | |||
file:write(table.toString(t)); | |||
file:close(); | |||
end | |||
if EditorMode then | |||
-- 从文件中载入一个表 | |||
function table.loadFile(filename) | |||
local n,r = loadLuaFile(filename); | |||
if n == nil then | |||
--error("载入文件" .. tostring(filename) .. "时出错" .. r); | |||
return nil | |||
end | |||
return n(); | |||
end | |||
else | |||
-- 从文件中载入一个表 | |||
local tableCache = {}; | |||
function table.loadFile(filename) | |||
local cache = tableCache[filename]; | |||
if cache then | |||
return cache; | |||
end | |||
print("table.loadFile:" .. filename); | |||
TimeSpan:enterSpan("table.loadFile:" .. filename); | |||
local n,r = loadLuaFile(filename); | |||
if n == nil then | |||
--error("载入文件" .. tostring(filename) .. "时出错" .. r); | |||
return nil | |||
end | |||
TimeSpan:enterSpan("runTable"); | |||
cache = n(); | |||
TimeSpan:leaveSpan(); | |||
tableCache[filename] = cache; | |||
TimeSpan:leaveSpan(); | |||
return cache; | |||
end | |||
end | |||
-- 兼容版本 | |||
if not table.getn then | |||
function table.getn(t) | |||
return #t; | |||
end | |||
end | |||
local rawpairs = pairs | |||
------------------------------------------- | |||
-- 可以按指定顺序遍历的map迭代器 | |||
-- @param tbl 要迭代的表 | |||
-- @param func 比较函数 | |||
-- @example | |||
-- for k,v in pairs(tbl,defaultComp) do print(k,v) end | |||
function table.sortPairs(tbl, func) | |||
if func == nil then | |||
return rawpairs(tbl) | |||
end | |||
-- 为tbl创建一个对key排序的数组 | |||
-- 自己实现插入排序,table.sort遇到nil时会失效 | |||
local ary = {} | |||
for key in rawpairs(tbl) do | |||
ary[#ary+1] = key | |||
end | |||
table.sort(ary,func); | |||
-- 定义并返回迭代器 | |||
local i = 0 | |||
local iter = function () | |||
i = i + 1 | |||
if ary[i] == nil then | |||
return nil | |||
else | |||
return ary[i], tbl[ary[i]] | |||
end | |||
end | |||
return iter | |||
end | |||
-------------------------------- | |||
-- 通用比较器(Comparator) | |||
-- @return 对比结果 | |||
function table.defaultSort( op1, op2 ) | |||
local type1, type2 = type(op1), type(op2) | |||
local num1, num2 = tonumber(op1), tonumber(op2) | |||
if ( num1 ~= nil) and (num2 ~= nil) then | |||
return num1 < num2 | |||
elseif type1 ~= type2 then | |||
return type1 < type2 | |||
elseif type1 == "string" then | |||
return op1 < op2 | |||
elseif type1 == "boolean" then | |||
return op1 | |||
-- 以上处理: number, string, boolean | |||
else -- 处理剩下的: function, table, thread, userdata | |||
return tostring(op1) < tostring(op2) -- tostring后比较字符串 | |||
end | |||
end |
@@ -0,0 +1,53 @@ | |||
-- 所有聊天相关的配置 | |||
local ChatDef = {} | |||
-- 聊天类型 | |||
-- //类型 1: 表情 2: 语音 3:聊天 | |||
ChatDef.MessageType = | |||
{ | |||
Face = 1, -- 表情 | |||
Voice = 2, -- 录音 | |||
Message = 3, -- 快捷语 | |||
Prop = 4, -- 道具 | |||
Chat = 5, -- 聊天 服务器类型还是3 | |||
} | |||
ChatDef.TimeInterval = | |||
{ | |||
[ChatDef.MessageType.Face] = 3, -- 表情 | |||
[ChatDef.MessageType.Voice] = 5, -- 录音 | |||
[ChatDef.MessageType.Message] = 5, -- 快捷语 | |||
[ChatDef.MessageType.Prop] = 10, -- 道具 | |||
[ChatDef.MessageType.Chat] = 3, -- 聊天 | |||
} | |||
-- 录音动画/快捷语的方向 | |||
ChatDef.Direction = | |||
{ | |||
Left = 1, -- 头像在左,动画在右 | |||
Right = 2, -- 头像在右,动画在左 | |||
} | |||
-- 表情相关的文件 | |||
ChatDef.FaceBtnFile = "res/ui/zy_tongyong/zy_face/Face.plist" | |||
ChatDef.FaceConfigs = | |||
{ | |||
[1] = {oggLocal="res/sound/%s/common_%s_emoj_1.ogg",oggStandard="res/sound/%s/common_%s_emoj_1.ogg", btnPng = "face_j_1001.png", aniFile = "res/ui/zy_tongyong/zy_face/face1_anims_i6p.plist", aniString = "face1_%d.png", frameNum = 10}, | |||
[2] = {oggLocal="res/sound/%s/common_%s_emoj_2.ogg",oggStandard="res/sound/%s/common_%s_emoj_2.ogg", btnPng = "face_j_1002.png", aniFile = "res/ui/zy_tongyong/zy_face/face2_anims_i6p.plist", aniString = "face2_%d.png", frameNum = 10}, | |||
[3] = {oggLocal="res/sound/%s/common_%s_emoj_3.ogg",oggStandard="res/sound/%s/common_%s_emoj_3.ogg", btnPng = "face_j_1003.png", aniFile = "res/ui/zy_tongyong/zy_face/face3_anims_i6p.plist", aniString = "face3_%d.png", frameNum = 10}, | |||
[4] = {oggLocal="res/sound/%s/common_%s_emoj_4.ogg",oggStandard="res/sound/%s/common_%s_emoj_4.ogg", btnPng = "face_j_1004.png", aniFile = "res/ui/zy_tongyong/zy_face/face4_anims_i6p.plist", aniString = "face4_%d.png", frameNum = 10}, | |||
[5] = {oggLocal="res/sound/%s/common_%s_emoj_5.ogg",oggStandard="res/sound/%s/common_%s_emoj_5.ogg", btnPng = "face_j_1005.png", aniFile = "res/ui/zy_tongyong/zy_face/face5_anims_i6p.plist", aniString = "face5_%d.png", frameNum = 10}, | |||
[6] = {oggLocal="res/sound/%s/common_%s_emoj_6.ogg",oggStandard="res/sound/%s/common_%s_emoj_6.ogg", btnPng = "face_j_1006.png", aniFile = "res/ui/zy_tongyong/zy_face/face6_anims_i6p.plist", aniString = "face6_%d.png", frameNum = 10}, | |||
[7] = {oggLocal="res/sound/%s/common_%s_emoj_7.ogg",oggStandard="res/sound/%s/common_%s_emoj_7.ogg", btnPng = "face_j_1007.png", aniFile = "res/ui/zy_tongyong/zy_face/face7_anims_i6p.plist", aniString = "face7_%d.png", frameNum = 10}, | |||
[8] = {oggLocal="res/sound/%s/common_%s_emoj_8.ogg",oggStandard="res/sound/%s/common_%s_emoj_8.ogg", btnPng = "face_j_1008.png", aniFile = "res/ui/zy_tongyong/zy_face/face8_anims_i6p.plist", aniString = "face8_%d.png", frameNum = 10}, | |||
[9] = {oggLocal="res/sound/%s/common_%s_emoj_9.ogg",oggStandard="res/sound/%s/common_%s_emoj_9.ogg", btnPng = "face_j_1009.png", aniFile = "res/ui/zy_tongyong/zy_face/face9_anims_i6p.plist", aniString = "face9_%d.png", frameNum = 10}, | |||
[10] = {oggLocal="res/sound/%s/common_%s_emoj_10.ogg",oggStandard="res/sound/%s/common_%s_emoj_10.ogg", btnPng = "face_j_1010.png", aniFile = "res/ui/zy_tongyong/zy_face/face10_anims_i6p.plist", aniString = "face10_%d.png", frameNum = 10}, | |||
[11] = {oggLocal="res/sound/%s/common_%s_emoj_11.ogg",oggStandard="res/sound/%s/common_%s_emoj_11.ogg", btnPng = "face_j_1011.png", aniFile = "res/ui/zy_tongyong/zy_face/face11_anims_i6p.plist", aniString = "face11_%d.png", frameNum = 10}, | |||
[12] = {oggLocal="res/sound/%s/common_%s_emoj_12.ogg",oggStandard="res/sound/%s/common_%s_emoj_12.ogg", btnPng = "face_j_1012.png", aniFile = "res/ui/zy_tongyong/zy_face/face12_anims_i6p.plist", aniString = "face12_%d.png", frameNum = 10}, | |||
} | |||
return ChatDef | |||
@@ -0,0 +1,214 @@ | |||
-- 游戏逻辑相关的全局函数 | |||
local BGMusicPlayer = require("luaScript.Tools.MusicPlayer")(); | |||
--背景音乐的通用接口 | |||
function playBGMusic(key, musicFileName) | |||
playConfig = | |||
{ | |||
-- 唯一的名字,如果正在播的是这个名字,就忽略 | |||
Name = key; | |||
-- 需要播放的声音列表,会从中随机一首 | |||
Files = {musicFileName}; | |||
-- 播放几率,[0-100] | |||
Rate = 100; | |||
-- 每批的间隔 | |||
IntervalMin = 0; | |||
IntervalMax = 0; | |||
-- 一批播放多少次 | |||
PlayCountMin = 1; | |||
PlayCountMax = 1; | |||
-- 循环多少批,0表示无限循环 | |||
LoopCount = 0; | |||
-- 延迟几秒才开始播放 | |||
DelayTime = 0; | |||
-- 声音停止时的淡出时间(秒) | |||
FadeOut = 0; | |||
} | |||
BGMusicPlayer.playBGMusic(playConfig); | |||
end | |||
function stopBGMusic() | |||
return BGMusicPlayer.stopBGMusic(); | |||
end | |||
--音效的通用接口 | |||
function playVoice(voiceFileName) | |||
local soundVolume = app.systemSetting.info.soundVolume | |||
local sound = cc.AudioController:getInstance():playSound(voiceFileName, false); | |||
if sound then | |||
sound:setGain(soundVolume) | |||
end | |||
return sound | |||
end | |||
function stopVoice(sound) | |||
if sound then | |||
cc.AudioController:getInstance():stopSound(sound) | |||
end | |||
end | |||
-------------------- MUSIC --------------------------- | |||
function playMusicLogin() | |||
playBGMusic("BG_Login", "res/sound/bg_login.ogg") | |||
end | |||
function playMusicHall() | |||
playBGMusic("BG_Hall", "res/sound/bg_hall.ogg") | |||
end | |||
function playMusicRoom(index) | |||
if index == 0 then | |||
playBGMusic("BG_Room", "res/sound/room/bgmusic.ogg") | |||
else | |||
playBGMusic("BG_Room", "res/sound/room/bgm.ogg") | |||
end | |||
end | |||
-------------------- SOUND --------------------------- | |||
-- 播放发牌的音效 | |||
function playVoiceGiveCard() | |||
playVoice("res/sound/g_flop.ogg") | |||
end | |||
--播放行为操作音效 | |||
function playVoiceNiuX(NiuX,nUserId) | |||
if not NiuX then | |||
return | |||
end | |||
local memberInfo = app.room.roomInfo.memberList[nUserId] | |||
if memberInfo then | |||
local userInfo = json.decode(memberInfo.userInfo) | |||
if not userInfo then | |||
return | |||
end | |||
--男1女2,默认是男生 | |||
local sexNum = userInfo.sex or 1 | |||
--因为女生用的资源是0 | |||
if tonumber(sexNum) == 2 then | |||
sexNum = 0 | |||
end | |||
local sex = tostring(sexNum) | |||
local voiceName = "" | |||
if tonumber(sexNum) == 1 then | |||
voiceName = string.format("res/sound/room/gg_ogg/f0_nn%d.ogg", NiuX) | |||
else | |||
--女生或者人妖(可能性别保密)进这里播放 | |||
voiceName = string.format("res/sound/room/mm_ogg/f1_nn%d.ogg", NiuX) | |||
end | |||
playVoice(voiceName) | |||
end | |||
end | |||
--播放不抢庄操作音效 | |||
function playVoiceBuQiang(nUserId) | |||
local memberInfo = app.room.roomInfo.memberList[nUserId] | |||
if memberInfo then | |||
local userInfo = json.decode(memberInfo.userInfo) | |||
if not userInfo then | |||
return | |||
end | |||
--男1女2,默认是男生 | |||
local sexNum = userInfo.sex or 1 | |||
--因为女生用的资源是0 | |||
if tonumber(sexNum) == 2 then | |||
sexNum = 0 | |||
end | |||
local sex = tostring(sexNum) | |||
local voiceName = "" | |||
if tonumber(sexNum) == 1 then | |||
voiceName = "res/sound/room/buqiang_0.ogg" | |||
else | |||
--女生或者其他 | |||
voiceName = "res/sound/room/buqiang_1.ogg" | |||
end | |||
playVoice(voiceName) | |||
end | |||
end | |||
--播放抢庄操作音效 | |||
function playVoiceQiang(nUserId) | |||
local memberInfo = app.room.roomInfo.memberList[nUserId] | |||
if memberInfo then | |||
local userInfo = json.decode(memberInfo.userInfo) | |||
if not userInfo then | |||
return | |||
end | |||
--男1女2,默认是男生 | |||
local sexNum = userInfo.sex or 1 | |||
--因为女生用的资源是0 | |||
if tonumber(sexNum) == 2 then | |||
sexNum = 0 | |||
end | |||
local sex = tostring(sexNum) | |||
local voiceName = "" | |||
if tonumber(sexNum) == 1 then | |||
voiceName = "res/sound/room/qiangzhuang_0.ogg" | |||
else | |||
--女生或者其他 | |||
voiceName = "res/sound/room/qiangzhuang_1.ogg" | |||
end | |||
playVoice(voiceName) | |||
end | |||
end | |||
--播放按钮点击音效 | |||
function playBtnEffect() | |||
playVoice("res/sound/click.ogg") | |||
end | |||
--播放按钮关闭音效 | |||
function playBtnCloseEffect() | |||
playVoice("res/sound/effect_return.ogg") | |||
end | |||
--播放标签页点击音效 | |||
function playBtnTagEffect() | |||
playVoice("res/sound/effect_biaoqian.ogg") | |||
end | |||
--播放金币飞 | |||
function playOneCoinEffect() | |||
playVoice("res/sound/room/coin_big.ogg") | |||
end | |||
--播放下注 | |||
function playCoinsEffect() | |||
playVoice("res/sound/room/chips_to_table.ogg") | |||
end | |||
--播放下注 | |||
function playCoinsFlyEffect() | |||
playVoice("res/sound/room/coins_fly.ogg") | |||
end | |||
--播放抢庄家音效 | |||
function playVoiceRootBanker() | |||
playVoice("res/sound/room/random_banker_lianxu.ogg") | |||
end | |||
--播放成功失败音效 | |||
function playEndVoice(cardFileName) | |||
local voiceName = string.format("res/sound/room/%s.ogg", cardFileName) | |||
playVoice(voiceName) | |||
end | |||
--播放闹钟 | |||
function playClockVoice() | |||
local voiceName = "res/sound/time_over.ogg" | |||
playVoice(voiceName) | |||
end |
@@ -0,0 +1,421 @@ | |||
-- 全局的游戏数据类型定义 | |||
-- UI显示顺序的Order | |||
UIZOrder = | |||
{ | |||
-- showTooltip | |||
TipsOrder = 20000, | |||
-- 重启或退出对话框 | |||
ExitOrder = 15000, | |||
-- 最上面是网络等待蒙版 | |||
NetWaitOrder = 10000, | |||
-- 系统通知 | |||
SystemNotify = 7000, | |||
-- 横幅 | |||
DropNotify = 6000, | |||
-- 每日签到 | |||
SignOrder = 5500, | |||
-- 其次是新手引导蒙版 | |||
GuideOrder = 5000, | |||
-- 再下面是通用界面淡入淡出蒙版 | |||
FadeOrder= 2000, | |||
-- 充值界面 | |||
Recharge = 1000, | |||
-- 主界面 | |||
MainLayer = -1, | |||
} | |||
-- 表情相关的文件 | |||
Face_Btn_File = "res/ui/zy_tongyong/zy_face/Face.plist" | |||
Face_Def = | |||
{ | |||
[1] = { btnPng = "face_j_1001.png", aniFile = "res/ui/zy_tongyong/zy_face/face1_anims_i6p.plist", aniString = "face1_%d.png", frameNum = 10}, | |||
[2] = { btnPng = "face_j_1002.png", aniFile = "res/ui/zy_tongyong/zy_face/face2_anims_i6p.plist", aniString = "face2_%d.png", frameNum = 10}, | |||
[3] = { btnPng = "face_j_1003.png", aniFile = "res/ui/zy_tongyong/zy_face/face3_anims_i6p.plist", aniString = "face3_%d.png", frameNum = 10}, | |||
[4] = { btnPng = "face_j_1004.png", aniFile = "res/ui/zy_tongyong/zy_face/face4_anims_i6p.plist", aniString = "face4_%d.png", frameNum = 10}, | |||
[5] = { btnPng = "face_j_1005.png", aniFile = "res/ui/zy_tongyong/zy_face/face5_anims_i6p.plist", aniString = "face5_%d.png", frameNum = 10}, | |||
[6] = { btnPng = "face_j_1006.png", aniFile = "res/ui/zy_tongyong/zy_face/face6_anims_i6p.plist", aniString = "face6_%d.png", frameNum = 10}, | |||
[7] = { btnPng = "face_j_1007.png", aniFile = "res/ui/zy_tongyong/zy_face/face7_anims_i6p.plist", aniString = "face7_%d.png", frameNum = 10}, | |||
[8] = { btnPng = "face_j_1008.png", aniFile = "res/ui/zy_tongyong/zy_face/face8_anims_i6p.plist", aniString = "face8_%d.png", frameNum = 10}, | |||
[9] = { btnPng = "face_j_1009.png", aniFile = "res/ui/zy_tongyong/zy_face/face9_anims_i6p.plist", aniString = "face9_%d.png", frameNum = 10}, | |||
[10] = { btnPng = "face_j_1010.png", aniFile = "res/ui/zy_tongyong/zy_face/face10_anims_i6p.plist", aniString = "face10_%d.png", frameNum = 10}, | |||
[11] = { btnPng = "face_j_1011.png", aniFile = "res/ui/zy_tongyong/zy_face/face11_anims_i6p.plist", aniString = "face11_%d.png", frameNum = 10}, | |||
[12] = { btnPng = "face_j_1012.png", aniFile = "res/ui/zy_tongyong/zy_face/face12_anims_i6p.plist", aniString = "face12_%d.png", frameNum = 10}, | |||
} | |||
-- 游戏道具 | |||
Prop_Btn_File = "res/ui/zy_tongyong/zy_prop/zy_prop.plist" | |||
GameProp = | |||
{ | |||
[1] = {icon = "userInfo_prop1.png", image = "res/ui/zy_tongyong/zy_prop/item1/item1_fly-i6p.png", plistFile = "res/ui/zy_tongyong/zy_prop/item1/item1_anims_i6p.plist", frameName = "item1_%d.png", frameNum = 19}, | |||
[2] = {icon = "userInfo_prop2.png", image = "res/ui/zy_tongyong/zy_prop/item2/item2_fly-i6p.png", plistFile = "res/ui/zy_tongyong/zy_prop/item2/item2_anims_i6p.plist", frameName = "item2_%d.png", frameNum = 28}, | |||
[3] = {icon = "userInfo_prop3.png", image = "res/ui/zy_tongyong/zy_prop/item3/item3_fly-i6p.png", plistFile = "res/ui/zy_tongyong/zy_prop/item3/item3_anims_i6p.plist", frameName = "item3_%d.png", frameNum = 21}, | |||
[4] = {icon = "userInfo_prop4.png", image = "res/ui/zy_tongyong/zy_prop/item4/item4_fly-i6p.png", plistFile = "res/ui/zy_tongyong/zy_prop/item4/item4_anims_i6p.plist", frameName = "item4_%d.png", frameNum = 29}, | |||
[5] = {icon = "userInfo_prop5.png", image = "res/ui/zy_tongyong/zy_prop/item5/item5_fly-i6p.png", plistFile = "res/ui/zy_tongyong/zy_prop/item5/item5_anims_i6p.plist", frameName = "item5_%d.png", frameNum = 19}, | |||
[6] = {icon = "userInfo_prop6.png", image = "res/ui/zy_tongyong/zy_prop/item6/item6_fly-i6p.png", plistFile = "res/ui/zy_tongyong/zy_prop/item6/item6_anims_i6p.plist", frameName = "item6_%d.png", frameNum = 28}, | |||
[7] = {icon = "userInfo_prop7.png", image = "res/ui/zy_tongyong/zy_prop/item7/item7_fly-i6p.png", plistFile = "res/ui/zy_tongyong/zy_prop/item7/item7_anims_i6p.plist", frameName = "item7_%d.png", frameNum = 30}, | |||
[8] = {icon = "userInfo_prop8.png", image = "res/ui/zy_tongyong/zy_prop/item8/item8_fly-i6p.png", plistFile = "res/ui/zy_tongyong/zy_prop/item8/item8_anims_i6p.plist", frameName = "item8_%d.png", frameNum = 13}, | |||
[9] = {icon = "userInfo_prop9.png", image = "res/ui/zy_tongyong/zy_prop/item9/item9_fly-i6p.png", plistFile = "res/ui/zy_tongyong/zy_prop/item9/item9_anims_i6p.plist", frameName = "item9_%d.png", frameNum = 33}, | |||
[10] = {icon = "userInfo_prop10.png", image = "res/ui/zy_tongyong/zy_prop/item10/item10_fly-i6p.png", plistFile = "res/ui/zy_tongyong/zy_prop/item10/item10_anims_i6p.plist", frameName = "item10_%d.png", frameNum = 4}, | |||
} | |||
-- 道具顺序 | |||
GamePropSort = {10,9,4,2,3,5,8,6,1,7} | |||
--支付方式 | |||
PayType = | |||
{ | |||
Apple = 1, -- 苹果支付 | |||
PAY_TYPE_WEXIN = 2, -- 微信支付 | |||
PAY_TYPE_H5 = 3, -- h5支付 | |||
PAY_TYPE_WEXIN_SHARE = 10, -- 微信分享支付 | |||
PAY_TYPE_HYB = 11, -- 汇元宝 | |||
PAY_TYPE_ALIPAY = 16, -- 支付宝 | |||
} | |||
-- 玩家的 GPS 状态 | |||
GpsStatus = | |||
{ | |||
close = 0, --// 未开启 | |||
undeal = 1, --// 未处理 | |||
enable = 2, --// 允许 | |||
disEnable = 3, --// 拒绝的 | |||
unkown = 99, --// 未知的 | |||
} | |||
GpsStatusString = | |||
{ | |||
[GpsStatus.close] = "GPS未开启", --// 未开启 | |||
[GpsStatus.undeal] = "GPS未授权", --// 未处理 | |||
[GpsStatus.enable] = "GPS已开启", --// 允许 | |||
[GpsStatus.disEnable] = "GPS已拒绝", --// 拒绝的 | |||
[GpsStatus.unkown] = "GPS状态未知", --// 未知的 | |||
} | |||
-- GPS状态的提示颜色 | |||
GpsStatusColor = | |||
{ | |||
[GpsStatus.close] = cc.c3b(219,56,35), --// 未开启 | |||
[GpsStatus.undeal] = cc.c3b(233, 089, 083), --// 未处理 | |||
[GpsStatus.enable] = cc.c3b(113, 184, 109), --// 允许 | |||
[GpsStatus.disEnable] = cc.c3b(233, 089, 083), --// 拒绝的 | |||
[GpsStatus.unkown] = cc.c3b(255, 255, 255), --// 拒绝的 | |||
} | |||
-- GPS距离的提示颜色 | |||
GpsDistanceColor = | |||
{ | |||
["safe"] = cc.c3b(040, 255, 082), --大于安全距离 | |||
["danger"] = cc.c3b(255, 032, 042), --小于安全距离 | |||
} | |||
-- GPS界面的默认颜色 | |||
GpsDefaultColor = cc.c3b(255, 255, 255) | |||
-- 大厅需要预加载的ui文件 | |||
UI_IN_HALL = | |||
{ | |||
-- "res/ui/ui_dating/ui_activity_main.ui", | |||
-- "res/ui/ui_dating/ui_bangzhu.ui", | |||
-- "res/ui/ui_dating/ui_chongzhi.ui", | |||
-- "res/ui/ui_dating/ui_chongzhi_xuanze.ui", | |||
-- "res/ui/ui_dating/ui_chuangjian.ui", | |||
-- "res/ui/ui_dating/ui_dailizhaomu.ui", | |||
-- "res/ui/ui_dating/ui_dating.ui", | |||
-- "res/ui/ui_dating/ui_dating_icon.ui", | |||
-- "res/ui/ui_dating/ui_duihuan.ui", | |||
-- "res/ui/ui_dating/ui_duihuan_tiao.ui", | |||
-- "res/ui/ui_dating/ui_gonggao_tiao.ui", | |||
-- "res/ui/ui_dating/ui_huodong.ui", | |||
-- "res/ui/ui_dating/ui_InviteCode.ui", | |||
-- "res/ui/ui_dating/ui_jiarufangjian.ui", | |||
-- "res/ui/ui_dating/ui_shezhi.ui", | |||
-- "res/ui/ui_dating/ui_shiming.ui", | |||
-- "res/ui/ui_dating/ui_shuzijianpan.ui", | |||
-- "res/ui/ui_dating/ui_xiazai.ui", | |||
-- "res/ui/ui_club/ui_club_main.ui", | |||
} | |||
--茶馆需要预加载的ui文件 | |||
UI_IN_CLUB = | |||
{ | |||
-- "res/ui/ui_club/ui_club_zhanji.ui", | |||
-- "res/ui/ui_club/ui_club_player_list.ui", | |||
-- "res/ui/ui_club/ui_club_baojian.ui", | |||
-- "res/ui/ui_club/ui_club_message.ui", | |||
} | |||
--游戏对应人数 | |||
GAME_CONST = | |||
{ | |||
CHENZHOU_GAME_CONST_PLAYER = 3,--郴州字牌玩家数量 | |||
LIUHUQIANG_GAME_CONST_PLAYER = 4,--六胡抢玩家数量 | |||
} | |||
--茶馆设置状态操作 | |||
GAME_CLUB_SET_STATE = | |||
{ | |||
Club_status = 1, --状态操作茶馆(管理员专属) | |||
Join_set = 2, --加入设置(管理员专属) | |||
Change_club_name= 3, --修改昵称(管理员专属) | |||
Change_privacy = 4, --隐私昵称(管理员专属) | |||
Forbid_share = 6, --屏蔽微信分享(管理员专属) | |||
Change_Mode = 7, --房间模式修改room_mode $value 1多玩法模式, 0包间模式; | |||
Set_win_socre = 8, --大家赢分数统计 | |||
Quit_set = 9, --退群申请设置 (创始人)is_exitapply $value 1需要申请, 0无需申请; 无广播 | |||
Math_Switch = 13, --比赛场开关 | |||
} | |||
--茶馆战绩类型 | |||
ClUB_ZHANJI_TYPE = | |||
{ | |||
Club = 1, -- 茶馆战绩 | |||
Mine = 2, -- 我的战绩 | |||
ZhanjiTongji = 3,-- 茶馆战绩统计 | |||
} | |||
--茶馆默认桌子数量 | |||
GAME_CLUB_TABLE_NUM = | |||
{ | |||
club_normal_num = 20, | |||
} | |||
GAME_EVENT = { | |||
DISSMISS_UPDATE_STATUS = "DISSMISS_UPDATE_STATUS", | |||
DISSMISS_CLOSE = "DISSMISS_CLOSE", | |||
RECHARGE_RESULT = "RECHARGE_RESULT", | |||
RECHARGE_CLOSE = "RECHARGE_CLOSE", | |||
UPDATE_WEB_GAME = "UPDATE_WEB_GAME", | |||
EXCHANGE_RESULT = "EXCHANGE_RESULT", | |||
ACTIVITY_CLOSE = "ACTIVITY_CLOSE", | |||
--更新GPS用户数据 | |||
GPS_UPDATE_USER_INFO = "GPS_UPDATE_USER_INFO", | |||
--聊天界面 | |||
CHAT_PRSPONSE = "CHAT_PRSPONSE", --收到聊天数据 | |||
CHAT_GET_RECORED = "CHAT_GET_RECORED", --获取聊天记录 | |||
CHAT_GET_RECORED_RESP = "CHAT_GET_RECORED_RESP", --获取聊天记录回调 | |||
CHAT_VOICE_RESP = "CHAT_VOICE_RESP", --收到语音消息 | |||
CHAT_PLAY_VOICE = "CHAT_PLAY_VOICE",--播放语音播放 | |||
CHAT_STOP_VOICE = "CHAT_STOP_VOICE",--停止语音播放 | |||
CHAT_REPLAY_VOICE = "CHAT_REPLAY_VOICE",--重复语音播放 | |||
--俱乐部 | |||
CLUB_MAIN_CLOSE = "CLUB_MAIN_CLOSE", | |||
CLUB_LIST = "CLUB_LIST", | |||
CLUB_TABLE = "CLUB_TABLE", | |||
CLUB_UPDATE_TABLE = "CLUB_UPDATE_TABLE", --刷新单个桌子 | |||
CLUB_TABLE_NUM = "CLUB_TABLE_NUM", --刷新桌子数量 | |||
CLUB_GAME_RULE = "CLUB_GAME_RULE", | |||
CLUB_CHANGE_RULE = "CLUB_CHANGE_RULE", --修改玩法 | |||
CLUB_CHANGE_RULE_PUSH = "CLUB_CHANGE_RULE_PUSH", --玩法修改推送 | |||
CLUB_CHANGE_BAO_JIAN = "CLUB_CHANGE_BAO_JIAN", --切换包间 | |||
CLUB_CHANGE_BAO_JIAN_NAME = "CLUB_CHANGE_BAO_JIAN_NAME", --切换包间 | |||
CLUB_JIE_SAN = "CLUB_JIE_SAN", --茶馆解散 | |||
CLUB_JOIN = "CLUB_JOIN", --茶馆加入 | |||
CLUB_SET = "CLUB_SET", --茶馆设置 | |||
CLUB_CHANGE_PUSH = "CLUB_CHANGE_PUSH", --茶馆修改推送 (除去桌子外的数据) | |||
CLUB_MESSAGE = "CLUB_MESSAGE", | |||
CLUB_MESSAGE_C0PARTNER = "CLUB_MESSAGE_C0PARTNER",--合伙人申请 | |||
CLUB_MESSAGE_REAWRD = "CLUB_MESSAGE_REAWRD", --领取奖励 | |||
CLUB_MESSAGE_CHANGED = "CLUB_MESSAGE_CHANGED", -- 消息有变动 | |||
CLUB_PLAYER_LIST = "CLUB_PLAYER_LIST", | |||
CLUB_PLAYER_SEARCH = "CLUB_PLAYER_SEARCH", | |||
CLUB_INVITE_PLAYER_LIST = "CLUB_INVITE_PLAYER_LIST", --邀请的成员列表 | |||
CLUB_PLAYER_BAN_LIST = "CLUB_PLAYER_BAN_LIST", --禁止同桌列表 | |||
CLUB_PLAYER_BAN_SET = "CLUB_PLAYER_BAN_SET", --设置禁止同桌 | |||
CLUB_PLAYER_ADD = "CLUB_PLAYER_ADD", | |||
CLUB_PLAYER_BAN_ALL_LIST = "CLUB_PLAYER_BAN_ALL_LIST", --查看禁止列表 | |||
-- 禁止同队 | |||
CLUB_PLAYER_JZ_TABLE_LIST = "CLUB_PLAYER_JZ_TABLE_LIST", --战队列表 | |||
CLUB_PLAYER_JZ_YJ_TABLE_LIST = "CLUB_PLAYER_JZ_YJ_TABLE_LIST", -- 已经(YZ)战队列表 | |||
CLUB_PLAYER_BAN_ALL_BAN = "CLUB_PLAYER_BAN_ALL_BAN", -- 禁止同队,全部禁止/禁止 | |||
CLUB_PLAYER_CANCEL_ALL_CANCEL = "CLUB_PLAYER_CANCEL_ALL_CANCEL", -- 禁止同队,全部取消/取消 | |||
CLUB_BACK_ROOM = "CLUB_BACK_ROOM", --茶馆回到房间界面 | |||
CLUB_NOTICE = "CLUB_NOTICE", --茶馆公告 | |||
CLUB_ACTIVITY_LIST = "CLUB_ACTIVITY_LIST", --活动列表 | |||
CLUB_CREATE_ERR = "CLUB_CREATE_ERR",--创建错误 | |||
CLUB_CREATE_SUCCESS = "CLUB_CREATE_SUCCESS", -- 创建亲友圈成功 | |||
CLUB_INVITE = "CLUB_INVITE", --邀请成员 | |||
CLUB_CHANGE_ROLE = "CLUB_CHANGE_ROLE", --成员列表权限改变 | |||
CLUB_MEMBER_SET_SUCCESS = "MemberSetSuccess", -- 成员属性修改成功 | |||
GetCopartnerSub = "GetCopartnerSub",--获取所有合伙人对应的下线 | |||
CopartnerSetup = "CopartnerSetup",--给合伙人设置下线 | |||
GetCopartnerStat = "GetCopartnerStat",--合伙人(所有合伙人&统计) | |||
GetCopartnerDetail = "GetCopartnerDetail",--合伙人贡献详情 | |||
CLUB_CHANGE_BG = "CLUB_CHANGE_BG", --亲友圈更换背景 | |||
CLUB_SET_MATCH = "CLUB_SET_MATCH", --俱乐部设置比赛 | |||
CLUB_SET_TABLE_STYLE = "CLUB_SET_TABLE_STYLE", -- 更换亲友圈桌子颜色 | |||
CLUB_RED_FLOWER_RECORD = "CLUB_RED_FLOWER_RECORD", --俱乐部红花记录 | |||
CLUB_UPDATE_RED_FLOWER = "CLUB_UPDATE_RED_FLOWER", --俱乐部红花更新 | |||
EVENT_CHANGE_ADDRESS = "EVENT_CHANGE_ADDRESS", -- 大厅修改自己所在地区 | |||
CLUB_CANCEL_COPARTNER_NOTICE = "CLUB_CANCEL_COPARTNER_NOTICE", --取消合伙人通知 | |||
CLUB_CANCEL_COPARTNER = "CLUB_CANCEL_COPARTNER", --取消合伙人操作 | |||
CLUB_CANCEL_COPARTNER_TIP = "CLUB_CANCEL_COPARTNER_TIP", --取消合伙人操作后的提示 | |||
NOTICE_REQUEST_PLAYER_LIST = "NOTICE_REQUEST_PLAYER_LIST", --分布式请求成员列表数据 | |||
UPDATE_COPARTNER_RATDIO = "UPDATE_COPARTNER_RATDIO", --更新一二级合伙人比例 | |||
CLUB_IMPORT_MBMBER = "CLUB_IMPORT_MBMBER", --俱乐部导入 | |||
CLUB_ACTIVE_GAME = "CLUB_ACTIVE_GAME", --俱乐部激活游戏 | |||
CLUB_ACTIVE_RULE = "CLUB_ACTIVE_RULECLUB_ACTIVE_RULE", --俱乐部激活玩法 | |||
CLUB_ROOM_LIST_UPDATE = "CLUB_ROOM_LIST_UPDATE", --俱乐部房间刷新 | |||
CLUB_GPS_DISTANCE = "CLUB_GPS_DISTANCE", --俱乐部俱乐部距离刷新 | |||
-- | |||
CLUB_SET_COPARTNER_ONE_FAILE = "CLUB_SET_COPARTNER_ONE_FAILE", --设置一级合伙人失败 | |||
CLUB_CHANGE_BAO_JIAN_NAME = "CLUB_CHANGE_BAO_JIAN_NAME",--修改包间名 | |||
CLUB_CALUATE_ACTIVE_GAME = "CLUB_CALUATE_ACTIVE_GAME",--激活游戏列表更新 | |||
UPDATE_SCOREVIEW_SIZE = "UPDATE_SCOREVIEW_SIZE",--更新滑动区域 | |||
--排名赛事件分发 | |||
CLUB_ALL_PEOPLE_MATCH = "CLUB_ALL_PEOPLE_MATCH",--排名赛管理 | |||
CLUB_MATCH_LEVEL_LOG = "CLUB_MATCH_LEVEL_LOG",--升级记录 | |||
CLUB_MATCH_TEAM_LEVEL = "CLUB_MATCH_TEAM_LEVEL",--战队升级 | |||
CLUB_MATCH_LEVEL_UPGRADE = "CLUB_MATCH_LEVEL_UPGRADE",--战队升级 | |||
CLUB_MATCH_JUDGE = "CLUB_MATCH_JUDGE", --裁判 | |||
CLUB_TEAM_VIEW = "CLUB_TEAM_VIEW", --打开下级界面 | |||
-- CEST海选赛事件分发 | |||
CLUB_CEST_GET_GAMESET = "CLUB_CEST_GET_GAMESET", --CEST获取初始参数信息 | |||
CLUB_CEST_ALL_PEOPLE_MATCH = "CLUB_CEST_ALL_PEOPLE_MATCH", --CEST海选赛管理 | |||
CLUB_CEST_DRAW_TEAM = "CLUB_CEST_DRAW_TEAM", --CEST认领比赛 | |||
CLUB_CEST_END_TEAM = "CLUB_CEST_DRAW_TEAM", --CEST结束比赛 | |||
CLUB_CEST_GAMEINFO = "CLUB_CEST_GAMEINFO", --CEST报名开始 | |||
CLUB_CEST_NO_GAMEINFO = "CLUB_CEST_NO_GAMEINFO", --CEST报名开始,还没有设置报名场的参数 | |||
CLUB_CEST_START_APPLY = "CLUB_CEST_START_APPLY", --CEST报名参加 | |||
CLUB_CEST_APPLY_LIST = "CLUB_CEST_APPLY_LIST", --CEST海选赛申请列表 | |||
CLUB_CEST_APPLY_BTN = "CLUB_CEST_APPLY_BTN", --CEST海选赛申请列表更新按钮 | |||
CLUB_CEST_APPLY_STATUS = "CLUB_CEST_APPLY_STATUS", --CEST海选赛报名审核 | |||
CLUB_CEST_END_GAME = "CLUB_CEST_END_GAME", --CEST海选赛申请退赛 | |||
CLUB_CEST_USER_INFO = "CLUB_CEST_USER_INFO", --CEST海选赛申请退赛 | |||
CLUB_CEST_APPLY_LOG = "CLUB_CEST_APPLY_LOG", --CEST海选赛申请记录日志 | |||
CLUB_CEST_CANSAI_MINGE = "CLUB_CEST_CANSAI_MINGE", --CEST海选赛申请参赛名额 | |||
CLUB_CEST_REQUEST_MINGE_INFO = "CLUB_CEST_REQUEST_MINGE_INFO", --CEST海选赛去请求参赛名额信息 | |||
CLUB_CEST_UPDATE_APPLY_LIST = "CLUB_CEST_UPDATE_APPLY_LIST", --CEST拉取海选赛申请消息 | |||
-- tianti | |||
CLUB_TIANTI_BAOMING_REG = "CLUB_TIANTI_BAOMING_REG", --TIANTI 报名 | |||
--UNION | |||
CLUB_UNION_CHECK_MASTER = "CLUB_UNION_CHECK_MASTER", -- 查询主盟(已加入) | |||
CLUB_UNION_HITS = "CLUB_UNION_HITS", -- 主盟红点 | |||
CLUB_UNION_JOIN_MASTER_LIST = "CLUB_UNION_JOIN_MASTER_LIST", --申请加入主盟的列表 | |||
CLUB_UNION_MESSAGE = "CLUB_UNION_MESSAGE", --主盟的消息列表 | |||
CLUB_UNION_SLAVE_UPDATE = "CLUB_UNION_SLAVE_UPDATE", --刷新fu盟的列表 | |||
CLUB_UNION_SLAVE_UPDATE_LEVEL = "CLUB_UNION_SLAVE_UPDATE_LEVEL", --副盟的个人信息 | |||
CLUB_UNION_CLUB_BELONG = "CLUB_UNION_CLUB_BELONG", --亲友圈归属 | |||
CLUB_UNION_CLUB_BELONG_LIST = "CLUB_UNION_CLUB_BELONG_LIST", --亲友圈归属list | |||
--连打功能 | |||
GAME_LIAN_DA = "GAME_LIAN_DA", --连打功能 | |||
} | |||
STORE_TYPE = { | |||
BUY_ZUANSHI = 0, --购买钻石 | |||
BUY_HUANLEDOU = 1, --购买欢乐豆 | |||
CHECK_HISTORY = 2, --购买记录 | |||
CHANGE_COIN = 4, --兑换金币 | |||
CHANGE_LIQUAN = 5, --礼券兑换实物 | |||
CHANGE_QYQBG = 81, --亲友圈背景兑换 | |||
CHANGE_DTBG = 82, --大厅背景兑换 | |||
CHANGE_LTQP = 83, --聊天气泡兑换 | |||
CHANGE_YYQP = 84, --语音气泡兑换 | |||
} | |||
INVITE_NEW_FRIEND = { | |||
NOENOUGH_ADDITION = 0,--不满足条件 | |||
ENOUGH_ADDITION = 1, --满足条件 | |||
HAVED_PRIZED =2, | |||
OLD_PLAYER =3,--老玩家不可領取 | |||
} | |||
PROTOCOL_TYPE = { | |||
COMMON = 1, | |||
COIN = 2, | |||
MATCH = 3, | |||
} | |||
COIN_LEVEL = { | |||
INIT = 10, -- 初级金币场 | |||
MIDDLE = 20, -- 中级金币场 | |||
HIGH = 30, -- 高级金币场 | |||
} | |||
COIN_TEXT_NAME = { | |||
[COIN_LEVEL.INIT] = "初级场", | |||
[COIN_LEVEL.MIDDLE] = "中级场", | |||
[COIN_LEVEL.HIGH] = "高级场", | |||
} | |||
COIN_SERVER_LEVEL = { | |||
[0] = "钻石模式"; | |||
[1] = "初级场"; | |||
[2] = "中级场"; | |||
[3] = "高级场"; | |||
} | |||
--是否启用新俱乐部代码 | |||
IS_USER_NEW_CLUB = true | |||
NOTICE_REDPOINT = { | |||
--公告里面 | |||
[1] = "notice_security",--超强防护 | |||
[2] = "tasks_groupTasks",--亲友圈活动 | |||
[3] = "notice_brand",--品牌力量 | |||
[4] = "notice_greenNotice",--绿色公告 | |||
[5] = "tasks_newGame",--新游上线(最新) | |||
--[6] = "notice_gameUpdate",--游戏更新 | |||
[7] = "notice_goldMatch",--金币场 | |||
[8] = "tasks_newGamePuYu",--网页游戏 | |||
[9] = "tasks_newGameXiYou",--网页游戏 | |||
[10] = "tasks_newGameDDH",--新游(倒倒胡) | |||
[11] = "notice_greenWelfare",--绿色公益 | |||
[12] = "notice_coBranding",--合作品牌 | |||
[13] = "tasks_xianyouji",--合作品牌 | |||
[14] = "tasks_meilixiushan",--美丽秀山 | |||
[15] = "tasks_hongbaoquan",--红包券 | |||
} | |||
ACTIVITY_REDPOINT = { | |||
--金币场 | |||
COIN_GAME_FULI = "everyWelfare",--金币场每日福利 | |||
COIN_GAME_FREE_GOLD = "freeGold",--金币场免费金币 | |||
--大厅 | |||
SYSTEM_MESSAGE = "message",--邮件消息 | |||
SYSTEM_IDENTIFY = "identify",--实名认证 | |||
AGENT = "agent", | |||
} | |||
LoginType = { | |||
LOGIN_TYPE_WEIXIN = 0, --微信登录 | |||
LOGIN_TYPE_PHONE = 1, --手机密码登录 | |||
LOGIN_TYPE_PHONE_CHECKCODE = 2, --手机验证码登陆 | |||
LOGIN_TYPE_ID = 3, --ID登录 | |||
LOGIN_TYPE_PHONE_REGISTER = 5, --手机注册 | |||
} | |||
ChangePlayerInfo = { | |||
PHONE_RESET = 1, --手机密码重置 | |||
REPLCACE_PHONE = 2, --手机替换 | |||
} | |||
BIND_TYPE = { | |||
PHONE = 0, --绑定手机 | |||
WEIXIN = 3, --绑定微信 | |||
WEIXIN_TWICE_BIND = 4, --二次授权绑定 | |||
BIND_TYPE_PASSWORD = 5, --密码强制设置 | |||
} | |||
BIND_TYPE_RESULT = { | |||
PHONE = 0, --绑定手机成功 | |||
CHECKCODE_FAILED = 1, --验证码错误 | |||
PHONE_BIND_FAILED = 2, --已绑定过手机号,无需再次绑定 | |||
PHONE_BINDED_OTHER_FAILED = 5, --该手机号已经被其他游戏ID绑定,请更换手机号再次绑定 | |||
WEIXIN = 6, --绑定微信成功 | |||
WEIXINBINDED_OTHER_FAILED = 7, --该微信号已绑定过其他游戏账号 | |||
WEIXIN_TWICE_BIND = 8, --二次授权绑定成功 | |||
USER_SET_PASSWORD = 9, --用户设置密码成功 | |||
} |
@@ -0,0 +1,322 @@ | |||
local isLoginData = false | |||
local isUpdateData = false | |||
local function gotoRoom() | |||
local loginInfo = app.user.loginInfo | |||
if loginInfo.gameId > 0 and loginInfo.tid > 0 then | |||
if not isLoginData or not isUpdateData then | |||
app.waitDialogManager:closeWaitNetworkDialog() | |||
return | |||
end | |||
app.waitDialogManager:closeWaitNetworkDialog() | |||
-- 进入房间 | |||
local function enterRoom() | |||
app.hall:requestEnterRoom(loginInfo.gameId, loginInfo.tid, app.protocolType) | |||
end | |||
-- 尝试进入房间 | |||
local function tryEnterRoom() | |||
local result, subGameId, missingFiles = app.subGameManager:checkGameFiles(loginInfo.gameId) | |||
if not result then | |||
logD("GlobalEvent::gotoRoom() 发现子游戏文件缺失,gameId = "..subGameId) | |||
for k,v in pairs(missingFiles) do | |||
logD(v); | |||
end | |||
local function onOk() | |||
app.subGameManager:clearGame(subGameId, function() | |||
downloadSubGame(subGameId, tryEnterRoom); | |||
end); | |||
end | |||
showConfirmDialog("发现文件缺失,点击确定开始修复", onOk); | |||
else | |||
enterRoom(); | |||
end | |||
end | |||
local isInstall = app.subGameManager:isInstaller(loginInfo.gameId) | |||
local isNeedUpdate = app.subGameManager:isNeedUpdate(loginInfo.gameId) | |||
if not isInstall or isNeedUpdate then | |||
downloadSubGame(loginInfo.gameId, tryEnterRoom) | |||
return | |||
end | |||
tryEnterRoom() | |||
end | |||
end | |||
-- 侦听全局的socket重连成功消息 | |||
function netConnectSucceed() | |||
-- 清空之前通过Protocol:sendResponse所有的消息注册函数 | |||
local function clearAllRegMsg() | |||
for i, v in pairs(g_regMsgCallBackFuncs) do | |||
v() | |||
end | |||
print("连接成功,清空所有之前通过Protocol:sendResponse注册的网络回调函数, 回到函数个数:" .. table.nums(g_regMsgCallBackFuncs)) | |||
g_regMsgCallBackFuncs = { } | |||
end | |||
app:addEventListener("socketConnectSucceed", clearAllRegMsg) | |||
end | |||
-- 绑定角色登陆成功的全局事件 | |||
local function actorLoginSucceed() | |||
-- 角色登陆成功后拉取消息全部返回完毕后拉取战斗 | |||
local function onLoginSuccessed() | |||
local LoginConfig = require("luaScript.Views.Login.LoginConfig") | |||
if LoginConfig.EapSDK and (not isWin32Platform()) and G_EapSdkMgr then | |||
local userInfo = json.decode(app.user.userInfo); | |||
G_EapSdkMgr:login(tostring(app.user.loginInfo.uid), userInfo.nickname, userInfo.headimgurl, app.user.phonenum or "", app.user.sex) | |||
end | |||
app.waitDialogManager:closeTransparencyMask(); | |||
local loginInfo = app.user.loginInfo | |||
print("GlobalEvent onLoginSuccessed :"..table.tostring(loginInfo)) | |||
local currentView = app:getCurrentView(); | |||
-- 参数不正确的情况下直接进入到大厅界面,省事 | |||
if not loginInfo or not currentView then | |||
--app:gotoView(import("luaScript.Views.Main.MainView"):new()); | |||
gotoMainView() | |||
app.user:dispatchEvent({name = "onMainViewLoginSuccessed"}) | |||
return | |||
end | |||
--在比赛中 | |||
if loginInfo and loginInfo.matchFlag == 1 then | |||
local function gotoMatch() | |||
local MatchEvents = require("luaScript.Views.Match.Constant.MatchEvents") | |||
local ProtocolMatchMessage = require("luaScript.Protocol.Match.ProtocolMatchMessage") | |||
local request=ProtocolMatchMessage.MatchEnter:new() | |||
request.uid = loginInfo.uid | |||
request.userInfo = app.user.userInfo | |||
dump(request) | |||
app.waitDialogManager:showWaitNetworkDialog("获取比赛信息..."); | |||
app.mainScene:sendMsg(app.match, MatchEvents.ENTER_MATCH, request, function(status, response) | |||
-- print(table.tostring(response)) | |||
end) | |||
end | |||
local isInstall = app.subGameManager:isInstaller(loginInfo.gameId) | |||
local isNeedUpdate = app.subGameManager:isNeedUpdate(loginInfo.gameId) | |||
if not isInstall or isNeedUpdate then | |||
downloadSubGame(loginInfo.gameId, gotoMatch) | |||
return | |||
end | |||
gotoMatch() | |||
return | |||
end | |||
-- 看玩家数据是不是在房间中 | |||
if loginInfo.gameId > 0 and loginInfo.tid > 0 then | |||
-- 如果没有配置信息,只能进大厅 | |||
local gameConfig = getSubGameConfig(loginInfo.gameId) | |||
if not gameConfig then | |||
--app:gotoView(import("luaScript.Views.Main.MainView"):new()); | |||
gotoMainView() | |||
app.user:dispatchEvent({name = "onMainViewLoginSuccessed"}) | |||
return | |||
end | |||
if loginInfo.serverLevel >= COIN_LEVEL.INIT and loginInfo.serverLevel <= COIN_LEVEL.HIGH + 10 then --金币场区间为10~40 | |||
app.protocolType = PROTOCOL_TYPE.COIN | |||
end | |||
isLoginData=true | |||
app.waitDialogManager:showWaitNetworkDialog() | |||
gotoRoom() | |||
-- -- 请求进入房间 | |||
-- local function enterRoom() | |||
-- app.hall:requestEnterRoom(loginInfo.gameId, loginInfo.tid) | |||
-- end | |||
-- local isInstall = app.subGameManager:isInstaller(loginInfo.gameId) | |||
-- local isNeedUpdate = app.subGameManager:isNeedUpdate(loginInfo.gameId) | |||
-- if not isInstall or isNeedUpdate then | |||
-- downloadSubGame(loginInfo.gameId, enterRoom) | |||
-- return; | |||
-- end | |||
-- enterRoom() | |||
else | |||
-- 若果正在显示总结算,则不理 | |||
if isShowCountAll() then | |||
return | |||
end | |||
-- 如果玩家不在房间中,分两种情况 | |||
-- 一种是现在的界面就是在大厅中。则什么都不用做,保持当前状态 | |||
-- 另一种是现在的界面不在大厅中,则需要重新进入大厅界面 | |||
if "MainView" ~= currentView.__cname then | |||
--app:gotoView(import("luaScript.Views.Main.MainView"):new()); | |||
gotoMainView() | |||
end | |||
app.user:dispatchEvent({name = "onMainViewLoginSuccessed"}) | |||
end | |||
end | |||
app.user:addEventListener("onLoginSuccessed", onLoginSuccessed) | |||
end | |||
local function actorLoginFailed() | |||
local function OnActorLoginFailed(event) | |||
local errCode = event.errCode | |||
if errCode then | |||
-- 1: 电话号码未绑定微信 2: 密码错误 | |||
local errString = | |||
{ | |||
[1] = "您的账号还没有绑定,请先使用【微信登陆】并在玩家信息中绑定【手机】账号", | |||
[2] = "密码错误", | |||
[3] = "账号已经禁止使用", | |||
[4] = "验证码错误", | |||
[7] = "该手机号已绑定过其他游戏账号", | |||
[8] = "该手机号还未注册", | |||
[9] = "没有此用户", | |||
} | |||
local message = errString[errCode] or "手机号登录失败 "..tostring(errCode); | |||
if tonumber(errCode) == 1 then | |||
showConfirmDialog(message,nil,nil,25); | |||
else | |||
showConfirmDialog(message); | |||
end | |||
end | |||
end | |||
app.user:addEventListener("onPhoneLoginErrResponse", OnActorLoginFailed) | |||
end | |||
function registerEnterRoomEvent() | |||
local function onEnterRoomSuccess(event) | |||
--EAPSDK 进入房间自动隐藏 | |||
if G_LayerMain then | |||
G_LayerMain:setVisible(false); | |||
end | |||
local gameId = event.gameId or 0; | |||
local gameType = event.gameType or 0; | |||
--目前只有金币场用到,用于区分是进入房间成功还是断线重连(金币场的gameStatus无法使用) | |||
local param = event.param; | |||
runInNextFrame(function() | |||
local roomViewName = getSubGameRoomView(gameId, gameType, app.protocolType) | |||
logD("onEnterRoomSuccess() roomViewName = " .. roomViewName) | |||
if roomViewName then | |||
local arr = string.split(roomViewName, ".") | |||
local len = table.nums(arr) | |||
local currentView = app:getCurrentView(); | |||
if currentView then | |||
logD("onEnterRoomSuccess() currentName = " .. currentView.__cname) | |||
else | |||
logD("onEnterRoomSuccess() currentView is nil") | |||
end | |||
if currentView and currentView.__cname == arr[len] then | |||
-- 当前正是在我想去的房间里面 | |||
logD("onEnterRoomSuccess() do nothing") | |||
else | |||
logD("onEnterRoomSuccess() goto view " .. roomViewName) | |||
app:gotoView(import(roomViewName):new(param)); | |||
end | |||
end | |||
end) | |||
end | |||
app.hall:addEventListener("onEnterRoomSuccess", onEnterRoomSuccess) | |||
end | |||
function registerKickoutEvent() | |||
local function onServerKickout() | |||
local function onClickOk() | |||
app.plugin:logout(); | |||
end | |||
app.net.isNeedReconnect = false | |||
app.net:close(); | |||
showConfirmDialog("数据异常,请重新登录", onClickOk)--"您的账号在其他地方登陆,您被强制下线" | |||
end | |||
app.user:addEventListener("onServerKickOutResponse", onServerKickout) | |||
end | |||
--子游戏更新获取完成事件 | |||
function registerSubGameListEvent() | |||
local function getSubGameListSuccessed() | |||
if not isUpdateData then | |||
isUpdateData=true | |||
gotoRoom() | |||
end | |||
end | |||
app.serverConfigs:addEventListener("getSubGameListSuccessed", getSubGameListSuccessed) | |||
end | |||
--绑定手机结果/绑定微信/二次授权 | |||
function registerBindAppEvent() | |||
local function onBindResponse(event) | |||
if not event or not event.response then | |||
return | |||
end | |||
local ret = tonumber(event.response.ret); | |||
if ret == 7 then | |||
uploadLogs("WEIXIN_TWICE_BIND") | |||
end | |||
local tips = | |||
{ | |||
[0] = "绑定成功", | |||
[1] = "验证码错误", | |||
[2] = "已绑定过手机号,无需再次绑定", | |||
[5] = "该手机号已经被其他游戏ID绑定,请更换手机号再次绑定", | |||
[6] = "绑定成功", | |||
[7] = "该微信号已绑定过其他游戏账号", | |||
[8] = "绑定成功", | |||
[9] = "设置成功", | |||
} | |||
local msg = tips[ret] or "未知错误:"..tostring(ret) | |||
showConfirmDialog(msg, function() end) | |||
end | |||
app.user:addEventListener("onBindResponse", onBindResponse) | |||
end | |||
--修改手机号/修改密码 | |||
function registerChangeAppEvent() | |||
local function onChangePlayerInfo(event) | |||
if not event or not event.response then | |||
return | |||
end | |||
local ret = tonumber(event.response.ret); | |||
local tips = | |||
{ | |||
[0] = "修改成功", | |||
[1] = "您的账号还没有绑定,请先使用【微信登陆】并在玩家信息中绑定【手机】账号", | |||
[2] = "密码错误", | |||
[3] = "账号已经禁止使用", | |||
[4] = "验证码错误", | |||
[7] = "该手机号已绑定过其他游戏账号", | |||
[8] = "该手机号还未注册", | |||
} | |||
local msg = tips[ret] or "未知错误:"..tostring(ret) | |||
showConfirmDialog(msg, function() end) | |||
end | |||
app.user:addEventListener("onChangePlayerInfo", onChangePlayerInfo) | |||
end | |||
-- 开始侦听所有全局事件 | |||
function startGlobalEvent() | |||
if isReviewWithMiniGame() then | |||
return | |||
end | |||
netConnectSucceed() | |||
actorLoginSucceed() | |||
actorLoginFailed() | |||
registerEnterRoomEvent() | |||
registerKickoutEvent() | |||
registerSubGameListEvent() | |||
registerBindAppEvent() | |||
registerChangeAppEvent() | |||
end |
@@ -0,0 +1,577 @@ | |||
local PluginAndroidLocation = require("luaScript.Plugins.PluginAndroidLocation"); | |||
local PluginAndroidGVoice = require("luaScript.Plugins.PluginAndroidGVoice"); | |||
local PluginAndroidDowloadManager = require("luaScript.Plugins.PluginAndroidDowloadManager"); | |||
local PluginAndroidPing = require("luaScript.Plugins.PluginAndroidPing"); | |||
local PluginIosPay = require("luaScript.Plugins.PluginIosPay"); | |||
local PluginIosLocation = require("luaScript.Plugins.PluginIosLocation"); | |||
local PluginIosGVoice = require("luaScript.Plugins.PluginIosGVoice"); | |||
local PluginIosDowloadManager = require("luaScript.Plugins.PluginIosDowloadManager"); | |||
local PluginWechat = require("luaScript.Plugins.PluginWechat"); | |||
local PluginWechatShare = require("luaScript.Plugins.PluginWechatShare"); | |||
local PluginYaya = require("luaScript.Plugins.PluginYaya"); | |||
local PluginGVoice = require("luaScript.Plugins.PluginGVoice"); | |||
local PluginZhuCheng = require("luaScript.Plugins.PluginZhuCheng"); | |||
local GlobalPlugin = class("GlobalPlugin"); | |||
function GlobalPlugin:ctor() | |||
-- 苹果支付插件 | |||
self.pluginIosPay = nil | |||
-- 微信 | |||
self.pluginWechat = nil; | |||
-- 微信分享 | |||
self.pluginWxShare = nil | |||
--yaya语音 | |||
self.pluginVoice = nil; | |||
--腾讯语音插件 | |||
self.pluginGVoice = nil | |||
-- GPS 定位插件 | |||
self.pluginGps = nil | |||
-- 初始化 | |||
self:init(); | |||
end | |||
function GlobalPlugin:init() | |||
-- 载入平台信息 | |||
local channelId = app.config.RomSetting.ChannelId; | |||
-- PC 版本强制设为100,防止配置错误导致的报错 | |||
if isWin32Platform() then | |||
channelId = 100 | |||
end | |||
if isAndroidPlatform() then | |||
self.pluginWechat = PluginWechat:new(); | |||
self.pluginVoice = PluginYaya:new(); | |||
self.pluginGps = PluginAndroidLocation:new() | |||
self.pluginDownloader = PluginAndroidDowloadManager:new() | |||
self.pluginPing = PluginAndroidPing:new() | |||
--self.pluginWxShare = PluginWechatShare:new() | |||
self.pluginGVoice = PluginGVoice:new() | |||
elseif isIOSPlatform() then | |||
self.pluginWechat = PluginWechat:new(); | |||
self.pluginVoice = PluginYaya:new(); | |||
self.pluginGps = PluginIosLocation:new(); | |||
self.pluginDownloader = PluginIosDowloadManager:new() | |||
--self.pluginWxShare = PluginWechatShare:new() | |||
self.pluginGVoice = PluginGVoice:new() | |||
if channelId == 105 then | |||
self.pluginIosPay = PluginIosPay:new(); | |||
end | |||
end | |||
-- 启动插件 | |||
self:start(); | |||
end | |||
-- 开启插件 | |||
function GlobalPlugin:start() | |||
-- 启动登陆插件 | |||
if self.pluginWechat then | |||
self.pluginWechat:start() | |||
end | |||
-- 下载SDK | |||
if self.pluginDownloader then | |||
self.pluginDownloader:start() | |||
end | |||
-- 网络监测 | |||
if self.pluginPing then | |||
self.pluginPing:start() | |||
end | |||
-- 定位 | |||
if self.pluginGps then | |||
local versionCode = getAppVersionName() | |||
log("versionCode:",versionCode) | |||
self.pluginGps:start() | |||
end | |||
end | |||
-- 注销账号 | |||
function GlobalPlugin:logout(tt) | |||
if not isWin32Platform() then | |||
app.userManager:clearUserList(); | |||
end | |||
cc.Application:getInstance():restart(); | |||
end | |||
-- 跳转网页 | |||
function GlobalPlugin:callUrl(url) | |||
logD("GlobalPlugin:callUrl(), url = ", url); | |||
if PluginDevice then | |||
PluginDevice:callVoid("openUrl", url); | |||
else | |||
logD("GlobalPlugin:callUrl(), PluginDevice is nil"); | |||
end | |||
end | |||
function GlobalPlugin:isShowThirdLogin() | |||
return self:isSupportWeiXin() | |||
end | |||
function GlobalPlugin:shareGame(tt, shareCallback) | |||
logD("GlobalPlugin:shareGame(), tt = ", table.tostring(tt)) | |||
if self.pluginWxShare then | |||
self:shareWxShare(tt, shareCallback) | |||
else | |||
self:shareWeiXin(tt, shareCallback) | |||
end | |||
end | |||
------------------------------------------- IosPay ------------------------------------------- | |||
function GlobalPlugin:startIosPay() | |||
logD("GlobalPlugin:startIosPay()") | |||
if self.pluginIosPay then | |||
self.pluginIosPay:start() | |||
else | |||
logD("GlobalPlugin:startIosPay(), self.pluginIosPay is nil") | |||
end | |||
end | |||
function GlobalPlugin:payIosPay(itemInfo) | |||
logD("GlobalPlugin:payIosPay(), tt = ", table.tostring(itemInfo)) | |||
if self.pluginIosPay then | |||
self.pluginIosPay:pay(itemInfo) | |||
else | |||
logD("GlobalPlugin:payIosPay(), self.pluginIosPay is nil") | |||
end | |||
end | |||
------------------------------------------- WeiXin ------------------------------------------- | |||
function GlobalPlugin:isSupportWeiXin() | |||
logD("GlobalPlugin:isSupportWeiXin()") | |||
if self.pluginWechat then | |||
local result = self.pluginWechat:isSupport() | |||
logD("GlobalPlugin:isSupportWeiXin(), result = ", tostring(result)) | |||
return result | |||
else | |||
logD("GlobalPlugin:isSupportWeiXin(), self.pluginWechat is nil") | |||
return false | |||
end | |||
end | |||
function GlobalPlugin:gotoWeiXin() | |||
logD("GlobalPlugin:gotoWeiXin()") | |||
if self.pluginWechat then | |||
self.pluginWechat:gotoWeiXin(); | |||
else | |||
logD("GlobalPlugin:gotoWeiXin(), self.pluginWechat is nil") | |||
end | |||
end | |||
function GlobalPlugin:loginWeiXin(tt) | |||
logD("GlobalPlugin:loginWeiXin(), tt = ", table.tostring(tt)) | |||
if self.pluginWechat then | |||
self.pluginWechat:login(tt); | |||
else | |||
logD("GlobalPlugin:loginWeiXin(), self.pluginWechat is nil") | |||
end | |||
end | |||
function GlobalPlugin:payWeiXin(tt) | |||
logD("GlobalPlugin:payWeiXin(), tt = ", table.tostring(tt)) | |||
if self.pluginWechat then | |||
self.pluginWechat:pay(tt); | |||
else | |||
logD("GlobalPlugin:payWeiXin(), self.pluginWechat is nil") | |||
end | |||
end | |||
function GlobalPlugin:shareWeiXin(tt, callback) | |||
logD("GlobalPlugin:shareWeiXin(), tt = ", table.tostring(tt)) | |||
if self.pluginWechat then | |||
self.pluginWechat:shareGame(tt, callback) | |||
else | |||
logD("GlobalPlugin:shareWeiXin(), self.pluginWechat is nil") | |||
end | |||
end | |||
-- 显示微信下载的对话框 | |||
function GlobalPlugin:showWeiXinDownloadDialog() | |||
local text = "未安装【微信】,是否前往下载【微信】?" | |||
local okBtnImage = "res/ui/zy_tongyong/zy_button/btn_like_xiazai.png" | |||
local okCallBack = function() | |||
app.plugin:callUrl("http://weixin.qq.com/"); | |||
end | |||
local cancelCallBack = function() | |||
end | |||
showConfirmDialog(text, okCallBack, cancelCallBack, 26, okBtnImage) | |||
return; | |||
end | |||
------------------------------------------- wxshare ------------------------------------------- | |||
-- 初始化微信分享 | |||
function GlobalPlugin:initWxShare( appid, secret ) | |||
logD("GlobalPlugin:initWxShare(), appid = "..appid..", secret = "..secret) | |||
if isWin32Platform() then | |||
logD("GlobalPlugin:initWxShare(), win32") | |||
return | |||
end | |||
if isReviewVersion() then | |||
logD("GlobalPlugin:initWxShare(), review version") | |||
return | |||
end | |||
local PluginConfig = require("preload.PluginConfig") | |||
if PluginConfig and PluginConfig.isAppStoreVersion then | |||
-- 苹果商城的版本因为包名发生了变化,是不能使用多微信分享的。 | |||
return | |||
end | |||
if not self.pluginWxShare then | |||
self.pluginWxShare = PluginWechatShare:new() | |||
end | |||
if self.pluginWxShare then | |||
self.pluginWxShare:start(appid, secret); | |||
end | |||
end | |||
function GlobalPlugin:shareWxShare(tt, callback) | |||
logD("GlobalPlugin:shareWxShare(), tt = ", table.tostring(tt)) | |||
if self.pluginWxShare then | |||
self.pluginWxShare:shareGame(tt, callback) | |||
else | |||
logD("GlobalPlugin:shareWxShare(), self.pluginWxShare is nil") | |||
end | |||
end | |||
------------------------------------------- voice ------------------------------------------- | |||
-- 成功登陆到游戏 | |||
function GlobalPlugin:startVoice() | |||
logD("GlobalPlugin:startVoice()") | |||
if self.pluginVoice then | |||
self.pluginVoice:start() | |||
else | |||
logD("GlobalPlugin:startVoice(), self.pluginVoice is nil") | |||
end | |||
end | |||
-- 开始录音 | |||
function GlobalPlugin:startRecord() | |||
logD("GlobalPlugin:startRecord()") | |||
if self.pluginVoice then | |||
self.pluginVoice:startRecord() | |||
else | |||
logD("GlobalPlugin:startRecord(), self.pluginVoice is nil") | |||
end | |||
end | |||
-- 结束录音 | |||
function GlobalPlugin:stopRecord() | |||
logD("GlobalPlugin:stopRecord()") | |||
if self.pluginVoice then | |||
self.pluginVoice:stopRecord() | |||
else | |||
logD("GlobalPlugin:stopRecord(), self.pluginVoice is nil") | |||
end | |||
end | |||
-- 取消录音 | |||
function GlobalPlugin:cancelRecord() | |||
logD("GlobalPlugin:cancelRecord()") | |||
if self.pluginVoice then | |||
self.pluginVoice:cancelRecord() | |||
else | |||
logD("GlobalPlugin:cancelRecord(), self.pluginVoice is nil") | |||
end | |||
end | |||
-- 播放录音 | |||
function GlobalPlugin:playRecord(filePath) | |||
log("GlobalPlugin:playRecord(), filePath = ", filePath); | |||
if self.pluginVoice then | |||
self.pluginVoice:playRecord(filePath) | |||
else | |||
logD("GlobalPlugin:playRecord(), self.pluginVoice is nil") | |||
end | |||
end | |||
-- 停止播放录音 | |||
function GlobalPlugin:stopPlayRecord() | |||
log("GlobalPlugin:stopPlayRecord() "); | |||
if self.pluginVoice then | |||
self.pluginVoice:stopPlayRecord() | |||
else | |||
logD("GlobalPlugin:stopPlayRecord(), self.pluginVoice is nil") | |||
end | |||
end | |||
-- 下载录音 | |||
function GlobalPlugin:downloadRecord(nUserId, recordUrl, downloadCallback) | |||
log("GlobalPlugin:downloadRecord(), nUserId = " .. nUserId .. ", recordUrl = " .. recordUrl); | |||
if self.pluginVoice then | |||
self.pluginVoice:downloadRecord(nUserId, recordUrl, downloadCallback); | |||
else | |||
logD("GlobalPlugin:downloadRecord(), self.pluginVoice is nil") | |||
end | |||
end | |||
------------------------------------------- gvoice ------------------------------------------- | |||
-- 成功登陆到游戏 | |||
function GlobalPlugin:startGVoice() | |||
logD("GlobalPlugin:startGVoice()") | |||
if self.pluginGVoice then | |||
self.pluginGVoice:start() | |||
else | |||
logD("GlobalPlugin:startGVoice(), self.pluginGVoice is nil") | |||
end | |||
end | |||
function GlobalPlugin:ApplyMessageKey() | |||
logD("GlobalPlugin:ApplyMessageKey()") | |||
if self.pluginGVoice then | |||
self.pluginGVoice:ApplyMessageKey() | |||
else | |||
logD("GlobalPlugin:ApplyMessageKey(), self.pluginGVoice is nil") | |||
end | |||
end | |||
-- 开始录音 | |||
function GlobalPlugin:startGRecord() | |||
logD("GlobalPlugin:startGRecord()") | |||
if self.pluginGVoice then | |||
self.pluginGVoice:startRecord() | |||
else | |||
logD("GlobalPlugin:startGRecord(), self.pluginGVoice is nil") | |||
end | |||
end | |||
-- 结束录音 | |||
function GlobalPlugin:stopGRecord() | |||
logD("GlobalPlugin:stopGRecord()") | |||
if self.pluginGVoice then | |||
self.pluginGVoice:stopRecord() | |||
else | |||
logD("GlobalPlugin:stopGRecord(), self.pluginGVoice is nil") | |||
end | |||
end | |||
-- 取消录音 | |||
function GlobalPlugin:cancelGRecord() | |||
logD("GlobalPlugin:cancelGRecord()") | |||
if self.pluginGVoice then | |||
self.pluginGVoice:cancelRecord() | |||
else | |||
logD("GlobalPlugin:cancelGRecord(), self.pluginGVoice is nil") | |||
end | |||
end | |||
-- 播放录音 | |||
function GlobalPlugin:playGRecord(fileId) | |||
log("GlobalPlugin:playGRecord(), fileId = ", fileId); | |||
if self.pluginGVoice then | |||
self.pluginGVoice:playRecord(fileId) | |||
else | |||
logD("GlobalPlugin:playGRecord(), self.pluginGVoice is nil") | |||
end | |||
end | |||
-- 停止播放录音 | |||
function GlobalPlugin:stopGPlayRecord() | |||
log("GlobalPlugin:stopGPlayRecord() "); | |||
if self.pluginGVoice then | |||
self.pluginGVoice:stopPlayRecord() | |||
else | |||
logD("GlobalPlugin:stopGPlayRecord(), self.pluginGVoice is nil") | |||
end | |||
end | |||
-- 下载录音 | |||
-- function GlobalPlugin:downloadGRecord(nfileID, nUserId, filePath, downloadCallback) | |||
-- log("GlobalPlugin:downloadGRecord(), nfileID = " .. nfileID .. ", nUserId = " .. nUserId .. ", filePath = " .. filePath); | |||
function GlobalPlugin:downloadGRecord(nUserId, nfileID, downloadCallback) | |||
log("GlobalPlugin:downloadGRecord(), nUserId = " .. nUserId .. ", nfileID = " .. nfileID); | |||
if self.pluginGVoice then | |||
-- self.pluginGVoice:downloadRecord(nfileID, nUserId, filePath, downloadCallback); | |||
self.pluginGVoice:downloadRecord(nUserId, nfileID, downloadCallback); | |||
else | |||
logD("GlobalPlugin:downloadGRecord(), self.pluginGVoice is nil") | |||
end | |||
end | |||
-- 加入房间 | |||
function GlobalPlugin:JoinRoom(room) | |||
log("GlobalPlugin:JoinRoom(), room = ", room); | |||
if self.pluginGVoice then | |||
self.pluginGVoice:JoinRoom(room) | |||
else | |||
logD("GlobalPlugin:JoinRoom(), self.pluginGVoice is nil") | |||
end | |||
end | |||
-- 退出房间 | |||
function GlobalPlugin:QuitRoom(room) | |||
log("GlobalPlugin:QuitRoom(), room = ", room); | |||
if self.pluginGVoice then | |||
self.pluginGVoice:QuitRoom(room) | |||
else | |||
logD("GlobalPlugin:QuitRoom(), self.pluginGVoice is nil") | |||
end | |||
end | |||
-- 开启麦克风 | |||
function GlobalPlugin:OpenMic() | |||
log("GlobalPlugin:OpenMic() "); | |||
if self.pluginGVoice then | |||
self.pluginGVoice:OpenMic() | |||
else | |||
logD("GlobalPlugin:OpenMic(), self.pluginGVoice is nil") | |||
end | |||
end | |||
-- 关闭麦克风 | |||
function GlobalPlugin:CloseMic() | |||
log("GlobalPlugin:CloseMic() "); | |||
if self.pluginGVoice then | |||
self.pluginGVoice:CloseMic() | |||
else | |||
logD("GlobalPlugin:CloseMic(), self.pluginGVoice is nil") | |||
end | |||
end | |||
-- 开启扬声器 | |||
function GlobalPlugin:OpenSpeaker() | |||
log("GlobalPlugin:OpenSpeaker() "); | |||
if self.pluginGVoice then | |||
self.pluginGVoice:OpenSpeaker() | |||
else | |||
logD("GlobalPlugin:OpenSpeaker(), self.pluginGVoice is nil") | |||
end | |||
end | |||
-- 关闭扬声器 | |||
function GlobalPlugin:CloseSpeaker() | |||
log("GlobalPlugin:CloseSpeaker() "); | |||
if self.pluginGVoice then | |||
self.pluginGVoice:CloseSpeaker() | |||
else | |||
logD("GlobalPlugin:CloseSpeaker(), self.pluginGVoice is nil") | |||
end | |||
end | |||
function GlobalPlugin:OnApplicationPause() | |||
log("GlobalPlugin:OnApplicationPause() "); | |||
if self.pluginGVoice then | |||
self.pluginGVoice:OnApplicationPause() | |||
else | |||
logD("GlobalPlugin:OnApplicationPause(), self.pluginGVoice is nil") | |||
end | |||
end | |||
function GlobalPlugin:Update() | |||
-- log("GlobalPlugin:Update() "); | |||
if self.pluginGVoice then | |||
self.pluginGVoice:Update() | |||
else | |||
-- logD("GlobalPlugin:Update(), self.pluginGVoice is nil") | |||
end | |||
end | |||
------------------------------------------- gps ------------------------------------------- | |||
-- 更新GPS位置信息 | |||
function GlobalPlugin:updateLocation() | |||
logD("GlobalPlugin:updateLocation()") | |||
if self.pluginGps then | |||
self.pluginGps:updateLocation() | |||
else | |||
logD("GlobalPlugin:updateLocation() self.pluginGps is nil") | |||
end | |||
end | |||
-- 获取当前的GPS位置信息 | |||
function GlobalPlugin:getLocationInfo() | |||
logD("GlobalPlugin:getLocationInfo()") | |||
if self.pluginGps then | |||
return self.pluginGps:getLocationInfo() | |||
else | |||
logD("GlobalPlugin:getLocationInfo() self.pluginGps is nil") | |||
end | |||
end | |||
-- 获取定位服务开启状态 | |||
function GlobalPlugin:getLocationEnable() | |||
logD("GlobalPlugin:getLocationEnable()") | |||
if self.pluginGps then | |||
local status = self.pluginGps:getLocationEnable() | |||
logD("GlobalPlugin:getLocationEnable(), status = ", tostring(status)) | |||
return status | |||
else | |||
logD("GlobalPlugin:getLocationEnable() self.pluginGps is nil") | |||
return false | |||
end | |||
end | |||
-- 前往打开GPS | |||
function GlobalPlugin:openGPS() | |||
logD("GlobalPlugin:openGPS()"); | |||
if self.pluginGps then | |||
self.pluginGps:openGPS(); | |||
else | |||
logD("GlobalPlugin:openGPS() self.pluginGps is nil") | |||
end | |||
end | |||
------------------------------------------- ping ------------------------------------------- | |||
function GlobalPlugin:startPing() | |||
logD("GlobalPlugin:startPing()") | |||
if self.pluginPing then | |||
return self.pluginPing:startPing() | |||
else | |||
logD("GlobalPlugin:startPing(), self.pluginPing is nil") | |||
end | |||
end | |||
function GlobalPlugin:stopPing() | |||
logD("GlobalPlugin:stopPing()") | |||
if self.pluginPing then | |||
return self.pluginPing:stopPing() | |||
else | |||
logD("GlobalPlugin:stopPing(), self.pluginPing is nil") | |||
end | |||
end | |||
function GlobalPlugin:getPing() | |||
logD("GlobalPlugin:getPing()") | |||
if self.pluginPing then | |||
local result = self.pluginPing:getPing() | |||
logD("GlobalPlugin:getPing(), result = ", result) | |||
return result | |||
else | |||
logD("GlobalPlugin:getPing(), self.pluginPing is nil") | |||
return 0 | |||
end | |||
end | |||
------------------------------------------- downloader ------------------------------------------- | |||
function GlobalPlugin:createTask(url,path,onFinish,onProgress) | |||
logD("GlobalPlugin:createTask(), url = " .. url .. ", path = " .. path) | |||
if self.pluginDownloader then | |||
self.pluginDownloader:createTask(url,path,onFinish,onProgress) | |||
else | |||
logD("GlobalPlugin:createTask(), self.pluginDownloader is nil") | |||
end | |||
end | |||
return GlobalPlugin |
@@ -0,0 +1,4 @@ | |||
function gotoMainView(gameid,clubid) | |||
app:gotoView(import("luaScript.Views.Main.MainView"):new(gameid)) | |||
end |
@@ -0,0 +1,85 @@ | |||
--- | |||
-- ================================================================ | |||
-- 文件名: IClub.lua | |||
-- 描述: 亲友圈相关接口 | |||
-- 版权: Copyright © 2016-2019 公司名称 版权所有 | |||
-- 作者: Administrator | |||
-- 创建日期: 2019-10-22 | |||
-- 更新日期: 2019-10-22 | |||
-- 备注: | |||
-- ================================================================ | |||
-- | |||
local IClub = {} | |||
function IClub.getClubPhp () | |||
return app.club_php | |||
end | |||
--- | |||
-- 获取当前亲友圈id | |||
-- @return | |||
-- | |||
function IClub.getCurrentClubId () | |||
return app.club_php.clubID and tonumber(app.club_php.clubID) or 0 | |||
end | |||
--- | |||
-- 获取当前亲友圈数据 | |||
-- @return | |||
-- | |||
function IClub.getCurrentClubInfo() | |||
local clubId = IClub.getCurrentClubId() | |||
return IClub.getClubInfo(clubId) | |||
end | |||
--- | |||
-- 获取指定亲友圈数据 | |||
-- @param clubId | |||
-- @return | |||
-- | |||
function IClub.getClubInfo(clubId) | |||
local clubInfo = app.club_php:getClubInfo(clubId) | |||
return clubInfo | |||
end | |||
--- | |||
-- 当前是否在亲友圈里 | |||
-- @return | |||
-- | |||
function IClub.isInClub () | |||
return app.club_php.clubID and app.club_php.clubID ~= 0 | |||
end | |||
--- | |||
-- 是否可以解散房间 | |||
-- @return | |||
-- | |||
function IClub.getCanDismiss (callBack) | |||
if not IClub.isInClub() then | |||
return 1 | |||
end | |||
local clubInfo = IClub.getCurrentClubInfo() | |||
if not clubInfo then | |||
local clubId = IClub.getCurrentClubId() | |||
app.club_php:requestClubHomeInGame(clubId, function ( res ) | |||
local groupext = res.groupext or {} | |||
local playext = groupext.playext or {} | |||
logD("IClub.getCanDismiss", res.groupext) | |||
if type(callBack) == "function" then | |||
callBack({canDismiss = playext.can_dismiss}) | |||
end | |||
end) | |||
return | |||
end | |||
local groupext = clubInfo.groupext or {} | |||
local playext = groupext.playext or {} | |||
return playext.can_dismiss or 1 | |||
end | |||
function IClub.isAdmin() | |||
local clubInfo = IClub.getCurrentClubInfo() | |||
if not clubInfo then | |||
return false | |||
end | |||
local role = clubInfo.role | |||
local isAdmin = role == 2 or role == 3 | |||
return isAdmin | |||
end | |||
return IClub |
@@ -0,0 +1,51 @@ | |||
--- | |||
-- ================================================================ | |||
-- 文件名: IGameCommon.lua | |||
-- 描述: 子游戏引用大厅接口 | |||
-- 作者: Administrator | |||
-- 创建日期: 2020-2-18 | |||
-- 更新日期: 2020-2-18 | |||
-- 备注: | |||
-- ================================================================ | |||
-- | |||
local IGameCommon = {}; | |||
--[[ | |||
获取分享的二维码图片 | |||
]] | |||
function IGameCommon.getShareCRCodeTexture(callback) | |||
local clientConfig = app.serverConfigs.clientConfig | |||
local crCodeUrl = clientConfig and clientConfig.qrcode or "" | |||
if crCodeUrl == "" then | |||
showTooltip("未配置二维码地址") | |||
return | |||
end | |||
--download | |||
local urlfile = convertIconUrl(crCodeUrl) | |||
local fileName = getImageNameFromUrl(urlfile) | |||
local fullPath = cc.FileUtils:getInstance():getWritablePath()..fileName; | |||
local isExist = cc.FileSystem:fileExists(fullPath) | |||
if not isExist then | |||
getImageFromUrlWithTime(crCodeUrl, fileName, nil, function() | |||
local texture = loadTextureFromFile(fileName) | |||
if not texture then | |||
logD("IGameCommon getShareCRCodeTexture not found") | |||
return | |||
end | |||
if callback then | |||
callback(texture) | |||
end | |||
end) | |||
else | |||
local texture = loadTextureFromFile(fileName) | |||
if not texture then | |||
logD("IGameCommon getShareCRCodeTexture not found") | |||
return | |||
end | |||
if callback then | |||
callback(texture) | |||
end | |||
end | |||
end | |||
return IGameCommon; |
@@ -0,0 +1,30 @@ | |||
--- | |||
-- ================================================================ | |||
-- 文件名: IGameOverAward.lua | |||
-- 描述: 排名赛抽奖接口 | |||
-- 版权: Copyright © 2016-2019 公司名称 版权所有 | |||
-- 作者: Administrator | |||
-- 创建日期: 2019-10-22 | |||
-- 更新日期: 2019-10-22 | |||
-- 备注: | |||
-- ================================================================ | |||
-- | |||
local IGameOverAward = {} | |||
IGameOverAward.chouJiangData = nil | |||
function IGameOverAward.setAwardData(data) | |||
IGameOverAward.chouJiangData = data | |||
end | |||
function IGameOverAward.showAwardView() | |||
if not IGameOverAward.chouJiangData then | |||
return | |||
end | |||
local view = import("luaScript.Views.Club.Match.ClubMatchChouJiang"):new(IGameOverAward.chouJiangData) | |||
view:setAnchorPoint(cc.p(0.5, 0.5)) | |||
app:showWaitDialog(view) | |||
end | |||
return IGameOverAward |
@@ -0,0 +1,245 @@ | |||
--- | |||
-- ================================================================ | |||
-- 文件名: IPlayGameAgain.lua | |||
-- 描述: 子游戏结算再来一局功能接口 | |||
-- 版权: Copyright © 2016-2019 公司名称 版权所有 | |||
-- 作者: Administrator | |||
-- 创建日期: 2019-10-22 | |||
-- 更新日期: 2019-10-22 | |||
-- 备注: | |||
-- ================================================================ | |||
-- | |||
local IPlayGameAgain = {}; | |||
IPlayGameAgain.isAgainGameBol = false -- 是否再来一局 | |||
IPlayGameAgain.wanfa = "" -- 子游戏玩法 | |||
IPlayGameAgain.uidList = {} -- 待邀请玩家列表 | |||
IPlayGameAgain.isAgainGameBaoJianId = -1 -- 再来一局包间ID | |||
IPlayGameAgain.isAgainGameData = nil -- 再来一局接受邀请数据 | |||
IPlayGameAgain.isGameRuleChange = false -- 再来一局包间玩法是否被修改 | |||
IPlayGameAgain.gameRoomId = 0 -- 再来一局包间id | |||
IPlayGameAgain.myGameCreateStatus = false -- 玩家是否创建过房间 | |||
IPlayGameAgain.inviteView = nil -- 邀请框 | |||
function IPlayGameAgain.bindPlayAgainButton (btnPlayAgain, gameId, inviteInfo, inviteList, initCallback) | |||
local clubId = app.club_php.clubID or 0 | |||
local isInClub = clubId and clubId ~= 0 | |||
if not isInClub then | |||
logD("IPlayGameAgain.initPlayGameAgain", "当前玩家不在亲友圈内,不能再来一局"); | |||
btnPlayAgain:setVisible(false) | |||
return | |||
end | |||
if tolua.isnull(btnPlayAgain) then | |||
logD("IPlayGameAgain.bindPlayAgainButton", "再来一局按钮已经被释放") | |||
return | |||
end | |||
local isClosePlayAgain = IPlayGameAgain.isClosePlayAgain(gameId) | |||
btnPlayAgain:setVisible(not isClosePlayAgain) | |||
if isClosePlayAgain then | |||
if type(initCallback) == "function" then | |||
initCallback() | |||
end | |||
return | |||
end | |||
btnPlayAgain:registerClick(function () | |||
logD("===================inviteList==================:",table.tostring(inviteList)) | |||
IPlayGameAgain.setIsAgainGamebol(true, inviteInfo, inviteList) | |||
gotoMainView() | |||
end) | |||
local clubInfo = app.club_php:getClubInfo(clubId) | |||
if not clubInfo then | |||
logD("IPlayGameAgain.bindPlayAgainButton", "亲友圈信息不存在", "clubId:", clubId) | |||
if type(initCallback) == "function" then | |||
initCallback() | |||
end | |||
return | |||
end | |||
local baoJianId = IPlayGameAgain.getAgainGameBaoJianId() | |||
if baoJianId ~= -1 and clubInfo.settings and tonumber(clubInfo.settings.baoJianId) ~= tonumber(baoJianId) and clubInfo.mode == 0 then | |||
app.club_php:requestRuleSet(app.club_php.clubID, baoJianId, 1, 1) | |||
end | |||
if type(initCallback) == "function" then | |||
initCallback() | |||
end | |||
end | |||
--- | |||
-- 收到再来一局邀请信息时,弹出邀请弹框 | |||
-- @param data | |||
-- @return | |||
-- | |||
function IPlayGameAgain.showClubInviteDialog (data, agreeCallback, closeCallback) | |||
--房间邀请通知 | |||
local content = data.content | |||
local clubId = data.clubId | |||
local inviteView = IPlayGameAgain.inviteView | |||
local viewType = type(inviteView) | |||
if inviteView and viewType == "userdata" then | |||
--提示框已存在 | |||
return | |||
end | |||
local function removeInviteView() | |||
if not tolua.isnull(IPlayGameAgain.inviteView) then | |||
-- IPlayGameAgain.inviteView:removeFromParent() | |||
IPlayGameAgain.inviteView = nil | |||
end | |||
end | |||
local function onBtnCloseClicked() | |||
--关闭提示框时清空数据,用于下次弹出 | |||
removeInviteView() | |||
if type(closeCallback) == "function" then | |||
closeCallback() | |||
end | |||
end | |||
local function onBtnAgreeClicked() | |||
removeInviteView() | |||
gotoMainView() | |||
if type(agreeCallback) == "function" then | |||
agreeCallback() | |||
end | |||
end | |||
inviteView = import("luaScript.Views.Club.ClubInviteRoomNew"):new(clubId, content, onBtnCloseClicked, onBtnAgreeClicked) | |||
inviteView:setAnchorPoint(cc.p(0.5, 0.5)) | |||
app:showWaitDialog(inviteView,0) | |||
IPlayGameAgain.inviteView = inviteView | |||
end | |||
--- | |||
-- 是否关闭再来一局功能 | |||
-- 默认关闭 | |||
-- @return | |||
-- | |||
function IPlayGameAgain.isClosePlayAgain (gameId) | |||
local isClosePlayAgain = true | |||
local config = getSubGameConfig(gameId) | |||
if not config then | |||
logD("IPlayGameAgain.isClosePlayAgain", "读取子游戏配置为空") | |||
return isClosePlayAgain | |||
end | |||
if config.gameDataConfig and config.gameDataConfig.isClosePlayAgain ~= nil then | |||
logD("IPlayGameAgain.isClosePlayAgain", "子游戏再来一局功能已打开") | |||
isClosePlayAgain = config.gameDataConfig.isClosePlayAgain == true | |||
end | |||
return isClosePlayAgain | |||
end | |||
--- | |||
-- 设置是否再来一局 | |||
-- @param bol 是否再来一局 | |||
-- @param wanfadata 子游戏玩法 | |||
-- @param uidList 待邀请玩家列表 | |||
-- @return | |||
-- | |||
function IPlayGameAgain.setIsAgainGamebol(bol, wanfadata, uidList) | |||
logD("IPlayGameAgain.setIsAgainGamebol") | |||
IPlayGameAgain.isAgainGameBol = bol | |||
if wanfadata then | |||
IPlayGameAgain.wanfa = wanfadata | |||
end | |||
if uidList then | |||
IPlayGameAgain.uidList = uidList or {} | |||
end | |||
end | |||
--- | |||
-- 是否再来一局 | |||
-- @return | |||
-- | |||
function IPlayGameAgain.getIsAgainGamebol() | |||
return IPlayGameAgain.isAgainGameBol, IPlayGameAgain.wanfa, IPlayGameAgain.uidList; | |||
end | |||
--- | |||
-- 再来一局包间id | |||
-- @param idx | |||
-- @return | |||
-- | |||
function IPlayGameAgain.setAgainGameBaoJianId(idx) | |||
IPlayGameAgain.isAgainGameBaoJianId = idx | |||
end | |||
--- | |||
-- 获取再来一局包间id | |||
-- @return | |||
-- | |||
function IPlayGameAgain.getAgainGameBaoJianId() | |||
return IPlayGameAgain.isAgainGameBaoJianId; | |||
end | |||
--- | |||
-- 保存再来一局接受邀请数据 | |||
-- @param data | |||
-- @return | |||
-- | |||
function IPlayGameAgain.setAgainGameInvitedata(data) | |||
IPlayGameAgain.isAgainGameData = data | |||
end | |||
--- | |||
-- 获取再来一局接受邀请数据 | |||
-- @return | |||
-- | |||
function IPlayGameAgain.getAgainGameInvitedata() | |||
return IPlayGameAgain.isAgainGameData; | |||
end | |||
--- | |||
-- 保存再来一局玩法状态 | |||
-- 检测点再来一局的时候,玩法是否被修改。如果是修改那么提示创建失败。 | |||
-- @param bol | |||
-- @return | |||
-- | |||
function IPlayGameAgain.setRuleChangeStatus(bol) | |||
IPlayGameAgain.isGameRuleChange = bol | |||
end | |||
--- | |||
-- 获取再来一局玩法状态 | |||
-- 检测点再来一局的时候,玩法是否被修改。如果是修改那么提示创建失败。 | |||
-- @return | |||
-- | |||
function IPlayGameAgain.getRuleChangeStatus() | |||
return IPlayGameAgain.isGameRuleChange | |||
end | |||
--- | |||
-- 保存房间id | |||
-- 邀请的时候需要用到数据 | |||
-- @param idx | |||
-- @return | |||
-- | |||
function IPlayGameAgain.setGameRoomId(idx) | |||
IPlayGameAgain.gameRoomId = idx | |||
end | |||
--- | |||
-- 获取房间id | |||
-- @return | |||
-- | |||
function IPlayGameAgain.getGameRoomId() | |||
return IPlayGameAgain.gameRoomId; | |||
end | |||
--- | |||
-- 保存玩家是否创建过房间 | |||
-- @param bol | |||
-- @return | |||
-- | |||
function IPlayGameAgain.setMyGameCreateStatus(bol) | |||
IPlayGameAgain.myGameCreateStatus = bol | |||
end | |||
--- | |||
-- 获取玩家是否创建过房间 | |||
-- @return | |||
-- | |||
function IPlayGameAgain.getMyGameCreateStatus() | |||
return IPlayGameAgain.myGameCreateStatus; | |||
end | |||
return IPlayGameAgain; |
@@ -0,0 +1,7 @@ | |||
dd = dd or {} | |||
dd.IClub = require("luaScript.Interface.IClub") | |||
dd.IPlayGameAgain = require("luaScript.Interface.IPlayGameAgain"); | |||
dd.IGameOverAward = require("luaScript.Interface.IGameOverAward"); | |||
dd.IGameCommon = require("luaScript.Interface.IGameCommon"); |
@@ -0,0 +1,92 @@ | |||
MJFramework={} | |||
local paths={} | |||
local files={} | |||
function MJFramework.MJImport(name,gameId) | |||
local fileName=string.gsub(name, "%.", "/") | |||
local gameConfig = getSubGameConfig(gameId or app.gameId) | |||
local rootName=gameConfig.rootName | |||
local findMjHsb = string.find(name, 'mj_hsb') | |||
-- 判断是否有旧mj_hsb路径 | |||
if not findMjHsb then | |||
local newFileName=string.gsub(fileName, "MJ", gameConfig.fileName) | |||
newFileName=string.gsub(newFileName, "mj", rootName) | |||
local newName=string.gsub(name, "MJ", gameConfig.fileName) | |||
newName=string.gsub(newName, "mj", rootName) | |||
local luaFile = newFileName..".lua" | |||
local luacFile = newFileName..".luac" | |||
local isFileExist = cc.FileUtils:getInstance():isFileExist(luacFile) | |||
if not isFileExist then | |||
isFileExist = cc.FileUtils:getInstance():isFileExist(luaFile) | |||
end | |||
if isFileExist then | |||
name=newName | |||
end | |||
else | |||
local newFileName=string.gsub(fileName, "MJ", gameConfig.fileName) | |||
newFileName=string.gsub(newFileName, "mj_hsb", rootName) | |||
local newName=string.gsub(name, "MJ", gameConfig.fileName) | |||
newName=string.gsub(newName, "mj_hsb", rootName) | |||
local luaFile = newFileName..".lua" | |||
local luacFile = newFileName..".luac" | |||
local isFileExist = cc.FileUtils:getInstance():isFileExist(luacFile) | |||
if not isFileExist then | |||
isFileExist = cc.FileUtils:getInstance():isFileExist(luaFile) | |||
end | |||
if isFileExist then | |||
name=newName | |||
end | |||
end | |||
files[name]=true | |||
print("MJImport:"..name) | |||
return require(name) | |||
end | |||
function MJFramework.ImportWanFa(name,gameId) | |||
local fileName=string.gsub(name, "%.", "/") | |||
local gameConfig = getSubGameConfig(gameId or app.gameId) | |||
local rootName=gameConfig.rootName | |||
local newFileName=string.gsub(fileName, "MJ", gameConfig.fileName) | |||
local newName=string.gsub(name, "MJ", gameConfig.fileName) | |||
local luaFile = newFileName..".lua" | |||
local luacFile = newFileName..".luac" | |||
local isFileExist = cc.FileUtils:getInstance():isFileExist(luacFile) | |||
if not isFileExist then | |||
isFileExist = cc.FileUtils:getInstance():isFileExist(luaFile) | |||
end | |||
if isFileExist then | |||
name=newName | |||
end | |||
print("ImportWanFa:"..name) | |||
files[name]=true | |||
return require(name) | |||
end | |||
function MJFramework.Clean() | |||
for fileName,v in pairs(files) do | |||
print("Clean:"..fileName) | |||
package.loaded[fileName] = nil | |||
end | |||
files={} | |||
end | |||
function MJFramework.MJFrameworkClassImprot(name) | |||
print("MJFrameworkClassImprot:"..name) | |||
files[name]=true | |||
return require(name) | |||
end |
@@ -0,0 +1,299 @@ | |||
local Map = class("Map"); | |||
require("luaScript.Map.MapDrawer")(Map); | |||
Map.ObstacleType = | |||
{ | |||
-- 不是障碍块 | |||
ObstacleNone = 1, | |||
-- 是障碍块 | |||
ObstacleNormal = 0, | |||
} | |||
-- TileWidth | |||
Map.TileWidth = 60 | |||
-- tileHeight | |||
Map.TileHeight = 30 | |||
-- 构造函数 | |||
function Map:ctor() | |||
-- 默认构造一个1136 X 640的地图 | |||
-- self:initWidthAndHeight(1136, 640, 60, 30); | |||
-- 障碍信息 | |||
self.obstacles = cc.CAStar:new(); | |||
-- 当障碍块改变时回调 | |||
self.ObstacleChanged = nil; | |||
end | |||
-- 重新计算地图 | |||
function Map:recalculate() | |||
self.TileHalfWidth = self.TileWidth / 2; | |||
self.TileHalfHeight = self.TileHeight / 2; | |||
-- 根据地图大小和tile的大小,计算tile的个数以及tile的偏移 | |||
local widthLen = math.ceil(self.MapWidth / self.TileWidth); | |||
local heightLen = math.ceil(self.MapHeight / self.TileHeight); | |||
self.TileCountX = widthLen + heightLen; | |||
self.TileCountY = widthLen + heightLen; | |||
-- X轴不需要偏移,只偏移Y轴 | |||
self.OffsetX = 0; | |||
self.OffsetY = heightLen; | |||
end | |||
-- 初始化地图的宽度和高度 | |||
function Map:initWidthAndHeight(width, height, tileWidth, tileHeight) | |||
self.MapWidth = width; | |||
self.MapHeight = height; | |||
self.TileWidth = tileWidth; | |||
self.TileHeight = tileHeight; | |||
-- 重新计算地图 | |||
self:recalculate(); | |||
end | |||
-- 初始化障碍块 | |||
function Map:initObstacles() | |||
self.obstacles:resize(self.TileCountX , self.TileCountY); | |||
end | |||
-- 增加一个障碍块 | |||
-- x y 为逻辑坐标 | |||
function Map:addObstacle(x, y) | |||
-- 如果不在地图内则添加不成功 | |||
if self:isInMap(x, y) == false or self:isObstacle(x, y) then | |||
return | |||
end | |||
self.obstacles:setBlock(x , y , Map.ObstacleType.ObstacleNormal); | |||
if self.ObstacleChanged then | |||
self.ObstacleChanged(x , y , Map.ObstacleType.ObstacleNormal); | |||
end | |||
end | |||
-- 删除一个障碍块 | |||
-- x y 为逻辑坐标 | |||
function Map:removeObstacle(x, y) | |||
if self:isInMap(x, y) then | |||
self.obstacles:setBlock(x , y , Map.ObstacleType.ObstacleNone); | |||
if self.ObstacleChanged then | |||
self.ObstacleChanged(x , y , Map.ObstacleType.ObstacleNone); | |||
end | |||
end | |||
end | |||
-- 判断一个点是否是障碍点 | |||
-- x y 为逻辑坐标 | |||
function Map:isObstacle(x, y) | |||
if self:isInMap(x, y) then | |||
return self.obstacles:isBlock(x,y); | |||
end | |||
return false; | |||
end | |||
-- 根据点的坐标或者障碍数据 | |||
function Map:getObstacle(x, y) | |||
if self:isInMap(x, y) == false then | |||
return 0; | |||
end | |||
return self.obstacles:getBlock(x,y); | |||
end | |||
-- 判断一个坐标点是否在地图内 | |||
function Map:isInMap(x, y) | |||
if x < 0 or y < 0 then | |||
print("x or y is less 0", "current x is", x, "current y is", y); | |||
return false; | |||
end | |||
if x >= self.TileCountX or y >= self.TileCountY then | |||
print("Map:TileCountX is", self.TileCountX, " current x is", x); | |||
print("Map:TileCountY is", self.TileCountY, " current y is", y); | |||
return false; | |||
end | |||
return true; | |||
end | |||
function Map:loadFromLuaNode(luaNode) | |||
-- 初始化地图数据 | |||
self:initWidthAndHeight(tonumber(luaNode.width), tonumber(luaNode.height), tonumber(luaNode.tileWidth), tonumber(luaNode.tileHeight)); | |||
if luaNode.mapdata then | |||
-- 兼容老格式 | |||
self.obstacles:resize(self.TileCountX , self.TileCountY); | |||
for i , v in pairs(luaNode.mapdata) do | |||
local x = math.floor((i - 1) / self.TileCountY); | |||
local y = (i - 1) % self.TileCountY; | |||
if v == 0 then | |||
self.obstacles:setBlock(x , y , 1); | |||
else | |||
self.obstacles:setBlock(x , y , 0); | |||
end | |||
end | |||
end | |||
end | |||
function Map:saveToXmlNode(xmlNode) | |||
-- 保存tile的偏移 | |||
xmlNode.offsetX = self.OffsetX; | |||
xmlNode.offsetY = self.OffsetY; | |||
xmlNode.col = self.TileCountX; | |||
xmlNode.row = self.TileCountY; | |||
-- 保存地图宽高和Tile宽高 | |||
xmlNode.width = self.MapWidth; | |||
xmlNode.height = self.MapHeight; | |||
xmlNode.tileWidth = self.TileWidth; | |||
xmlNode.tileHeight = self.TileHeight; | |||
-- 保存障碍块 | |||
local obstaclesStr; | |||
local singleObstacleStr; | |||
-- 将障碍信息压成一个字符串 | |||
for x = 0, self.TileCountX - 1 do | |||
for y = 0, self.TileCountY - 1 do | |||
local obstacle = self:getObstacle(x, y); | |||
-- 障碍信息 | |||
if obstacle == 0 then | |||
singleObstacleStr = "1"; | |||
else | |||
singleObstacleStr = "0"; | |||
end | |||
-- 开始直接赋值,否则叠加 | |||
if obstaclesStr == nil then | |||
obstaclesStr = {singleObstacleStr}; | |||
else | |||
table.insert(obstaclesStr , "," .. singleObstacleStr); | |||
end | |||
end | |||
end | |||
xmlNode.mapdata = table.concat(obstaclesStr); | |||
end | |||
function Map:createXmlNode() | |||
local xmlNode = xml.new("map"); | |||
self:saveToXmlNode(xmlNode); | |||
return xmlNode; | |||
end | |||
-- 保存一个地图到XML文件 | |||
function Map:saveXml(fullFilePath) | |||
local xmlNode = self:createXmlNode(); | |||
xmlNode:save(fullFilePath); | |||
end | |||
-- 保存一个地图到lua文件 | |||
function Map:saveLua(fullFilePath) | |||
local luaNode = {} | |||
-- 保存tile的偏移 | |||
luaNode.offsetX = self.OffsetX; | |||
luaNode.offsetY = self.OffsetY; | |||
luaNode.col = self.TileCountX; | |||
luaNode.row = self.TileCountY; | |||
-- 保存地图宽高和Tile宽高 | |||
luaNode.width = self.MapWidth; | |||
luaNode.height = self.MapHeight; | |||
luaNode.tileWidth = self.TileWidth; | |||
luaNode.tileHeight = self.TileHeight; | |||
self.obstacles:saveToFile(fullFilePath .. ".blocks"); | |||
table.saveFile(luaNode , fullFilePath); | |||
end | |||
-- 载入一个地图文件 | |||
function Map:loadLua(luaFile) | |||
print("加载map:" , luaFile); | |||
local xmlFile = table.loadFile(luaFile); | |||
if xmlFile then | |||
self:loadFromLuaNode(xmlFile); | |||
if not xmlFile.mapdata then | |||
self.obstacles:loadFromFile(luaFile .. ".blocks"); | |||
end | |||
end | |||
print("map 加载完成"); | |||
end | |||
-- 载入一个地图文件 | |||
function Map:loadXml(nodeFile) | |||
local xmlFile = loadXmlFileWithCache(nodeFile); | |||
if xmlFile then | |||
self:loadFromXmlNode(xmlFile:find("map")); | |||
end | |||
end | |||
-- | |||
-- 获取45度A*单元格矩阵坐标 | |||
-- @param px 目标点X坐标 | |||
-- @param py 目标点Y坐标 | |||
-- @return {@link Position} 矩阵点坐标 | |||
function Map:getTilePosition(px, py) | |||
-- 界面坐标 计算以屏幕左上为原点的世界坐标 | |||
local logicalx = px / (2 * self.TileHalfWidth) + (-py) / (2 * self.TileHalfHeight) + self.OffsetX; | |||
local logicaly = px / (2 * self.TileHalfWidth) - (-py) / (2 * self.TileHalfHeight) + self.OffsetY; | |||
return cc.p(math.floor(logicalx), math.floor(logicaly)); | |||
end | |||
-- | |||
-- 获取45度A*单元格矩阵坐标(不对齐到网格) | |||
-- @param px 目标点X坐标 | |||
-- @param py 目标点Y坐标 | |||
-- @return {@link Position} 矩阵点坐标 | |||
function Map:_getTilePosition(px, py) | |||
-- 界面坐标 计算以屏幕左上为原点的世界坐标 | |||
local logicalx = px / (2 * self.TileHalfWidth) + (-py) / (2 * self.TileHalfHeight) + self.OffsetX; | |||
local logicaly = px / (2 * self.TileHalfWidth) - (-py) / (2 * self.TileHalfHeight) + self.OffsetY; | |||
return cc.p(logicalx, logicaly); | |||
end | |||
-- | |||
-- 获取45度A*单元格矩阵坐标转舞台从标(获得的是格子的中心点坐标) | |||
-- @param px 舞台X坐标 | |||
-- @param py 舞台Y坐标 | |||
-- @return {@link Position} 矩阵点坐标 | |||
function Map:getPixelPosition(tileX, tileY) | |||
local nOffX = tileX - self.OffsetX; | |||
local nOffY = tileY - self.OffsetY; | |||
local positionX = nOffX * self.TileHalfWidth + nOffY * self.TileHalfWidth; -- 斜坐标 x每加1 竖坐标x+1/2 y+1/2 | |||
local positionY = nOffX * self.TileHalfHeight - nOffY * self.TileHalfHeight; -- 斜坐标 y每加1 竖坐标x+1/2 y-1/2 | |||
return cc.p(positionX, -positionY); | |||
end | |||
-- 载入场景文件 | |||
function loadScene(nodeFile) | |||
print("加载场景" , nodeFile); | |||
TimeSpan:enterSpan("loadScene" .. nodeFile); | |||
TimeSpan:enterSpan("createNodeFromFile"); | |||
print("加载模型"); | |||
LoadingScene = true; | |||
local node = cc.StreamObject:loadFromFile(nodeFile); | |||
LoadingScene = false; | |||
node:setCollectAnimationClip(false); | |||
TimeSpan:leaveSpan(); | |||
if not EditorMode then | |||
-- 普通模式,屏蔽掉HD内容 | |||
local hd = node:findNode("HD"); | |||
if hd then | |||
local function onQualityChanged(key , value) | |||
-- 高质量 | |||
hd:setVisible(value == 1); | |||
end | |||
hd:bind(app.systemSetting.info , "graphicQuality" , onQualityChanged); | |||
end | |||
end | |||
-- 创建一个题图载入资源 | |||
TimeSpan:enterSpan("requireMap"); | |||
print("加载障碍块"); | |||
local map = require("luaScript.Map.Map"):new(); | |||
local arr = string.split(nodeFile, "."); | |||
map:loadLua(arr[1] .. ".lmap"); | |||
TimeSpan:leaveSpan(); | |||
TimeSpan:leaveSpan(); | |||
return node , map; | |||
end | |||
return Map; |
@@ -0,0 +1,133 @@ | |||
return function(Map) | |||
-- 创建地图菱形网格 | |||
function Map:createGridNode() | |||
local vertexFormat = {}; | |||
table.insert(vertexFormat , {size = 3 , usage = cc.VertexFormatUsage.POSITION}); | |||
table.insert(vertexFormat , {size = 4 , usage = cc.VertexFormatUsage.COLOR}); | |||
local vertices = ManualVertices:new(vertexFormat); | |||
vertices:setColor(cc.c4f(0,0,1,0.5)); | |||
-- 画菱形 | |||
-- 画横轴 | |||
for x = 0, self.TileCountX do | |||
local begin_ = self:getPixelPosition(x,0); | |||
local end_ = self:getPixelPosition(x,self.TileCountY); | |||
vertices:drawLine(cc.vec3(begin_.x , 0 , begin_.y) , cc.vec3(end_.x , 0 , end_.y)) | |||
end | |||
-- 画纵轴 | |||
for y = 0, self.TileCountY do | |||
local begin_ = self:getPixelPosition(0,y); | |||
local end_ = self:getPixelPosition(self.TileCountX,y); | |||
vertices:drawLine(cc.vec3(begin_.x , 0 , begin_.y) , cc.vec3(end_.x , 0 , end_.y)) | |||
end | |||
-- 画一个矩形 | |||
vertices:drawLine(cc.vec3(0,0,0), cc.vec3(self.MapWidth,0,0)); | |||
vertices:drawLine(cc.vec3(self.MapWidth,0,0), cc.vec3(self.MapWidth,0, -self.MapHeight)); | |||
vertices:drawLine(cc.vec3(self.MapWidth,0, -self.MapHeight), cc.vec3(0,0,-self.MapHeight)); | |||
vertices:drawLine(cc.vec3(0,0,0), cc.vec3(0,0,-self.MapHeight)); | |||
local mesh = cc.Mesh:createMesh(vertexFormat , vertices:getVertexCount()); | |||
mesh:setPrimitiveType(cc.PrimitiveType.LINES); | |||
mesh:setVertexData(vertices:getVertices() , 0 , vertices:getVertexCount()); | |||
mesh:setBoundingBox(vertices:getBoundingBox()); | |||
local model = cc.Model:create(mesh); | |||
local material = cc.Material:create("preload/shaders/ccDefault.material#ShaderPositionColor3D"); | |||
material:setParameterAutoBinding("CC_MVPMatrix" , "WORLD_VIEW_PROJECTION_MATRIX"); | |||
model:setMaterialPointer(material); | |||
local node = cc.Node3D:create(); | |||
node:addComponent(model); | |||
return node; | |||
end | |||
-- 创建网格上的文本 | |||
function Map:createTextNode() | |||
local node = cc.Node:create(); | |||
-- 横轴 | |||
for x = 0, self.TileCountX do | |||
-- 纵轴 | |||
for y = 0, self.TileCountY do | |||
local pos = self:getPixelPosition(x,y); | |||
local debugLabel = cc.Text:createNode(); | |||
debugLabel:setDefaults(); | |||
local config = debugLabel:getFontConfig(); | |||
config.fontSize = 12; | |||
debugLabel:setFontConfig(config); | |||
debugLabel:setAnchorPoint(cc.p(0.5,0.5)); | |||
debugLabel:setTranslation(pos.x , 0 , pos.y); | |||
debugLabel:setEulerRotation(-90,0,0); | |||
debugLabel:setScale(0.03); | |||
-- TODO这里需要显示逻辑坐标就可以了 | |||
debugLabel:setText(tostring(x) .. "," .. tostring(y)); | |||
node:addChild(debugLabel); | |||
end | |||
end | |||
return node; | |||
end | |||
-- 创建障碍块和可见区域 | |||
function Map:createObstacleNode() | |||
local node = cc.Node3D:create(); | |||
-- 画障碍块 | |||
local vertexFormat = {}; | |||
table.insert(vertexFormat , {size = 3 , usage = cc.VertexFormatUsage.POSITION}); | |||
table.insert(vertexFormat , {size = 4 , usage = cc.VertexFormatUsage.COLOR}); | |||
local material = cc.Material:create("preload/shaders/ccDefault.material#ShaderPositionColor3D"); | |||
material:setParameterAutoBinding("CC_MVPMatrix" , "WORLD_VIEW_PROJECTION_MATRIX"); | |||
local mesh = cc.MeshBatch:create(vertexFormat , cc.PrimitiveType.TRIANGLES , material , false); | |||
node:addComponent(mesh); | |||
local function drawOb(vertices , x , y) | |||
local leftTop = self:getPixelPosition(x,y); | |||
local rightTop = self:getPixelPosition(x + 1,y); | |||
local leftBottom = self:getPixelPosition(x,y + 1); | |||
local rightBottom = self:getPixelPosition(x + 1,y + 1); | |||
vertices:drawRect(cc.vec3(leftTop.x , 0 , leftTop.y) | |||
, cc.vec3(rightTop.x , 0 , rightTop.y) | |||
, cc.vec3(leftBottom.x , 0 , leftBottom.y) | |||
, cc.vec3(rightBottom.x , 0 , rightBottom.y)); | |||
end | |||
-- 更新障碍块的顶点信息 | |||
local function updateObstacle() | |||
local vertices = ManualVertices:new(vertexFormat); | |||
local x , y; | |||
-- 画障碍块 | |||
for y = 0 , self.TileCountY - 1 do | |||
for x = 0 , self.TileCountX - 1 do | |||
if self.obstacles:isBlock(x,y) then | |||
vertices:setColor(cc.c4f(1,1,0,1)); | |||
else | |||
vertices:setColor(cc.c4f(0,0,0,0)); | |||
end | |||
drawOb(vertices , x , y); | |||
end | |||
end | |||
mesh:start(); | |||
mesh:add(vertices:getVertices() , vertices:getVertexCount()); | |||
mesh:finish(); | |||
end | |||
-- 更新一个障碍块 | |||
local function updateOne(x , y , val) | |||
local vertices = ManualVertices:new(vertexFormat); | |||
if val ~= Map.ObstacleType.ObstacleNone then | |||
vertices:setColor(cc.c4f(1,1,0,1)); | |||
else | |||
vertices:setColor(cc.c4f(0,0,0,0)); | |||
end | |||
drawOb(vertices , x , y); | |||
mesh:updateVertex((self.TileCountX * y + x) * vertices:getVertexCount() , vertices:getVertexCount() , vertices:getVertices()); | |||
end | |||
self.ObstacleChanged = updateOne; | |||
updateObstacle(); | |||
return node; | |||
end | |||
end |
@@ -0,0 +1,22 @@ | |||
-- 获取设备唯一ID | |||
cc.exports.F_EapGetDeviceID = function() | |||
-- return G_DeviceData.getMacAddress() | |||
if isWin32Platform() then | |||
return "F_EapGetMacAddress_" .. app.user.loginInfo.uid | |||
--return "F_EapGetMacAddress_" .. Math.random(1000, 9999) | |||
end | |||
return getDeviceID() | |||
end | |||
-- 打印 | |||
cc.exports.F_EapPrint = function(...) | |||
print(...) | |||
end | |||
-- 跳转网页 | |||
cc.exports.F_EapOpenUrl = function(url) | |||
-- G_DeviceData.goToUrl(url) | |||
app.plugin:callUrl(url) | |||
print("F_EapOpenUrl = ", url) | |||
end | |||
-- 初始化json库 require("cjson") or require("JSON") or require("json") | |||
cc.exports.G_EapSdkJson = require("json") |
@@ -0,0 +1,58 @@ | |||
local BaseCommon = BaseCommon or {} | |||
-- event | |||
function BaseCommon.DispatchCustomEvent(__name, __data, __cmd) | |||
if (not __name) then | |||
assert(false, "BaseCommon.DispatchCustomEvent __name is null") | |||
end | |||
local event = cc.EventCustom:new(__name) | |||
event._usedata = __data | |||
event._cmd = __cmd | |||
cc.Director:getInstance():getEventDispatcher():dispatchEvent(event) | |||
end | |||
function BaseCommon.AddCustomEvent(__node, __eventName, __handler) | |||
if (not __eventName) then | |||
assert(false, "BaseCommon.AddCustomEvent __eventName is null") | |||
end | |||
local listener = cc.EventListenerCustom:create(__eventName, __handler) | |||
cc.Director:getInstance():getEventDispatcher():addEventListenerWithSceneGraphPriority(listener, __node) | |||
return listener | |||
end | |||
function BaseCommon.AddFixedCustomEvent(__eventName, __handler) | |||
local listener = cc.EventListenerCustom:create(__eventName, __handler) | |||
cc.Director:getInstance():getEventDispatcher():addEventListenerWithFixedPriority(listener, 1) | |||
return listener | |||
end | |||
function BaseCommon.RemoveFixedCustomEvent(__listener) | |||
cc.Director:getInstance():getEventDispatcher():removeEventListener(__listener) | |||
end | |||
-- const table | |||
function BaseCommon.NewConst( const_table ) | |||
local function Const( const_table ) | |||
local mt = | |||
{ | |||
__index = function (t,k) | |||
if type(const_table[k])=="table" then | |||
const_table[k] = BaseCommon.NewConst(const_table[k]) | |||
end | |||
return const_table[k] | |||
end, | |||
__newindex = function (t,k,v) | |||
error("can't update " .. tostring(t) .."[" .. tostring(k) .."] = " .. tostring(v)) | |||
-- dump(t) | |||
end | |||
} | |||
return mt | |||
end | |||
local t = {} | |||
setmetatable(t, Const(const_table)) | |||
return t | |||
end | |||
return BaseCommon |
@@ -0,0 +1,12 @@ | |||
-- | |||
-- Author: songge | |||
-- Date: 2016-03-29 14:47:07 | |||
-- define event name | |||
local BaseEvent = BaseEvent or {} | |||
BaseEvent.APP_CPP_EVENT_NETWORK_STATE = "APP_CPP_EVENT_NETWORK_STATE" --获取网络连接状态,勿修改 | |||
BaseEvent.EVENT_LOADING_CLOSE = "EVENT_LOADING_CLOSE" | |||
return BaseEvent |
@@ -0,0 +1,84 @@ | |||
-- | |||
-- Author: songge | |||
-- Date: 2016-03-29 14:05:47 | |||
-- 整个layer的基类,所有的layer都需要继承这个类。 | |||
local BaseLayer = EapClass("BaseLayer", function () | |||
return cc.Layer:create() -- 继承layer | |||
end) | |||
function BaseLayer:ctor(...) | |||
self:enableNodeEvents() | |||
self:onShow(...) | |||
end | |||
function BaseLayer:onShow(...) | |||
print("baselayer is inited") | |||
self:myShow(...) | |||
end | |||
function BaseLayer:onExit() | |||
print("baselayer is onExit") | |||
if (not self._cleanBaseOver) then | |||
self._cleanBaseOver = true | |||
self:myClose() | |||
end | |||
end | |||
function BaseLayer:closeShowLayer() | |||
self._cleanBaseOver = true | |||
self:myClose() | |||
self:removeFromParent() | |||
end | |||
function BaseLayer:myShow(...) | |||
assert(false, "myShow this method must be inherited") --这个方法必须被重写 | |||
end | |||
function BaseLayer:myClose() | |||
assert(false, "myClose this method must be inherited") --这个方法必须被重写 | |||
end | |||
-- listener | |||
function BaseLayer:addListener(__noswallow) | |||
print("BaseLayer:addListener successed") | |||
self._listener = cc.EventListenerTouchOneByOne:create() | |||
if (__noswallow) then | |||
self._listener:setSwallowTouches(false) | |||
else | |||
self._listener:setSwallowTouches(true) | |||
end | |||
self._listener:registerScriptHandler(handler(self,self.onTouchBegin),cc.Handler.EVENT_TOUCH_BEGAN); | |||
self._listener:registerScriptHandler(handler(self,self.onTouchMove),cc.Handler.EVENT_TOUCH_MOVED); | |||
self._listener:registerScriptHandler(handler(self,self.onTouchEnd),cc.Handler.EVENT_TOUCH_ENDED); | |||
self._listener:registerScriptHandler(handler(self,self.onTouchCancel),cc.Handler.EVENT_TOUCH_CANCELLED); | |||
cc.Director:getInstance():getEventDispatcher():addEventListenerWithSceneGraphPriority(self._listener,self); | |||
end | |||
function BaseLayer:removeListener() | |||
if self._listener then | |||
cc.Director:getInstance():getEventDispatcher():removeEventListener(self._listener); | |||
self._listener = nil | |||
end | |||
end | |||
--touch | |||
function BaseLayer:onTouchBegin(__touch,__event) | |||
--local _p = __touch:getLocation(); | |||
--print("BaseLayer:onTouchBegin",_p.x,_p.y) | |||
return true; | |||
end | |||
function BaseLayer:onTouchMove(__touch,__event) | |||
end | |||
function BaseLayer:onTouchEnd(__touch,__event) | |||
end | |||
function BaseLayer:onTouchCancel(__touch,__eventt) | |||
end | |||
function BaseLayer:onCleanup() | |||
print("BaseLayer:onCleanup ") | |||
self:removeListener() | |||
end | |||
function BaseLayer:setListenerEnable(__state) | |||
if self._listener then | |||
self._listener:setEnabled(__state) | |||
end | |||
end | |||
return BaseLayer--BaseLayer_lua--BaseLayer.lua |
@@ -0,0 +1,28 @@ | |||
-- 0 - disable debug info, 1 - less debug info, 2 - verbose debug info | |||
DEBUG = 2 | |||
-- use framework, will disable all deprecated API, false - use legacy API | |||
CC_USE_FRAMEWORK = true | |||
-- show FPS on screen | |||
CC_SHOW_FPS = true | |||
-- disable create unexpected global variable | |||
CC_DISABLE_GLOBAL = false | |||
-- for module display | |||
CC_DESIGN_RESOLUTION = { | |||
width = 1280, | |||
height = 720, | |||
autoscale = "FIXED_WIDTH", | |||
callback = function(framesize) | |||
local ratio = framesize.width / framesize.height | |||
if ratio <= 1.34 then | |||
-- iPad 768*1024(1536*2048) is 4:3 screen | |||
return {autoscale = "FIXED_WIDTH"} | |||
elseif ratio > 1.775 then | |||
return {autoscale = "FIXED_HEIGHT"} | |||
end | |||
end | |||
}--config_lua--config.lua |
@@ -0,0 +1,207 @@ | |||
--[[ | |||
Copyright (c) 2011-2014 chukong-inc.com | |||
Permission is hereby granted, free of charge, to any person obtaining a copy | |||
of this software and associated documentation files (the "Software"), to deal | |||
in the Software without restriction, including without limitation the rights | |||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | |||
copies of the Software, and to permit persons to whom the Software is | |||
furnished to do so, subject to the following conditions: | |||
The above copyright notice and this permission notice shall be included in | |||
all copies or substantial portions of the Software. | |||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | |||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | |||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | |||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | |||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | |||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN | |||
THE SOFTWARE. | |||
]] | |||
local audio = {} | |||
local engine = cc.SimpleAudioEngine:getInstance() | |||
function audio.getMusicVolume() | |||
local volume = engine:getMusicVolume() | |||
if DEBUG > 1 then | |||
printf("[audio] getMusicVolume() - volume: %0.2f", volume) | |||
end | |||
return volume | |||
end | |||
function audio.setMusicVolume(volume) | |||
volume = checknumber(volume) | |||
if DEBUG > 1 then | |||
printf("[audio] setMusicVolume() - volume: %0.2f", volume) | |||
end | |||
engine:setMusicVolume(volume) | |||
end | |||
function audio.preloadMusic(filename) | |||
assert(filename, "audio.preloadMusic() - invalid filename") | |||
if DEBUG > 1 then | |||
printf("[audio] preloadMusic() - filename: %s", tostring(filename)) | |||
end | |||
engine:preloadMusic(filename) | |||
end | |||
function audio.playMusic(filename, isLoop) | |||
assert(filename, "audio.playMusic() - invalid filename") | |||
if type(isLoop) ~= "boolean" then isLoop = true end | |||
audio.stopMusic() | |||
if DEBUG > 1 then | |||
printf("[audio] playMusic() - filename: %s, isLoop: %s", tostring(filename), tostring(isLoop)) | |||
end | |||
engine:playMusic(filename, isLoop) | |||
end | |||
function audio.stopMusic(isReleaseData) | |||
isReleaseData = checkbool(isReleaseData) | |||
if DEBUG > 1 then | |||
printf("[audio] stopMusic() - isReleaseData: %s", tostring(isReleaseData)) | |||
end | |||
engine:stopMusic(isReleaseData) | |||
end | |||
function audio.pauseMusic() | |||
if DEBUG > 1 then | |||
printf("[audio] pauseMusic()") | |||
end | |||
engine:pauseMusic() | |||
end | |||
function audio.resumeMusic() | |||
if DEBUG > 1 then | |||
printf("[audio] resumeMusic()") | |||
end | |||
engine:resumeMusic() | |||
end | |||
function audio.rewindMusic() | |||
if DEBUG > 1 then | |||
printf("[audio] rewindMusic()") | |||
end | |||
engine:rewindMusic() | |||
end | |||
function audio.isMusicPlaying() | |||
local ret = engine:isMusicPlaying() | |||
if DEBUG > 1 then | |||
printf("[audio] isMusicPlaying() - ret: %s", tostring(ret)) | |||
end | |||
return ret | |||
end | |||
function audio.getSoundsVolume() | |||
local volume = engine:getEffectsVolume() | |||
if DEBUG > 1 then | |||
printf("[audio] getSoundsVolume() - volume: %0.1f", volume) | |||
end | |||
return volume | |||
end | |||
function audio.setSoundsVolume(volume) | |||
volume = checknumber(volume) | |||
if DEBUG > 1 then | |||
printf("[audio] setSoundsVolume() - volume: %0.1f", volume) | |||
end | |||
engine:setEffectsVolume(volume) | |||
end | |||
function audio.playSound(filename, isLoop) | |||
if not filename then | |||
printError("audio.playSound() - invalid filename") | |||
return | |||
end | |||
if type(isLoop) ~= "boolean" then isLoop = false end | |||
if DEBUG > 1 then | |||
--printf("[audio] playSound() - filename: %s, isLoop: %s", tostring(filename), tostring(isLoop)) | |||
end | |||
return engine:playEffect(filename, isLoop) | |||
end | |||
function audio.pauseSound(handle) | |||
if not handle then | |||
printError("audio.pauseSound() - invalid handle") | |||
return | |||
end | |||
if DEBUG > 1 then | |||
printf("[audio] pauseSound() - handle: %s", tostring(handle)) | |||
end | |||
engine:pauseEffect(handle) | |||
end | |||
function audio.pauseAllSounds() | |||
if DEBUG > 1 then | |||
printf("[audio] pauseAllSounds()") | |||
end | |||
engine:pauseAllEffects() | |||
end | |||
function audio.resumeSound(handle) | |||
if not handle then | |||
printError("audio.resumeSound() - invalid handle") | |||
return | |||
end | |||
if DEBUG > 1 then | |||
printf("[audio] resumeSound() - handle: %s", tostring(handle)) | |||
end | |||
engine:resumeEffect(handle) | |||
end | |||
function audio.resumeAllSounds() | |||
if DEBUG > 1 then | |||
printf("[audio] resumeAllSounds()") | |||
end | |||
engine:resumeAllEffects() | |||
end | |||
function audio.stopSound(handle) | |||
if not handle then | |||
printError("audio.stopSound() - invalid handle") | |||
return | |||
end | |||
if DEBUG > 1 then | |||
printf("[audio] stopSound() - handle: %s", tostring(handle)) | |||
end | |||
engine:stopEffect(handle) | |||
end | |||
function audio.stopAllSounds() | |||
if DEBUG > 1 then | |||
printf("[audio] stopAllSounds()") | |||
end | |||
engine:stopAllEffects() | |||
end | |||
audio.stopAllEffects = audio.stopAllSounds | |||
function audio.preloadSound(filename) | |||
if not filename then | |||
printError("audio.preloadSound() - invalid filename") | |||
return | |||
end | |||
if DEBUG > 1 then | |||
printf("[audio] preloadSound() - filename: %s", tostring(filename)) | |||
end | |||
engine:preloadEffect(filename) | |||
end | |||
function audio.unloadSound(filename) | |||
if not filename then | |||
printError("audio.unloadSound() - invalid filename") | |||
return | |||
end | |||
if DEBUG > 1 then | |||
printf("[audio] unloadSound() - filename: %s", tostring(filename)) | |||
end | |||
engine:unloadEffect(filename) | |||
end | |||
return audio | |||
--audio_lua--audio.lua |
@@ -0,0 +1,158 @@ | |||
local Event = EapClass("Event") | |||
local EXPORTED_METHODS = { | |||
"addEventListener", | |||
"dispatchEvent", | |||
"removeEventListener", | |||
"removeEventListenersByTag", | |||
"removeEventListenersByEvent", | |||
"removeAllEventListeners", | |||
"hasEventListener", | |||
"dumpAllEventListeners", | |||
} | |||
function Event:init_() | |||
self.target_ = nil | |||
self.listeners_ = {} | |||
self.nextListenerHandleIndex_ = 0 | |||
end | |||
function Event:bind(target) | |||
self:init_() | |||
cc.setmethods(target, self, EXPORTED_METHODS) | |||
self.target_ = target | |||
end | |||
function Event:unbind(target) | |||
cc.unsetmethods(target, EXPORTED_METHODS) | |||
self:init_() | |||
end | |||
function Event:on(eventName, listener, tag) | |||
assert(type(eventName) == "string" and eventName ~= "", | |||
"Event:addEventListener() - invalid eventName") | |||
eventName = string.upper(eventName) | |||
if self.listeners_[eventName] == nil then | |||
self.listeners_[eventName] = {} | |||
end | |||
self.nextListenerHandleIndex_ = self.nextListenerHandleIndex_ + 1 | |||
local handle = tostring(self.nextListenerHandleIndex_) | |||
tag = tag or "" | |||
self.listeners_[eventName][handle] = {listener, tag} | |||
if DEBUG > 1 then | |||
printInfo("%s [Event] addEventListener() - event: %s, handle: %s, tag: \"%s\"", | |||
tostring(self.target_), eventName, handle, tostring(tag)) | |||
end | |||
return self.target_, handle | |||
end | |||
Event.addEventListener = Event.on | |||
function Event:dispatchEvent(event) | |||
event.name = string.upper(tostring(event.name)) | |||
local eventName = event.name | |||
if DEBUG > 1 then | |||
printInfo("%s [Event] dispatchEvent() - event %s", tostring(self.target_), eventName) | |||
end | |||
if self.listeners_[eventName] == nil then return end | |||
event.target = self.target_ | |||
event.stop_ = false | |||
event.stop = function(self) | |||
self.stop_ = true | |||
end | |||
for handle, listener in pairs(self.listeners_[eventName]) do | |||
if DEBUG > 1 then | |||
printInfo("%s [Event] dispatchEvent() - dispatching event %s to listener %s", tostring(self.target_), eventName, handle) | |||
end | |||
-- listener[1] = listener | |||
-- listener[2] = tag | |||
event.tag = listener[2] | |||
listener[1](event) | |||
if event.stop_ then | |||
if DEBUG > 1 then | |||
printInfo("%s [Event] dispatchEvent() - break dispatching for event %s", tostring(self.target_), eventName) | |||
end | |||
break | |||
end | |||
end | |||
return self.target_ | |||
end | |||
function Event:removeEventListener(handleToRemove) | |||
for eventName, listenersForEvent in pairs(self.listeners_) do | |||
for handle, _ in pairs(listenersForEvent) do | |||
if handle == handleToRemove then | |||
listenersForEvent[handle] = nil | |||
if DEBUG > 1 then | |||
printInfo("%s [Event] removeEventListener() - remove listener [%s] for event %s", tostring(self.target_), handle, eventName) | |||
end | |||
return self.target_ | |||
end | |||
end | |||
end | |||
return self.target_ | |||
end | |||
function Event:removeEventListenersByTag(tagToRemove) | |||
for eventName, listenersForEvent in pairs(self.listeners_) do | |||
for handle, listener in pairs(listenersForEvent) do | |||
-- listener[1] = listener | |||
-- listener[2] = tag | |||
if listener[2] == tagToRemove then | |||
listenersForEvent[handle] = nil | |||
if DEBUG > 1 then | |||
printInfo("%s [Event] removeEventListener() - remove listener [%s] for event %s", tostring(self.target_), handle, eventName) | |||
end | |||
end | |||
end | |||
end | |||
return self.target_ | |||
end | |||
function Event:removeEventListenersByEvent(eventName) | |||
self.listeners_[string.upper(eventName)] = nil | |||
if DEBUG > 1 then | |||
printInfo("%s [Event] removeAllEventListenersForEvent() - remove all listeners for event %s", tostring(self.target_), eventName) | |||
end | |||
return self.target_ | |||
end | |||
function Event:removeAllEventListeners() | |||
self.listeners_ = {} | |||
if DEBUG > 1 then | |||
printInfo("%s [Event] removeAllEventListeners() - remove all listeners", tostring(self.target_)) | |||
end | |||
return self.target_ | |||
end | |||
function Event:hasEventListener(eventName) | |||
eventName = string.upper(tostring(eventName)) | |||
local t = self.listeners_[eventName] | |||
for _, __ in pairs(t) do | |||
return true | |||
end | |||
return false | |||
end | |||
function Event:dumpAllEventListeners() | |||
print("---- Event:dumpAllEventListeners() ----") | |||
for name, listeners in pairs(self.listeners_) do | |||
printf("-- event: %s", name) | |||
for handle, listener in pairs(listeners) do | |||
printf("-- listener: %s, handle: %s", tostring(listener[1]), tostring(handle)) | |||
end | |||
end | |||
return self.target_ | |||
end | |||
return Event | |||
--event_lua--event.lua |
@@ -0,0 +1,108 @@ | |||
--[[ | |||
Copyright (c) 2011-2014 chukong-inc.com | |||
Permission is hereby granted, free of charge, to any person obtaining a copy | |||
of this software and associated documentation files (the "Software"), to deal | |||
in the Software without restriction, including without limitation the rights | |||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | |||
copies of the Software, and to permit persons to whom the Software is | |||
furnished to do so, subject to the following conditions: | |||
The above copyright notice and this permission notice shall be included in | |||
all copies or substantial portions of the Software. | |||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | |||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | |||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | |||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | |||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | |||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN | |||
THE SOFTWARE. | |||
]] | |||
local device = {} | |||
device.platform = "unknown" | |||
device.model = "unknown" | |||
local app = cc.Application:getInstance() | |||
local target = app:getTargetPlatform() | |||
if target == cc.PLATFORM_OS_WINDOWS then | |||
device.platform = "windows" | |||
elseif target == cc.PLATFORM_OS_MAC then | |||
device.platform = "mac" | |||
elseif target == cc.PLATFORM_OS_ANDROID then | |||
device.platform = "android" | |||
elseif target == cc.PLATFORM_OS_IPHONE or target == cc.PLATFORM_OS_IPAD then | |||
device.platform = "ios" | |||
local director = cc.Director:getInstance() | |||
local view = director:getOpenGLView() | |||
local framesize = view:getFrameSize() | |||
local w, h = framesize.width, framesize.height | |||
if w == 640 and h == 960 then | |||
device.model = "iphone 4" | |||
elseif w == 640 and h == 1136 then | |||
device.model = "iphone 5" | |||
elseif w == 750 and h == 1334 then | |||
device.model = "iphone 6" | |||
elseif w == 1242 and h == 2208 then | |||
device.model = "iphone 6 plus" | |||
elseif w == 768 and h == 1024 then | |||
device.model = "ipad" | |||
elseif w == 1536 and h == 2048 then | |||
device.model = "ipad retina" | |||
end | |||
elseif target == cc.PLATFORM_OS_WINRT then | |||
device.platform = "winrt" | |||
elseif target == cc.PLATFORM_OS_WP8 then | |||
device.platform = "wp8" | |||
end | |||
local language_ = app:getCurrentLanguage() | |||
if language_ == cc.LANGUAGE_CHINESE then | |||
language_ = "cn" | |||
elseif language_ == cc.LANGUAGE_FRENCH then | |||
language_ = "fr" | |||
elseif language_ == cc.LANGUAGE_ITALIAN then | |||
language_ = "it" | |||
elseif language_ == cc.LANGUAGE_GERMAN then | |||
language_ = "gr" | |||
elseif language_ == cc.LANGUAGE_SPANISH then | |||
language_ = "sp" | |||
elseif language_ == cc.LANGUAGE_RUSSIAN then | |||
language_ = "ru" | |||
elseif language_ == cc.LANGUAGE_KOREAN then | |||
language_ = "kr" | |||
elseif language_ == cc.LANGUAGE_JAPANESE then | |||
language_ = "jp" | |||
elseif language_ == cc.LANGUAGE_HUNGARIAN then | |||
language_ = "hu" | |||
elseif language_ == cc.LANGUAGE_PORTUGUESE then | |||
language_ = "pt" | |||
elseif language_ == cc.LANGUAGE_ARABIC then | |||
language_ = "ar" | |||
else | |||
language_ = "en" | |||
end | |||
device.language = language_ | |||
device.writablePath = cc.FileUtils:getInstance():getWritablePath() | |||
device.directorySeparator = "/" | |||
device.pathSeparator = ":" | |||
if device.platform == "windows" then | |||
device.directorySeparator = "\\" | |||
device.pathSeparator = ";" | |||
end | |||
printInfo("# device.platform = " .. device.platform) | |||
printInfo("# device.model = " .. device.model) | |||
printInfo("# device.language = " .. device.language) | |||
printInfo("# device.writablePath = " .. device.writablePath) | |||
printInfo("# device.directorySeparator = " .. device.directorySeparator) | |||
printInfo("# device.pathSeparator = " .. device.pathSeparator) | |||
printInfo("#") | |||
return device | |||
--device_lua--device.lua |
@@ -0,0 +1,547 @@ | |||
--[[ | |||
Copyright (c) 2011-2014 chukong-inc.com | |||
Permission is hereby granted, free of charge, to any person obtaining a copy | |||
of this software and associated documentation files (the "Software"), to deal | |||
in the Software without restriction, including without limitation the rights | |||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | |||
copies of the Software, and to permit persons to whom the Software is | |||
furnished to do so, subject to the following conditions: | |||
The above copyright notice and this permission notice shall be included in | |||
all copies or substantial portions of the Software. | |||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | |||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | |||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | |||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | |||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | |||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN | |||
THE SOFTWARE. | |||
]] | |||
local display = {} | |||
local director = cc.Director:getInstance() | |||
local view = director:getOpenGLView() | |||
if not view then | |||
local width = 960 | |||
local height = 640 | |||
if CC_DESIGN_RESOLUTION then | |||
if CC_DESIGN_RESOLUTION.width then | |||
width = CC_DESIGN_RESOLUTION.width | |||
end | |||
if CC_DESIGN_RESOLUTION.height then | |||
height = CC_DESIGN_RESOLUTION.height | |||
end | |||
end | |||
view = cc.GLViewImpl:createWithRect("Cocos2d-Lua", cc.rect(0, 0, width, height)) | |||
director:setOpenGLView(view) | |||
end | |||
local framesize = view:getFrameSize() | |||
local textureCache = director:getTextureCache() | |||
local spriteFrameCache = cc.SpriteFrameCache:getInstance() | |||
local animationCache = cc.AnimationCache:getInstance() | |||
-- auto scale | |||
local function checkResolution(r) | |||
r.width = checknumber(r.width) | |||
r.height = checknumber(r.height) | |||
r.autoscale = string.upper(r.autoscale) | |||
assert(r.width > 0 and r.height > 0, | |||
string.format("display - invalid design resolution size %d, %d", r.width, r.height)) | |||
end | |||
local function setDesignResolution(r, framesize) | |||
if r.autoscale == "FILL_ALL" then | |||
view:setDesignResolutionSize(framesize.width, framesize.height, cc.ResolutionPolicy.FILL_ALL) | |||
else | |||
local scaleX, scaleY = framesize.width / r.width, framesize.height / r.height | |||
local width, height = framesize.width, framesize.height | |||
if r.autoscale == "FIXED_WIDTH" then | |||
width = framesize.width / scaleX | |||
height = framesize.height / scaleX | |||
view:setDesignResolutionSize(width, height, cc.ResolutionPolicy.NO_BORDER) | |||
elseif r.autoscale == "FIXED_HEIGHT" then | |||
width = framesize.width / scaleY | |||
height = framesize.height / scaleY | |||
view:setDesignResolutionSize(width, height, cc.ResolutionPolicy.NO_BORDER) | |||
elseif r.autoscale == "EXACT_FIT" then | |||
view:setDesignResolutionSize(r.width, r.height, cc.ResolutionPolicy.EXACT_FIT) | |||
elseif r.autoscale == "NO_BORDER" then | |||
view:setDesignResolutionSize(r.width, r.height, cc.ResolutionPolicy.NO_BORDER) | |||
elseif r.autoscale == "SHOW_ALL" then | |||
view:setDesignResolutionSize(r.width, r.height, cc.ResolutionPolicy.SHOW_ALL) | |||
else | |||
printError(string.format("display - invalid r.autoscale \"%s\"", r.autoscale)) | |||
end | |||
end | |||
end | |||
local function setConstants() | |||
local sizeInPixels = view:getFrameSize() | |||
display.sizeInPixels = {width = sizeInPixels.width, height = sizeInPixels.height} | |||
local viewsize = director:getWinSize() | |||
display.contentScaleFactor = director:getContentScaleFactor() | |||
display.size = {width = viewsize.width, height = viewsize.height} | |||
display.width = display.size.width | |||
display.height = display.size.height | |||
display.cx = display.width / 2 | |||
display.cy = display.height / 2 | |||
display.c_left = -display.width / 2 | |||
display.c_right = display.width / 2 | |||
display.c_top = display.height / 2 | |||
display.c_bottom = -display.height / 2 | |||
display.left = 0 | |||
display.right = display.width | |||
display.top = display.height | |||
display.bottom = 0 | |||
display.center = cc.p(display.cx, display.cy) | |||
display.left_top = cc.p(display.left, display.top) | |||
display.left_bottom = cc.p(display.left, display.bottom) | |||
display.left_center = cc.p(display.left, display.cy) | |||
display.right_top = cc.p(display.right, display.top) | |||
display.right_bottom = cc.p(display.right, display.bottom) | |||
display.right_center = cc.p(display.right, display.cy) | |||
display.top_center = cc.p(display.cx, display.top) | |||
display.top_bottom = cc.p(display.cx, display.bottom) | |||
printInfo(string.format("# display.sizeInPixels = {width = %0.2f, height = %0.2f}", display.sizeInPixels.width, display.sizeInPixels.height)) | |||
printInfo(string.format("# display.size = {width = %0.2f, height = %0.2f}", display.size.width, display.size.height)) | |||
printInfo(string.format("# display.contentScaleFactor = %0.2f", display.contentScaleFactor)) | |||
printInfo(string.format("# display.width = %0.2f", display.width)) | |||
printInfo(string.format("# display.height = %0.2f", display.height)) | |||
printInfo(string.format("# display.cx = %0.2f", display.cx)) | |||
printInfo(string.format("# display.cy = %0.2f", display.cy)) | |||
printInfo(string.format("# display.left = %0.2f", display.left)) | |||
printInfo(string.format("# display.right = %0.2f", display.right)) | |||
printInfo(string.format("# display.top = %0.2f", display.top)) | |||
printInfo(string.format("# display.bottom = %0.2f", display.bottom)) | |||
printInfo(string.format("# display.c_left = %0.2f", display.c_left)) | |||
printInfo(string.format("# display.c_right = %0.2f", display.c_right)) | |||
printInfo(string.format("# display.c_top = %0.2f", display.c_top)) | |||
printInfo(string.format("# display.c_bottom = %0.2f", display.c_bottom)) | |||
printInfo(string.format("# display.center = {x = %0.2f, y = %0.2f}", display.center.x, display.center.y)) | |||
printInfo(string.format("# display.left_top = {x = %0.2f, y = %0.2f}", display.left_top.x, display.left_top.y)) | |||
printInfo(string.format("# display.left_bottom = {x = %0.2f, y = %0.2f}", display.left_bottom.x, display.left_bottom.y)) | |||
printInfo(string.format("# display.left_center = {x = %0.2f, y = %0.2f}", display.left_center.x, display.left_center.y)) | |||
printInfo(string.format("# display.right_top = {x = %0.2f, y = %0.2f}", display.right_top.x, display.right_top.y)) | |||
printInfo(string.format("# display.right_bottom = {x = %0.2f, y = %0.2f}", display.right_bottom.x, display.right_bottom.y)) | |||
printInfo(string.format("# display.right_center = {x = %0.2f, y = %0.2f}", display.right_center.x, display.right_center.y)) | |||
printInfo(string.format("# display.top_center = {x = %0.2f, y = %0.2f}", display.top_center.x, display.top_center.y)) | |||
printInfo(string.format("# display.top_bottom = {x = %0.2f, y = %0.2f}", display.top_bottom.x, display.top_bottom.y)) | |||
printInfo("#") | |||
end | |||
function display.setAutoScale(configs) | |||
if type(configs) ~= "table" then return end | |||
checkResolution(configs) | |||
if type(configs.callback) == "function" then | |||
local c = configs.callback(framesize) | |||
for k, v in pairs(c or {}) do | |||
configs[k] = v | |||
end | |||
checkResolution(configs) | |||
end | |||
setDesignResolution(configs, framesize) | |||
printInfo(string.format("# design resolution size = {width = %0.2f, height = %0.2f}", configs.width, configs.height)) | |||
printInfo(string.format("# design resolution autoscale = %s", configs.autoscale)) | |||
setConstants() | |||
end | |||
if type(CC_DESIGN_RESOLUTION) == "table" then | |||
display.setAutoScale(CC_DESIGN_RESOLUTION) | |||
end | |||
display.COLOR_WHITE = cc.c3b(255, 255, 255) | |||
display.COLOR_BLACK = cc.c3b(0, 0, 0) | |||
display.COLOR_RED = cc.c3b(255, 0, 0) | |||
display.COLOR_GREEN = cc.c3b(0, 255, 0) | |||
display.COLOR_BLUE = cc.c3b(0, 0, 255) | |||
display.AUTO_SIZE = 0 | |||
display.FIXED_SIZE = 1 | |||
display.LEFT_TO_RIGHT = 0 | |||
display.RIGHT_TO_LEFT = 1 | |||
display.TOP_TO_BOTTOM = 2 | |||
display.BOTTOM_TO_TOP = 3 | |||
display.CENTER = cc.p(0.5, 0.5) | |||
display.LEFT_TOP = cc.p(0, 1) | |||
display.LEFT_BOTTOM = cc.p(0, 0) | |||
display.LEFT_CENTER = cc.p(0, 0.5) | |||
display.RIGHT_TOP = cc.p(1, 1) | |||
display.RIGHT_BOTTOM = cc.p(1, 0) | |||
display.RIGHT_CENTER = cc.p(1, 0.5) | |||
display.CENTER_TOP = cc.p(0.5, 1) | |||
display.CENTER_BOTTOM = cc.p(0.5, 0) | |||
display.SCENE_TRANSITIONS = { | |||
CROSSFADE = cc.TransitionCrossFade, | |||
FADE = {cc.TransitionFade, cc.c3b(0, 0, 0)}, | |||
FADEBL = cc.TransitionFadeBL, | |||
FADEDOWN = cc.TransitionFadeDown, | |||
FADETR = cc.TransitionFadeTR, | |||
FADEUP = cc.TransitionFadeUp, | |||
FLIPANGULAR = {cc.TransitionFlipAngular, cc.TRANSITION_ORIENTATION_LEFT_OVER}, | |||
FLIPX = {cc.TransitionFlipX, cc.TRANSITION_ORIENTATION_LEFT_OVER}, | |||
FLIPY = {cc.TransitionFlipY, cc.TRANSITION_ORIENTATION_UP_OVER}, | |||
JUMPZOOM = cc.TransitionJumpZoom, | |||
MOVEINB = cc.TransitionMoveInB, | |||
MOVEINL = cc.TransitionMoveInL, | |||
MOVEINR = cc.TransitionMoveInR, | |||
MOVEINT = cc.TransitionMoveInT, | |||
PAGETURN = {cc.TransitionPageTurn, false}, | |||
ROTOZOOM = cc.TransitionRotoZoom, | |||
SHRINKGROW = cc.TransitionShrinkGrow, | |||
SLIDEINB = cc.TransitionSlideInB, | |||
SLIDEINL = cc.TransitionSlideInL, | |||
SLIDEINR = cc.TransitionSlideInR, | |||
SLIDEINT = cc.TransitionSlideInT, | |||
SPLITCOLS = cc.TransitionSplitCols, | |||
SPLITROWS = cc.TransitionSplitRows, | |||
TURNOFFTILES = cc.TransitionTurnOffTiles, | |||
ZOOMFLIPANGULAR = cc.TransitionZoomFlipAngular, | |||
ZOOMFLIPX = {cc.TransitionZoomFlipX, cc.TRANSITION_ORIENTATION_LEFT_OVER}, | |||
ZOOMFLIPY = {cc.TransitionZoomFlipY, cc.TRANSITION_ORIENTATION_UP_OVER}, | |||
} | |||
display.TEXTURES_PIXEL_FORMAT = {} | |||
display.DEFAULT_TTF_FONT = "fonts/huakangziti.TTF" | |||
display.DEFAULT_TTF_FONT_SIZE = 32 | |||
local PARAMS_EMPTY = {} | |||
local RECT_ZERO = cc.rect(0, 0, 0, 0) | |||
local sceneIndex = 0 | |||
function display.newScene(name, params) | |||
params = params or PARAMS_EMPTY | |||
sceneIndex = sceneIndex + 1 | |||
local scene | |||
if not params.physics then | |||
scene = cc.Scene:create() | |||
else | |||
scene = cc.Scene:createWithPhysics() | |||
end | |||
scene.name_ = string.format("%s:%d", name or "<unknown-scene>", sceneIndex) | |||
if params.transition then | |||
scene = display.wrapSceneWithTransition(scene, params.transition, params.time, params.more) | |||
end | |||
return scene | |||
end | |||
function display.wrapScene(scene, transition, time, more) | |||
local key = string.upper(tostring(transition)) | |||
if key == "RANDOM" then | |||
local keys = table.keys(display.SCENE_TRANSITIONS) | |||
key = keys[math.random(1, #keys)] | |||
end | |||
if display.SCENE_TRANSITIONS[key] then | |||
local t = display.SCENE_TRANSITIONS[key] | |||
time = time or 0.2 | |||
more = more or t[2] | |||
if type(t) == "table" then | |||
scene = t[1]:create(time, scene, more) | |||
else | |||
scene = t:create(time, scene) | |||
end | |||
else | |||
error(string.format("display.wrapScene() - invalid transition %s", tostring(transition))) | |||
end | |||
return scene | |||
end | |||
function display.runScene(newScene, transition, time, more) | |||
if director:getRunningScene() then | |||
if transition then | |||
newScene = display.wrapScene(newScene, transition, time, more) | |||
end | |||
director:replaceScene(newScene) | |||
else | |||
director:runWithScene(newScene) | |||
end | |||
end | |||
function display.getRunningScene() | |||
return director:getRunningScene() | |||
end | |||
function display.newNode() | |||
return cc.Node:create() | |||
end | |||
function display.newLayer(...) | |||
local params = {...} | |||
local c = #params | |||
local layer | |||
if c == 0 then | |||
-- /** creates a fullscreen black layer */ | |||
-- static Layer *create(); | |||
layer = cc.Layer:create() | |||
elseif c == 1 then | |||
-- /** creates a Layer with color. Width and height are the window size. */ | |||
-- static LayerColor * create(const Color4B& color); | |||
layer = cc.LayerColor:create(cc.convertColor(params[1], "4b")) | |||
elseif c == 2 then | |||
-- /** creates a Layer with color, width and height in Points */ | |||
-- static LayerColor * create(const Color4B& color, const Size& size); | |||
-- | |||
-- /** Creates a full-screen Layer with a gradient between start and end. */ | |||
-- static LayerGradient* create(const Color4B& start, const Color4B& end); | |||
local color1 = cc.convertColor(params[1], "4b") | |||
local p2 = params[2] | |||
assert(type(p2) == "table" and (p2.width or p2.r), "display.newLayer() - invalid paramerter 2") | |||
if p2.r then | |||
layer = cc.LayerGradient:create(color1, cc.convertColor(p2, "4b")) | |||
else | |||
layer = cc.LayerColor:create(color1, p2.width, p2.height) | |||
end | |||
elseif c == 3 then | |||
-- /** creates a Layer with color, width and height in Points */ | |||
-- static LayerColor * create(const Color4B& color, GLfloat width, GLfloat height); | |||
-- | |||
-- /** Creates a full-screen Layer with a gradient between start and end in the direction of v. */ | |||
-- static LayerGradient* create(const Color4B& start, const Color4B& end, const Vec2& v); | |||
local color1 = cc.convertColor(params[1], "4b") | |||
local p2 = params[2] | |||
local p2type = type(p2) | |||
if p2type == "table" then | |||
layer = cc.LayerGradient:create(color1, cc.convertColor(p2, "4b"), params[3]) | |||
else | |||
layer = cc.LayerColor:create(color1, p2, params[3]) | |||
end | |||
end | |||
return layer | |||
end | |||
function display.newSprite(source, x, y, params) | |||
local spriteClass = cc.Sprite | |||
local scale9 = false | |||
if type(x) == "table" and not x.x then | |||
-- x is params | |||
params = x | |||
x = nil | |||
y = nil | |||
end | |||
local params = params or PARAMS_EMPTY | |||
if params.scale9 or params.capInsets then | |||
spriteClass = ccui.Scale9Sprite | |||
scale9 = true | |||
params.capInsets = params.capInsets or RECT_ZERO | |||
params.rect = params.rect or RECT_ZERO | |||
end | |||
local sprite | |||
while true do | |||
-- create sprite | |||
if not source then | |||
sprite = spriteClass:create() | |||
break | |||
end | |||
local sourceType = type(source) | |||
if sourceType == "string" then | |||
if string.byte(source) == 35 then -- first char is # | |||
-- create sprite from spriteFrame | |||
if not scale9 then | |||
sprite = spriteClass:createWithSpriteFrameName(string.sub(source, 2)) | |||
else | |||
sprite = spriteClass:createWithSpriteFrameName(string.sub(source, 2), params.capInsets) | |||
end | |||
break | |||
end | |||
-- create sprite from image file | |||
if display.TEXTURES_PIXEL_FORMAT[source] then | |||
cc.Texture2D:setDefaultAlphaPixelFormat(display.TEXTURES_PIXEL_FORMAT[source]) | |||
end | |||
if not scale9 then | |||
sprite = spriteClass:create(source) | |||
else | |||
-- sprite = spriteClass:create(source, params.rect, params.capInsets) | |||
sprite = spriteClass:create(source) | |||
sprite:setScale9Enabled(true) | |||
sprite:setCapInsets(params.capInsets) | |||
-- sprite:setBorderEnabled(true) | |||
-- sprite:setBorder(params.rect) | |||
end | |||
if display.TEXTURES_PIXEL_FORMAT[source] then | |||
cc.Texture2D:setDefaultAlphaPixelFormat(cc.TEXTURE2_D_PIXEL_FORMAT_BGR_A8888) | |||
end | |||
break | |||
elseif sourceType ~= "userdata" then | |||
error(string.format("display.newSprite() - invalid source type \"%s\"", sourceType), 0) | |||
else | |||
sourceType = tolua.type(source) | |||
if sourceType == "cc.SpriteFrame" then | |||
if not scale9 then | |||
sprite = spriteClass:createWithSpriteFrame(source) | |||
else | |||
sprite = spriteClass:createWithSpriteFrame(source, params.capInsets) | |||
end | |||
elseif sourceType == "cc.Texture2D" then | |||
sprite = spriteClass:createWithTexture(source) | |||
else | |||
error(string.format("display.newSprite() - invalid source type \"%s\"", sourceType), 0) | |||
end | |||
end | |||
break | |||
end | |||
if sprite then | |||
if x and y then sprite:setPosition(cc.p(x, y)) end | |||
if params.size then sprite:setContentSize(params.size) end | |||
else | |||
error(string.format("display.newSprite() - create sprite failure, source \"%s\"", tostring(source)), 0) | |||
end | |||
return sprite | |||
end | |||
function display.newSpriteFrame(source, ...) | |||
local frame | |||
if type(source) == "string" then | |||
if string.byte(source) == 35 then -- first char is # | |||
source = string.sub(source, 2) | |||
end | |||
frame = spriteFrameCache:getSpriteFrame(source) | |||
if not frame then | |||
error(string.format("display.newSpriteFrame() - invalid frame name \"%s\"", tostring(source)), 0) | |||
end | |||
elseif tolua.type(source) == "cc.Texture2D" then | |||
frame = cc.SpriteFrame:createWithTexture(source, ...) | |||
else | |||
error("display.newSpriteFrame() - invalid parameters", 0) | |||
end | |||
return frame | |||
end | |||
function display.newFrames(pattern, begin, length, isReversed) | |||
local frames = {} | |||
local step = 1 | |||
local last = begin + length - 1 | |||
if isReversed then | |||
last, begin = begin, last | |||
step = -1 | |||
end | |||
for index = begin, last, step do | |||
local frameName = string.format(pattern, index) | |||
local frame = spriteFrameCache:getSpriteFrame(frameName) | |||
if not frame then | |||
error(string.format("display.newFrames() - invalid frame name %s", tostring(frameName)), 0) | |||
end | |||
frames[#frames + 1] = frame | |||
end | |||
return frames | |||
end | |||
local function newAnimation(frames, time) | |||
local count = #frames | |||
assert(count > 0, "display.newAnimation() - invalid frames") | |||
time = time or 1.0 / count | |||
return cc.Animation:createWithSpriteFrames(frames, time), | |||
cc.Sprite:createWithSpriteFrame(frames[1]) | |||
end | |||
function display.newAnimation(...) | |||
local params = {...} | |||
local c = #params | |||
if c == 2 then | |||
-- frames, time | |||
return newAnimation(params[1], params[2]) | |||
elseif c == 4 then | |||
-- pattern, begin, length, time | |||
local frames = display.newFrames(params[1], params[2], params[3]) | |||
return newAnimation(frames, params[4]) | |||
elseif c == 5 then | |||
-- pattern, begin, length, isReversed, time | |||
local frames = display.newFrames(params[1], params[2], params[3], params[4]) | |||
return newAnimation(frames, params[5]) | |||
else | |||
error("display.newAnimation() - invalid parameters") | |||
end | |||
end | |||
function display.loadImage(imageFilename, callback) | |||
if not callback then | |||
return textureCache:addImage(imageFilename) | |||
else | |||
textureCache:addImageAsync(imageFilename, callback) | |||
end | |||
end | |||
local fileUtils = cc.FileUtils:getInstance() | |||
function display.getImage(imageFilename) | |||
local fullpath = fileUtils:fullPathForFilename(imageFilename) | |||
return textureCache:getTextureForKey(fullpath) | |||
end | |||
function display.removeImage(imageFilename) | |||
textureCache:removeTextureForKey(imageFilename) | |||
end | |||
function display.loadSpriteFrames(dataFilename, imageFilename, callback) | |||
if display.TEXTURES_PIXEL_FORMAT[imageFilename] then | |||
cc.Texture2D:setDefaultAlphaPixelFormat(display.TEXTURES_PIXEL_FORMAT[imageFilename]) | |||
end | |||
if not callback then | |||
spriteFrameCache:addSpriteFrames(dataFilename, imageFilename) | |||
else | |||
spriteFrameCache:addSpriteFramesAsync(dataFilename, imageFilename, callback) | |||
end | |||
if display.TEXTURES_PIXEL_FORMAT[imageFilename] then | |||
cc.Texture2D:setDefaultAlphaPixelFormat(cc.TEXTURE2_D_PIXEL_FORMAT_BGR_A8888) | |||
end | |||
end | |||
function display.removeSpriteFrames(dataFilename, imageFilename) | |||
spriteFrameCache:removeSpriteFramesFromFile(dataFilename) | |||
if imageFilename then | |||
display.removeImage(imageFilename) | |||
end | |||
end | |||
function display.removeSpriteFrame(imageFilename) | |||
spriteFrameCache:removeSpriteFrameByName(imageFilename) | |||
end | |||
function display.setTexturePixelFormat(imageFilename, format) | |||
display.TEXTURES_PIXEL_FORMAT[imageFilename] = format | |||
end | |||
function display.setAnimationCache(name, animation) | |||
animationCache:addAnimation(animation, name) | |||
end | |||
function display.getAnimationCache(name) | |||
return animationCache:getAnimation(name) | |||
end | |||
function display.removeAnimationCache(name) | |||
animationCache:removeAnimation(name) | |||
end | |||
function display.removeUnusedSpriteFrames() | |||
spriteFrameCache:removeUnusedSpriteFrames() | |||
textureCache:removeUnusedTextures() | |||
end | |||
return display | |||
--display_lua--display.lua |
@@ -0,0 +1,81 @@ | |||
--[[ | |||
Copyright (c) 2011-2014 chukong-inc.com | |||
Permission is hereby granted, free of charge, to any person obtaining a copy | |||
of this software and associated documentation files (the "Software"), to deal | |||
in the Software without restriction, including without limitation the rights | |||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | |||
copies of the Software, and to permit persons to whom the Software is | |||
furnished to do so, subject to the following conditions: | |||
The above copyright notice and this permission notice shall be included in | |||
all copies or substantial portions of the Software. | |||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | |||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | |||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | |||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | |||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | |||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN | |||
THE SOFTWARE. | |||
]] | |||
local Layer = cc.Layer | |||
function Layer:onTouch(callback, isMultiTouches, swallowTouches) | |||
if type(isMultiTouches) ~= "boolean" then isMultiTouches = false end | |||
if type(swallowTouches) ~= "boolean" then swallowTouches = false end | |||
self:registerScriptTouchHandler(function(state, ...) | |||
local args = {...} | |||
local event = {name = state} | |||
if isMultiTouches then | |||
args = args[1] | |||
local points = {} | |||
for i = 1, #args, 3 do | |||
local x, y, id = args[i], args[i + 1], args[i + 2] | |||
points[id] = {x = x, y = y, id = id} | |||
end | |||
event.points = points | |||
else | |||
event.x = args[1] | |||
event.y = args[2] | |||
end | |||
return callback( event ) | |||
end, isMultiTouches, 0, swallowTouches) | |||
self:setTouchEnabled(true) | |||
return self | |||
end | |||
function Layer:removeTouch() | |||
self:unregisterScriptTouchHandler() | |||
self:setTouchEnabled(false) | |||
return self | |||
end | |||
function Layer:onKeypad(callback) | |||
self:registerScriptKeypadHandler(callback) | |||
self:setKeyboardEnabled(true) | |||
return self | |||
end | |||
function Layer:removeKeypad() | |||
self:unregisterScriptKeypadHandler() | |||
self:setKeyboardEnabled(false) | |||
return self | |||
end | |||
function Layer:onAccelerate(callback) | |||
self:registerScriptAccelerateHandler(callback) | |||
self:setAccelerometerEnabled(true) | |||
return self | |||
end | |||
function Layer:removeAccelerate() | |||
self:unregisterScriptAccelerateHandler() | |||
self:setAccelerometerEnabled(false) | |||
return self | |||
end | |||
--LayerEx_lua--LayerEx.lua |
@@ -0,0 +1,32 @@ | |||
--[[ | |||
Copyright (c) 2011-2014 chukong-inc.com | |||
Permission is hereby granted, free of charge, to any person obtaining a copy | |||
of this software and associated documentation files (the "Software"), to deal | |||
in the Software without restriction, including without limitation the rights | |||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | |||
copies of the Software, and to permit persons to whom the Software is | |||
furnished to do so, subject to the following conditions: | |||
The above copyright notice and this permission notice shall be included in | |||
all copies or substantial portions of the Software. | |||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | |||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | |||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | |||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | |||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | |||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN | |||
THE SOFTWARE. | |||
]] | |||
local Menu = cc.Menu | |||
local MenuItem = cc.MenuItem | |||
function MenuItem:onClicked(callback) | |||
self:registerScriptTapHandler(callback) | |||
return self | |||
end | |||
--MenuEx_lua--MenuEx.lua |
@@ -0,0 +1,229 @@ | |||
--[[ | |||
Copyright (c) 2011-2014 chukong-inc.com | |||
Permission is hereby granted, free of charge, to any person obtaining a copy | |||
of this software and associated documentation files (the "Software"), to deal | |||
in the Software without restriction, including without limitation the rights | |||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | |||
copies of the Software, and to permit persons to whom the Software is | |||
furnished to do so, subject to the following conditions: | |||
The above copyright notice and this permission notice shall be included in | |||
all copies or substantial portions of the Software. | |||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | |||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | |||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | |||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | |||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | |||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN | |||
THE SOFTWARE. | |||
]] | |||
local Node = cc.Node | |||
function Node:add(child, zorder, tag) | |||
if tag then | |||
self:addChild(child, zorder, tag) | |||
elseif zorder then | |||
self:addChild(child, zorder) | |||
else | |||
self:addChild(child) | |||
end | |||
return self | |||
end | |||
function Node:addTo(parent, zorder, tag) | |||
if tag then | |||
parent:addChild(self, zorder, tag) | |||
elseif zorder then | |||
parent:addChild(self, zorder) | |||
else | |||
parent:addChild(self) | |||
end | |||
return self | |||
end | |||
function Node:removeSelf() | |||
self:removeFromParent() | |||
return self | |||
end | |||
function Node:align(anchorPoint, x, y) | |||
self:setAnchorPoint(anchorPoint) | |||
return self:move(x, y) | |||
end | |||
function Node:show() | |||
self:setVisible(true) | |||
return self | |||
end | |||
function Node:hide() | |||
self:setVisible(false) | |||
return self | |||
end | |||
function Node:move(x, y) | |||
if y then | |||
self:setPosition(cc.p(x, y)) | |||
else | |||
self:setPosition(x) | |||
end | |||
return self | |||
end | |||
function Node:moveTo(args) | |||
transition.moveTo(self, args) | |||
return self | |||
end | |||
function Node:moveBy(args) | |||
transition.moveBy(self, args) | |||
return self | |||
end | |||
function Node:fadeIn(args) | |||
transition.fadeIn(self, args) | |||
return self | |||
end | |||
function Node:fadeOut(args) | |||
transition.fadeOut(self, args) | |||
return self | |||
end | |||
function Node:fadeTo(args) | |||
transition.fadeTo(self, args) | |||
return self | |||
end | |||
function Node:rotate(rotation) | |||
self:setRotation(rotation) | |||
return self | |||
end | |||
function Node:rotateTo(args) | |||
transition.rotateTo(self, args) | |||
return self | |||
end | |||
function Node:rotateBy(args) | |||
transition.rotateBy(self, args) | |||
return self | |||
end | |||
function Node:scaleTo(args) | |||
transition.scaleTo(self, args) | |||
return self | |||
end | |||
function Node:onUpdate(callback) | |||
self:scheduleUpdateWithPriorityLua(callback, 0) | |||
return self | |||
end | |||
Node.scheduleUpdate = Node.onUpdate | |||
function Node:onNodeEvent(eventName, callback) | |||
if "enter" == eventName then | |||
self.onEnterCallback_ = callback | |||
elseif "exit" == eventName then | |||
self.onExitCallback_ = callback | |||
elseif "enterTransitionFinish" == eventName then | |||
self.onEnterTransitionFinishCallback_ = callback | |||
elseif "exitTransitionStart" == eventName then | |||
self.onExitTransitionStartCallback_ = callback | |||
elseif "cleanup" == eventName then | |||
self.onCleanupCallback_ = callback | |||
end | |||
self:enableNodeEvents() | |||
end | |||
function Node:enableNodeEvents() | |||
if self.isNodeEventEnabled_ then | |||
return self | |||
end | |||
self:registerScriptHandler(function(state) | |||
if state == "enter" then | |||
self:onEnter_() | |||
elseif state == "exit" then | |||
self:onExit_() | |||
elseif state == "enterTransitionFinish" then | |||
self:onEnterTransitionFinish_() | |||
elseif state == "exitTransitionStart" then | |||
self:onExitTransitionStart_() | |||
elseif state == "cleanup" then | |||
self:onCleanup_() | |||
end | |||
end) | |||
self.isNodeEventEnabled_ = true | |||
return self | |||
end | |||
function Node:disableNodeEvents() | |||
self:unregisterScriptHandler() | |||
self.isNodeEventEnabled_ = false | |||
return self | |||
end | |||
function Node:onEnter() | |||
end | |||
function Node:onExit() | |||
end | |||
function Node:onEnterTransitionFinish() | |||
end | |||
function Node:onExitTransitionStart() | |||
end | |||
function Node:onCleanup() | |||
end | |||
function Node:onEnter_() | |||
self:onEnter() | |||
if not self.onEnterCallback_ then | |||
return | |||
end | |||
self:onEnterCallback_() | |||
end | |||
function Node:onExit_() | |||
self:onExit() | |||
if not self.onExitCallback_ then | |||
return | |||
end | |||
self:onExitCallback_() | |||
end | |||
function Node:onEnterTransitionFinish_() | |||
self:onEnterTransitionFinish() | |||
if not self.onEnterTransitionFinishCallback_ then | |||
return | |||
end | |||
self:onEnterTransitionFinishCallback_() | |||
end | |||
function Node:onExitTransitionStart_() | |||
self:onExitTransitionStart() | |||
if not self.onExitTransitionStartCallback_ then | |||
return | |||
end | |||
self:onExitTransitionStartCallback_() | |||
end | |||
function Node:onCleanup_() | |||
self:onCleanup() | |||
if not self.onCleanupCallback_ then | |||
return | |||
end | |||
self:onCleanupCallback_() | |||
end | |||
--NodeEx_lua--NodeEx.lua |
@@ -0,0 +1,68 @@ | |||
--[[ | |||
Copyright (c) 2011-2014 chukong-inc.com | |||
Permission is hereby granted, free of charge, to any person obtaining a copy | |||
of this software and associated documentation files (the "Software"), to deal | |||
in the Software without restriction, including without limitation the rights | |||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | |||
copies of the Software, and to permit persons to whom the Software is | |||
furnished to do so, subject to the following conditions: | |||
The above copyright notice and this permission notice shall be included in | |||
all copies or substantial portions of the Software. | |||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | |||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | |||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | |||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | |||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | |||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN | |||
THE SOFTWARE. | |||
]] | |||
local Sprite = cc.Sprite | |||
function Sprite:playAnimationOnce(animation, args) | |||
local actions = {} | |||
local showDelay = args.showDelay or 0 | |||
if showDelay then | |||
self:setVisible(false) | |||
actions[#actions + 1] = cc.DelayTime:create(showDelay) | |||
actions[#actions + 1] = cc.Show:create() | |||
end | |||
local delay = args.delay or 0 | |||
if delay > 0 then | |||
actions[#actions + 1] = cc.DelayTime:create(delay) | |||
end | |||
actions[#actions + 1] = cc.Animate:create(animation) | |||
if args.removeSelf then | |||
actions[#actions + 1] = cc.RemoveSelf:create() | |||
end | |||
if args.onComplete then | |||
actions[#actions + 1] = cc.CallFunc:create(args.onComplete) | |||
end | |||
local action | |||
if #actions > 1 then | |||
action = cc.Sequence:create(actions) | |||
else | |||
action = actions[1] | |||
end | |||
self:runAction(action) | |||
return action | |||
end | |||
function Sprite:playAnimationForever(animation) | |||
local animate = cc.Animate:create(animation) | |||
local action = cc.RepeatForever:create(animate) | |||
self:runAction(action) | |||
return action | |||
end | |||
--SpriteEx_lua--SpriteEx.lua |
@@ -0,0 +1,41 @@ | |||
--[[ | |||
Copyright (c) 2011-2014 chukong-inc.com | |||
Permission is hereby granted, free of charge, to any person obtaining a copy | |||
of this software and associated documentation files (the "Software"), to deal | |||
in the Software without restriction, including without limitation the rights | |||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | |||
copies of the Software, and to permit persons to whom the Software is | |||
furnished to do so, subject to the following conditions: | |||
The above copyright notice and this permission notice shall be included in | |||
all copies or substantial portions of the Software. | |||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | |||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | |||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | |||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | |||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | |||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN | |||
THE SOFTWARE. | |||
]] | |||
local CheckBox = ccui.CheckBox | |||
function CheckBox:onEvent(callback) | |||
self:addEventListener(function(sender, eventType) | |||
local event = {} | |||
if eventType == 0 then | |||
event.name = "selected" | |||
else | |||
event.name = "unselected" | |||
end | |||
event.target = sender | |||
callback(event) | |||
end) | |||
return self | |||
end | |||
--UICheckBox_lua--UICheckBox.lua |
@@ -0,0 +1,42 @@ | |||
--[[ | |||
Copyright (c) 2011-2014 chukong-inc.com | |||
Permission is hereby granted, free of charge, to any person obtaining a copy | |||
of this software and associated documentation files (the "Software"), to deal | |||
in the Software without restriction, including without limitation the rights | |||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | |||
copies of the Software, and to permit persons to whom the Software is | |||
furnished to do so, subject to the following conditions: | |||
The above copyright notice and this permission notice shall be included in | |||
all copies or substantial portions of the Software. | |||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | |||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | |||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | |||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | |||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | |||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN | |||
THE SOFTWARE. | |||
]] | |||
local EditBox = ccui.EditBox | |||
function EditBox:onEditHandler(callback) | |||
self:registerScriptEditBoxHandler(function(name, sender) | |||
local event = {} | |||
event.name = name | |||
event.target = sender | |||
callback(event) | |||
end) | |||
return self | |||
end | |||
function EditBox:removeEditHandler() | |||
self:unregisterScriptEditBoxHandler() | |||
return self | |||
end | |||
--UIEditBox_lua--UIEditBox.lua |
@@ -0,0 +1,69 @@ | |||
--[[ | |||
Copyright (c) 2011-2014 chukong-inc.com | |||
Permission is hereby granted, free of charge, to any person obtaining a copy | |||
of this software and associated documentation files (the "Software"), to deal | |||
in the Software without restriction, including without limitation the rights | |||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | |||
copies of the Software, and to permit persons to whom the Software is | |||
furnished to do so, subject to the following conditions: | |||
The above copyright notice and this permission notice shall be included in | |||
all copies or substantial portions of the Software. | |||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | |||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | |||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | |||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | |||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | |||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN | |||
THE SOFTWARE. | |||
]] | |||
local ListView = ccui.ListView | |||
function ListView:onEvent(callback) | |||
self:addEventListener(function(sender, eventType) | |||
local event = {} | |||
if eventType == 0 then | |||
event.name = "ON_SELECTED_ITEM_START" | |||
else | |||
event.name = "ON_SELECTED_ITEM_END" | |||
end | |||
event.target = sender | |||
callback(event) | |||
end) | |||
return self | |||
end | |||
function ListView:onScroll(callback) | |||
self:addScrollViewEventListener(function(sender, eventType) | |||
local event = {} | |||
if eventType == 0 then | |||
event.name = "SCROLL_TO_TOP" | |||
elseif eventType == 1 then | |||
event.name = "SCROLL_TO_BOTTOM" | |||
elseif eventType == 2 then | |||
event.name = "SCROLL_TO_LEFT" | |||
elseif eventType == 3 then | |||
event.name = "SCROLL_TO_RIGHT" | |||
elseif eventType == 4 then | |||
event.name = "SCROLLING" | |||
elseif eventType == 5 then | |||
event.name = "BOUNCE_TOP" | |||
elseif eventType == 6 then | |||
event.name = "BOUNCE_BOTTOM" | |||
elseif eventType == 7 then | |||
event.name = "BOUNCE_LEFT" | |||
elseif eventType == 8 then | |||
event.name = "BOUNCE_RIGHT" | |||
end | |||
event.target = sender | |||
callback(event) | |||
end) | |||
return self | |||
end | |||
--UIListView_lua--UIListView.lua |
@@ -0,0 +1,39 @@ | |||
--[[ | |||
Copyright (c) 2011-2014 chukong-inc.com | |||
Permission is hereby granted, free of charge, to any person obtaining a copy | |||
of this software and associated documentation files (the "Software"), to deal | |||
in the Software without restriction, including without limitation the rights | |||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | |||
copies of the Software, and to permit persons to whom the Software is | |||
furnished to do so, subject to the following conditions: | |||
The above copyright notice and this permission notice shall be included in | |||
all copies or substantial portions of the Software. | |||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | |||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | |||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | |||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | |||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | |||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN | |||
THE SOFTWARE. | |||
]] | |||
local PageView = ccui.PageView | |||
function PageView:onEvent(callback) | |||
self:addEventListener(function(sender, eventType) | |||
local event = {} | |||
if eventType == 0 then | |||
event.name = "TURNING" | |||
end | |||
event.target = sender | |||
callback(event) | |||
end) | |||
return self | |||
end | |||
--UIPageView_lua--UIPageView.lua |
@@ -0,0 +1,57 @@ | |||
--[[ | |||
Copyright (c) 2011-2014 chukong-inc.com | |||
Permission is hereby granted, free of charge, to any person obtaining a copy | |||
of this software and associated documentation files (the "Software"), to deal | |||
in the Software without restriction, including without limitation the rights | |||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | |||
copies of the Software, and to permit persons to whom the Software is | |||
furnished to do so, subject to the following conditions: | |||
The above copyright notice and this permission notice shall be included in | |||
all copies or substantial portions of the Software. | |||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | |||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | |||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | |||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | |||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | |||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN | |||
THE SOFTWARE. | |||
]] | |||
local ScrollView = ccui.ScrollView | |||
function ScrollView:onEvent(callback) | |||
self:addEventListener(function(sender, eventType) | |||
local event = {} | |||
if eventType == 0 then | |||
event.name = "SCROLL_TO_TOP" | |||
elseif eventType == 1 then | |||
event.name = "SCROLL_TO_BOTTOM" | |||
elseif eventType == 2 then | |||
event.name = "SCROLL_TO_LEFT" | |||
elseif eventType == 3 then | |||
event.name = "SCROLL_TO_RIGHT" | |||
elseif eventType == 4 then | |||
event.name = "SCROLLING" | |||
elseif eventType == 5 then | |||
event.name = "BOUNCE_TOP" | |||
elseif eventType == 6 then | |||
event.name = "BOUNCE_BOTTOM" | |||
elseif eventType == 7 then | |||
event.name = "BOUNCE_LEFT" | |||
elseif eventType == 8 then | |||
event.name = "BOUNCE_RIGHT" | |||
end | |||
event.target = sender | |||
callback(event) | |||
end) | |||
return self | |||
end | |||
ScrollView.onScroll = ScrollView.onEvent | |||
--UIScrollView_lua--UIScrollView.lua |
@@ -0,0 +1,39 @@ | |||
--[[ | |||
Copyright (c) 2011-2014 chukong-inc.com | |||
Permission is hereby granted, free of charge, to any person obtaining a copy | |||
of this software and associated documentation files (the "Software"), to deal | |||
in the Software without restriction, including without limitation the rights | |||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | |||
copies of the Software, and to permit persons to whom the Software is | |||
furnished to do so, subject to the following conditions: | |||
The above copyright notice and this permission notice shall be included in | |||
all copies or substantial portions of the Software. | |||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | |||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | |||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | |||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | |||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | |||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN | |||
THE SOFTWARE. | |||
]] | |||
local Slider = ccui.Slider | |||
function Slider:onEvent(callback) | |||
self:addEventListener(function(sender, eventType) | |||
local event = {} | |||
if eventType == 0 then | |||
event.name = "ON_PERCENTAGE_CHANGED" | |||
end | |||
event.target = sender | |||
callback(event) | |||
end) | |||
return self | |||
end | |||
--UISlider_lua--UISlider.lua |
@@ -0,0 +1,45 @@ | |||
--[[ | |||
Copyright (c) 2011-2014 chukong-inc.com | |||
Permission is hereby granted, free of charge, to any person obtaining a copy | |||
of this software and associated documentation files (the "Software"), to deal | |||
in the Software without restriction, including without limitation the rights | |||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | |||
copies of the Software, and to permit persons to whom the Software is | |||
furnished to do so, subject to the following conditions: | |||
The above copyright notice and this permission notice shall be included in | |||
all copies or substantial portions of the Software. | |||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | |||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | |||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | |||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | |||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | |||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN | |||
THE SOFTWARE. | |||
]] | |||
local TextField = ccui.TextField | |||
function TextField:onEvent(callback) | |||
self:addEventListener(function(sender, eventType) | |||
local event = {} | |||
if eventType == 0 then | |||
event.name = "ATTACH_WITH_IME" | |||
elseif eventType == 1 then | |||
event.name = "DETACH_WITH_IME" | |||
elseif eventType == 2 then | |||
event.name = "INSERT_TEXT" | |||
elseif eventType == 3 then | |||
event.name = "DELETE_BACKWARD" | |||
end | |||
event.target = sender | |||
callback(event) | |||
end) | |||
return self | |||
end | |||
--UITextField_lua--UITextField.lua |