Autor |
Beitrag |
masterofswim
Hält's aus hier
Beiträge: 14
|
Verfasst: Sa 19.02.11 14:28
Hallo ich möchte gern Bälle nebeneinander darstellen.
Will das über ne Schleife lösen habe hier schon mal Änsätze:
Die Schleife ist in der Zeile 58 & 59.
Will sie im Abstand von ca. 100 Pixel ausgeben....
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75: 76: 77: 78: 79: 80: 81: 82: 83: 84: 85: 86: 87: 88: 89: 90: 91: 92: 93: 94: 95: 96: 97: 98: 99: 100: 101:
| unit ULevel1;
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, UAuto, UCar, ExtCtrls, UBall;
type TFLevel1 = class(TForm) Fahren: TTimer; warten: TTimer; procedure FormMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); procedure FormActivate(Sender: TObject); procedure FormKeyPress(Sender: TObject; var Key: Char); procedure FahrenTimer(Sender: TObject); procedure wartenTimer(Sender: TObject); private public zwarte:integer; procedure ballerstellen(x,y:integer;nummer:byte); procedure frei(nummer:byte); end;
var FLevel1: TFLevel1; Ball : array [1..20] of TBall; Auto: TCar; implementation
{$R *.dfm}
procedure TFLevel1.FormMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); begin
end;
procedure TFLevel1.FormActivate(Sender: TObject); var i,j:integer; ballnummer:byte; begin FLevel1.Left:=0; FLevel1.Top:=0; FLevel1.Width:=Screen.WorkAreaWidth; FLevel1.Height:=Screen.WorkAreaHeight; Auto:= TCar.create(Self); Auto.Top:=clientheight div 2; Auto.left:=clientwidth div 2; Fahren.Enabled:=true; ballnummer:=1;
for i:=1 to 10 do ballerstellen(500*20,200,ballnummer+1);
end;
procedure TFLevel1.FormKeyPress(Sender: TObject; var Key: Char); begin if Auto<>nil then Auto.setRichtung(Key); If Key = 'q' then close; end;
procedure TFLevel1.FahrenTimer(Sender: TObject); begin warten.Enabled:=false; case auto.getrichtung of 'w' : auto.Top:=auto.Top-4; 'a' : auto.left:=auto.left-4; 's' : auto.Top:=auto.Top+4; 'd' : auto.left:=auto.left+4; end; if Ball[1] <> nil then Ball[1].setAutoPos(Auto.Left,auto.Top); end;
procedure TFLevel1.ballerstellen(x, y : integer;nummer:byte); begin Ball[nummer] := TBall.create(self,auto, 500, 200,nummer); Ball[nummer].Left:=500; Ball[nummer].Top:=200; end;
procedure TFLevel1.frei(nummer:byte); begin Ball[nummer]:=nil; end;
procedure TFLevel1.wartenTimer(Sender: TObject);
begin zwarte:=zwarte+1; if zwarte = 2 then fahren.Enabled:=true; end;
end. |
Moderiert von Narses: Code- durch Delphi-Tags ersetzt
|
|
HenryHux
      
Beiträge: 542
Erhaltene Danke: 33
Windows 7 Premium
Delphi XE, Eclipse
|
Verfasst: Sa 19.02.11 14:35
Würde sich hier anbieten, anstatt Ballnummer die Laufvariable der For-Schleife zu nehmen.
Dadurch, dass du Ballnummer + 1 aufrufst, wird Ballnummer nicht "dauerhaft" um 1 erhöht. Dazu müsstest du Ballnummer := Ballnummer + 1 aufrufen =)
Versuchs mal so :
Delphi-Quelltext 1: 2:
| for ballnummer:=1 to 10 do ballerstellen(500*20,200,ballnummer); |
Lg
|
|
masterofswim 
Hält's aus hier
Beiträge: 14
|
Verfasst: Sa 19.02.11 14:41
Danke für den Tipp aber es wird trotzdem immernoch nur ein Ball dargestellt.
LG
|
|
Jann1k
      
Beiträge: 866
Erhaltene Danke: 43
Win 7
TurboDelphi, Visual Studio 2010
|
Verfasst: Sa 19.02.11 14:52
Zitat: | Danke für den Tipp aber es wird trotzdem immernoch nur ein Ball dargestellt. |
Das liegt daran, dass du alle Bälle aufeinander zeichnest. Versuch mal
Delphi-Quelltext 1: 2:
| for ballnummer:=1 to 10 do ballerstellen(500*20+i*100,200,ballnummer); |
Das zeichnet dir die Bälle alle nebeneinander im Abstand von 100 Pixel(linke Kante zu linke Kante).
e: Ich sehe grade deine Ballerstellenfunktion ist auch nicht wirklich sinnvoll, da du die Parameter im Konstruktor nicht verwendest. Ändere die mal zu:
Delphi-Quelltext 1: 2: 3: 4: 5: 6:
| procedure TFLevel1.ballerstellen(x, y : integer;nummer:byte); begin Ball[nummer] := TBall.create(self,auto, x, y,nummer); Ball[nummer].Left:=x; Ball[nummer].Top:=y; end; |
|
|
masterofswim 
Hält's aus hier
Beiträge: 14
|
Verfasst: Sa 19.02.11 15:00
Jo da kommt ne Fehlermeldung Ungültige Gleitkommaoperation....
Bekomm noch ne Krise... 
|
|
Marc.
      
Beiträge: 1876
Erhaltene Danke: 129
Win 8.1, Xubuntu 15.10
|
Verfasst: Sa 19.02.11 16:04
|
|
masterofswim 
Hält's aus hier
Beiträge: 14
|
Verfasst: Sa 19.02.11 17:10
Ich bekomme es nicht raus.
|
|
Marc.
      
Beiträge: 1876
Erhaltene Danke: 129
Win 8.1, Xubuntu 15.10
|
Verfasst: Sa 19.02.11 17:58
Bei welcher Aktion erscheint denn der InvalidFloatPointOperation RunTime-Error?
How to debug:
Setze je einen Breakpoint in die entsprechenden Methoden und steppe durch, bis du den Fehler gefunden hast.
Etwas ausführlicher wird das im Delphi-Treff unter dem Stichpunkt Debugger erklärt.
|
|
jaenicke
      
Beiträge: 19315
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Sa 19.02.11 18:26
Und den Fehler vermute ich einmal irgendwo bei einer Division. Vielleicht ist der Divisor (fast) Null, z.B. weil die Variable nicht initialisiert wurde.
Am schnellsten findest du das aber wie schon geschrieben wurde, wenn du einfach mal zeilenweise durchgehst und schaust was passiert.
|
|