Определение координат углов после масштабирования, под разные соотношения сторон
при масштабировании игры с параметром вписать по ширине, из за разных пропорций дисплеев сверху и снизу возникают пустоты, для того чтобы определить всю зону видимую пользователю, нужно определить координаты углов
при масштабировании игры с параметром вписать по ширине, из за разных пропорций дисплеев сверху и снизу возникают пустоты, для того чтобы определить всю зону видимую пользователю, нужно определить координаты углов
Синтаксис: 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())
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 (j == 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)
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
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
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, {x = {x1, x2, "linear"},y = {y1, y2, "linear"}}} -- проиграть с 1 до 100кадра с движением по оси Х от 0 до 200
}
sprite.move:gotoAndPlay(1)
end
function speed_move(sprite,x2,y2,speed)
speed=speed/1000*60 --60fps
x1, y1 = sprite:getPosition()
sprite.move = MovieClip.new{
{1, speed, sprite, {x = {x1, x2, "linear"},y = {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
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
_________________
_________________
стабилизировать скорость
моя функция стабилизации скорости к нужному значению "increase speed"
speedY -текущая скорость по Y
speedX -текущая скорость по Х
300 - новая скорость по вектору
моя функция стабилизации скорости к нужному значению "increase speed"
speedY -текущая скорость по Y
speedX -текущая скорость по Х
300 - новая скорость по вектору
_________________
ОЧЕНЬ ПОЛЕЗНАЯ ФУНКЦИЯ АВТОПОВОРОТ ЕКРАНА ПРИ ПЕРЕВОРАЧИВАНИИ- поскольку у меня электро-розетка слева а гнездо зарядки на планшете справа - очень раздражают игры где нельзя перевернуть экран
Синтаксис: 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
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
_________________
ПРИКЛАДИ КОРИСТУВАЦЬКИХ ПОДІЙ
И мой вариант
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")) --вызвать событие
Синтаксис: 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"))
-- 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")) --вызвать событие
_________________
*
Немає коментарів:
Дописати коментар