Autor Beitrag
comes
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 40



BeitragVerfasst: Do 11.12.03 16:45 
ausblenden 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:
unit main;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls, StdCtrls;

type
  TForm1 = class(TForm)
    Image1: TImage;
    Button1: TButton;
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;
implementation

{$R *.dfm}

end.

ausblenden volle Höhe 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 planet_unit;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls, main;

type
  TRohstoffe = record
    Uran : boolean;
    cryptonid : boolean;
  end;

type
  TStationierteSchiffe = record
    FrachterKlein : Integer;
    FrachterGross : Integer;
    Kriegsschiffklein : Integer;
    Kriegsschiffgross : Integer;
  end;

type
  TVolk = record
    Krieger : boolean;
    Handelsvolk : boolean;
    Mischvolk : boolean;
  end;

type
  TGebaeude = record
    Kraftwerk : boolean;
    Werft : boolean;
    Schutzschild : boolean;
    Waffensysteme : boolean;
    Forschungsstation : boolean;
    Depot : boolean;
  end;

type
  TPlanet = class
      Bild : TImage;
      Bezeichnung : String;
      AnzahlEinwohner : Integer;
      maxEineohner : Integer;
      Besitzer : String;
      Volk : TVolk;
      Rohstoffe : TRohstoffe;
      StationierteSchiffe : TStationierteSchiffe;
      Gebaeude : TGebaeude;
      neutral : boolean;
  end;

TWorld = class
  private
    FPlanets : array of TWorld;
    FClicked : Boolean; // wurde nach dem letzten Tick geklickt?

    public
      procedure onMouseClick(X, Y : Integer); // dort prüfst du ob ein Planet angeklcikt wurde und rufst seine OnClick-methode auf(wenn er überhaupt eine braucht)
      procedure addPlanet({irgendwelche Daten, die er haben soll});
      procedure tick; // so eine Funktion wird bei jedem Durchgang aufgerufen und steuert die Intelligenz(könnte z.B. eine Tick-und die Draw-Funktion aller Planeten aufrufen
      procedure draw(Sender : TObject);
  end;


implementation

procedure TWorld.onMouseClick(X, Y : Integer); // dort prüfst du ob ein Planet angeklcikt wurde und rufst seine OnClick-methode auf(wenn er überhaupt eine braucht)
begin
end;

procedure TWorld.addPlanet({irgendwelche Daten, die er haben soll});
begin
end;

procedure TWorld.draw(Sender : TObject);
var bild : TGraphic;
begin
 bild.LoadFromFile('c:\test.bmp');
 TForm(form1).Canvas.Draw(10,10,bild);
end;

procedure TWorld.tick;
VAR
i : Integer;
Mouse : TPoint;
begin
  getCursorPos(Mouse);
  for i:= 0 to high(FPlanets) do
  begin
   FPlanets[i].tick;

   if (FClicked){ and ({Mouse über Planet)}then
     FPlanets[i].onMouseClick(Mouse.X, Mouse.Y);
   FPlanets[i].draw(self);
  end;
  FClicked:= false;
end;

end.

warum kann ich aus der main.pas unit nicht die planet_unit.pas abrufen bzw starten? ich möchte die objecte aus planet_unit.pas auf die form einbinden.

warum geht das nicht? was mach ich falsch bzw. wo ist mein Denkfehler?


Moderiert von user profile iconPeter Lustig: Code- durch Delphi-Tags ersetzt; noch einmal und ich hole Knecht Ruprecht!
Nightmare_82
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 260



BeitragVerfasst: Do 11.12.03 16:55 
es muß genau umgekehrt sein:
Die MainUnit braucht unter uses die planet_unit.
Bei der PlanetUnit mußt du das "uses main" wegnehmen.
Im FormCreate erstellst du dann TWorld und beim Timer-Event rufst du den Tick auf.
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
TForm1 = class(TForm)
private
 FWorld : TWorld;

{..}
procedure TForm1.FormCreate(Sender : TObject);
begin
 FWorld:= TWorld.create;
end;

procedure TForm1.FormClose(Sender : TObject);
begin
 FWorld.free;
end;

procedure TForm1.TimerEvent;
begin
 FWorld.tick;
end;


und bei TWorld.Click mußt du FClicked auf true setzen.
comes Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 40



BeitragVerfasst: Do 11.12.03 19:18 
Titel: wie gestestallte ich jetzt die sache mit dem DRAW?
und wie mach ich das jetzt mit dem draw?
so wie ich es oben gestalltet habe und die änderung mit den units, die du vorgeschlagen hast, kann ich ja jetzt nicht mehr form1.draw(10,10,bild) machen... das klappt ja net mehr.... grummel... was hab ich da nur wieder angestellt... hab mich vielleicht ein bisschen übernommen, aber ich will das jetzt können.... :?
Nightmare_82
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 260



BeitragVerfasst: Do 11.12.03 19:34 
Du willst doch, daß sich jeder Planet zeichnet und nicht die Welt oder?

Dann änder mal folgendes :

  • nimm beim planet ein TBitmap statt TImage
  • gib jdem Planeten X und Y-Variablen
  • übergib in der Draw-Funktion den canvas der Form


ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
procedure TPlanet.draw(Canvas : TCanvas);
begin
  if Bild <> nil then
    Canvas.draw(X, Y, Bild);
end;


den Canvas kannst du ja dem TWorld-Objekt im Tick mitgeben:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
procedure TWorld.tick(Canvas : TCanvas);

{und so aufrufen :}
procedure TForm1.TickEvent;
begin
 FWorld.tick(Canvas);
end;


dann fehlt noch die Add-Funktion, die machst du z.B. so:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
procedure TWorld.addPlanet(Planet : TPlanet);
begin
 setlength(FPlanets, length(FPlanets) + 1);
 FPlanets[high(FPlanets)]:= Planet;
end;


wichtig : Planeten später wieder freigeben:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
destructor TWorld.free;
VAR 
i : Integer; 
begin
 for i:= 0 to high(FPlanets) do 
  FPlanets[i].free:
 setLength(FPlanets, 0);
end;


Jetzt mußt du nur noch den Planeten ein gültiges Bitmap zuweisen und dann sollte es gehen.
Ansonsten gewöhn dir am besten gleich an für alle Klassen einen Constructor und einen Destructor zu schreiben.
comes Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 40



BeitragVerfasst: Do 11.12.03 22:12 
Gut gut, soweit ist jetzt alles klar.

muss nur noch mal ganz dumm fragen, was ist und was macht constructor und destructor genau und wie verwend ich das genau?

constructor? wird da eine bestimmte procedure ausgeführt, beim erstellen ähnlich create? und destructor genauso?

mfg, jeremias
mstuebner
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 132

Win2000, XP
D7
BeitragVerfasst: Do 11.12.03 23:29 
comes hat folgendes geschrieben:
Gut gut, soweit ist jetzt alles klar.

muss nur noch mal ganz dumm fragen, was ist und was macht constructor und destructor genau und wie verwend ich das genau?

constructor? wird da eine bestimmte procedure ausgeführt, beim erstellen ähnlich create? und destructor genauso?

Werden beim Erzeugen/Löschen einer Klasse aufgerufen. BTW: Steht in der Hilfe ausführlich beschrieben.

_________________
mfg Matthias