Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: Sa Jul 12, 2025 04:43

Foren-Übersicht » Programmierung » Allgemein
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 21 Beiträge ]  Gehe zu Seite 1, 2  Nächste
Autor Nachricht
 Betreff des Beitrags: OnIdle -> Time Based Movement
BeitragVerfasst: Di Nov 28, 2006 02:39 
Offline
DGL Member

Registriert: Di Sep 19, 2006 13:24
Beiträge: 173
Hi,

ich bekomme es immer noch nicht hin..

Habe versucht das TimeBasedMovement aus dem Bomberman Tutorial zu verwenden, manchmal funktioniert es und manchmal funktioniert es nicht...

Meistens ruckelt es total und scheint viel zu große Sprünge zu machen und dann wie nach hinten zu laggen.

Hier die source:

Code:
  1.  
  2. procedure TForm1.IdleHandler(Sender: TObject; var Done: Boolean);
  3. begin
  4. if started = true then
  5.  begin
  6. QueryPerformanceCounter(StartCount);
  7. DeltaT := -(EndCount-StartCount)/CounterFreq*100;
  8.  
  9. // up / down = booleans die sagn ob der Balken hoch oder runter bewegt wird.
  10.  if (up2 = true) and (block2 >= 0) then block2 := round(block2 - 5 * DeltaT);
  11.  if (down2 = true) and (block2 <= 340) then block2 := round(block2 + 5*DeltaT);
  12.  if (up1 = true) and (block1 >= 0)then block1 := round(block1 - 5*DeltaT);
  13.  if (down1 = true) and (block1 <= 340) then block1 := round(block1 + 5*DeltaT);
  14.  //Wenn es ein normaler Durchlauf ist
  15.  if new = false then
  16.  begin
  17.  if (time > 2000) and (random(500) = 50) then CreateItem;
  18.  time := time + 1;
  19.  if time > 2000 then PaintItem := false;
  20.  delay := 0;
  21. // ball : Tpoint = aktuelle Position des Balles, v : Tpoint = Richtungsvektor des Balles (2D)
  22.  ball.x := ball.x + -v.x * 3 * speed*DeltaT;
  23.  ball.y := ball.y + -v.y * 3 * speed*DeltaT;
  24.  collusion;
  25.   Paint(block1,block2,ball);
  26.  end
  27. //wenn es ein Durchlauf nach einem Punkt ist (kurze Pause)
  28. else
  29.  begin
  30.  Paint(block1,block2,ball);
  31. // Anzeige der Schussrichtung des Balles
  32.  image1.Canvas.Pen.Color := clred;
  33.  image1.Canvas.MoveTo(round(ball.x+7+20*delay*-v.x),round(ball.y + 7+20*delay*-v.y));
  34.  delay := delay + 1;
  35.  if delay < 50 then image1.Canvas.LineTo(round(ball.x + 7+30*delay*-v.x),round(ball.y + 7+30*delay*-v.y));
  36.  if delay = 50 then new := false;
  37.  end;
  38. Done:=false;
  39. QueryPerformanceCounter(EndCount);
  40. end;
  41. end;
  42.  


Übrigens zeigt mir nen eingesetzter counter das die Geschwindigkeit der OnIdle Schleife auf ein zehntel reduziert wird wenn das Spiel gestartet wird (und es ist nur ein recht simpel umgesetztes Pong!)

Würde mich freuen wenn mir da jemand helfen kann.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Nov 28, 2006 12:06 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Jun 20, 2003 13:59
Beiträge: 134
Hallöle.
Also ich seh jetz auf die schnelle keinen fehler.
Aber du könntest ja mal dazuschreiben was du änderst damit es funzt und wie es sich verhält wenn du das TBM rausnimmst.

_________________
ghost-site.de


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Nov 28, 2006 13:02 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Also als Verbesserungsvorschlag fürs nächste Mal. Eine etwas genauere Beschreibung kann nie schaden vor allem da deine ein wenig wirr ist. Und Einrückungen im Code sind auch nicht zu verachten. Das ist nicht böse gemeint also versteh das bitte nicht falsch. Das sind aber alles Dinge die es uns einfacher machen dir eine Antwort zu geben. Und das ist ja dein erklärtes Ziel. ;-)

Bzw was meinst du damit, dass die Geschwindigkeit runter geht sobald ein Spiel gestartet wird? Erkläre das mal bitte für jemanden der deine Anwendung nicht kennt!

Aber wenn ich mir den Code so anschaue habe ich das Gefühl, dass deine Zeichenaktionen gar nicht in die Messungen mit einfließen. Gehen wir mal theoretisch an den Code.
- Du misst eine StartZeit.
- Du berechnest ein Delta anhand der Zeitwerte
- Du misst eine EndZeit

So gesehen mag das fast stimmt aber überlege mal welche Werte die StartZeit und die EndZeit zum Zeitpunkt der Berechnung haben. Die StartZeit wurde schon neu gemessen wärend die EndZeit noch "alt" ist. Somit beträgt deine gemessene Zeitspanne den Bereich den das Ende der Idle Methode bis zum Anfang der Idle Methode benötigt. Also zu gut Deutsch die Zeit die Windows zum Auslösen der Idle Methode benötigt. Deine Zeichnerei bleibt dabei vollkommen außen vor.

Zum Ändern genügt es, wenn du das Messen deiner StartZeit nach der Berechnung durchführst. Somit bekommst du für deine nächste Berechnung genau den Zeitbereich den du zum Zeichnen gebraucht hast. Du musst aber beachten, dass dadurch deine EndZeit wieder größer ist als die StartZeit. Sprich du musst das Vorzeichen davon nicht mehr umdrehen.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Nov 28, 2006 13:40 
Offline
DGL Member

Registriert: Di Sep 19, 2006 13:24
Beiträge: 173
Ok, vielen Dank erstmal für deine Antwort. Ja ich sehe auch gerade das ich den Code schlecht formatiert habe, normalerweise mache ich das alleine damit ich durchsteige.

Das ganze ist ein Pong-Clone und ich zähle die OnIdle durchläufe, wenn ich nichts render also eigentlich garnichts in der Schleife ausgeführt wird ist sie 10 mal schneller als wenn ich rendere und ebend den Inhalt der Schleife ausführe.

Ich habe nun Start und End getauscht, das ganze sieht so aus:

Code:
  1.  
  2. procedure TForm1.IdleHandler(Sender: TObject; var Done: Boolean);
  3. begin
  4. QueryPerformanceCounter(EndCount);
  5. if started = true then
  6.  begin
  7.  DeltaT := (EndCount-StartCount)/CounterFreq*100;
  8.  if (up2 = true) and (block2 >= 0) then block2 := round(block2 - 5 * DeltaT);
  9.  if (down2 = true) and (block2 <= 340) then block2 := round(block2 + 5*DeltaT);
  10.  if (up1 = true) and (block1 >= 0)then block1 := round(block1 - 5*DeltaT);
  11.  if (down1 = true) and (block1 <= 340) then block1 := round(block1 + 5*DeltaT);
  12.  if new = false then
  13.   begin
  14.   if (time > 2000) and (random(500) = 50) then CreateItem;
  15.   time := time + 1;
  16.   if time > 2000 then PaintItem := false;
  17.   delay := 0;
  18.   ball.x := ball.x + -v.x * 3 * speed*DeltaT;
  19.   ball.y := ball.y + -v.y * 3 * speed*DeltaT;
  20.   collusion;
  21.   Paint(block1,block2,ball);
  22.   end
  23.  else
  24.   begin
  25.   Paint(block1,block2,ball);
  26.   image1.Canvas.Pen.Color := clred;
  27.   image1.Canvas.MoveTo(round(ball.x+7+20*delay*-v.x),round(ball.y + 7+20*delay*-v.y));
  28.   delay := delay + 1;
  29.   if delay < 50 then image1.Canvas.LineTo(round(ball.x + 7+30*delay*-v.x),round(ball.y + 7+30*delay*-v.y));
  30.   if delay = 50 then new := false;
  31.   end;
  32.  Done:=false;
  33.  end;
  34. QueryPerformanceCounter(StartCount);
  35. end;
  36.  

Gerade lief es bei mir was ich als gutes Zeichen betrachte.

Vielen Dank für deine Hilfe.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Nov 28, 2006 14:09 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
OnIdle mit dem Rückgabeparameter Done auf False wird immer dann aufgerufen wenn deine Anwendung nicht zu tun hat. Wenn du also nichts zeichnest dann ist es doch logisch, dass es wesentlich schneller aufgerufen wird. Oder?

Hmmmm. An deinem Code hat sich rein gar nicht geändert außer, dass die Variablen vertauscht wurden. Das eigentliche Problem besteht aber doch weiterhin. Und zwar ist die Reihenfolge doch noch genau so wie ich es in meimen vorherigen Post beschrieben habe.

Um die ganze Sache mal abzukürzen hier mal der Code wie es eigentlich aussehen sollte.

Code:
  1. procedure TForm1.IdleHandler(Sender: TObject; var Done: Boolean);
  2. begin
  3.   // Zu erst berechnen
  4.   DeltaT := (EndCount - StartCount) / CounterFreq * 100;
  5.  
  6.   // StartZeit messen
  7.   QueryPerformanceCounter(StartCount);
  8.  
  9.   // Hier zeichnen und was auch immer
  10.  
  11.   // EndZeit messen
  12.   QueryPerformanceCounter(EndCount);
  13. end;


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Nov 28, 2006 16:06 
Offline
DGL Member

Registriert: Di Sep 19, 2006 13:24
Beiträge: 173
Ah da hatte ich dich falsch verstanden.

Nun habe ich es wie folgt geändert:

Code:
  1.  
  2. procedure TForm1.IdleHandler(Sender: TObject; var Done: Boolean);
  3. begin
  4. DeltaT := (EndCount-StartCount)/CounterFreq*100;
  5. QueryPerformanceCounter(StartCount);
  6. if started = true then
  7.  begin
  8.  if (up2 = true) and (block2 >= 0) then block2 := round(block2 - 5 * DeltaT);
  9.  if (down2 = true) and (block2 <= 340) then block2 := round(block2 + 5*DeltaT);
  10.  if (up1 = true) and (block1 >= 0)then block1 := round(block1 - 5*DeltaT);
  11.  if (down1 = true) and (block1 <= 340) then block1 := round(block1 + 5*DeltaT);
  12.  if new = false then
  13.   begin
  14.   if (time > 2000) and (random(500) = 50) then CreateItem;
  15.   time := time + 1;
  16.   if time > 2000 then PaintItem := false;
  17.   delay := 0;
  18.   ball.x := ball.x + -v.x * 5 * speed*DeltaT;
  19.   ball.y := ball.y + -v.y * 5 * speed*DeltaT;
  20.   collusion;
  21.   Paint(block1,block2,ball);
  22.   end
  23.  else
  24.   begin
  25.   Paint(block1,block2,ball);
  26.   image1.Canvas.Pen.Color := clred;
  27.   image1.Canvas.MoveTo(round(ball.x+7+20*delay*-v.x),round(ball.y + 7+20*delay*-v.y));
  28.   delay := delay + 1;
  29.   if delay < 50 then image1.Canvas.LineTo(round(ball.x + 7+30*delay*-v.x),round(ball.y + 7+30*delay*-v.y));
  30.   if delay = 50 then new := false;
  31.   end;
  32.  Done:=false;
  33.  end;
  34. QueryPerformanceCounter(EndCount);
  35. end;
  36.  


Jedoch scheint das nichts zu ändern ausser das die Geschwindigkeit etwas runter geht. (Der Ball "lagt" immernoch daher ist mal etwas schneller und mal etwas langsamer und springt mir über die Kollisions-Abfrage hinweg)


Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Nov 28, 2006 17:29 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 02, 2004 19:42
Beiträge: 4158
Programmiersprache: FreePascal, C++
Was gut sein könnte ist, dass die Round-Funktion mist rauswirft. Rundungsfehler können manchmal gaanz miese sachen machen. Sonst: Was ist DeltaT für ein Datentyp? Vielleicht ist der einfach zu ungenau, was vorallem bei dem PerformanceCounter heftig sein kann, da der ja wenn ich mich recht erinnere, ziehmlich genaue werte rauswirft.

(Außerdem noch ein Tipp: Nimm OpenGL, die Canvas-Funktionen sind zu lahm :wink: )

Gruß Lord Horazont

_________________
If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung.
current projects: ManiacLab; aioxmpp
zombofant networkmy photostream
„Writing code is like writing poetry“ - source unknown


„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Nov 28, 2006 17:53 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Also ich habe mal ein bisschen rumgespielt und bei dem Ball nur mal die X Werte durchgelassen bzw auch mal ein Sleep (30) eingefügt. Abgesehen davon, dass der Ball ziemlich schnell war konnte man sehen, dass die Bewegungen Gleichmäßig waren. Ich denke mal, dass das Problem da eher in deiner Kollision bzw den ganzen berechnungen liegt. Die schaue ich mir so jetzt aber mal nicht an. ;-)

Zitat:
(Außerdem noch ein Tipp: Nimm OpenGL, die Canvas-Funktionen sind zu lahm)

Langsamer ja aber zu Lahm ist wohl eher Ansichtssache.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Nov 28, 2006 17:55 
Offline
DGL Member

Registriert: Di Sep 19, 2006 13:24
Beiträge: 173
DeltaT ist ein single, habs gerade mal testweise auf double erweitert aber der Fehler bleibt.

Hm was könnte ich gegen Rundungsfehler machen? Habe das System im Rechnen igentlich immer für unfehlbar gehalten :S

Ja ich habe damit angefangen als ich noch kein OpenGl konnte, will es auch umschreiben, das kommt gleich nach OnIdle statt Timer und äh Internetfähigkeit :D

Sei froh das du nicht meine alte Source gesehen hast in der ich das Bild mit "canvast.lineto" in ner doppelten for to Schleife "geleert" hatte ;)

EDIT:
@Lossy:
Ich habe bei mir gerade das selbe gemacht und der Ball ruckelt auch wenn ich nur die x Werte durchlasse. Und auch wnn ich den Inhalt der Kollision ausklammere.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Nov 28, 2006 22:07 
Offline
DGL Member

Registriert: Di Jun 06, 2006 09:59
Beiträge: 474
ich würde die Zeit nur 1x pro frame messen, und immer die differenz zum vorherigen frame bilden. Außerdem würde ich DeltaT auf Zeiten zwischen 0 und 0.1 sec beschränken hier habe ich das ganze für gettickcount beschrieben, lässt sich jedoch leicht auf bessere counter umschreiben.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Nov 28, 2006 22:36 
Offline
Ernährungsberater
Benutzeravatar

Registriert: Sa Jan 01, 2005 17:11
Beiträge: 2068
Programmiersprache: C++
gucky hat geschrieben:
Hm was könnte ich gegen Rundungsfehler machen? Habe das System im Rechnen igentlich immer für unfehlbar gehalten :S

Addier mal:
4E-3
9E-1
9E-4
9E-2
4E-3
per Hand und du hast nur 2 Stellen zum Rechnen. An der Stelle wirst du merken, dass sogar simple Additionen Rechenfehler verursachen.

PS: Ich weiss das das Zahlenbeispiel doof ist ;)

_________________
Steppity,steppity,step,step,step! :twisted:
❆ ❄ ❄ ❄ ❅ ❄ ❆ ❄ ❅ ❄ ❅ ❄ ❅ ❄ ❄
❄ ❄ ❄ ❅ ❄ ❄ ❄ ❅ ❄ ❄ ❆ ❄ ❄


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Nov 28, 2006 22:52 
Offline
DGL Member

Registriert: Do Mai 30, 2002 18:48
Beiträge: 1617
Die Sache mit den Rundungsfehlern ist sogar noch viel Schlimmer:
Karl Nickel hat geschrieben:
* Der (naive) Anfänger glaubt an jede Ziffer
* Der (erfahrene) Programmierer vertraut auf die Hälfte der Ziffern
* Der (wissende) Pessimist mißtraut sogar dem Vorzeichen

Um den letzten Punkt zu beweisen, rechne man in 16 Stellen Genauigkeit:
1.0e20 + 17 -10 +130 - 1.0e20
Man permutiere die Reihenfolge der Summanden und erhält die Ergebnisse: 0, 120, 137, -10 und vielleicht noch ein paar mehr. (Das Beispiel ist aus M.Herrmann Numerische Mathematik. Hab ich mir nicht selbst aus den Fingern gesogen). Ein paar Beispiele für Katastrophen die aus solchen Rechnungen entstanden finden sich hier:
http://wwwzenger.informatik.tu-muenchen ... /bugs.html
Die Seite sollte man mal gelesen haben, wenn man mit Computern rechnet ;-)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Nov 29, 2006 00:44 
Offline
DGL Member

Registriert: Di Sep 19, 2006 13:24
Beiträge: 173
Ihr überfordert mich!

Ich verstehe in keiner euren Rechnungn E, ich kenne nur x^e.. oder |E von |R

@The-Winner:
Ich messe die ja nur einmal pro frame, jeder durchlauf der OnIdle procedure sollte ja einer sein oder nicht?

Werde mir mal dein example angucken.

Edit:
Habs mal so umgeschrieben:
Code:
  1.  
  2. procedure TForm1.IdleHandler(Sender: TObject; var Done: Boolean);
  3. begin
  4. QueryPerformanceCounter(StartCount);
  5. DeltaT := (StartCount-EndCount)/CounterFreq*100;
  6. if DeltaT>0.01 then DeltaT:=0.01;//Sprünge verhindern, max 100ms auf einmal
  7. if DeltaT<0 then DeltaT:=0;//49.7 Tage Bug vermeiden *g*
  8. //if DeltaT<0.01 then begin sleep(1);exit;end;//Begrenzung auf 100FPS, vermeidet unnötige cpu-last
  9.  
  10. if started = true then
  11.  begin
  12.  if (up2 = true) and (block2 >= 0) then block2 := round(block2 - 5 * DeltaT);
  13.  if (down2 = true) and (block2 <= 340) then block2 := round(block2 + 5*DeltaT);
  14.  if (up1 = true) and (block1 >= 0)then block1 := round(block1 - 5*DeltaT);
  15.  if (down1 = true) and (block1 <= 340) then block1 := round(block1 + 5*DeltaT);
  16.  if new = false then
  17.   begin
  18.   if (time > 2000) and (random(500) = 50) then CreateItem;
  19.   time := time + 1;
  20.   if time > 2000 then PaintItem := false;
  21.   delay := 0;
  22.   ball.x := ball.x + -v.x * 10 * speed*DeltaT;
  23.   ball.y := ball.y + -v.y * 10 * speed*DeltaT;
  24.   collusion;
  25.   Paint(block1,block2,ball);
  26.   end
  27.  else
  28.   begin
  29.   Paint(block1,block2,ball);
  30.   image1.Canvas.Pen.Color := clred;
  31.   image1.Canvas.MoveTo(round(ball.x+7+20*delay*-v.x),round(ball.y + 7+20*delay*-v.y));
  32.   delay := delay + 1;
  33.   if delay < 50 then image1.Canvas.LineTo(round(ball.x + 7+30*delay*-v.x),round(ball.y + 7+30*delay*-v.y));
  34.   if delay = 50 then new := false;
  35.   end;
  36.  Done:=false;
  37.  end;
  38. EndCount := StartCount;
  39. end;
  40.  

Die FPS Begrenzung habe ich rausgenommen da er dann garnix gemacht hat, aber CPU-Last ist zur Zeit eh mein kleineres Problem.

Das ganze bewirkt gerade das es eine extrem langsamme und ruckelige Bewegung gibt (durch die Geschwindigkeit ist es aber egal..) wenn ich die Berechnung für DeltaT wie früher mache und nur dein if DeltaT > 0.01 then.. reinpacke wird die Bewegung im verhältnis zu früher um einiges regelmäßiger aber auch um einiges langsamer.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Nov 29, 2006 07:36 
Offline
DGL Member

Registriert: Do Mai 30, 2002 18:48
Beiträge: 1617
das e bedeutet tatsaechlich soetwas wie hoch... In dem Fall naemlich 10hoch. So bedeutet 1.0e20, dass du 1.0 * 10^ 20 rechnest.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Nov 29, 2006 10:34 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Zu den Rundungsfehlern. Klar kann das teilweise schon ganz "nette" Auswirkungen haben aber bei einem simplen Timebased Movement denke ich eher nicht, dass das groß ins Gewicht fällt. Und wenn dann auch nur weil die Berechnungen unnötig kompliziert sind. Von daher würde ich das Problem primär wo anders suchen wollen.

Eventuell sollten wir bzw. du mal eine andere Richtung einschlagen. Wäre es nicht besser, wenn du Testweise mal ein komplett leeres Projekt machst und dort einfach nur einmal testweise ein TimeBasedMovement implementierst. Und zwar für den Anfang nur erst einmal auf der X Achse. Immer von Links nach Rechts. Wenn das funktioniert kannst du einen Richtungsvektor mit einbauen. Und vor allem dann auch mal mit einem Sleep wärend des Zeichnens mal ein bisschen die Geschwindigkeit verändern auf, dass du testen kannst wie es sich bei unterschiedlichen Geschwindigkeiten verhält.

Das ganze würde ich aber so einfach wie möglich gestalten. Da denke ich liegt nämlich auch ein Problem. Ich habe deinen Code (außer das Timebased Movement) nur kurz überflogen aber was ich so gesehen habe sah viel zu komplex und nach viel zu vielen Berechnungen aus.

Ich sage damit nicht, dass du alles neu machen sollst. Ich will nur mal den unnötigen Balast beim Testen entfernen. Wobei wenn du das Movement mit einem Vektor hast dann hast du mehr oder weniger schon all das abgebildet was du in deiner Anwendung derzeit hast.


Gehört nicht ganz zum Thema ist meiner Meinung nach aber nicht ganz zu vernachlässigen.
Ich würde mir evtl auch ein bisschen etwas an den internen Strukturen überlegen. Du gehst an vielen Stellen davon aus, dass du nur genau so viele Objekte hast wie du dort im Code hast. Also im Speziellen die Methode Paint. Ein Ball und 2 Blöcke werden da rein gereicht. Das zieht sich überall komplett so durch. Die beste Möglichkeit dort etwas zu machen wäre es wenn du dynamischer arbeiten würdest. Also du hättest dann nicht für jedes Objekt eine eigene positions Variable sondern eine Liste in der du Objekte ablegst die eine Position haben. Beim Zeichnen würdest du durch die Liste gehen und alle Objekte dann zeichnen (Idealerweise würden das die Objekte selber machen da sie am Besten wissen was sie sind) und genau so bei der Kollision (Idealerweise würden das auch die Objekte machen). Dann musst du nicht alles mit allem vergleichen sondern gehst durch die Liste und vergleichst deinen Ball mit alle dem was sich dort befindet. So musst du nicht für alle Variablen das selbe machen sondern nur ein Mal. Das macht 1. den Code wesentlich übersichtlicher und 2. den Code nicht so Fehleranfällig, da du es mehr oder weniger nur ein Mal geschrieben hast und es sich auf alle Objekte ausdehnt.

Das aber nur mal als Anregung von mir. http://www.dsdt.info/tutorials/crashkurs/ In diesem Tutorial solltest du reichlich informationen finden. Besonders interessant sind die hinteren Seiten. Arrays und oder Objektorientierte Proggrammierung


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 21 Beiträge ]  Gehe zu Seite 1, 2  Nächste
Foren-Übersicht » Programmierung » Allgemein


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast


Du darfst keine neuen Themen in diesem Forum erstellen.
Du darfst keine Antworten zu Themen in diesem Forum erstellen.
Du darfst deine Beiträge in diesem Forum nicht ändern.
Du darfst deine Beiträge in diesem Forum nicht löschen.
Du darfst keine Dateianhänge in diesem Forum erstellen.

Suche nach:
Gehe zu:  
cron
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.011s | 14 Queries | GZIP : On ]