speck12
      
Beiträge: 36
|
Verfasst: Mi 05.09.07 21:30
Hallo allerseits.
Ich habe ein Problem beim Zugriff auf eine Liste, die dynamisch in eine andere Liste erzeugt wurde.
Hier der Quelltext, damit man sich das besser Vorstellen kann :
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:
| unit Tower_Unit;
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ExtCtrls, StdCtrls;
type TTower = class(TBitmap) public x_tower : Integer; y_tower : Integer; position : TPoint ; range : Integer; damage : Integer; frequency : Integer; color : TColor ; projektil_liste : TList ; constructor create(x,y,t_range,t_damage,t_frequency : integer ; Farbe : TColor); function creep_in_range(creep_pos : TPoint) : Boolean; function schiessen(creep_pos : TPoint) : TPoint; destructor Destroy(); override ; end;
type TBullet = class(TBitmap) public range : Integer; damage : Integer; position : TPoint ; constructor Create(Breite,Hoehe,range,damage : integer; FilePathOfBMP : String); destructor Destroy(); override; end;
implementation
uses Main;
constructor TTower.create(x,y,t_range,t_damage,t_frequency : integer ; Farbe : TColor); begin Inherited Create;
projektil_liste := TList.Create;
Width := 20; Height := 20; x_tower := x; y_tower := y; color := Farbe ; damage := t_damage; frequency:= t_frequency; range := t_range; with Canvas do begin Draw(0,0,main.Form1.grafik_sammlung.tower_bmp); end; end;
function TTower.creep_in_range(creep_pos : TPoint) : Boolean; var tm : TPoint; d : double; begin tm.X := abs(x_tower + (Width DIV 2)); tm.Y := abs(y_tower + (Height DIV 2));
d := SQRT(SQR(abs(creep_pos.X - tm.X)) + SQR(abs(creep_pos.Y - tm.Y)));
if d <= range then Result := true else Result := false; end;
function TTower.schiessen(creep_pos : TPoint): TPoint; var temp,x,y : integer; begin projektil_liste.Add(TBullet.Create(5,5,50,damage,'\bullet1.bmp')); temp := projektil_liste.Count - 1; Result.X := creep_pos.X - position.X; Result.Y := creep_pos.Y - position.Y; end;
destructor TTower.Destroy(); begin Inherited Destroy; end;
constructor TBullet.Create(Breite,Hoehe,range,damage : Integer; FilePathOfBMP : String); begin Inherited Create; Width := Breite; Height := Hoehe ; LoadFromFile(Main.Form1.grafik_sammlung.stammpfad + FilePathOfBMP); end;
Destructor TBullet.Destroy(); begin Inherited Destroy; end; end. |
In dieser Unit gibt es 2 Klassen,
-TTower
-TBullet
TTower hat eine TList "projektil_liste", in der TBUllets dynamisch erzeugt werden.
TTower allerdings wird auch dynamisch erzeugt und in eine andere Liste geschrieben, die sich in der MainUnit befindet und so befüllt wird:
Delphi-Quelltext 1: 2: 3: 4: 5: 6:
| procedure TForm1.Button2Click(Sender: TObject); begin tower_liste.Add(TTower.create(x_tower,y_tower,t_range,t_damage,t_frequency,t_farbe)); selected_t := tower_liste.Count - 1; t_ja := true; end; |
Nun möchte ich aus einer dritten Unit aus, auf die "projektil_liste" zugreifen, kann das aber nur über die tower_liste machen... (in den geschweiften Klammern soll darauf zugegriffen werden)
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:
| unit Hintergrund_unit;
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ExtCtrls, StdCtrls ;
type THintergrund = class(TBitmap) public Hintergrund_Farbe : TColor; Strasse_Farbe : TColor; constructor create(Breite,Hoehe : integer; Farbe,Strasse : TColor); procedure Refresh; procedure Strasse_Refresh; destructor destroy(); override; end; implementation
uses Main,Tower_unit,Creep_unit;
constructor THintergrund.create(Breite,Hoehe : integer;Farbe,Strasse : TColor); begin Inherited Create; Width := Breite; Height := Hoehe ; Hintergrund_Farbe := Farbe ; Strasse_Farbe := Strasse; with Canvas do begin Brush.Color := Farbe; Pen.Color := Farbe; Rectangle(0,0,width,height); Brush.Color := Strasse; Pen.Color := Strasse; Rectangle(60,70,100,height) ; Rectangle(100,70,360,110) ; Rectangle(360,70,400,300) ; Rectangle(400,260,width,300); end; end;
procedure THintergrund.Strasse_Refresh; begin with Canvas do begin Brush.Color := Strasse_Farbe; Pen.Color := Strasse_Farbe; Rectangle(60,70,100,height) ; Rectangle(100,70,360,110) ; Rectangle(360,70,400,300) ; Rectangle(400,260,width,300); end; end;
procedure THintergrund.Refresh; var i,n,max_bullet : integer; begin with Canvas do begin Brush.Color := Hintergrund_Farbe; Pen.Color := Hintergrund_Farbe; Rectangle(0,0,width,height); Brush.Color := Strasse_Farbe; Pen.Color := Strasse_Farbe; Rectangle(60,70,100,height) ; Rectangle(100,70,360,110) ; Rectangle(360,70,400,300) ; Rectangle(400,260,width,300); for i := 0 to Main.Form1.tower_liste.Count - 1 do begin Draw(TTower(Main.Form1.tower_liste.Items[i]).x_tower,TTower(Main.Form1.tower_liste.Items[i]).y_tower,TTower(Main.Form1.tower_liste.Items[i])); end; for i := 0 to Main.Form1.creep_liste.Count - 1 do begin if Main.Form1.creep_liste.Items[i] <> nil then Draw(TCreep(Main.Form1.creep_liste.Items[i]).x_Creep,TCreep(Main.Form1.creep_liste.Items[i]).y_Creep,TCreep(Main.Form1.creep_liste.Items[i])); end;
end; end;
destructor THintergrund.destroy(); begin inherited destroy; end; end. |
Das geht so jedoch nicht, da er einen Record,Object oder Klassentyp fordert.
Vielleicht kann mir jemand sagen, wie ich anders auf diese Liste zugreifen kann?
mfg
|