Autor Beitrag
Xearox
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 260
Erhaltene Danke: 3



BeitragVerfasst: So 21.03.10 06:36 
Hmm, ist zwar nicht ganz so, wie der Titel lautet aber ich konnte das nicht anderes beschrieben.

Also, ich bin zur Zeit an einem Kleinem Spiel am schreiben.
So nun möchte ich ganz gerne, das von Einem TImage zu einem Anderem TImage eine Linie gezogen wird.
X und Y Koordinaten sind bekannt, und können über eine Array Abfrage aufgerufen werden.

Also
UserShip1Typ[UShip1].Top und UserShip1Typ[UShip1].Left
AIShip1Typ[AIShip1].Top und AIShip1Typ[AIShip1].Left

Nun soll zwischen dem UserShip und dem AIShip eine Linie gezogen werden, wenn das AIShip eine Bestimmte Position erreicht wird.

Wie mache ich das nun am einfachsten, da die Linie öfters gezogen werden soll, es soll eine Art Waffenfeuer sein, also z.b. eine Rote oder Blaue Linie sein.

Nehme Ich dafür Canvas oder lieber ein Weiteres TImage, welche ich dann Stretche, um von Punkt A zu B zu kommen.

jedoch habe ich weder mit Canvas große Erfahrung noch mit TImage, wobei TImage mein Programm mit arbeitet.


Also um noch mal eine Konkrete Frage zu stellen.
Welche Methode wäre am besten und wie wende ich diese dann an, wie wären die Befehle dazu?

Canvas hab ich irgendwas mit MoveTo und LineTo gelesen, jedoch bei TImage hab ich bisher nichts großartiges gefunden, was mir weiter helfen könnte.
Bei Canvas ist aber wiederum das Problem, das die Linien auf der Form verbleiben, solange, bis ich die Form minimiere oder irgendwas drüber tue(erfahrung aus einem Malen Programm)


Kann mir hier jemand vielleicht einen Tipp geben und evtl. auch mir schreiben, wie ich sowas am besten angehen kann?

Danke schon mal in Vorraus, da man hier im Forum wirklich richitg Hilfe bekommt :=)
Jann1k
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 866
Erhaltene Danke: 43

Win 7
TurboDelphi, Visual Studio 2010
BeitragVerfasst: So 21.03.10 10:17 
Du kannst die Linie auf TImage.Canvas zeichnen, damit sie nicht ewig dort verbleibt musst du dein eigenes Bild später wieder drüberlegen.
Xearox Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 260
Erhaltene Danke: 3



BeitragVerfasst: So 21.03.10 15:53 
okay. soweit so gut.

Jedoch Nutze ich nur die Form1, da werden auch die TImages, die ich als Array angelegt habe, dargestellt.
Nun ist es mir ein Rätsel, wie du das meinst, mein eigenes Bild darauf zu legen.

Es soll ja so ein Waffenfeuer sein, also als Laserstrahl und dies soll halt öfters geschehen, sobald die AIShips in Reichweite der UserShips kommen.
Dann soll wird solange geschossen, bis entweder das usership oder das AIShip platt ist.
Und dieser Stahl(Linie) soll halt nach 100ms wieder verschwunden sein, dazu werde ich einen Timer nutzen.
Nun ist einfach nur die Frage, wie kann ich das am Besten bewerkstelligen?
Jann1k
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 866
Erhaltene Danke: 43

Win 7
TurboDelphi, Visual Studio 2010
BeitragVerfasst: So 21.03.10 17:52 
Hmm, dann würd ich dir raten dein Projekt ein wenig umzugestalten, wenn du für jedes Schiff ein eigenes TImage nimmst, wird das ganze recht schnell unperformant. Wesentlich besser ist es, wen du nur ein TImage (oder besser noch eine Paintbox) benutzt. Canvas besitzt eine Methode draw mit der du bitmaps irgendwo auf das TImage malen kannst. Dann müsstest du deine Schiffe einmal in einzelne Bitmaps laden und dann so oft wie nötig mit draw auf dein Hauptbild zeichnen.

Die Linien kannst du dann auch einfach auf das große TImage malen. Musst dir da halt nur was zu überlegen, wo du abspeicherst, welche Linien vorhanden sind, wie lange sie schon zu sehen sind, und wie sie wieder entfernt werden.
Xearox Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 260
Erhaltene Danke: 3



BeitragVerfasst: So 21.03.10 19:02 
also hier mein bisheriger code, um ein Schiff auf die Form zu bringen, was auch super klappt.
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
type
  AIShip1ArrayType = Array [0..200of TImage;
  AIShip1AttArrayType = Array [0..200of Integer;
  AIShip1DeffArrayType = Array [0..200of Integer;
  AIShip1RangeArrayType = Array [0..200of Integer;


ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
var
//AI Ships
  AIShip1Typ : AIShip1ArrayType;
  AIShip1AttTyp : AIShip1AttArrayType;
  AIShip1DeffTyp : AIShip1DeffArrayType;
  AIShip1RangeTyp : AIShip1RangeArrayType;

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:
26:
27:
28:
29:
30:
procedure Ship1Init;
var
  AIShip1 : integer;
  PosY  : integer;
begin
  ButtonKlick:=true;
  PosY:=10;
  for AIShip1 := 0  to ShipProRunde -1 do
  begin
    Main.AIShip1Typ[AIShip1]:=TImage.Create(Form1);
    AIShip1Typ[AIShip1].Parent:= Form1;
    AIShip1Typ[AIShip1].picture.LoadFromFile(ExtractFilePath(ParamStr(0))+'ship1.png');
    AIShip1Typ[AIShip1].autosize:=true;
    AIShip1Typ[AIShip1].Visible:=true;
    AIShip1Typ[AIShip1].Top:=PosX;
    AIShip1Typ[AIShip1].Left:=PosY;
//------------------------------------------------------------------------------
    AIShip1AttTyp[AIShip1]:=AIShip1Att;
    AIShip1DeffTyp[AIShip1]:=AIShip1Deff;
    AIShip1RangeTyp[AIShip1]:=AIShip1Range;
//------------------------------------------------------------------------------
    ShipVisi:=false;
    PosY:=PosY+50;
    //Posx:=PosX+2;
    if (PosY>=600then
    begin
      PosY:=0;
    end;
  end;
end;




also sollte ich das so nicht machen?