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

форум 5

*
Определение координат углов после масштабирования, под разные соотношения сторон

при масштабировании игры с параметром вписать по ширине, из за разных пропорций дисплеев сверху и снизу возникают пустоты, для того чтобы определить всю зону видимую пользователю, нужно определить координаты углов
Код:: [ Скачать ] [ Скрыть ] [ Свернуть ]
Синтаксис: Lua
--рассчитаем смещение нулевых координат (после масштабирования они смещаются и находятся не в самом углу)
local dx = application:getLogicalTranslateX()/application:getLogicalScaleX()
local dy = application:getLogicalTranslateY()/application:getLogicalScaleY()


--получим  ширину и высоту вписанной комнаты
local width = application:getContentWidth()
local height = application:getContentHeight()

--определяем координаты углов
--верх слева
ball:setPosition(-dx, -dy)
--верх справа
ball:setPosition(dx+width-ball:getWidth(), -dy)
--низ слева
ball:setPosition(-dx, dy + height-ball:getHeight())
--низ справа
ball:setPosition(dx+width-ball:getWidth(), dy + heightball:getHeight())

_________________

Алгоритм случайного лабиринта на LUA заданных размеров, и между любыми двумя точками всегда есть единственный маршрут.
Пример был взят здесь : - и немного адаптирован под гидерос
Код:: [ Скачать ] [ Скрыть ] [ Свернуть ]
Синтаксис: Lua
labirint=""
line = {}
math.randomseed(os.time())
--------------------------------------------
width, height = 20,20    -- размер лабиринта
--------------------------------------------
for i = 1, width, 1 do
 labirint=labirint.."._"                    -- write the top line
 line[i] = {left = i, right = i } -- init the linked lists
end

labirint=labirint..".\n"

line[width+1] = {left = tonumber(width)} -- secure a border case behavior

for j = 1, height, 1 do
   labirint=labirint.."|" -- левая стенка
  for i = 1, width, 1 do
    right, down = "|", " " -- defaults, no change to the list structure
    if line[i+1].left ~= i then
      -- consider skipping a wall here, as that won't make a cycle
      if (== tonumber(height) and line[i].left == i) or
         math.random() < 0.5 then
        right = "."
        -- join the lists of i and i+1
        -- the combined list will be circularly ordered; that's not true
        -- for such lists in general, but follows here from
        -- nontrivial properties of the two lists deriving from their
        -- meaning (they can't "interleave")
        line[line[i+1].left].right = line[i].right
        line[line[i].right].left = line[i+1].left
        line[i].right, line[i+1].left = i+1, i
      end
    end
    if j == tonumber(height) -- last line
       or (line[i].left ~= i and math.random() < 0.5) then
      down = "_"
      -- tear this cell out of its list
      line[line[i].left].right = line[i].right
      line[line[i].right].left = line[i].left
      line[i].left, line[i].right = i, i
    end
 labirint=labirint..(down..right)
  end
 labirint=labirint.."\n"
end

print(labirint)


Вот такой лабиринт выведет в консоль
Код:
_._._._._._._._._._._._._._._._._._._._.
| |_. ._| . | ._._._. ._. ._._| |_. . . |
| | | . . | | | |_. |_|_. |_. |_. | |_| |
|_. |_| | | ._| | . | . . | | | . ._| |_|
| | |_. |_| | | . | |_| |_. | . |_. |_. |
|_. | ._|_._._._|_| ._| ._|_|_|_. | ._| |
| . | ._._| |_. ._| | |_| |_. . | |_. . |
| |_._. | ._| | . |_. | | ._._| ._._|_| |
| | | | . | | | |_._. . ._|_._. | |_. . |
|_|_. | |_| ._|_. | |_|_. ._._|_._| |_|_|
| | |_. ._|_._. |_|_._. ._| . ._| | |_. |
| | | | | |_. | ._| | | | |_| | | ._| | |
| . . ._. . | . . | . ._. . | | . | ._| |
| |_| . |_| | | |_._| |_._|_. ._| | | | |
| ._|_|_._| |_| . | . ._. |_. |_._._. ._|
|_| | | | | |_. | |_| ._|_. | ._| ._|_| |
|_. | |_._._| |_|_._|_| | |_| . | | | ._|
| |_. . | |_. ._. | | | |_._._| . | | | |
| | ._|_._._| | |_._| | | | . | | ._|_. |
|_. . |_. | | ._. | | . | | |_. |_. | | |
|_._|_._._._._._|_._._|_._._._|_._|_._._|



еще примеры лабиринтов с исходниками:


Считаем FPS

Код:: [ Скачать ] [ Скрыть ] [ Свернуть ]
Синтаксис: Lua
local frame = 0
local timer = os.timer()
local function displayFps()
        frame = frame + 1
        if frame == 60 then
                local currentTimer = os.timer()
                print(60 / (currentTimer - timer))
                frame = 0
                timer = currentTimer   
        end
end

stage:addEventListener(Event.ENTER_FRAME, displayFps)
 

______________

Еще полезные функции

Удалить всех детей спрайта
Код:: [ Скачать ] [ Скрыть ] [ Свернуть ]
Синтаксис: Lua
function clear(sprite)
    while sprite:getNumChildren() > 0 do
        sprite:removeChildAt(1)
    end
end
 


Удалить все обьекты в уровне
Код:: [ Скачать ] [ Скрыть ] [ Свернуть ]
Синтаксис: Lua
function clearStage()
        local numChildren=stage:getNumChildren()
        for i=1,numChildren do
                stage:getChildAt(1):removeFromParent()
        end
end



Код:: [ Скачать ] [ Скрыть ] [ Свернуть ]
Синтаксис: Lua
-- ПЕРЕМІСТИТИ З ЗАДАНОЮ ШВИДКІСТЮ
function speed_move(sprite,x2,y2,speed)
        speed=speed/1000*60  --60fps
        x1, y1 = sprite:getPosition()

        sprite.move = MovieClip.new{
                        {1, speed, sprite, {= {x1, x2, "linear"},= {y1, y2, "linear"}}}  -- проиграть с 1 до 100кадра с движением по оси  Х от 0 до 200
                }
        sprite.move:gotoAndPlay(1)
end
 




Код:: [ Скачать ] [ Скрыть ] [ Свернуть ]
Синтаксис: Lua
-- МАСШТАБ З ЗАДАНОЮ ШВИДКІСТЮ
function speed_scale(sprite,xs2,ys2,speed)

        xs1, ys1 = sprite:getScale()
        speed=speed/1000*60
        sprite.scale = MovieClip.new{
                {1, speed, sprite, {scaleX = {xs1, xs2, "linear"},scaleY = {ys1, ys2, "linear"}}}  -- проиграть с 1 до 100кадра с движением по оси  Х от 0 до 200
        }
        sprite.scale:gotoAndPlay(1)
end


Код:: [ Скачать ] [ Скрыть ] [ Свернуть ]
Синтаксис: Lua
-- прозрачність З ЗАДАНОЮ ШВИДКІСТЮ
function speed_fade(sprite,alpha2,speed)

        alpha1 = sprite:getAlpha()
        speed=speed/1000*60
        sprite.fade = MovieClip.new{
                {1, speed, sprite, {alpha = {alpha1, alpha2, "linear"}}} 
        }
        sprite.fade:gotoAndPlay(1)
end

_________________

Підбір кириличних шрифтів

_________________

стабилизировать скорость
моя функция стабилизации скорости к нужному значению "increase speed"
speedY -текущая скорость по Y
speedX -текущая скорость по Х
300 - новая скорость по вектору

Код:: [ Скачать ] [ Скрыть ] [ Свернуть ]
Синтаксис: Lua
  -----increase 300-----------------------------------
        local a=math.sqrt(math.abs(speedX)^2+math.abs(speedY)^2)  --тек скорорость 
                a=a/300
                speedX=speedX/a
                speedY=speedY/a
               
        ----------------------------------------

_________________

ОЧЕНЬ ПОЛЕЗНАЯ ФУНКЦИЯ АВТОПОВОРОТ ЕКРАНА ПРИ ПЕРЕВОРАЧИВАНИИ- поскольку у меня электро-розетка слева а гнездо зарядки на планшете справа - очень раздражают игры где нельзя перевернуть экран
Код:: [ Скачать ] [ Скрыть ] [ Свернуть ]
Синтаксис: Lua
-------------------------------------------
--                      АКСЕЛЕРОМЕТР РОЗВЕРТАТИ ЕКРАН
-------------------------------------------
 accelerometer = Accelerometer.new()
accelerometer:start()
        function accelerometer_onEnterFrame(event)
                local x, y, z = accelerometer:getAcceleration()
                if x>0.95 then application:setOrientation(Application.LANDSCAPE_RIGHT)  end
                if x<- span="">0.95 then application:setOrientation(Application.LANDSCAPE_LEFT )  end
                --print(x, y, z)

        end
stage:addEventListener(Event.ENTER_FRAME, accelerometer_onEnterFrame)

_________________

Движение спрайта на заданньій угол с заданной скоростью 

Код:: [ Скачать ] [ Скрыть ] [ Свернуть ]
Синтаксис: Lua
self:addEventListener(Event.ENTER_FRAME, self.onEnterFrame, self) --создаем событие 
       
         self.speed=200  --скорость
         self.angl=322   --угол




function self:onEnterFrame(event)


       
       
    self:setX(self:getX()+math.cos(self.angl)*self.speed/60)
         self:setY(self:getY()+math.sin(self.angl)*self.speed/60)
       


end
 

_________________

ПРИКЛАДИ КОРИСТУВАЦЬКИХ ПОДІЙ

Код:: [ Скачать ] [ Скрыть ] [ Свернуть ]
Синтаксис: Lua
------- Make listener --------

-- Make sprite
local sprite = MySprite.new()

-- Listener function
local function onEvent(sprite, event)

        print(event:getType())
end


-------- Example A ----------

-- Add a Listener
sprite:addListener("goat", onEvent, sprite)

-- Dispatch Event: Good!
sprite:dispatchEvent(Event.new("goat"))


-- Remove Listener
sprite:removeListener("goat")

-- Dispatch Event: Nothing!
sprite:dispatchEvent(Event.new("goat"))


-------- Example B ------------

-- Add a couple Listeners
sprite:addListener("beast", onEvent, sprite)
sprite:addListener("cheese", onEvent, sprite)

-- Dispatch those events: Good!
sprite:dispatchEvent(Event.new("beast"))
sprite:dispatchEvent(Event.new("cheese"))


-- Remove all Listeners
sprite:removeAllListeners()

-- Dispatch those events: Nothing!
sprite:dispatchEvent(Event.new("beast"))
sprite:dispatchEvent(Event.new("cheese"))


------ Example C ---------------

-- Make another sprite ( note: doesn't have to be MySprtie class )
local otherSprite = Sprite.new()

-- Add a Listener to target otherSprite
sprite:addListener("chicken", onEvent, sprite, otherSprite)

-- Dispatch event: good!
otherSprite:dispatchEvent(Event.new("chicken"))

-- Remove listener for other sprite
sprite:removeListener("chicken")

-- Dispatch event: Nothing!
otherSprite:dispatchEvent(Event.new("chicken"))




И мой вариант
Код:: [ Скачать ] [ Скрыть ] [ Свернуть ]
Синтаксис: Lua

sprite1= Core.class(Sprite)
function sprite1:init(x)
        ---бла бла бла -бла бла бла 
        stage:addChild(self)
        stage:addEventListener("onBOSS",function() destroy(self) end)  --создаем слушателя события  для  sprite1
end

--теперь  можно вставлять вызов в любой другой обьект или функцию
--и все обьекты sprite1  - при событии выполнят функцию destroy(self)
stage:dispatchEvent(Event.new("onBOSS")) --вызвать событие

_________________





*

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

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