Шукати в цьому блозі

форум 6

*
Передача пользовательских данных через событие
Код:: [ Скачать ] [ Скрыть ] [ Развернуть ]
Синтаксис: 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"

_________________

Мой метод проверки коллизий между классами через систему событий.

Код:: [ Скачать ] [ Скрыть ] [ Свернуть ]
Синтаксис: 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-< sprite2:getY() then
                                                return false
                                end
                                -- self top > other sprite bottom
                                if y > sprite2:getY() + sprite2:getHeight()-then
                                                return false
                                end
                                -- self left > other sprite right
                                if x > sprite2:getX() + sprite2:getWidth()-then
                                                return false
                                end
                                -- self right < other sprite left
                                if x + w-< 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 імпортуємо
Код:: [ Скачать ] [ Скрыть ]
Синтаксис: Lua
require "box2d"
require "GiderosCodingEasy"
require "Box2dEasy"
require "GestureEventEasy"


користуватись просто:


Код:: [ Скачать ] [ Скрыть ]
Синтаксис: Lua
--задати колір за назвою а не кодом  
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)


ЗВУКИ
Код:: [ Скачать ] [ Скрыть ]
Синтаксис: Lua
local sound = Sound.new("main.mp3")
        sound:play(0, true)


фігури
Код:: [ Скачать ] [ Скрыть ] [ Свернуть ]
Синтаксис: 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)


створити спрайт з малюнка
Код:: [ Скачать ] [ Скрыть ]
Синтаксис: Lua
local bitmap = Bitmap.new("crate.png")
        :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")


створити спрайт з фігури з евентом
Код:: [ Скачать ] [ Скрыть ] [ Свернуть ]
Синтаксис: 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)


приклад колізій
Код:: [ Скачать ] [ Скрыть ] [ Свернуть ]
Синтаксис: 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})
 


не забуваємо добавити всі створені обєкти в гру
Код:: [ Скачать ] [ Скрыть ] [ Свернуть ]
Синтаксис: 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)


перемістити text в верхній слой
Код:: [ Скачать ] [ Скрыть ]
Синтаксис: Lua
--controlling z-index
text:bringToFront()


і приклад анімацій разних типів руху спрайтів
Код:: [ Скачать ] [ Скрыть ] [ Свернуть ]
Синтаксис: 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})

_________________

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)

_________________

МЕТА-ТАБЛИЦІ

СПАДКОВІСТЬ

--створюємо об'єкт лампу
Код:: [ Скачать ] [ Скрыть ] [ Свернуть ]
Синтаксис: 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()


Ми створили , просто лампочку "lamp " вміє включатися-вимикатися,

а супер-ламкочка "superlamp " буде ще і яскравість міняти. Навіщо нам переписувати методи turn_on / turn_off, якщо можна їх повторно використовувати?
У Lua для цього є поняття мета-таблиці, тобто таблиці-предка. У кожної таблиці є одна таблиця-предок, і дочірня таблиця вміє робити все, що вміє предок. об'єкт-таблицю lamp ми вже створили. Тоді супер-лампочка буде виглядати так:


Код:: [ Скачать ] [ Скрыть ] [ Свернуть ]
Синтаксис: Lua
superlamp = {
  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
= getmetatable("") -- отримали таблицю предка рядка
s.__add = function(s1, s2) return s1..s2 end -- підмінили метод

-- перевіряємо
= "hello"
= "world"
print(+ 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

Ще приклад:
Код:: [ Скачать ] [ Скрыть ] [ Свернуть ]
Синтаксис: 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)
 



ЗАХИЩЕНИЙ РЕЖИМ ФУНКЦІЇ - БОРОТЬБА З ВИЛЬОТАМИ ПРОГРАМИ ПРИ ПОМИЛКАХ

 ! 
Якщо ви викликаєте функцію, яка може створити помилку (або її дочірні функції можуть створити помилку), то викликайте її безпечно, за допомогою 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
 


ще приклад:

Код:: [ Скачать ] [ Скрыть ] [ Свернуть ]
Синтаксис: 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 викличе помилку при додаванні  текстової змінної




функція xpcall (f, err)
У разі виникнення помилки виконується функція err

ok, result = xpcall (f, err)


Код:: [ Скачать ] [ Скрыть ] [ Свернуть ]
Синтаксис: Lua
function f ()
  return "a" + 2  -- створить помилку в программі
end -- f

function err (x)
  print ("err called", x)
  return "oh no!"
end -- err

print (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->"..other.group)
                destroy(self)
               
        end
        ----------------ФУНКЦІЯ ПРИ  КІНЦІ КОЛІЗІЇ---------------------------------------
        self.colEnd= function(self,other)
                print(self.group.."<-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)


І включаємо в проект необхідні функції бібліотеки:
Код:: [ Скачать ] [ Скрыть ] [ Свернуть ]
Синтаксис: 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 = {= 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") --повідомлення  з тегом 

 


Необхідні для роботи функції (скопіювати в проект):
Код:: [ Скачать ] [ Скрыть ] [ Свернуть ]
Синтаксис: 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

_________________

генерація фігур;

--коло
Код:: [ Скачать ] [ Скрыть ] [ Свернуть ]
Синтаксис: 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


--закруглений квадрат
Код:: [ Скачать ] [ Скрыть ] [ Свернуть ]
Синтаксис: 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


--квадрат
Код:: [ Скачать ] [ Скрыть ] [ Свернуть ]
Синтаксис: 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


створюємо фігури
Код:: [ Скачать ] [ Скрыть ] [ Свернуть ]
Синтаксис: 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)


Вложения:
Снимок.PNG
Снимок.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
 


Колір в РГБ
Код:: [ Скачать ] [ Скрыть ]
Синтаксис: Lua
function rgb(r, g, b) return ((r*256)+g)*256+end


приклади використання
Код:: [ Скачать ] [ Скрыть ] [ Свернуть ]
Синтаксис: Lua


self:addChild(text(84,25,"приклад напису","0x000000",20))

stage:addChild(text(150,100,"приклад напису",rgb(64,0,0),35))
stage:addChild(text(152,102,"приклад напису",rgb(255,128,0),35))


Вложения:
Снимок.PNG
Снимок.PNG [ 32.31 КБ | Просмотров: 46 ] 

_________________

БАГИ - утечка памяти в Gideros

при удалении спрайта
sprite:removeFromParent()
его дети продолжают занимать память, потому перед удалением следует удалить детей:
Код:: [ Скачать ] [ Скрыть ]
Синтаксис: Lua
while sprite:getNumChildren() > 0 do
       sprite:removeChildAt(1)
 end
 


добавленньіе слушатели собьітий (sprite:addEventListener) - не отключаются при удалении спрайта 
их следует вручную отключать sprite:removeEventListener 

удаление слушателя sprite:removeEventListener - не удаляет его из памяти а только отключает - слушатели навсегда остаются в памяти, потому следует их економно использовать!!!

* сборщик мусора collectgarbage() - не очищает слушатели

команда print также занимает память и не очищается - ее следует удалять перед сборкой



collectgarbage() - очень дорогая операция в плане производительности, и желательно ее не использовать, очистка мусора запустится автоматом








*

Немає коментарів:

Дописати коментар