2017-08-11 32 views
0

我正在创建类似于Mario Brothers的一些平台游戏类型的游戏,并且遇到了一个大问题。我的问题是,当我点击我的方向键并将其拖出时,尽管我已经释放了点击,但角色仍在移动。我已经在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", "shoot") 
    createButton(parent2, left + fullw - 250, bottom - fullh/5.5, "Throw", "throw") 
    createButton(parent2, left + fullw - 350, bottom - fullh/5.5, "Melee", "melee") 
+0

也许尝试[由Ponywolf joykey和vjoy(https://github.com/ponywolf/joykey)。 – ldurniat

+0

我已经尝试过,但我永远无法得到左右运动的工作。 – alexjr

+0

左右运动为什么不起作用? – ldurniat

回答

0

我不是很熟悉,电晕,但也许我可以帮你。

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 = "began", target = event.target }) 
     end 

现在,如果那个按钮你的手指,你动它会有一个触摸埃文特带有相位==“感动”至极,你在上面的行处理。如果这个移动发生在你的按钮周围±4像素的范围内,你可以用相位==“开始”分派一个触摸事件。所以只要你移动你的按钮,你的家伙就会继续前进。

我的问题在这里:为什么你做同样的事情,如果你的手指在按钮或外部?如果您将手指放在按钮上,则只会输入以下elseif块并因此停止移动。如果将其拖离按钮并将其抬起,则原始触摸事件将永不结束,并且不会创建任何其他触摸结束触摸事件。

elseif event.phase == "ended" then 
    anim:setLinearVelocity(0,0) 
    event.target.isPressed = false 
    end 

我相信你应该在else块中调度一个“touch”“ended”事件,当你的手指离开按钮时。

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

+0

感谢您的帮助。但是,当我在else块中添加结束阶段时,同样发生。此外,我意外地放置了其他阶段开始阶段分派的代码的先前版本。 – alexjr

1

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

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 
+0

同样的事情发生。顺便说一下,这是Brent Sorrentino的代码,他说他正在研究解决方案。 (他把这个作为一个教程在科罗纳)另外,你是波兰人? – alexjr

+0

是的,我是波兰人。 – ldurniat