Czesc. Mam tutaj taki kawalek kodu:
//movementSpeed=0,0625;
//posX i posZ sa typu float, probowalem tez z double.
public void move(Grid grid){
if ((posX > 0 && xSpeed.currentValue() == -1) || (posX < grid.getxSize() - 1 && xSpeed.currentValue() == 1))
posX += xSpeed.currentValue() * movementSpeed;
if ((posZ > 1 && zSpeed.currentValue() == -1) || (posZ < grid.getzSize() && zSpeed.currentValue() == 1))
posZ += zSpeed.currentValue() * movementSpeed;
//System.out.println(posX + " " + posZ);
//strafing
if (posX % 1 == 0 && posZ % 1 == 0){
//tutaj ewentualnie zakrecam wezem
Kalkuluje on nastepna pozycje mojego weza bazujac na jego kierunku. Problem w tym, ze jesli ustawie "zla" wartosc movementSpeed na przyklad 0,1, w posX i posZ zacznaja pojawiac sie male bledy. Zwykle by mi to nie przeszkadzalo, ale w tym wypadku moje sprawdzanie czy waz jest na srodku pola przy pomocy modulo zawodzi.Zdaje sobie sprawe ze sa one spowodowane zaokraglaniem przy pracy na liczbach zmiennoprzecinkowych.
Ale teraz, probujac przyciac posX uzywajac tej metody:
posX = Math.round(posX * 1000) / 1000
Bledy pojawiaja sie juz na trzecim miejscu po przecinku, co jest niedopuszczalne.
Wartosci w xSpeed i zSpeed maja tylko 3 wartosci, 0,1,-1
Dziwi mnie wiec dlaczego dzialanie takie jak 0,1 * 1 nie daje czystego wyniku, ale 0,10000cos tam cos tam.
Czy macie na to jakis sposob?