2017-08-11 3 views
0

Ich erstelle ein Platformer-ähnliches Spiel wie Mario Brothers und bin auf ein großes Problem gestoßen. Mein Problem ist, dass, wenn ich auf den Richtungstasten klicke und den Mauszeiger ziehe, der Charakter sich bewegt, obwohl ich den Klick losgelassen habe. Ich habe diese Frage bereits im Corona-Forum gepostet und konnte nicht zu einer Lösung kommen.Der Charakter bewegt sich weiter, nachdem er einen Richtungsschlüssel weggeschoben hat.

Hier ist mein Code:

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

Vielleicht [JoyKey und vjoy von Ponywolf] versuchen (https://github.com/ponywolf/joykey). – ldurniat

+0

Ich habe versucht, aber ich konnte nie die linke und rechte Bewegung zur Arbeit bekommen. – alexjr

+0

Warum funktioniert die linke und die rechte Bewegung nicht? – ldurniat

Antwort

0

ich mit Corona nicht sehr vertraut bin, aber vielleicht kann ich Ihnen helfen.

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 

Also, wenn Sie den Bildschirm berühren, wird ein Touch-Ereignis mit Phase == "begann".

Je nachdem, welche Schaltfläche Sie berührt haben, bewegen Sie sich nach links oder rechts und Sie werden sich erinnern, dass diese bestimmte Schaltfläche jetzt gedrückt wird.

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 

Nun, wenn Sie mit dem Finger auf diese Schaltfläche und Sie es bewegen wird es eine Berührung mit Evant Phase == „bewegt“ wich man in den obigen Zeilen behandeln. Wenn diese Bewegung innerhalb Ihrer Taste ± 4 Pixel um sie herum geschieht, senden Sie ein Touch-Ereignis mit phase == "begonnen". Solange du dich innerhalb deines Knopfes bewegst, wird dein Typ sich weiter bewegen.

Meine Frage hier: Warum machst du dasselbe, wenn dein Finger in oder außerhalb des Knopfes ist? Sie betreten nur den folgenden Elfer-Block und hören damit auf sich zu bewegen, wenn Sie den Finger auf den Knopf heben. Wenn Sie es von der Schaltfläche entfernen und es anheben, wird das ursprüngliche Berührungsereignis nie beendet und Sie erstellen kein anderes Touch-Ende-Berührungsereignis.

Ich glaube, Sie sollten ein "Touch" "beendet" -Ereignis im Else-Block, wenn Ihr Finger den Knopf verlässt.

Dies könnte Ihr Problem beheben. Leider kann ich meine vorgeschlagene Lösung nicht testen.

+0

Danke für die Hilfe. Wenn ich jedoch die beendete Phase im else-Block anschließe, tritt das gleiche auf. Außerdem platzierte ich versehentlich eine frühere Version des Codes, in der die else-Phase einen Phasenstart hatte. – alexjr

1

Ich würde versuchen, erzeugen keine neuen Ereignisse:

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

Das Gleiche passiert. Übrigens ist dies der Code von Brent Sorrentino und er sagte, er arbeite an einer Lösung. (Er hat das als Tutorial in Corona hingestellt.) Du bist auch Polin? – alexjr

+0

Ja, ich bin Polnisch. – ldurniat

Verwandte Themen