 |
Das deutsche QBasic- und FreeBASIC-Forum Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
|
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
darkinsanity aka sts

Anmeldungsdatum: 01.11.2006 Beiträge: 456
|
Verfasst am: 26.11.2009, 21:05 Titel: relative Mausbewegung |
|
|
Hi,
es geht mal wieder um die Maus
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  _________________ Traue keinem Computer, den du nicht aus dem Fenster werfen kannst -- Steve Wozniak |
|
Nach oben |
|
 |
OneCypher
Anmeldungsdatum: 23.09.2007 Beiträge: 802
|
Verfasst am: 27.11.2009, 09:43 Titel: |
|
|
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 |
|
 |
MOD Fleißiger Referenzredakteur

Anmeldungsdatum: 10.09.2007 Beiträge: 1003
|
Verfasst am: 27.11.2009, 14:04 Titel: |
|
|
Wenn du die Maus mit SetMouse Clip = 1 im Fenster hältst, gehen die ScreenEvents nicht mehr? Hab ich das falsch verstanden? |
|
Nach oben |
|
 |
28398
Anmeldungsdatum: 25.04.2008 Beiträge: 1917
|
Verfasst am: 27.11.2009, 17:31 Titel: |
|
|
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 |
|
 |
MOD Fleißiger Referenzredakteur

Anmeldungsdatum: 10.09.2007 Beiträge: 1003
|
Verfasst am: 27.11.2009, 17:43 Titel: |
|
|
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 |
|
 |
darkinsanity aka sts

Anmeldungsdatum: 01.11.2006 Beiträge: 456
|
Verfasst am: 28.11.2009, 19:31 Titel: |
|
|
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
@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 |
|
 |
MOD Fleißiger Referenzredakteur

Anmeldungsdatum: 10.09.2007 Beiträge: 1003
|
Verfasst am: 29.11.2009, 16:02 Titel: |
|
|
Ich würde mir die Demo gern mal anschauen, aber der Download bricht jedes mal ab. |
|
Nach oben |
|
 |
St_W

Anmeldungsdatum: 22.07.2007 Beiträge: 956 Wohnort: Austria
|
Verfasst am: 29.11.2009, 16:24 Titel: |
|
|
@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
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 |
|
 |
MOD Fleißiger Referenzredakteur

Anmeldungsdatum: 10.09.2007 Beiträge: 1003
|
Verfasst am: 29.11.2009, 16:41 Titel: |
|
|
@St_W: Beim zweiten "@" meinst du glaube ich nicht mich
Der Download startet bei mir mit 150 KB/s und sinkt dann schnell auf 8 und bricht dann sofort ab. |
|
Nach oben |
|
 |
28398
Anmeldungsdatum: 25.04.2008 Beiträge: 1917
|
Verfasst am: 29.11.2009, 18:34 Titel: |
|
|
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 |
|
 |
St_W

Anmeldungsdatum: 22.07.2007 Beiträge: 956 Wohnort: Austria
|
|
Nach oben |
|
 |
Jojo alter Rang

Anmeldungsdatum: 12.02.2005 Beiträge: 9736 Wohnort: Neben der Festplatte
|
Verfasst am: 29.11.2009, 19:22 Titel: |
|
|
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 |
|
 |
darkinsanity aka sts

Anmeldungsdatum: 01.11.2006 Beiträge: 456
|
Verfasst am: 01.12.2009, 13:26 Titel: |
|
|
@Jojo: Glaub mir, die Skybox hast du noch nirgends gesehen 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
@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
bis denn _________________ Traue keinem Computer, den du nicht aus dem Fenster werfen kannst -- Steve Wozniak |
|
Nach oben |
|
 |
St_W

Anmeldungsdatum: 22.07.2007 Beiträge: 956 Wohnort: Austria
|
Verfasst am: 01.12.2009, 16:31 Titel: |
|
|
@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 |
|
 |
Jojo alter Rang

Anmeldungsdatum: 12.02.2005 Beiträge: 9736 Wohnort: Neben der Festplatte
|
Verfasst am: 01.12.2009, 20:09 Titel: |
|
|
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!  _________________ » Die Mathematik wurde geschaffen, um Probleme zu lösen, die es nicht gäbe, wenn die Mathematik nicht erschaffen worden wäre.
 |
|
Nach oben |
|
 |
darkinsanity aka sts

Anmeldungsdatum: 01.11.2006 Beiträge: 456
|
Verfasst am: 02.12.2009, 11:30 Titel: |
|
|
ja, Standard-Design ist es, aber die Heightmap nach der die Landschaft gemacht wird ist selbst erzeugt
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 |
|
 |
darkinsanity aka sts

Anmeldungsdatum: 01.11.2006 Beiträge: 456
|
Verfasst am: 07.12.2009, 13:26 Titel: |
|
|
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 |
|
 |
|
|
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.
|
|