Передача пользовательских данных через событие
Синтаксис: Lua
-------срабатывание события------------------
function ee(event)
print(event.data1) --вывод переданных данных "12345"
end
stage:addEventListener("myevent",ee) -- слушать событие "myevent"
-------вызов события-----------------
local event=Event.new("myevent")
event.data1 = "12345" --передаем данные в событие
stage:dispatchEvent(event) -- вызвать событие "myevent"
function ee(event)
print(event.data1) --вывод переданных данных "12345"
end
stage:addEventListener("myevent",ee) -- слушать событие "myevent"
-------вызов события-----------------
local event=Event.new("myevent")
event.data1 = "12345" --передаем данные в событие
stage:dispatchEvent(event) -- вызвать событие "myevent"
_________________
Мой метод проверки коллизий между классами через систему событий.
Синтаксис: Lua
function CollisionClass(sprite,class1) --вызов события для КЛАССА проверки коллизии
local event=Event.new(class1)
event.x=sprite:getX()
event.y=sprite:getY()
event.h=sprite:getHeight()
event.w=sprite:getWidth()
stage:dispatchEvent(event)
end
function collision(x,y,h,w,sprite2,r) --проверка коллизии 2х спрайтов
-- self bottom < other sprite top
if y + h-r < sprite2:getY() then
return false
end
-- self top > other sprite bottom
if y > sprite2:getY() + sprite2:getHeight()-r then
return false
end
-- self left > other sprite right
if x > sprite2:getX() + sprite2:getWidth()-r then
return false
end
-- self right < other sprite left
if x + w-r < sprite2:getX() then
return false
end
return true
end
-----------------------------------------------------------
-- class1
-----------------------------------------------------------
class1= Core.class(Sprite)
function class1:init(x,y)
--код обьекта *****
self:setPosition(x,y)
stage:addChild(self)
local function col_class1(event)
if collision(event.x,event.y,event.h,event.w,self,5) then
self.speed=0 --действие при коллизии------------------
end
end
stage:addEventListener("class2",col_class1) -- слушаем событие проверки коллизии
end
-----------------------------------------------------------
-- class2
-----------------------------------------------------------
class2= Core.class(Sprite)
function class2:init(x,y)
--код обьекта *****
self:setPosition(x,y)
stage:addChild(self)
self:addEventListener(Event.ENTER_FRAME, self.onEnterFrame, self)
end
function class2:onEnterFrame(event)
CollisionClass(self,"class2") --проверяем коллизию обьекта class2 со всеми обьектами класса class1
end
local event=Event.new(class1)
event.x=sprite:getX()
event.y=sprite:getY()
event.h=sprite:getHeight()
event.w=sprite:getWidth()
stage:dispatchEvent(event)
end
function collision(x,y,h,w,sprite2,r) --проверка коллизии 2х спрайтов
-- self bottom < other sprite top
if y + h-r < sprite2:getY() then
return false
end
-- self top > other sprite bottom
if y > sprite2:getY() + sprite2:getHeight()-r then
return false
end
-- self left > other sprite right
if x > sprite2:getX() + sprite2:getWidth()-r then
return false
end
-- self right < other sprite left
if x + w-r < sprite2:getX() then
return false
end
return true
end
-----------------------------------------------------------
-- class1
-----------------------------------------------------------
class1= Core.class(Sprite)
function class1:init(x,y)
--код обьекта *****
self:setPosition(x,y)
stage:addChild(self)
local function col_class1(event)
if collision(event.x,event.y,event.h,event.w,self,5) then
self.speed=0 --действие при коллизии------------------
end
end
stage:addEventListener("class2",col_class1) -- слушаем событие проверки коллизии
end
-----------------------------------------------------------
-- class2
-----------------------------------------------------------
class2= Core.class(Sprite)
function class2:init(x,y)
--код обьекта *****
self:setPosition(x,y)
stage:addChild(self)
self:addEventListener(Event.ENTER_FRAME, self.onEnterFrame, self)
end
function class2:onEnterFrame(event)
CollisionClass(self,"class2") --проверяем коллизию обьекта class2 со всеми обьектами класса class1
end
_________________
фреймворк GiderosCodingEasy
дуже крута штука додає в Гідерос багато нових функцій та інтегрує фізичну бібліотеку box2d на один рівень абстракції з АПІ Gideros
для використання достатньо в проект імпортувати файли
GiderosCodingEasy.lua
Box2dEasy.lua
GestureEventEasy.lua
easing.lua
gtween.lua
в
init.lua імпортуємо
користуватись просто:
список назв кольорів
оперуємо з текстом
ЗВУКИ
фігури
створити спрайт з малюнка
створити спрайт з фігури
створити спрайт з фігури з евентом
приклад колізій
не забуваємо добавити всі створені обєкти в гру
перемістити text в верхній слой
і приклад анімацій разних типів руху спрайтів
дуже крута штука додає в Гідерос багато нових функцій та інтегрує фізичну бібліотеку box2d на один рівень абстракції з АПІ Gideros
для використання достатньо в проект імпортувати файли
GiderosCodingEasy.lua
Box2dEasy.lua
GestureEventEasy.lua
easing.lua
gtween.lua
в
init.lua імпортуємо
Синтаксис: Lua
require "box2d"
require "GiderosCodingEasy"
require "Box2dEasy"
require "GestureEventEasy"
require "GiderosCodingEasy"
require "Box2dEasy"
require "GestureEventEasy"
користуватись просто:
Синтаксис: Lua
--задати колір за назвою а не кодом
application:setBackgroundColor("yellow")
:setFps(60) -- фпс 60 або 30
:setKeepAwake(true) -- не гасити екран прни простої
:enableFiltering() -- антиальязінг
application:setBackgroundColor("yellow")
:setFps(60) -- фпс 60 або 30
:setKeepAwake(true) -- не гасити екран прни простої
:enableFiltering() -- антиальязінг
список назв кольорів
Скрытый текст:
оперуємо з текстом
Синтаксис: Lua
local font = TTFont.new("tahoma.ttf", 70) --файл шрифту повинен бути імпортований в проект
local text = TextField.new(font, "Приклад тексту")
--позиціювання за назвою
:setPosition("center", "center")
--позиціювання за координатами
:setPosition(300,250)
--назва кольору
:setTextColor("white") --білий
:setAnchorPoint(0.5, 0.5)
--поворот
:setRotation(45)
--тінь
:setShadow(3, 3, "gray", 0.5)
--скос
:setSkew(60)
local text = TextField.new(font, "Приклад тексту")
--позиціювання за назвою
:setPosition("center", "center")
--позиціювання за координатами
:setPosition(300,250)
--назва кольору
:setTextColor("white") --білий
:setAnchorPoint(0.5, 0.5)
--поворот
:setRotation(45)
--тінь
:setShadow(3, 3, "gray", 0.5)
--скос
:setSkew(60)
ЗВУКИ
фігури
Синтаксис: Lua
local test = Shape.new()
:setFillStyle(Shape.SOLID, "white")--зафарбувати білим
--Shape:drawRoundRectangle(width, height, radius) прямокутник з закругленими кутами
:drawRoundRectangle(90, 90, 10)
:setPosition(100, 100)
:setAnchorPoint(0.5)
:setRotation(45)
:setSkewX(45)
:setFillStyle(Shape.SOLID, "white")--зафарбувати білим
--Shape:drawRoundRectangle(width, height, radius) прямокутник з закругленими кутами
:drawRoundRectangle(90, 90, 10)
:setPosition(100, 100)
:setAnchorPoint(0.5)
:setRotation(45)
:setSkewX(45)
створити спрайт з малюнка
Синтаксис: Lua
local bitmap = Bitmap.new("crate.png")
:setPosition("center","top")
:setAnchorPoint(0.5)
:setPosition("center","top")
:setAnchorPoint(0.5)
створити спрайт з фігури
Синтаксис: Lua
local bitmap = Shape.new()
:setFillStyle(Shape.SOLID, "red") --сплошний червоний
:drawRectangle(100,100) --квадрат 11 на 100
:setAnchorPoint(0.5)
:setAbsolutePosition("right", "bottom")
:setPosition("center","bottom")
:setFillStyle(Shape.SOLID, "red") --сплошний червоний
:drawRectangle(100,100) --квадрат 11 на 100
:setAnchorPoint(0.5)
:setAbsolutePosition("right", "bottom")
:setPosition("center","bottom")
створити спрайт з фігури з евентом
Синтаксис: Lua
local shape = Shape.new()
--задати колір назвою
:setFillStyle(Shape.SOLID, "red")
--задати тип примітиву
--:drawRect(100, 100) -- прямокутник
:drawCircle(100, 100, 100) -- коло
--позиціонуємо
:setY("center")
:setX("center")
--евент на тач по фігурі
:addEventListener(Event.TOUCHES_BEGIN, function(e)
--при евенті друкувати дані тача (координати округлені[y].[x] .координати абсолютні[rx] .[ry] айді тача при одночасному тачі декількома пальцями[id])
print_r(e.touch)
end)
--задати колір назвою
:setFillStyle(Shape.SOLID, "red")
--задати тип примітиву
--:drawRect(100, 100) -- прямокутник
:drawCircle(100, 100, 100) -- коло
--позиціонуємо
:setY("center")
:setX("center")
--евент на тач по фігурі
:addEventListener(Event.TOUCHES_BEGIN, function(e)
--при евенті друкувати дані тача (координати округлені[y].[x] .координати абсолютні[rx] .[ry] айді тача при одночасному тачі декількома пальцями[id])
print_r(e.touch)
end)
приклад колізій
Синтаксис: Lua
-- box2d приклад
local world = b2.World.new(0, 10, true)
--додати картинку спрайта
local crate = Bitmap.new("crate.png", true)
:setPosition("center", "center")
--створити з картинки динамічний об'єкт
world:createRectangle(crate, {type = "dynamic"})
--створити з test драгабельний динамічний об'єкт з заданим хітбоксом
--world:createRoundRectangle(test, 90, 90, 10, {type = "dynamic", draggable = true})
--створити спрайт ball з картинки
local ball = Bitmap.new("ball.png", true)
:setPosition("left", "center")
--створити з ball динамічний драгабельний об'єкт
world:createCircle(ball, {type = "dynamic", draggable = true})
--перемістити ball за координатами
ball:setPosition(400, 100)
--створити евент при колізії ball з crate
world:addBeginContact(ball, crate, function()
print("початок колізії") --при колізії друкуємо
end)
:addEndContact(ball, crate, function()
print("кінець колізії") --при закінченні колізії
end)
--створити зону навколо екрану щоб об'єкти не вилітали з видимості
:createTerrain(nil, {0,0,
application:getContentWidth(),0,
application:getContentWidth(), application:getContentHeight(),
0, application:getContentHeight(),
0,0})
local world = b2.World.new(0, 10, true)
--додати картинку спрайта
local crate = Bitmap.new("crate.png", true)
:setPosition("center", "center")
--створити з картинки динамічний об'єкт
world:createRectangle(crate, {type = "dynamic"})
--створити з test драгабельний динамічний об'єкт з заданим хітбоксом
--world:createRoundRectangle(test, 90, 90, 10, {type = "dynamic", draggable = true})
--створити спрайт ball з картинки
local ball = Bitmap.new("ball.png", true)
:setPosition("left", "center")
--створити з ball динамічний драгабельний об'єкт
world:createCircle(ball, {type = "dynamic", draggable = true})
--перемістити ball за координатами
ball:setPosition(400, 100)
--створити евент при колізії ball з crate
world:addBeginContact(ball, crate, function()
print("початок колізії") --при колізії друкуємо
end)
:addEndContact(ball, crate, function()
print("кінець колізії") --при закінченні колізії
end)
--створити зону навколо екрану щоб об'єкти не вилітали з видимості
:createTerrain(nil, {0,0,
application:getContentWidth(),0,
application:getContentWidth(), application:getContentHeight(),
0, application:getContentHeight(),
0,0})
не забуваємо добавити всі створені обєкти в гру
Синтаксис: Lua
stage:addChild(text)
:addChild(shape)
:addChild(bitmap)
:addChild(test)
:addChild(crate)
:addChild(ball)
--для дебагу фізичних об'єктів world
:addChild(world:getDebug())
--оновлюєм фізику щофреймово world
:addEventListener(Event.ENTER_FRAME, function()
world:update()
end)
:addChild(shape)
:addChild(bitmap)
:addChild(test)
:addChild(crate)
:addChild(ball)
--для дебагу фізичних об'єктів world
:addChild(world:getDebug())
--оновлюєм фізику щофреймово world
:addEventListener(Event.ENTER_FRAME, function()
world:update()
end)
перемістити text в верхній слой
і приклад анімацій разних типів руху спрайтів
Синтаксис: Lua
--приклади використання німації руху
local value = 10
crate:set("linearVelocityX", -value)
GTween.new(crate, .8, {linearVelocityX = crate:get("linearVelocityX") + value * 2}, {reflect = true, setLoop = true, repeatCount = 0})
GTween.new(ball, 0.8, {scaleBody = crate:get("scaleBody") + 0.5}, {reflect = true, setLoop = true, repeatCount = 0})
GTween.new(shape, 0.8, {anchorX = 1, anchorY = 1, rotation = 360}, {reflect = true, setLoop = true, repeatCount = 0})
GTween.new(test, 2, {rotation = 720})
local value = 10
crate:set("linearVelocityX", -value)
GTween.new(crate, .8, {linearVelocityX = crate:get("linearVelocityX") + value * 2}, {reflect = true, setLoop = true, repeatCount = 0})
GTween.new(ball, 0.8, {scaleBody = crate:get("scaleBody") + 0.5}, {reflect = true, setLoop = true, repeatCount = 0})
GTween.new(shape, 0.8, {anchorX = 1, anchorY = 1, rotation = 360}, {reflect = true, setLoop = true, repeatCount = 0})
GTween.new(test, 2, {rotation = 720})
_________________
GiderosCodingEasy
Додаткові функції GiderosCodingEasy
Додаткові функції GiderosCodingEasy
Синтаксис: Lua
print_r (t, indent, done)
math.round(num, factor)
io.exists(file)
io.copy(src, dst)
--SPRITE РАСШИРЕНИЯ
Sprite:getAnchorPoint() --return self._anchorX, self._anchorY
Sprite:setAnchorPoint(x, y)
Sprite:setRotation(angle)
Sprite:getX()
Sprite:getY()
Sprite:getPosition()
Sprite:bringToFront()
Sprite:sendToBack()
Sprite:setIndex(index)
Sprite:getIndex()
Sprite:addChildAtBack(child)
Sprite:addChildBefore(child, reference)
Sprite:addChildAfter(child, reference)
Sprite:replaceChild(existing, newchild)
Sprite:collidesWith(sprite2) --[[ simple collision detection ]]--
Sprite:setX(x)
Sprite:setY(y)
Sprite:setPosition(x, y)
Sprite:ignoreTouchHandler(event) -- Simple handler to ignore touches on a sprite. This blocks touches
Sprite:ignoreMouseHandler(event) -- Simple handler to ignore mouse events on a sprite. This blocks mouse events
Sprite:ignoreTouches(event) -- Tell a sprite to ignore (and block) all mouse and touch events
Sprite:enableTouches() -- Tell a sprite to ignore (and block) all mouse and touch events
Sprite:setWidth(newWidth) -- Set a sprite's width using the scale property
Sprite:setHeight(newHeight) -- Set a sprite's height using the scale property
Sprite:setSkew(xAng, yAng) --[[ skew transformation ]]--
Sprite:setSkewX(xAng)
Sprite:setSkewY(yAng)
Sprite:getSkew()
Sprite:getSkewX()
Sprite:getSkewY()
Sprite:flipHorizontal() --[[ flipping ]]--
Sprite:flipVertical()
Sprite:hide() --[[ hiding/showing visually and from touch/mouse events ]]--
Sprite:isHidden()
Sprite:show()
TextField:setTextColor(...)
TextField:getTextColor()
TextField:setLetterSpacing(...)
TextField:setShadow(offX, offY, color, alpha)
Shape:drawPoly(points) --[[ draw a polygon from a list of vertices ]]--
Shape:drawRectangle(width, height) --[[ draw rectangle ]]--
bezier3(p1,p2,p3,mu)
bezier4(p1,p2,p3,p4,mu)
quadraticCurve(startx, starty, cpx, cpy, x, y, mu)
Shape:getPoints()
Shape:quadraticCurveTo(cpx, cpy, x, y, mu)
Shape:bezierCurveTo(cp1x, cp1y, cp2x, cp2y, x, y, mu)
Shape:drawRoundRectangle(width, height, radius)
Shape:drawEllipse(x,y,xradius,yradius,startAngle,endAngle,anticlockwise)
Shape:drawArc(centerX, centerY, radius, startAngle, endAngle, anticlockwise)
Shape:drawCircle(centerX, centerY, radius, anticlockwise)
Application:setVolume(volume)
Application:getVolume()
Application:enableFiltering() --[[ global antialising implementation ]]--
Application:disableFiltering()
Application:isFilteringEnabled()
Sound:play(...)
Sound:playWithLoopCount(startTime, nbLoops)
SoundChannel:set(param, value) --param=="volume" param=="pitch"
SoundChannel:get(param, value)
SoundChannel:fadeIn(duration, optFinalLevel, completionFunc)
SoundChannel:fadeOut(duration, optFinalLevel, completionFunc)
Matrix:rotate(deg)
Matrix:translate(x,y)
Matrix:translateX(x)
Matrix:scale(sx,sy)
Matrix:scaleX(x)
Matrix:skew(xAng,yAng)
Matrix:skewX(xAng)
Matrix:multiply(matrix)
Matrix:copy()
Matrix:apply(obj)
Matrix:reset()
--[[
EVENT NAMES
]]--
Event.SINGLE_TAP = "singleTap"
Event.DOUBLE_TAP = "doubleTap"
Event.TRIPLE_TAP = "tripleTap"
Event.LONG_TAP = "longTap"
Event.SWIPE_DOWN = "swipeDown"
Event.SWIPE_UP = "swipeUp"
Event.SWIPE_LEFT = "swipeLeft"
Event.SWIPE_RIGHT = "swipeRight"
Event.DRAG_START = "dragStart"
Event.DRAG_MOVE = "dragMove"
Event.DRAG_END = "dragEnd"
b2.World:createCircle(object, config) --conf.type == "dynamic" conf.type == "kinematic" conf.type == "static"
b2.World:removeBody(object, destroy)
math.round(num, factor)
io.exists(file)
io.copy(src, dst)
--SPRITE РАСШИРЕНИЯ
Sprite:getAnchorPoint() --return self._anchorX, self._anchorY
Sprite:setAnchorPoint(x, y)
Sprite:setRotation(angle)
Sprite:getX()
Sprite:getY()
Sprite:getPosition()
Sprite:bringToFront()
Sprite:sendToBack()
Sprite:setIndex(index)
Sprite:getIndex()
Sprite:addChildAtBack(child)
Sprite:addChildBefore(child, reference)
Sprite:addChildAfter(child, reference)
Sprite:replaceChild(existing, newchild)
Sprite:collidesWith(sprite2) --[[ simple collision detection ]]--
Sprite:setX(x)
Sprite:setY(y)
Sprite:setPosition(x, y)
Sprite:ignoreTouchHandler(event) -- Simple handler to ignore touches on a sprite. This blocks touches
Sprite:ignoreMouseHandler(event) -- Simple handler to ignore mouse events on a sprite. This blocks mouse events
Sprite:ignoreTouches(event) -- Tell a sprite to ignore (and block) all mouse and touch events
Sprite:enableTouches() -- Tell a sprite to ignore (and block) all mouse and touch events
Sprite:setWidth(newWidth) -- Set a sprite's width using the scale property
Sprite:setHeight(newHeight) -- Set a sprite's height using the scale property
Sprite:setSkew(xAng, yAng) --[[ skew transformation ]]--
Sprite:setSkewX(xAng)
Sprite:setSkewY(yAng)
Sprite:getSkew()
Sprite:getSkewX()
Sprite:getSkewY()
Sprite:flipHorizontal() --[[ flipping ]]--
Sprite:flipVertical()
Sprite:hide() --[[ hiding/showing visually and from touch/mouse events ]]--
Sprite:isHidden()
Sprite:show()
TextField:setTextColor(...)
TextField:getTextColor()
TextField:setLetterSpacing(...)
TextField:setShadow(offX, offY, color, alpha)
Shape:drawPoly(points) --[[ draw a polygon from a list of vertices ]]--
Shape:drawRectangle(width, height) --[[ draw rectangle ]]--
bezier3(p1,p2,p3,mu)
bezier4(p1,p2,p3,p4,mu)
quadraticCurve(startx, starty, cpx, cpy, x, y, mu)
Shape:getPoints()
Shape:quadraticCurveTo(cpx, cpy, x, y, mu)
Shape:bezierCurveTo(cp1x, cp1y, cp2x, cp2y, x, y, mu)
Shape:drawRoundRectangle(width, height, radius)
Shape:drawEllipse(x,y,xradius,yradius,startAngle,endAngle,anticlockwise)
Shape:drawArc(centerX, centerY, radius, startAngle, endAngle, anticlockwise)
Shape:drawCircle(centerX, centerY, radius, anticlockwise)
Application:setVolume(volume)
Application:getVolume()
Application:enableFiltering() --[[ global antialising implementation ]]--
Application:disableFiltering()
Application:isFilteringEnabled()
Sound:play(...)
Sound:playWithLoopCount(startTime, nbLoops)
SoundChannel:set(param, value) --param=="volume" param=="pitch"
SoundChannel:get(param, value)
SoundChannel:fadeIn(duration, optFinalLevel, completionFunc)
SoundChannel:fadeOut(duration, optFinalLevel, completionFunc)
Matrix:rotate(deg)
Matrix:translate(x,y)
Matrix:translateX(x)
Matrix:scale(sx,sy)
Matrix:scaleX(x)
Matrix:skew(xAng,yAng)
Matrix:skewX(xAng)
Matrix:multiply(matrix)
Matrix:copy()
Matrix:apply(obj)
Matrix:reset()
--[[
EVENT NAMES
]]--
Event.SINGLE_TAP = "singleTap"
Event.DOUBLE_TAP = "doubleTap"
Event.TRIPLE_TAP = "tripleTap"
Event.LONG_TAP = "longTap"
Event.SWIPE_DOWN = "swipeDown"
Event.SWIPE_UP = "swipeUp"
Event.SWIPE_LEFT = "swipeLeft"
Event.SWIPE_RIGHT = "swipeRight"
Event.DRAG_START = "dragStart"
Event.DRAG_MOVE = "dragMove"
Event.DRAG_END = "dragEnd"
b2.World:createCircle(object, config) --conf.type == "dynamic" conf.type == "kinematic" conf.type == "static"
b2.World:removeBody(object, destroy)
_________________
МЕТА-ТАБЛИЦІ
СПАДКОВІСТЬ
--створюємо об'єкт лампу
Ми створили , просто лампочку "lamp " вміє включатися-вимикатися,
а супер-ламкочка "superlamp " буде ще і яскравість міняти. Навіщо нам переписувати методи turn_on / turn_off, якщо можна їх повторно використовувати?
У Lua для цього є поняття мета-таблиці, тобто таблиці-предка. У кожної таблиці є одна таблиця-предок, і дочірня таблиця вміє робити все, що вміє предок. об'єкт-таблицю lamp ми вже створили. Тоді супер-лампочка буде виглядати так:
ЗМІНЮЄМО СИНТАКСИС МОВИ З ДОПОМОГОЮ МЕТАТАБЛИЦЬ
СПЕЦІАЛЬНІ ФУНКЦІЇ
Деякі імена функцій таблиць (методів) зарезервовані, і вони несуть особливий сенс:
__ add (a, b),
__ sub (a, b),
__ div (a, b),
__ mul (a, b),
__ mod (a, b) ,
__ pow (a, b) - викликаються, коли виконуються арифметичні операції над таблицею
__ unm (a) - унарна операція «мінус» (коли пишуть щось типу "x =-x")
__ lt (a, b),
__ le (a, b),
__ eq (a, b) - обчислюють результат порівняння (<, <=, ==)
__ len (a) - викликається, коли робиться "#a"
__ Concat (a, b) - викликається при "a..b"
__ Call (a, ...) - викликається при "a()" Змінні аргументи - це аргументи при виклику
__ index (a, i) - звернення до a [i], за умови, що такого елемента не існує
__ newindex (a, i, v) - створення "a[i] = v"
__ Gc (a) - коли об'єкт віддаляється при складанні мусора ПІДМІНЮЮЧИ ці методи, можна перевантажувати оператори і використовувати синтаксис мови для своїх цілей.
ПІДМІНА СТАНДАРТНИХ ФУНКЦІЙ
Припустимо, ми хочемо складати всі рядки за допомогою оператора "+", а не ".." Для цього треба підмінити функцію «+» (__add) для батьківської таблиці всіх рядків:
Також ми можемо підміняти функції: , ми ще можемо замінити функцію print за допомогою «print = myfunction», та й багато інших хакерських справ можна зробити.
Функції (...)
Функції можуть приймати змінну кількість аргументів: змінне число аргументів записується як три крапки "...", звертаються до них, як до таблиці "arg"
Ще приклад:
ЗАХИЩЕНИЙ РЕЖИМ ФУНКЦІЇ - БОРОТЬБА З ВИЛЬОТАМИ ПРОГРАМИ ПРИ ПОМИЛКАХ
прототип:
ok, result [ , result2 ...] = pcall (f, arg1, arg2, ...)
ще приклад:
функція xpcall (f, err)
У разі виникнення помилки виконується функція err
ok, result = xpcall (f, err)
СПАДКОВІСТЬ
--створюємо об'єкт лампу
Синтаксис: Lua
lamp = {
on = false
turn_on = function(l) l.on = true end
turn_off = function(l) l.on = false end
}
--тепер щоб увімкнути/вимкнути лампу пишемо
lamp:turn_on()
lamp:turn_off()
on = false
turn_on = function(l) l.on = true end
turn_off = function(l) l.on = false end
}
--тепер щоб увімкнути/вимкнути лампу пишемо
lamp:turn_on()
lamp:turn_off()
Ми створили , просто лампочку "lamp " вміє включатися-вимикатися,
а супер-ламкочка "superlamp " буде ще і яскравість міняти. Навіщо нам переписувати методи turn_on / turn_off, якщо можна їх повторно використовувати?
У Lua для цього є поняття мета-таблиці, тобто таблиці-предка. У кожної таблиці є одна таблиця-предок, і дочірня таблиця вміє робити все, що вміє предок. об'єкт-таблицю lamp ми вже створили. Тоді супер-лампочка буде виглядати так:
Синтаксис: Lua
superlamp = {
brightness = 100
}
-- вказуємо таблицю предка
setmetatable(superlamp, lamp)
-- і її методи тепер доступні і для суперлампи
superlamp:turn_on()
superlamp:turn_off()
brightness = 100
}
-- вказуємо таблицю предка
setmetatable(superlamp, lamp)
-- і її методи тепер доступні і для суперлампи
superlamp:turn_on()
superlamp:turn_off()
ЗМІНЮЄМО СИНТАКСИС МОВИ З ДОПОМОГОЮ МЕТАТАБЛИЦЬ
СПЕЦІАЛЬНІ ФУНКЦІЇ
Деякі імена функцій таблиць (методів) зарезервовані, і вони несуть особливий сенс:
__ add (a, b),
__ sub (a, b),
__ div (a, b),
__ mul (a, b),
__ mod (a, b) ,
__ pow (a, b) - викликаються, коли виконуються арифметичні операції над таблицею
__ unm (a) - унарна операція «мінус» (коли пишуть щось типу "x =-x")
__ lt (a, b),
__ le (a, b),
__ eq (a, b) - обчислюють результат порівняння (<, <=, ==)
__ len (a) - викликається, коли робиться "#a"
__ Concat (a, b) - викликається при "a..b"
__ Call (a, ...) - викликається при "a()" Змінні аргументи - це аргументи при виклику
__ index (a, i) - звернення до a [i], за умови, що такого елемента не існує
__ newindex (a, i, v) - створення "a[i] = v"
__ Gc (a) - коли об'єкт віддаляється при складанні мусора ПІДМІНЮЮЧИ ці методи, можна перевантажувати оператори і використовувати синтаксис мови для своїх цілей.
ПІДМІНА СТАНДАРТНИХ ФУНКЦІЙ
Припустимо, ми хочемо складати всі рядки за допомогою оператора "+", а не ".." Для цього треба підмінити функцію «+» (__add) для батьківської таблиці всіх рядків:
Синтаксис: Lua
s = getmetatable("") -- отримали таблицю предка рядка
s.__add = function(s1, s2) return s1..s2 end -- підмінили метод
-- перевіряємо
a = "hello"
b = "world"
print(a + b) -- напише "helloworld"
s.__add = function(s1, s2) return s1..s2 end -- підмінили метод
-- перевіряємо
a = "hello"
b = "world"
print(a + b) -- напише "helloworld"
Також ми можемо підміняти функції: , ми ще можемо замінити функцію print за допомогою «print = myfunction», та й багато інших хакерських справ можна зробити.
Функції (...)
Функції можуть приймати змінну кількість аргументів: змінне число аргументів записується як три крапки "...", звертаються до них, як до таблиці "arg"
Синтаксис: Lua
-- в прототипі змінне число аргументів записується як три крапки "..."
function sum(...)
s = 0
for _, n in pairs(arg) do -- у функції звертаються до них, як до таблиці "arg"
s = s + n
end
return a
end
sum(1, 2, 3) -- верне 6
sum(1, 2, 3, 4) -- верне 10
function sum(...)
s = 0
for _, n in pairs(arg) do -- у функції звертаються до них, як до таблиці "arg"
s = s + n
end
return a
end
sum(1, 2, 3) -- верне 6
sum(1, 2, 3, 4) -- верне 10
Ще приклад:
Синтаксис: Lua
Bitmap._new = Bitmap.new
function Bitmap.new(...)
local arg = {...}
if type(arg[1]) == "string" then
arg[1] = Texture.new(...)
end
local bitmap = Bitmap._new(arg[1])
bitmap._texture = arg[1]
return bitmap
end
local crate = Bitmap.new("crate.png", true)
function Bitmap.new(...)
local arg = {...}
if type(arg[1]) == "string" then
arg[1] = Texture.new(...)
end
local bitmap = Bitmap._new(arg[1])
bitmap._texture = arg[1]
return bitmap
end
local crate = Bitmap.new("crate.png", true)
ЗАХИЩЕНИЙ РЕЖИМ ФУНКЦІЇ - БОРОТЬБА З ВИЛЬОТАМИ ПРОГРАМИ ПРИ ПОМИЛКАХ
! | Якщо ви викликаєте функцію, яка може створити помилку (або її дочірні функції можуть створити помилку), то викликайте її безпечно, за допомогою pcall (): |
прототип:
ok, result [ , result2 ...] = pcall (f, arg1, arg2, ...)
Синтаксис: Lua
function myfunction(x, y)
...
if ... then
error("failed to do somthing")
end
...
end
status, err = pcall(myfunction, x, y) -- f:функція, x-y: її аргументи
if not status then
-- опрацювати помилку err. в err знаходиться текст помилки "failed to do somthing"
end
...
if ... then
error("failed to do somthing")
end
...
end
status, err = pcall(myfunction, x, y) -- f:функція, x-y: її аргументи
if not status then
-- опрацювати помилку err. в err знаходиться текст помилки "failed to do somthing"
end
ще приклад:
Синтаксис: Lua
function f (v)
return v + 2
end -- f
a, b = pcall (f, 1)
print (a, b) --> 1+2 отримаємо 3
a, b = pcall (f, "a")
print (a, b) --> "a"+2 викличе помилку при додаванні текстової змінної
return v + 2
end -- f
a, b = pcall (f, 1)
print (a, b) --> 1+2 отримаємо 3
a, b = pcall (f, "a")
print (a, b) --> "a"+2 викличе помилку при додаванні текстової змінної
функція xpcall (f, err)
У разі виникнення помилки виконується функція err
ok, result = xpcall (f, err)
_________________
реалізація швидкої перевірки колізії між групами об'єктів з застосуванням функцій box2d
І включаємо в проект необхідні функції бібліотеки:
Синтаксис: Lua
-----------------------------------------------------------
-- sprite1 Клас1
-----------------------------------------------------------
sprite1 = Core.class(Sprite)
function sprite1 :init(x,y)
local pict=Bitmap.new(Texture.new("function/58.jpg"))
pict:setAnchorPoint(0.5,0.5)
self:addChild(pict)
self:setPosition(x,y)
stage:addChild(self)
--СТВОРЮЄМО ХІТ-БОКС ДЛЯ СПРАЙТУ І ПРИЗНАЧАЄМО З КИМ У НЬОГО КОЛІЗІЯ
--HitBox([спрайт],"[назва групи]",[номер біта],[сума біт для колізії])
-- "[назва групи]" - назва групи до якої входить цей спрайт
-- [номер біта] - номер біту групи до якої входить спрайт наприклад 1,2,4,8,16,32,64 і т.д
-- [сума біт для колізії] -- сума біт груп з якими перевіряти колізію з даним спрайтом наприклад 1+2+4=7
HitBox(self,"sprite1",1,3)
----------------ФУНКЦІЯ ПРИ ПОЧАТКУ КОЛІЗІЇ----------------------------------
self.colBegin= function(self,other)
print(self.group.."<-begin->"-begin->..other.group)
destroy(self)
end
----------------ФУНКЦІЯ ПРИ КІНЦІ КОЛІЗІЇ---------------------------------------
self.colEnd= function(self,other)
print(self.group.."<-end->"-end->..other.group)
end
-----------------------------
self.spX=0
self.spY=100
function sprite1:onEnterFrame(event)
-----------------------------------------------------------------------------
--швидкість польоту
self:setX(self:getX() + self.spX/60) --добавимо до X спрайта +1
self:setY(self:getY() + self.spY/60)
end
self:addEventListener(Event.ENTER_FRAME, self.onEnterFrame, self)
end
-----------------------------------------------------------
-- sprite2 клас2
-----------------------------------------------------------
sprite2 = Core.class(Sprite)
function sprite2:init(x,y)
local pict=Bitmap.new(Texture.new("function/58.jpg"))
pict:setAnchorPoint(0.5,0.5)
self:addChild(pict)
----------------------------------------------------
self:setPosition(x,y)
stage:addChild(self)
------------------------------------
HitBox(self,"sprite2",2,3)
--self.colBegin= function(self,other) print(self.group.."-->"..other.group) end
--self.colEnd= function(self,other) print(self.group.."-->"..other.group) end
-- sprite1 Клас1
-----------------------------------------------------------
sprite1 = Core.class(Sprite)
function sprite1 :init(x,y)
local pict=Bitmap.new(Texture.new("function/58.jpg"))
pict:setAnchorPoint(0.5,0.5)
self:addChild(pict)
self:setPosition(x,y)
stage:addChild(self)
--СТВОРЮЄМО ХІТ-БОКС ДЛЯ СПРАЙТУ І ПРИЗНАЧАЄМО З КИМ У НЬОГО КОЛІЗІЯ
--HitBox([спрайт],"[назва групи]",[номер біта],[сума біт для колізії])
-- "[назва групи]" - назва групи до якої входить цей спрайт
-- [номер біта] - номер біту групи до якої входить спрайт наприклад 1,2,4,8,16,32,64 і т.д
-- [сума біт для колізії] -- сума біт груп з якими перевіряти колізію з даним спрайтом наприклад 1+2+4=7
HitBox(self,"sprite1",1,3)
----------------ФУНКЦІЯ ПРИ ПОЧАТКУ КОЛІЗІЇ----------------------------------
self.colBegin= function(self,other)
print(self.group.."<-begin->"-begin->..other.group)
destroy(self)
end
----------------ФУНКЦІЯ ПРИ КІНЦІ КОЛІЗІЇ---------------------------------------
self.colEnd= function(self,other)
print(self.group.."<-end->"-end->..other.group)
end
-----------------------------
self.spX=0
self.spY=100
function sprite1:onEnterFrame(event)
-----------------------------------------------------------------------------
--швидкість польоту
self:setX(self:getX() + self.spX/60) --добавимо до X спрайта +1
self:setY(self:getY() + self.spY/60)
end
self:addEventListener(Event.ENTER_FRAME, self.onEnterFrame, self)
end
-----------------------------------------------------------
-- sprite2 клас2
-----------------------------------------------------------
sprite2 = Core.class(Sprite)
function sprite2:init(x,y)
local pict=Bitmap.new(Texture.new("function/58.jpg"))
pict:setAnchorPoint(0.5,0.5)
self:addChild(pict)
----------------------------------------------------
self:setPosition(x,y)
stage:addChild(self)
------------------------------------
HitBox(self,"sprite2",2,3)
--self.colBegin= function(self,other) print(self.group.."-->"..other.group) end
--self.colEnd= function(self,other) print(self.group.."-->"..other.group) end
Синтаксис: Lua
--створюємо об'єкти з хіт-боксами
b2d_init(true) --ініціалізація бібліотеки true --ввімкнути режим тестування з промальовкою хіт-боксів
sprite1.new(300,400)
sprite2.new(300,100)
b2d_init(true) --ініціалізація бібліотеки true --ввімкнути режим тестування з промальовкою хіт-боксів
sprite1.new(300,400)
sprite2.new(300,100)
І включаємо в проект необхідні функції бібліотеки:
Синтаксис: Lua
--(c) simart.info
-------------------------------------------------------------------
-- ІНІЦІАЛІЗАЦІЯ ФІЗИКИ -- ОДНОРАЗОВО!!!
-------------------------------------------------------------------
function b2d_init(d)
require "box2d"
b2.setScale(20)
actors = {}
world = b2.World.new(0, 1) --b -гравітація
-------------------------------------------------------------------
-- ГЛОБАЛЬНО ОНОВЛЮВАТИ ФІЗИКУ СВІТУ
-------------------------------------------------------------------
local function b2d_onEnterFrame()
world:step(1/60, 8, 3)
for body,sprite in pairs(actors) do
if sprite.del then --видалити хітбокс
sprite.del=nil
world:destroyBody(body)
--stage:removeChild(sprite)
actors[body] = nil
else
body:setPosition(sprite:getPosition()) --перемістити хітбокс по координатам спрайту
body:setAngle(sprite:getRotation() * math.pi/180)
end
end
end
stage:addEventListener(Event.ENTER_FRAME, b2d_onEnterFrame)
-------------------------------------------------------------------
--ПРИ КОЛІЗІЇ
-------------------------------------------------------------------
local function onBeginContact(event)
-- you can get the fixtures and bodies in this contact like:
local fixtureA = event.fixtureA
local fixtureB = event.fixtureB
local bodyA = fixtureA:getBody() -- хітбокс
local bodyB = fixtureB:getBody()
local spriteA = actors[bodyA] --спрайт
local spriteB = actors[bodyB]
if spriteA.colBegin then
spriteA:colBegin(spriteB) --запустимо ф-цію спрайта дії при колізії з передачею ім'я з ким колізія
end
if spriteB.colBegin then
spriteB:colBegin(spriteA)
end
-- в кожному класі спрайту робимо функцію self:colBegin(group) --дія при колізії
end
--Додати ГЛОБАЛЬНУ ПОДІЮ
world:addEventListener(Event.BEGIN_CONTACT, onBeginContact)
local function onEndContact(event)
-- you can get the fixtures and bodies in this contact like:
local fixtureA = event.fixtureA
local fixtureB = event.fixtureB
local bodyA = fixtureA:getBody()
local bodyB = fixtureB:getBody()
local spriteA = actors[bodyA]
local spriteB = actors[bodyB]
if spriteA.colEnd then
spriteA:colEnd(spriteB)
end
if spriteB.colEnd then
spriteB:colEnd(spriteA)
end
end
world:addEventListener(Event.END_CONTACT, onEndContact)
if d==true then --тестовий режим
local debugDraw = b2.DebugDraw.new()
world:setDebugDraw(debugDraw)
stage:addChild(debugDraw)
end
end
--b2d_init(true) приклад разового виклику
----------------------------------------------------------------------------------------------------------
function HitBox(sprite,group,sB,cB,f)--- додати параметри: type, shape,sprite
sprite.group=group
sprite.contactBits=cB --сума біт груп з ким колізія 1+2+4
sprite.selfBits=sB --біт групи 1,2,4,8,16,32,64,128,256,512 ...
local body = world:createBody{type = b2.DYNAMIC_BODY, position = {x = sprite:getX(), y = sprite:getY()}}
local shape = b2.PolygonShape.new()
shape:setAsBox(sprite:getWidth()/2, sprite:getHeight()/2) --квадрат по розміру спрайту
local fixture = body:createFixture{shape = shape, density = 1, restitution = 0.2, friction = 0.3}
-- selfBits -номер біта поточного спрайта / contactBits- сума біт спрайтів крім поточного з якими перевіряти колізію
fixture:setFilterData({categoryBits = sprite.selfBits, maskBits = sprite.contactBits, groupIndex = 0})
---- сенсор
fixture:setSensor(true) --робимо сенсором
actors[body] = sprite
sprite.body=body
end
-----------------------------------------------------------------------------------------------------------
--ВИДАЛИТИ СПРАЙТ
function destroy(sprite1)
if sprite1.body then --якщо у спрайта є хітбокс видалити хітбокс
sprite1.del=true
end
sprite1:removeFromParent() --видалити спрайт
collectgarbage()
collectgarbage()
collectgarbage()
collectgarbage()
end
-------------------------------------------------------------------
-- ІНІЦІАЛІЗАЦІЯ ФІЗИКИ -- ОДНОРАЗОВО!!!
-------------------------------------------------------------------
function b2d_init(d)
require "box2d"
b2.setScale(20)
actors = {}
world = b2.World.new(0, 1) --b -гравітація
-------------------------------------------------------------------
-- ГЛОБАЛЬНО ОНОВЛЮВАТИ ФІЗИКУ СВІТУ
-------------------------------------------------------------------
local function b2d_onEnterFrame()
world:step(1/60, 8, 3)
for body,sprite in pairs(actors) do
if sprite.del then --видалити хітбокс
sprite.del=nil
world:destroyBody(body)
--stage:removeChild(sprite)
actors[body] = nil
else
body:setPosition(sprite:getPosition()) --перемістити хітбокс по координатам спрайту
body:setAngle(sprite:getRotation() * math.pi/180)
end
end
end
stage:addEventListener(Event.ENTER_FRAME, b2d_onEnterFrame)
-------------------------------------------------------------------
--ПРИ КОЛІЗІЇ
-------------------------------------------------------------------
local function onBeginContact(event)
-- you can get the fixtures and bodies in this contact like:
local fixtureA = event.fixtureA
local fixtureB = event.fixtureB
local bodyA = fixtureA:getBody() -- хітбокс
local bodyB = fixtureB:getBody()
local spriteA = actors[bodyA] --спрайт
local spriteB = actors[bodyB]
if spriteA.colBegin then
spriteA:colBegin(spriteB) --запустимо ф-цію спрайта дії при колізії з передачею ім'я з ким колізія
end
if spriteB.colBegin then
spriteB:colBegin(spriteA)
end
-- в кожному класі спрайту робимо функцію self:colBegin(group) --дія при колізії
end
--Додати ГЛОБАЛЬНУ ПОДІЮ
world:addEventListener(Event.BEGIN_CONTACT, onBeginContact)
local function onEndContact(event)
-- you can get the fixtures and bodies in this contact like:
local fixtureA = event.fixtureA
local fixtureB = event.fixtureB
local bodyA = fixtureA:getBody()
local bodyB = fixtureB:getBody()
local spriteA = actors[bodyA]
local spriteB = actors[bodyB]
if spriteA.colEnd then
spriteA:colEnd(spriteB)
end
if spriteB.colEnd then
spriteB:colEnd(spriteA)
end
end
world:addEventListener(Event.END_CONTACT, onEndContact)
if d==true then --тестовий режим
local debugDraw = b2.DebugDraw.new()
world:setDebugDraw(debugDraw)
stage:addChild(debugDraw)
end
end
--b2d_init(true) приклад разового виклику
----------------------------------------------------------------------------------------------------------
function HitBox(sprite,group,sB,cB,f)--- додати параметри: type, shape,sprite
sprite.group=group
sprite.contactBits=cB --сума біт груп з ким колізія 1+2+4
sprite.selfBits=sB --біт групи 1,2,4,8,16,32,64,128,256,512 ...
local body = world:createBody{type = b2.DYNAMIC_BODY, position = {x = sprite:getX(), y = sprite:getY()}}
local shape = b2.PolygonShape.new()
shape:setAsBox(sprite:getWidth()/2, sprite:getHeight()/2) --квадрат по розміру спрайту
local fixture = body:createFixture{shape = shape, density = 1, restitution = 0.2, friction = 0.3}
-- selfBits -номер біта поточного спрайта / contactBits- сума біт спрайтів крім поточного з якими перевіряти колізію
fixture:setFilterData({categoryBits = sprite.selfBits, maskBits = sprite.contactBits, groupIndex = 0})
---- сенсор
fixture:setSensor(true) --робимо сенсором
actors[body] = sprite
sprite.body=body
end
-----------------------------------------------------------------------------------------------------------
--ВИДАЛИТИ СПРАЙТ
function destroy(sprite1)
if sprite1.body then --якщо у спрайта є хітбокс видалити хітбокс
sprite1.del=true
end
sprite1:removeFromParent() --видалити спрайт
collectgarbage()
collectgarbage()
collectgarbage()
collectgarbage()
end
_________________
Дебагінг та відстеження
Приклад:
Необхідні для роботи функції (скопіювати в проект):
Приклад:
Синтаксис: Lua
--щоб увімкнути відладку разово стартуємо ф-ю
my_debug() --увімкнути дебагінг без тегів
--my_debug("all") --дебагінг з всіма тегами
--my_debug("колізія") --дебагінг з конкретним тегом
--my_debug("init")
--тепер в потрібних місцях, функціях, класах викликаємо функцію
trace("комент") --повідомлення дебагера без тега
trace("комент","колізія") --повідомлення з тегом
trace("комент","init") --повідомлення з тегом
my_debug() --увімкнути дебагінг без тегів
--my_debug("all") --дебагінг з всіма тегами
--my_debug("колізія") --дебагінг з конкретним тегом
--my_debug("init")
--тепер в потрібних місцях, функціях, класах викликаємо функцію
trace("комент") --повідомлення дебагера без тега
trace("комент","колізія") --повідомлення з тегом
trace("комент","init") --повідомлення з тегом
Необхідні для роботи функції (скопіювати в проект):
Синтаксис: Lua
function my_debug(tag)
dbg={}
dbg.f=true
if tag then dbg.tag=tag end
end
function trace(text,tag)
if dbg.f==true then
if tag then
if dbg.tag==tag or dbg.tag=="all" then
print("tag=("..tag..")"..debug.traceback(text,2))
end
else
print(debug.traceback(text,2))
end
end
end
dbg={}
dbg.f=true
if tag then dbg.tag=tag end
end
function trace(text,tag)
if dbg.f==true then
if tag then
if dbg.tag==tag or dbg.tag=="all" then
print("tag=("..tag..")"..debug.traceback(text,2))
end
else
print(debug.traceback(text,2))
end
end
end
_________________
генерація фігур;
--коло
--закруглений квадрат
--квадрат
створюємо фігури
--коло
Синтаксис: Lua
function circle(x,y,radius,color,border1,colorL,alfa)
local myShape = Shape.new()
myShape:setLineStyle(border1, colorL,alfa )
myShape:setFillStyle ( Shape.SOLID , color,alfa )
x=x+radius
y=y+radius
myShape:beginPath() --рисуем путь из линий
myShape:moveTo(x+radius,y) --стартовая точка
for i=1,360,1 do
myShape:lineTo(x+math.cos(math.rad(i))*radius,y+math.sin(math.rad(i))*radius)
end
myShape:endPath()
stage:addChild(myShape)
end
local myShape = Shape.new()
myShape:setLineStyle(border1, colorL,alfa )
myShape:setFillStyle ( Shape.SOLID , color,alfa )
x=x+radius
y=y+radius
myShape:beginPath() --рисуем путь из линий
myShape:moveTo(x+radius,y) --стартовая точка
for i=1,360,1 do
myShape:lineTo(x+math.cos(math.rad(i))*radius,y+math.sin(math.rad(i))*radius)
end
myShape:endPath()
stage:addChild(myShape)
end
--закруглений квадрат
Синтаксис: Lua
function boxR(x,y,w,h,radius,color,border1,colorL,alfa)
if radius>w/2 then radius=w/2 end
if radius>h/2 then radius=h/2 end
local myShape = Shape.new()
myShape:setLineStyle(border1, colorL,alfa )
myShape:setFillStyle(Shape.SOLID, color,alfa)
myShape:beginPath()
myShape:moveTo(x+radius,y)
for i=-90,0,1 do
myShape:lineTo(x+w-radius+math.cos(math.rad(i))*radius,y+radius+math.sin(math.rad(i))*radius)
end
for i=0,90,1 do
myShape:lineTo(x+w-radius+math.cos(math.rad(i))*radius,y+h-radius+math.sin(math.rad(i))*radius)
end
for i=90,180,1 do
myShape:lineTo(x+radius+math.cos(math.rad(i))*radius,y+h-radius+math.sin(math.rad(i))*radius)
end
for i=180,270,1 do
myShape:lineTo(x+radius+math.cos(math.rad(i))*radius,y+radius+math.sin(math.rad(i))*radius)
end
myShape:endPath()
stage:addChild(myShape)
end
if radius>w/2 then radius=w/2 end
if radius>h/2 then radius=h/2 end
local myShape = Shape.new()
myShape:setLineStyle(border1, colorL,alfa )
myShape:setFillStyle(Shape.SOLID, color,alfa)
myShape:beginPath()
myShape:moveTo(x+radius,y)
for i=-90,0,1 do
myShape:lineTo(x+w-radius+math.cos(math.rad(i))*radius,y+radius+math.sin(math.rad(i))*radius)
end
for i=0,90,1 do
myShape:lineTo(x+w-radius+math.cos(math.rad(i))*radius,y+h-radius+math.sin(math.rad(i))*radius)
end
for i=90,180,1 do
myShape:lineTo(x+radius+math.cos(math.rad(i))*radius,y+h-radius+math.sin(math.rad(i))*radius)
end
for i=180,270,1 do
myShape:lineTo(x+radius+math.cos(math.rad(i))*radius,y+radius+math.sin(math.rad(i))*radius)
end
myShape:endPath()
stage:addChild(myShape)
end
--квадрат
Синтаксис: Lua
function box(x,y,w,h,color,border1,colorL,alfa)
local myShape = Shape.new()
myShape:setLineStyle(border1, colorL,alfa )
myShape:setFillStyle(Shape.SOLID, color,alfa)
myShape:beginPath()
myShape:moveTo(x,y)
myShape:lineTo(x+w,y)
myShape:lineTo(x+w,y+h)
myShape:lineTo(x,y+h)
myShape:lineTo(x,y)
myShape:endPath()
stage:addChild(myShape)
end
local myShape = Shape.new()
myShape:setLineStyle(border1, colorL,alfa )
myShape:setFillStyle(Shape.SOLID, color,alfa)
myShape:beginPath()
myShape:moveTo(x,y)
myShape:lineTo(x+w,y)
myShape:lineTo(x+w,y+h)
myShape:lineTo(x,y+h)
myShape:lineTo(x,y)
myShape:endPath()
stage:addChild(myShape)
end
створюємо фігури
Синтаксис: Lua
-- circle(x,y,радіус,колір,обводка пікс,колір обводки,прозорість)
circle(200,100,50,"0xF5001D",2,"0x006400",0.5)
circle(300,300,50,0x9900ff,2,0x9900ff,1)
--boxR(x,y,ширина,висота,радіус кута,0x9900ff,2,0x006400,1)
boxR(300,100,100,100,30,0x9900ff,2,0x006400,1)
box(200,200,100,100,"0xF5001D",2,"0x006400",0.9)
circle(200,100,50,"0xF5001D",2,"0x006400",0.5)
circle(300,300,50,0x9900ff,2,0x9900ff,1)
--boxR(x,y,ширина,висота,радіус кута,0x9900ff,2,0x006400,1)
boxR(300,100,100,100,30,0x9900ff,2,0x006400,1)
box(200,200,100,100,"0xF5001D",2,"0x006400",0.9)
Вложения: |
Снимок.PNG [ 48.54 КБ | Просмотров: 50 ] |
_________________
текстові Написи
Колір в РГБ
приклади використання
Синтаксис: Lua
function text(x,y,txt,color,size)
local myText = TextField.new(TTFont.new("kBkzxLTx.ttf", size, txt))
myText:setTextColor(color)
myText:setText(txt)
myText:setPosition(x-myText:getWidth()/2,y)
return myText
end
local myText = TextField.new(TTFont.new("kBkzxLTx.ttf", size, txt))
myText:setTextColor(color)
myText:setText(txt)
myText:setPosition(x-myText:getWidth()/2,y)
return myText
end
Колір в РГБ
приклади використання
Вложения: |
Снимок.PNG [ 32.31 КБ | Просмотров: 46 ] |
_________________
БАГИ - утечка памяти в Gideros
при удалении спрайта
sprite:removeFromParent()
его дети продолжают занимать память, потому перед удалением следует удалить детей:
Синтаксис: Lua
while sprite:getNumChildren() > 0 do
sprite:removeChildAt(1)
end
sprite:removeChildAt(1)
end
добавленньіе слушатели собьітий (sprite:addEventListener) - не отключаются при удалении спрайта
их следует вручную отключать sprite:removeEventListener
удаление слушателя sprite:removeEventListener - не удаляет его из памяти а только отключает - слушатели навсегда остаются в памяти, потому следует их економно использовать!!!
* сборщик мусора collectgarbage() - не очищает слушатели
команда print также занимает память и не очищается - ее следует удалять перед сборкой
collectgarbage() - очень дорогая операция в плане производительности, и желательно ее не использовать, очистка мусора запустится автоматом
*
Немає коментарів:
Дописати коментар