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:

ScreenEvent EVENT_MOUSE_MOVE

 
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
Westbeam



Anmeldungsdatum: 22.12.2009
Beiträge: 760

BeitragVerfasst am: 01.11.2010, 20:45    Titel: ScreenEvent EVENT_MOUSE_MOVE Antworten mit Zitat

Hey
Ich habe ein Problem mit folgendem Codeschnippsel:
Code:
If ScreenEvent(event) Then
   Select Case event->Type
   Case FB.EVENT_MOUSE_MOVE
      TurnEntity camera,0,-event->dx,0
   End Select
End If

Damit wird die Kamera in einem 3D-Spiel von mir gedreht, allerdings stoppt die Drehung nach einer Weile einfach, da EVENT_MOUSE_MOVE keine Werte mehr liefert. Weiß jemand einen Rat? Weil das Spiel wäre ein bisschen blöd und es ist auch ein wenig nervig, wenn man sich nicht richtig bewegen kann.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
MOD
Fleißiger Referenzredakteur


Anmeldungsdatum: 10.09.2007
Beiträge: 1003

BeitragVerfasst am: 01.11.2010, 20:56    Titel: Antworten mit Zitat

Das Verhalten wäre mir neu.
Code:
#Include "fbgfx.bi"

Screen 18

Dim As FB.Event Ptr event = Allocate(SizeOf(FB.Event))

Do
   If ScreenEvent(event) Then
      Select Case event->Type
         Case FB.EVENT_MOUSE_MOVE
            Print "Die Maus wurde bewegt: ", event->x, event->y
      End Select
   End If
   Sleep 1
Loop Until InKey = Chr(27) 'ESC

Der Code funktioniert wie erwartet.

Stell doch mal ein möglichst kleinen aber vollständigen Code auf, bei dem der Fehler immer noch auftritt. So ist es leider sehr schwer zu sagen, was das Problem sein könnte
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Westbeam



Anmeldungsdatum: 22.12.2009
Beiträge: 760

BeitragVerfasst am: 01.11.2010, 21:12    Titel: Antworten mit Zitat

Hm, hier:
Code:
Setmouse 1024/2,768/2,1,1
key=Inkey()
   If ScreenEvent(event) Then
      Select Case event->Type
      Case FB.EVENT_MOUSE_MOVE
         TurnEntity camera,0,-event->dx,0
      End Select
   End If
   Sleep 1
Loop Until key=Chr(27)
End

Nachdem ich die Maus eine Weile nach links oder rechts bewegt habe, liefert EVENT_MOUSE_MOVE keine Werte mehr. Ich habe mir mal angeschaut, wenn ich mir den Mauszeiger anzeigen lassen(Setmouse ,,1), dann liefet EVENT_MOUSE_MOVE genau dann keine Werte mehr, wenn die Maus am Fensterrand ist.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
St_W



Anmeldungsdatum: 22.07.2007
Beiträge: 956
Wohnort: Austria

BeitragVerfasst am: 01.11.2010, 21:17    Titel: Antworten mit Zitat

Wenn du willst, dass man sich "unendlich" lang in eine Richtung bewegen kann, musst du dir damit helfen die Mausposition immer wieder z.b. in die Mitte zu setzen und selbst mitzuzählen.

Kleines Beispiel (siehe folgender alter Thread: http://forum.qbasic.at/viewtopic.php?p=90308#90308)

Code:
Type EVENT Field = 1
  Type As Integer
  Union
    Type:as Integer scancode, ascii:end type
    Type:as integer x, y, dx, dy:end type
    as Integer button, z
  End Union
End Type

screen 12

dim as Integer mx, my, ox, oy
dim as EVENT e

screencontrol 4, mx, my
mx /= 2: my /= 2
ox = mx: oy = my

SetMouse(mx, my, 0, 1)
circle (ox, oy), 5, 15

do
   
   while screenevent(@e)
      if (e.type = 4) then
         if e.x <> mx or e.y <> my then
            ox += e.x-mx: oy += e.y-my
            SetMouse(mx, my)
            line (0, 0)-(mx*2, my*2), 0, BF
            locate 2, 3: print "X: "; ox: locate 3, 3: print "Y: "; oy
            circle (ox, oy), 5, 15
            if (oy < 0) then line (0, 0)-(mx*2, 2), 12, BF
            if (oy > my*2) then line (0, my*2)-(mx*2, my*2-3), 12, BF
            if (ox < 0) then line (0, 0)-(2, my*2), 12, BF
            if (ox > mx*2) then line (mx*2, 0)-(mx*2-3, my*2), 12, BF
         EndIf
      EndIf
   Wend
   
   sleep 1
   
Loop until inkey <> ""


Vielleicht konnte ich dir damit helfen.
_________________
Aktuelle FreeBasic Builds, Projekte, Code-Snippets unter http://users.freebasic-portal.de/stw/
http://www.mv-lacken.at Musikverein Lacken (MV Lacken)
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Westbeam



Anmeldungsdatum: 22.12.2009
Beiträge: 760

BeitragVerfasst am: 01.11.2010, 21:33    Titel: Antworten mit Zitat

Hm, ich bin mir fast sicher, dass ich deinen Code falsch anwende, aber wenn ich diesen Code bei mir einsetzte, dann bewegt sich die Maus extrem schnell(jedenfalls sieht es so aus) und sie wird auch nicht langsamer, wenn ich verschiedene Werte einsetze und damit dividiere...
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
St_W



Anmeldungsdatum: 22.07.2007
Beiträge: 956
Wohnort: Austria

BeitragVerfasst am: 01.11.2010, 22:23    Titel: Antworten mit Zitat

Seltsam. Falsch anwenden kann man den Code ja fast nicht - direkt compiliert sollte er ein schwarzes Fenster ergeben mit X und Y Koordinate als Text links oben und einem kleinen weißen Kreis als Cursor (wenn sich dieser innerhalb des Fensters befindet) bzw. einem (oder mehreren) roten Balken (in der Richtung, in der sich der Cursor außerhalb des Fensters befindet).

Der Kreis-Cursor sollte sich im Hinblick auf Geschwindigkeit eigentlich ident mit dem Standard-Cursor verhalten.

Ich habe zwei Versionen von meinem kleinen Test-Programm gefunden:
http://wurzinger.bplaced.net/files/programmierung/fb/misc/Mausdemo.bas
http://wurzinger.bplaced.net/files/programmierung/fb/misc/Mausdemo2.bas

Die Programme sind direkt compilierbar und sollte das selbe Ergebnis bringen.
Vielleicht hast du ja hiermit mehr Erfolg.

Getestet hab ich beide übrigens mit Windows XP Professional SP3 und Compilerversion war afair 0.20. Inwieweit das Programm unter den div. Linux Distributionen oder anderen Windows Versionen funktioniert hab ich nicht getestet. _Theoretisch_ _sollte_ es aber keine Probleme geben (ja, richtig erkannt: 2 Probleme - Theorie und Hypothese zwinkern ).
_________________
Aktuelle FreeBasic Builds, Projekte, Code-Snippets unter http://users.freebasic-portal.de/stw/
http://www.mv-lacken.at Musikverein Lacken (MV Lacken)
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Westbeam



Anmeldungsdatum: 22.12.2009
Beiträge: 760

BeitragVerfasst am: 02.11.2010, 18:12    Titel: Antworten mit Zitat

Mit den Demos klappt es, vielen Dank lächeln
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Westbeam



Anmeldungsdatum: 22.12.2009
Beiträge: 760

BeitragVerfasst am: 02.11.2010, 18:50    Titel: Antworten mit Zitat

Sry wegen Doppelpost, aber neues Problem bei St_W's Code.
In meinem 3D-Spiel kann ich die Kamera jetzt aber nur in eine Richtung drehen, nicht in die andere. Bei Mausdemo.bas funktioniert es einwandfrei, aber in meinem Code nicht, obwohl ich das meiste aus der Demo kopiert habe. Hier ist mal der ganze geschnittene Code(ohne Kommentare):
Code:
#Include "minib3d.bi"
#Include "oprint.bas"

Screenres 1024,768,32,,&h02 'or &h01
Graphics3d 1024,768,32,1

Dim Shared As String key
Dim Shared As Integer mousex,mousey,buttons,camX,camY,camZ, x, y, mx, my, ox, oy
Dim Shared As Integer oldx, oldy,help,scr,dx
Dim Shared As Double newTime = 0, oldTime = 0, diffTime

Screencontrol 4, mx, my
mx /= 2: my /= 2
ox = mx: oy = my

Var camera=createcamera()
Var light=Createlight(2)
Var Skycube=Createsphere()
PositionEntity camera,2,3,2
ScaleEntity Skycube,200,200,200
EntityColor Skycube,58,110,165
FlipMesh Skycube
PositionEntity light,0,200,0
EntityRadius camera, 1.3
Entitytype camera,1

#Include "blocks.bi"
   
Loadmap()

Collisions 1,2,2

SetMouse(mx, my, 0, 1)
TurnEntity camera,0,ox,0,0
Dim As font myFont
Do
   key=Inkey()
   myFont.setFree
   myFont.scale = 2
   If key="w" Then MoveEntity camera,0,0,0.2
   If key="s" Then MoveEntity camera,0,0,-0.2
   If key="a" Then MoveEntity camera,-0.2,0,0
   If key="d" Then MoveEntity camera,0.2,0,0
   If key="r" Then PositionEntity camera,2,3,2
   If key="q" Then MoveEntity camera,0,0.1,0
   If key="e" Then MoveEntity camera,0,-0.1,0
   If buttons=1 Then
      CreateBlock(2,EntityX(camera),EntityY(camera)-2,EntityZ(camera))
   End If
   If GetMouse(x, y) = 0 Then
      If x <> mx Or y <> my Then
         TurnEntity camera,0,-x/150,0,1
         ox += x-mx: oy += y-my
         SetMouse(mx, my)
      End If
   End If
   
   Sleep 1
   UpdateWorld
   RenderWorld
   glColor3f 1,1,1
   myFont.print 10,10,"MouseXSpeed():"&x
   Flip
Loop Until key=Chr(27)
ClearWorld
End
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
St_W



Anmeldungsdatum: 22.07.2007
Beiträge: 956
Wohnort: Austria

BeitragVerfasst am: 02.11.2010, 23:41    Titel: Antworten mit Zitat

Ich erkläre mein Beispiel kurz, weil ich den Eindruck habe, dass du die Funktionsweise nicht ganz verstanden hast (falls ich mich täuschen sollte, kann es trotzdem nicht schaden sich meine Erläuterungen durchzulesen).

Also: Das Programm basiert auf der Grundidee den Mauszeiger immer wieder in den Mittelpunkt des Programmfensters/Bildschirms zu setzen, nachdem eine Bewegung erkannt wurde und die Mausposition selbst durch addieren der Relativbewegungen vom Mittelpunkt mitführt.

Ich gehe von der kürzeren Lösung (siehe http://wurzinger.bplaced.net/files/programmierung/fb/misc/Mausdemo.bas) aus und hab diese zusätzlich aufs nötigste gekürzt:

Code:
screen 12

dim as Integer x, y, mx, my, ox, oy

'Höhe & Breite des Grafikfensters ermitteln ..
screencontrol 4, mx, my
'.. und durch halbieren beider Werte den Mittelpunkt.
mx /= 2: my /= 2
'Anfangsmausposition mit den Mittelpunktkoordinaten initialisieren
ox = mx: oy = my

'Mauscursor auf den Mittelpunkt setzen
SetMouse(mx, my, 0, 1)

do
   'Nur auswerten, wenn gültiges Ergebnis
   if GetMouse(x, y) = 0 then
      '(Programmtechnisch hervorgerufene) Bewegung auf den Mittelpunkt ignorieren
      if x <> mx or y <> my then
         'Relative Mausbewegung (Entfernung vom Mittelpunkt) zu den alten Mauskoordinaten addieren => aktuelle Mauskoordinaten (ox | oy)
         ox += x-mx: oy += y-my
         'Mauscursor wieder im Mittelpunkt platzieren
         SetMouse(mx, my)
      EndIf
   end if
   
   sleep 1
   
Loop until inkey <> ""


Die manuell mitgeführten Mauskoordinaten sind also (ox | oy).
Die echten Mauskoordinaten sind (x | y). Aus der Differenz zum Mittelpunkt (mx | my) erhält man die relative Mausbewegung (x-mx | y-my).

Für dein Programm werden nur die Mauskoordinaten (ox | oy) oder die relative Mausbewegung interessant sein (x-mx | y-my).

______________________________


In deinem Programm weiß ich zwar nicht, was die Funktion TurnEntity genau macht, aber der Aufruf mit "x" als Parameter sollte wohl eher ox bzw. x-mx sein, oder?
_________________
Aktuelle FreeBasic Builds, Projekte, Code-Snippets unter http://users.freebasic-portal.de/stw/
http://www.mv-lacken.at Musikverein Lacken (MV Lacken)
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Westbeam



Anmeldungsdatum: 22.12.2009
Beiträge: 760

BeitragVerfasst am: 03.11.2010, 15:01    Titel: Antworten mit Zitat

Die Funktionsweise habe ich durchaus verstanden zwinkern
TurnEntity dreht die Kamera(in meinem Beispiel um die Y-Achse).

Allerdings funktioniert es leider noch viel weniger, wenn ich bei TurnEntity statt x, x-mx einsetze. Denn dann dreht sich die Kamera extrem schnell(wie ich schon geschrieben habe), und die Drehung lässt sich auch nicht abbremsen.

EDIT: Hab den Fehler gefunden, es muss -(x-mx) heißen und nicht -x-mx. Danke lächeln
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