Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht Das deutsche QBasic- und FreeBASIC-Forum
Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
 
FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen  RegistrierenRegistrieren
ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin
Zur Begleitseite des Forums / Chat / Impressum
Aktueller Forenpartner:

Problem ScreenEvent + neuer Compiler Version

 
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu FreeBASIC.
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
Muttonhead



Anmeldungsdatum: 26.08.2008
Beiträge: 562
Wohnort: Jüterbog

BeitragVerfasst am: 03.07.2021, 10:15    Titel: Problem ScreenEvent + neuer Compiler Version Antworten mit Zitat

Ein Hallo an alle hier.

Der folgende kleine Codeschnipsel entspricht in etwa wie ich SCREENEVENT derzeitig benutze.
Vorrangig geht es mir nur um die Mausposition

Code:
'' include fbgfx.bi for some useful definitions
#include "fbgfx.bi"
#if __fb_lang__ = "fb"
using fb '' constants and structures are stored in the fb namespace in lang fb
#endif

dim as event e
dim as integer eventexists,mousex,mousey,deltax,deltay
screenres 640, 480
do

  if (screenevent(@e)) then
    eventexists=1
    select case e.type

    case event_mouse_move
      mousex=e.x
      mousey=e.y
      deltax=e.dx
      deltay=e.dy
    end select
  end if
 
  if eventexists then
    print "mouse moved to " & mousex & "," & mousey & " (delta " & deltax & "," & deltay & ")"
    eventexists=0
  end if
  sleep 30' bei 1 kein Trace-Effekt
loop until inkey<>""


Das SCREENEVENT die Ereignisse während des SLEEP-Befehls in einer Art Pipe drückt, war mir bisher nicht wirklich bekannt,
ist aber hier in Forum an anderer Stelle schon mal erwähnt worden.
Bei einem SLEEP 30 zb ist dieser "TRACE-Effekt" gut beobachtbar.
Da ich normalerweise mit SLEEP 1 arbeite, ist vermutlich das "Mehr" an SCREENEVENT-Ereignissen nie so wirklich ins Gewicht gefallen und
mir daher nie bewusst gewesen.

Beim neuen Compiler v1.08.0 scheinen aber viel mehr Bewegungs-Ergnisse während eines SLEEP 1 "aufzulaufen" und schon hier
hab ich diesen "TRACE-Effekt".
Also schon bei der kleinsten CPU-Lastbremse die man einbauen kann.

Vielleicht könnt ihr auf euern Mühlen dieses Verhalten nachvollziehen, kann ja sein dass nur ich dieses Problem hier hab.

... eine "Pipe-Leer-Lese-Variante":

Code:
'' include fbgfx.bi for some useful definitions
#include "fbgfx.bi"
#if __fb_lang__ = "fb"
using fb '' constants and structures are stored in the fb namespace in lang fb
#endif

dim as event e
dim as integer eventexists,mousemoved,mousex,mousey,deltax,deltay
screenres 640, 480
do
  mousemoved=0
  do
    if (screenevent(@e)) then
      eventexists=1
      select case e.type

      case event_mouse_move
        mousemoved=1
        mousex=e.x
        mousey=e.y
        'die Deltas wären dann wohl so nicht mehr zu gebrauchen, da sie eventuell nur noch eine "Teilbewegung" darstellen?
        'deltax=e.dx
        'deltay=e.dy
      end select
    else
      eventexists=0
    end if
  loop until eventexists=0
 
  if mousemoved then
    print "mouse moved to " & mousex & "," & mousey & " (delta " & deltax & "," & deltay & ")"
  end if
  'sleep 1
loop until inkey<>""


Mutton
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
nemored



Anmeldungsdatum: 22.02.2007
Beiträge: 4594
Wohnort: ~/

BeitragVerfasst am: 03.07.2021, 15:35    Titel: Antworten mit Zitat

Sieht bei mir wohl genauso aus wie bei dir.
Als Lösung möglicherweise machbar, insb. wenn es nur um eine spezielle Art von Event geht: Die Deltas extra addieren.
Code:
'' include fbgfx.bi for some useful definitions
#include "fbgfx.bi"
#if __fb_lang__ = "fb"
using fb '' constants and structures are stored in the fb namespace in lang fb
#endif

dim as event e
dim as integer eventexists,mousemoved,mousex,mousey,deltax,deltay
screenres 640, 480
do
  mousemoved=0
  deltax = 0
  deltay = 0
  do while (screenevent(@e))
    select case e.type
   
    case event_mouse_move
      mousemoved=1
      mousex=e.x
      mousey=e.y
      deltax+=e.dx
      deltay+=e.dy
    end select
  loop
 
  if mousemoved then
    print "mouse moved to " & mousex & "," & mousey & " (delta " & deltax & "," & deltay & ")"
  end if
  sleep 30
loop until inkey<>""

kurz gesagt: Unterbrecungen immer erst am Ende der Abarbeitung aller (oder vieler) Screenevents. Dann klappt es wohl.

(Es kommt noch hinzu, dass auch PRINT ein ziemlicher Bremser ist.)
_________________
Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu FreeBASIC. Alle Zeiten sind GMT + 1 Stunde
Seite 1 von 1

 
Gehe zu:  
Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.

 Impressum :: Datenschutz