mit SDL dauerhaft gedrückte MAustaste ermitteln



  • hallo, ich habe hier unter diesem Link Code hochgeladen, welcher in einem Timer ausgeführt wird, und die Maus sowie Tastatur Events überwacht.

    URL: http://rafb.net/p/WnDImI27.html

    Dieser Code funktioniert bei mir auch, allerdings werden die Maus spezifischen Funktionen nur bei einem Klick ausgeführt, nicht aber wenn die Maustaste gedrückt bleibt. Ich habe selber keinen Lösungsansatz finden können, und hoffe daher das mir hier jemand weiterhelfen kann



  • Normalerweise behandelt man sowas dann im MouseMotion-Event (Mauszeiger-Koordinate hat sich veraendert, siehe hier) und prueft dort, ob die entsprechende Maustaste (noch) gedrueckt ist.



  • danke, hat geklappt 🙂

    doch weiter gehts^^: Und zwar habe ich eine Frage zum SDL_Timer Interval.

    curstimer = SDL_AddTimer(10, movetimer, NULL);

    die "10" steht ja für den Interval mit dem die angegebene Funktion aufgerufen wird. Nun habe ich ein wenig herumexperimentiert. Folgenedes v o r r a u s (dieses wort darf man ned benutzten???), der Interval bestimmt in diesem FAll die Scrollgeschwindigkeit. Was ich heraus gefunden habe ist ist folgendes:

    1. die Scrollgeschwindigkeit ist bei einem Interval von 5 die selbe wie bei 10
    2. stelle ich den Interval auf 12, ist die scrollgeschwindigkeit halb so schnell wie bei 10 oder 5.

    Meine Frage ist, woran kann das liegen? Ist ein Interval von 12 ms performance lastiger als ein Interval von 10 ms? Oder hängt das von einem "internen" Interval von dem Timer ab, mit dem SDL die Ereignisse pollt?
    Fragen über Fragen...



  • myraezel schrieb:

    1. die Scrollgeschwindigkeit ist bei einem Interval von 5 die selbe wie bei 10
    2. stelle ich den Interval auf 12, ist die scrollgeschwindigkeit halb so schnell wie bei 10 oder 5.

    Der interne Timer ist nicht millisekundengenau. SDL benutzt von plattform zu plattform unterschiedliche Timer, je nachdem, welche verfügbar sind. Näheres dazu steht in der SDL-Dokumentation.

    PS: Das obengenannte 'Wort' ist kein Wort, das Wort, das du wohl meinst ist "voraus" 🙂



  • oh, ja, das wort meinte ich^^. Wir haben wohl eine sehr gebildete board-ki, die mag keine falschen wörter:-)

    eine frage noch
    //---------------------------------
    case SDL_MOUSEMOTION:
    if (event.motion.state &SDL_BUTTON(SDL_BUTTON_LEFT))
    {
    if (oldmousex != posx || oldmousey != posy)
    {
    clickx = currentscreenx + posx;
    clicky = currentscreeny + posy;
    SDL_RemoveTimer(curstimer);
    oldmousex = posx;
    oldmousey = posy;
    movescreen(posx, posy);
    goto weiter;
    }
    }
    break;
    //---------------------------------

    hier wird immer dann wenn die mausposition verändert wurde, die maustaste gedrückt ist und die maus bewegt wird, der bildschirm per movescreen so oft neu gezeichnet, bis man an den punkt wo hingeklickt wurde, oder an dem die maus bewegt wurde gelangt ist.

    Was aber nicht klappt ist das ich die maus drücke, gedrückt halte, und der solange weiter der maus hinterher läuft bis ich loslasse. So wie bei Diablo.

    Kann mir da wer nen Tipp geben, wie das zu machen ist, habe das Gefühl das es nur einer geringfügigen veränderung bedarf.

    PS.: nach diesem code folgt eine abfrage für einen simplen mausklick, mit der selben Anweisung, dies ermöglicht an einen Punkt zu klicken und dort hinzu laufen.

    PS 2: Und, lasst mich raten, goto ist böse?



  • hat sich in so fern erledigt das ich nun den Diablo Effekt hingekriegt habe. Ich habe einfach am ende des Timers der schrittweise neuzeichnet eine abfrage gesetzt ob die maus noch gedrückt ist, und wenn ja, das das ziel neu gesetzt wird, und der timer neu läuft.



  • case SDL_MOUSEMOTION:
      if (oldmousex != posx || oldmousey != posy)
    

    das ist doppelt gemoppelt.



  • ah, jo thx, hab ich garned gemerkt, wird entfernt


Anmelden zum Antworten