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:

relative Mausbewegung

 
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
darkinsanity
aka sts


Anmeldungsdatum: 01.11.2006
Beiträge: 456

BeitragVerfasst am: 26.11.2009, 21:05    Titel: relative Mausbewegung Antworten mit Zitat

Hi,
es geht mal wieder um die Maus lächeln
Also, ich habe momentan in meiner 3D-Engine eine Maussteuerung auf ScreenEvent-Basis. Das funktioniert soweit ganz gut. Dann hatte ich das Problem, dass die Maus das Fenster verlassen kann, was ich aber schnell gelöst hatte.
Die Maus ist jetzt also gefangen, aber wenn ich den Rand des Fensters erreiche, werden dann keine weiteren ScreenEvent-Mausbewegungen mehr gesendet. Das ist für einen Ego-Shooter sehr schlecht. Im DelphiGL-Wiki habe ich gelesen, dass man wohl bei SDL etwas einstellen kann, das IMMER wenn die Maus bewegt wird, die relative Mausbewegung abgefragt werden kann.
Das wäre ja genau das was ich brauche - ich nutze aber kein SDL, sondern, wie gesagt, nur fbgfx-Funktionen.

Mein erster Ansatz war, dass ich einfach die Maus immer wieder in die Mitte zurücksetze - allerdings liefert mir ScreenEvent im nächsten Frame genau diese Bewegung, und das Kamerasystem dreht daher alles wieder zurück.

Gibt es da eine schlaue Lösung?
Das wäre sehr gut lächeln
_________________
Traue keinem Computer, den du nicht aus dem Fenster werfen kannst -- Steve Wozniak
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
OneCypher



Anmeldungsdatum: 23.09.2007
Beiträge: 802

BeitragVerfasst am: 27.11.2009, 09:43    Titel: Antworten mit Zitat

Hallo d.i.

mit FBGFX eigenen mitteln wird das meines wissens eher nich gehen.

Was aber grundsätzlich geht:

Maus ausblenden (setmouse ,,0) ,
Eigenen Mauszeiger malen, (mit Put oder eine anderen Grafikanweisung)
Relative Mausposition auswerten, ( dx = x2 - x1 , dy = y2 - y1)
Falls eine bewegung stattgefunden hat, Maus zurück auf den Bildschirmmittelpunkt zurücksetzen. (if dx <> 0 or dy <> 0 then setmouse (320,200),0)
Um dann an die absolute Mausposition zu kommen nochmal rechnen (x = x +dx , y = y + dy)

So ist die Maus immer im Fenster und du erhälst immer deine events die du brauchst...
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
MOD
Fleißiger Referenzredakteur


Anmeldungsdatum: 10.09.2007
Beiträge: 1003

BeitragVerfasst am: 27.11.2009, 14:04    Titel: Antworten mit Zitat

Wenn du die Maus mit SetMouse Clip = 1 im Fenster hältst, gehen die ScreenEvents nicht mehr? Hab ich das falsch verstanden?
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
28398



Anmeldungsdatum: 25.04.2008
Beiträge: 1917

BeitragVerfasst am: 27.11.2009, 17:31    Titel: Antworten mit Zitat

Nein, erst wenn sie dne Fensterrand erreichen.

@Topic:
Naja du kannst dir das ja mal im SDL Sourcecode anschauen. Der ist ziemlich gut strukturiert (daher gut lesbar)...
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
MOD
Fleißiger Referenzredakteur


Anmeldungsdatum: 10.09.2007
Beiträge: 1003

BeitragVerfasst am: 27.11.2009, 17:43    Titel: Antworten mit Zitat

Ich hab in einem Test die Maus geclipt und per ScreenEvent die Mauspositionen abgefragt und anzeigen lassen. Hat problemlos funktioniert, auch ganz am Rand.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
darkinsanity
aka sts


Anmeldungsdatum: 01.11.2006
Beiträge: 456

BeitragVerfasst am: 28.11.2009, 19:31    Titel: Antworten mit Zitat

Ich kann das nicht so gut beschreiben, am besten ihr seht euch das mal in meiner letzten Demo an (der Mauszeiger ist unsichtbar, soll ja ein Ego-Shooter werden):

http://darkinsanity.netii.net/xenon/xenon.7z
(gestartet wird die demo mit der "thunder.bat")

Das Problem ist, dass die Maus irgendwann den Fensterrand erreicht, und da sie das Fenster nicht verlassen kann werden ab da keine relativen Mausbewegungen mehr von ScreenEvent hergegeben.
Theoretisch würde es funktionieren, wenn ich die Maus immer wieder in den Mittelpunkt setze, aber dann sendet mir ScreenEvent genau das wieder als Mausbewegung im nächsten Frame, und die Kamera dreht sich zurück.

Wer selbst schon mal einen Shooter gespielt hat, weiß, dass man die Maus endlos nach rechts und links bewegen kann, und die Kamera wird immer schön rotiert. Genau das will ich auch haben lächeln

@28398: Danke für den Tipp, ich seh mir das mal an
_________________
Traue keinem Computer, den du nicht aus dem Fenster werfen kannst -- Steve Wozniak
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
MOD
Fleißiger Referenzredakteur


Anmeldungsdatum: 10.09.2007
Beiträge: 1003

BeitragVerfasst am: 29.11.2009, 16:02    Titel: Antworten mit Zitat

Ich würde mir die Demo gern mal anschauen, aber der Download bricht jedes mal ab.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
St_W



Anmeldungsdatum: 22.07.2007
Beiträge: 956
Wohnort: Austria

BeitragVerfasst am: 29.11.2009, 16:24    Titel: Antworten mit Zitat

@MOD: Bei mir hat der Download gerade bei zweiten Versuch funktioniert. Wenn es darkinsanity erlaubt könnte ich es auch auf meinen Webspace (ebenfalls FreeHoster) hochladen. Falls du dann die Datei heruntergeladen und entpackt hast brauchst du möglicherweise (so wie ich) die DLL "OpenAL32.dll", die ich unter folgender Adresse hochgeladen habe: http://wurzinger.bplaced.net/files/programmierung/fb/misc/OpenAL32.dll

@darkinsanity: Erstmal muss ich sagen, dass es schon sehr gut aussieht. Mit den Pfeiltasten kann man die Ansicht prima steuern zwinkern
Wenn ich dein Problem richtig verstehe, könntest du bei jeder Mausbewegung den Mauszeiger wieder in die Mitte deines Fensters setzten, wobei du Mausbewegungen zum Mittelpunkt ignorierst. Wenn du den Mauszeiger dann am Anfang gleich in die Mitte setzt ist eine Mausbewegung immer eine Bewegung von der Mitte weg.

//EDIT:
Ich meinte in etwa so:
Code:
screen 12

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

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

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

do
   
   if GetMouse(x, y) = 0 then
      if x <> mx or y <> my then
         ox += x-mx: oy += 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
   end if
   
   sleep 1
   
Loop until inkey <> ""

_________________
Aktuelle FreeBasic Builds, Projekte, Code-Snippets unter http://users.freebasic-portal.de/stw/
http://www.mv-lacken.at Musikverein Lacken (MV Lacken)


Zuletzt bearbeitet von St_W am 29.11.2009, 17:19, insgesamt einmal bearbeitet
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
MOD
Fleißiger Referenzredakteur


Anmeldungsdatum: 10.09.2007
Beiträge: 1003

BeitragVerfasst am: 29.11.2009, 16:41    Titel: Antworten mit Zitat

@St_W: Beim zweiten "@" meinst du glaube ich nicht mich Zunge rausstrecken

Der Download startet bei mir mit 150 KB/s und sinkt dann schnell auf 8 und bricht dann sofort ab.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
28398



Anmeldungsdatum: 25.04.2008
Beiträge: 1917

BeitragVerfasst am: 29.11.2009, 18:34    Titel: Antworten mit Zitat

Habe das selbe Problem.
Kannst es mir per eMail zuschicken (8 MB gehn ja noch), dann lade ich es auf meinen Space hoch.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
St_W



Anmeldungsdatum: 22.07.2007
Beiträge: 956
Wohnort: Austria

BeitragVerfasst am: 29.11.2009, 19:08    Titel: Antworten mit Zitat

Für alle die ein Problem beim Herunterladen haben:
http://wurzinger.bplaced.net/files/programmierung/fb/misc/xenon.7z
Der Server spinnt zwar auch öfters, aber normalerweise sollte es funktionieren.

Es handelt sich dabei um das Originalpaket von darkinsanity + der fehlenden OpenAL32.dll.

@darkinsanity: Bitte informiere mich sofort, wenn ich dein Werk vom Server löschen soll - ich werde es dann umgehend entfernen.
_________________
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
Jojo
alter Rang


Anmeldungsdatum: 12.02.2005
Beiträge: 9736
Wohnort: Neben der Festplatte

BeitragVerfasst am: 29.11.2009, 19:22    Titel: Antworten mit Zitat

Zitat:
@darkinsanity: Erstmal muss ich sagen, dass es schon sehr gut aussieht. Mit den Pfeiltasten kann man die Ansicht prima steuern

naja, alles, was ich da sehe, ist eine Skybox, die ich doch erst letztens bei irgendeinem anderen FB-Projekt gesehen habe...
_________________
» Die Mathematik wurde geschaffen, um Probleme zu lösen, die es nicht gäbe, wenn die Mathematik nicht erschaffen worden wäre.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
darkinsanity
aka sts


Anmeldungsdatum: 01.11.2006
Beiträge: 456

BeitragVerfasst am: 01.12.2009, 13:26    Titel: Antworten mit Zitat

@Jojo: Glaub mir, die Skybox hast du noch nirgends gesehen lächeln Aber eine ähnliche vielleicht, denn die hab ich mit Terragen erzeugt, das ist ja relativ bekannt/beliebt. Und wenn du ein Stück zurückgehst (mit "S") dann siehst du auch noch ein Dreieck. Leider hatte ich noch nicht die Zeit, eine gescheite Testmap zu bauen.
Die Engine enthält auch noch einiges, was man nicht sieht, z.B. ein Materialsystem (jedes Material hat eine eigene Farbe, Textur und Shader), ein nicht fertiges Partikelsystem (mit "N" wirds gestartet) und sie kann OggVorbis-Dateien an die Soundkarte streamen (mit "P" wird ein Testsound abgespielt). Screenshots kann man auch erstellen (mit F5).
Aber es ist natürlich noch lange nicht alles so, wie es mal sein soll lächeln

@St_W: Das ist kein Problem, du kannst mein Projekt gern auf deinen Webspace hochladen.

Sorry für die Downloadprobleme, bisher hatte ich noch nie so etwas bei 000webhost. Gerade wegen solchen Problemen bin ich von freehoster.ch weggegangen. Leider hab ich hier zu Hause kein DSL, sonst würde hier schon längst ein eigener Server stehn.

Und nochmal sorry dass ich vergessen habe das mit OpenAL zu sagen. Ich vergesse das mitlerweile, da ich selbst die ganze Zeit die OpenAL-DLLs installiert hab (von openal.org), da auch einige Spiele das nutzen. Am besten holt man sich das komplette Paket, da sind immer die neusten DLLs drin.

Mit getmouse/setmouse hatte ich das auch vorher gemacht, aber von einem User aus dem gamerzone.info-Forum bin ich darauf hingewiesen worden, dass diese Variante manchmal ein paar "Aussetzer" hat, und als ich dann anfing, testweise "screensync" einzusetzen, hatte das ganze auch bei mir einige Aussetzer.
Daher bin ich auf die Event-basierte Steuerung umgestiegen, da die auch bei screensync gute Resultate liefert.

Hier der Codeausschnitt der alten Steuerung:
Code:

dim as INTEGER x, y

' ...

    getmouse x, y
   
    if x < YangGL_xres/2 then
        Xenon_camera_rotateLeft(camera, ((YangGL_xres/2)-x)/10)
    elseif x > YangGL_xres/2 then
        Xenon_camera_rotateRight(camera, (x-(YangGL_xres/2))/10)
    end if
   
    if y < YangGL_yres/2 then
        Xenon_camera_rotateUp(camera, ((YangGL_yres/2)-y)/10)
    elseif y > YangGL_yres/2 then
        Xenon_camera_rotateDown(camera, (y-(YangGL_yres/2))/10)
    end if
   
    setmouse YangGL_xres/2, YangGL_yres/2


Und hier die momentane Maussteuerung:
Code:

dim event as FB.EVENT
setmouse YangGL_xres/2, YangGL_yres/2, 0, 1

' ...

   do while ScreenEvent(@event)
        select case event.type
            case FB.EVENT_MOUSE_MOVE
                Xenon_camera_rotateRight(camera, event.dx/10)
                Xenon_camera_rotateDown(camera, event.dy/10)
        end select
    loop


Damit ihr die Probleme auch sehen könnt, hab ich auch noch mal eine Exe mit der alten Steuerung (+Screensync) und eine mit der neuen (+setmouse) Steuerung erstellt. Dazu braucht ihr aber auch die neue Demo, da ich zwischenzeitlich Änderungen am Map-Format gemacht habe.

Link zur Demo: http://darkinsanity.netii.net/xenon/xenon.7z
Link zu den zwei Exe: http://darkinsanity.netii.net/xenon/problem_exe.7z

Einfach die xenon.exe durch eine von den beiden ersetzen, und ihr seht die Probleme die ich sehe lächeln

bis denn
_________________
Traue keinem Computer, den du nicht aus dem Fenster werfen kannst -- Steve Wozniak
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
St_W



Anmeldungsdatum: 22.07.2007
Beiträge: 956
Wohnort: Austria

BeitragVerfasst am: 01.12.2009, 16:31    Titel: Antworten mit Zitat

@darkinsanity: Ich verstehe dein Problem mit SetMouse nicht ganz. Wenn du Screenevent verwendest ist es bis auf ein paar abgeänderte Zeilen gleich (die größte Änderung ist der hinzugefügte Typ 'Event'):
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 <> ""

Ansonsten wäre es weitaus einfacher möglich zu helfen, wenn man den Quellcode hätte. So kann man großteils nur raten.

@Alle anderen: Ich habe die aktuelle Version + die anderen EXE Dateien + fertig abgeänderte BAT-Datei wieder hochgeladen, falls es wieder Probleme beim Download geben sollte (beim mir funktionierts seltsamerweise, obwohl ich eine so langsame Internetverbindung habe, dass es ewig dauert 8MB herunterzuladen - und noch länger, diese auf den Server hochzuladen..)
Link: http://wurzinger.bplaced.net/files/programmierung/fb/misc/xenon2.7z
_________________
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
Jojo
alter Rang


Anmeldungsdatum: 12.02.2005
Beiträge: 9736
Wohnort: Neben der Festplatte

BeitragVerfasst am: 01.12.2009, 20:09    Titel: Antworten mit Zitat

Zitat:

@Jojo: Glaub mir, die Skybox hast du noch nirgends gesehen lächeln Aber eine ähnliche vielleicht, denn die hab ich mit Terragen erzeugt

Dann sit das wohl so ziemlich ein Standard-Design, denn ich habe garantiert schon so eine Skybox gesehn! Zunge rausstrecken
_________________
» Die Mathematik wurde geschaffen, um Probleme zu lösen, die es nicht gäbe, wenn die Mathematik nicht erschaffen worden wäre.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
darkinsanity
aka sts


Anmeldungsdatum: 01.11.2006
Beiträge: 456

BeitragVerfasst am: 02.12.2009, 11:30    Titel: Antworten mit Zitat

ja, Standard-Design ist es, aber die Heightmap nach der die Landschaft gemacht wird ist selbst erzeugt lächeln

Der Unterschied ist, das ich die relativen Bewegungen nehme: Nicht event.x, sondern event.dx. Aber du hast mich auf eine Idee gebracht, ich werd es mal so probieren wie du es machst. Vielleicht geht es damit dann.
_________________
Traue keinem Computer, den du nicht aus dem Fenster werfen kannst -- Steve Wozniak
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
darkinsanity
aka sts


Anmeldungsdatum: 01.11.2006
Beiträge: 456

BeitragVerfasst am: 07.12.2009, 13:26    Titel: Antworten mit Zitat

Ok, ich hatte gestern etwas Zeit, da hab ich das mal so eingebaut wie du es vorgeschlagen hast. Bei hohen Frameraten (ca. 580) läuft es ganz gut, aber sobald die Frameraten kleiner werden (es aber noch nicht ruckelt, 60 FPS) fängt auch diese Art der Steurung ganz böse an rumzuruckeln.
Ich schätze, ich werde wohl nicht drumherumkommen, mir irgendwann irgendwas direkt auf Basis der WinAPI zu schreiben, da ich dann an die WM_INPUT-Events kommen kann (die genauso funktionieren wie ich das will). Dumm ist dann nur, dass ich auch die Initialisierung von OpenGL dann selbst machen muss, und das hab ich bisher noch nicht hingekriegt. Ganz zu schweigen von der Umsetzung auf Linux.

Wenn sich jemand mal die WM_INPUT-Events ansehen will: Ich habe vor kurzer Zeit ein kleines Programm geschrieben, das auf dem Dokument "Taking Advantage of High-Definition Mouse Movement" aus dem Microsoft DirectX SDK basiert. Es wird mit der WinAPI ein Fenster erzeugt und anschließend werden die relativen Mausbewegungen (die vom WM_INPUT-Event kommen) oben links angezeigt. Das funktioniert auch, wenn die Maus das Fenster verlässt oder sogar den Bildschirmrand erreicht hat.

Die WM_INPUT-Demo gibts hier: http://darkinsanity.netii.net/stuff/TAoHDMM.zip

bis denn
_________________
Traue keinem Computer, den du nicht aus dem Fenster werfen kannst -- Steve Wozniak
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