Gerundete Positionierung? Unerwünscht!
-
Bei einer Ansicht, welche auf Tiles (welche fixe Dimensionen in Pixeln haben) basiert würde ich auf Ganzzahlen setzen. Gleitpunktzahlen sind immer nur Annäherungen an einen gewünschten Wert und daher niemals exakt --> statt der gewünschten Genauigkeit erhälst du genau das Gegenteil.
Auch würde ich an Deiner Stelle beim Scrollen nicht die Position der Tiles ändern sondern eine Art "ViewPort" realisieren, welcher die (gerade sichtbaren) Tiles abbildet.
Grüße...
Heiko
-
DirectX
Aber ich muss doch Gleitpunktzahlen zur Positionierung verwenden, denn sonst funktioniert meine Berechnung zur Bewegung vom Spieler nicht mehr:
playerMoveSpeedX = 4.0f * (playerMoveX / sqrt(pow(playerMoveX, 2) + pow(playerMoveY, 2)));
playerMoveSpeedY = 4.0f * (playerMoveY / sqrt(pow(playerMoveX, 2) + pow(playerMoveY, 2)));(Es wird dann ungenau, also die Bewegung einer Richtung ist schneller fertig als die der anderen, und genau das möchte ich ja vermeiden)
Möchte gar keinen Viewport oder Kamera verwenden, da ich mich nicht viel mit DirectX beschäftigen möchte.
MfG
-
Keine Ideen?
Hab mal was getestet:
double posX1 = 0.00000000000000; double posX2 = 64.0000000000000; posX1 += 0.10000000000000; posX2 += 0.10000000000000;Warum zum Teufel ist dann der Ausdruck
posX2 - 64.0000000000000 == posX1
FALSE?
Vor der Erhöhung um 0.1 ist er TRUE...
Kann man denn überhaupt vernünftig mit Gleitpunktzahlen arbeiten? Scheint ja nicht sehr danach... Wie Löst man das Problem der Ungenauigkeit bei Positionierungen? Es muss doch möglich sein, ohne Ganzzahlen zu positionieren...
MfG
-
kann es sein, dass der Strich an der Stelle entsteht, in der dir Koordinaten vom positiven ins negative wechseln, oder ist das einfach irgendwo? Ich hab sowan nämlich nicht bei meinen tiles.
-
ceplusplus schrieb:
Keine Ideen?
Hab mal was getestet:
double posX1 = 0.00000000000000; double posX2 = 64.0000000000000; posX1 += 0.10000000000000; posX2 += 0.10000000000000;Warum zum Teufel ist dann der Ausdruck
posX2 - 64.0000000000000 == posX1
FALSE?
MfG
fließ und gleitkommazahlen sind nie genau. an der letzten stelle gibts immer ne ungenauigkeit weil dein pc im binären zahlensystem einfach nur bis zu ner bestimmten "tiefe" kommt und dann abrunden oder abschneiden muss. soll heißen ein
double a = 1.0;ist nicht etwa 1.0~ sondern 1.0000000000000000000000000000000000000000000000000000001 oder so
-
Ne, aber jetzt blick ich langsam hindurch:
0.00000 64.0000 128.000 + 1.23456 1.23456 65.2346 129.235Hier sieht man, dass die Werte nicht mehr genau +64 betragen. Daran liegt es.
Frage:
Wie schreibe ich die Formel um, dass int und nicht float berechnet wird?playerMoveSpeedX = 4.0f * (playerMoveX / sqrt(pow(playerMoveX, 2) + pow(playerMoveY, 2))); playerMoveSpeedY = 4.0f * (playerMoveY / sqrt(pow(playerMoveX, 2) + pow(playerMoveY, 2)));Umwandeln darf ich ja nicht, sonst ist eine Bewegung in eine Richtung früher fertig. Gibts keinen double- D3DXVECTOR3? So'n Schmarrn...
MfG
-
Ach egal mir reichts, da wird man ja deppert. Ich werd die Tiles als Primitive zeichnen und die Kamera verwenden.
Danke trotzdem.
MfG
-
TravisG schrieb:
double a = 1.0;ist nicht etwa 1.0~ sondern 1.0000000000000000000000000000000000000000000000000000001 oder so
verbreitet doch nicht immer so ein Halbwissen. 1.0 ist sowohl in float als auch in double genau 1.0.
-
@ceplusplus:
Theoretisch könntest du auch nur die Position eines einzigen Tiles mit floats ausrechnen, diese Position dann in Integer verwandeln, und alle anderen Tiles relativ zu der Integer Position zeichnen (also mit Integer Offsets).
Wenn nie etwas rotiert/skaliert/verzerrt wird und die Tiles 1:1 (1 Texel = 1 Pixel) am Bildschirm landen müsste das gut gehen.Die Version mit Kamera ist allerdings viel flexibler, daher würde ich die vorziehen.
-
alternativ kannst du ausrechnen von wo bis wo ein tile geht, theoretisch muesste das naechste genau an dem punkt weitergehen wo das vorherige aufhoerte, vorausgesetzt du kannst die tilesize pro tile angeben.
-
Optimizer schrieb:
Welches Grafik-API verwendest du?
ceplusplus schrieb:
DirectX
Danke für die Nachricht.
-
Danke für die Tips.
Hab rapso's Vorschlag getestet und klappt wunderbar.
Ich werd wohl doch bei der Methode bleiben, und auf Matrizen & co. verzichten.
Hab da paar Schwierigkeiten mit den Einheiten:Wie positioniert man zB. ein Vertex im world-space in der linken oberen Bildschirmecke? Die ganzen Koordinaten haben ja nix mit Pixel zu tun, da komm ich nicht klar.
MfG