2D-Spiel Fragen und Hilfe bei Programmierung

So, große Freude bei mir: Ich habe die Kollision zwischen 2 Bällen hinbekommen!
Wie immer ist das noch kein Bisschen optimiert, das kommt später. Mir ging es erstmal um die Übersicht.
Code:
Code:
[FONT=Consolas][SIZE=2][COLOR=#008000][FONT=Consolas][SIZE=2][COLOR=#008000][FONT=Consolas][SIZE=2][COLOR=#008000]
//Abstand ausrechnen[/SIZE][/FONT][/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][FONT=Consolas][SIZE=2][/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][COLOR=#0000ff][FONT=Consolas][SIZE=2][COLOR=#0000ff][FONT=Consolas][SIZE=2][COLOR=#0000ff]if[/SIZE][/FONT][/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][FONT=Consolas][SIZE=2]( sqrt( pow( ball2.position[0]-ball1.position[0], 2) + pow( ball2.position[1]-ball1.position[1], 2) ) <= (ball1.radius+ball2.radius) )
{
[/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][COLOR=#008000][FONT=Consolas][SIZE=2][COLOR=#008000][FONT=Consolas][SIZE=2][COLOR=#008000]//Bälle dürfen sich nicht berühren [/SIZE][/FONT][/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][FONT=Consolas][SIZE=2][/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][COLOR=#0000ff][FONT=Consolas][SIZE=2][COLOR=#0000ff][FONT=Consolas][SIZE=2][COLOR=#0000ff]if[/SIZE][/FONT][/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][FONT=Consolas][SIZE=2](sqrt( pow( ball2.position[0]-ball1.position[0], 2) + pow( ball2.position[1]-ball1.position[1], 2) ) < (ball1.radius+ball2.radius) )
{ 
[/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][COLOR=#0000ff][FONT=Consolas][SIZE=2][COLOR=#0000ff][FONT=Consolas][SIZE=2][COLOR=#0000ff]do[/SIZE][/FONT][/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][FONT=Consolas][SIZE=2]{
[/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][COLOR=#0000ff][FONT=Consolas][SIZE=2][COLOR=#0000ff][FONT=Consolas][SIZE=2][COLOR=#0000ff]for[/SIZE][/FONT][/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][FONT=Consolas][SIZE=2]([/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][COLOR=#0000ff][FONT=Consolas][SIZE=2][COLOR=#0000ff][FONT=Consolas][SIZE=2][COLOR=#0000ff]int[/SIZE][/FONT][/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][FONT=Consolas][SIZE=2] c=0;c<=1;c++)
{
ball1.position[c] = ball1.position[c] - 0.01 * ball1.geschwindigkeit[c];
ball2.position[c] = ball2.position[c] - 0.01 * ball2.geschwindigkeit[c];
}
}
[/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][COLOR=#0000ff][FONT=Consolas][SIZE=2][COLOR=#0000ff][FONT=Consolas][SIZE=2][COLOR=#0000ff]while[/SIZE][/FONT][/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][FONT=Consolas][SIZE=2](sqrt( pow( ball2.position[0]-ball1.position[0], 2) + pow( ball2.position[1]-ball1.position[1], 2) ) < (ball1.radius+ball2.radius) );
}
[/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][COLOR=#008000][FONT=Consolas][SIZE=2][COLOR=#008000][FONT=Consolas][SIZE=2][COLOR=#008000]//Linie zwischen den Mittelpunkten (Zentralvektor)[/SIZE][/FONT][/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][FONT=Consolas][SIZE=2][/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][COLOR=#0000ff][FONT=Consolas][SIZE=2][COLOR=#0000ff][FONT=Consolas][SIZE=2][COLOR=#0000ff]float[/SIZE][/FONT][/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][FONT=Consolas][SIZE=2] vlinie[2];
vlinie[0] = ball2.position[0] - ball1.position[1];
vlinie[1] = ball2.position[1] - ball1.position[1];
[/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][COLOR=#008000][FONT=Consolas][SIZE=2][COLOR=#008000][FONT=Consolas][SIZE=2][COLOR=#008000]//Linie auf Einheitsvektor nominieren: vlinie / bertag(vlinie)[/SIZE][/FONT][/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][FONT=Consolas][SIZE=2][/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][COLOR=#0000ff][FONT=Consolas][SIZE=2][COLOR=#0000ff][FONT=Consolas][SIZE=2][COLOR=#0000ff]float[/SIZE][/FONT][/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][FONT=Consolas][SIZE=2] vliniee[2];
vliniee[0] = vlinie[0]/sqrt(vlinie[0] * vlinie[0] + vlinie[1] * vlinie[1]);
vliniee[1] = vlinie[1]/sqrt(vlinie[0] * vlinie[0] + vlinie[1] * vlinie[1]);

[/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][COLOR=#008000][FONT=Consolas][SIZE=2][COLOR=#008000][FONT=Consolas][SIZE=2][COLOR=#008000]//Tangentialvektor errechnen: vt = (-vliniee(y), vliniee(x) )[/SIZE][/FONT][/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][FONT=Consolas][SIZE=2][/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][COLOR=#0000ff][FONT=Consolas][SIZE=2][COLOR=#0000ff][FONT=Consolas][SIZE=2][COLOR=#0000ff]float[/SIZE][/FONT][/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][FONT=Consolas][SIZE=2] vtan[2];
vtan[0] = -vliniee[1];
vtan[1] = vliniee[0];
[/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][COLOR=#008000][FONT=Consolas][SIZE=2][COLOR=#008000][FONT=Consolas][SIZE=2][COLOR=#008000]//Geschwindigkeitsvektoren zerlegen (tangential, normal Richtung), es kommen Skalare raus[/SIZE][/FONT][/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][FONT=Consolas][SIZE=2][/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][COLOR=#0000ff][FONT=Consolas][SIZE=2][COLOR=#0000ff][FONT=Consolas][SIZE=2][COLOR=#0000ff]float[/SIZE][/FONT][/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][FONT=Consolas][SIZE=2] gnormb1, gnormb2, gtanb1, gtanb2;
gnormb1 = (vliniee[0] * ball1.geschwindigkeit[0]) + (vliniee[1] * ball1.geschwindigkeit[1]); 
gnormb2 = (vliniee[0] * ball2.geschwindigkeit[0]) + (vliniee[1] * ball2.geschwindigkeit[1]);
gtanb1 = (vtan[0] * ball1.geschwindigkeit[0]) + (vtan[1] + ball1.geschwindigkeit[1]);
gtanb2 = (vtan[0] * ball2.geschwindigkeit[0]) + (vtan[1] + ball2.geschwindigkeit[1]);
[/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][COLOR=#008000][FONT=Consolas][SIZE=2][COLOR=#008000][FONT=Consolas][SIZE=2][COLOR=#008000]//Neue Geschwindigkeit errechnen[/SIZE][/FONT][/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][FONT=Consolas][SIZE=2][/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][COLOR=#008000][FONT=Consolas][SIZE=2][COLOR=#008000][FONT=Consolas][SIZE=2][COLOR=#008000]//tangentiale Geschwindigkeiten verändern sich nicht![/SIZE][/FONT][/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][FONT=Consolas][SIZE=2][/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][COLOR=#008000][FONT=Consolas][SIZE=2][COLOR=#008000][FONT=Consolas][SIZE=2][COLOR=#008000]//Geschwindigkeitsvektoren nach Kollision[/SIZE][/FONT][/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][FONT=Consolas][SIZE=2][/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][COLOR=#008000][FONT=Consolas][SIZE=2][COLOR=#008000][FONT=Consolas][SIZE=2][COLOR=#008000]//Masse ist Radius![/SIZE][/FONT][/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][FONT=Consolas][SIZE=2][/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][COLOR=#0000ff][FONT=Consolas][SIZE=2][COLOR=#0000ff][FONT=Consolas][SIZE=2][COLOR=#0000ff]float[/SIZE][/FONT][/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][FONT=Consolas][SIZE=2] gnormb1n, gnormb2n;
gnormb1n = ( (gnormb1*(ball1.radius - ball2.radius) + ((2*ball2.radius) * gnormb2))) / (ball1.radius + ball2.radius);
gnormb2n = ( (gnormb2*(ball2.radius - ball1.radius) + ((2*ball1.radius) * gnormb1))) / (ball1.radius + ball2.radius);
[/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][COLOR=#008000][FONT=Consolas][SIZE=2][COLOR=#008000][FONT=Consolas][SIZE=2][COLOR=#008000]//Einheitsvektoren zu normalvektoren konvertieren (normal richtung)[/SIZE][/FONT][/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][FONT=Consolas][SIZE=2][/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][COLOR=#0000ff][FONT=Consolas][SIZE=2][COLOR=#0000ff][FONT=Consolas][SIZE=2][COLOR=#0000ff]float[/SIZE][/FONT][/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][FONT=Consolas][SIZE=2] b1nn[2], b2nn[2], b1tn[2], b2tn[2];
b1nn[0] = gnormb1n * vliniee[0];
b1nn[1] = gnormb1n * vliniee[1];
b2nn[0] = gnormb2n * vliniee[0];
b2nn[1] = gnormb2n * vliniee[1];
b1tn[0] = gnormb1n * vtan[0];
b1tn[1] = gnormb1n * vtan[1];
b2tn[0] = gnormb2n * vtan[0];
b2tn[1] = gnormb2n * vtan[1];
[/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][COLOR=#008000][FONT=Consolas][SIZE=2][COLOR=#008000][FONT=Consolas][SIZE=2][COLOR=#008000]//Finale Geschwindigkeiten ausrechnen[/SIZE][/FONT][/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][FONT=Consolas][SIZE=2]ball1.geschwindigkeit[0] = b1nn[0] + b1tn[0];
ball1.geschwindigkeit[1] = b1nn[1] + b1tn[1];
ball2.geschwindigkeit[0] = b2nn[0] + b2tn[0];
ball2.geschwindigkeit[1] = b2nn[1] + b2tn[1];
} 
}
[/SIZE][/FONT][/SIZE][/FONT]

Im Anhang ist noch das gesamte Projekt samt vorkompiliertem Beispiel :daumen:.

Meine jetzigen Probleme:

1) Die Bälle verlieren Geschwindigkeit, sie werden immer langsamer:what:
2) Wenn ich unterschiedliche Radien nehme, dann gehen die bei der ersten Berührung ins unendliche:hail:.

Ich hab das Gefühl, dass die Probleme miteineander zusammenhängen. Könnt ihr den Fehler finden?
 
Das Kollisions Problem ist jetzt gelöst, alles bewegt sich ohne Reibung reell.:daumen:
Jetzt gehts daran, eine variable Anzahl an Bälen zu implementieren.
 
Kann mir einer bei der Übergabe von einer variablen structur als Pointer an eine Funktion helfen?
Im Anhang der ganze Code, es geht um die Funktion void autoball().
Der Funktion würde ich gerne den aktuell erstellten Ball zum Bearbeiten geben.

Datei im Anhang.

Hier poste ich den Code auch mal:
Code:
[FONT=Consolas][SIZE=2][COLOR=#008000][FONT=Consolas][SIZE=2][COLOR=#008000][FONT=Consolas][SIZE=2][COLOR=#008000]
//Includes
//[/SIZE][/FONT][/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][COLOR=#0000ff][FONT=Consolas][SIZE=2][COLOR=#0000ff][FONT=Consolas][SIZE=2][COLOR=#0000ff]#include[/SIZE][/FONT][/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][FONT=Consolas][SIZE=2] [/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][COLOR=#a31515][FONT=Consolas][SIZE=2][COLOR=#a31515][FONT=Consolas][SIZE=2][COLOR=#a31515]"stdafx.h"[/SIZE][/FONT][/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][COLOR=#0000ff][FONT=Consolas][SIZE=2][COLOR=#0000ff][FONT=Consolas][SIZE=2][COLOR=#0000ff]#include[/SIZE][/FONT][/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][FONT=Consolas][SIZE=2] [/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][COLOR=#a31515][FONT=Consolas][SIZE=2][COLOR=#a31515][FONT=Consolas][SIZE=2][COLOR=#a31515]<stdlib.h>[/SIZE][/FONT][/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][COLOR=#0000ff][FONT=Consolas][SIZE=2][COLOR=#0000ff][FONT=Consolas][SIZE=2][COLOR=#0000ff]#include[/SIZE][/FONT][/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][FONT=Consolas][SIZE=2] [/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][COLOR=#a31515][FONT=Consolas][SIZE=2][COLOR=#a31515][FONT=Consolas][SIZE=2][COLOR=#a31515]<ctime>[/SIZE][/FONT][/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][COLOR=#0000ff][FONT=Consolas][SIZE=2][COLOR=#0000ff][FONT=Consolas][SIZE=2][COLOR=#0000ff]#include[/SIZE][/FONT][/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][FONT=Consolas][SIZE=2] [/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][COLOR=#a31515][FONT=Consolas][SIZE=2][COLOR=#a31515][FONT=Consolas][SIZE=2][COLOR=#a31515]<vector>[/SIZE][/FONT][/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][COLOR=#0000ff][FONT=Consolas][SIZE=2][COLOR=#0000ff][FONT=Consolas][SIZE=2][COLOR=#0000ff]#include[/SIZE][/FONT][/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][FONT=Consolas][SIZE=2] [/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][COLOR=#a31515][FONT=Consolas][SIZE=2][COLOR=#a31515][FONT=Consolas][SIZE=2][COLOR=#a31515]<math.h>[/SIZE][/FONT][/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][FONT=Consolas][SIZE=2][/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][COLOR=#0000ff][FONT=Consolas][SIZE=2][COLOR=#0000ff][FONT=Consolas][SIZE=2][COLOR=#0000ff]using[/SIZE][/FONT][/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][FONT=Consolas][SIZE=2] [/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][COLOR=#0000ff][FONT=Consolas][SIZE=2][COLOR=#0000ff][FONT=Consolas][SIZE=2][COLOR=#0000ff]namespace[/SIZE][/FONT][/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][FONT=Consolas][SIZE=2] std;
[/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][COLOR=#008000][FONT=Consolas][SIZE=2][COLOR=#008000][FONT=Consolas][SIZE=2][COLOR=#008000]//Struktur für Bälle[/SIZE][/FONT][/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][COLOR=#0000ff][FONT=Consolas][SIZE=2][COLOR=#0000ff][FONT=Consolas][SIZE=2][COLOR=#0000ff]struct[/SIZE][/FONT][/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][FONT=Consolas][SIZE=2] ball
{
[/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][COLOR=#0000ff][FONT=Consolas][SIZE=2][COLOR=#0000ff][FONT=Consolas][SIZE=2][COLOR=#0000ff]float[/SIZE][/FONT][/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][FONT=Consolas][SIZE=2] position[2];
[/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][COLOR=#0000ff][FONT=Consolas][SIZE=2][COLOR=#0000ff][FONT=Consolas][SIZE=2][COLOR=#0000ff]float[/SIZE][/FONT][/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][FONT=Consolas][SIZE=2] geschwindigkeit[2]; 
[/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][COLOR=#0000ff][FONT=Consolas][SIZE=2][COLOR=#0000ff][FONT=Consolas][SIZE=2][COLOR=#0000ff]float[/SIZE][/FONT][/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][FONT=Consolas][SIZE=2] radius;
};
[/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][COLOR=#008000][FONT=Consolas][SIZE=2][COLOR=#008000][FONT=Consolas][SIZE=2][COLOR=#008000]//Container erstellen[/SIZE][/FONT][/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][FONT=Consolas][SIZE=2]vector<ball> ballliste;
[/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][COLOR=#008000][FONT=Consolas][SIZE=2][COLOR=#008000][FONT=Consolas][SIZE=2][COLOR=#008000]//Bälle dürfen sich beim automatischen einfügen nicht überlappen[/SIZE][/FONT][/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][COLOR=#0000ff][FONT=Consolas][SIZE=2][COLOR=#0000ff][FONT=Consolas][SIZE=2][COLOR=#0000ff]void[/SIZE][/FONT][/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][FONT=Consolas][SIZE=2] autoball()
{

}
[/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][COLOR=#008000][FONT=Consolas][SIZE=2][COLOR=#008000][FONT=Consolas][SIZE=2][COLOR=#008000]//Funktion um einen Ball hinzuzufügen[/SIZE][/FONT][/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][COLOR=#0000ff][FONT=Consolas][SIZE=2][COLOR=#0000ff][FONT=Consolas][SIZE=2][COLOR=#0000ff]void[/SIZE][/FONT][/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][FONT=Consolas][SIZE=2] addball([/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][COLOR=#0000ff][FONT=Consolas][SIZE=2][COLOR=#0000ff][FONT=Consolas][SIZE=2][COLOR=#0000ff]int[/SIZE][/FONT][/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][FONT=Consolas][SIZE=2] positionx, [/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][COLOR=#0000ff][FONT=Consolas][SIZE=2][COLOR=#0000ff][FONT=Consolas][SIZE=2][COLOR=#0000ff]int[/SIZE][/FONT][/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][FONT=Consolas][SIZE=2] positiony, [/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][COLOR=#0000ff][FONT=Consolas][SIZE=2][COLOR=#0000ff][FONT=Consolas][SIZE=2][COLOR=#0000ff]int[/SIZE][/FONT][/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][FONT=Consolas][SIZE=2] geschwindigkeitx, [/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][COLOR=#0000ff][FONT=Consolas][SIZE=2][COLOR=#0000ff][FONT=Consolas][SIZE=2][COLOR=#0000ff]int[/SIZE][/FONT][/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][FONT=Consolas][SIZE=2] geschwindigkeity, [/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][COLOR=#0000ff][FONT=Consolas][SIZE=2][COLOR=#0000ff][FONT=Consolas][SIZE=2][COLOR=#0000ff]int[/SIZE][/FONT][/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][FONT=Consolas][SIZE=2] radius)
{
[/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][COLOR=#008000][FONT=Consolas][SIZE=2][COLOR=#008000][FONT=Consolas][SIZE=2][COLOR=#008000]//mit nullen initialisierten Ball der Liste hinzufügen[/SIZE][/FONT][/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][FONT=Consolas][SIZE=2]ballliste.push_back(ball());
[/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][COLOR=#008000][FONT=Consolas][SIZE=2][COLOR=#008000][FONT=Consolas][SIZE=2][COLOR=#008000]// aktuelles (Letztes) Element bekannt machen[/SIZE][/FONT][/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][FONT=Consolas][SIZE=2][/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][COLOR=#0000ff][FONT=Consolas][SIZE=2][COLOR=#0000ff][FONT=Consolas][SIZE=2][COLOR=#0000ff]unsigned[/SIZE][/FONT][/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][FONT=Consolas][SIZE=2] [/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][COLOR=#0000ff][FONT=Consolas][SIZE=2][COLOR=#0000ff][FONT=Consolas][SIZE=2][COLOR=#0000ff]short[/SIZE][/FONT][/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][FONT=Consolas][SIZE=2] [/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][COLOR=#0000ff][FONT=Consolas][SIZE=2][COLOR=#0000ff][FONT=Consolas][SIZE=2][COLOR=#0000ff]int[/SIZE][/FONT][/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][FONT=Consolas][SIZE=2] zahl = ballliste.size() - 1;
[/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][COLOR=#008000][FONT=Consolas][SIZE=2][COLOR=#008000][FONT=Consolas][SIZE=2][COLOR=#008000]//Attribute vom gerade hinzugefügten Ball anpassen[/SIZE][/FONT][/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][FONT=Consolas][SIZE=2][/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][COLOR=#0000ff][FONT=Consolas][SIZE=2][COLOR=#0000ff][FONT=Consolas][SIZE=2][COLOR=#0000ff]if[/SIZE][/FONT][/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][FONT=Consolas][SIZE=2](positionx == 0 && positiony == 0 && geschwindigkeitx == 0 && geschwindigkeity == 0 && radius == 0)
{
autoball();
}
[/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][COLOR=#0000ff][FONT=Consolas][SIZE=2][COLOR=#0000ff][FONT=Consolas][SIZE=2][COLOR=#0000ff]else[/SIZE][/FONT][/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][FONT=Consolas][SIZE=2]{ 
ballliste[zahl].position[0] = positionx;
ballliste[zahl].position[1] = positiony;
ballliste[zahl].geschwindigkeit[0] = geschwindigkeitx;
ballliste[zahl].geschwindigkeit[1] = geschwindigkeity;
ballliste[zahl].radius = radius;
}
}
[/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][COLOR=#008000][FONT=Consolas][SIZE=2][COLOR=#008000][FONT=Consolas][SIZE=2][COLOR=#008000]//funktion Ball entfernen[/SIZE][/FONT][/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][COLOR=#0000ff][FONT=Consolas][SIZE=2][COLOR=#0000ff][FONT=Consolas][SIZE=2][COLOR=#0000ff]void[/SIZE][/FONT][/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][FONT=Consolas][SIZE=2] deleteball()
{
[/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][COLOR=#0000ff][FONT=Consolas][SIZE=2][COLOR=#0000ff][FONT=Consolas][SIZE=2][COLOR=#0000ff]unsigned[/SIZE][/FONT][/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][FONT=Consolas][SIZE=2] [/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][COLOR=#0000ff][FONT=Consolas][SIZE=2][COLOR=#0000ff][FONT=Consolas][SIZE=2][COLOR=#0000ff]short[/SIZE][/FONT][/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][FONT=Consolas][SIZE=2] [/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][COLOR=#0000ff][FONT=Consolas][SIZE=2][COLOR=#0000ff][FONT=Consolas][SIZE=2][COLOR=#0000ff]int[/SIZE][/FONT][/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][FONT=Consolas][SIZE=2] zufallszahl = ballliste.size(); 
[/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][COLOR=#0000ff][FONT=Consolas][SIZE=2][COLOR=#0000ff][FONT=Consolas][SIZE=2][COLOR=#0000ff]if[/SIZE][/FONT][/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][FONT=Consolas][SIZE=2](zufallszahl > 0)
{
zufallszahl = rand() % zufallszahl; 
ballliste.erase(ballliste.begin() + zufallszahl);
}
}
[/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][COLOR=#008000][FONT=Consolas][SIZE=2][COLOR=#008000][FONT=Consolas][SIZE=2][COLOR=#008000]//Zufallsgenerator initialisieren[/SIZE][/FONT][/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][COLOR=#0000ff][FONT=Consolas][SIZE=2][COLOR=#0000ff][FONT=Consolas][SIZE=2][COLOR=#0000ff]void[/SIZE][/FONT][/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][FONT=Consolas][SIZE=2] zufallinit()
{
srand(time(NULL));
}
[/SIZE][/FONT][/SIZE][/FONT]
 
Du könntest es so machen:
Code:
[FONT=Fixedsys]void autoball(ball& newball)
{
  newball.x = 123; // werte verändern
}
[/FONT] [FONT=Fixedsys]
void addba[/FONT][FONT=Fixedsys]ll([/FONT][FONT=System][SIZE=2][SIZE=2][FONT=Fixedsys][...])
{
  ballliste.push_back(ball());
  <...>
  autoball(ballliste.back());
}[/FONT]
[/SIZE][/SIZE][/FONT]
 
Ok, hab jetzt ein verdammt blödes Problem. Ich hab mein code in verschiedene Dateien aufgeteilt (eine .h und drei .cpp).
Ich brauch in allen die Variablen blänge und bbreite.
Wie kann ich die z.B. blänge einer Funktion übergeben, die von einer anderen Funktion aufgerufen wird, die wiederum von der main (wo die Variable liegt) aufgerufenn wird?

Kurz: Wie kann ich Variablen performant über mehrere Fun ktionen weiterreichen?:hail:

mit extern konte mich nicht anfreunden.
 
Naja, was du der Funktion nicht als Parameter mitgibst, musst du entweder per extern oder - im Falle von Klassen - über Klassenvariablen (Attribute) bereitstellen.
 
extern bedeutet nur, dass die Variable auch in einer anderen Datei definiert sein kann. Globale Variablen und Funktionen sind automatisch extern, außer du deklarierst sie anders(z.B. als static). Also wenn du in der Datei a.cpp stehen hast extern int x; und in einer zweiten Datei b.cpp int x = 0; dann liegt die tatsächliche Variable in b.cpp, aber du kannst sie ebenfalls in a.cpp verwenden.
Für dein Problem ist eine globale Variable ok, aber du solltest sie eher vermeiden, weil sie das Programm unübersichtlich machen.
 
Ok, hab jetzt ein verdammt blödes Problem. Ich hab mein code in verschiedene Dateien aufgeteilt (eine .h und drei .cpp).
Ich brauch in allen die Variablen blänge und bbreite.
Wie kann ich die z.B. blänge einer Funktion übergeben, die von einer anderen Funktion aufgerufen wird, die wiederum von der main (wo die Variable liegt) aufgerufenn wird?

Kurz: Wie kann ich Variablen performant über mehrere Fun ktionen weiterreichen?:hail:

mit extern konte mich nicht anfreunden.
Dann freunde dich lieber mit ihnen an. Macht das Leben VIEL einfacher.

Du definierst die Variable und definierst sie halt irgendwann mal später irgendwo.

new und delete solltest du auch so schnell wie möglich zu deinen Freunden zählen. Das habe ich aber schonmal gesagt.

@Mashed:
Naja, das extern bedeutet ja nur, dass die Variable noch wo anders deklariert und definiert wird. Ist ja eigentlich nur eine Hilfe für den Compiler und nicht mehr.
 
So, heute war ein verdammt erfolgreicher Tag fürmicgh: Das Ballverwaltungssystem mit "intelligenter" Platzsuchfunktion (frisst wahrscheinlich Leistung bis zum geht nicht mehr) und die beiden variablen Kolliusionssysteme sind fertig.:daumen: Ob sie laufen, kann ich noch nicht btesten, gehe aber mal davon aus.

Jetzt geht es an den Teil, von dem ich am wenigsten Ahnung hab: Das Rendering.
Muss mir unbedingt überlegen, wie die Bälle auf jedem Prozessor gleichschnell fliegen und immer in kleinen Schritten (für die Kollisionserkennung).

Braucht man eigentlich für das translate in OpenGL den Bildschirm immer wieder zu löschen?

Ps: Wer Tipps hat darf sie gerne loswerden:daumen:
 
bei mir hatte ich das so gelöst:
Code:
long    Tick = 0;                // fps timer
int        Frames = 0;                // frame counter
int        FPS = 0;                // fps
long    FrameTickCount;
erstmal als globals.
bei der initialisierung (also einmalig beim start) dann
Code:
Tick = GetTickCount();
FrameTickCount = GetTickCount();
(dazu #include <time.h> nich vergessen)
und dann pro berechnetem frame (also jedesmal wenn du nen bild malst) das hier:
Code:
    FrameTickCount = GetTickCount();
    if(1000 <= FrameTickCount - Tick) {
        Tick = FrameTickCount;                        // set timer
        FPS = Frames;                                // save fps
        Frames = 0;
        cout << FPS << " fps" << endl;
    } else {
        Frames++;
    }
die textausgabe in die konsole is natürlich ned grad performant un sollte irgendwann wenn überhaupt mittels opengl erfolgen, nur so als anmerkung. habs bei mir der einfach heit halber aber erstmal so gelöst gehabt. damits ned allzusehr behindert hab ichs auch auf ne sekündliche ausgabe beschränkt.

joa, und direkt vor diesem letzten schnipsel hab ich dann die berechnung der bewegung. bei mir ne drehung einfach nur, aber is ja nich sehr viel anders.
Code:
    float elapsedTime = GetTickCount() - FrameTickCount;
    eAngle += eRot * elapsedTime / 1000;
eAngle ist der winkel, um den e (bei mir ne erde >< ) in diesem frame gedreht werden soll - un der wird halt mit jedem frame um eRot erhöht. eRot ist quasi die angabe "wieviel grad pro sekunde".

bei deinen bällen würde ich also nen einheitsvektor angeben, der die flugrichtung angibt und eine floatzahl für die geschwindigkeit sowie einen vektor für die aktuelle position. weitere daten wären dann mindestens der radius (zwecks kollision) und vllt noch ne masse (physik). naja, jedenfalls würde ich dann eben den ball je tick um (move = ) geschwindigkeit * elapsedTime / 1000 bewegen. die geschwindigkeit würde ich einfach als vektorlänge nehmen, also den einheitsvektor für die richtung * die (momentane, grad für den frame errechnete) geschwindigkeit (was ich eben move nannte) und das zur position hinzuaddieren.
also irgendwie pseudo codish ^^ so in etwa:
Code:
float move = geschwindigkeit * elapsedTime / 1000;
vPosition += vRichtung * move;
(das kleine v soll angeben, das es nen vektor is)

und die kollision würde ich auch wieder per vektorrechung machen. also vom aktuell betrachteten ball alle anderen bälle anschauen, einen vektor zw den beiden positionen bestimmen (vPosition - vAnderePosition), dann die länge dieses vektors bestimmen (den abstand halt) und schauen, ob der abstand/die vektorlänge kleiner ist, als die beiden radi der bälle zusammen addiert. wenn dem so is, haben sie sich berührt und man sollte ne kollisionsberechnung anfangen.

da müsst ich jetz auch grübel, wies theoretisch am richtigsten wäre. tiefer drüber nachgedacht erscheint mir das garnich so einfach ^^ betrachtet man die bälle unabhängig von einander sollte es einfacher zu lösen sein, obs aber dann ordentlich und "richtig" ausschaut? ich wag es irgendwie zu bezweifeln ^^ aber mein erster ansatz in der richtung wäre, dass man den abstandsvektor, den man berechnet hat, zum einheitsvektor macht. also das man ihn als pure richtungsangabe verwenden kann. hmmmm, der vektor sollte am sinnvollsten vllt vom anderen ball zu mir gerichtet sein *grübel*, stimmt dann vPosition - vAnderePosition noch? *überleg* wenn "ich" (der aktuelle ball) bei 0,0,0 bin und der andere gerade zum vergleich herangezogene ball bei 1,1,1 - dann wäre mir grad im moment der vektor -1,-1,-1 lieber, also stimmt vPosition - vAnderePosition ^^

jetzt müsste man den winkel zwischen "meinem" bewegungsvektor und dem normalisierten abstandsvektor rausfinden, was mittels "dot product" realisierbar is. das liefert zumindest nen wert zw 1 und minus 1 und entspricht dem cosinus des winkels. hmm joa, dann müsste man halt schauen, wie man das deichselt... wenn die vektoren genau entgegengesetzt sind (180°), dann müsste man den eigenen richtungsvektor nur umkehren. und ansonsten? ^^ braucht man überhaupt den winkel? mir kommts grad so vor, als ob man einfach beide vektoren addiert wenn die in nem 90° winkel aufeinander prallen, würde nen 45° winkel resultieren, bei 180° wär das ding simpel 0 (ham sich bei der addition simpel aufgehoben - vektor + -vektor quasi). also müsste man nach dieser addition nochmals nen einheitsvektor aus dem resultierenden ergebnisziehen und fertig. gut, fast. man muss vorher checken, ob das ergebnis ned 0 is ^^ also sowas wie (pseudocode)
Code:
// ball1 und 2 sind objekte, ball1 der eigentliche und ball2 der zum vergleich herangezogene
float vAbstand = ball1.vPosition - ball2.vPosition;
vRichtung = normalize(vAbstand);
float vNewRichtung = ball1.vRichtung + vRichtung;
if(length(vNewRichtung) > 0)
    ball1.vRichtung += normalize(vNewRichtung);
else
    ball1.vRichtung = -ball1.vRichtung;

könnte vllt doch garnich so verkehrt sein *grübel* ^^ und wenn man jetz mit physik noch kommen wöllte, könnte man ja die masse volgendermaßen einbinden:
Code:
// ball1 und 2 sind objekte, ball1 der eigentliche und ball2 der zum vergleich herangezogene
float vAbstand = ball1.vPosition - ball2.vPosition;
vRichtung = normalize(vAbstand);
float vNewRichtung = ball1.vRichtung[B] * ball1.masse[/B] + vRichtung[B] * ball2.masse[/B];
if(length(vNewRichtung) > 0)
    ball1.vRichtung += normalize(vNewRichtung);
else
    ball1.vRichtung = -ball1.vRichtung;
das könnts schon gewesen sein, aufn ersten schnellen blick. hmm, wenn man jetzt eh schon unterschiedliche radi hat, könnte man ja statt masse auch die dichte speichern und die masse aus radius (=> volumen berechnen) und dichte bestimmen. kann man der struct oder klasse ja ne methode zum berechnen mitgeben, so dass man dann halt nur
Code:
loat vNewRichtung = ball1.vRichtung[B] * ball1.getMasse[/B]() + vRichtung[B] * ball2.[/B][B]getMasse[/B]();
schreibt. noch weiter verfeinert, könnte man sich auch völlig extern davon eine liste mit materialien erstellen:
Code:
struct material {
    float dichte;
    float[4] farbe;
};

material eisen;
eisen.dichte = 7874.f;
eisen.farbe = { 0.3f, 0.3f, 0.3f, 1.f}; // wobei das glaube nur bei der initialisierung ging und das ja schon durch is. einfach ma probiern ^^

material holz;
eisen.dichte = 612.f;  // irgendwie da in der drehe rum hab ich werte grad gefunden ^^
eisen.farbe = { 0.96f, 0.65f, 0.38f, 1.f};  // sollte irgend was hellbraunes sein ><

material luft;
eisen.dichte = 0,0012;
eisen.farbe = { 0.8f, 0.8f, 1.f, 0.3f};
ja, un statt beim ball die dichte zu speichern, speichert man halt das material und holt sich die dichte davon. und je nach material ham die kugeln dann ne andre farbe. man kann ja auch statt der farbe ne textur angeben oder so. is ja wumpe ^^
 
Vielen Dank für die Idee, dass mit dem Fps hatte ich mir in der Schule auch so überlegt, schön dass es so üblich ist.

Mit der Kollision habe ich schon alles realisiert (Wenn du willst, kann ich dir den Code geben).

Das mit verschiedenen Materialien kann ich im übernächsten Meilenstein beim Spiel einbauen.

Ansonsten Ost mir grad noch eingefallen, dass wenn der Vector kein Element hat (was bei jedem Programmstart so ist) Meine ganzen Kollisions und Anzeigfunkrionen abstürzen werden.

Muss ich nachher noch ne if einbauen (Weiß jemand, wie man viel Code auf einmal einrücken kann?).

Jetzt wir aber erstmal das schöne Wetter genossen!
 
Ansonsten Ost mir grad noch eingefallen, dass wenn der Vector kein Element hat (was bei jedem Programmstart so ist) Meine ganzen Kollisions und Anzeigfunkrionen abstürzen werden.

Oder einfach immer Standardwerte sicherstellen ....

Muss ich nachher noch ne if einbauen (Weiß jemand, wie man viel Code auf einmal einrücken kann?).

Visual Studio hat dafür extra ne Schaltfläche (bei mir oben in den Toolleisten), sieht so nen bisschen aus, wie das Dateisymbol für ne txt-Datei^^

Jetzt wir aber erstmal das schöne Wetter genossen!

bei mir regnets wie aus strömen momentan :ugly:
 
Kann mir einer sagen, wie ich am Besten das anzeigen der Bälle realisiere?
Ich hab grad keine ahnung, woher OpenGL wissen soll, welches Objekt ich mit translate meine (Ich glaub, der zeichent alles neu, was mir ja nichts bringt).
Gibt es irgendeine Möglichkeit, einigermaßen performant -sagen wir- 10 Kreise zu rendern?
Ich hab mir mal das mit displaylisten angeschaut, nur wie mache ich das mit den verschiedenen Radien?

Ich hab bis jett folgendes:

Code:
[FONT=Consolas][SIZE=2][COLOR=#0000ff][FONT=Consolas][SIZE=2][COLOR=#0000ff][FONT=Consolas][SIZE=2][COLOR=#0000ff]
for[/SIZE][/FONT][/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][FONT=Consolas][SIZE=2]([/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][COLOR=#0000ff][FONT=Consolas][SIZE=2][COLOR=#0000ff][FONT=Consolas][SIZE=2][COLOR=#0000ff]unsigned[/SIZE][/FONT][/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][FONT=Consolas][SIZE=2] [/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][COLOR=#0000ff][FONT=Consolas][SIZE=2][COLOR=#0000ff][FONT=Consolas][SIZE=2][COLOR=#0000ff]short[/SIZE][/FONT][/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][FONT=Consolas][SIZE=2] [/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][COLOR=#0000ff][FONT=Consolas][SIZE=2][COLOR=#0000ff][FONT=Consolas][SIZE=2][COLOR=#0000ff]int[/SIZE][/FONT][/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][FONT=Consolas][SIZE=2] g=0; g<liste.size(); g++)
{
[/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][COLOR=#008000][FONT=Consolas][SIZE=2][COLOR=#008000][FONT=Consolas][SIZE=2][COLOR=#008000]//Schauen, ob Ball schon gezeichnet ist[/SIZE][/FONT][/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][FONT=Consolas][SIZE=2][/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][COLOR=#0000ff][FONT=Consolas][SIZE=2][COLOR=#0000ff][FONT=Consolas][SIZE=2][COLOR=#0000ff]if[/SIZE][/FONT][/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][FONT=Consolas][SIZE=2](liste[g].gezeichnet == [/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][COLOR=#0000ff][FONT=Consolas][SIZE=2][COLOR=#0000ff][FONT=Consolas][SIZE=2][COLOR=#0000ff]false[/SIZE][/FONT][/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][FONT=Consolas][SIZE=2])
{
glBegin(GL_LINE_LOOP);
glColor3f(liste[g].farbe[0], liste[g].farbe[1], liste[g].farbe[2]);

[/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][COLOR=#008000][FONT=Consolas][SIZE=2][COLOR=#008000][FONT=Consolas][SIZE=2][COLOR=#008000]//Kreispunkte für Linie berechnen[/SIZE][/FONT][/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][FONT=Consolas][SIZE=2][/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][COLOR=#0000ff][FONT=Consolas][SIZE=2][COLOR=#0000ff][FONT=Consolas][SIZE=2][COLOR=#0000ff]for[/SIZE][/FONT][/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][FONT=Consolas][SIZE=2]([/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][COLOR=#0000ff][FONT=Consolas][SIZE=2][COLOR=#0000ff][FONT=Consolas][SIZE=2][COLOR=#0000ff]unsigned[/SIZE][/FONT][/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][FONT=Consolas][SIZE=2] [/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][COLOR=#0000ff][FONT=Consolas][SIZE=2][COLOR=#0000ff][FONT=Consolas][SIZE=2][COLOR=#0000ff]short[/SIZE][/FONT][/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][FONT=Consolas][SIZE=2] [/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][COLOR=#0000ff][FONT=Consolas][SIZE=2][COLOR=#0000ff][FONT=Consolas][SIZE=2][COLOR=#0000ff]int[/SIZE][/FONT][/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][FONT=Consolas][SIZE=2] h=0; h<=360; h++)
{ 
glVertex2f( (liste[g].position[0] + (liste[g].radius * cos(h*halbkreis))), (liste[g].position[1] + (liste[g].radius * sin(h*halbkreis))) );
}
}

[/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][COLOR=#008000][FONT=Consolas][SIZE=2][COLOR=#008000][FONT=Consolas][SIZE=2][COLOR=#008000]//Bereits gezeichnete Bälle verschieben, spart extrem Ressourcen[/SIZE][/FONT][/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][FONT=Consolas][SIZE=2][/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][COLOR=#008000][FONT=Consolas][SIZE=2][COLOR=#008000][FONT=Consolas][SIZE=2][COLOR=#008000]//Bildschirm bereinigen[/SIZE][/FONT][/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][FONT=Consolas][SIZE=2]glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glLoadIdentity();
[/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][COLOR=#008000][FONT=Consolas][SIZE=2][COLOR=#008000][FONT=Consolas][SIZE=2][COLOR=#008000]//Bälle verschieben [/SIZE][/FONT][/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][FONT=Consolas][SIZE=2]}
[/SIZE][/FONT][/SIZE][/FONT]

Bin grad vollkommen ratlos:wow:
 
ah nimmst quasi ogl1.0 ^^ weil bei aktuellem ogl is das alles ja veraltet und komplett rausgeschmissen worden (glBegin/End usw). willst du eigentlich nen 3d ball oder nur ne flache scheibe? weil die scheibe ließe sich ja ziemlich simpel via triangle-strip lösen. zuerst den punkt in der mitte angeben und dann der reihe nach die punkte, die den umriss bilden - daraus baut er dann selber das teil. oder wars triangle-fan? damn, diese basics ^^ irgendwas gabs da jedenfalls ^^

und rein theoretisch... langt auch ein einziges objekt. also eine global definierte displaylist. sprich beim initialisieren erstellst du einmalig die displaylist für den kreis und wenn du bälle malst, scalierst du dir die dann zurecht. nachteil vom scale is, das er die normalen auch mitskaliert (sofern vorhanden). aber solange du ned mit zum bsp licht arbeitest, is das eh latte ^^ gab aber auch irgend sonen glEnable() befehl, das er die beim skalieren nich mitnimmt.

also jedenfalls grob so stell ichs mir vor:
Code:
GLuint        _displayListId;    // display list
...

void init(void) {
...
_displayListId = glGenLists(1);
glNewList(_displayListId, GL_COMPILE);
    DrawMichNenBall();   // ^^ - auch wieder mit glBegin und end bla (glEnd() haste in deinem code übrigens vergessen :P )
glEndList();
...
}

void DrawScene(void) {
...
// berechne alle bälle neu
for(alle bälle) {
    for(alle anderen bälle) {
        bla blubb
    }
}
...
// zeichne alle bälle
for(alle bälle) {
    glPushMatrix();
        glTranslatef(ballposition);
        glScalef(aktuellerBall.radius, aktuellerBall.radius, 0.0f);
        glColor3f(ballfarbe);  // oder 4f mit alpha kanal (blending aktivieren nich vergessen :P ), wie dus halt brauchst ^^
        glCallList(_displayListId);
    glPopMatrix();
}
...
}
dat sollte es schon gewesen sein, wenn mir jetz keine allzugroßen fehler unterlaufen sin >< naja, probiers mal aus. so der champ bin ich da jetz auch nich ><

edit: es is übrigens der GL_TRIANGLE_FAN den ich meinte ^^
 
So, mir ist bei der Fehlersuche per Schriftanzeige bei einem Funktionsaufruf in der Konsole aufgefallen, dass folgende Zeile alleine (das if) ca. 3 sek. benötigt, was unzumutbar ist:

Code:
[FONT=Consolas][SIZE=2][COLOR=#0000ff][FONT=Consolas][SIZE=2][COLOR=#0000ff]
[SIZE=2][FONT=Consolas][COLOR=#0000ff]if[/FONT][/SIZE][/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][FONT=Consolas][SIZE=2](positionx == 0 && positiony == 0 && geschwindigkeitx == 0 && geschwindigkeity == 0 && radius == 0 && frot == 0 && fgrün == 0 && fblau == 0)[/SIZE][/FONT]
[SIZE=2][FONT=Consolas]{[/FONT][/SIZE]
[SIZE=2][FONT=Consolas]autoball(ballliste.back());[/FONT][/SIZE]
[SIZE=2][FONT=Consolas]cout << [/FONT][/SIZE][/SIZE][/FONT][FONT=Consolas][SIZE=2][COLOR=#a31515][FONT=Consolas][SIZE=2][COLOR=#a31515][FONT=Consolas][SIZE=2][COLOR=#a31515]"autoball"[/SIZE][/FONT][/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][FONT=Consolas][SIZE=2] << endl;[/SIZE][/FONT]
[SIZE=2][FONT=Consolas]}[/FONT][/SIZE]
[/SIZE][/FONT]

Wie kann ich das performanter machen? Eigentlich würde ich die Funktion, in der die ganzen Parameter stehen, gerne mit (0) oder komplett leer aufrufen, doch wie handle ich das?:hail:

Edit: Die Zeit brauchte nicht die if, sondern die Funktion. die funktioniert auch nicht richtig.
Gibts trotzdem einen weg, wie ich eine Funktion mit Parametern ohne aufrufen kann?
 
Zuletzt bearbeitet:
Default Parameter sind dein Freund.

Unter C/C++ definierst du das indem du in die Funktionsdefinition hinter den Parameter ein = setzt und dann halt den DefaultParameterwert.
 
So, hab jetzt schon erste Fehler gefunden, z.B. hatte ich in den Bedingungen einer for-Schleife || anstatt && verwendet und mich gewundert warum die nicht darauf reagiert:devil:.

Bin das Programm mal mit Haltepunkten durchgegangen, da ist mir aufgefallen, dass die Variable der folgenden Zeile immer mit extrem hohen werten initialisiert wird und die Schleife am Kopf hängen bleibt:

Code:
[FONT=Consolas][SIZE=2][COLOR=#0000ff][FONT=Consolas][SIZE=2][COLOR=#0000ff][FONT=Consolas][SIZE=2][COLOR=#0000ff]
for[/SIZE][/FONT][/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][FONT=Consolas][SIZE=2]([/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][COLOR=#0000ff][FONT=Consolas][SIZE=2][COLOR=#0000ff][FONT=Consolas][SIZE=2][COLOR=#0000ff]unsigned[/SIZE][/FONT][/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][FONT=Consolas][SIZE=2] [/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][COLOR=#0000ff][FONT=Consolas][SIZE=2][COLOR=#0000ff][FONT=Consolas][SIZE=2][COLOR=#0000ff]short[/SIZE][/FONT][/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][FONT=Consolas][SIZE=2] [/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][COLOR=#0000ff][FONT=Consolas][SIZE=2][COLOR=#0000ff][FONT=Consolas][SIZE=2][COLOR=#0000ff]int[/SIZE][/FONT][/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][FONT=Consolas][SIZE=2] stelle = 0; stelle < (ballliste.size() - 2); stelle++)
[/SIZE][/FONT][/SIZE][/FONT]

wisst ihr, woran das liegt?
 
Warum nimmst du unsigned short int?

btw. mit dem "-2" musst du aufpassen, nicht das du negative Werte bekommst.

Schreib bitte mehr dazu, keine Ahnung was du gerade allgemein meinst.
 
Ich poste mal die ganze Funktion, wenn benötigt kan ich auch das ganze Projekt anhängen.

Code:
[FONT=Consolas][SIZE=2][COLOR=#0000ff][FONT=Consolas][SIZE=2][COLOR=#0000ff][FONT=Consolas][SIZE=2][COLOR=#0000ff]
bool[/SIZE][/FONT][/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][FONT=Consolas][SIZE=2] ballsauber([/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][COLOR=#0000ff][FONT=Consolas][SIZE=2][COLOR=#0000ff][FONT=Consolas][SIZE=2][COLOR=#0000ff]bool[/SIZE][/FONT][/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][FONT=Consolas][SIZE=2] &gefunden)
{
[/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][COLOR=#008000][FONT=Consolas][SIZE=2][COLOR=#008000][FONT=Consolas][SIZE=2][COLOR=#008000]//Debug[/SIZE][/FONT][/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][FONT=Consolas][SIZE=2]cout << [/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][COLOR=#a31515][FONT=Consolas][SIZE=2][COLOR=#a31515][FONT=Consolas][SIZE=2][COLOR=#a31515]"Ballsauber aufgerufen"[/SIZE][/FONT][/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][FONT=Consolas][SIZE=2] << endl;
[/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][COLOR=#008000][FONT=Consolas][SIZE=2][COLOR=#008000][FONT=Consolas][SIZE=2][COLOR=#008000]//Schauen, ob überhaupt andere Bälle vorhanden sind, sonst ist ja immer links unten Platz[/SIZE][/FONT][/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][FONT=Consolas][SIZE=2][/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][COLOR=#0000ff][FONT=Consolas][SIZE=2][COLOR=#0000ff][FONT=Consolas][SIZE=2][COLOR=#0000ff]if[/SIZE][/FONT][/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][FONT=Consolas][SIZE=2](ballliste.size() > 1)
{
[/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][COLOR=#0000ff][FONT=Consolas][SIZE=2][COLOR=#0000ff][FONT=Consolas][SIZE=2][COLOR=#0000ff]for[/SIZE][/FONT][/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][FONT=Consolas][SIZE=2]([/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][COLOR=#0000ff][FONT=Consolas][SIZE=2][COLOR=#0000ff][FONT=Consolas][SIZE=2][COLOR=#0000ff]unsigned[/SIZE][/FONT][/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][FONT=Consolas][SIZE=2] [/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][COLOR=#0000ff][FONT=Consolas][SIZE=2][COLOR=#0000ff][FONT=Consolas][SIZE=2][COLOR=#0000ff]short[/SIZE][/FONT][/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][FONT=Consolas][SIZE=2] [/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][COLOR=#0000ff][FONT=Consolas][SIZE=2][COLOR=#0000ff][FONT=Consolas][SIZE=2][COLOR=#0000ff]int[/SIZE][/FONT][/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][FONT=Consolas][SIZE=2] stelle = 0; stelle < (ballliste.size() - 2); stelle++)
{
[/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][COLOR=#0000ff][FONT=Consolas][SIZE=2][COLOR=#0000ff][FONT=Consolas][SIZE=2][COLOR=#0000ff]if[/SIZE][/FONT][/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][FONT=Consolas][SIZE=2](sqrt( ((ballliste.back().position[0] - ballliste[stelle].position[0])*(ballliste.back().position[0] - ballliste[stelle].position[0])) + ((ballliste.back().position[1] - ballliste[stelle].position[1]) * (ballliste.back().position[1] - ballliste[stelle].position[1])) ) >= ballliste.back().radius + ballliste[stelle].radius)
{
[/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][COLOR=#008000][FONT=Consolas][SIZE=2][COLOR=#008000][FONT=Consolas][SIZE=2][COLOR=#008000]//Debug[/SIZE][/FONT][/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][FONT=Consolas][SIZE=2]cout << [/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][COLOR=#a31515][FONT=Consolas][SIZE=2][COLOR=#a31515][FONT=Consolas][SIZE=2][COLOR=#a31515]"Platz gefunden"[/SIZE][/FONT][/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][FONT=Consolas][SIZE=2] << endl;
gefunden = [/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][COLOR=#0000ff][FONT=Consolas][SIZE=2][COLOR=#0000ff][FONT=Consolas][SIZE=2][COLOR=#0000ff]true[/SIZE][/FONT][/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][FONT=Consolas][SIZE=2];
[/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][COLOR=#0000ff][FONT=Consolas][SIZE=2][COLOR=#0000ff][FONT=Consolas][SIZE=2][COLOR=#0000ff]return[/SIZE][/FONT][/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][FONT=Consolas][SIZE=2](gefunden);
[/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][COLOR=#008000][FONT=Consolas][SIZE=2][COLOR=#008000][FONT=Consolas][SIZE=2][COLOR=#008000]//Debug[/SIZE][/FONT][/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][FONT=Consolas][SIZE=2]cout << [/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][COLOR=#a31515][FONT=Consolas][SIZE=2][COLOR=#a31515][FONT=Consolas][SIZE=2][COLOR=#a31515]"Ballsauber erfolgreich"[/SIZE][/FONT][/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][FONT=Consolas][SIZE=2] << endl;
}
}
[/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][COLOR=#008000][FONT=Consolas][SIZE=2][COLOR=#008000][FONT=Consolas][SIZE=2][COLOR=#008000]//Debug[/SIZE][/FONT][/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][FONT=Consolas][SIZE=2]cout << [/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][COLOR=#a31515][FONT=Consolas][SIZE=2][COLOR=#a31515][FONT=Consolas][SIZE=2][COLOR=#a31515]"Ball konnte nicht erstellt wewrden"[/SIZE][/FONT][/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][FONT=Consolas][SIZE=2] << endl;
gefunden = [/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][COLOR=#0000ff][FONT=Consolas][SIZE=2][COLOR=#0000ff][FONT=Consolas][SIZE=2][COLOR=#0000ff]false[/SIZE][/FONT][/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][FONT=Consolas][SIZE=2];
[/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][COLOR=#0000ff][FONT=Consolas][SIZE=2][COLOR=#0000ff][FONT=Consolas][SIZE=2][COLOR=#0000ff]return[/SIZE][/FONT][/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][FONT=Consolas][SIZE=2](gefunden); 
}
[/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][COLOR=#0000ff][FONT=Consolas][SIZE=2][COLOR=#0000ff][FONT=Consolas][SIZE=2][COLOR=#0000ff]else[/SIZE][/FONT][/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][FONT=Consolas][SIZE=2]{
[/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][COLOR=#008000][FONT=Consolas][SIZE=2][COLOR=#008000][FONT=Consolas][SIZE=2][COLOR=#008000]//Debug[/SIZE][/FONT][/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][FONT=Consolas][SIZE=2]cout << [/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][COLOR=#a31515][FONT=Consolas][SIZE=2][COLOR=#a31515][FONT=Consolas][SIZE=2][COLOR=#a31515]"erster Ball erstellt"[/SIZE][/FONT][/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][FONT=Consolas][SIZE=2] << endl;
gefunden = [/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][COLOR=#0000ff][FONT=Consolas][SIZE=2][COLOR=#0000ff][FONT=Consolas][SIZE=2][COLOR=#0000ff]true[/SIZE][/FONT][/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][FONT=Consolas][SIZE=2];
[/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][COLOR=#0000ff][FONT=Consolas][SIZE=2][COLOR=#0000ff][FONT=Consolas][SIZE=2][COLOR=#0000ff]return[/SIZE][/FONT][/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][FONT=Consolas][SIZE=2](gefunden); 
}
}
[/SIZE][/FONT][/SIZE][/FONT]

Des mit dem unsigned short ist, weil ich dachte, dass das Speicherplatz spart, oder?
 
Zurück