2D-Spiel Fragen und Hilfe bei Programmierung

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

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.
 
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.
 
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 .... :daumen2:
 
OK, dann werde ich mal noch ein paar Kommentarzeilen hinzufügen.
Das mit den kleinen int hab ich jetzt geändert.
 
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.
 

Anhänge

  • Variablen Fehler.JPG
    Variablen Fehler.JPG
    88,5 KB · Aufrufe: 104
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 .... :daumen2:
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.
 
So, jetzt gibts erstmal was zum staunen (zumindest ich war total geflasht, wieviel Leiszung mein Netbook hat und dass nichts abgestürzt ist!:daumen:)

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!:daumen:
 
wuff, e weng fix die jungs ^^ aber viele bunte bälle und sie erkennen den rand richtig *g* es geht vorran :daumen:
 
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:

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

HTML:
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.
 
Ok, ich hab den Fehler gefunden und könnt mich sowas von aufregen:ugly::what::hail:
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!:daumen:
 
b = b*b+b/b-b <- wadn dat? ^^
Code:
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.
 
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":lol:

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:D
 
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?
 
Ich kenne mich nur mit dem numerischen Lösen von Gleichungen aus (z. B. Iterationsverfahren), das reicht von super simpel bis relativ hässlich ^^
 
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 :ugly:
 
so, jetzt ma wieder zurück zum Thema:D

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) :
HTML:
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:)
 
Hab den Code jetzt so geädert, da sonst der erste Ball irgendwo Platziert worden ist:
HTML:
//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?:schief:
 
Zurück