MouseYSpeed() gibt nichts zurück / 3D Steuerung

Übersicht BlitzBasic Blitz3D

Neue Antwort erstellen

Dottakopf

Betreff: MouseYSpeed() gibt nichts zurück / 3D Steuerung

BeitragMi, Okt 20, 2010 21:15
Antworten mit Zitat
Benutzer-Profile anzeigen
Abend Blitzer,


Situation:
arbeite grade an der 3D Steuerung an einem kleinen Shooter / First person.
allerdings habe ich grade das problem das ich ich nach oben und unten "unendlich" weit den kopf drehen kann.

wie kann ich die drehung nach oben verhindern wenn entitypitch = maxwert.

Mein lösungsansatz (jaja umständlich.. aber es gibt mehrere lösungen..)

- ermitteln ob maus nach oben bzw unten bewegt (mouseYspeed positiv oder negativ)
- aktuellen winkel der Kamera welche als parent am Spieler hängt ermitteln und auf max überprüfen
- Wenn beide bedingungen true dann mit turnentity um mouseYspeed erhöhen.


Mein problem... aus irgendeinem grund bekomme ich plötzlich für mouseyspeed immer 0

Code: [AUSKLAPPEN]

 If MouseYSpeed() <0 And EntityPitch(game_cam) >80 Then TurnEntity game_cam,MouseYSpeed()/3,0,0;oben unten


wenn ich mir jetzt als debug wert den mousespeed anzeige lasse habe ich immer 0.


Meine Vermutung:
Arbeite in verbindung mit SimpleUDP2. Sprich es ist gleichzeitig ein 2ter client(host) im hintergrund geöffnet. bei welchen die mouseySpeed immer einen wert zurück gibt. Nur der client bekommt immer 0
Wunderlich ist, dass die kamerasteuerung bis auf die begrenzung funzt.

Arrow ich bin verwirrt

könnt ihr mir mit einer eleganteren lösung aushelfen ? ich möchte ja nur, das ab einem bestimmten winkel die cam nicht mehr weiter dreht.

*Edit
Mir würds auch ein befehl reichen mit dem ich NUR EINEN Winkel des meshes definieren kann. Nicht wie Rotateentity der gleich mir alle winkel überschreibt.

Code: [AUSKLAPPEN]
rotateentity mesh, neuerwinkel ,  entitypitch(mesh) , entityvergessen(mesh)

klappt irgenwie nicht

drehung auf der y achste klappt ohne probs:
Code: [AUSKLAPPEN]

 TurnEntity PlayerMesh(UDP_PlayerID),0,(0-MouseXSpeed()/3),0;seitlich


Gruß
Dottakopf
Rechtschreibfehler gelten der allgemeinen Belustigung!

Xeres

Moderator

BeitragMi, Okt 20, 2010 21:54
Antworten mit Zitat
Benutzer-Profile anzeigen
Bin jetzt nicht 100% sicher dein Problem erkannt zu haben, aber ich hab's so gelöst:

BlitzBasic: [AUSKLAPPEN]
Local Pitch% = Limit(EntityPitch(camera) + MouseYSpeed()/Camera_DrehSpeed#, -89, +89)
Local Yaw% = EntityYaw(camera) - MouseXSpeed()/Camera_DrehSpeed#
RotateEntity(camera, Pitch, Yaw, 0)

Function Limit#(value#, min#, max#)
If value < min Then
Return min
ElseIf value > max Then
Return max
Else
Return value
EndIf
End Function
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)

Vincent

BeitragDo, Okt 21, 2010 9:55
Antworten mit Zitat
Benutzer-Profile anzeigen
MouseYSpeed() gibt immer den Wert der Bewegung auf der Achse seit dem letzten Aufruf von MouseYSpeed() an.
Dabei kann die natürlich auch kleiner 0 sein ... wenn man die Maus sozusagen nach links bewegt hat.
Da du in deinem Code direkt vorher sinnloserweise prüfst, ob MouseYSpeed() > 0 ist .. und damit zum einen den Wert resetest und zum anderen gleichwichtige negative Werte ausschließt ... ist natürlich die Mausbewegung in der sehr sehr sehr kurzen Zeit bis zum nächsten Aufruf im direkt anfolgenden Befehl sehr gering.

Code: [AUSKLAPPEN]
 
TurnEntity cam, MouseYSpeed(), -MouseXSpeed(),0
RotateEntity cam, EntityPitch(cam),EntityYaw(cam),0
MoveMouse 400,300


Den Code benutze ich immer.
Die erste Zeile dreht die Kamera.
Die zweite Zeile verhindert das Kippen um die Z Achse.
Dritte Zeile verhindert, dass man irgendwann nichtmehr in eine Richtung drehen kann, weil die Maus am Bildschirmrand angekommen ist ^^


ansonsten halt:
https://www.blitzforum.de/help/MouseYSpeed

Da steht bei Beschreibung, was ich grad erklärt hab.
Gott ist nicht mit uns ... weil er mit Idioten keine Gnade kennt !

ToeB

BeitragDo, Okt 21, 2010 11:16
Antworten mit Zitat
Benutzer-Profile anzeigen
Dein Fehler ist hier, das du zweimal MouseYSpeed abfragst. Einmal in der IF-Bedingung und einmal bei TurnEntity. MouseYSpeed gibt immer den GESAMMT Weg (in px) zurück, den die Maus seit dem LETZTEN AUFRUF von MouseYSpeed gemacht hat. Wenn du also prüfst :
Code: [AUSKLAPPEN]
If MouseYSpeed() <0 And ... Then TurnEntity MouseYSpeed(), ...


Fragt er erst den Gemachten weg ab (Und merkt das er kleiner als 0 ist) und will dann nochmal den Weg abfragen, ist aber 0 weil sich die Maus in den 0.00001ms nicht viel verschoben hat Wink

Speicherer MouseXSpeed() und MouseYSpeed() in Variablen und überprüfe diese !

mfg ToeB
Religiöse Kriege sind Streitigkeiten erwachsener Männer darum, wer den besten imaginären Freund hat.
Race-Project - Das Rennspiel der etwas anderen Art
SimpleUDP3.0 - Neuste Version der Netzwerk-Bibliothek
Vielen Dank an dieser Stelle nochmal an Pummelie, welcher mir einen Teil seines VServers für das Betreiben meines Masterservers zur verfügung stellt!

Dottakopf

BeitragDo, Okt 21, 2010 12:29
Antworten mit Zitat
Benutzer-Profile anzeigen
danke für eure schnelle hilfe. So betrachtet ist es klar das der speed immer 0 ergibt Razz

@vinzent
ahh so simpel... das ist genau das was ich gesucht habe.

danke

Gruß
Dottakopf
Rechtschreibfehler gelten der allgemeinen Belustigung!

faeX

BeitragSa, Okt 23, 2010 17:19
Antworten mit Zitat
Benutzer-Profile anzeigen
MouseXSpeed() ist hier sowieso der falsche Ansatz.
Man sollte in jedem Frame:
- X,Y-Mausabstand zur Bildschirmmitte speichern (ersatz für MouseX/YSpeed())
- Maus mit MoveMouse wieder in die Bildschirmmitte bewegen

Das verhindert, dass man sich irgendwann nicht mehr drehen kann.

Anschließend sollte man mit Rotationsgeschwindigkeiten (hört sich komplizierter an als es ist) arbeiten, sonst wirkt die Rotation sehr unschön abgehackt. Aber das ist jetzt nicht Thema. Smile

Vincent

BeitragSo, Okt 24, 2010 1:30
Antworten mit Zitat
Benutzer-Profile anzeigen
Das ist doch kompletter Unsinn.
Was du beschreibst ist in jeder Beziehung ungünstig.
Es hat keine Vorteile das Selber zu messen.
MoveMouse ist in meinem Beispiel vorhanden.
Evtl ist der gemessene Abstand der Maus mit Mousex() sogar ein Integer ... kann ich von hier aus zz nicht testen ... das wäre aber fatal für die Feinheit der Steuerung^^

Dadurch, dass man schon mit der relativen Geschwindigkeit der Maus arbeitet wird die Bewegung weich. Die Hand braucht eine gewisse Zeit um die Maus auf eine bestimmte Geschwindigkeit zu beschleunigen oder zu bremsen ... alles andere wäre unnatürlich träge in der Steuerung.

also nix mit "sowieso falscher Ansatz"
Gott ist nicht mit uns ... weil er mit Idioten keine Gnade kennt !

ToeB

BeitragSo, Okt 24, 2010 2:31
Antworten mit Zitat
Benutzer-Profile anzeigen
*hust* MouseXSpeed/YSpeed geben auch nur Integer werte wieder *hust-Ende*
Code: [AUSKLAPPEN]
SetBuffer BackBuffer( )

Repeat
   Text 0, 0, MouseXSpeed( )
   Text 0,13, MouseYSpeed( )
   Flip
   Cls
Until KeyHit( 1 )
End( )


mfg ToeB
Religiöse Kriege sind Streitigkeiten erwachsener Männer darum, wer den besten imaginären Freund hat.
Race-Project - Das Rennspiel der etwas anderen Art
SimpleUDP3.0 - Neuste Version der Netzwerk-Bibliothek
Vielen Dank an dieser Stelle nochmal an Pummelie, welcher mir einen Teil seines VServers für das Betreiben meines Masterservers zur verfügung stellt!

Dottakopf

BeitragMo, Okt 25, 2010 9:26
Antworten mit Zitat
Benutzer-Profile anzeigen
also ich konnte das ganze in etwas abgewandelter form hinbiegen.

Was mich aber im moment wirklich stört ist, sind die Rückgabewerte von EntityYaw Pitch und Roll....

dreht man ein objekt in eine richtung, steigt der Winkel von 0 - 90 erreicht man den Max Wert 90 fängt er nicht bei -90 oder 0 an.. nein er beginnt mit 89 88 87 wieder runter zu zählen. Was eine überprüfung >= 90 des aktuellen winkels ziemlich schwer macht Smile Vorallem da ein Mousespeed gernmal so +20 bis + 30 erreichen kann.

aktell löse ich die winkel "beschränkung" so: (ausn kopf)

- Speichere aktuellen MausSpeed
- Ist Mausspeed > MaxZulässigerMausSpeed Dann Speed = Max


If entityPitch(mesh) >= 60 and entitypitch(mesh) >=0 then Rotateentity Mesh, 59.99

nicht schön aber es geht. Allerdings geht das bestimmt viel viel eleganter

Gruß
Dottakopf
Rechtschreibfehler gelten der allgemeinen Belustigung!

faeX

BeitragMo, Okt 25, 2010 20:22
Antworten mit Zitat
Benutzer-Profile anzeigen
@Vincent: Du hast Recht, mit MouseXSpeed() geht es genauso gut, also tut's mir Leid. Smile
Allerdings reicht die Beschleunigung der Hand nicht aus. (Und Ja, ich hab's getestet.) Da muss man dann wirklich Drehgeschwindigkeiten benutzen.

So stelle ich mir eine gute Steuerung vor (Modus 2):
BlitzBasic: [AUSKLAPPEN]
Graphics3D 800, 600
SetBuffer BackBuffer()

; Kontrollieren die Drehgeschwindigkeit

; Je groesser dieser Wert ist, desto schneller dreht man sich
Global fTurnSpeed#
; Zwischen 0 und 1.
; Je naeher an 1, desto weicher
; Nicht ganz auf 0 oder ganz auf 1 setzen
; Wenn dieser Wert erhoeht wird, muss fTurnSpeed nach unten korrigiert werden
; und umgekehrt
Global fTurnVelocityFactor#

Global timer% = CreateTimer(60)

Global entPlayer = CreateCube()
EntityParent CreateCamera(), entPlayer
Global fTurnVelocityX#, fTurnVelocityY#

Local entCube%
For iCube% = 1 To 50

Local iColor% = Rand(0, 255)
entCube = CreateCube()
EntityColor entCube, iColor, iColor, iColor
RotateEntity entCube, Rnd(0, 360), Rnd(0, 360), 0
MoveEntity entCube, 0, 0, 10
RotateEntity entCube, 0, 0, 0

Next

Global iControlMode%

MoveMouse GraphicsWidth()/2, GraphicsHeight()/2
While Not KeyDown(1)

fTurnVelocityX = fTurnVelocityX*fTurnVelocityFactor
fTurnVelocityY = fTurnVelocityY*fTurnVelocityFactor

fTurnVelocityX = fTurnVelocityX - fTurnSpeed*MouseXSpeed()
fTurnVelocityY = fTurnVelocityY + fTurnSpeed*MouseYSpeed()

RotateEntity entPlayer, EntityPitch(entPlayer), EntityYaw(entPlayer) + fTurnVelocityX, EntityRoll(entPlayer)

If EntityPitch(entPlayer) + fTurnVelocityY < 80 Then

If EntityPitch(entPlayer) + fTurnVelocityY > -80 Then

RotateEntity entPlayer, EntityPitch(entPlayer) + fTurnVelocityY, EntityYaw(entPlayer), EntityRoll(entPlayer)

Else

RotateEntity entPlayer, -80, EntityYaw(entPlayer), EntityRoll(entPlayer)
fTurnVelocityY = 0

EndIf

Else

RotateEntity entPlayer, 80, EntityYaw(entPlayer), EntityRoll(entPlayer)
fTurnVelocityY = 0

EndIf
MoveMouse GraphicsWidth()/2, GraphicsHeight()/2

If KeyHit(2) Then

fTurnSpeed = .5
fTurnVelocityFactor = 0
iControlMode = 1

EndIf
If KeyHit(3) Then

fTurnSpeed = .2
fTurnVelocityFactor = .6
iControlMode = 2

EndIf

RenderWorld

Text 0, 0, "Aktueller Modus: " + iControlMode + " (mit Zifferntasten waehlen)"
Text 0,24, "1: Harte Steuerung"
Text 0,36, "2: Steuerung mit Bewegungsgeschwindigkeit"

If iControlMode = 2 Then

Text 0,60, "[Pfeiltasten OBEN/UNTEN] Drehgeschwindigkeit: " + fTurnSpeed
Text 0,72, "[Pfeiltasten RECHTS/LINKS] Geschwindigkeitsfaktor: " + fTurnVelocityFactor
fTurnSpeed = fTurnSpeed * 1.01^(KeyDown(200) - KeyDown(208))
fTurnVelocityFactor = fTurnVelocityFactor + .001*(KeyDown(205) - KeyDown(203))
If fTurnVelocityFactor > .99 Then fTurnVelocityFactor = .99
If fTurnVelocityFactor < .1 Then fTurnVelocityFactor = .1

EndIf

Flip 0
WaitTimer timer

Wend

Dottakopf

BeitragFr, Okt 29, 2010 17:25
Antworten mit Zitat
Benutzer-Profile anzeigen
hey das gefällt mir gut Smile
Rechtschreibfehler gelten der allgemeinen Belustigung!

Neue Antwort erstellen


Übersicht BlitzBasic Blitz3D

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group