使用CoronaSDK中的加速度计使物体旋转到倾斜角度?

时间:2011-05-31 12:13:00

标签: lua rotation corona accelerometer angle

在我的第一个游戏中,我有一个用加速度计控制的涂鸦。在许多游戏中,我看到当设备标题为对象(在我的情况下是一个涂鸦鱼)旋转倾斜,所以它给人一种错觉,“鱼”游泳下来,如果设备上下倾斜“鱼“上下游泳。

使用Corona SDK时如何在lua中编写?

这是我到目前为止移动涂鸦的代码;

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 :(得分:0)

您的整体代码看起来不错。 我做过的几场比赛都使用了类似的东西。

你提到的是什么跳出来

  

我试图让播放器旋转到倾斜但它不起作用,当我在模拟器中运行它时它没有返回任何错误,我做错了什么?

您实际在设备上运行代码吗? Corona SDK模拟器不支持加速计的模拟,因此事件永远不会发生。

如果您在设备上运行,请添加Crawl Space Library。 这将允许您打印()任何形式的数据,包括表格。 然后添加

print(event)

到你的onAccelerate()函数,将你的设备挂钩到你的开发机器,并在控制台上查看你实际收到的数据。 (假设您正在使用Mac开发iOS,请使用 iPhone配置实用程序来获取数据)。然后从那里调试。

包括

io.output():setvbuf("no")
在main.lua的开头

首先禁用设备上的控制台输出缓存。否则,设备的控制台输出将被缓冲并且难以调试。