Merge pull request #9663 from dualface/update_lua_corelib

update lua corelib
This commit is contained in:
minggo 2014-12-29 10:30:50 +08:00
commit 67ae66a90e
16 changed files with 2467 additions and 120 deletions

View File

@ -289,6 +289,55 @@ function cc.c4f( _r,_g,_b,_a )
return { r = _r, g = _g, b = _b, a = _a } return { r = _r, g = _g, b = _b, a = _a }
end end
local function isFloatColor(c)
return (c.r <= 1 and c.g <= 1 and c.b <= 1) and (math.ceil(c.r) ~= c.r or math.ceil(c.g) ~= c.g or math.ceil(c.b) ~= c.b)
end
function cc.convertColor(input, typ)
assert(type(input) == "table" and input.r and input.g and input.b, "cc.convertColor() - invalid input color")
local ret
if typ == "3b" then
if isFloatColor(input) then
ret = {r = math.ceil(input.r * 255), g = math.ceil(input.g * 255), b = math.ceil(input.b * 255)}
else
ret = {r = input.r, g = input.g, b = input.b}
end
elseif typ == "4b" then
if isFloatColor(input) then
ret = {r = math.ceil(input.r * 255), g = math.ceil(input.g * 255), b = math.ceil(input.b * 255)}
else
ret = {r = input.r, g = input.g, b = input.b}
end
if input.a then
if math.ceil(input.a) ~= input.a or input.a >= 1 then
ret.a = input.a * 255
else
ret.a = input.a
end
else
ret.a = 255
end
elseif typ == "4f" then
if isFloatColor(input) then
ret = {r = input.r, g = input.g, b = input.b}
else
ret = {r = input.r / 255, g = input.g / 255, b = input.b / 255}
end
if input.a then
if math.ceil(input.a) ~= input.a or input.a >= 1 then
ret.a = input.a
else
ret.a = input.a / 255
end
else
ret.a = 255
end
else
error(string.format("cc.convertColor() - invalid type %s", typ), 0)
end
return ret
end
--Vertex2F --Vertex2F
function cc.vertex2F(_x,_y) function cc.vertex2F(_x,_y)
return { x = _x, y = _y } return { x = _x, y = _y }

View File

@ -0,0 +1,15 @@
function schedule(node, callback, delay)
local delay = cc.DelayTime:create(delay)
local sequence = cc.Sequence:create(delay, cc.CallFunc:create(callback))
local action = cc.RepeatForever:create(sequence)
node:runAction(action)
return action
end
function performWithDelay(node, callback, delay)
local delay = cc.DelayTime:create(delay)
local sequence = cc.Sequence:create(delay, cc.CallFunc:create(callback))
node:runAction(sequence)
return sequence
end

View File

@ -1,93 +0,0 @@
function clone(object)
local lookup_table = {}
local function _copy(object)
if type(object) ~= "table" then
return object
elseif lookup_table[object] then
return lookup_table[object]
end
local new_table = {}
lookup_table[object] = new_table
for key, value in pairs(object) do
new_table[_copy(key)] = _copy(value)
end
return setmetatable(new_table, getmetatable(object))
end
return _copy(object)
end
--Create an class.
function class(classname, super)
local superType = type(super)
local cls
if superType ~= "function" and superType ~= "table" then
superType = nil
super = nil
end
if superType == "function" or (super and super.__ctype == 1) then
-- inherited from native C++ Object
cls = {}
if superType == "table" then
-- copy fields from super
for k,v in pairs(super) do cls[k] = v end
cls.__create = super.__create
cls.super = super
else
cls.__create = super
end
cls.ctor = function() end
cls.__cname = classname
cls.__ctype = 1
function cls.new(...)
local instance = cls.__create(...)
-- copy fields from class to native object
for k,v in pairs(cls) do instance[k] = v end
instance.class = cls
instance:ctor(...)
return instance
end
else
-- inherited from Lua Object
if super then
cls = clone(super)
cls.super = super
else
cls = {ctor = function() end}
end
cls.__cname = classname
cls.__ctype = 2 -- lua
cls.__index = cls
function cls.new(...)
local instance = setmetatable({}, cls)
instance.class = cls
instance:ctor(...)
return instance
end
end
return cls
end
function schedule(node, callback, delay)
local delay = cc.DelayTime:create(delay)
local sequence = cc.Sequence:create(delay, cc.CallFunc:create(callback))
local action = cc.RepeatForever:create(sequence)
node:runAction(action)
return action
end
function performWithDelay(node, callback, delay)
local delay = cc.DelayTime:create(delay)
local sequence = cc.Sequence:create(delay, cc.CallFunc:create(callback))
node:runAction(sequence)
return sequence
end

View File

@ -0,0 +1,634 @@
--[[
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.
]]
function printLog(tag, fmt, ...)
local t = {
"[",
string.upper(tostring(tag)),
"] ",
string.format(tostring(fmt), ...)
}
print(table.concat(t))
end
function printError(fmt, ...)
printLog("ERR", fmt, ...)
print(debug.traceback("", 2))
end
function printInfo(fmt, ...)
if type(DEBUG) ~= "number" or DEBUG < 2 then return end
printLog("INFO", fmt, ...)
end
local function dump_value_(v)
if type(v) == "string" then
v = "\"" .. v .. "\""
end
return tostring(v)
end
function dump(value, desciption, nesting)
if type(nesting) ~= "number" then nesting = 3 end
local lookupTable = {}
local result = {}
local traceback = string.split(debug.traceback("", 2), "\n")
print("dump from: " .. string.trim(traceback[3]))
local function dump_(value, desciption, indent, nest, keylen)
desciption = desciption or "<var>"
local spc = ""
if type(keylen) == "number" then
spc = string.rep(" ", keylen - string.len(dump_value_(desciption)))
end
if type(value) ~= "table" then
result[#result +1 ] = string.format("%s%s%s = %s", indent, dump_value_(desciption), spc, dump_value_(value))
elseif lookupTable[tostring(value)] then
result[#result +1 ] = string.format("%s%s%s = *REF*", indent, dump_value_(desciption), spc)
else
lookupTable[tostring(value)] = true
if nest > nesting then
result[#result +1 ] = string.format("%s%s = *MAX NESTING*", indent, dump_value_(desciption))
else
result[#result +1 ] = string.format("%s%s = {", indent, dump_value_(desciption))
local indent2 = indent.." "
local keys = {}
local keylen = 0
local values = {}
for k, v in pairs(value) do
keys[#keys + 1] = k
local vk = dump_value_(k)
local vkl = string.len(vk)
if vkl > keylen then keylen = vkl end
values[k] = v
end
table.sort(keys, function(a, b)
if type(a) == "number" and type(b) == "number" then
return a < b
else
return tostring(a) < tostring(b)
end
end)
for i, k in ipairs(keys) do
dump_(values[k], k, indent2, nest + 1, keylen)
end
result[#result +1] = string.format("%s}", indent)
end
end
end
dump_(value, desciption, "- ", 1)
for i, line in ipairs(result) do
print(line)
end
end
function printf(fmt, ...)
print(string.format(tostring(fmt), ...))
end
function checknumber(value, base)
return tonumber(value, base) or 0
end
function checkint(value)
return math.round(checknumber(value))
end
function checkbool(value)
return (value ~= nil and value ~= false)
end
function checktable(value)
if type(value) ~= "table" then value = {} end
return value
end
function isset(hashtable, key)
local t = type(hashtable)
return (t == "table" or t == "userdata") and hashtable[key] ~= nil
end
local setmetatableindex_
setmetatableindex_ = function(t, index)
if type(t) == "userdata" then
local peer = tolua.getpeer(t)
if not peer then
peer = {}
tolua.setpeer(t, peer)
end
setmetatableindex_(peer, index)
else
local mt = getmetatable(t)
if not mt then mt = {} end
if not mt.__index then
mt.__index = index
setmetatable(t, mt)
elseif mt.__index ~= index then
setmetatableindex_(mt, index)
end
end
end
setmetatableindex = setmetatableindex_
function clone(object)
local lookup_table = {}
local function _copy(object)
if type(object) ~= "table" then
return object
elseif lookup_table[object] then
return lookup_table[object]
end
local newObject = {}
lookup_table[object] = newObject
for key, value in pairs(object) do
newObject[_copy(key)] = _copy(value)
end
return setmetatable(newObject, getmetatable(object))
end
return _copy(object)
end
function class(classname, ...)
local cls = {__cname = classname}
local supers = {...}
for _, super in ipairs(supers) do
local superType = type(super)
assert(superType == "nil" or superType == "table" or superType == "function",
string.format("class() - create class \"%s\" with invalid super class type \"%s\"",
classname, superType))
if superType == "function" then
assert(cls.__create == nil,
string.format("class() - create class \"%s\" with more than one creating function",
classname));
-- if super is function, set it to __create
cls.__create = super
elseif superType == "table" then
if super[".isclass"] then
-- super is native class
assert(cls.__create == nil,
string.format("class() - create class \"%s\" with more than one creating function or native class",
classname));
cls.__create = function() return super:create() end
else
-- super is pure lua class
cls.__supers = cls.__supers or {}
cls.__supers[#cls.__supers + 1] = super
if not cls.super then
-- set first super pure lua class as class.super
cls.super = super
end
end
else
error(string.format("class() - create class \"%s\" with invalid super type",
classname), 0)
end
end
cls.__index = cls
if not cls.__supers or #cls.__supers == 1 then
setmetatable(cls, {__index = cls.super})
else
setmetatable(cls, {__index = function(_, key)
local supers = cls.__supers
for i = 1, #supers do
local super = supers[i]
if super[key] then return super[key] end
end
end})
end
if not cls.ctor then
-- add default constructor
cls.ctor = function() end
end
cls.new = function(...)
local instance
if cls.__create then
instance = cls.__create(...)
else
instance = {}
end
setmetatableindex(instance, cls)
instance.class = cls
instance:ctor(...)
return instance
end
cls.create = function(_, ...)
return cls.new(...)
end
return cls
end
local iskindof_
iskindof_ = function(cls, name)
local __index = rawget(cls, "__index")
if type(__index) == "table" and rawget(__index, "__cname") == name then return true end
if rawget(cls, "__cname") == name then return true end
local __supers = rawget(cls, "__supers")
if not __supers then return false end
for _, super in ipairs(__supers) do
if iskindof_(super, name) then return true end
end
return false
end
function iskindof(obj, classname)
local t = type(obj)
if t ~= "table" and t ~= "userdata" then return false end
local mt
if t == "userdata" then
if tolua.iskindof(obj, classname) then return true end
mt = tolua.getpeer(obj)
else
mt = getmetatable(obj)
end
if mt then
return iskindof_(mt, classname)
end
return false
end
function import(moduleName, currentModuleName)
local currentModuleNameParts
local moduleFullName = moduleName
local offset = 1
while true do
if string.byte(moduleName, offset) ~= 46 then -- .
moduleFullName = string.sub(moduleName, offset)
if currentModuleNameParts and #currentModuleNameParts > 0 then
moduleFullName = table.concat(currentModuleNameParts, ".") .. "." .. moduleFullName
end
break
end
offset = offset + 1
if not currentModuleNameParts then
if not currentModuleName then
local n,v = debug.getlocal(3, 1)
currentModuleName = v
end
currentModuleNameParts = string.split(currentModuleName, ".")
end
table.remove(currentModuleNameParts, #currentModuleNameParts)
end
return require(moduleFullName)
end
function handler(obj, method)
return function(...)
return method(obj, ...)
end
end
function math.newrandomseed()
local ok, socket = pcall(function()
return require("socket")
end)
if ok then
-- 如果集成了 socket 模块,则使用 socket.gettime() 获取随机数种子
math.randomseed(socket.gettime() * 1000)
else
math.randomseed(os.time())
end
math.random()
math.random()
math.random()
math.random()
end
function math.round(value)
value = checknumber(value)
return math.floor(value + 0.5)
end
local pi_div_180 = math.pi / 180
function math.angle2radian(angle)
return angle * pi_div_180
end
local pi_mul_180 = math.pi * 180
function math.radian2angle(radian)
return radian / pi_mul_180
end
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
function table.nums(t)
local count = 0
for k, v in pairs(t) do
count = count + 1
end
return count
end
function table.keys(hashtable)
local keys = {}
for k, v in pairs(hashtable) do
keys[#keys + 1] = k
end
return keys
end
function table.values(hashtable)
local values = {}
for k, v in pairs(hashtable) 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.insertto(dest, src, begin)
begin = checkint(begin)
if begin <= 0 then
begin = #dest + 1
end
local len = #src
for i = 0, len - 1 do
dest[i + begin] = src[i + 1]
end
end
function table.indexof(array, value, begin)
for i = begin or 1, #array do
if array[i] == value then return i end
end
return false
end
function table.keyof(hashtable, value)
for k, v in pairs(hashtable) do
if v == value then return k end
end
return nil
end
function table.removebyvalue(array, value, removeall)
local c, i, max = 0, 1, #array
while i <= max do
if array[i] == value then
table.remove(array, i)
c = c + 1
i = i - 1
max = max - 1
if not removeall then break end
end
i = i + 1
end
return c
end
function table.map(t, fn)
for k, v in pairs(t) do
t[k] = fn(v, k)
end
end
function table.walk(t, fn)
for k,v in pairs(t) do
fn(v, k)
end
end
function table.filter(t, fn)
for k, v in pairs(t) do
if not fn(v, k) then t[k] = nil end
end
end
function table.unique(t, bArray)
local check = {}
local n = {}
local idx = 1
for k, v in pairs(t) do
if not check[v] then
if bArray then
n[idx] = v
idx = idx + 1
else
n[k] = v
end
check[v] = true
end
end
return n
end
string._htmlspecialchars_set = {}
string._htmlspecialchars_set["&"] = "&amp;"
string._htmlspecialchars_set["\""] = "&quot;"
string._htmlspecialchars_set["'"] = "&#039;"
string._htmlspecialchars_set["<"] = "&lt;"
string._htmlspecialchars_set[">"] = "&gt;"
function string.htmlspecialchars(input)
for k, v in pairs(string._htmlspecialchars_set) do
input = string.gsub(input, k, v)
end
return input
end
function string.restorehtmlspecialchars(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, " ", "&nbsp;")
input = string.nl2br(input)
return input
end
function string.split(input, delimiter)
input = tostring(input)
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(input, delimiter, pos, true) end do
table.insert(arr, string.sub(input, pos, st - 1))
pos = sp + 1
end
table.insert(arr, string.sub(input, pos))
return arr
end
function string.ltrim(input)
return string.gsub(input, "^[ \t\n\r]+", "")
end
function string.rtrim(input)
return string.gsub(input, "[ \t\n\r]+$", "")
end
function string.trim(input)
input = string.gsub(input, "^[ \t\n\r]+", "")
return string.gsub(input, "[ \t\n\r]+$", "")
end
function string.ucfirst(input)
return string.upper(string.sub(input, 1, 1)) .. string.sub(input, 2)
end
local function urlencodechar(char)
return "%" .. string.format("%02X", string.byte(char))
end
function string.urlencode(input)
-- convert line endings
input = string.gsub(tostring(input), "\n", "\r\n")
-- escape all characters but alphanumeric, '.' and '-'
input = string.gsub(input, "([^%w%.%- ])", urlencodechar)
-- convert spaces to "+" symbols
return string.gsub(input, " ", "+")
end
function string.urldecode(input)
input = string.gsub (input, "+", " ")
input = string.gsub (input, "%%(%x%x)", function(h) return string.char(checknumber(h,16)) end)
input = string.gsub (input, "\r\n", "\n")
return input
end
function string.utf8len(input)
local len = string.len(input)
local left = len
local cnt = 0
local arr = {0, 0xc0, 0xe0, 0xf0, 0xf8, 0xfc}
while left ~= 0 do
local tmp = string.byte(input, -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(checknumber(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

View File

@ -0,0 +1,206 @@
--[[
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

View File

@ -0,0 +1,155 @@
local Event = class("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:addEventListener(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
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

View File

@ -0,0 +1,104 @@
--[[
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 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

View File

@ -0,0 +1,534 @@
--[[
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
elseif r.autoscale == "FIXED_HEIGHT" then
width = framesize.width / scaleY
height = framesize.height / scaleY
else
printError(string.format("display - invalid r.autoscale \"%s\"", r.autoscale))
end
view:setDesignResolutionSize(width, height, cc.ResolutionPolicy.NO_BORDER)
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 = "Arial"
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)
end
if display.TEXTURES_PIXEL_FORMAT[source] then
cc.Texture2D:setDefaultAlphaPixelFormat(cc.TEXTURE2D_PIXEL_FORMAT_RGBA8888)
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(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(souce) == 35 then -- first char is #
souce = string.sub(souce, 2)
end
frame = spriteFrameCache:getSpriteFrame(souce)
if not frame then
error(string.format("display.newSpriteFrame() - invalid frame name \"%s\"", tostring(souce)), 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.TEXTURE2D_PIXEL_FORMAT_RGBA8888)
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

View File

@ -0,0 +1,56 @@
--[[
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:enableTouch(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
callback(event)
end, isMultiTouches, 0, swallowTouches)
self:setTouchEnabled(true)
return self
end
function Layer:disableTouch()
self:unregisterScriptTouchHandler()
self:setTouchEnabled(false)
return self
end

View File

@ -0,0 +1,31 @@
--[[
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

View File

@ -0,0 +1,163 @@
--[[
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(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:scheduleUpdate(callback)
self:scheduleUpdateWithPriorityLua(callback, 0)
return self
end
function Node:enableNodeEvents()
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)
return self
end
function Node:disableNodeEvents()
self:unregisterScriptHandler()
return self
end
function Node:onEnter()
end
function Node:onExit()
end
function Node:onEnterTransitionFinish()
end
function Node:onExitTransitionStart()
end
function Node:onCleanup()
end

View File

@ -0,0 +1,67 @@
--[[
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 onComplete then
actions[#actions + 1] = cc.CallFunc:create(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

View File

@ -0,0 +1,77 @@
--[[
Copyright (c) 2011-2015 chukong-incc.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.
]]
__G__TRACKBACK__ = function(msg)
local msg = debug.traceback(msg, 3)
print(msg)
return msg
end
if type(DEBUG) ~= "number" then DEBUG = 0 end
-- load framework
printInfo("")
printInfo("# DEBUG = " .. DEBUG)
printInfo("#")
device = require("cocos.framework.device")
display = require("cocos.framework.display")
audio = require("cocos.framework.audio")
transition = require("cocos.framework.transition")
require("cocos.framework.extends.NodeEx")
require("cocos.framework.extends.SpriteEx")
require("cocos.framework.extends.LayerEx")
require("cocos.framework.extends.MenuEx")
require("cocos.framework.package_support")
-- register the build-in packages
cc.register("event", require("cocos.framework.components.event"))
-- export global variable
local __g = _G
cc.exports = {}
setmetatable(cc.exports, {
__newindex = function(_, name, value)
rawset(__g, name, value)
end,
__index = function(_, name)
return rawget(__g, name)
end
})
-- disable create unexpected global variable
function cc.disable_global()
setmetatable(__g, {
__newindex = function(_, name, value)
error(string.format("USE \" cc.exports.%s = value \" INSTEAD OF SET GLOBAL VARIABLE", name), 0)
end
})
end
if CC_DISABLE_GLOBAL then
cc.disable_global()
end

View File

@ -0,0 +1,113 @@
--[[
Copyright (c) 2011-2015 chukong-incc.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.
]]
-- Cocos2d-Lua core functions
cc.loaded_packages = {}
local loaded_packages = cc.loaded_packages
function cc.register(name, package)
cc.loaded_packages[name] = package
end
function cc.load(...)
local names = {...}
assert(#names > 0, "cc.load() - invalid package names")
local packages = {}
for _, name in ipairs(names) do
assert(type(name) == "string", string.format("cc.load() - invalid package name \"%s\"", tostring(name)))
if not loaded_packages[name] then
local packageName = string.format("packages.%s.init", name)
local cls = require(packageName)
assert(cls, string.format("cc.load() - package class \"%s\" load failed", packageName))
loaded_packages[name] = cls
if DEBUG > 1 then
printInfo("cc.load() - load module \"packages.%s.init\"", name)
end
end
packages[#packages + 1] = loaded_packages[name]
end
return unpack(packages)
end
local load_ = cc.load
local bind_
bind_ = function(target, ...)
local t = type(target)
assert(t == "table" or t == "userdata", string.format("cc.bind() - invalid target, expected is object, actual is %s", t))
local names = {...}
assert(#names > 0, "cc.bind() - package names expected")
load_(...)
if not target.components_ then target.components_ = {} end
for _, name in ipairs(names) do
assert(type(name) == "string" and name ~= "", string.format("cc.bind() - invalid package name \"%s\"", name))
if not target.components_[name] then
local cls = loaded_packages[name]
for __, depend in ipairs(cls.depends or {}) do
if not target.components_[depend] then
bind_(target, depend)
end
end
local component = cls:create()
target.components_[name] = component
component:bind(target)
end
end
return target
end
cc.bind = bind_
function cc.unbind(target, ...)
if not target.components_ then return end
local names = {...}
assert(#names > 0, "cc.unbind() - invalid package names")
for _, name in ipairs(names) do
assert(type(name) == "string" and name ~= "", string.format("cc.unbind() - invalid package name \"%s\"", name))
local component = target.components_[name]
assert(component, string.format("cc.unbind() - component \"%s\" not found", tostring(name)))
component:unbind(target)
target.components_[name] = nil
end
return target
end
function cc.setmethods(target, component, methods)
for _, name in ipairs(methods) do
local method = component[name]
target[name] = function(__, ...)
return method(component, ...)
end
end
end
function cc.unsetmethods(target, methods)
for _, name in ipairs(methods) do
target[name] = nil
end
end

View File

@ -0,0 +1,213 @@
--[[
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 transition = {}
local ACTION_EASING = {}
ACTION_EASING["BACKIN"] = {cc.EaseBackIn, 1}
ACTION_EASING["BACKINOUT"] = {cc.EaseBackInOut, 1}
ACTION_EASING["BACKOUT"] = {cc.EaseBackOut, 1}
ACTION_EASING["BOUNCE"] = {cc.EaseBounce, 1}
ACTION_EASING["BOUNCEIN"] = {cc.EaseBounceIn, 1}
ACTION_EASING["BOUNCEINOUT"] = {cc.EaseBounceInOut, 1}
ACTION_EASING["BOUNCEOUT"] = {cc.EaseBounceOut, 1}
ACTION_EASING["ELASTIC"] = {cc.EaseElastic, 2, 0.3}
ACTION_EASING["ELASTICIN"] = {cc.EaseElasticIn, 2, 0.3}
ACTION_EASING["ELASTICINOUT"] = {cc.EaseElasticInOut, 2, 0.3}
ACTION_EASING["ELASTICOUT"] = {cc.EaseElasticOut, 2, 0.3}
ACTION_EASING["EXPONENTIALIN"] = {cc.EaseExponentialIn, 1}
ACTION_EASING["EXPONENTIALINOUT"] = {cc.EaseExponentialInOut, 1}
ACTION_EASING["EXPONENTIALOUT"] = {cc.EaseExponentialOut, 1}
ACTION_EASING["IN"] = {cc.EaseIn, 2, 1}
ACTION_EASING["INOUT"] = {cc.EaseInOut, 2, 1}
ACTION_EASING["OUT"] = {cc.EaseOut, 2, 1}
ACTION_EASING["RATEACTION"] = {cc.EaseRateAction, 2, 1}
ACTION_EASING["SINEIN"] = {cc.EaseSineIn, 1}
ACTION_EASING["SINEINOUT"] = {cc.EaseSineInOut, 1}
ACTION_EASING["SINEOUT"] = {cc.EaseSineOut, 1}
local actionManager = cc.Director:getInstance():getActionManager()
function transition.newEasing(action, easingName, more)
local key = string.upper(tostring(easingName))
local easing
if ACTION_EASING[key] then
local cls, count, default = unpack(ACTION_EASING[key])
if count == 2 then
easing = cls:create(action, more or default)
else
easing = cls:create(action)
end
end
return easing or action
end
function transition.create(action, args)
args = checktable(args)
if args.easing then
if type(args.easing) == "table" then
action = transition.newEasing(action, unpack(args.easing))
else
action = transition.newEasing(action, args.easing)
end
end
local actions = {}
local delay = checknumber(args.delay)
if delay > 0 then
actions[#actions + 1] = cc.DelayTime:create(delay)
end
actions[#actions + 1] = action
local onComplete = args.onComplete
if type(onComplete) ~= "function" then onComplete = nil end
if onComplete then
actions[#actions + 1] = cc.CallFunc:create(onComplete)
end
if args.removeSelf then
actions[#actions + 1] = cc.RemoveSelf:create()
end
if #actions > 1 then
return transition.sequence(actions)
else
return actions[1]
end
end
function transition.execute(target, action, args)
assert(not tolua.isnull(target), "transition.execute() - target is not cc.Node")
local action = transition.create(action, args)
target:runAction(action)
return action
end
function transition.moveTo(target, args)
assert(not tolua.isnull(target), "transition.moveTo() - target is not cc.Node")
local x = args.x or target:getPositionX()
local y = args.y or target:getPositionY()
local action = cc.MoveTo:create(args.time, cc.p(x, y))
return transition.execute(target, action, args)
end
function transition.moveBy(target, args)
assert(not tolua.isnull(target), "transition.moveBy() - target is not cc.Node")
local x = args.x or 0
local y = args.y or 0
local action = cc.MoveBy:create(args.time, cc.p(x, y))
return transition.execute(target, action, args)
end
function transition.fadeIn(target, args)
assert(not tolua.isnull(target), "transition.fadeIn() - target is not cc.Node")
local action = cc.FadeIn:create(args.time)
return transition.execute(target, action, args)
end
function transition.fadeOut(target, args)
assert(not tolua.isnull(target), "transition.fadeOut() - target is not cc.Node")
local action = cc.FadeOut:create(args.time)
return transition.execute(target, action, args)
end
function transition.fadeTo(target, args)
assert(not tolua.isnull(target), "transition.fadeTo() - target is not cc.Node")
local opacity = checkint(args.opacity)
if opacity < 0 then
opacity = 0
elseif opacity > 255 then
opacity = 255
end
local action = cc.FadeTo:create(args.time, opacity)
return transition.execute(target, action, args)
end
function transition.scaleTo(target, args)
assert(not tolua.isnull(target), "transition.scaleTo() - target is not cc.Node")
local action
if args.scale then
action = cc.ScaleTo:create(checknumber(args.time), checknumber(args.scale))
elseif args.scaleX or args.scaleY then
local scaleX, scaleY
if args.scaleX then
scaleX = checknumber(args.scaleX)
else
scaleX = target:getScaleX()
end
if args.scaleY then
scaleY = checknumber(args.scaleY)
else
scaleY = target:getScaleY()
end
action = cc.ScaleTo:create(checknumber(args.time), scaleX, scaleY)
end
return transition.execute(target, action, args)
end
function transition.rotateTo(target, args)
assert(not tolua.isnull(target), "transition.rotateTo() - target is not cc.Node")
local rotation = args.rotation or target:getRotation()
local action = cc.RotateTo:create(args.time, rotation)
return transition.execute(target, action, args)
end
function transition.rotateBy(target, args)
assert(not tolua.isnull(target), "transition.rotateTo() - target is not cc.Node")
local rotation = args.rotation or 0
local action = cc.RotateBy:create(args.time, rotation)
return transition.execute(target, action, args)
end
function transition.sequence(actions)
if #actions < 1 then return end
if #actions < 2 then return actions[1] end
return cc.Sequence:create(actions)
end
function transition.removeAction(action)
if not tolua.isnull(action) then
actionManager:removeAction(action)
end
end
function transition.stopTarget(target)
if not tolua.isnull(target) then
actionManager:removeAllActionsFromTarget(target)
end
end
function transition.pauseTarget(target)
if not tolua.isnull(target) then
actionManager:pauseTarget(target)
end
end
function transition.resumeTarget(target)
if not tolua.isnull(target) then
actionManager:resumeTarget(target)
end
end
return transition

View File

@ -1,37 +1,57 @@
--[[
Copyright (c) 2011-2015 chukong-incc.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.
]]
require "cocos.cocos2d.Cocos2d" require "cocos.cocos2d.Cocos2d"
require "cocos.cocos2d.Cocos2dConstants" require "cocos.cocos2d.Cocos2dConstants"
require "cocos.cocos2d.extern" require "cocos.cocos2d.functions"
require "cocos.cocos2d.bitExtend"
require "cocos.cocos2d.DrawPrimitives"
-- opengl if CC_USE_FRAMEWORK then
require "cocos.cocos2d.Opengl" require "cocos.framework.init"
require "cocos.cocos2d.OpenglConstants" else
-- opengl
require "cocos.cocos2d.Opengl"
require "cocos.cocos2d.OpenglConstants"
-- audio
require "cocos.cocosdenshion.AudioEngine"
-- cocosstudio
require "cocos.cocostudio.CocoStudio"
-- ui
require "cocos.ui.GuiConstants"
require "cocos.ui.experimentalUIConstants"
-- extensions
require "cocos.extension.ExtensionConstants"
-- network
require "cocos.network.NetworkConstants"
-- Spine
require "cocos.spine.SpineConstants"
-- cocosbuilder require "cocos.deprecated"
require "cocos.cocosbuilder.CCBReaderLoad" require "cocos.cocos2d.DrawPrimitives"
-- cocosdenshion -- Lua extensions
require "cocos.cocosdenshion.AudioEngine" require "cocos.cocos2d.bitExtend"
-- cocosstudio
require "cocos.cocostudio.CocoStudio"
-- ui
require "cocos.ui.GuiConstants"
require "cocos.ui.experimentalUIConstants"
-- extensions
require "cocos.extension.ExtensionConstants"
-- network
require "cocos.network.NetworkConstants"
-- Spine
require "cocos.spine.SpineConstants"
if CC_USE_DEPRECATED_API then
-- CCLuaEngine -- CCLuaEngine
require "cocos.cocos2d.DeprecatedCocos2dClass" require "cocos.cocos2d.DeprecatedCocos2dClass"
require "cocos.cocos2d.DeprecatedCocos2dEnum" require "cocos.cocos2d.DeprecatedCocos2dEnum"
@ -62,4 +82,7 @@ if CC_USE_DEPRECATED_API then
-- register_ui_moudle -- register_ui_moudle
require "cocos.ui.DeprecatedUIEnum" require "cocos.ui.DeprecatedUIEnum"
require "cocos.ui.DeprecatedUIFunc" require "cocos.ui.DeprecatedUIFunc"
-- cocosbuilder
require "cocos.cocosbuilder.CCBReaderLoad"
end end