角色在滑动方向键后继续移动

我正在制作一款类似马里奥兄弟的平台游戏,但我遇到了一个大问题。我的问题是,当我点击方向键并拖动出它时,尽管我已经释放了点击,角色仍然会移动。我已经在 Corona 论坛上发布了这个问题,但我还没有找到解决方案。

下面是我的代码:

local function makeControls(event)
if anim.isJumping == false then
  if event.phase == "began" then
    if event.target.isPressed == false then
      if event.target.id == "left" then
        walk(-1)
      elseif event.target.id == "right" then
        walk(1)
      end
    end
    event.target.isPressed = true
  elseif ( event.phase == "moved" and event.target.isPressed == true ) then
      if (
          event.x > event.target.contentBounds.xMin+4 and
          event.x < event.target.contentBounds.xMax-4 and
          event.y > event.target.contentBounds.yMin+4 and
          event.y < event.target.contentBounds.yMax-4
      ) then
          event.target:dispatchEvent( { name="touch", phase="began", target=event.target } )
        else
          event.target:dispatchEvent( {name = "touch", phase = "ended", target = event.target } )
      end
  elseif event.phase == "ended" then
    anim:setLinearVelocity(0,0)
    event.target.isPressed = false
  end
end
return true
end

  local function createArrowKey(group, x, y, rotation, name)
     local newButtonBoundary = display.newRoundedRect(group, x, y, 75, 75, 12)
     newButtonBoundary.strokeWidth = 6
     newButtonBoundary:setStrokeColor(1, 1, 1, 0.5)
     newButtonBoundary:setFillColor(1, 1, 1, 0.2)
     newButtonBoundary.id = name
     newButtonBoundary:addEventListener("touch", makeControls)
     newButtonBoundary.isPressed = false
     local newArrow = display.newPolygon(group, x, y, { 0, -24, 24, 24, -24, 24 })
     newArrow.rotation = rotation
     newArrow.strokeWidth = 3
  end

  createArrowKey(parent2, left + fullw / 3, bottom - fullh / 5.5, 90, "right")
  createArrowKey(parent2, left + fullw / 5.5, bottom - fullh / 5.5, 270, "left")
  createArrowKey(parent2, left + fullw / 3.88, bottom - fullh / 8.5, 180, "down")
  createArrowKey(parent2, left + fullw / 3.88, bottom - fullh / 3.9, 0, "up")
  createButton(parent2, left + fullw - 150, bottom - fullh / 5.5, "射击", "shoot")
  createButton(parent2, left + fullw - 250, bottom - fullh / 5.5, "扔出", "throw")
  createButton(parent2, left + fullw - 350, bottom - fullh / 5.5, "近战", "melee")
点赞
用户2858170
用户2858170

我对 Corona 不是很熟悉,但也许我可以帮助你。

如果事件阶段是 "began",则:
如果按钮未被按下,则:
如果按钮 id 是 "left",则移动到左边。
如果按钮 id 是 "right",则移动到右边。
标记该按钮已被按下。

所以,如果你触摸屏幕,则会触发一个事件阶段为 "began" 的触摸事件。

根据你触摸的按钮,你将向左或向右移动,并且你将记住该特定按钮已被按下。

如果事件阶段是 "moved",并且按钮已被按下,则:
如果移动在按钮周围 ±4 像素内,则分派一个事件阶段为 "began" 的触摸事件。
否则,分派一个事件阶段为 "began" 的触摸事件。

现在,如果你的手指在按钮上并移动,那么将会有一个事件阶段为 "moved" 的触摸事件,上面的代码将处理它。如果这次移动在按钮周围 ±4 像素内,那么你将分派一个事件阶段为 "began" 的触摸事件。只要你在按钮内移动,你的角色就会继续移动。

我的问题是:如果你的手指在或在按钮外,为什么要执行相同的操作?你只会进入下面的 elseif 块,并因此停止移动,如果你抬起手指,触摸事件将不会结束,你不会创建任何其他触摸结束的触摸事件。

如果事件阶段是 "ended",则:
停止动画的线性速度。
标记该按钮未被按下。

我认为当你的手指离开按钮时,你应该在 else 块中分派一个 "touch" "ended" 事件。

这可能会解决你的问题。不幸的是,我无法测试我的解决方案。

2017-08-11 17:03:28
用户7026995
用户7026995

我会尽量不生成新的事件:

    local function makeControls(event)
        if anim.isJumping == false then
            if event.phase == "began" then
                if event.target.isPressed == false then
                    if event.target.id == "left" then
                        walk(-1)
                    elseif event.target.id == "right" then
                        walk(1)
                    end
                end
                event.target.isPressed = true
            elseif ( event.phase == "moved" and event.target.isPressed == true ) then
                if (
                    event.x > event.target.contentBounds.xMin+4 and
                    event.x < event.target.contentBounds.xMax-4 and
                    event.y > event.target.contentBounds.yMin+4 and
                    event.y < event.target.contentBounds.yMax-4
                ) then
                    if event.target.id == "left" then
                        walk(-1)
                    elseif event.target.id == "right" then
                        walk(1)
                    end
                else
                    anim:setLinearVelocity(0,0)
                    event.target.isPressed = false
                end
            elseif event.phase == "ended" then
                anim:setLinearVelocity(0,0)
                event.target.isPressed = false
            end
        end
        return true
    end
2017-08-11 21:36:13