AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Problem mit Multiplikation

Ein Thema von Pfusch · begonnen am 12. Aug 2013 · letzter Beitrag vom 13. Aug 2013
Antwort Antwort
Volker Z.

Registriert seit: 3. Dez 2012
Ort: Augsburg, Bayern, Süddeutschland
419 Beiträge
 
Delphi XE4 Ultimate
 
#1

AW: Problem mit Multiplikation

  Alt 13. Aug 2013, 01:53
Hallo,

Dein Problem ist sicher nicht die Multiplikation; die arbeitet - wie schon gezeigt - korrekt.
Das kannst Du auch leicht sehen, dazu musst Du nur Deinen Timercode etwas abändern:
Delphi-Quellcode:
procedure TfrmBreakout.TimerTick(Sender: TObject);
  var
    i, j : Integer;
    Ball: TBall;
    Brick: TBrick;

  begin
       for i := 0 to balls.Count-1 do
       begin
            Ball := balls[i];
            for j := 0 to bricks.Count-1 do
            begin
                 Brick := bricks[j];
                 Brick.Collide(Ball);
                 lblScore.Caption := 'y: ' + FloatToStr(Ball.YSpeed);
                 Application.ProcessMessages
            end;
            Ball.Coords.X := Ball.Coords.X+round(Ball.XSpeed);
            Ball.Coords.Y := Ball.Coords.Y+round(Ball.YSpeed);
       end;

  end;
Dann steht da auch irgendwann eine 1 - anstatt einer -1.

Gruß
Volker Zeller
  Mit Zitat antworten Zitat
Angel4585

Registriert seit: 4. Okt 2005
Ort: i.d.N.v. Freiburg im Breisgau
2.199 Beiträge
 
Delphi 2010 Professional
 
#2

AW: Problem mit Multiplikation

  Alt 13. Aug 2013, 09:03
Ich bin mir nicht sicher, hab grad keine IDE zum testen da, aber das da sieht für mich aus wie Durchfall:

Delphi-Quellcode:
  procedure TBrick.onCollision(Edge : Integer; Ball : TBall);
  begin
       case Edge of
           1: Ball.YSpeed := Ball.YSpeed * (-1);
           2: Ball.YSpeed := Ball.YSpeed * (-1);
           3: Ball.XSpeed := Ball.XSpeed * (-1);
           4: Ball.XSpeed := Ball.XSpeed * (-1);
       end;
  end;
Also in Java zumindest wird ohne ein break zwischendrin 1: und 2: (und 3: und 4: ) ausgeführt, was dann zur Folge hätte, dass es wieder das selbe Ergebnis wie davor ist.
Oder gabs das in Delphi garnicht?
Martin Weber
Ich bin ein Rüsselmops
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
6.210 Beiträge
 
Delphi 10 Seattle Enterprise
 
#3

AW: Problem mit Multiplikation

  Alt 13. Aug 2013, 09:07
Nope, das ist schon richtig so.
  Mit Zitat antworten Zitat
Benutzerbild von Union
Union

Registriert seit: 18. Mär 2004
Ort: Luxembourg
3.492 Beiträge
 
Delphi 7 Enterprise
 
#4

AW: Problem mit Multiplikation

  Alt 13. Aug 2013, 09:09
Also in Java zumindest wird ohne ein break zwischendrin 1: und 2: (und 3: und 4: ) ausgeführt, was dann zur Folge hätte, dass es wieder das selbe Ergebnis wie davor ist.
Oder gabs das in Delphi garnicht?
Delphi-Referenz durchsuchencase stellt eine Lookuptabelle dar. Es wird nur eine Zeile ausgeführt und bereits der Compiler weigert sich zu kompilieren (Doppeltes case-Label) falls es Duplikate oder Überschneidungen gibt:
Delphi-Quellcode:
case x of
0..2 : y := -1;
1..3 : y := +1;
end;
Ibi fas ubi proxima merces
sudo /Developer/Library/uninstall-devtools --mode=all
  Mit Zitat antworten Zitat
Angel4585

Registriert seit: 4. Okt 2005
Ort: i.d.N.v. Freiburg im Breisgau
2.199 Beiträge
 
Delphi 2010 Professional
 
#5

AW: Problem mit Multiplikation

  Alt 13. Aug 2013, 09:20
OK, danke für die Aufklärung ich mach viel zu wenig Delphi in letzter Zeit

Nächste Frage: kommt das Programm in die onColission?
Aufrufe sind zwar da, aber falls die if's nie true sind wird's halt nix.
Gerade die letzte Bedingung (Ball.Coords.Y=Self.fCoords.Y) könnte durchaus problematisch sein.
Martin Weber
Ich bin ein Rüsselmops
  Mit Zitat antworten Zitat
Namenloser

Registriert seit: 7. Jun 2006
Ort: Karlsruhe
3.724 Beiträge
 
FreePascal / Lazarus
 
#6

AW: Problem mit Multiplikation

  Alt 13. Aug 2013, 09:17
Oder gabs das in Delphi garnicht?
Zum Glück nicht!

Das ist einer der größten Designfehler in C/C++/Java/PHP meiner Meinung nach... Wann braucht man das Fallthrough schon mal? Einmal in hundert Jahren? Und wie oft vergisst man auf der anderen Seite einfach ein break und hat einen schwer zu findenden Bug?

Aber die Vermutung, dass der Code irgendwie doppelt ausgeführt wird, ist naheliegend.

Ich habe in der Vergangenheit auch die Erfahrung gemacht, dass es keine gute Kollisionsbehandlungs-Strategie ist, einfach blind die Geschwindigkeit zu negieren... nicht immer hebt sich die Negation auf wie hier, aber manchmal passiert es auch, dass ein Objekt an einer Kante kleben bleibt, weil ein Simulationsschritt nicht ausreicht, dass es das Objekt, mit dem es kollidiert, wieder verlässt, und so kehrt sich mit jedem Frame das Vorzeichen um und es bewegt sich effektiv gar nicht mehr. Problematisch sind auch Kollisionen mit mehreren Objekten gleichzeitig (könnt hier auch die Ursache sein).

Setz mal einen Breakpoint auf deine Kollisionsbehandlung, dann siehst du wahrscheinlich, was Sache ist.
  Mit Zitat antworten Zitat
Benutzerbild von BUG
BUG

Registriert seit: 4. Dez 2003
Ort: Cottbus
2.094 Beiträge
 
#7

AW: Problem mit Multiplikation

  Alt 13. Aug 2013, 10:36
OT:
Und wie oft vergisst man auf der anderen Seite einfach ein break und hat einen schwer zu findenden Bug?
So gut wie nie. Mit etwas Erfahrung in diesen Sprachen mit diesen Sprachen reicht ein einfaches Überfliegen des Codes, um den Fehler zu finden; zumal man in den meisten Fällen eh case vermeiden sollte.
Aber zurück zum Thema
Intellekt ist das Verstehen von Wissen. Verstehen ist der wahre Pfad zu Einsicht. Einsicht ist der Schlüssel zu allem.
  Mit Zitat antworten Zitat
Namenloser

Registriert seit: 7. Jun 2006
Ort: Karlsruhe
3.724 Beiträge
 
FreePascal / Lazarus
 
#8

AW: Problem mit Multiplikation

  Alt 13. Aug 2013, 11:33
OT:
Und wie oft vergisst man auf der anderen Seite einfach ein break und hat einen schwer zu findenden Bug?
So gut wie nie.
Ich meine das relativ zum anderen Fall.
  Mit Zitat antworten Zitat
Pfusch

Registriert seit: 12. Aug 2013
7 Beiträge
 
#9

AW: Problem mit Multiplikation

  Alt 13. Aug 2013, 14:29
Vielen Dank für die vielen Ratschläge aber leider besteht das Problem weiterhin.

Die Bedingung für OnCollision stimmt auf jeden Fall und er kommt auch bis zum Case.

Delphi-Quellcode:
procedure TBrick.onCollision(Edge : Integer; Ball : TBall);
  begin
       case Edge of
           1: Ball.YSpeed := Ball.YSpeed * (-1);
           2: Ball.YSpeed := Ball.YSpeed * (-1);
           3: Ball.XSpeed := Ball.XSpeed * (-1);
           4: Ball.XSpeed := Ball.XSpeed * (-1);
       end;
  end;
wenn ich zb. Ball.YSpeed := 1; setze funktioniert es einwandfrei und es erreicht den Effekt den ich eigentlich mit *(-1) erreichen wollte.

Delphi-Quellcode:
procedure TBrick.onCollision(Edge : Integer; Ball : TBall);
  begin
       case Edge of
           1: Ball.YSpeed := 1;
           2: Ball.YSpeed := Ball.YSpeed * (-1);
           3: Ball.XSpeed := Ball.XSpeed * (-1);
           4: Ball.XSpeed := Ball.XSpeed * (-1);
       end;
  end;
Und Ball.YSpeed ist in diesem fall auch 100% -1 weil folgendes auch funktioniert:

Delphi-Quellcode:
procedure TBrick.onCollision(Edge : Integer; Ball : TBall);
  begin
       if Ball.YSpeed = -1 then Ball.YSpeed := 1;
  end;
  Mit Zitat antworten Zitat
Pfusch

Registriert seit: 12. Aug 2013
7 Beiträge
 
#10

AW: Problem mit Multiplikation

  Alt 13. Aug 2013, 14:47
Ok konnte das Problem jetzt eingrenzen:

Delphi-Quellcode:
procedure TBrick.onCollision(Edge : Integer; Ball : TBall);
  begin
  if Ball.YSpeed = -1 then
  begin
       Ball.YSpeed := Ball.YSpeed * (-1);
  end;
  end;
ergibt das Ball.YSpeed = 1 ist.

Delphi-Quellcode:
  if Ball.YSpeed = -1 then
  begin
       Ball.YSpeed := Ball.YSpeed + 2;
  end;
ergibt das Ball.YSpeed = 1 ist.

Delphi-Quellcode:
  procedure TBrick.onCollision(Edge : Integer; Ball : TBall);
  begin
  if Edge = 1 then
  begin
       Ball.YSpeed := Ball.YSpeed * (-1);
  end;
  end;
ergibt das Ball.YSpeed = -1 bleibt

Delphi-Quellcode:
  procedure TBrick.onCollision(Edge : Integer; Ball : TBall);
  begin
  if Edge = 1 then
  begin
       Ball.YSpeed := Ball.YSpeed + 2;
  end;
  end;
ergibt das Ball.YSpeed = 3 ist. Anscheinend wird onCollision 2mal hintereinander aufgerufen. Warum das so ist muss ich aber noch herausfinden
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 15:55 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz