【问题标题】:Corona SDK - Moving Player Left and Right Using Touch (Code Included)Corona SDK - 使用触摸左右移动播放器(包含代码)
【发布时间】:2014-03-24 19:14:15
【问题描述】:

抱歉,如果之前有人问过这个问题,我尝试搜索无济于事。无论如何,我有某种逻辑错误阻止我的播放器对象在我尝试移动它时左右移动。任何提示将不胜感激,因为我是 Lua 的初学者。感谢您的时间。

function spawnPlayer()
player = display.newImage('player.png') 
player.x = display.contentWidth * 0.5
player.y = display.contentHeight - player.height
player.name = 'player'
physics.addBody(player)
Score()
end

function Score()
score = display.newText('Score: ', 1, 0, native.systemFontBold, 14)
score.x = _W / 9
score.y = 0
score.text = score.text .. tostring(intscore)
Listeners('add')
end

function Listeners(event)

if event == 'add' then
    --Runtime:addEventListener("accelerometer", accelPlayer)
    --player:addEventListener("touch", touchPlayer)
    player:addEventListener('touch', touchPlayer)
    player:addEventListener('accelerometer', accelPlayer)
elseif event == 'remove' then
    Runtime:removeEventListener("accelerometer", accelPlayer)
    player:removeEventListener("touch", touchPlayer)
end
end

function touchPlayer:touch(event)

if isSimulator then

    if event.phase == "began" then
        moveX = event.x - player.x
    elseif event.phase == "moved" then
        player.x = event.x - moveX
    end

    if((player.x - player.width * 0.5) < 0) then
        player.x = player.width * 0.5
    elseif((player.x + player.width * 0.5) > display.contentWidth)
    then
        player.x = display.contentWidth - player.width * 0.5
    end 
end
end

function accelPlayer:accelerometer(event)

player.x = display.contentCenterX - (display.contentCenterX * (event.yGravity * 3))

if((player.x - player.width * 0.5) < 0) then
    player.x = player.width * 0.5
elseif((player.x + player.width * 0.5) > display.contentWidth)
then
    player.x = display.contentWidth - player.width * 0.5
end
end

【问题讨论】:

  • 发生了什么?什么没有发生?你期望会发生什么?你做了什么来试图找出问题?
  • 很抱歉。发生的事情是,当我触摸播放器并沿屏幕滑动时,什么也没有发生。我希望角色根据我的手指移动的位置左右移动。我已经尝试在不同的地方和不同的对象上添加监听器等等。

标签: lua touch coronasdk


【解决方案1】:

试试

print("in touch event")
if isSimulator then
    if event.phase == "began" then
        print("touch started")
        startX = event.x

    elseif event.phase == "moved" then
        local changeSinceLast = event.x - startX
        player.x = player.x + changeSinceLast 
        startX = event.x
        print("touch moved")

    end

更新:

如果没有打印,那么您必须查看导致touchPlayer:touch(event) 被调用的原因。它是Listeners('add')。此外,该函数具有touchPlayer,但在调用此函数时是否存在 touchPlayer?所以试试:

function Listeners(event)
    if event == 'add' then
        print('adding touch listener:', touchPlayer)
        player:addEventListener('touch', touchPlayer)

【讨论】:

  • 我试了一下,但什么也没发生。不过,我感谢您的回答,谢谢!
  • @user3456833 你能试试更新版本吗?打印什么?
  • 没有打印任何东西,所以我猜它根本没有进入函数。
【解决方案2】:

因为您没有在设备上分配触摸侦听器。您只为模拟器分配了触摸监听器,您无法在模拟器上测试触摸事件。 因此,也将它分配给设备并在您的开始条件中添加以下行。

display.getCurrentStage():setFocus(event.target)

【讨论】:

  • 好吧,我首先尝试按照您所说的将其添加到“开始”行下,但没有任何反应,但随后我将“isSimulator”行及其对应的“结束”注释掉,它开始了当我触摸模拟器上的屏幕时移动。 (我有一台触摸屏笔记本电脑。)没有 isSimulator 行,它可以使用和不使用你给我的代码行。你知道为什么吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-04-01
  • 2012-02-26
  • 2016-06-12
  • 2014-01-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多