# 2D-Spiel Fragen und Hilfe bei Programmierung



## Crymes (18. März 2012)

Hallo,
Ich habe mir ein neues Projekt überlegt:
Ich möchte mir ein Spiel (vll. erst mal eine Demo ohne eingabe) programmieren.
Es sollen auf dem Bildschirm Bälle (beliebige Anzahl) dargestellt werden, die an den Bildschirmrändern und miteinander dynamisch kollidieren.
Wenn ich das schaffen sollte, wollte ich das Spiel programmieren, indem man mit der Maus eine Linie zeichnet und so die Bälle (2 oder 3) vonm einer Kollision abhält.

Ich würde für den Grundcode gerne C++ verwenden und vll. OpenCL verwenden.

Meien Fragen: Wie realisiere ich die Darstellung auf dem Bildschirm? OpenCL? DirectX?

Ich habe mir überlegt, dass ich eine Instanz eines Balls mit Position und Geschwindigkeit erstelle und die Instanzen dann mit einer Update-Funktion vergleiche/auf Kollision überprüfe.

Ist das ein guter Ansatz/ denkt ihr dass ich das schaffen kenn?

Freundliche Grüße,
Crymes


----------



## joffal (18. März 2012)

hui,
Crysis-nerd hat genau so etwas kleines 2D-basiertes mal angefangen, ist noch nicht allzu alt, sollte also irgendwie innerhalb der nächsten paar Seiten noch zu finden sein 
War glaub ich C++ und DirectX.

Mit OpenCL kann man meines Wissens nach keine Bildschirmausgabe produzieren, das war Open*GL* (siehe AMDs kleine 3D-Engine )

Vom Prinzip her wäre es wohl erstmal ausreichend, wenn du einfach nur die Objekte erstellst (wie du schon gesagt hast, einfach eine kleine klasse mit Geschw. Position, Masse, und vllt noch ein paar sachen; und dann lässt du das ganze erstmal ohne ausgabe laufen, meinetwegen mit 2 Objekten und speicherst dir alle paar sekunden die positionen in eine Datei --> dann kannst du wenigstens schonmal nachvollziehen, was/wie/wo passiert ist. Das mit der Grafikausgabe ist dann wahrscheinlich nicht mehr soooo einfach ..... 
Für einfache Sachen würde ich dort OpenGL nehmen, aber DirectX (damit habe ich auch schon gearbeitet) finde ich irgendwie schöner ^^


----------



## Crymes (18. März 2012)

Mit OpenCL wollte ich die Kollisionsberechnung/ Positionsbestimmung schreiben, so als selbst geschriebenen Benchmark mit 500+ kleinen Bällen. Aber das ist Nr gute Idee, da werd ich mich erstmal um den Kern kümmern


----------



## AMD (18. März 2012)

Für so eine Kollisionsberechnung brauchst du kein OpenGL - das schaffst du bequem auch ohne.

Edit// OpenCL meinte ich natürlich >_>


----------



## Skysnake (19. März 2012)

OpenGL: Graphikausgabe
OpenCL: Berechnungen

Da haste dir aber ein schönes Stück arbeit vor genommen. 

Genau so was will ich in den nächsten Wochen eventuell auch noch machen, aber kollisionsabfrage etc. ist wirklich hässlich, wenn man das vernünftig machen will, und da rede ich jetzt nur von Kugeln, was am einfachsten zu machen ist. Komplizierte Objekte will ich mal lieber gar nicht erst von anfangen.

Beschränke dich also auf Kugeln! Kannst auch am Anfang die nur mal rum fliegen lassen. Das macht die Sache deutlich einfacher.

Btw. was du machen willst, läuft unter dem Schlagwort N-Body-Simulation  

Ist wirklich ne gute Übung. Wenn du Informatik studierst, wirste das sicherlich noch einige male implementieren dürfen 

Ich schreib mir grad einen Simulator für Wärmeleitung.

Hab jetzt nen BMP-Reader fertig geschrieben. Kann jetzt schön BMPs einlesen und mir über OpenGL ausgeben lassen. Das ist für Anfangswerte ganz nett


----------



## Crymes (19. März 2012)

Ja, es sollen nur Kugeln sein.
Dann lass ich das mit dem OpenCL erstmal weg, kann man ja später immer noch machen.


----------



## Mashed (19. März 2012)

Wenn du sauber programmierst, schafft auch eine ältere CPU die 500 Bälle ohne Probleme.


----------



## Skysnake (19. März 2012)

500 Objekte sind nichts 

Das schaffste sogar als single-Thread.

Bei so 20k+ wirds lustig. Das hab ich mal auf nem cluster gemacht mit 96 cores


----------



## Crymes (19. März 2012)

Ich will halt nen Einblick in verschiedene Sprachen bekommen.
Diese Woche wirds wahrscheinlich eh nichts, wegen BOGY.

Mach mir grad Gedanken, wie ich es programmiere, wenn ich eine Beliebige Anzahl an Bällen au einer Struktur erzeuge


----------



## Crymes (19. März 2012)

Ich glaube ich werde es erst mal wieder in C++ schreiben und dann, wenn ich das Programm zum Spiel erweitere in C# portieren.

//Edit
Das hab ich bis jetzt:

// Ball Demo.cpp : Definiert den Einstiegspunkt für die Konsolenanwendung.
//
#include "stdafx.h"
#include <iostream>
#include "windows.h"
　
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
//Struktur Ball festlegen
struct kugel
{
double positionx, positiony;
double geschwindigkeitx, geschwindigkeity;
}ball1, ball2;
//Bälle initialisieren
//ball1
ball1.positionx = 100;
ball1.positiony = 100;
ball1.geschwindigkeitx = 1;
ball1.geschwindigkeity = 1;
//ball2
ball2.positionx = 300;
ball2.positiony = 300;
ball2.geschwindigkeitx = 1;
ball2.geschwindigkeity = 1;
//Bildschirmauflösung festlegen
int bildschirmbreite = GetSystemMetrics(SM_CXSCREEN);
int bildschirmlänge = GetSystemMetrics(SM_CYSCREEN);
//Bälle Bewegen
//ball1
ball1.positionx = ball1.positionx + ball1.geschwindigkeitx;
ball1.positiony = ball1.positiony + ball1.geschwindigkeity;
//ball2
ball2.positionx = ball2.positionx + ball2.geschwindigkeitx;
ball2.positiony = ball2.positiony + ball2.geschwindigkeity;
//ball zeichnen
//Kollision mit Bildschirmrand
　
return 0;
}


----------



## -Phoenix- (20. März 2012)

Moin,

ich hab das gleiche vor 1 Jahr in der Schule in Java Programmiert. Ich würde an deiner Stelle nicht mit structs sondern mit Objekten arbeiten.

lg. Phoenix


----------



## Mashed (20. März 2012)

Wenn du es schon in C++ schreibst, wieso willst du es dann auf C# portieren? Ist dir das Programm sonst zu schnell?


----------



## Skysnake (20. März 2012)

Structs sind schon ok, ich würde sogar sagen die richtige Lösung, wenn du nicht dynamisch die Anzahl massiv verändern willst.

Warum?

Ganz einfach.

Objekte kosten dich Rechenleistung. 

Du kannst dir aber überlegen, ob du StructsofArrays oder ArraysofStructs verwendest. 

Ich rate dir zu SoA, das kannste dann nämlich gleich für GPUs weiter verwenden, wenn dichs mal juckt so was zu machen.


----------



## joffal (20. März 2012)

Tipp: Mach dir nebenbei als Hilfe eine kleine Vektorklasse 
Das mit den Objekten/Structs ist meiner Meinung eher dem Programmierer überlassen. (Ein Objekt kann z.B. auch structs enthalten, die dann später von der GPU verwendet werden)
ich persönlich habe mich überwiegend mit Objekten angefreundet


----------



## Skysnake (20. März 2012)

Objektorientierte Programmierung ist auch was feines für große Projekte und Projekte usw. Du verlierst aber halt immer! Leistung durch Objekte, und bei so was wie dem hier will man das im allgemeinen nicht haben.


----------



## Crymes (20. März 2012)

Ich hab vor, mich erstmal auf die 2 Bälle zu beschränken.
Ist das richtig, wenn ich jetzt mit verschiedenen if Strukturen die Kollision mit dem Bildschirmrand und untereinander löse?


----------



## Skysnake (20. März 2012)

Ja, wie willst du es sonst erkennen?

Du solltest aber auf JEDEN FALL! es gleich so programmieren, das es keinen Unterschied macht, ob du jetzt 2 oder 2000 Objekte hast. Ansonsten fängste später wieder komplett bei 0 an. Lieber gleich richtig machen, anstatt zwei mal


----------



## Crymes (21. März 2012)

Das ist mein Problem, da hab ich keine Ahnung, wie ich das anstellen soll. Ich dachte an eine Art Kollissionsbibliothek, mit der ich jeden Ball beleg. Aber dann müsste ich bei einer Kollision zwiscgen mehreren Bällen ne Art Impulsvariable übergeben?


----------



## Skysnake (21. März 2012)

Kugeln sind coool!

Du musst nur die Abstände der beiden Zentren + die Radien miteinander vergleichen. Wenn der Abstand <= der Summe der beiden Radien ist, dann gibts einen Stoß. Aus die Maus.

Und den Stoß machste halt mit Impuls- und Energieerhaltung. Für Wände ist es sogar noch einfacher. Da hast du einfach Einfallswinkel=Ausfallswinkel, und fertig.

Bei der Wand links/rechts musst du also nur das Vorzeichen der X Komponente ändern, und oben/unten das der Y Komponente des Geschwindigkeitsvektors. Das wars dann auch schon. Das ist wirklich easy.

Und denk dran. Wenn sich Kugeln stoßen, dann sind das immer zwei Geraden, die aufeinander stoßen


----------



## fadade (21. März 2012)

und dann reduzierst du nach einer Kollision die Geschwindigkeit der Kugeln einfach um 1% oder so und schwupps hast du auch noch "Reibung" drin


----------



## Skysnake (21. März 2012)

Du meinst inelastischen Stoß


----------



## Crymes (21. März 2012)

Ich glaub ich werde noch eine impuls Variable in die Klasse integrieren, die sich je nach Winkel ändert und dann die Geschwindigkeit modifiziert, bevor sie wieder zurückgesetzt wird.


----------



## Skysnake (21. März 2012)

Wenn du viele Partikel/Objekte simulieren willst, verabschiede dich von ooP. Das bricht dir schnell das Genick, was die Performance betrifft, wenn du da für jedes Partikel ein eigenes Objekt erzeugst.

Arbeite mir structs of Arrays. Das ist auch völlig natürlich in der Implementierung.


----------



## Crymes (21. März 2012)

Für mein fertiges Spiel will ich bei maximal 5 Bällen bleiben.
Ich möchte das genze halt möglichst einfach halten.
Ich hab auch keinen Plan, wie ich das ganze mit einer variablen Anzahl an Bällen machen soll, deshalb mach ich das jetzt erstmal mit 2 Bällen.


----------



## Skysnake (21. März 2012)

Pointer + new für ein Array halt. Das wars auch schon.


----------



## Crymes (21. März 2012)

Ok, noch 2 Fragen: Gibt es eine möglichkeiut, mit Vektoren zu rechnen?

Kann ich irgfendwie dem "Ball" einen Kreis zuweisen?


----------



## Skysnake (22. März 2012)

Wie willst du sonst rechnen? 

Arrays sind Vektoren!

Die Arithmetik dahinter musst du natürlich selbst schreiben, aber das ist meist trivial.

Ich mach mal ein Beispiel. Du hast 2 Vektoren der Länge n=3, die wie folgt aussehen: v1=1,2,3 v2=3,2,1 und eben ein Ergebnisvektor ve=0,0,0 dann kannste das wie folgt machen:


```
int n=3;
int v1[3]={1,2,3};
int v2[3]={3,2,1};
int ve[3]={0,0,0};


for(int i=0; i<n; i++){
ve[i]=v1[i]+v2[i];
}
```

Und das wars dann auch schon. Das sollte dir aber klar sein, wie so etwas geht. Wenn nicht, lass das Projekt lieber noch eine weile liegen und kümmere dich eher um solche Grundlagen.


----------



## Crymes (1. April 2012)

In dem Programm wird ja jede Stelle des Vektors einzeln addiert (bzw. hier nur die o (erste) Stelle). Gibt es nicht einen Befehl, mit dem ich sowas wie v3=v1+v2 schreiben kann und dann alle 3 Stellen addiert hab (Für was ist eigentlich die Bibliothek vector da?)?


----------



## Skysnake (1. April 2012)

Die Erweiterung vec<> ist dafür da, dass du die Vectoren dynamisch vergrößern und verkleinern kannst meines Wissens nach. Auch wird einiges im Hintergrund bei mehrdimensionalen Vectoren gemacht.

Ich hab mit vec aber noch nichts brauchbares gesehen. Jeder der das verwendet hat, war immer langsamer, als meine Implementierung des Problems.

Schau dir aber am Besten einfach die man-page dazu an. Dann weißte genau was das kann und was nicht.


----------



## Crymes (1. April 2012)

Ok, dann werde ich es nach dem Schema versuchen, alle Dimensionen einzeln zu Verrechnen, so wie du es getan hast.


----------



## Skysnake (1. April 2012)

Naja, du kannst auch SSE nutzen, oder AVX, dann kannste du mehrere Teile gleichzeitig rechnen. Obs aber den Aufwand wert ist, ist zu bezweifeln, zumal je nach Compiler, der dir eh SSE/AVX Code draus bastelt. Ist halt nur nicht ganz so performant, als wenn du das selber machst. Da musst du dann aber selbst in die SSE/AVX Register rein schreiben. Hab ich jetzt 1 mal gesehen, und mir gesagt: "Neee, muss nicht unbedingt sein..." 

Wenn mans wirklich performant will, kann man das machen, aber es ist halt schon etwas Mehraufwand.


----------



## Crymes (2. April 2012)

Ich meinte nur von der Syntax her, ich glaub um die Performance muss ich mir wenn überhaupt erst am Schluss Sorgen machen.


----------



## Crymes (2. April 2012)

Warum wird bei mir immer beim = gemeckert?


```
[FONT=Consolas][SIZE=2][COLOR=#008000][FONT=Consolas][SIZE=2][COLOR=#008000][FONT=Consolas][SIZE=2][COLOR=#008000]
// Ball Simulation.cpp : Definiert den Einstiegspunkt für die Konsolenanwendung.
//[/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]#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]<iostream>[/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=#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] _tmain([/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] argc, _TCHAR* argv[])
{
[/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][COLOR=#008000][FONT=Consolas][SIZE=2][COLOR=#008000][FONT=Consolas][SIZE=2][COLOR=#008000]// Klasse erstellen[/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]struct[/SIZE][/FONT][/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][FONT=Consolas][SIZE=2] kugel
{
[/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] position [2] = {0,0};
[/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] geschwindigkeit [2] = {0,0}; 
}ball1, ball2;

[/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] 0;
}
　
[/SIZE][/FONT][/SIZE][/FONT]
```


----------



## fadade (2. April 2012)

In structs kannst du die Wertzuweisung bei der Deklaration nicht machen (jedenfalls in C# nicht und dann wird in C++ wohl ähnlich sein^^). Und zieh mal das ganze struct-{...} aus der Methode raus; oder ist das gewollt ?!


----------



## Crymes (3. April 2012)

Du meinst ich soll das über die main schreiben, wie eine globale Variable?


----------



## bingo88 (3. April 2012)

Du kannst structs nicht schon bei der Definition initialisieren.

```
struct TheStruct
{
    int a = 4; // das geht nicht!
    int b = 3; // s. o.
};

// das hier habe ich aber schon mal gesehen (meine ich zumindest ^^):
TheStruct s = {4, 3};
```

Und wie fadade schon sagte, die struct-Definition in die Funktion zu packen sieht mir auch was komisch aus


----------



## Mashed (3. April 2012)

bingo88 schrieb:


> Und wie fadade schon sagte, die struct-Definition in die Funktion zu packen sieht mir auch was komisch aus



Ist aber möglich. Auch das "struct {...} variable1, variable2;" ist in C/C++ gültig.
Du kannst aber nicht innerhalb der Deklaration von einem struct Werte zuweisen. Wenn du den struct-members Standardwerte verpassen willst, kannst du 2 Sachen machen:
1) Du schreibst z.B. member_variable : 0; um die variable automatisch mit 0 zu initialisieren. Ist nicht offiziell im C-Standard enthalten, aber so gut wie jeder Compiler unterstützt dieses Feature. Wenn du von dieser Möglichkeit Gebrauch machst, werden alle Variablen ohne Standartwert mit 0 initialisiert, was bei größeren Arrays praktisch sein kann.
Empfehlen würde ich allerdings eher
2) C++ only: Du schreibst einen Konstruktor, der die member initialisiert. (Structs in C++ sind fast wie Klassen, nur dass, wenn nichts angegeben, alles public ist)

```
struct A
{
  int b;
  int c;
  A() : b(0), c(0) {}
}
```


----------



## bingo88 (3. April 2012)

Mashed schrieb:


> Ist aber möglich.


 Ich meinte ja nur, dass es komisch aussieht und ich so was lieber vermeiden würde. Möglich ist in C/C++ ja so einiges, aber man muss es schließlich nicht alles nutzen.


----------



## DMA (3. April 2012)

bingo88 schrieb:


> ```
> /* [...] */
> // das hier habe ich aber schon mal gesehen (meine ich zumindest ^^):
> TheStruct s = {4, 3};
> ```


Der zweite Teil des Code-Schnipsel ist im ISO C++ erlaubt und auch gar  nicht mal so selten, sofern man den Weg über'n Konstruktor umgehen  möchte. 


bingo88 schrieb:


> Und wie fadade schon sagte, die struct-Definition in die Funktion zu packen sieht mir auch was komisch aus


Nicht alltäglich, aber deswegen noch lange nicht komisch. 
Je nach Anwendungsfall kann das Scopen von Structs schon einen gewissen Sinn haben.

So etwas ist mir durchaus schon über den Weg gelaufen: (Dass das shadowing von Typen mal'n ganz großes Übel ist, lassen wir bei Seite )

```
typedef struct
{
    int k;
} A;

int f()
{
    typedef struct
    {
        int s, k;
    } A;

    A s = { 2,3 };
}
```


----------



## Crymes (3. April 2012)

Was ist jetzt daran falsch?


```
[FONT=Consolas][SIZE=2][COLOR=#008000][FONT=Consolas][SIZE=2][COLOR=#008000][FONT=Consolas][SIZE=2][COLOR=#008000]
// Ball Simulation.cpp : Definiert den Einstiegspunkt für die Konsolenanwendung.
//[/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]#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]<iostream>[/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=#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] _tmain([/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] argc, _TCHAR* argv[])
{
[/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][COLOR=#008000][FONT=Consolas][SIZE=2][COLOR=#008000][FONT=Consolas][SIZE=2][COLOR=#008000]// Klasse erstellen[/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]struct[/SIZE][/FONT][/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][FONT=Consolas][SIZE=2] kugel
{
[/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] position [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] geschwindigkeit [2]; 
}ball1, ball2;

[/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][COLOR=#008000][FONT=Consolas][SIZE=2][COLOR=#008000][FONT=Consolas][SIZE=2][COLOR=#008000]//Klasse initialisieren[/SIZE][/FONT][/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][FONT=Consolas][SIZE=2]ball1.position [2] = {0,0};
[/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] 0;
}
　
[/SIZE][/FONT][/SIZE][/FONT]
```


----------



## Skysnake (3. April 2012)

Du willst auf das Element 2, also das dritte Element des Arrays position zugreifen, und dann dort auch noch ein 2 elementiges 1D-Array rein schreiben. Das kann nicht funktionieren 

Das müsste entweder

ball1.position={0,0};

wobei ich mir nicht sicher bin, ob das funktioniert, sollte aber, oder du schreibst:

ball1.position[0]=0;
ball1.position[1]=0;


----------



## DMA (3. April 2012)

So wie du da samchen möchtest, klappt das nicht.
Eine Initialization List kann, wie der Name schon sagt, nur bei der Initialisierung genutzt werden.

Wenn du das Array nullen möchtest, dann nutze dazu memset memset - C++ Reference.

```
memset(ball1.position, 0, sizeof ball1.position);
```
Wenn du es mit verschiedenen Werten belegen willst, musst du sie halt Zelle für Zelle zuweisen, wie es Skysnake empfahl.

@Skysnake: Das erste funktioniert nicht


----------



## Skysnake (3. April 2012)

War ich mir auch recht sicher, dass das nicht geht, aber habs halt nicht ausprobiert, von daher kann man es ja mal anbieten . So what. 

Memset ist schon so ne Sache


----------



## AMD (3. April 2012)

@Crymes, du willst es aber auch extra kompliziert machen oder? 

```
ball1.position[0]=0;
ball1.position[1]=0
```

Schreibs einfach so und gut ist...


----------



## Skysnake (3. April 2012)

ja, so ist es am einfachsten 

Btw. Crymes, nimm das struct mal aus der Main raus, und packs drüber, oder direkt in ein eigenes Headerfile. So macht man das eigentlich nicht wie du das gemacht hast. Zumindest hab ich so was eigentlich nie gesehen. Läuft ja dem Zweck von einem Struct auch etwas entgegen.


----------



## Crymes (3. April 2012)

so, hier der aktuelle Code:

```
[FONT=Consolas][SIZE=2][COLOR=#008000][FONT=Consolas][SIZE=2][COLOR=#008000][FONT=Consolas][SIZE=2][COLOR=#008000]// Ball Simulation.cpp : Definiert den Einstiegspunkt für die Konsolenanwendung.
//[/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]#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]<iostream>[/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]<Windows.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]// Klasse erstellen[/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]struct[/SIZE][/FONT][/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][FONT=Consolas][SIZE=2] kugel
{
[/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] position[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] geschwindigkeit[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] _tmain([/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] argc, _TCHAR* argv[])
{
[/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][COLOR=#008000][FONT=Consolas][SIZE=2][COLOR=#008000][FONT=Consolas][SIZE=2][COLOR=#008000]//Bildschirmauflösung ermitteln[/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]//Variablen[/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] blänge = 0, bbreite = 0;
[/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][COLOR=#008000][FONT=Consolas][SIZE=2][COLOR=#008000][FONT=Consolas][SIZE=2][COLOR=#008000]//Auflösung übernehmen[/SIZE][/FONT][/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][FONT=Consolas][SIZE=2]blänge = GetSystemMetrics (SM_CXSCREEN);
bbreite = GetSystemMetrics (SM_CYSCREEN);
[/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][COLOR=#008000][FONT=Consolas][SIZE=2][COLOR=#008000][FONT=Consolas][SIZE=2][COLOR=#008000]//Bälle erstellen[/SIZE][/FONT][/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][FONT=Consolas][SIZE=2]kugel ball1;
kugel ball2;

[/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][COLOR=#008000][FONT=Consolas][SIZE=2][COLOR=#008000][FONT=Consolas][SIZE=2][COLOR=#008000]//Klasse initialisieren[/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]//Ball1[/SIZE][/FONT][/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][FONT=Consolas][SIZE=2]ball1.position[0]=100;
ball1.position[1]=100;
ball1.geschwindigkeit[0]=0;
ball1.geschwindigkeit[1]=5;
[/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][COLOR=#008000][FONT=Consolas][SIZE=2][COLOR=#008000][FONT=Consolas][SIZE=2][COLOR=#008000]//Ball2[/SIZE][/FONT][/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][FONT=Consolas][SIZE=2]ball2.position[0]=500;
ball2.position[1]=500;
ball2.geschwindigkeit[0]=10;
ball2.geschwindigkeit[1]=0;
[/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][COLOR=#008000][FONT=Consolas][SIZE=2][COLOR=#008000][FONT=Consolas][SIZE=2][COLOR=#008000]//Position 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]//Variablen[/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;
[/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][COLOR=#008000][FONT=Consolas][SIZE=2][COLOR=#008000][FONT=Consolas][SIZE=2][COLOR=#008000]//Schleife für Position[/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](stelle = 0; stelle<=1; stelle++)
{
ball1.position[stelle] = ball1.position[stelle] + ball1.geschwindigkeit[stelle];
ball2.position[stelle] = ball2.position[stelle] + ball2.geschwindigkeit[stelle];
}
[/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][COLOR=#008000][FONT=Consolas][SIZE=2][COLOR=#008000][FONT=Consolas][SIZE=2][COLOR=#008000]//Bälle anzeigen[/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]//Kollision Bildschirmrand[/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] 0;
}
　
[/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][COLOR=#008000][FONT=Consolas][SIZE=2][COLOR=#008000][/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][/SIZE][/FONT]
```
 
Ich will jetzt erstmal die Kollision mit dem Bildschirmrand machen.
Weil ich von einem Punkt keinen Vektor erfassen kann und mir so den Ein- und Ausfallswinkel bestimmen kann, wollte ich wissen, wie ich am Besten einen Kreisartigen Bereich simulieren kann, von dem seinem Mittelpunkt bis zur Kollisionsstelle dann der Richtungsvektor zeigt.

PS: Gibt es eigentlich eine Möglichkeit, mit der if Abfrage die Struktur Kugel zu überprüfen?
Dann müsste ich nur eine schreiben


----------



## Skysnake (3. April 2012)

Bitte was? Ich versteh deine Frage nicht.

Und btw. Du bezeichnest dein struct als Klasse. Klassen und structs sind aber 2 Paar Stiefel. Sieht zwar ähnlich aus, sind aber 2 fundamental unterschiedliche Konzepte (meiner Meinung nach).


----------



## Crymes (3. April 2012)

Ich will jetzt den Fall behandeln, wenn mein Punkt an den Bildschirmrand stößt.
Ich weiß aber nicht, wie ich die Richtung eines Punktes bestimmen soll.
//Edit:
Ich kann ja einfach den Geschwindigkeitsvektor nehmen

//Edit2:
Wie mache ich es aber dann, dass, falls ich die grafische Anzeige hinbekommen soll, der Ball nicht bis zum Mittelpunkt vom Bildschirm verschwindet?


----------



## Skysnake (3. April 2012)

Ja, das hatte ich ja schon ganz am Anfang glaub mal geschrieben, dass du einfach die Komponenten des Geschwindigkeitsvektors beim Stoß an parallelen zu den Koordinantenachsen einfach nur spiegeln musst. Mehr ist das nicht.

Das mit dem Verschwinden verstehe ich nicht 

Da sollte nichts verschwinden. Was passieren kann ist nur, dass deine "Bälle" etwas über die Ränder raus fliegen, bevor die Geschwindigkeitsvektoren geändert werden. Das ist aber ein nicht ganz triviales Problem, wenn man die Performance nicht in den Keller sacken lassen will. Für dein Zwecke eh völlig wurst, ob die Bälle bischen drüber raus fliegen oder nicht


----------



## Crymes (3. April 2012)

Du meinst glaub das Gleiche, da die Kolission erst am Mittelpunkt erkannt wird, der Rest ist nicht mehr sichtbar.

Hier mein aktueller Code:

```
[FONT=Consolas][SIZE=2][COLOR=#008000][FONT=Consolas][SIZE=2][COLOR=#008000][FONT=Consolas][SIZE=2][COLOR=#008000]
// Ball Simulation.cpp : Definiert den Einstiegspunkt für die Konsolenanwendung.
//[/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]#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]<iostream>[/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]<Windows.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]// Klasse erstellen[/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]struct[/SIZE][/FONT][/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][FONT=Consolas][SIZE=2] kugel
{
[/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] position[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] geschwindigkeit[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] _tmain([/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] argc, _TCHAR* argv[])
{
[/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][COLOR=#008000][FONT=Consolas][SIZE=2][COLOR=#008000][FONT=Consolas][SIZE=2][COLOR=#008000]//Bildschirmauflösung ermitteln[/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]//Variablen[/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] blänge = 0, bbreite = 0;
[/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][COLOR=#008000][FONT=Consolas][SIZE=2][COLOR=#008000][FONT=Consolas][SIZE=2][COLOR=#008000]//Auflösung übernehmen[/SIZE][/FONT][/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][FONT=Consolas][SIZE=2]blänge = GetSystemMetrics (SM_CXSCREEN);
bbreite = GetSystemMetrics (SM_CYSCREEN);
[/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][COLOR=#008000][FONT=Consolas][SIZE=2][COLOR=#008000][FONT=Consolas][SIZE=2][COLOR=#008000]//Bälle erstellen[/SIZE][/FONT][/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][FONT=Consolas][SIZE=2]kugel ball1;
kugel ball2;

[/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][COLOR=#008000][FONT=Consolas][SIZE=2][COLOR=#008000][FONT=Consolas][SIZE=2][COLOR=#008000]//Klasse initialisieren[/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]//Ball1[/SIZE][/FONT][/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][FONT=Consolas][SIZE=2]ball1.position[0]=100;
ball1.position[1]=100;
ball1.geschwindigkeit[0]=0;
ball1.geschwindigkeit[1]=5;
[/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][COLOR=#008000][FONT=Consolas][SIZE=2][COLOR=#008000][FONT=Consolas][SIZE=2][COLOR=#008000]//Ball2[/SIZE][/FONT][/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][FONT=Consolas][SIZE=2]ball2.position[0]=500;
ball2.position[1]=500;
ball2.geschwindigkeit[0]=10;
ball2.geschwindigkeit[1]=0;
[/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][COLOR=#008000][FONT=Consolas][SIZE=2][COLOR=#008000][FONT=Consolas][SIZE=2][COLOR=#008000]//Position 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]//Variablen[/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;
[/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][COLOR=#008000][FONT=Consolas][SIZE=2][COLOR=#008000][FONT=Consolas][SIZE=2][COLOR=#008000]//Schleife für Position[/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](stelle = 0; stelle<=1; stelle++)
{
ball1.position[stelle] = ball1.position[stelle] + ball1.geschwindigkeit[stelle];
ball2.position[stelle] = ball2.position[stelle] + ball2.geschwindigkeit[stelle];
}
[/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][COLOR=#008000][FONT=Consolas][SIZE=2][COLOR=#008000][FONT=Consolas][SIZE=2][COLOR=#008000]//Bälle anzeigen[/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]//Kollision Bildschirmrand[/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]//Ball1[/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]//Breite[/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](ball1.position[0] == blänge)
{
ball1.geschwindigkeit[0] = ball1.geschwindigkeit[0] * (-1);
}
[/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][COLOR=#008000][FONT=Consolas][SIZE=2][COLOR=#008000][FONT=Consolas][SIZE=2][COLOR=#008000]//Länge[/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]else[/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](ball1.position[1] == bbreite)
{
ball1.geschwindigkeit[1] = ball1.geschwindigkeit[1] * (-1);
}
[/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][COLOR=#008000][FONT=Consolas][SIZE=2][COLOR=#008000][FONT=Consolas][SIZE=2][COLOR=#008000]//Ball2[/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]//Breite[/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](ball2.position[0] == blänge)
{
ball2.geschwindigkeit[0] = ball2.geschwindigkeit[0] * (-1);
}
[/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][COLOR=#008000][FONT=Consolas][SIZE=2][COLOR=#008000][FONT=Consolas][SIZE=2][COLOR=#008000]//Länge[/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]else[/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](ball2.position[1] == bbreite)
{
ball2.geschwindigkeit[1] = ball2.geschwindigkeit[1] * (-1);
}
[/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] 0;
}
　
[/SIZE][/FONT][/SIZE][/FONT]
```


----------



## AMD (3. April 2012)

Wäre es nicht besser, wenn du erstmal überhaupt die Basics vom programmieren lernst?
Wenn du nicht mal weisst, wie du die Structs richtig zu nutzen kannst, dann würde ich solche Projekte sein lassen. Nur mein Ratschlag...


----------



## Crymes (3. April 2012)

Das ist jetzt nicht böse gemeint, aber was denkst du, warum ich so ein sinnloses Projekt mache? 

Hier ist ein Link, wie das später mal aussehen soll (der 2. Test ist es): BrowserMark - The Browser Benchmark from Rightware


----------



## Crymes (15. April 2012)

So, hab noch ne triviale Frage: Warum wird bei meinem Pythagoras Gebilde immer bei sqrt überladen angezeigt?

```
[FONT=Consolas][SIZE=2][COLOR=#008000][FONT=Consolas][SIZE=2][COLOR=#008000][FONT=Consolas][SIZE=2][COLOR=#008000]
//Kollision untereinander[/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] abstandx=0;
[/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] abstandy=0;
[/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] abstandtotal=0;
abstandx = ball1.position[0] - ball2.position[0];
abstandy = ball1.position[1] - ball2.position[1];
abstandtotal = sqrt( ((abstandx^2) + (abstandy^2)) );
[/SIZE][/FONT][/SIZE][/FONT]
```


----------



## Skysnake (16. April 2012)

^2 musst du selbst implementiere , oder ne bibliothek verwenden. Ich denke daran liegts


----------



## AMD (16. April 2012)

So siehts aus.

Mach einfach abstandx*abstandx und das selbe mit y und es sollte gehen.
Wenn du außerdem "nur" beim Abstand float nimmst, dann kannst du auch sqrtf nehmen für float.


----------



## Crymes (17. April 2012)

So, ich hab mich mal die letzten beiden Abende hingesetzt und den Kollissionsteil weitergeschrieben, ich stell mal den ganzen Code von dem unfertigen Programm rein. Ich weiss, da ist vieles überflüssig und die Performance wird auch schlecht sein und abgesehen davon, dass das Ganze bis jetzt kein Bisschen variabel ist (z.B. wenn ich die Ballgröße ändere), hab ich das auch erstmal so zum Lernen für mich geschrieben. 
MEine Frage ist jetzt, wie ich den Einfallswinkel am Besten mit dem Geschwindigkeitsvektor verrechne. Bitte sagt mir jetzt nicht, dass es für die ganzen Zeilen auch ne vordefinierte Funktion gab  .

Und nochwas: ist es eigentlich möglich, eine variable Anzahl an Klassen eines Structs zu erstellen?


```
[FONT=Consolas][SIZE=2][COLOR=#008000][FONT=Consolas][SIZE=2][COLOR=#008000][FONT=Consolas][SIZE=2][COLOR=#008000]// Ball Simulation.cpp : Definiert den Einstiegspunkt für die Konsolenanwendung.
//[/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]<iostream>[/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][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]<Windows.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]// Klasse erstellen[/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] kugel
{
[/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]; 
}ball1, ball2;
[/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][COLOR=#008000][FONT=Consolas][SIZE=2][COLOR=#008000][FONT=Consolas][SIZE=2][COLOR=#008000]//Funktionen[/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] ballinit()
{ [/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][COLOR=#008000][FONT=Consolas][SIZE=2][COLOR=#008000][FONT=Consolas][SIZE=2][COLOR=#008000]//Klasse initialisieren Ball1 [/SIZE][/FONT][/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][FONT=Consolas][SIZE=2]ball1.position[0]=110;
ball1.position[1]=110;
ball1.geschwindigkeit[0]=0;
ball1.geschwindigkeit[1]=5;
[/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][COLOR=#008000][FONT=Consolas][SIZE=2][COLOR=#008000][FONT=Consolas][SIZE=2][COLOR=#008000]//Ball2[/SIZE][/FONT][/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][FONT=Consolas][SIZE=2]ball2.position[0]=500;
ball2.position[1]=500;
ball2.geschwindigkeit[0]=10;
ball2.geschwindigkeit[1]=0;
};
[/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] kollision([/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] blänge=0, [/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] bbreite=0)
{ 
[/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][COLOR=#008000][FONT=Consolas][SIZE=2][COLOR=#008000][FONT=Consolas][SIZE=2][COLOR=#008000]//Kollision Bildschirmrand[/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]//Ball1[/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]//rechts /links kollidieren[/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]( (ball1.position[0] == blänge) || (ball1.position[0] == 100) )
{
ball1.geschwindigkeit[0] = ball1.geschwindigkeit[0] * (-1);
}
[/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][COLOR=#008000][FONT=Consolas][SIZE=2][COLOR=#008000][FONT=Consolas][SIZE=2][COLOR=#008000]//oben /unten[/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]else[/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]( (ball1.position[1] == bbreite) || (ball1.position[1] == 100) )
{
ball1.geschwindigkeit[1] = ball1.geschwindigkeit[1] * (-1);
}
[/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][COLOR=#008000][FONT=Consolas][SIZE=2][COLOR=#008000][FONT=Consolas][SIZE=2][COLOR=#008000]//Ball2[/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]//rechts /links[/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]( (ball2.position[0] == blänge) || (ball2.position[0] == 100) )
{
ball2.geschwindigkeit[0] = ball2.geschwindigkeit[0] * (-1);
}
[/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][COLOR=#008000][FONT=Consolas][SIZE=2][COLOR=#008000][FONT=Consolas][SIZE=2][COLOR=#008000]//oben /unten[/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]else[/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]( (ball2.position[1] == bbreite) || (ball2.position[1] == 100) )
{
ball2.geschwindigkeit[1] = ball2.geschwindigkeit[1] * (-1);
}
[/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][COLOR=#008000][FONT=Consolas][SIZE=2][COLOR=#008000][FONT=Consolas][SIZE=2][COLOR=#008000]//Kollision untereinander /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]float[/SIZE][/FONT][/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][FONT=Consolas][SIZE=2] abstandx=0;
[/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] abstandy=0;
[/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] abstandtotal=0;
abstandx = ball1.position[0] - ball2.position[0];
abstandy = ball1.position[1] - ball2.position[1];
abstandtotal = sqrt( ((abstandx * abstandx) + (abstandy * abstandy)) );
[/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][COLOR=#008000][FONT=Consolas][SIZE=2][COLOR=#008000][FONT=Consolas][SIZE=2][COLOR=#008000]//Kollision erkennen[/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](abstandtotal <= 200)
{
[/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][COLOR=#008000][FONT=Consolas][SIZE=2][COLOR=#008000][FONT=Consolas][SIZE=2][COLOR=#008000]//Berechenen des Skalarproduktes zweier Vektoren[/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]//Helfsvariablen[/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] vmul[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] vmultot=0;
[/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] vbetragb1=0; [/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][COLOR=#008000][FONT=Consolas][SIZE=2][COLOR=#008000][FONT=Consolas][SIZE=2][COLOR=#008000]//hilvsvariable[/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] vbetragb2=0; [/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][COLOR=#008000][FONT=Consolas][SIZE=2][COLOR=#008000][FONT=Consolas][SIZE=2][COLOR=#008000]//hilfsvariable[/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] vbetragtot=0; [/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][COLOR=#008000][FONT=Consolas][SIZE=2][COLOR=#008000][FONT=Consolas][SIZE=2][COLOR=#008000]// betrag von vektor ball1 mal betrag von vektor ball2[/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] winkel=0;

[/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][COLOR=#008000][FONT=Consolas][SIZE=2][COLOR=#008000][FONT=Consolas][SIZE=2][COLOR=#008000]//Vektor ball1 mal vektor ball2[/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] z=0; z<=1; z++)
{
vmul[z] = ball1.geschwindigkeit[z] * ball2.geschwindigkeit[z]; 
}
vmultot = vmul[0] + vmul[1];
[/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][COLOR=#008000][FONT=Consolas][SIZE=2][COLOR=#008000][FONT=Consolas][SIZE=2][COLOR=#008000]//Betrak von vektor ball1 mal betrag vektor ball2[/SIZE][/FONT][/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][FONT=Consolas][SIZE=2]vbetragb1 = fabs( sqrt( (ball1.geschwindigkeit[0] * ball1.geschwindigkeit[0])+(ball1.geschwindigkeit[1] * ball1.geschwindigkeit[1]) ) ); 
vbetragb2 = fabs( sqrt( (ball2.geschwindigkeit[0] * ball2.geschwindigkeit[0])+(ball2.geschwindigkeit[1] * ball2.geschwindigkeit[1]) ) );
vbetragtot = vbetragb1 * vbetragb2;
[/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][COLOR=#008000][FONT=Consolas][SIZE=2][COLOR=#008000][FONT=Consolas][SIZE=2][COLOR=#008000]//cosinus von vmul durch vbetrag[/SIZE][/FONT][/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][FONT=Consolas][SIZE=2]winkel = acos( (vmultot/vbetragtot) );
[/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][COLOR=#008000][FONT=Consolas][SIZE=2][COLOR=#008000][FONT=Consolas][SIZE=2][COLOR=#008000]//Jeder Ball Vektor wird mit der Hälfte des Winkels multipliziert[/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] _tmain([/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] argc, _TCHAR* argv[])
{
[/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][COLOR=#008000][FONT=Consolas][SIZE=2][COLOR=#008000][FONT=Consolas][SIZE=2][COLOR=#008000]//Bildschirmauflösung ermitteln, optimiert für Ball mit 100 Pixeln 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]int[/SIZE][/FONT][/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][FONT=Consolas][SIZE=2] blänge = 0, bbreite = 0; 
blänge = GetSystemMetrics (SM_CXSCREEN) - 100;
bbreite = GetSystemMetrics (SM_CYSCREEN) - 100; 

[/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][COLOR=#008000][FONT=Consolas][SIZE=2][COLOR=#008000][FONT=Consolas][SIZE=2][COLOR=#008000]//Schleife für Position errechnen[/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] stelle = 0; stelle<=1; stelle++)
{
ball1.position[stelle] = ball1.position[stelle] + ball1.geschwindigkeit[stelle];
ball2.position[stelle] = ball2.position[stelle] + ball2.geschwindigkeit[stelle];
}
[/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] 0;
}
　
[/SIZE][/FONT][/SIZE][/FONT]
```


----------



## Skysnake (18. April 2012)

crymes was machst du da gerade eigentlich?

Für was schreibst du die Funktion kollision, wenn du sie gar nicht verwendest?

Was du sucht ist btw das Schlüsselwort new

Mit new kannst du dynamisch array erzeugen und mit delete wieder freigeben.


----------



## Crymes (18. April 2012)

Das Programm ist wie gesagt noch nicht fertig, in die main kommt dann noch ein DirectX Teil (oder OpenGL), in dem dann auch die Kollission abgefragt wird. Das wollte ich aber erst ganz am Schluss machen, weil ich damit noch keine Erfahrung hab.

Mein Problem ist jetzt, wie ich den Einfallswinkel wieder mit dem Vektor verrechne, so dass die Kugel abbrallt?


----------



## AMD (18. April 2012)

Eintrittswinkel gleich Austrittswinkel.

Du gehst das aber meiner Meinung nach total falsch an. Du kannst keine Methoden für eine 2D/3D Ausgabe schreiben, wenn es noch überhaupt kein Grundgerüst für dieses Rendering gibt.
Als ich damals Pong gemacht habe (http://extreme.pcgameshardware.de/programmierung-und-webdesign/185579-pong-v2-1-a.html), hatte ich mich erstmal mit dem Grundlegenden Rendercontext befasst, eine Kugel + Spielfeld platziert und dann die Kugel manuell bewegt. Dabei behält man die X und Y Position im Auge.
So hat man eine ungefähre Vorstellung, wie sich die Werte bei einer Kollision entwickeln müssen.

Bei einer Kollision am Rand (links oder rechts), muss die Bewegung auf der X-Achse *(-1) gerechnet werden, trifft die Kugel auf einen Schläger, dann wird die Y-Achse *(-1) gerechnet. So läuft es zumindest im groben bei mir.


----------



## Crymes (18. April 2012)

Ich hatte das eigentlich sio gedacht, dass bei jedem Durchlauf nur 2 Kreise angezeigt und vor dem nächsten Mal wieder gelöscht werden.


----------



## Crymes (2. Mai 2012)

So, ich glaub, dass die Kollision jetzt funktionieren könnte, hab das mit so ner Spiegelungsmatrix gemacht (Ich hasse es, wenn ich Dinge verwenden muss, die ich nicht ganz versteh).

Meine Frage: Würdet ihr mir OpenGL oder Direct3D empfehlen?

MfG, Crymes.


----------



## Skysnake (2. Mai 2012)

OpenGL, das läuft sowohl unter Windows als auch Linux. Direct3D würde ich daher nicht nutzen. Liegt aber auch an meinem universitären Background. Da ist Windows verpöhnt.


----------



## Crymes (2. Mai 2012)

Dann wered eich mal schauen, ob ich mir ein Buch besorgen kann.
Wie implementiere ich eigentlich so en Grafikausgabe ohne Timer?
Etwa so: die aktuellen Koordinaten werden so schnell wie geht refreshed und in Form einer Kugel angezeigt und jede 60stel Sekunde wird die Position aktualisiert?


----------



## Skysnake (2. Mai 2012)

Das kannst du z.B. machen, wobei du dann natürlich wieder einen Timer hast.

Meiner Meinung nach besser ist es, wenn du einfach alle X Iterationen die Positionen neu berechnest. Von den Kugeln würde ich allerdings wegkommen. Das sind zu viele Objekte, das schaffst du nicht performant zu zeichnen.

Ich bin da atm selbst noch am Überlegen, wie man das am geschicktesten machen kann, aber atm keine Zeit dafür.

Kannst dir aber mal das N-Body Beispiel im AMD OpenCL SDK anschauen. Die haben eine Grafikausgabe per OpenGL mit dabei. Keine Ahnung wie die das Lösen, aber ich denke die zeichnen einfach nur Punkte.


----------



## Mashed (2. Mai 2012)

Du solltest auf jeden Fall einen Timer verwenden. Wenn du einfach in einer Schleife wartest, braucht das Spiel sämtliche Rechenzeit auf der CPU auf.


----------



## Skysnake (2. Mai 2012)

nicht wirklich, dafür gibts idle funktions unter OpenGL und man kann auch ein sleep(0) einfügen, damit wird der timeframe freigegeben, was anderen Programmen Rechenzeit ermöglicht.


----------



## AMD (4. Mai 2012)

Ein Sleep Befehl gehört in der Regel nicht in eine RenderFunc oder auch die Idle Func nicht.
Bei (Free)glut gibt es ein glutPostRedisplay() - am besten mal in den freeglut Source gucken wie das arbeitet 


Ansonsten könnte man solche Berechnungen gut in die Renderfunction einarbeiten.

Kleines Beispiel:

```
void Render()
{

    static DWORD timer = timeGetTime();
    if (timeGetTime() - timer >= 15) {
        //Calc something
        timer = timeGetTime();
    }
}
```
So hast du alle 15ms einen Aufruf in der Renderfunktion von allem, was in der If-Abfrage ist. Das sind 66 Aufrufe pro Sekunde - definitiv ausreichend. Falls es mehr sein sollen: 1000 / gewünschte Aufrufe = ms
Das ist schon ziemlich performant, die Renderfunktion läuft ohnehin und die eine If-Abfrage brauch nicht viel Performance! Selbst wenn du mit 1000 fps renderst, was sind 1000 If Abfragen in einer Sekunde - genau, nix!

Hoffe das entspricht den Vorstellungen, hab jetzt nur die letzten paar Beiträge gelesen


----------



## Diablokiller999 (4. Mai 2012)

Nimm SDL als Bibliothek, es ist Plattformunabhängig, kann direkt auch deinen Input handeln und ist für dein Pong mehr als ausreichend.
OpenGL wäre am anfang wohl ein zu großer Brocken (viel zu groß!), damit würdest du dich nur erschlagen und hättest nachher garkeine Lust mehr (eigene Erfahrung). Wenn du Tutorials suchst, ich hab hier mal ein paar Links gepostet, die leider nicht fest gepinnt wurden. Die hätten wohl viele deiner Fragen beantwortet...


----------



## Crymes (5. Mai 2012)

Ich probier mal OpenGL.
Ich hab mich da jetzt ma informiert, was es da für Bibliotheken gibt. Aber wie binde ich die jetzt ein?

Ich brauche glaub Glut für die Generierung von Fenstern als Ersatz für Windows.h und die gl.h.

Was macht aber jetzt die Glew? Die ersetzt doch die gl.h, oder? Dann bräuchste ich dann nur 2 Bibliotheken?

Sind die eigentlich für OpenGL4.2 schon in VS integriert!


----------



## Skysnake (5. Mai 2012)

Ne. VS unsterstützt outofthebox kein OpenGL in höheren Versionen. Windows auch nicht. Da musst du schon einiges selbst installieren usw.

Du kannst aber die glext.h unter Windows verwenden. Die hat dann selbst einen include auf gl.h usw. Im AMD SDK ist die glaub ich vorhanden. Kannst dir also einfach mal das Ding installieren. Vor allem wenn du ne AMD hast, wirst du das ja eh machen 


```
#include <gl\glext.h>//wird benötigt, um Funktionen von GL1.2 bis GL3.x verwenden zu können
```

Anstonsten zu OpenGL und GLUT:

Also OpenGL bietet dir ne API, um Funktionen deiner GPU zu verwenden, wie z.B. das zeichnen von Polygonen, Linien und das Verwenden von Texturen.

GLUT ist auch wiederum eine API, aber diese bietet dir nur einige Funktionen zur Verwaltung deiner GUI. Ähnlich wie dies auch QT macht. Bei GLUT musst du allerdings aufpassen. Das Ding wird nicht mehr weiterentwickelt, und das schon recht lange. Spielt für dich am Anfang aber keine Rolle, zumal du eben auch einfach FreeGLUT oder ein anderes GLUT Derivat verwenden kannst, welches dann aktuell noch supported wird. Umschreiben musst du da meist nichts.


----------



## AMD (5. Mai 2012)

Am besten gleich Freeglut nehmen - kannst die selben Befehle wie das normale glut (und sogar noch ein paar mehr) aber ist eben auch aktuell.
Zumal es gerade für den Begin einfach ist.


----------



## Crymes (6. Mai 2012)

Ich hab jetzt gelesen, dass freeGlut/Glut eher nicht so der Renner für Spiele ist, eher für Demos.
Wie siehts mit SDL aus?


----------



## AMD (6. Mai 2012)

Und die Aussage kommt von wem? Einem SDL-User? 
Letztendlich ist es egal was du nimmst, du kannst auch generell auf sowas verzichten und dir alles selber coden, obs das einfacher macht kann man anzweifeln, gerade für den Einstieg.

Nur sind wir mal ehrlich, deine 2D-Darstellung wird definitiv kein Grafikwunder und ob du da SDL nimmst oder freeglut ist wohl so ziemlich egal.
Für den Einstieg rate ich trotzdem zu freeglut, da es einfach sehr simpel ist und was will man mehr als Anfänger?!


----------



## Skysnake (7. Mai 2012)

Das sehe ich auch so. Vor allem versteht man halt wirklich besser, was man macht, und (free)GLUT brauch halt auch nahezu 0 Einarbeitungszeit, was ich bei SDL mal anzweifle (Hab selbst damit noch nicht gearbeitet), da weniger als bei GLUT eigentlich nicht geht.


----------



## Crymes (7. Mai 2012)

So, ich versuche mich nun an FreeGlut.
Kann mir einer helfen und sagen, warum kein Fenster mit einem Dreieck angezeigt wird?  (Ich übe erst mal die Grafikausgabe, dass mit der Kolission und den Kugeln kommt später).

Ich hab den Code im Anhang.


----------



## AMD (7. Mai 2012)

Also ich sehe in deiner main nur folgendes:

```
glutInit(&argc, argv);

    //Renderfunktion festlegen
    glutDisplayFunc(zeichnen);

    //immer auf neuen Event warten;
    glutMainLoop();
```
Das ist aber etwas zu dünn ^^

Probier mal folgendes:

```
glutInit(&argc, argv);
    glutInitWindowPosition(0, 0);
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA | GLUT_DEPTH);

    glutInitWindowSize(800, 600);
    glutCreateWindow("Kugel");

    //Gleich noch Glew hinterher für später, kann aber auch raus
    glewInit();

    glutMainLoop();
```

Du hast zwar eine glutinit() aber rufst glutInit() auf - ist aber was verschiedenes! glutInit ist eine Glut-Funktion, außerdem: Case-Sensitve 

Ansonsten unter glutSwapBuffers: glutPostRedisplay();


----------



## Crymes (9. Mai 2012)

So, hab mich mal an die Darstellung gewagt.
Ich hab das Problem, dass immer bei den cos und sin gemeckert wird, irgendwas überladenes stimmt nicht überein.

Läuft der Code in der Form, wie er im Anhang ist, eigentlich nur einmal durch und ich brauch noch ne while Schleife in der Funktion zeichnen oder wird der automatisch immer neu ausgeführt?

Danke für eure Hilfe!


----------



## Skysnake (9. Mai 2012)

Die glutMainLoop() ist deine Endlosschleife. 

Du solltest noch eine Idle-Funktion implementieren. Die wird dann immer aufgerufen, wenn sonst nichts zu tun ist, wie der Name schon sagt 

Da kannst du dann mit einem GlutRedisplay, oder wie das grad nochmal heist, dann dafür sorgen, dass bei jedem Aufruf von Idle neu gezeichnet wird, oder aber du definierst doch eine gewisse Anzahl an Aufrufen vor dem neu zeichnen, oder eine Mindestzeitspanne, die vergangen sein muss, bevor das Update auf dem Bildschrim erfolgt.

In die Funktion packst du dann auch deine kollision() und ballupdate() Funktionen rein. Die sind in der display Funktion SEHR unschön. 

Ansnsten sieht das doch schon gar nicht sooo schlecht aus. Das mit dem GL_LINE_LOOP solltest du dir aber nochmal überlegen. Da wird also vom Mittelpunkt ausgehend ein Strich nach außen geschrieben, und dann erst der Kreis gezeichnet. Warum den Mittelpunkt mit zeichnen???

Das mit cos/sin könnte vielleicht daran liegen, dass du c als int hast, sollte aber eigentlich nicht der Fall sein. Am Besten zeigst du uns einfach mal, was der Compiler/Debugger ausspuckt. Alles andere bringt nichts.


----------



## Crymes (9. Mai 2012)

Das hier wird beim Kompilieren angezeigt:

```
[FONT=Consolas][SIZE=1][FONT=Consolas][SIZE=1]
1>------ Erstellen gestartet: Projekt: Ball Simulation, Konfiguration: Debug Win32 ------
1> Ball Simulation.cpp
1>c:\users\**\documents\visual studio 2010\projects\ball simulation\ball simulation\ball simulation.cpp(123): warning C4244: 'Argument': Konvertierung von 'float' in 'GLint', möglicher Datenverlust
1>c:\users\**\documents\visual studio 2010\projects\ball simulation\ball simulation\ball simulation.cpp(123): warning C4244: 'Argument': Konvertierung von 'float' in 'GLint', möglicher Datenverlust
1>c:\users\**\documents\visual studio 2010\projects\ball simulation\ball simulation\ball simulation.cpp(128): error C2668: 'cos': Mehrdeutiger Aufruf einer überladenen Funktion
1> c:\program files (x86)\microsoft visual studio 10.0\vc\include\math.h(559): kann 'long double cos(long double)' sein
1> c:\program files (x86)\microsoft visual studio 10.0\vc\include\math.h(511): oder "float cos(float)"
1> c:\program files (x86)\microsoft visual studio 10.0\vc\include\math.h(115): oder "double cos(double)"
1> bei Anpassung der Argumentliste '(unsigned __int64)'
1>c:\users\**\documents\visual studio 2010\projects\ball simulation\ball simulation\ball simulation.cpp(129): error C2668: 'sin': Mehrdeutiger Aufruf einer überladenen Funktion
1> c:\program files (x86)\microsoft visual studio 10.0\vc\include\math.h(585): kann 'long double sin(long double)' sein
1> c:\program files (x86)\microsoft visual studio 10.0\vc\include\math.h(537): oder "float sin(float)"
1> c:\program files (x86)\microsoft visual studio 10.0\vc\include\math.h(123): oder "double sin(double)"
1> bei Anpassung der Argumentliste '(unsigned __int64)'
1>c:\users\**\documents\visual studio 2010\projects\ball simulation\ball simulation\ball simulation.cpp(132): warning C4244: 'Argument': Konvertierung von 'GLfloat' in 'GLint', möglicher Datenverlust
1>c:\users\**\documents\visual studio 2010\projects\ball simulation\ball simulation\ball simulation.cpp(132): warning C4244: 'Argument': Konvertierung von 'GLfloat' in 'GLint', möglicher Datenverlust
1>c:\users\**\documents\visual studio 2010\projects\ball simulation\ball simulation\ball simulation.cpp(143): warning C4244: 'Argument': Konvertierung von 'float' in 'GLint', möglicher Datenverlust
1>c:\users\**\documents\visual studio 2010\projects\ball simulation\ball simulation\ball simulation.cpp(143): warning C4244: 'Argument': Konvertierung von 'float' in 'GLint', möglicher Datenverlust
1>c:\users\**\documents\visual studio 2010\projects\ball simulation\ball simulation\ball simulation.cpp(148): error C2668: 'cos': Mehrdeutiger Aufruf einer überladenen Funktion
1> c:\program files (x86)\microsoft visual studio 10.0\vc\include\math.h(559): kann 'long double cos(long double)' sein
1> c:\program files (x86)\microsoft visual studio 10.0\vc\include\math.h(511): oder "float cos(float)"
1> c:\program files (x86)\microsoft visual studio 10.0\vc\include\math.h(115): oder "double cos(double)"
1> bei Anpassung der Argumentliste '(unsigned __int64)'
1>c:\users\**\documents\visual studio 2010\projects\ball simulation\ball simulation\ball simulation.cpp(149): error C2668: 'sin': Mehrdeutiger Aufruf einer überladenen Funktion
1> c:\program files (x86)\microsoft visual studio 10.0\vc\include\math.h(585): kann 'long double sin(long double)' sein
1> c:\program files (x86)\microsoft visual studio 10.0\vc\include\math.h(537): oder "float sin(float)"
1> c:\program files (x86)\microsoft visual studio 10.0\vc\include\math.h(123): oder "double sin(double)"
1> bei Anpassung der Argumentliste '(unsigned __int64)'
1>c:\users\**\documents\visual studio 2010\projects\ball simulation\ball simulation\ball simulation.cpp(152): warning C4244: 'Argument': Konvertierung von 'GLfloat' in 'GLint', möglicher Datenverlust
1>c:\users\**\documents\visual studio 2010\projects\ball simulation\ball simulation\ball simulation.cpp(152): warning C4244: 'Argument': Konvertierung von 'GLfloat' in 'GLint', möglicher Datenverlust
========== Erstellen: 0 erfolgreich, Fehler bei 1, 0 aktuell, 0 übersprungen ==========
[/SIZE][/FONT][/SIZE][/FONT]
```
 
Werdet ihr daraus schlau?


----------



## Skysnake (9. Mai 2012)

na steht doch da, du übergibst woh
 ein unsigned int64, wo du nen float oder double haben solltest. Damit kommt der compiler nicht zurecht.


----------



## Crymes (9. Mai 2012)

So ein Mist, die Zählvariable in der for Schleife hatte sich nicht vertragen, ist jetzt auch ein float.

Warum wird aber immer noch ein weisser Bildschirm angezeigt?
Habe ich nen schweren Fehler oder fehlt mir einfach nur der oben genannte Timer?


----------



## fadade (9. Mai 2012)

Also bei Direct3D muss man explizit den Bildschirm "clearen" trotz der D3D-"Endlosschleife"
1) Clear
2) Render (Pixel mit werden mit neuen Farbwerten besetzt)
3) Bild anzeigen

könnte bei glut ja ähnlich sein. Steht bistimmt in irgendeiner Dokumentation

Edit: 
hier hab ich weiter unten auch was zum timer gesehen: http://www.informatik-forum.at/showthread.php?29351-Game-Loop-in-GLUT
und hier steht bestimmt iwwas  http://www.lighthouse3d.com/tutorials/glut-tutorial/


----------



## Skysnake (9. Mai 2012)

denk an die clipping planes!

Und halt an das push, oder wie das grad nochmals hies. 

Auch musst du darauf achten, dass du überhaupt im Fenster zeichnest. Die Werte beziehen sich nicht! Auf die Anzahl Pixel.


----------



## AMD (10. Mai 2012)

Machs halt einfach so:

```
x = ball1.radius*cosf((float)z*(Pi/180.0f));
       y = ball1.radius*sinf((float)z*(Pi/180.0f));
```
Bzw.

```
x = ball2.radius*cosf((float)c*(Pi/180.0f));
       y = ball2.radius*sinf((float)c*(Pi/180.0f));
```
Ansonsten solltest du trotzdem mal aufpassen, mit was für Datentypen du arbeitest. Der Compiler hat ja noch paar Meldungen mehr, wo OpenGL gerne float hätte, du aber int übergibst oder eben genau andersrum.


----------



## Crymes (10. Mai 2012)

Ich finde das mit dem float zu int find ich gar nicht so schlecht, da rechne ich halt mit hoher Genauigkeit die Vektoren aus und gebe sie halt weniger genau aus, ein halber Pixel stört ja keinen.

Mein anderes Problem ist, dass ich jetzt noch glFlush() und danach glutSwapBuffers (is des wegen dem doppelten Buffer, dass der mit einem Rechnet und den anderen in der Weile ausgibt und die immer tauscht?) hnzugegügt hab.
Es kommt aber nur ein blauer Strich von lings unten bis ca. Mitte des Bildschirms, sonst passiert nichts.

Edit: Liegt es daran, dass, wie Skysnake sagte, die "Werte sich nicht auf die Pixel beziehen"?
OpenGL fängt doch links unten bei 0,0 an und hört (in meinem Fall) rechts oben bei 1280,720 auf, oder?


----------



## fadade (10. Mai 2012)

- das mit float -> int ist auch *noch *okay, aber später kann sich eine so kleine ungenauigkeit extrem fortpflanzen! Ich hatte das z.B. letzte Woche mit Zeitrechnungen. Da habe ich float statt double (welche ich eign vom System erhalten würde) genutzt und ging auch alles gut, aber so nach einiger Zeit wurden viele Bewegungen ruckelig, da sie eben nur die float-Werte zur Grundlage hatten und das linear erhöht verringert die Genauigkeit auch linear^^
- Üblicherweise kannst du die Bufferanzahl auch bei OpenGL einstellen. 2 ist typisch und eigentlich auch das beste: Ein Bild wird gerade berechnet und das andere wird angezeigt, dann wird getauscht usw. wie du schon sagtest. Und das tauschen muss bei vielen APIs explizit gemacht werden
- Wie die Bildschirmkoordinaten bei OpenGL gehandhabt werden weiß ich nicht, aber ich vermute mal (0,0) in einer Ecke und (1,1) in der gegenüberliegenden Ecke. (Intern ist dann ein Punkt eben eine Pixelkoordinate (x*Width,y*Height) wobei (0,0) <= (x,y) <= (1,1) was eben den Grenzen (0*1280, 0*720) und (1*1280, 1*720) entspricht. So isses jedenfalls bei D3D


----------



## Crymes (10. Mai 2012)

Ich habe immer mal wieder von einer Projektionsmatrix und der Funktion glViewPort gelesen, liegt es daran, dass ich damit den gezeichneten Breich begrenzen muss?


----------



## Skysnake (10. Mai 2012)

es gibt den viewport, modellview, matrixview usw.

Daher kannste nicht davon ausgehen, wo wa ist. Du kannst ja auch noch die Kamera drehen usw usw.

Bei mir ist es z.b. So, da alles >2 außerhalb des Bildschirms ist, und genau das passiert bei dir auch. Du zeichnest von der Mitte nach außen, und mehr siehst du halt nicht weil außerhalb des displays.

Wie man genau eine "pixelgenaue" darstellung macht weiß ich auch nicht, geht aber wahrscheinlich auch gar nicht. Mit float/double bei der initialisierung wird wahrscheinlich auf den Bereich 0-1 abgebildet. Ähnlich wie das bei glColor auch der Fall ist.


----------



## Crymes (10. Mai 2012)

So, ich hab jetzt den Code der Funktion änderung hinzugefügt, hat aber das Problem nicht behoben, im Gegensatz: Der blaue Strich ist jetzt volkommen weg.
Hier der Code:

```
// Ball Simulation.cpp : Definiert den Einstiegspunkt für die Konsolenanwendung.
//
#include "stdafx.h"
#include <iostream>
#include <stdlib.h>
#include <stdio.h>
#include <math.h>
#include <string.h>
#include <Windows.h>
#include <GL/glew.h>
#include <gl/freeglut.h>
#define Pi 3,14159265358979323846
using namespace std;
//Bildschirmauflösung ermitteln
unsigned int blänge = GetSystemMetrics(SM_CXSCREEN), bbreite = GetSystemMetrics(SM_CYSCREEN); 
struct kugel
{
float position[2];
float geschwindigkeit[2]; 
unsigned int radius;
}ball1, ball2;
void ballinit()
{ //Klasse initialisieren Ball1 
ball1.position[0]=110;
ball1.position[1]=110;
ball1.geschwindigkeit[0]=0;
ball1.geschwindigkeit[1]=5;
ball1.radius=50;
//Ball2
ball2.position[0]=500;
ball2.position[1]=500;
ball2.geschwindigkeit[0]=10;
ball2.geschwindigkeit[1]=0;
ball2.radius=100;
};
void ballupdate()
{ 
for(int stelle = 0; stelle<=1; stelle++)
{
ball1.position[stelle] = ball1.position[stelle] + ball1.geschwindigkeit[stelle];
ball2.position[stelle] = ball2.position[stelle] + ball2.geschwindigkeit[stelle];
} 
}
void kollision()
{ 
//Kollision Bildschirmrand
//Ball1
//rechts /links kollidieren
if( (ball1.position[0] <= (blänge-ball1.radius)) || (ball1.position[0] <= ball1.radius) )
{
ball1.geschwindigkeit[0] = ball1.geschwindigkeit[0] * (-1);
}
//oben /unten
else if( (ball1.position[1] <= (bbreite-ball1.radius)) || (ball1.position[1] <= ball1.radius) )
{
ball1.geschwindigkeit[1] = ball1.geschwindigkeit[1] * (-1);
}
//Ball2
//rechts /links
if( (ball2.position[0] <= (blänge-ball2.radius)) || (ball2.position[0] <= ball2.radius) )
{
ball2.geschwindigkeit[0] = ball2.geschwindigkeit[0] * (-1);
}
//oben /unten
else if( (ball2.position[1] <= (bbreite-ball2.radius)) || (ball2.position[1] <= ball2.radius) )
{
ball2.geschwindigkeit[1] = ball2.geschwindigkeit[1] * (-1);
}
//Kollision untereinander /Abstand ausrechnen

if( sqrt( pow( ball2.position[0]-ball1.position[0], 2) + pow( ball2.position[1]-ball2.position[1], 2) ) <= (ball1.radius+ball2.radius) )
{
//? = atan((x1-x2)/(y2-y1))
//Kollisionsgerade
float gerade=0;
gerade = atan( (ball1.geschwindigkeit[0]-ball2.geschwindigkeit[0])/(ball2.geschwindigkeit[1]-ball1.geschwindigkeit[1]) );
//Spiegelungsmatrix
//vx' = vx cos(2 ?) + vy sin(2 ?)
//vy' = vx sin(2 ?) - vy cos(2 ?) 
//Vektoren spiegeln /x 
ball1.geschwindigkeit[0] = ball1.geschwindigkeit[0]*cos(2*gerade) + ball1.geschwindigkeit[0]*sin(2*gerade);
ball2.geschwindigkeit[0] = ball2.geschwindigkeit[0]*cos(2*gerade) + ball2.geschwindigkeit[0]*sin(2*gerade);
//y
ball1.geschwindigkeit[1] = ball1.geschwindigkeit[1]*sin(2*gerade) - ball1.geschwindigkeit[1]*cos(2*gerade);
ball2.geschwindigkeit[1] = ball2.geschwindigkeit[1]*sin(2*gerade) - ball2.geschwindigkeit[1]*cos(2*gerade);
} 

};
void fenster()
{
//Glut aufrufen und initialisieren 
glutInitDisplayMode(GLUT_DEPTH | GLUT_DOUBLE | GLUT_RGBA);
glutInitWindowPosition(-1, -1);
glutInitWindowSize(blänge, bbreite); 
glutCreateWindow("Ball Simulation"); 
}
void zeichnen()
{
GLfloat x=0, y=0;

//Bildschirm bereinigen
glClearColor(1,1,1,0);
glClear(GL_COLOR_BUFFER_BIT);
glLoadIdentity();
//Zeichnen
glBegin(GL_LINE_LOOP);
glColor3d(1,0,0);
//Mittelpunkz zeichnen
glVertex2i(ball1.position[0], ball1.position[1]);
for(float z=0;z<=360;z++) 
{ 
//Kreiswerte ausrechnen
x = ball1.radius*cos(z*(Pi/180));
y = ball1.radius*sin(z*(Pi/180));
//Kreisbahn zeichnen
glVertex2i(x,y);
}
//Ball 1 ist fertig
glEnd();
//Ball2
glBegin(GL_LINE_LOOP);
glColor3d(0,0,1);
//Mittelpunkt zeichnen
glVertex2i(ball2.position[0], ball2.position[1]);
for(float c=0;c<=360;c++)
{
//Kreiswerte zeichnen
x = ball2.radius*cos(c*(Pi/180));
y = ball2.radius*sin(c*(Pi/180));
//Kreisbahn zeichnen
glVertex2i(x,y);
}
//Ball2 fertig
glEnd();
//Buffer leeren
glFlush();
//Buffer zur Ausgabe leiten
glutSwapBuffers();

//Position der Bälle aktualisieren
//kollision();
//ballupdate();
}
void änderung(int länge, int breite)
{
double verhältnis;
//Nicht durch 0 teilen
if(breite == 0)
{
breite = 1;
}
verhältnis = 1.0*länge/breite;

//Projektionsmodus
glMatrixMode(GL_PROJECTION);
//Reset
glLoadIdentity();
//Sichtfeld fürs ganze Fenstere
glViewport(0,0,länge,breite);
//Korrekte Perspektive
gluPerspective(45,verhältnis,1,1000);
//Wieder Szene anzeigen
glMatrixMode(GL_MODELVIEW);
}
int _tmain(int argc, char * argv[])
{
//Glut aufrufen
glutInit(&argc, argv);
//Fenster zeichnen
fenster();
//Renderfunktion festlegen
glutDisplayFunc(zeichnen);
//Fenster darf verändert werden
glutReshapeFunc(änderung);
//immer auf neuen Event warten;
glutMainLoop();
return(0);
}
```
 
Eigentlich dachte ich, dass dies den Sichtbereich an das Fenster anpassen würde, jetzt bin ich komplett ratlos


----------



## AMD (11. Mai 2012)

Habe jetzt nicht wirklich Zeit das alles zu überprüfen aber paar Dinge die mir auffalen:
Das glFlush() kannst du dir sparen, da glutSwapBuffers() intern auch noch einen glFlush aufruft!

Du leerst bei dir nur den Color_Buffer, nicht den Tiefenbuffer! Daher bitte das glClear nehmen:
glClear(GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT);

glClearColor rufst du einmal beim Start auf aber nicht jeden Render-Call.

glutInitWindowPosition(-1,-1) ?! Setz es auf 0 und 0.


Ansonsten noch eine Kamera setzen mit gluLookAt() (und geh ruhig ein ganzes stück weg)...
So wie ich das Überblicke, arbeitest du mit ziemlich großen Werten (?!) und da ist die Kamera nötig, da man "standart" zu dicht dran ist.

Soviel erstmal von mir. Und nimm die Dinge bitte ernst (nur das glFlush ist jetzt nicht wirklich schlimm).


----------



## Crymes (12. Mai 2012)

Ich hab jetzt herausgefunden, dass der Zeichenbereich in der Mitte des Bildschirms (o,o) und an der rechten, oberen Ecke (1,1) hat.
Ist es eigfentlich üblich, damit zu Arbeiten oder sollteman wie oben den Bereich auf die Pixelanzahl des Bildschirms vergrößern?


----------



## AMD (12. Mai 2012)

Und woran liegt das? Benutze das gluLookAt() und du hast eine frei definierbare Kamera und eben kein 0-1 mehr.
Natürlich kannst du in diesem Bereich arbeiten aber ich würds lassen. Gerade für andere Dinge machts das nicht gerade einfacher.


----------



## Crymes (13. Mai 2012)

OK, ich hab das Pixelproblem mit glOrtho gelöst, jetzt ist alles Pixelgenau.
Jatzt hab ich allerdings ein anderes Problem: Wenn ich eine Linie mit absoluten Zahlen zeichne, dann wird sie angezeigt.
Zeichne ich sie aber mit Variablen, so kommt nichts. Woran liegt das?

Code im Anhang.


----------



## Skysnake (13. Mai 2012)

Schreib bitte den relevanten Codeteil hin. So kann dir keiner helfen.


----------



## AMD (13. Mai 2012)

Also Skysnake hat definitiv Recht! Code zeigen der funktioniert und dann den Code zeigen der nicht funktioniert.


Was ich jedoch gerade gesehen habe:
Du nutzt erst glOrtho() und kurz darauf einen gluPerspective() - das ist nicht gerade gewöhnlich. Vorallem, da dein gluPerpective einen FOV von 0 hat - so kann man eig. garnix sehen.
Nimm mal einen üblichen Wert wie 50 oder 60.


----------



## Crymes (14. Mai 2012)

```
[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]//zeichnen, swapBuffers benötigt![/SIZE][/FONT][/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][FONT=Consolas][SIZE=2]glBegin(GL_LINES);
glVertex2d(ball1.position[0],ball1.position[1]);
glVertex2d(ball2.position[0],ball2.position[1]);
glEnd();

glBegin(GL_LINES);
glVertex2d(100,100);
glVertex2d(510,510);
glEnd();
glutSwapBuffers();
[/SIZE][/FONT][/SIZE][/FONT]
```
 
Das untere wird angezeigt, das obere nicht.

Wenn ich bei dem ersten Wert von gluPerspective 50 oder 60 eingebe, sehe ich nur schwarz.


----------



## AMD (14. Mai 2012)

Nagut, vergiss das erstmal mit gluPerspective :S

Da du float nimmst, könntest du Vertex2f nehmen statt d.
Außerdem mach doch mal ein cout und schau, ob die Werte von ball1.position usw. denen von den konstanten Zahlen gleich sind.


----------



## Crymes (16. Mai 2012)

Ich Idiot!!!!
Hatte die Bälle garnicht initialisiert!

Jetzt werden sie mehr oder weniger wie gewünscht angezeigt und bewegen sich auch. Hab aber noch ein paar Probleme:

1) !! Die Kolission funktioniert überhaupt nicht, hab grad kein Plan, an was das liegen könnte !!
2) Das Zeichnen wird nur aktualisiert, wenn man das Fenster verschiebt - wie kann ich das ändern?
3) -weniger wichtig- Die Bälle sehen hässlich aus, muss mir da noch was überlegen. Dafür gibts ja ne glu Funktion, nur wie sag ich der die gewünschten Koordinaten??

Den Code poste ich ma hier, häng ihn aber auch noch als .cpp an.


```
// Ball Simulation.cpp : Definiert den Einstiegspunkt für die Konsolenanwendung.
//
#include "stdafx.h"
#include <iostream>
#include <stdlib.h>
#include <stdio.h>
#include <math.h>
#include <string.h>
#include <Windows.h>
#include <GL/glew.h>
#include <GL/freeglut.h>
#define Pi 3,14159265358979323846
using namespace std;
//Bildschirmauflösung ermitteln
unsigned int blänge = GetSystemMetrics(SM_CXSCREEN), bbreite = GetSystemMetrics(SM_CYSCREEN); 
struct kugel
{
float position[2];
float geschwindigkeit[2]; 
unsigned int radius;
}ball1, ball2;
void ballinit()
{ //Klasse initialisieren Ball1 
ball1.position[0]=110;
ball1.position[1]=110;
ball1.geschwindigkeit[0]=0;
ball1.geschwindigkeit[1]=5;
ball1.radius=50;
//Ball2
ball2.position[0]=500;
ball2.position[1]=500;
ball2.geschwindigkeit[0]=10;
ball2.geschwindigkeit[1]=0;
ball2.radius=100;
};
void ballupdate()
{ 
for(int stelle = 0; stelle<=1; stelle++)
{
ball1.position[stelle] = ball1.position[stelle] + ball1.geschwindigkeit[stelle];
ball2.position[stelle] = ball2.position[stelle] + ball2.geschwindigkeit[stelle];
} 
}
void kollision()
{ 
//Kollision Bildschirmrand
//Ball1
//rechts /links kollidieren
if( (ball1.position[0] >= (blänge-ball1.radius)) || (ball1.position[0] <= ball1.radius) )
{
ball1.geschwindigkeit[0] = ball1.geschwindigkeit[0] * (-1);
//Debug
cout << "****************************************" << endl << "***" << endl << endl << endl << "***********" << endl;
}
//oben /unten
else if( (ball1.position[1] >= (bbreite-ball1.radius)) || (ball1.position[1] <= ball1.radius) )
{
ball1.geschwindigkeit[1] = ball1.geschwindigkeit[1] * (-1);
}
//Ball2
//rechts /links
if( (ball2.position[0] >= (blänge-ball2.radius)) || (ball2.position[0] <= ball2.radius) )
{
ball2.geschwindigkeit[0] = ball2.geschwindigkeit[0] * (-1);
}
//oben /unten
else if( (ball2.position[1] >= (bbreite-ball2.radius)) || (ball2.position[1] <= ball2.radius) )
{
ball2.geschwindigkeit[1] = ball2.geschwindigkeit[1] * (-1);
}
//Kollision untereinander /Abstand ausrechnen
 
if( sqrt( pow( ball2.position[0]-ball1.position[0], 2) + pow( ball2.position[1]-ball2.position[1], 2) ) <= (ball1.radius+ball2.radius) )
{
//atan((x1-x2)/(y2-y1))
//Kollisionsgerade
float gerade=0;
gerade = atan( (ball1.geschwindigkeit[0]-ball2.geschwindigkeit[0])/(ball2.geschwindigkeit[1]-ball1.geschwindigkeit[1]) );
//Spiegelungsmatrix
//vx' = vx cos(2*gerade) + vy sin(2*gerade)
//vy' = vx sin(2*gerade) - vy cos(2*gerade) 
//Vektoren spiegeln /x 
ball1.geschwindigkeit[0] = ball1.geschwindigkeit[0]*cos(2*gerade) + ball1.geschwindigkeit[0]*sin(2*gerade);
ball2.geschwindigkeit[0] = ball2.geschwindigkeit[0]*cos(2*gerade) + ball2.geschwindigkeit[0]*sin(2*gerade);
//y
ball1.geschwindigkeit[1] = ball1.geschwindigkeit[1]*sin(2*gerade) - ball1.geschwindigkeit[1]*cos(2*gerade);
ball2.geschwindigkeit[1] = ball2.geschwindigkeit[1]*sin(2*gerade) - ball2.geschwindigkeit[1]*cos(2*gerade);
} 
 
};
void ball(float x, float y, int radius, float rot, float grün, float blau)
{
glBegin(GL_LINE_LOOP);
glColor3d(rot,grün,blau);
for(float s=0;s<=360;s++)
{
glVertex2f( (x + (radius*cos(s*(Pi/180)))), (y + (radius*sin(s*(Pi/180)))) );
}
glEnd();
}
void fenster()
{
//Glut aufrufen und initialisieren 
glutInitDisplayMode(GLUT_DEPTH | GLUT_DOUBLE | GLUT_RGBA);
glutInitWindowPosition(0,0);
glutInitWindowSize(blänge, bbreite); 
glutCreateWindow("Ball Simulation"); 
//Farbe fürs löschen festlegen
glClearColor(0,0,0,0);
}
void zeichnen()
{ 
//Bildschirm bereinigen 
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glLoadIdentity(); 
//Bälle zeichnen
ball(ball1.position[0],ball1.position[1],ball1.radius,1,1,1);
ball(ball2.position[0],ball2.position[1],ball2.radius,0,0,1);
 
//Alles anzeigen
glutSwapBuffers();
//Position aktualisieren
ballupdate();
//Debug in Konsole
//Bildschirmgröße
cout << blänge << bbreite << endl;
//Position der Bälle
cout << "Ball1: (" << ball1.position[0] << ", " << ball1.position[1] << ")" << endl; 
cout << "Ball2: (" << ball2.position[0] << ", " << ball2.position[1] << ")" << endl;
}
void änderung(int länge, int breite)
{
double verhältnis;
//Nicht durch 0 teilen
if(breite == 0)
{
breite = 1;
}
verhältnis = 1.0*länge/breite; 
//Projektionsmodus
glMatrixMode(GL_PROJECTION);
//Reset
glLoadIdentity(); 
//Sichtfeld fürs ganze Fenstere
glViewport(0,0,länge,breite);
//Korrekte Perspektive
gluPerspective(0,verhältnis,1,100);
//Zeichenbereich an Bildschirm anpassen
glOrtho(0,blänge,0,bbreite,0,1);
//Wieder Szene anzeigen
glMatrixMode(GL_MODELVIEW);
}
int _tmain(int argc, char *argv[])
{ 
//Bälle initialisieren
ballinit();
//Glut aufrufen
glutInit(&argc, argv);
//Fenster zeichnen
fenster();
//Renderfunktion festlegen
glutDisplayFunc(zeichnen);
//Fenster darf verändert werden
glutReshapeFunc(änderung); 
//immer auf neuen Event warten;
glutMainLoop();
 
return(0);
}
```


----------



## AMD (16. Mai 2012)

Problem 2:
In deiner zeichnen Funktion gefällt mir ehrlich gesagt nicht so die aktualisierung der Daten.
Führe bitte glutSwapBuffer als vorletztes in der zeichen Funktion aus und unter glutSwapbuffer packst du noch folgendes:
glutPostRedisplay();

Das sollte zumindest das Bild besser machen.

Problem 3: Wie sehen denn deine Bälle aus?


----------



## Crymes (17. Mai 2012)

Also, jetzt bewegen sich die Bälle zumindest schonmal von alleine (kommt mir n Bisschen langsam vor, aber seis drum).

So ein aktueller Ball ist  im Anhang, ist es eigentlich schwer, ihn mit einer Textur zu Füllen?


----------



## AMD (17. Mai 2012)

Sieht doch cool aus 

Es liegt halt vorallem daran, wie du deinen Ball renderst. ggf einfach mal glutSolidSphere nehmen.
Dein Programm könnte auch langsam sein, da du den Ball pro Frame immer wieder neu berechnen lässt. Optimal wäre die Geometrie nur einmal berechnet und dann nur noch verschieben mit z.B. glTranslate.


----------



## Skysnake (17. Mai 2012)

Ich würde den glut Post Redisplay in die idle Funktion rein packen. Da  kann man das Ding dann auch schön mit nem Timer versehen, um die Max-FPS  zu kappen.



Crymes schrieb:


> Also, jetzt bewegen sich die Bälle zumindest schonmal von alleine (kommt mir n Bisschen langsam vor, aber seis drum).
> 
> So ein aktueller Ball ist  im Anhang, ist es eigentlich schwer, ihn mit einer Textur zu Füllen?


WTF was ist das denn ?

Also du zeichnest deine "Kugel" schon etwas seltsam 

Aber seis drum. Glut bietet wie gesagt schon fertige Kugeln an. Die sind sinnvoller zu verwenden. Ansonsten musst du mit Polygonen arbeiten, wenn du etwas texturieren willst.

Ich glaube ich leg dir mal diese Seite hier ans Herz:

Bei dir kommen viele Fragen, die dort sicherlich beantwortet werden, und zwar so, dass du es auch verstehst. Die Seite habe ich letztes Semester für meine Computergraphiks I Vorlesung auch intensiev benutzt. 

OpenGL


----------



## Crymes (17. Mai 2012)

Ich hab irgendwie die saudumme Angewohnheit, Funktionen zu Schreiben, sie aberv nie aufzurufen 
Jetzt bin ich erstmal froh, meinen allerersten Meilenstein präsentieren zu können (Ich weiss, ist nicht gerade viel).
Ne fertig kompillierte .exe ist im Anhang.

MEine jetzugen Probleme:

In der Kollisionserkennung sind noch Bugs, wie man im anhang sehen kann, funktioniert sie manchmal, manchmakl aber auch nicht.

Es gab ja ne Funktion namens gluDisk. Nur wie teile ich der mit, !wo! sie den Kreis hinzeichnen soll?


----------



## Skysnake (17. Mai 2012)

GLTranslate und GLRotate sind deine "Freunde" 

Du zeichnest IMMER! im Ursprung der jeweiligen View, wenn du keine Koordinaten angeben kannst wie bei Lines usw.


----------



## Crymes (17. Mai 2012)

Also, ich nehm mich jetzt erst mal der Kollision an. 
Hab jetzt nen Fehler bzg. der Abstandsberechnung gefunden, womit es schon um einiges Besser geht. (Dachte eigentlich das es ein alles oder nichts Thema werden würde, zu Früh gefreut )

Nach längerre Zeit hat ein schnellerer Ball die Angewohnheit, unter dem Bildschirm zu Verschwinden.

Und dann hab ich noch einen Grundlegenden Fehler in der Ball zu Ball Kollision, sie wollen nicht schräg abbrallen.
Das liegt aber denke ich an der verwendeten Formel.


----------



## Skysnake (17. Mai 2012)

Das mit dem Verschwinden geht, wenn du >= und <= verwendest. Dann kommt es nicht mehr zu dem Effekt


----------



## Crymes (17. Mai 2012)

An welcher Stelle? In den if abfragen habe ich eigentlich schon <= und >= genommen

Ich glaube, dass folgendes Problem entsteht:

Der Ball kollidiert rechts unten mit der Seitenwand und die neue Geschwindigkeit wird angenommen. Die nächste Position wird berechnet und der Ball ist schon zum Viertel in der Unteren Bildschirmbegrenzung. 
Jetzt wird eine Kollision erkannt und das Vorzeichen wird geändert.

So weit so gut.

Doch durch ungünstige Geschwindigkeitskoordinaten kommt ist er beim nächsten Kollisionscheck noch nicht ganz aus dem Bildschirm draussen, die Geschwindigkeit wird wieder umgekehrt u.s.w.

Durch Rechenungenauigkeit ist er irgendwann im Nirwana verschwunden.

Ich hab jetzt probiert, den Ball in einer Kollisionsprüfung immer um ein Pixel weiter zu Verschieben, hat aber irgendwie nicht funktioniert.

Hab ich nen falschen Denkansatz?


----------



## Skysnake (17. Mai 2012)

Ja. Du musst einfach nur Berücksichtigen, von welchem Punkt er kommt. Sprich wenn er von außen den Rand durchringt, soll er einfach keine Kollision haben. Das ist die Einzige Möglichkeit, soetwas dauerhaft zu verhindern, wenn du nicht eine genau! Kollision machst, was ziemlich hässlich zu machen ist, weil du dann erstmal berechnen musst, wann das Ding stößt und bli bla blub. Mit zwei Körpern ist das noch nicht sooo das Problem, aber mit mehr um so mehr, weil du dann konsequenterweise eben auch vielfache Stöße berücksichtigen solltest.


----------



## AMD (17. Mai 2012)

Wie kann er nicht aus der Kollision raus kommen? So weit darfst du es garnicht erst kommen lassen.

Erstmal ein (Pseudo)Beispiel Dazu:

PositionNeu = PositionAlt + Richtung
if (PositionNeu == Kollision)
    PositionNeu = PositionAlt;

Falls es also zu einer Kollsion kommt, dann rutscht du erst garnicht weiter in den "bösen" Bereich rein sondern stopst vorher. Im nächsten Durchgang dann einfach in die andere Richtung weiter gehen. Ist das soweit verständlich?


----------



## Crymes (17. Mai 2012)

```
[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](ball2.position[1] + ball2.geschwindigkeit[1] < ball2.radius)
{
ball2.position[1] = ball2.radius;
}

[/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](ball2.position[1] + ball2.geschwindigkeit[1] > bbreite - ball2.radius)
{
ball2.position[1] = bbreite - ball2.radius;
}
[/SIZE][/FONT][/SIZE][/FONT]
```
 
=Wenn der Ball jenseits des Bildschirms will, wird er auf die höchste Position, die er fliegen darf, gesetzt.

(Ist jetzt nur zur Probe bei einer Richtung).

Ich hab jetzt das Obige, was haltet ihr davon? Im 2-Minuten Test scheints im Gegensatz zu Davor zu Funktionieren.


----------



## Skysnake (17. Mai 2012)

Das funktioniert aber auch nur, so lange die Geschwindigkeiten nicht zu groß werden 

Ist natürlich auch eine Möglichkeit, aber damit verlierst du jedwede physikalische Korrektheit, das sollte dir klar sein.

Wenn du bei wenigen Teilchen bleiben willst, wäre es besser, wenn du wirklich den Auftreffpunkt berechnest, und dann davon ausgehend streust. Aber Streuung/Kollision ist wirklich ein Thema für sich. Wenn man das wirklich korrekt machen will, dann kann man sich da Monate und Jahre mit beschäftigen ohne Probleme, bis das Zeug wirklich 1A ist UND noch immer effizient ist.


----------



## AMD (17. Mai 2012)

Also irgendwie versteh ich das nicht 
Aber wenn es funktioniert, sei es drum...


----------



## Crymes (17. Mai 2012)

Aber erst dann, wenn ich die Kugeln mit einem Durchgang über den gnzen Bildschirm rasen lasse?


----------



## Skysnake (17. Mai 2012)

Jup, dann funktionierst definitiv nicht mehr. Richtig erkannt 

Also jetzt AMDs Lösung.

Deine mit dem Zurücksetzen funktioniert immer, egal wie schnell er ist. Im Extremfall springt er halt immer von einem Ende zum nächsten, aber raus kommt er so nicht mehr.


----------



## Crymes (17. Mai 2012)

@AMD: Wenn der Ball von seiner aktuellen Position (im Beispiel nur y-Richtung) mit dem Geschwindigkeitsvektor auserhalb des Bildschirms landen würde, dann wird der Positionsvektor auf den maximal zur Kollision nutzbaren Wert gesetzt.
Das mach ich dann natürlich vor der Kolissionsprüfung.
Ist eigentlich fast wie in der Realität, finde ich.


----------



## Crymes (18. Mai 2012)

Kennt jemand eine gescheit seite, wo der nicht zentrale, elastische Stoß erklärt ist?
Ich hab jetzt schon den ganzen Tag gesucht, werd aber aus den formeln nicht schlau


----------



## Dragonix (18. Mai 2012)

hier stand müll <.<


----------



## Crymes (18. Mai 2012)

Da wurde leider nur verwiesen, dass nicht-zentrale Stöße schwierig sind und deshalb nicht behandelt werden.

Weiss sonst einer die Formel?


----------



## Skysnake (18. Mai 2012)

Crymes, du musst einfach nur die Streuung berechnen.

Als Näherung kannste auch einfach davon ausgehen, dass Sie zentral stoßen


----------



## Crymes (19. Mai 2012)

Ich hab folgendes unter der Quelle gefunden: Ratgeber zu Zweidimensionaler elastischer Stoß mit Kreisen | Physik


```
[I]Kommentar: Ich verwende den Dateityp "Vektor". Es handelt sich dabei um ein 
eindimensionales Array von Realzahlen. Der Index kann dabei nur die Werte 1 oder 2 
annehmen.[/I]

Funktion Skalarprodukt(x, y: Vektor): Real
{
  Skalarprodukt := x(1) * y(1) + x(2) * y(2)
}

Funktion Betrag (x: Vektor): Real
{
  Betrag := Wurzel(Skalarprodukt(x,x))
}

Funktion Abstand (x, y: Vektor): Real
{
  Abstand := Betrag(y-x)
}


Unterprogramm Stoß (Var x, y, vx, vy: Vektor)

[I]Kommentar: Beachte, dass die Parameter [U]hier[/U] mit Call-by-reference übergeben werden.[/I]

Dif,eDiv,vx_ax, vy_ax, vx_tan, vy_tan: Vektor

[I]Kommentar: Dif ist der Differenzvektor der übergebenen Parameter x und y. 
Er ist wichtig für die Bestimmung der Richtung, in der sich die Kugeln berühren. 
eDif ist ein Einheitsvektor in Richtung von Dif. Den brauchen wir, um die 
Komponentenzerlegung durchführen zu können.
vx_ax und vy_ax sind die Geschwindigkeitsvektoren in axialer Richtung, 
vx_tan und vy_tan in tangentialer Richtung.[/I]

{
  Dif := y - x
  eDif := Dif * (1/Betrag(Dif))

  vx_ax := Skalarprodukt(eDif,vx) * eDif
  vy_ax := Skalarprodukt(eDif,vy) * eDif
  vx_tan := vx - vx_ax
  vy_tan := vy - vy_ax

[I]Kommentar: Das war die Komponentenzerlegung[/I] 
  
  vx := vx_tan + vy_ax
  vy := vy_tan + vx_ax

[I]Kommentar: Die tangentialen Komponenten werden beibehalten, die axialen 
Komponenten ausgetauscht.[/I]
}

Hauptprogramm
{
  t := 0
  Eingabe Pos1, Pos2, v1, v2: Vektor
  Eingabe DeltaT,Dauer: Real
  Eingabe Radius: Real
  
  Wiederhole solange t<Dauer
    {
      t := t + DeltaT
      Pos1 := Pos1 + v1*DeltaT
      Pos2 := Pos2 + v2*DeltaT
      Falls Abstand(Pos1, Pos2) <= 2*Radius
        {
          Stoß (Pos1, Pos2, v1, v2)
        }
      Ausgabe Pos1, Pos2
    }
}
```
 
Ist das richtig?


----------



## Crymes (22. Mai 2012)

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:

```
[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 .

Meine jetzigen Probleme:

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

Ich hab das Gefühl, dass die Probleme miteineander zusammenhängen. Könnt ihr den Fehler finden?


----------



## Crymes (9. Juni 2012)

Das Kollisions Problem ist jetzt gelöst, alles bewegt sich ohne Reibung reell.
Jetzt gehts daran, eine variable Anzahl an Bälen zu implementieren.


----------



## Crymes (12. Juni 2012)

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:

```
[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]
```


----------



## Mashed (12. Juni 2012)

Du könntest es so machen:

```
[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]
```


----------



## Crymes (13. Juni 2012)

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?

mit extern konte mich nicht anfreunden.


----------



## bingo88 (13. Juni 2012)

Naja, was du der Funktion nicht als Parameter mitgibst, musst du entweder per extern oder - im Falle von Klassen - über Klassenvariablen (Attribute) bereitstellen.


----------



## Mashed (14. Juni 2012)

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.


----------



## Skysnake (14. Juni 2012)

Crymes schrieb:


> 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?
> 
> ...


 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.


----------



## Crymes (14. Juni 2012)

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. 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


----------



## Skysnake (15. Juni 2012)

Ja, und OpenGL ist nicht Threadsave!!!


----------



## DarkMo (15. Juni 2012)

bei mir hatte ich das so gelöst:

```
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

```
Tick = GetTickCount();
FrameTickCount = GetTickCount();
```
(dazu #include <time.h> nich vergessen)
und dann pro berechnetem frame (also jedesmal wenn du nen bild malst) das hier:

```
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.

```
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:

```
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)

```
// 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:

```
// 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

```
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:

```
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 ^^


----------



## Crymes (15. Juni 2012)

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!


----------



## fadade (15. Juni 2012)

Crymes schrieb:


> 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 .... 



Crymes schrieb:


> 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^^



Crymes schrieb:


> Jetzt wir aber erstmal das schöne Wetter genossen!


 
bei mir regnets wie aus strömen momentan


----------



## Crymes (15. Juni 2012)

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:


```
[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


----------



## DarkMo (15. Juni 2012)

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:

```
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 ^^


----------



## Crymes (16. Juni 2012)

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:


```
[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?

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?


----------



## Skysnake (16. Juni 2012)

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.


----------



## Crymes (17. Juni 2012)

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.

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:


```
[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?


----------



## Skysnake (17. Juni 2012)

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.


----------



## Crymes (17. Juni 2012)

Ich poste mal die ganze Funktion, wenn benötigt kan ich auch das ganze Projekt anhängen.


```
[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?


----------



## Skysnake (17. Juni 2012)

Ok, ich sag schon mal im Voraus sorry, denn ich muss dir da jetzt wohl doch ein bischen den Kopf waschen, und sei froh, dass das jetzt einer meiner macht. Da sind son paar Sachen drin, die macht man einfach nicht, und da MUSS dir auch mal der Kopf für gewaschen werden. Ne Knarre steckt man sich auch nicht in den Mund, egal ob gealden oder ungeladen, egal ob zum Spaß oder nicht... Man macht es einfach nicht...

Also 1. wenden wir uns mal deinem "Speicherplatz" zu 

Sorry, hast du dir überhaupt Gedanken gemacht, was du da tust? 
Weißt du überhaupt welche Konsequenzen das hat, dass du unsigned short nimmst?
Wieviel Speicherplatz sparst du denn damit überhaupt, und welches Datenformat hat denn .size()?
Wieviel Speicher hat denn dein PC, oder selbst ein Popel-Handy? Ist das also relevant?

2.
Was machst du denn mit dem if(sqrt...) ???
Sorry, aber ich versteh da wirklich nicht den Sinn drin. Das sieht ziemlich abgefahren aus und ist absolut unverständlich, was du da machst. Das sieht eher so aus, als ob du über die Liste iterieren willst, aber das solltest du am Besten vor dem Auswerten per if machen. Sorry aber sehr sehr sehr unverständlicher Code. Wenn man so was "tricky" macht, dann sollte man das Kommentieren, sonst rafft das niemand. Gewöhn dir das allgemein an. Du UND jeder andere sollte auch in einem Jahr noch den Code verstehen.

3. 
balliste.size() wird wahrscheinlich ein int zurück geben. Du musst damit ein Typecast von int nach unsignedshort machen. Das ist relativ einfach, da du einfach die forderen Bits nur wegschmeisen musst, womit dich die Sache keine Performance kosten wird, aber ich erwähns lieber trotzdem, weil du sicherlich auch mal auf die Idee kommen wirst ein Int und Flaot zu vergleichen, und das ist für die Pipeline/Perofrmance tödlich, weil du dann einen echten Typecast machen musst, der nicht so schnell erledigt ist, und damit deine Pipeline geleert wird. Nicht gut.
Daher in for Schleifen möglichst immer im Header die gleichen DAtenypen vergleichen.


----------



## Crymes (17. Juni 2012)

Also, ich hänge mal das komplette Projekt an, da wird sich hoffentlich zur Verständlichkeit vieles klären.
Mit der Typumwandlung beim Vergleichen der Variablen - das ist ein guter Hinweis, da werde ich noch einiges ändern müssen.

Kurze zusammenfassung: Wenn ein neuer Ball hinzugefügt werden soll, wird geschaut, wo Platz dafür ist. Ist kein Platz, wird der Ball nach rechts und mit jeder neuen Zeile stückweise nach oben geschoben, bis Platz frei ist. Ist kein Platz frei, wird der Radius verkleinert.
Die anderen Funktionen sollten eigentlich selbstverständlich sein.

Ich hoffe mal, dass da nicht noch allzu viele primitive Fehler drin sind.


----------



## fadade (17. Juni 2012)

Also ich muss mich jetz nach dem betrachten des Projeks Skysnake auch ein wenig anschließen. Man versteht zwar (häufig) was gemacht wir, aber deine Programmierweise ist noch nicht so ... "ausgereift". Vielleicht wäre jetzt dann mal ein guter Zeitpunkt statt neuen Dingen mal die alten zu überarbeiten/aufzuräumen/zu kommentieren. Die Tipps von Skysnake sind da schonmal ein Anfang.

Muss ja nicht perfekt sein, denn gut Programmieren tun und können nur wenige und Fehler sind zum Lernen da 

Das mit dem Speicher ist allerdings richtig üblicherweise hat man heute so viel RAM, dass da short statt int zu nehmen keinen Sinn macht. Aber der *Gedanke an Speicheroptimierung ist auf jeden Fall richtig!!!* Denn wenn jetzt jeder sagt: Ach wir hamm ja eh genug, die Hardware macht das schon ....


----------



## Crymes (17. Juni 2012)

OK, dann werde ich mal noch ein paar Kommentarzeilen hinzufügen.
Das mit den kleinen int hab ich jetzt geändert.


----------



## Crymes (17. Juni 2012)

Ich hab mal den Code auskommentiert und ein Bild von VS gemacht: Das Programm kommt immer wieder zu dem Haltepunkt und ich hab keinen Plan, wie der Wert von der Variable stelle zustande kommt.

PS: ein paar Schleifen wariablen hab ich wieder auf unsigned gesetzt, da VS sonst als Bemerkung andeutet, dass vector.size() eienn unsigned int zurückgibt.

Überarbeiteter Code und Bild im Anhang.


----------



## Skysnake (17. Juni 2012)

fadade schrieb:


> Also ich muss mich jetz nach dem betrachten des Projeks Skysnake auch ein wenig anschließen. Man versteht zwar (häufig) was gemacht wir, aber deine Programmierweise ist noch nicht so ... "ausgereift". Vielleicht wäre jetzt dann mal ein guter Zeitpunkt statt neuen Dingen mal die alten zu überarbeiten/aufzuräumen/zu kommentieren. Die Tipps von Skysnake sind da schonmal ein Anfang.
> 
> Muss ja nicht perfekt sein, denn gut Programmieren tun und können nur wenige und Fehler sind zum Lernen da
> 
> Das mit dem Speicher ist allerdings richtig üblicherweise hat man heute so viel RAM, dass da short statt int zu nehmen keinen Sinn macht. Aber der *Gedanke an Speicheroptimierung ist auf jeden Fall richtig!!!* Denn wenn jetzt jeder sagt: Ach wir hamm ja eh genug, die Hardware macht das schon ....


 Klar sollte man sich über Speicher gedanken machen, aber nur dort wo es auch Sinn macht, und bei For-Schleifen macht es halt absolut keinen Sinn. 

Wenn ich MEgabyte weise Daten hab, kann ich darüber nachdenken, bei einzelnen VAriablen machts kaum Sinn. Da handel ich mir eher PRobleme ein, weil irgendwann mal nen Integer-Overflow passiert und ich es nicht merke, was dann RICHTIG assig zu debuggen ist.

Man sollte allgemein halt immer bischen die Sinnhaftigkeit von Optimierungen im Hinterkopf behalten, und dann für echte Optimierungen am Besten einen Profiler nutzen. Der zeigt dann auch, wo es wirklich sinn macht zu optimieren.


----------



## Crymes (18. Juni 2012)

So, jetzt gibts erstmal was zum staunen (zumindest ich war total geflasht, wieviel Leiszung mein Netbook hat und dass nichts abgestürzt ist!)

Ich Präsentiere:  Meine erste Demo mit variablen Code. Ist noch im Ballsystem verbuggt und die Kollision uinztereinander hab ich auch wegen Bugs rausgenommen, sonst aber -finde ich-total beeindruckend.

Demo im Anhang.

Wichtig:"n" fügt einen Ball hinzu, "l" löscht einen Ball.    
Viel Spaß beim Probieren!


----------



## DarkMo (18. Juni 2012)

wuff, e weng fix die jungs ^^ aber viele bunte bälle und sie erkennen den rand richtig *g* es geht vorran


----------



## Crymes (19. Juni 2012)

Sagt mal, gibt es in dem Template vector sowas wie Zugriffsberechtigungen oder Schreibschutz, der standartmäßig aktiv ist?

Mein Problem ist, dass funktionierender, kopierter und leicht abgeänderter code nicht laufen will! Hier sind die 2 Versionen:


```
for(int 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];
}
```
Funktioniert einwandfrei, ball ist eine Instanz eines structs.


```
for(int c=0;c<=1;c++)
{
liste[n].position[c] = liste[n].position[c] - 0.01 * liste[n].geschwindigkeit[c];
liste[x].position[c] = liste[x].position[c] - 0.01 * liste[x].geschwindigkeit[c];
}
```
Funktioniert nicht (der Positionswert ändert sich nicht), liste ist ein vector.


----------



## Crymes (19. Juni 2012)

Ok, ich hab den Fehler gefunden und könnt mich sowas von aufregen
Ich hatte vergessen, nach jeder Ballvoneinanderwegschieb Iteration den Abstand neu auszurechnen, die Schleife konnte also nie beendet werden!

Dann hab ich noch eine Variable hinzugefügt, ab einer gewissen Länge hinter dem Gleichheitszaichen geht folgendes nicht mehr, es kommt ein komischer Wert raus: b = b*b+b/b-b   Wahrscheinlich ist in dem Speicher von b schon der neue Wert reingeschrieben, bevor mit den Alten fertig gerechent wurde.

Aber schaut euch erstmal folgende Demo an im anhang an, die Tastenbelegung hat sich nicht geändert.

Jetzt sind nur noch unentdeckte Bugs im Ballverwaltungs und Erstellungssystem und vielleicht muss ich die Randerkennung verbessern, damit das Quetschen und anschließende wegflutschen der Bälle aufhört 

Viel Spaß beim Probieren!


----------



## DarkMo (19. Juni 2012)

b = b*b+b/b-b <- wadn dat? ^^

```
b = b*b+b/b-b
  = b*b+1-b
  = 1+b*b-b
  = 1+b*(1*1-1)
  = 1+b*(1-1)
  = 1+b*0
  = 1
```
kommt das hin? ><

btw sin die bälle bei mir immernoch vieeeeel zu schnell :/ wolltest du das nich fps-unabhängig machen? kommt mir so vor, als würden die sich pro frame ne gewisse distanz bewegen, un ned pro zeiteinheit.


----------



## Crymes (19. Juni 2012)

Das mit den bs war nur ein Beispiel, dass wenn man mit die gleiche Variable als Ziel der eigenen Berechnungen hat, Mist rauskommt.
So würds gehen: bx = b*b+b/b-b. Dann wirds in bx geschrieben und b hat immer den gleichen Wert.

Das mit der Geschwindigkeit, da hast du Recht, das hängt nur von der Rechenleistung ab. (Ich programmier aufm Netbook mit AMD fusion (1 GHZ), da ist des alles in Gefühlter "Echtzeit"

Wenn das bei euch aber nicht gescheit läuft muss ich dem mal mehr Priorität einräumen und das vor dem Verwaltungspro9blem lösen.
Werde mir da nochm al deinen Post anschauen.

Jetzt wird aber erstmal BBC2 gezockt, des is wesentlich besser als des 3er.

Das Problem ist nur, wenn man selber program,iert, denkt man über die Dinge wie den "Knife Bug" im spiel ganz anders nach


----------



## bingo88 (19. Juni 2012)

DarkMo schrieb:


> b = b*b+b/b-b <- wadn dat? ^^
> 
> ```
> b = b*b+b/b-b
> ...


wenn schon, dann b * b - b = b * (b - 1)


----------



## Crymes (19. Juni 2012)

Wenn wir schon beim Thema sind: Wir ham in der Schule Son Nspire CAS, der kann Gleichungen lösen. 
Gibts da irgendeinen Trick wie man so etwas programmiert?


----------



## bingo88 (19. Juni 2012)

Ich kenne mich nur mit dem numerischen Lösen von Gleichungen aus (z. B. Iterationsverfahren), das reicht von super simpel bis relativ hässlich ^^


----------



## Skysnake (19. Juni 2012)

Du meinst wohl eher von etwas weniger hässlich, weil man vieles nicht beachtet bis hin zu OMFG hässlich


----------



## bingo88 (19. Juni 2012)

Skysnake schrieb:


> Du meinst wohl eher von etwas weniger hässlich, weil man vieles nicht beachtet bis hin zu OMFG hässlich


Ach, rechnet man halt ein wenig mehr "pi-mal-Daumen" wenn's dafür schöner aussieht


----------



## fadade (20. Juni 2012)

Wollte ich auch schonmal machen, aber if (ordentlich_werden_soll) aufwand_zu_groß;
Ansonsten hab ich irgendwann mal ein paar Codebeispiele für einen Texas Instruments gefunden (in C), kannst ja nochmal suchen ...
Aber um ein eigenes Mathe-Framework kommt man mehr oder weniger nicht rum


----------



## Crymes (20. Juni 2012)

so, jetzt ma wieder zurück zum Thema

Ich hab jetzt das Problem gefixt, dass es bei euch so läuft wie bei mir, findet ihr den Code so in Ordnung? (zende und zanfang sind Globale doubles) :

```
void bewegung()
{
//Nur wenn es was zum Berechnen gibt (Bälle vorhanden sind)
if(ballliste.size() > 0)
{
//Zeit nach den Berechnungen
zende = clock();
//Zeitdifferenz 
double zdifferenz = zende - zanfang;

//Zeit vor den Berechnungen, gemessen wird die Zeit, bis die Funltion bewegung() wieder aufgerufen wird, also alles andere berechnet ist
zanfang = clock();
//Zeitdifferenz in Millisekunden
double zdifferenzn = zdifferenz / CLOCKS_PER_SEC;

//Neue Positionen ausrechnen, 12mal, da die Geschwindigkeit von 20 Pixeln pro Sekunde sehr langsam ist; Fix bei Geschwindigkeit=0 noch ausstehend
for(unsigned int i=0; i<ballliste.size();i++)
{
ballliste[i].position[0] = ballliste[i].position[0] + 10 * (ballliste[i].geschwindigkeit[0] * zdifferenzn);
ballliste[i].position[1] = ballliste[i].position[1] + 10 * (ballliste[i].geschwindigkeit[1] * zdifferenzn);
} 
}
}
```
 
Stimmt mein Verdacht, dass das Programm nach langer Laufzeit abstürzen wird, da zende und zanfang einen zu Großen Wert bekommen?

Genug Theorie, im Anhang gibts was praktisches, Tastenbelegung hat sich niocht geändert


----------



## Crymes (20. Juni 2012)

Hab den Code jetzt so geädert, da sonst der erste Ball irgendwo Platziert worden ist:

```
//Zeitmessvariablen
double zanfang = 0, zende = 0, zdifferenz = 0;
void bewegung()
{ 
//Zeit nach den Berechnungen
zende = clock();
//Zeitdifferenz 
zdifferenz = zende - zanfang;

//Zeit vor den Berechnungen, gemessen wird die Zeit, bis die Funltion bewegung() wieder aufgerufen wird, also alles andere berechnet ist
zanfang = clock();
//Zeitdifferenz in Millisekunden
zdifferenz = zdifferenz / CLOCKS_PER_SEC;
//Nur wenn es was zum Berechnen gibt (Bälle vorhanden sind)
if(ballliste.size() > 0)
{ 
//Neue Positionen ausrechnen, 12mal, da die Geschwindigkeit von 20 Pixeln pro Sekunde sehr langsam ist; Fix bei Geschwindigkeit=0 noch ausstehend
for(unsigned int i=0; i<ballliste.size();i++)
{
ballliste[i].position[0] = ballliste[i].position[0] + 10 * (ballliste[i].geschwindigkeit[0] * zdifferenz);
ballliste[i].position[1] = ballliste[i].position[1] + 10 * (ballliste[i].geschwindigkeit[1] * zdifferenz);
} 
}
}
```
 
Was denkt ihr ist besser: Die Zeitvariablen global zu definieren oder bei jedem Aufruf der Funktion bewegung zu Prüfen, ob die schon initialisiert sind?


----------



## DarkMo (20. Juni 2012)

woah! det is ja wie ne lavalampe *eine rauch - wenn ich raucher wär*  also ich finds doll ^^


----------



## Crymes (20. Juni 2012)

Grad windows Phone summit geschaut  - Windiows Phone 8 unterstützt natives C++!!!!!!

Dann wird das mit der App wahrscheinlich noch leichter als ich mirs vorgestellt hab!


----------



## Crymes (21. Juni 2012)

So, des is jetzt wahrscheinlich des größte Problem dieses Projekts:

Bei vielen Bällen auf dem Bilodschirm kann es ein Gerangel geben(die Bälle schießen über den Bildschirm, bis sie wieder Platz ham).
Ich mache es ja gerade so, dass bei einer Überschneidung die Bälle bis zum Schnittpunkt zurückversett werden.

Meint ihr, dass ich das Problem umgehen könnte, wenn ich im Vorraus die Kollision erkenne und per Geradengleichung den Exakten Schnittpunkt berechne?


----------



## Skysnake (22. Juni 2012)

Ja, ist aber, wie ich dir GANZ am Anfang schon mal gesagt habe dann wirklich sehr sehr sehr aufwendig, wenn du wirklich alles richtig berechnen willst.


----------



## Crymes (22. Juni 2012)

vielke andere Möglichkeiten habe ich ja nicht.

Ich werd jetzt mal versuchen, die Kollision im Vorraus zu berechnen (wenn position plus Geschwindigkeit usw.), dann haben die ja auch genug Platz, zumindest theoretisch.


----------



## Crymes (22. Juni 2012)

so, ich hab es jetzt so gemacht, dass die Kollsion um den Bewegungsfaktor vorausgerechnet wird, es verringert die Häufikgeit von einem "Gedrängel", verhindert es aber nicht.

Ich bin jetzt so angekotzt, dass ich es jetzt in Erwägung ziehe, Bullet zu nutzen. Koste es was es wolle! (Außer nerven)


----------



## retarDeD.aNiMaL (22. Juni 2012)

Sieht gut aus!!! Wo soll's denn mal hingehen? (Spiel?) Schon Ideen?


----------



## Crymes (22. Juni 2012)

Irgendwas einfaches - sowas wie:

-Man muss mit dem ein mit der Maus gesteuertes Wesen immer an bestimmte Stellen an den Bildschirmrand bewegen, ohne von den Bällen getroffen zu werden, vll. auch mit Extras

-Man muss Linien zeichnen, damit sich die Bälle nicht berührern

Aber ich will erstmal das verdammte ball Kollisionsproblem gelöst bekommen


----------



## AMD (22. Juni 2012)

Ich versteh dein Problem mit der Kollision nicht? Das bisschen überprüfen mit der Ballkollision dürfte doch eig. keine Probleme machen?!

Btw. Dein upload kann ich nicht ausführen, sehe nur einen schwarzen Bildschirm. Stell es am besten auch mal von den Compiler Settings auf /MT, du hast vermutlich /MTd


----------



## retarDeD.aNiMaL (22. Juni 2012)

AMD schrieb:


> Ich versteh dein Problem mit der Kollision nicht? Das bisschen überprüfen mit der Ballkollision dürfte doch eig. keine Probleme machen?!
> 
> Btw. Dein upload kann ich nicht ausführen, sehe nur einen schwarzen Bildschirm. Stell es am besten auch mal von den Compiler Settings auf /MT, du hast vermutlich /MTd



"N" für neuen Ball gedrückt?


----------



## Crymes (22. Juni 2012)

Wenn links un ten genug Platz für eine Kugel ist, dann drücke "n", um eienn Ball zu löschen "l".
Das Problem tritt ab ca. 10 Bällen auf, wenn sie einen in die Ecke drängen. Dann kommt es zu einer Kampelei und sie fliegen wild über den Bildschirm, bisse wieder Platz ham.   Das zu fixen ist gerade mein Problem.

Hab nochmal nen aktuellen Build angehangen, darin ist ein kleines Problem der Kollision mit den Rändern gefixt und das oben genannte ein wenig eingedämmt, aner nicht gelöst.

Probiers einfach mal aus, pass aber auf, dass du nicht zu viele Bölle auf einmal hinzufügst und sie sich nicht da schon berühren.

Bin sicher, dass das Problem auch bei euch auftritt.


----------



## AMD (22. Juni 2012)

retarDeD.aNiMaL schrieb:


> "N" für neuen Ball gedrückt?


 Ups, mein Fehler ^^


----------



## Crymes (23. Juni 2012)

So, ich hab jetzt eine fertige Demo, die hat jetzt ein vernünftiges Ballverwlatungssystem (Code wurde komplett neu geschrieben).
Probierts einfach mal aus, ihr müsst jetzt nicht mehr aufpassen, wann ihr einen Ball hinzufügt.

Jetzt kann man aber auch verdammt gut den Fehler bei der Ball - Ball Kollision erkennen

Viel spaß beim Probieren!


----------



## Crymes (23. Juni 2012)

Könnt ihr den Fehler nachvollziehen?


----------



## fadade (23. Juni 2012)

um ehrlich zu sein, dieses mal kann *ich *gar nichts nachvollziehen. Sehe nur einen Schwarzen Bildschirm


----------



## Crymes (23. Juni 2012)

Mit der Taste "n" kannst du einen Ball hinzufügen, mit "l" einen löschen.

Wenn das nicht funktioniert, dann habe ich noch ein Problenm mehr.


----------



## Crymes (24. Juni 2012)

Warum wird bei der Variable Bild in glutDisplayString gemeckert dass es keine passende konvertierungsfunktion gibt? Das ist doch ein echter string????

fps ist ein float.


```
void text()
{
//Vaiable für float-Umwandlung
stringstream werte;
werte << "FPS: " << fps;
//Variable für Ausgabe
string bilder = werte.str();

//Ausgabe
glRasterPos2i(5, bbreite - 5);
glutBitmapString(GLUT_BITMAP_TIMES_ROMAN_10, bilder);
}
```


----------



## AMD (24. Juni 2012)

Was ist bitte glutDisplayString? Du meinst du wohl glutBitmapString.
Hier ein kleines Beispiel:

```
char text[20];
    sprintf_s(text, "FPS: %i", fps);

    glRasterPos2i(x, y);
    for (i=0; i<strlen(Text); i++)
        glutBitmapCharacter((void *)0x0008, (int)Text[i]);
```

Anmerkung: Wie du siehst nehme ich glutBitmapCharacter. BitmapString war irgendwie schon immer buggy, egal ob altes glut oder freeglut (so zumindest meine Erfahrung)! Habe mir das auch schon im freeglut Source angeguckt aber irgendwo buggt da was rum. Daher nimm am besten die Ausgabe über einzelne Char's.


----------



## Skysnake (24. Juni 2012)

hey, das kannte ich noch gar nicht 

DANKE. Das hätte ich vor kurzem ECHT richtig gut gebrauchen können. Das werde ich mir auf jeden Fall merken und in Zukunft einsetzen


----------



## DarkMo (24. Juni 2012)

jop! nach sowas hab ich auch gesucht gehabt ^^ kannte nur ne variante über displaylisten, aber die sin ja aus dem modernen ogl rausgeflogen ><


----------



## Crymes (24. Juni 2012)

Habt ihr ne gute Seite, wo OpenGL 4 erklärt ist? Ich wollte eigentlich noch Displaylisten verwenden, wenn die aber jetzt veraltet sind 
Ausserdem sol ja das GL_BEGIN und END auch rausgeflogen sein, durch was wird das ersetzt?


----------



## AMD (24. Juni 2012)

Crymes schrieb:


> Habt ihr ne gute Seite, wo OpenGL 4 erklärt ist? Ich wollte eigentlich noch Displaylisten verwenden, wenn die aber jetzt veraltet sind
> Ausserdem sol ja das GL_BEGIN und END auch rausgeflogen sein, durch was wird das ersetzt?


Lass das lieber bleiben 
Bei deinen paar Bällen ist es zum einen egal und außerdem hast du dann auch deine Matritzen nicht mehr! Dann kannst du das alles selber im Shader machen!


----------



## DarkMo (24. Juni 2012)

ich hatte mir die ogl super bibel gekauft ^^ da isses drin erklärt xD
aber is halt schon bissl schärfer :/ muss mich auch erst dran gewöhnen, aber die möglichkeiten rechtfertigens dann glaube schon ^^ bloß ein bestehendes projekt nochma neu aufziehn... das is ne sch**s arbeit >< ich hatte meins im endeffekt neu aufgezogen. bin auch noch lang ned fertig (arbeit aber nu au ned wien ochs da dran *zugeb* ^^).

das wird im übrigen durch buffer objects ersetzt. bei meinem einen codeschnipsel da im anderen thread (dynamische array erstellung, oder wie er hieß) haste das zum bsp. die generateBatch() methode erzeugt aus allen flächen daten die arrays und baut dadraus dann son vao (VertexArrayObject), was die metadaten quasi (is das jetz richtig? ^^) verwaltet. also alle vbo's und attribute bla unter einem hut zusammenfasst. und die vbo's (VertexBufferObject) sind die einzelnen punktdaten (punkte/vertizes, normalen, farben, texcoords).

im endeffekt behält dass dann die gpu alles in ihrem speicher un muss das ned jedesma erst ausm ram holen - so wie das die displaylisten halt auch gemacht hatten.


----------



## Crymes (24. Juni 2012)

@AMD: Ich hab es mal mit deiner sprint Lösung probiert, da kommt ne komische Zahl raus.

Ich habs jetzt mit der ?Klasse? sstream versucht, da kommt immer ein Lauifzeitfehler:


```
//Variablen zur Umwandlung und Speicherung 
string ausgabe = "";
char bild[20] = "";
stringstream puffer;
//Umwandlung und Zusammensetzung des Strings
puffer << "FPS: " << fps; 
ausgabe = puffer.str();

//String in Char umwandeln
for(unsigned x=0; x<=ausgabe.length(); x++)
{
bild[x] = ausgabe[x];
}

//Ausgabe
glColor3f(1,0,0);
glRasterPos2i(1, bbreite - 18); 
for(unsigned int i=0; i<=strlen(bild); i++)
{
glutBitmapCharacter(GLUT_BITMAP_TIMES_ROMAN_24, bild[i]);
}
```
 
An was liegt das? Ist meine 2Lösung" umständlich oder geht es nicht kürzer?


----------



## AMD (24. Juni 2012)

Warum machst du es nicht so wie ich? ^^
Außerdem vergisst du was bei glutBitmapCharacter. Bei der Ausgabe musst du bild_ noch als (int) casten.


Zumal ich es komisch finde, dass du einen stringstream erstellst, es in einen string machst und dann ein char  Nimm doch gleich char wie ich ^^__
_


----------



## Crymes (25. Juni 2012)

Ich habs ja mit deiner Lösung probiert, da kommen aber komische Werte raus.


----------



## AMD (25. Juni 2012)

Was sind denn komische Werte?


----------



## Mashed (25. Juni 2012)

Du kannst übrigens mit Strings auch direkt den []-Operator verwenden, du musst nicht alles extra in ein Array kopieren.


----------



## Crymes (2. Juli 2012)

So, jetzt gibts mal wieder eine Demo frisch aus der Entwicklung.

Änderungen: FPS- und Ballanzahlanzeige hinzugefügt.

Könnt ja al schreiben, wie viel Bilder pro sekunde bei - sagen wir 10 Bällen, da sonst der Ruckel-Bug auftritt- euer PC schafft.

Ws denkt ihr, wieviel mir Displaylisten und ne externe Textbibliothek bringen werden? Mir fällt grad ein, dass ich die Konsole noch abschalten kann, die frisst laut Taskmanager au viel Leiszung.

Zum Bug: Denkt ihr dass ich ihn beheben kann, wenn ich alle Bälle nacheinander verschieb und die Kollision nach jedem Verschiebungsschritt prüfe? Ich könnte den Code dann umindest nicht mehr paralellisieren


----------



## AMD (2. Juli 2012)

10 Bälle = knapp über 1500fps.

Displaylisten bringen sehr viel. Du hast halt die Daten schon direkt auf der Grafikkarte und musst diese nicht bei jedem Frame neu vom CPU zur Grafikkarte rüberschicken 
Eine Externe Textbibliothek kann schon was bringen, zumal die glut Textausgabe schon nicht so schnell ist aber letztendlich finde ich das eher nicht so entscheident, oder hast du so viel Text, den du ausgeben willst?
Mit der Konsole verwechselst du glaube was ^^
Glut erstellt dir eine Konsole + Fenster aber das wird im Task-Manager als ein Prozess angezeigt. Wenn du also das Fenster entfernst, dann hast du immer noch den selben Prozess.

Achja, das könnte das Problem durchaus lösen. Die nicht vorhandene parallelisierung finde ich eher weniger schlimm, denn die macht ja eben dein Code anfällig für Bugs, da du eben nie weisst, wie sich die anderen Ballpositionen entwickeln


----------



## DarkMo (2. Juli 2012)

ganz ehrlich: solange du bei 1500fps rumgammelst bei einem recht "fertig"-nahen spiel... scheiss doch auf optimierung  also displaylisten als gute übung würd ich noch mitnehmen, aber bei der fpszahl kann man sich nu wirklich zu ner akurateren, aber aufwändigeren berechnung hinreissen lassen.


----------



## AMD (2. Juli 2012)

Aber ich nehme auch einen 2500k + HD5870 - bei einem Netbook sind es bestimmt deutlich weniger 
So eine Displaylist ist ja schneller erstellt als man gucken kann


----------



## Skysnake (2. Juli 2012)

Und vor allem sind 1,5k Frames nicht viel. Ich komm mit ner ähnlichen Sachen, wo ich Quads zeichne und Texturiere auf 5k FPS  Und ich nutze KEINE! Displaylisten.


----------



## Crymes (3. Juli 2012)

Zum Vergleich: Bei meinem Netbook sinds bei 10 Bällen 170 FPS.
Mich interessiert auch mal, wie sich die Displaylisten hier auswirken, da die APU keinen eigenen Grafikspeicher hat sondern den Ram nutzt.
Werd mal sehen, dass ich das heut implementiert bekomme.


----------



## Crymes (3. Juli 2012)

So, ich hab jetzt mit den displaylisten geschafft, ist eigentlich garnicht so schwer.
Erstmal fett gestaunt, als bei meinem Netbook mit 10 Bällen 250 fps rtauskamen und es bei noch mehr Bällen einfach nicht weniger werden wollten

Wäre schön, wenn ihr bei euch nochmal die Fps mit 10 und vll. ein paar mehr Bällen messen könntet, sind immerhin gute 50% mehr Leistung, bei mehr Bällen noch viel mehr!!!

Sowas zu optimieren macht irgendwie am meisten Spaß


----------



## AMD (3. Juli 2012)

Vorher 1500fps bei 10 Bällen, nur 2600.
Bei 50 Bällen noch 2300fps


----------



## Crymes (3. Juli 2012)

Des is komisch, da tut irgendwas noch limitieren. Das Berechnen der Kollision nimmt fast keine Leistung in Anspruch, das muss was anderes sein. Ich erklär das Demo-Projekt hiermit erstmal für abgeschlossen, da ich einfach keine Lösung für den Getümmel-Bug (bei vielen Bällen gibts Überlappungen) finde. Damit ist der 2.Meilenstein vollkommen komplett und ich widme mich jetzt dem eigentlichen Spiel, da brauch ich ja auch nich so viele Bälle.


Mal nebenbei: Habt ihr schonmal von C++ AMP gehört?  Das scheint ein Versuch seitens Microsofts zu sein DirectX weiter zu Verbreiten


----------



## bingo88 (3. Juli 2012)

C++ AMP ist sowas wie opencl oder cuda, nur läuft es halt über DirectX bzw. dx-fähige Hardware. Hat mit Grafik bzw. Spiele also erst einmal nichts zu tun. Naj, ich seh für mich zumindest keinen Grund zu wechseln, zumal ich mehr mit Linux zu tun habe.


----------



## Crymes (3. Juli 2012)

Ich hab mir jetzt ein neues Projekt in der Projektmappe angelegt. 
Wie kann ich die .cpp und .h Dateien aus dem vorherigen Projekt verwenden? Einfach kopieren funktioniert nicht


----------



## bingo88 (3. Juli 2012)

Du musst die am besten im Explorer kopieren (also wie normale Dateien) und dann bei Visual Studio im Projektmappenexplorer auf bestehendes Element hinzufügen klicken (unter dem "Neues Element hinzufügen" Eintrag).


----------



## Crymes (3. Juli 2012)

Ok, hat funktioniert.
Wede mich dann morgen mal mit den Mouse Events in Glut beschäftigen, zum Verschieben der Spielfigur.


----------



## DarkMo (3. Juli 2012)

*aufhorch* berichte ausführlich - sowas such ich auch noch 

hab heute mal mal spaßenshalber fix übder die alte ogl1 version meines ur objectloader teils geschaut (also wo er die mesh-daten aus dem file liest) und da wird nur jede 2. fläche angezeigt :/ najut, bei manchen dingern gehts komischweise. ach was weis ich ^^ aber fetzt scho son bissl. benötigt aber wohl e weng finetuning noch ^^


----------



## Crymes (6. Juli 2012)

So, jetzt gibts ein Update zum aktuellen Fortschritt. 
Probierts aus, die Tasten sind wie gehabt, ihr könnt jetzt auch die Maus benutzen.
Die Demo mag sinnlos erscheinen, ist aber auch taufrisch aus der Entwicklung.

Als nächstes kommt wahrscheinlich ein Münzsystem und Boni, Anregungen fürs fertige Spiel (Gameplaytechnisch) sind gerne willkommen

Ihr könnt ja ne kurze Rückmeldung geben, wies läuft.


----------



## Crymes (7. Juli 2012)

Ich hab mal wieder ne Frage, hab heute das Snake-typische Fress-System integriert.
Wie kann ich mit OpenGL bewerkstelligen, dass bestimmte Objekte immer im Vordergrund sind? Am liebsten würde ich Attribute vergeben.

HAt  das was mit dem "Alpha-Test" zu tun?


----------



## DarkMo (7. Juli 2012)

tiefenpuffer ausstellen -> glDisable(GL_DEPTH_TEST);

opengl zeichnet ein objekt nach dem anderen (logisch ^^). ein schon gezeichnetes objekt wird dann vom nächsten überpinselt. der tiefentest bewirkt nun, dass die z-koordinate im tiefenpuffer gespeichert wird (also für jeden pixel einzeln). mit aktiviertem tiefentest vergleicht er dann die z-werte der schon bestehenden objekte (also das, was im puffer steht) mit denen des neu zu rendernden objekts. is das neue objekt (am jeweiligen pixel) näher an der kamera als alle anderen, dann wird das dortige pixel im color-buffer überschrieben und der tiefenwert im depth-buffer aktualisiert. joa, ohne tiefentes - wird wieder blindlinks übermalt ^^

also erst szene malen, dann gui ohne tiefentest. und glEnable(GL_DEPTH_TEST); nich vergessen ^^


----------



## Skysnake (7. Juli 2012)

Äh du meinst MIT glEnable(GL_DEPTH_TEST)! 

Ansonsten kommts ja auf die Reihenfolge des Zeichnens drauf an, was man eben NICHT will.

Nur bei Spiegelungen stellt man den Depth-Test aus. 

Oder haste das gerade SEHR unglücklich erklärt?


----------



## DarkMo (7. Juli 2012)

naja, wenn er erzwingen will, das irgendwas immer im vordergrund is - beim zeichnen davon depth test aus und er überschreibt alles, was dahinter is. natürlich sollte man sowas am ende der renderei machen. wo es noch sinn machen kann is bei ner skybox (wie auch immer geartet) zu beginn der szene. depthtest aus, skybox malen und dann die szene reingemalt mit reaktiviertem depthtest. da die skybox meist ned allzugroß is, würde mit aktivem depth testing beim malen später die "halbe" szene ned gerendert werden, da sie ausserhalb der skybox läge ^^


----------



## Crymes (8. Juli 2012)

Ok, aber in meiner gesamten 2d-Grafik habe ich keine z-Koordinate.
Sollte ich da noch eine erstellen, sodass die Objekte theoretisch (ist ja nicht sichtbar) hintereinandr lägen?


----------



## Skysnake (8. Juli 2012)

DAS ist halt genau deine Entscheidung als Programmierer/Entwickler 

Wie du siehst, führen viele Wege nach Rom. DarkMo hat dir einen genannt und ich auch. BEIDE! haben ihre Vor- als auch Nachteile. Kommt immer drauf an, wie sich die ganze Sache später weiterentwickeln soll. Oft gibt es sogar einfach zwei gleichwertige Lösungen, wovon die eine schneller ist als die andere (hier wohl das zeichnen am Ende, aber du musst dir halt SICHER! sein, das du danach nichts mehr machst) und manchmal gibt es sogar mehrere Lösungen, die auch noch am Ende gleich schnell sind.

Das sind halt die Entscheidungen, die man fällen muss, und jeder Entscheidung beeinflusst das Gesamtkonzept, weil sich dann manche Sachen geschickt machen lassen, oder eben nicht....

Deswegen macht Softwareengineering auch bei größeren Projekten durchaus Sinn


----------



## Crymes (15. Juli 2012)

So, ich hab das Grundzeugs des Spiels soweit fertig, jetzt fehlt nur noch enn Menü das erscheint wenn man das Spiel startet/stirbt und fragt ob man n och einmal spielen möchte.

Ich arbeite aktuell noch an einem letzten "Extra", dass alle 500 Punkte (Toleranz 10 Punkte) ausgelöst werden soll.
Nur bin ich grad zu blöd, einen Algorithmus zu finden der mir sagt, ob alle 500 Punkte +- 10 erreicht ist.

BSP: Wenn es eine Funktion wäre, dann sollte sie positiv zurückgeben bei z.B. 500, 1000, 1005, 2010, 3009, 8000 und negativ bei z.B. 0, 400, 499, 8011, 4022, 2460 usw.

Fällt euch da was ein?


----------



## drWatson (15. Juli 2012)

Hallo, ich habe deine Spielentwicklung schon eine Weile hier mitverfolgt.
Finde ich ne super Sache und auch ne nette Idee. Ist mal wirklich was, das man mal fix zwischendurch ein Stück spielen kann 
Leider kenne ich mich mit OpenGL nicht so aus, deswegen habe ich mich bisher nicht beteiligen können.
Ich glaube aber, bei deiner aktuellen Frage kann ich dann doch auch mal was beisteuern:

Ich würd das einfach über die Modulo-Funktion regeln. Sprich "Punktestand Modulo 500". Wenn das Ergebnis positiv und kleiner gleich 10 ist, oder zwischen 490 und 499 liegt, hast du deinen +/- 10 Toleranz.
Ich verstehe nur nicht ganz, warum es bei 499 auch negativ zurückliefern soll? Das ist doch +/- 10 von 500?
Ich hoffe, ich konnte dir helfen


----------



## DarkMo (15. Juli 2012)

jop, modulo wär auch mein erster gedanke gewesen.


----------



## Skysnake (16. Juli 2012)

dito


----------



## Crymes (18. Juli 2012)

Sodele, hab jetzt ein kleines Menü integriert und einen Highscore, der auch nach dem Neustart noch gültig ist.
Was würdet ihr mir bezüglich der Verschlüsselung von einer Zahl empfehlen?
EIgnet sich da das Prinzip die Bits mit ^ umzudrehen oder gibts da was besseres? Es muss nicht bombenfest verschlüsselt werden, man sol nur nicht die Datei öffnen können und eine Million reinschreiben damit man dann einen unmöglichen Highscore bekommt.
Gegen Hacker muss der Schutz nicht herhalten, nur gegen "dumme Cheater"


----------



## Crymes (19. Juli 2012)

So, das Spiel ist jetzt komplett fertig, einige skalierungsbugs wurden noch gefixt und die Datei, in der die Punkte gespeichert werden besteht nur aus Buchstaben und Zeichen.
Das mit der OpenCL Implementierung lass ich sein, da der Nutzen ziemlich gering wäre (CPU Limitiert nicht, bei mehreren Bällen verändert sich dioe Framerate nicht).

Als nächstes wird dann - wenn Visual Studio 2012 draußen ist - eine Portierung in eine Metro App vorgenommen (ohne neuen Funktionen), sodass ich das Spiel vll. inm den AppStore von Windows 8 stellen kann.

Wenn dass klappt, wirds vll. noch auf Windows Phone 8 portiert.

Wer den Quelcode oder das fertig kompillierte spiel haben möchte, meldet sich einfach bei mir. Hab nur keine Lust irgendwelchen Leuten die von google hierher kommen das Zeug in den Arsch zu schieben


----------



## Crymes (9. August 2013)

Jetzt muss ich den Thread nochmal auskramen, da ich gerade dabei bin das Ganze unter Linux zu kompilieren.

Ich verwende CodeBlocks mit dem GNU GCC Compiler.
Seltsamerweise sind alle benötigten Bibliotheken schon enthalten gewesen  und die Quelldateien wurden auch alle ohne Fehler kompiliert, beim Linken jedoch kommt folgender Fehler:


```
g++  -o Snake-Klon .objs/ballverwaltung.o .objs/bewegung.o .objs/kollision.o .objs/renderer.o .objs/Snake-Klon.o .objs/spiel.o    
/usr/lib/gcc/x86_64-linux-gnu/4.7/../../../x86_64-linux-gnu/crt1.o: In function `_start':
(.text+0x20): undefined reference to `main'
.objs/renderer.o: In function `displayliste()':
renderer.cpp:(.text+0x17): undefined reference to `glGenLists'
renderer.cpp:(.text+0x2f): undefined reference to `glNewList'
renderer.cpp:(.text+0x39): undefined reference to `glBegin'
renderer.cpp:(.text+0x99): undefined reference to `glVertex2f'
renderer.cpp:(.text+0xb0): undefined reference to `glEnd'
renderer.cpp:(.text+0xb5): undefined reference to `glEndList'
renderer.cpp:(.text+0xca): undefined reference to `glNewList'
renderer.cpp:(.text+0xcf): undefined reference to `glPushMatrix'
renderer.cpp:(.text+0x150): undefined reference to `glScalef'
renderer.cpp:(.text+0x15a): undefined reference to `glBegin'
renderer.cpp:(.text+0x1d2): undefined reference to `glVertex2f'
renderer.cpp:(.text+0x1ed): undefined reference to `glEnd'
renderer.cpp:(.text+0x1f7): undefined reference to `glBegin'
renderer.cpp:(.text+0x20a): undefined reference to `glColor3f'
renderer.cpp:(.text+0x219): undefined reference to `glVertex2i'
renderer.cpp:(.text+0x228): undefined reference to `glVertex2i'
renderer.cpp:(.text+0x237): undefined reference to `glVertex2i'
renderer.cpp:(.text+0x246): undefined reference to `glVertex2i'
renderer.cpp:(.text+0x24b): undefined reference to `glEnd'
renderer.cpp:(.text+0x255): undefined reference to `glBegin'
renderer.cpp:(.text+0x268): undefined reference to `glColor3f'
renderer.cpp:(.text+0x277): undefined reference to `glVertex2i'
renderer.cpp:(.text+0x286): undefined reference to `glVertex2i'
renderer.cpp:(.text+0x295): undefined reference to `glVertex2i'
renderer.cpp:(.text+0x2a4): undefined reference to `glVertex2i'
renderer.cpp:(.text+0x2a9): undefined reference to `glEnd'
renderer.cpp:(.text+0x2b3): undefined reference to `glBegin'
renderer.cpp:(.text+0x2c6): undefined reference to `glColor3f'
renderer.cpp:(.text+0x2d5): undefined reference to `glVertex2i'
renderer.cpp:(.text+0x2e4): undefined reference to `glVertex2i'
renderer.cpp:(.text+0x2f3): undefined reference to `glVertex2i'
renderer.cpp:(.text+0x2f8): undefined reference to `glEnd'
renderer.cpp:(.text+0x302): undefined reference to `glBegin'
renderer.cpp:(.text+0x315): undefined reference to `glColor3f'
renderer.cpp:(.text+0x324): undefined reference to `glVertex2i'
renderer.cpp:(.text+0x333): undefined reference to `glVertex2i'
renderer.cpp:(.text+0x342): undefined reference to `glVertex2i'
renderer.cpp:(.text+0x351): undefined reference to `glVertex2i'
renderer.cpp:(.text+0x356): undefined reference to `glEnd'
renderer.cpp:(.text+0x35b): undefined reference to `glEndList'
renderer.cpp:(.text+0x370): undefined reference to `glNewList'
renderer.cpp:(.text+0x37a): undefined reference to `glBegin'
renderer.cpp:(.text+0x389): undefined reference to `glVertex2i'
renderer.cpp:(.text+0x398): undefined reference to `glVertex2i'
renderer.cpp:(.text+0x3a7): undefined reference to `glVertex2i'
renderer.cpp:(.text+0x3b6): undefined reference to `glVertex2i'
renderer.cpp:(.text+0x3bb): undefined reference to `glEnd'
renderer.cpp:(.text+0x3c0): undefined reference to `glEndList'
renderer.cpp:(.text+0x3d5): undefined reference to `glNewList'
Process terminated with status 1 (0 minutes, 19 seconds)
50 errors, 0 warnings (0 minutes, 19 seconds)
```

und 


```
/usr/lib/gcc/x86_64-linux-gnu/4.7/../../../x86_64-linux-gnu/crt1.o||In function `_start':|
(.text+0x20)||undefined reference to `main'|
.objs/renderer.o||In function `displayliste()':|
renderer.cpp|| undefined reference to `glGenLists'|
renderer.cpp|| undefined reference to `glNewList'|
renderer.cpp|| undefined reference to `glBegin'|
renderer.cpp|| undefined reference to `glVertex2f'|
renderer.cpp|| undefined reference to `glEnd'|
renderer.cpp|| undefined reference to `glEndList'|
renderer.cpp|| undefined reference to `glNewList'|
renderer.cpp|| undefined reference to `glPushMatrix'|
renderer.cpp|| undefined reference to `glScalef'|
renderer.cpp|| undefined reference to `glBegin'|
renderer.cpp|| undefined reference to `glVertex2f'|
renderer.cpp|| undefined reference to `glEnd'|
renderer.cpp|| undefined reference to `glBegin'|
renderer.cpp|| undefined reference to `glColor3f'|
renderer.cpp|| undefined reference to `glVertex2i'|
renderer.cpp|| undefined reference to `glVertex2i'|
renderer.cpp|| undefined reference to `glVertex2i'|
renderer.cpp|| undefined reference to `glVertex2i'|
renderer.cpp|| undefined reference to `glEnd'|
renderer.cpp|| undefined reference to `glBegin'|
renderer.cpp|| undefined reference to `glColor3f'|
renderer.cpp|| undefined reference to `glVertex2i'|
renderer.cpp|| undefined reference to `glVertex2i'|
renderer.cpp|| undefined reference to `glVertex2i'|
renderer.cpp|| undefined reference to `glVertex2i'|
renderer.cpp|| undefined reference to `glEnd'|
renderer.cpp|| undefined reference to `glBegin'|
renderer.cpp|| undefined reference to `glColor3f'|
renderer.cpp|| undefined reference to `glVertex2i'|
renderer.cpp|| undefined reference to `glVertex2i'|
renderer.cpp|| undefined reference to `glVertex2i'|
renderer.cpp|| undefined reference to `glEnd'|
renderer.cpp|| undefined reference to `glBegin'|
renderer.cpp|| undefined reference to `glColor3f'|
renderer.cpp|| undefined reference to `glVertex2i'|
renderer.cpp|| undefined reference to `glVertex2i'|
renderer.cpp|| undefined reference to `glVertex2i'|
renderer.cpp|| undefined reference to `glVertex2i'|
renderer.cpp|| undefined reference to `glEnd'|
renderer.cpp|| undefined reference to `glEndList'|
renderer.cpp|| undefined reference to `glNewList'|
renderer.cpp|| undefined reference to `glBegin'|
renderer.cpp|| undefined reference to `glVertex2i'|
renderer.cpp|| undefined reference to `glVertex2i'|
renderer.cpp|| undefined reference to `glVertex2i'|
renderer.cpp|| undefined reference to `glVertex2i'|
renderer.cpp|| undefined reference to `glEnd'|
renderer.cpp|| undefined reference to `glEndList'|
renderer.cpp|| undefined reference to `glNewList'|
||More errors follow but not being shown.|
||Edit the max errors limit in compiler options...|
||=== Build finished: 50 errors, 0 warnings (0 minutes, 19 seconds) ===|
```

Kennt jemand das Problem ?


----------



## xReadme (9. August 2013)

Hi,
ich benutze kein Codeblocks und weis daher nicht wo du das ändern kannst. Auf jedenfall musst du an deinen Compileraufruf -lopengl32 anhängen, um ihm zu sagen das er diese Library mitbenutzen soll. Dann sollten die fehler weg sein.


----------



## Skysnake (12. August 2013)

nimm einfach den GCC und schreib ein Makefile.

Auch wenns Arbeit ist, du lernst was dadurch, und wirst es immer und immer und immer wieder brauchen, wenn du in Linux Sachen machst.


----------



## Crymes (12. August 2013)

Ok, ich glaub früher oder später werde ich mich eh mit make beschäftigen müssen


----------



## Skysnake (12. August 2013)

Ja, mach es lieber früher als später. Es lohnt sich wirklich!


----------

