Entwickler-Ecke

Multimedia / Grafik - Hilfe bei Schleifen. Delphi


masterofswim - Sa 19.02.11 13:28
Titel: Hilfe bei Schleifen. Delphi
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....


Delphi-Quelltext
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, {UBaelle,} 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
    { Private declarations }
  public
    zwarte:integer;
    procedure ballerstellen(x,y:integer;nummer:byte);
    procedure frei(nummer:byte);
    { Public declarations }
  end;

var
  FLevel1: TFLevel1;
  Ball : array [1..20of TBall;
 // Auto:Tauto;
  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 := TAuto.Create(FLevel1);
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, 500200,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 user profile iconNarses: Code- durch Delphi-Tags ersetzt


HenryHux - Sa 19.02.11 13: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 - Sa 19.02.11 13:41

Danke für den Tipp aber es wird trotzdem immernoch nur ein Ball dargestellt.

LG


Jann1k - Sa 19.02.11 13: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 - Sa 19.02.11 14:00

Jo da kommt ne Fehlermeldung Ungültige Gleitkommaoperation....
Bekomm noch ne Krise...:(


Marc. - Sa 19.02.11 15:04

user profile iconmasterofswim hat folgendes geschrieben Zum zitierten Posting springen:
Jo da kommt ne Fehlermeldung Ungültige Gleitkommaoperation....
Bekomm noch ne Krise...:(

Meine Glaskugel ist gerade etwas trübe. Wo?
Debug den Code und überlege zwei mal, weshalb an dieser Stelle eine Exception auftreten könnte. :P


masterofswim - Sa 19.02.11 16:10

Ich bekomme es nicht raus.


Marc. - Sa 19.02.11 16:58

Bei welcher Aktion erscheint denn der InvalidFloatPointOperation RunTime-Error? :nixweiss:

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 [http://www.delphi-treff.de/ueber-delphi/entwicklungsumgebung-bis-delphi-7/debugger/] erklärt.


jaenicke - Sa 19.02.11 17: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.