Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - Tower Defense Anfang


Andreas95 - Mi 22.12.10 23:55
Titel: Tower Defense Anfang
Also ich habe angefangen meine eigene version von Tower defense zu programmieren.
Um die Bahn (bewegungslinie) der zu abwehrenden Gegner festzustellen, habe ich verschiedene Farben für verschiedene Bewegungen eingerichtet. Grün ist vorwärts (nach rechts), Rot ist nach unten, und Blau ist nach oben.

Ich bin nicht weit gekommen, und schon hatte ich Probleme:
Schaut den Quelltext an. Alles, was ich dort geschrieben habe geht von 1 einzigem gegner aus. (in dieser schnellversion habe ich einen einfachen tshape benutzt).
Hättet ihr eine Idee wie ich diese Bewegungsvorlage für ALLE "Gegner" benutzen kann, ohne das ich den Code unendlich mal kopiere und für den jeweiligem shape umstellen muss?
Und habt ihr noch irgendwelche ideen auf die schnelle, die ihr für mich habt?
quelltext:

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:
unit Unit2;

interface

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

type
  TForm1 = class(TForm)
    Shape1: TShape;
    Timer1: TTimer;
    Shape2: TShape;
    Shape3: TShape;
    Shape4: TShape;
    Shape5: TShape;
    Shape6: TShape;
    procedure Timer1Timer(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;
  g,r,b: boolean;

implementation

{$R *.dfm}


procedure TForm1.Timer1Timer(Sender: TObject);
begin

  case GetPixel(canvas.Handle,shape6.left-5,shape6.top-5of
    32768: shape6.Left := shape6.Left +1;
    16777215: shape6.Left := shape6.Left +1;
    255: shape6.top := shape6.top +1;
    16711680: shape6.top := shape6.top -1;
  end;

end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  doublebuffered := true;
end;

end.
[/quote]


Moderiert von user profile iconNarses: Topic aus Open Source Projekte verschoben am Mi 22.12.2010 um 23:25


Jann1k - Do 23.12.10 00:07

Speicher alle deine Gegner in einem Array oder einer Liste ab, dann kannst du einfach durch das Array iterieren und deinen Code für jeden Gegner ausführen.


Andreas95 - Do 23.12.10 00:23

Hmm ja aber dann müsste ich doch immernoch meinen code:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
 case GetPixel(canvas.Handle,shape6.left-5,shape6.top-5of
    32768: shape6.Left := shape6.Left +1;
    16777215: shape6.Left := shape6.Left +1;
    255: shape6.top := shape6.top +1;
    16711680: shape6.top := shape6.top -1;
  end;


für jeden verschiedenen array einfügen?
könntest du bzw irgendjemand mir einen entsprechenden beispiel geben?
ich programmiere schon lange als hobby, und hatte bis jetzt immer das gleiche problem. erst jetzt ist mir eingefallen, das es einen kürzeren weg geben müsse..


Narses - Do 23.12.10 00:31

Moin!

Mal so als Ansatz: :idea: ;)

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
var
  Shapes: array[0..2of TShape;

begin // FormCreate
  Shapes[0] := Shape1;
  Shapes[1] := Shape2;
  Shapes[2] := Shape3;

begin // OnTimer
  for i := 0 to 2 do
    case GetPixel(Canvas.Handle,Shapes[i].Left-5,Shapes[i].Top-5of
      $008000: Shapes[i].Left := Shapes[i].Left +1;
      $FFFFFF: Shapes[i].Left := Shapes[i].Left -1;
      $0000FF: Shapes[i].Top  := Shapes[i].Top +1;
      $FF0000: Shapes[i].Top  := Shapes[i].Top -1;
    end;
cu
Narses


Andreas95 - Do 23.12.10 00:43

Genau sowas suche ich, danke :)
ich zerbrech mir schon seit ewigkeiten darüber den Kopf >.< :autsch:
nochmals danke :D