Delphi-PRAXiS
Seite 1 von 3  1 23      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   "eXtreme Towerdefence" - Trum Radios ? (https://www.delphipraxis.net/110521-extreme-towerdefence-trum-radios.html)

mimi 19. Mär 2008 11:39


"eXtreme Towerdefence" - Trum Radios ?
 
Hallo,
ich möchte das Spiel "eXtreme Towerdefence" nach machen mit meiner "2D Engine." Das ist so weit auch kein Problem.

Ein Problem habe ich jedoch und zwar: Jeder Turm soll ein Radios haben.
Beim Platzieren möchte ich diesen Radios anzeigen.

Also, ich habe unten mein Menu mit den Türmen die es gibt, jeder Turm hat sein Radios ich klicke auf ein Turm drauf gehe dann mit der Maus auf meine PaintBox jetzt soll der Radios in Form eines Kreis angezeigt werden.

Das Zweite:
Der Turm soll sich nur Gegner raussuchen die sich in diesen Radios bewegen.


Ausdem Buch:
"3D Programmierung mit Delphi für Kids"
habe ich folgende Funktion übernommen und angepasst:
Delphi-Quellcode:
procedure TForm1.ShotMove;
var
  strecke, Steigung:Single;
  xWeg,yWeg, xDiff, yDiff, Schritt, i, Speed,l,t:Integer;
 
begin

  Speed:=20;
  s3.left:=s2.left-(s1.Width div 2);
  s3.top:=s2.top-(s1.Height div 2);


  xWeg:=s1.Left - s2.Left;
  yWeg:=s1.Top - s2.Top;
 
  strecke:=sqrt(sqr(xWeg)+Sqr(yWeg));
  Schritt:=Round(Strecke/Speed);
 
  if Schritt = 0 then Schritt:=1;
  xDiff:=xWeg div Schritt;
  yDiff:=yWeg div Schritt;
 
  if xWeg <> 0 then Steigung:=yWeg/xWeg else Steigung:=999;
  for i:=1 to Schritt do begin
    s3.left:=s3.Left+xDiff;
    s3.top:=s3.Top+yDiff;
    application.ProcessMessages;
    s3.DrawSprite;
    if New then begin
      New:=False;
      exit;
    end;
    Sleep(200);
   
{    if (steigung >-1) and (Steigung < 1) then
      if xWeg < 0 then
        s3.left:=s3.left-s3.Width
      else
        s3.left:=s3.left+s3.Width;
     
    if (Steigung < -1) or (Steigung > 1) then
      if yWeg < 0 then
        s3.Top:=s3.Top-s3.Height
      else
        s3.Top:=s3.Top+s3.Height;}
  end;
  Timer1.Enabled:=False;
  Engine.NewAllDraw;
das geht auch wunderbar.

wie ich ein Kreis zeichne weiß ich auch. Nur das mit dem Radios weiß ich leider nicht.

:( Ein Suche hier im Forum brachte leider keine Ergebnisse :(

Das ist jetzt nur ein Test Projekt, was ich extra für dieses Problem angefangen habe.

3_of_8 19. Mär 2008 11:50

Re: "eXtreme Towerdefence" - Trum Radios ?
 
Geh einfach alle Gegner durch und schau nach, ob ihr Abstand zum Turm (Satz des Pythagoras, sqrt(deltaX²+deltaY²) kleiner dem Radius ist. (Oder, nicht so zeitaufwändig: deltaX²+deltaY²<radius²)

mimi 19. Mär 2008 12:17

Re: "eXtreme Towerdefence" - Trum Radios ?
 
Kannst du mir das genau beschrieben ? Sowas hatten wir leider nicht in Mathe in der Schule.
(und jetzt bin ich schon ca 4 Jahre Fertig mit der Schule :-D ).

Aurelius 19. Mär 2008 12:22

Re: "eXtreme Towerdefence" - Trum Radios ?
 
Wenn ich 3_of_8 Richtig verstanden habe:
Gegner hat Koordinaten: x1,y1
Dein Turm die Koords: x2,y2
Der Schussradius des Turms ist: r

Delphi-Quellcode:
if ((x1-x2)^2 + (y1-y2)^2) < r² then schießen;

3_of_8 19. Mär 2008 12:29

Re: "eXtreme Towerdefence" - Trum Radios ?
 
Die äußere Klammer kann man weglassen, im Code muss man das ^2 und das ² noch durch ein sqr() ersetzen, ansonsten passt es. (Außerdem sollte man noch <= schreiben statt <). Ich habe es in meinem Beitrag doch eh schon ganz genau beschrieben.

Es sei M(x1|y1). Ein Kreis k(M;r) ist definiert als die Menge aller Punkte P(x2|y2) mit d(M, k)<=r, also k(M;r)={P(x2|y2)|d(M, k)<=r} oder auch (nach dem Satz des Pythagoras, a²+b²=c²): k(M;r)={P(x2|y2)|(x2-x1)²+(y1-y2)²<=r²}

Daraus folgt: Wenn ein Punkt (ein Gegner in dem Fall) die Gleichung (x2-x1)²+(y1-y2)²<=r² erfüllt, liegt er im Kreis. (Dabei wird ein Gegner als punktförmig, aber das ist in dem Fall egal.

Fussball-Robby 19. Mär 2008 12:59

Re: "eXtreme Towerdefence" - Trum Radios ?
 
[Edit]Quatsch[/Edit]

mimi 19. Mär 2008 13:49

Re: "eXtreme Towerdefence" - Trum Radios ?
 
Delphi-Quellcode:
if ((x1-x2)^2 + (y1-y2)^2) < r² then schießen;
Danke, Was bedeutet das ^2 das hier drei mal vorkommt......?

Zitat:

Der Schussradius des Turms ist: r
r kann z.b. auf 5 stehen dann hätte der Turm ein Radio von 5....

Ich möchte das gerne auch anzeigen lassen... dazu gibt es ja die Procedure Ellipse von Canvas.
Aber wie berechne ich die 4 Parameter(n) ?

Namenloser 19. Mär 2008 13:51

Re: "eXtreme Towerdefence" - Trum Radios ?
 
x^2 bedeutet "x hoch 2", also x².

Fussball-Robby 19. Mär 2008 13:51

Re: "eXtreme Towerdefence" - Trum Radios ?
 
^2 heißt zum quadrat oder hoch 2, also ist (x1-x2)^2 das gleiche wie (x1-x2)*(x1-x2)

Aurelius 19. Mär 2008 13:52

Re: "eXtreme Towerdefence" - Trum Radios ?
 
Einfach nur quadrieren( a * a), der Code so funktioniert nicht. Du musst sqr() nehmen.

Delphi-Quellcode:
if (sqr(x1-x2) + sqr(y1-y2)) <= sqr(r) then schießen;
PS: Wie lautet die Ellipse-Funktion (also mit Parametern, hab grad kein Delphi zur hand)


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:11 Uhr.
Seite 1 von 3  1 23      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz