Hallo Leute,
ich bin grad dabei ein Programm zu schreiben, welches die Gravitation simulieren soll. Bin auch schon recht weit gekommen, aber ich hab noch so meine Probleme:
1. Schaltet man in meinem Programm die Reibung aus, so springt die Kugel immer höher obwohl es eigentlich immer auf die gleiche "Maximalhöhe" kommen soll.
2. Prallt die Kugel and der rechten Seite ab, scheint er schneller zu werden.
3. Die horizontale Reibung wirkt bei niedrigen Geschwindikeiten zu abruppt und die Kugel hat dann plötzlich keine Horizontalbewegung mehr.
Na ja das sind so die gröbsten Bugs die ich gefunden habe, aber ich finde die Fehler nicht.
Hier mal die Unit in der ich die Kugel und die Gravitation simuliere:
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75:
| [...]
public posx,posy, r, bottom,top,left,right:integer; vert,hori, g,t:real; fri:boolean; end;
implementation
procedure ball.update; var v,h:real; begin vert:=vert + g*t; v:=vert*t*1000; posy:=trunc(posy+v); vert:=air(vert); h:=hori*t*1000; posx:=trunc(posx+h); hori:=air(hori); end;
procedure ball.collide; begin if (posy+r)>=(bottom-1) then begin vert:=-1*vert; posy:=bottom-r-1; vert:=wall(vert); end; if (posy-r)<(top+1) then begin vert:=-1*vert; posy:=top+r+1; vert:=wall(vert); end; if (posx+r)>(right-1) then begin hori:=-1*hori; posx:=right-r-1; hori:=wall(hori); end; if (posx-r)<(left+1) then begin hori:=-1*hori; posx:=left+r+1;[/list] hori:=wall(hori); end; end;
function ball.frame:trect; begin result:=bounds(posx-r,posy-r,2*r,2*r); end;
function ball.wall(value:real):real; begin if fri then result:=value*0.8 else result:=value; end;
function ball.air(value:real):real; begin if fri then result:=value*0.992 else result:=value; end;
procedure ball.follow(x,y:integer); begin posx:=x; posy:=y; end; |
Das ganze Programm gibt's hier:
Gravity
Ich hoffe ihr könnt mir ein bisschen Helfen.
Moderiert von Gausi: Code- durch Delphi-Tags ersetzt