![]() |
AW: Problem mit Multiplikation
OK, danke für die Aufklärung :D 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. |
AW: Problem mit Multiplikation
OT:
Zitat:
Aber zurück zum Thema :mrgreen: |
AW: Problem mit Multiplikation
OT:
Zitat:
|
AW: Problem mit Multiplikation
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:
wenn ich zb. Ball.YSpeed := 1; setze funktioniert es einwandfrei und es erreicht den Effekt den ich eigentlich mit *(-1) erreichen wollte.
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;
Delphi-Quellcode:
Und Ball.YSpeed ist in diesem fall auch 100% -1 weil folgendes auch funktioniert:
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;
Delphi-Quellcode:
procedure TBrick.onCollision(Edge : Integer; Ball : TBall);
begin if Ball.YSpeed = -1 then Ball.YSpeed := 1; end; |
AW: Problem mit Multiplikation
Ok konnte das Problem jetzt eingrenzen:
Delphi-Quellcode:
ergibt das Ball.YSpeed = 1 ist.
procedure TBrick.onCollision(Edge : Integer; Ball : TBall);
begin if Ball.YSpeed = -1 then begin Ball.YSpeed := Ball.YSpeed * (-1); end; end;
Delphi-Quellcode:
ergibt das Ball.YSpeed = 1 ist.
if Ball.YSpeed = -1 then
begin Ball.YSpeed := Ball.YSpeed + 2; end;
Delphi-Quellcode:
ergibt das Ball.YSpeed = -1 bleibt
procedure TBrick.onCollision(Edge : Integer; Ball : TBall);
begin if Edge = 1 then begin Ball.YSpeed := Ball.YSpeed * (-1); end; end;
Delphi-Quellcode:
ergibt das Ball.YSpeed = 3 ist. Anscheinend wird onCollision 2mal hintereinander aufgerufen. Warum das so ist muss ich aber noch herausfinden
procedure TBrick.onCollision(Edge : Integer; Ball : TBall);
begin if Edge = 1 then begin Ball.YSpeed := Ball.YSpeed + 2; end; end; |
AW: Problem mit Multiplikation
Ich vermute gaaaaaaaaanz stark, dass es in dem Scope der Methode noch ein "Edge" gibt, dass höhere Priorität als der Parameter hat. Weil es geht immer nur dann gut, wenn du "Edge" gerade eben nicht als Bedingung benutzt. Benenne den Parameter doch mal spaßeshalbar um, z.B. nach "aEdge", das wäre sogar noch styleguidekonform :)
Edit: Oder ggf. auch "Ball" mal nach "aBall" umbenennen, auch hier könnte ein ähnliches Problem sein. Hast du z.B. globale Variablen mit diesen Namen? |
AW: Problem mit Multiplikation
Hallo,
so wie ich das sehe, ist das Problem hier:
Delphi-Quellcode:
.
procedure TBrick.onCollision(Edge : Integer; Ball : TBall);
Wenn "Ball" geändert werden soll, dann muss es lauten:
Delphi-Quellcode:
.
procedure TBrick.onCollision(Edge : Integer;var Ball : TBall);
Ansonsten wird Ball nicht verändert (ohne var kein "call by reference"). Hier mal ein Beispiel:
Delphi-Quellcode:
Ergibt:
procedure var_minus(var i: Integer);
begin i := i * -1; end; procedure minus(i: Integer); begin i := i * -1; end; procedure TForm3.Button1Click(Sender: TObject); var i: Integer; j: Integer; begin i := 1; j := 1; minus(i); var_minus(j); Label1.Caption := Format('i: %d, j: %d', [i, j]); end;
Code:
i: 1, j: -1
|
AW: Problem mit Multiplikation
Objekte werden immer als Referenz übergeben, deshalb ist "var" hier überflüssig.
|
AW: Problem mit Multiplikation
Zitat:
|
AW: Problem mit Multiplikation
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:16 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