Заставить объект вращаться на угол наклона с помощью акселерометра в CoronaSDK? - PullRequest
1 голос
/ 31 мая 2011

в моей первой игре у меня есть каракули, которым я управляю с помощью акселерометра. Во многих играх я видел, что когда устройство названо, объект (в моем случае это рыба-каракули) вращается в направлении наклона, так что создается иллюзия, что «рыба» плавает вниз, а если устройство наклоняется вверх и вниз, «рыба» "плавает вверх и вниз.

Как мне написать это в lua при работе с Corona SDK?

Вот мой код для перемещения каракули до сих пор;

display.setStatusBar(display.HiddenStatusBar)
system.setAccelerometerInterval( 50 )

_W = display.contentWidth
_H = display.contentHeight

local bg = display.newImageRect("images/bg.png", 480, 320)
      bg:setReferencePoint(display.CenterReferencePoint)
      bg.x = _W/2
      bg.y = _H/2

local player = display.newImageRect("images/doodle.png", 128, 64)
     player:setReferencePoint(display.CenterReferencePoint)
     player.x = _W/2
     player.y = _H/2

-- Set up the Accelerometer values in Landscape

local motionX = 0
local motionY = 0                

local function onAccelerate( event )
     motionX = 10 * event.yGravity;
     motionY = 10 * event.xGravity;
end

Runtime:addEventListener ("accelerometer", onAccelerate);

-- Make the player move on tilt.

local function movePlayer (event)
    player.x = player.x + motionX;
    player.y = player.y + motionY;
end

Runtime:addEventListener("enterFrame", movePlayer)

    local function screenBoundaries (event)

        -- Left side boundaries
    if player.x < 0 + player.width/2 then 
       player.x = 0 + player.width/2
    end

        -- Right side boundaries
    if player.x > display.contentWidth - player.width/2 then
       player.x = display.contentWidth - player.width/2
    end

        -- Upper boundaries
    if player.y < 0 + player.height/2 then 
       player.y = 0 + player.height/2
    end

        -- Lower boundaries
    if player.y > display.contentHeight - player.height/2 then 
       player.y = display.contentHeight - player.height/2
    end
end

Runtime:addEventListener("enterFrame", screenBoundaries)

EDIT;

Я пытался заставить плеер вращаться, чтобы наклониться, но он не работает, он не возвращает никаких ошибок, когда я запускаю его в симуляторе, что я делаю не так?

По сути, я хочу, чтобы значение y акселерометра увеличивало / уменьшало игрока (рыбу), плавая вверх и вниз, но я хочу, чтобы он наклонялся только умеренно (от 0 до +/- 45 градусов) или что-то, что кажется реалистичным. Возможно, 25 -35 градусов является оптимальным?

Моя математика не актуальна, поэтому я прошу прощения за это, может кто-нибудь помочь мне с этим?

display.setStatusBar(display.HiddenStatusBar)
system.setAccelerometerInterval( 50 )

_W = display.contentWidth
_H = display.contentHeight

local ceil = math.ceil
local pi = math.pi
local atan2 = math.atan2
local playerRotation


 -- Put the doodle fish in the center if the screen.
    local player = display.newImageRect("images/doodle.png", 128, 64)
    player:setReferencePoint(display.CenterReferencePoint)
    player.x = _W/2
    player.y = _H/2

 -- My rotation function, not sure how to do it right.

    local function getPlayerRotationAngle(xGravity, yGravity)
    angle = math.atan2(xGravity, yGravity)

    angle = angle*(180/pi)

    playerRotate = ceil(360 - angle(xGravity, yGravity))

    return playerRotate
     end

 -- Set up the Accelerometer values in Landscape

    local motionX = 0
    local motionY = 0 

    local function onAccelerate( event )
          motionX = 5 * event.yGravity;
          motionY = 5 * event.xGravity;

          -- Should I put the rotation here or down in the movePlayer function?

          player.rotation = playerRotate(event.yGravity, event.xGravity);
    end

    Runtime:addEventListener ("accelerometer", onAccelerate);

 -- Make the player move on tilt.

    function movePlayer (event)

         player.x = player.x + motionX
         player.y = player.y + motionY


    end

    Runtime:addEventListener("enterFrame", movePlayer)

1 Ответ

0 голосов
/ 04 июня 2011

Ваш общий код выглядит хорошо. В нескольких играх я использовал нечто подобное.

Что бросается в глаза, так это упоминание

Я пытался заставить плеер вращаться, чтобы наклониться, но он не работает, он не возвращает никаких ошибок, когда я запускаю его в симуляторе, что я делаю не так?

Вы действительно запускаете код на устройстве? Симулятор Corona SDK не поддерживает симуляцию для акселерометра, поэтому событие никогда не сработает.

Если вы работаете на устройстве, включите Библиотека пространства сканирования . Это позволит вам напечатать () любую форму данных, включая таблицы. Затем добавьте

print(event)

к вашей функции onAccelerate (), подключите ваше устройство к вашей машине для разработки и следите за консолью за данными, которые вы фактически получаете. (Предполагая, что вы разрабатываете для iOS с использованием Mac, используйте iPhone Configuration Utility для получения данных). Затем отладка.

Включить

io.output():setvbuf("no")

в начале вашего main.lua, чтобы сначала отключить кэширование вывода консоли на устройстве. В противном случае консольный вывод вашего устройства будет буферизован и его трудно будет отладить.

...