Möglich, dass die Maus im Fenster bleibt?

Übersicht BlitzMax, BlitzMax NG Beginners-Corner

Neue Antwort erstellen

 

DJ_Mic

Betreff: Möglich, dass die Maus im Fenster bleibt?

BeitragFr, Jul 27, 2012 11:20
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi,

ich möchte, dass meine Maus im Fenster bleibt, damit ich eine Third person Camera machen kann. Denn momentan sobald ich mit der Maus aus dem Fenster gehe, dann dreht die Kamera ja nicht mehr.

Und wenn ich die Maus in der Mitte des Bildes positioniere, dann bewegt sich die Kamera leider nicht...
Kann mir jemand helfen? Smile

Für alle die wissen wollen, wie meine Kamera Funktion aussieht.

Pivtos deklarieren:
BlitzBasic: [AUSKLAPPEN]

Local piv:TPivot = CreatePivot( )
Local piv2:TPivot = CreatePivot( piv )
PositionEntity( piv2, Vec3( 0, 2, -4 ) )
Global camrot:Float = 0


Aufrufen:
BlitzBasic: [AUSKLAPPEN]
		UpdateCam( world.camera, piv2, piv )	
PositionEntity piv, EntityPosition( player.controller )
RotateEntity piv, Vec3( 0, camrot + EntityRotation( player.controller ).y, 0 )


Funktion:
BlitzBasic: [AUSKLAPPEN]
Function UpdateCam( cam:TCamera, piv:TPivot, piv2:TPivot, d:Float=0.3 )
Local pos_cam:TVec3 = EntityPosition( cam, 1 )
Local pos_piv:TVec3 = EntityPosition( piv, 1 )
Local pos:TVec3 = Vec3( 0 )
Local mx:Float, my:Float

mx = Curve(MouseX()-GraphicsWidth()/2,mx, 2.0 / AppSpeed())
my = Curve(MouseY()-GraphicsHeight()/2,my, 2.0 / AppSpeed())

pos.x = (pos_piv.x - pos_cam.x+mx/10.0)*d
pos.y = (pos_piv.y - pos_cam.y+my/10.0)*d
pos.z = (pos_piv.z - pos_cam.z)*d
TranslateEntity( cam, pos )
PointEntity( cam, piv2 )

camrot = camrot + (KeyDown( KEY_RIGHT ) - KeyDown( KEY_LEFT ))
End Function

BladeRunner

Moderator

BeitragFr, Jul 27, 2012 11:45
Antworten mit Zitat
Benutzer-Profile anzeigen
Speichere die Mauskoordinaten.
Im nächsten Frame bilde die Differenz der alten und der neuen Mauskoordinaten.
Nun prüfe ob die Maus das Fenster verlassen hat, wenn ja, setze die Mauskoordinaten auf den Fensterrand zurück.
Die nun ermittelten Koordinaten werden die ausgangskoordinaten für die nächste Prüfung.
Mit der ermittelten Differenz von oben kannst Du deine Kamerabewegung füttern.
Edit: alternativ kannst du auch Blind in jedem Frame die Maus auf die Fenstermitte resetten, entscheiden ist nur dass du eben die errechnete Differenz für die Bewegung der Kamera nimmst.
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3
Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64
B3D BMax MaxGUI

Stolzer Gewinner des BAC#48, #52 & #92
 

PhillipK

BeitragFr, Jul 27, 2012 11:47
Antworten mit Zitat
Benutzer-Profile anzeigen
Mal anders gefragt:

Wieso funktioniert die Camdrehung nichtmehr, wenn du die Maus mittig zentrierst?

Als kleinen hinweis:

Hole dir zuerst MouseXSpeed() und MouseYSpeed(), positioniere die Maus mit MoveMouse(GraphicsWidth()/2, GraphicsHeight()/2) und nutze erneut MouseXSpeed() und MouseYSpeed() OHNE diese einer variable zuzuweisen.

Hintergrund:
XSpeed und YSpeed hält den bewegungsvektor der maus, seit dem letzten aufruf von MouseXSpeed() und MouseYSpeed(). Positionierst du nun die Maus neu, ist der wert verfälscht. Darum solltest du XSpeed und YSpeed erneut aufrufen, um bis zum nächsten Update nur die reinen usereingaben darin zu haben.

Mit den werten hast du dann einen Wunderbaren Speedvektor den du quasie ganz einfach in rotation übertragen kannst Smile

(kleiner Tipp: Du solltest einen Point-To-Pivot anlegen, und diesen um das Zentrum drehen. Und dazu eine Lineare interpolation zwischen der PointEntity(pivot) rotation und der Aktuellen Camrotation durchführen und so die neue CamRotation setzen. Als interpolationsfaktor nimmst du zb 0.9, so hast du immer eine schöne sanfte bewegung Smile )
 

DJ_Mic

BeitragFr, Jul 27, 2012 12:05
Antworten mit Zitat
Benutzer-Profile anzeigen
Danke, ich kanns mir momentan schwer vorstellen was ihr meint. ich werde es mal versuchen.

Danke Smile

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group