Delphi-PRAXiS
Seite 2 von 3     12 3      

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 13:55

Re: "eXtreme Towerdefence" - Trum Radios ?
 
Delphi-Quellcode:
procedure TForm1.Timer1Timer(Sender: TObject);
var
  r:Real;
begin
  if s1.Visible then begin
    r:=(s3.left-s2.Left)*(s3.Top-s2.top);

    s4.SpriteImage.Canvas.Brush.color:=clRed;
    s4.SpriteImage.Canvas.FillRect(0,0,100,20);
    s4.SpriteImage.Canvas.textout(0,0,Format('%f',[r]));
    s4.DrawSprite;

    if r <= 6 then begin
      writeln(sqr(r));
      ShotMove;
    end;
  end;
end;
So habe ich das jetzt allerdings ist r viel zu hoch.... muss ich mit r noch irgendwas machen ?

Delphi-Quellcode:
PS: Wie lautet die Ellipse-Funktion (also mit Parametern, hab grad kein Delphi zur hand)
x1,y1,x2,y2

edit:
teilweise geht das schon recht gut:
Delphi-Quellcode:
procedure TForm1.Timer1Timer(Sender: TObject);
var
  r:Real;
begin
  if s1.Visible then begin
    r:=sqr((s3.left-s2.Left)+(s3.Top-s2.top));

    s4.SpriteImage.Canvas.Brush.color:=clRed;
    s4.SpriteImage.Canvas.FillRect(0,0,100,20);
    s4.SpriteImage.Canvas.textout(0,0,Format('%f',[r]));
    s4.DrawSprite;

    if r <= 6 then begin
      writeln(sqr(r));
      ShotMove;
    end;
  end;
end;
Allerdings wenn der Gegner von den Ecken kommt, ist die Zahl zu hoch.

Fussball-Robby 19. Mär 2008 14:02

Re: "eXtreme Towerdefence" - Trum Radios ?
 
Du musst noch die Wurzel von r ziehen, das geht mit sqrt(r)
Und den Kreis machst du so (M ist ein TPoint und der Mittelpunkt deines Turmes):
Delphi-Quellcode:
const Radius=6;
begin
  Canvas.Ellipse(M.X-Radius,M.Y-Radius,M.X+Radius,M.Y+Radius);
end;
Mfg


[Edit]Muss das hier
Delphi-Quellcode:
r:=sqr((s3.left-s2.Left)+(s3.Top-s2.top));
Nicht so aussehen?
Delphi-Quellcode:
r:=sqrt(sqr(s3.left-s2.Left)+sqr(s3.Top-s2.top));
[/edit]

Aurelius 19. Mär 2008 14:03

Re: "eXtreme Towerdefence" - Trum Radios ?
 
Delphi-Quellcode:
r:=sqr(s3.left-s2.Left) + sqr(s3.Top-s2.top);
...
if sqrt(r) <= 6 then
//oder if r <= 36 then

mimi 19. Mär 2008 14:07

Re: "eXtreme Towerdefence" - Trum Radios ?
 
Delphi-Quellcode:
procedure TForm1.Timer1Timer(Sender: TObject);
var
  t:Real;
begin
  if s1.Visible then begin
    t:=sqr(s1.left-s2.Left) + sqr(s1.Top-s2.top); ;

    s4.SpriteImage.Canvas.Brush.color:=clRed;
    s4.SpriteImage.Canvas.FillRect(0,0,100,20);
    s4.SpriteImage.Canvas.textout(0,0,Format('%f',[t]));
    s4.DrawSprite;

    if sqr(t) <= 6 then begin
      ShotMove;
    end;
  end;
end;
so recht geht das noch nicht weil sqr(t)
viel zu hoch ist. was mache ich falsch ?

Vorhin hatte ich mich vertan s1 ist der Gegner s3 ist der Schuss *G* vom Turm.
oder sollte ich abs einsetzten(abs(s1.left-s2.left) ?

@Fussball-Robby
so bekomme ich werte über 1000

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

Re: "eXtreme Towerdefence" - Trum Radios ?
 
Die Verbesserungen von mir und xX0815Xx müssten aber funktionieren. Und ABS brauchst du nicht, da beim quadrieren IMMER eine positive Zahl rauskommt.

Mfg

[Edit]Ich sehe grade, es heißt nicht
Delphi-Quellcode:
    if sqr(t) <= 6 then begin
sondern
Delphi-Quellcode:
    if sqrt(t) <= 6 then begin
.
Sqr rechnet hoch 2, Sqrt zeiht die Wurzel.

Aurelius 19. Mär 2008 14:12

Re: "eXtreme Towerdefence" - Trum Radios ?
 
Delphi-Quellcode:
if sqr(t) <= 6
Das Muss sqrt() heißen, da das die Wurzel zieht. Sqr() quadriert das ja :D

Sowas passiert mir auch oft...

mimi 19. Mär 2008 14:16

Re: "eXtreme Towerdefence" - Trum Radios ?
 
kommt der sache schon nährer. Die zahlen liegen jetzt unter 100.

Also ist 5 zu klein. Wenn ich es richtig verstehe.

ich habe versuch den mittelpunkt zu berechnen und zwar so:
Delphi-Quellcode:
 mx1:=s1.left+(s1.Width div 2);
    my1:=s1.top+(s1.Height div 2);

    mx2:=s2.left+(s2.Width div 2);
    my2:=s2.top+(s2.Height div 2);

    t:=sqr(mx1-mx2)+sqr(my1-my2);
    s4.SpriteImage.Canvas.Brush.color:=clRed;
    s4.SpriteImage.Canvas.FillRect(0,0,100,20);
    s4.SpriteImage.Canvas.textout(0,0,Format('%f',[sqrt(t)]));
    s4.DrawSprite;

    if sqrt(t) <= 6 then begin
      ShotMove;
    end;
aber das scheint keine Auswirkung zu haben

Aufjeden Fall vielen dank schonmal an alle die mir geholfen haben.

Fussball-Robby 19. Mär 2008 14:18

Re: "eXtreme Towerdefence" - Trum Radios ?
 
Zitat:

Zitat von mimi
Also ist 5 zu klein. Wenn ich es richtig verstehe.

Ja, du verstehst es richtig. 5 - Das sind auf denm Bildschirm ca. 3 Milimeter :wink:

mimi 19. Mär 2008 14:23

Re: "eXtreme Towerdefence" - Trum Radios ?
 
BESTEN DANK ES GEHT. Ich musste nur den Radios anpassen.

Der Kreis wird jetzt auch angezeigt.

Zitat:

Ja, du verstehst es richtig. 5 - Das sind auf denm Bildschirm ca. 3 Milimeter
Ja habe ich gesehen als ich den Kreis gezeichnet habe. das 5 wohl etwas zu wenig sind, ich habe jetzt 100.
Delphi-Quellcode:
procedure TForm1.Timer1Timer(Sender: TObject);
const
  Radius=100;
var
  t:Real;
  mx1,my1,mx2,my2:Integer;
begin
  if s1.Visible then begin
    mx1:=s1.left+(s1.Width div 2);
    my1:=s1.top+(s1.Height div 2);

    mx2:=s2.left+(s2.Width div 2);
    my2:=s2.top+(s2.Height div 2);

    t:=sqr(mx1-mx2)+sqr(my1-my2);
    engine.OutCanvas.Brush.Style:=bsClear;
    engine.OutCanvas.Ellipse(mx2-Radius,my2-Radius,mx2+Radius,my2+Radius);
//    t:=sqr(s1.left-s2.Left) + sqr(s1.Top-s2.top);

    s4.SpriteImage.Canvas.Brush.color:=clRed;
    s4.SpriteImage.Canvas.FillRect(0,0,100,20);
    s4.SpriteImage.Canvas.textout(0,0,Format('%f',[sqrt(t)]));
    s4.DrawSprite;

    if sqrt(t) <= Radius then begin
      ShotMove;
    end;
  end;
end;
so sieht jetzt die ganze Procedure aus

Fussball-Robby 19. Mär 2008 14:27

Re: "eXtreme Towerdefence" - Trum Radios ?
 
Gut, das es jetzt klappt. Ich würde aber die Variablen mx1,mx2,my1,my2 durch 2 TPoints ersetzen. Das sähe dann so aus:
Delphi-Quellcode:
[...]
const
  Radius=100;
var
  t:Real;
  M1,M2:TPoint;
begin
  if s1.Visible then begin
    M1.X:=s1.left+(s1.Width div 2);
    M1.Y:=s1.top+(s1.Height div 2);

    M2.X:=s2.left+(s2.Width div 2);
    M2.Y:=s2.top+(s2.Height div 2);

    t:=sqr(M1.X-M2.X)+sqr(M1.Y-M2.Y);
[...]
Mfg


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:25 Uhr.
Seite 2 von 3     12 3      

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