Corona SDK - покадровая анимация и проблема с акселерометром - PullRequest
3 голосов
/ 01 июля 2011

мы делаем игру с перемещением объектов по кадрам, а также с помощью акселерометра.

Мы подключили два события - о рисовании рамки и соотв.

Проблема заключается в том, что после получения события acc мы немедленно помещаем значение x в переменную.

Затем мы используем эту переменную для перемещения объекта на экране, но при этом происходит СБРОС.(Я включаю телефон, и через секунду объект движется правильно, но секунда - это слишком много для игры, я ожидаю немедленного ответа).

Что я делаю не так?Есть ли другой обходной путь, чтобы сделать это, или я могу дать некоторые параметры акселерометру?

К сожалению, это серьезная проблема - настоящий блокиратор.Если это не работает, я должен найти другое решение (не Corona) для реализации игры.

Заранее спасибо !!!Danail

PS: вот какой-то источник:

local lastXGravity = 0

local function move(event) 
        eventTime=event.time
        elapsedTime = eventTime - lastDrawTime
        lastDrawTime = eventTime

        xSpeed = lastXGravity
        local xMoved = xSpeed * elapsedTime
        object.x= object.x + xMoved
end

function acc(event)   
        lastXGravity = event.xGravity
end

Runtime:addEventListener("accelerometer", acc)
Runtime:addEventListener( "enterFrame", move )

Ответы [ 4 ]

1 голос
/ 01 июля 2011

Ребята на форуме Ansca только что получили это:

system.setAccelerometerInterval( 50 )

Это на самом деле не сработало, но

system.setAccelerometerInterval( 100 ) - предупреждение - заряд батареи !!

сделал это:)

1 голос
/ 01 июля 2011

Я ничего не знаю о разработке Corona, но есть некоторые общие проблемы. Во-первых, что содержит гравитация? Только вектор гравитации или полное ускорение = гравитация + пользовательское ускорение? Вам нужно будет получить userAcceleration = totalAcceleration - гравитацию или некоторый член из события, предоставляющий его напрямую, в противном случае шансов нет.

Если у вас есть пользовательское ускорение, вам нужно интегрироваться дважды, чтобы получить позицию. См. Уравнения движения . В вашем случае код будет выглядеть так:

скорость = пользовательское ускорение * истекшее время

position = 0.5 * userAcceleration * elapsedTime ^ 2

В целом точное определение положения акселерометром и гироскопом все еще остается нерешенной проблемой, поэтому не ожидайте точных результатов. Но если вам интересно просто оценить наличие импульса в одном направлении, это может сработать. См. Например Получение смещения из данных акселерометра с Core Motion

0 голосов
/ 20 мая 2013

local isSimulator = "simulator" == system.getInfo ("environment")

- Ускоритель не поддерживается в Simulator

, если isSimulator тогда - Пожалуйста, отобразите конец окна оповещения

- Текстовые параметры локальная меткаx = 50 локальная x = 220 локальная y = 95 локальная fontSize = 24

локальная frameUpdate = false

локальная xglabel = display.newText ("gravity x = ", labelx, y, native.systemFont, fontSize) xglabel: setTextColor (255,255,255) локальный xg = display.newText (" 0.0 ", x, y, native.systemFont, fontSize) xg: setTextColor (255,255,255) y =y + 25 локальный yglabel = display.newText ("gravity y =", labelx, y, native.systemFont, fontSize) локальный yg = display.newText ("0.0", x, y, native.systemFont, fontSize) yglabel: setTextColor(255,255,255) yg: setTextColor (255,255,255) y = y + 25 локальный zglabel = display.newText ("gravity z =", labelx, y, native.systemFont, fontSize) локальный zg = display.newText ("0.0", x,y, native.systemFont, fontSize) zglabel: setTextColor (255,255,255) zg: setTextColor (255,255,255) y = y + 50 локальных xilabel = display.newText ("instant x =", labelx, y, native.systemFont, fontSize) локальных xi = display.newText ("0.0", x, y, native.systemFont, fontSize) xilabel: setTextColor (255,255,255) xi: setTextColor (255,255,255) y = y + 25 локальных yilabel = display.newText ("instant y =", labelx, y, native.systemFont, fontSize) локальный yi =display.newText ("0.0", x, y, native.systemFont, fontSize) yilabel: setTextColor (255,255,255) yi: setTextColor (255,255,255) y = y + 25 локальных zilabel = display.newText ("instant z =", labelx,y, native.systemFont, fontSize) локальный zi = display.newText ("0.0", x, y, native.systemFont, fontSize) zilabel: setTextColor (255,255,255) zi: setTextColor (255,255,255)

- Создатькруг, который перемещается вместе с событиями ускорителя

локальный центрX = display.contentWidth / 2 локальный центрY = display.contentHeight / 2

Circle = display.newCircle (0, 0, 20) Circle.x= centerX Circle.y = centerY Circle: setFillColor (0, 0, 255) - синий

локальный textMessage = функция (str, location, scrTime, размер, цвет, шрифт)

local x, t

size = tonumber(size) or 24
color = color or {255, 255, 255}
font = font or "Helvetica"

if "string" == type(location) then
    if "Top" == location then
        x = display.contentHeight/4
    elseif "Bottom" == location then
        x = (display.contentHeight/4)*3
    else
        -- Assume middle location
        x = display.contentHeight/2
    end
else
    -- Assume it's a number -- default to Middle if not
    x = tonumber(location) or display.contentHeight/2
end

scrTime = (tonumber(scrTime) or 3) * 1000       -- default to 3 seconds (3000) if no time given

t = display.newText(str, 0, 0, font, size ) 
t.x = display.contentWidth/2
t.y = x
t:setTextColor( color[1], color[2], color[3] )

-- Time of 0 = keeps on screen forever (unless removed by calling routine)

if scrTime ~= 0 then

    -- Function called after screen delay to fade out and remove text message object
    local textMsgTimerEnd = function()
        transition.to( t, {time = 500, alpha = 0}, 
            function() t.removeSelf() end )
    end

    -- Keep the message on the screen for the specified time delay
    timer.performWithDelay( scrTime, textMsgTimerEnd )
end

return t        -- return our text object in case it's needed

end - textMessage ()

локальная функция xyzFormat (obj, значение)

obj.text = string.format( "%1.3f", value )

-- Exit if not time to update text color
if not frameUpdate then return end

if value < 0.0 then
    -- Only update the text color if the value has changed
    if obj.positive ~= false then 
        obj:setTextColor( 255, 0, 0 )       -- red if negative
        obj.positive = false
        print("[---]")
    end
else
    if obj.positive ~= true then 
        obj:setTextColor( 255, 255, 255)        -- white if postive
        obj.positive = true
        print("+++")
    end
end

end

локальная функция onAccelerate (событие)

xyzFormat( xg, event.xGravity)
xyzFormat( yg, event.yGravity)
xyzFormat( zg, event.zGravity)
xyzFormat( xi, event.xInstant)
xyzFormat( yi, event.yInstant)  
xyzFormat( zi, event.zInstant)  

frameUpdate = false     -- update done 

-- Move our object based on the accelerator values

Circle.x = centerX + (centerX * event.xGravity)
Circle.y = centerY + (centerY * event.yGravity * -1)

-- Display message and sound beep if Shake'n

if event.isShake == true then
    -- str, location, scrTime, size, color, font
    textMessage( "Shake!", 400, 3, 52, {255, 255, 0} )
end

end

локальная функция onFrame () frameUpdate = true end

- Добавить прослушиватели времени выполнения Runtime: addEventListener ("accelerometer", onAccelerate);Время выполнения: addEventListener ("enterFrame", onFrame);

Надеюсь, этот код вам поможет.

0 голосов
/ 26 июля 2011

Я открыл свою первую игру, созданную Corona SDK (которая действительно очень хорошо работала), в которой Tilting используется так же, как вы описали (чем больше наклон, тем быстрее движение и наоборот).

Он называется «Tilt Monster», и вы можете скачать его здесь: http://developer.anscamobile.com/code/tilt-monster

...