Hallo,
ich programmiere grad TankWar und habe ine Problem mit der Flugbahnberechnung! Das ganze basiert teilweise auf Quaxlis Tutorial für die Spieleprogrammierung. Hier die Klasse für die Kugel:
und die Berechnungen...
Bei jedem Thread durchlauf wird die Position der Kugel neu bestimmt. Alles in Abhängigkeit der für den Schleifendurchlauf benötigten Zeit natürlich...
Das Problem ist, dass die Kugel nicht wirklich in einer Kurve "fliegt" sondern eher in einer horizontalen Schlangenlinie...
Das ganze basiert auf den Formeln für eine ballistische Kurve mit Luftwiderstand: Flugbahnberechnung
Ich hab mir schon die Augen aus dem Kopf gesucht bzw. alles was mir logisch vorkam ausprobiert allerdings kann ich nicht feststellen, woran es jetzt liegt...
Ich hoffe einer von euch Klugen köpfen weiss weiter oder hat ein Auge für sowas!
Gruß manuche
ich programmiere grad TankWar und habe ine Problem mit der Flugbahnberechnung! Das ganze basiert teilweise auf Quaxlis Tutorial für die Spieleprogrammierung. Hier die Klasse für die Kugel:
Code:
import java.awt.Color;
import java.awt.Graphics;
import java.awt.geom.Rectangle2D;
import meta.Evaluation;
public class Canonball extends Rectangle2D.Double implements Movable, Drawable{
int size;
double angle;
double weight;
double cW;
GamePanel gamePanel;
protected double dx;
protected double dy;
public Canonball(double x, double y, int size, int angle, double speed, double weight, double cW, GamePanel gamePanel) {
this.x = x;
this.y = y;
this.angle = angle;
this.weight = weight;
this.cW = cW;
this.computeStartSpeedX (angle, speed);
this.computeStartSpeedY (angle, speed);
this.size = size;
this.gamePanel = gamePanel;
}
private void computeStartSpeedX (int angle, double speed){
this.setHorizontalSpeed (speed * Math.cos (angle));
}
private void computeStartSpeedY (int angle, double speed){
this.setVerticalSpeed (speed * Math.sin (angle));
}
public void doLogic (long delta){
double friction = Evaluation.computeFriction (cW, size, dx, dy);
angle = Math.atan (dy / dx);
this.setHorizontalSpeed (Evaluation.computeSpeedX (dx, angle, friction, weight, delta));
this.setVerticalSpeed (Evaluation.computeSpeedY (dy, angle, friction, weight, delta));
}
public void move (long delta){
if (dx != 0){
x += dx * (delta / 1e9);
}
if (dy != 0){
y += dy * (delta / 1e9);
}
}
public void drawObjects (Graphics g){
g.setColor (Color.RED.darker ());
g.fillOval (((int) x) - 1, ((int) y) - 1, size / 10, size / 10);
}
public void setVerticalSpeed (double d){
dy = -d;
}
public double getVerticalSpeed (){
return dy;
}
public void setHorizontalSpeed (double d){
dx = d;
}
public double getHorizontalSpeed (){
return dx;
}
}
und die Berechnungen...
Code:
public static double computeFriction (double cW, double area, double vX, double vY){
return (0.5 * PLUFT * cW * area * ((vX * vX) + (vY * vY)) / 10000);
}
public static double computeSpeedX (double vX, double angle, double friction, double weight, double delta){
return (vX + (-Math.cos (angle) * friction / weight) * (delta / 1e9));
}
public static double computeSpeedY (double vY, double angle, double friction, double weight, double delta){
return (vY + (-G - Math.sin (angle) * friction / weight) * (delta / 1e9));
}
Bei jedem Thread durchlauf wird die Position der Kugel neu bestimmt. Alles in Abhängigkeit der für den Schleifendurchlauf benötigten Zeit natürlich...
Das Problem ist, dass die Kugel nicht wirklich in einer Kurve "fliegt" sondern eher in einer horizontalen Schlangenlinie...
Das ganze basiert auf den Formeln für eine ballistische Kurve mit Luftwiderstand: Flugbahnberechnung
Ich hab mir schon die Augen aus dem Kopf gesucht bzw. alles was mir logisch vorkam ausprobiert allerdings kann ich nicht feststellen, woran es jetzt liegt...
Ich hoffe einer von euch Klugen köpfen weiss weiter oder hat ein Auge für sowas!
Gruß manuche