2017-08-11 65 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