Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Prism Object bewegung (richtungen) (https://www.delphipraxis.net/94895-object-bewegung-richtungen.html)

kevSTAR 27. Jun 2007 19:59


Object bewegung (richtungen)
 
Hi!

Wie kann ich ein object oder so wie z.B bei einem pong spiel in eine bestimmte richtung wandern lassen also z.B diagonal im 30° winkel oder so? und das wenn er die wand berührt, er zurück geworfen wird also im einfalls winkel = ausfallswinkel weiter wandert=

Chaismo 28. Jun 2007 16:21

Re: Object bewegung (richtungen)
 
Also Objekte kannst du mit left und top bewegen...willst du das Objekt um eins nach rehcts verschieben setzt du Left einfach eins weiter also z.B.
Delphi-Quellcode:
Panel1.left:=Panel1.left +1
nach links dann minus :wink:
Nach unten bewegst du das ann mit
Delphi-Quellcode:
Panel1.top:=Panel1.top+1
Nach unten dann auch wieder minus :zwinker:
Wenn du das Objekt an der Wand abprallen lassen willst musst du das kontolieren, indem du schaust, ob der Rand des Objektes am Rand vom Fenster bzw. PaintBox o.ä. ist.
Heist also...
Delphi-Quellcode:
Repeat
Panel1.left:=Panel1.left+1 
Until Panel1.left=Form1.width-Panel1.width

Namenloser 28. Jun 2007 16:38

Re: Object bewegung (richtungen)
 
Hi,
Ich glaube, es geht um einen beliebigen Winkel, beine Lösung ist immer 45°.
Eigentlich ist das nicht sonderlich kompliziert.

Pseudocode:
Delphi-Quellcode:
var
  winkel: double; // winkel im bogenmaß: von 0 bis 2pi
  x,y: double;

[...]

procedure move;
begin
  x := x+cos(winkel); // cos für horizontale bewegung
  y := y+sin(winkel); // sin für vertikale bewegung

  panel1.left := round(x);
  panel1.top := round(y);
end;

Nikolas 28. Jun 2007 16:46

Re: Object bewegung (richtungen)
 
Du solltest vor dein cos(winkel) noch einen Faktor setzen, da sonst dein round darunter Probleme machen wird.

Und auch das ist noch zu viel gedacht. Wenn du nur an den Schlägern und den Wänden abprallen willst, reicht es einfach eine der Geschwindigkeiten umzudrehen. Also:

Delphi-Quellcode:
doube vx, vy;

if (Ball.y<10  or Ball.y > form.Height-10 ) then vy = -vy;
Das gleiche noch mit x und anstatt der 10 einen passenderen Wert. Und fertig. So einfach.

Zur Bewegung einfach einen Timer nehmen und alle x ms (x =x +vx ) ausführen. Für ein einfaches Pong reicht das auf jeden Fall.

kevSTAR 28. Jun 2007 16:49

Re: Object bewegung (richtungen)
 
Hmm also sagen wir mal ein object ist in der mitte der form, wie kann ich ihn dann in eine zufällige also random richtung laufen lassen?

Nikolas 28. Jun 2007 16:56

Re: Object bewegung (richtungen)
 
Du nimmst dir vier real variablen x,y,vx, vx. (global)

Mit Random (F1 nachschlagen) setzt du sie auf einen Wert (je nach Timereinetstellung vielleicht auf 5-10).

Dann ziehst du eine Timerkomponente auf das Form (Reiter System), setzt sein Intervall auf 100 (wäre dann eine zehntel Sekunde).
Dort schreibst du dann x := x+vx; y := y+vy; und zeigst dann dein Objekt irgendwie auf dem Formular an.

Namenloser 28. Jun 2007 17:01

Re: Object bewegung (richtungen)
 
Zitat:

Zitat von Nikolas
Du solltest vor dein cos(winkel) noch einen Faktor setzen, da sonst dein round darunter Probleme machen wird.

Stimmt, ein Faktor für die Distanz könnte natürlich nicht Schaden, aber mit round wird es hier keine Probleme geben, weil der wert ja nicht direkt gerundet ans Panel übergeben wird, sondern zu den Variablen x bzw. y addiert werden. Erst die werden dann gerundet ans Panel übergeben.

kevSTAR 28. Jun 2007 17:07

Re: Object bewegung (richtungen)
 
var
Form1: TForm1;
x1,y1,winkel: double;
x,y: integer;
implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
winkel := 40;
x := 100;
y := 100;
paintbox1.canvas.Pen.Color := clblack;
Paintbox1.Canvas.MoveTo(100,100);
x1 := 100+cos(winkel);
y1 := 100+sin(winkel);
x := round(x1 * 20);
y := round(y1 * 20);
Paintbox1.Canvas.LineTo(x,y);
end;



wieso geht das nicht?

Nikolas 28. Jun 2007 17:18

Re: Object bewegung (richtungen)
 
Zitat:

wieso geht das nicht?
Ist auf Platz 1 der schlechtesten Fehlerbeschreibungen der Welt :wall:

WAS geht nicht? Fehlermeldungen? Wird nichts angezeigt? Was soll angezeit werden? Welchen Wert für x und y erwartest du?

sirius 28. Jun 2007 17:25

Re: Object bewegung (richtungen)
 
Zitat:

Zitat von Nikolas
Zitat:

wieso geht das nicht?
Ist auf Platz 1 der schlechtesten Fehlerbeschreibungen der Welt :wall:

WAS geht nicht? Fehlermeldungen? Wird nichts angezeigt? Was soll angezeit werden? Welchen Wert für x und y erwartest du?

Hier ist keine Fehlerbeschreibung notwendig.
Ich glaube das Programm sagt alles! :zwinker:

1. Im FormCreate gibts doch noch nicht einmal eine Paintbox!
2. sin und cos erwarten Bogenmaß!

kevSTAR 28. Jun 2007 17:32

Re: Object bewegung (richtungen)
 
was ist bogenmaß?

Namenloser 28. Jun 2007 17:48

Re: Object bewegung (richtungen)
 
Das habe ich in meinem ersten Post bereits geschrieben: Statt eine 360°-Einteilung hast du hier eine Einteilung von 0 bis 2pi.
Um einen "normalen" Winkel ins Bogenmaß umzurechnen rechnest du *pi/180.

das hier ist Vermurkst:
Delphi-Quellcode:
x1 := {100+}cos(winkel); // Hier ist das falsch
y1 := {100+}sin(winkel); // "
x := round(x1 * 20)+100; // eher hier ;) sonst wird die 100 ja mitmultipliziert und du zeichnest irgendwo ins nirgendwo (Koordinate > 2000)
y := round(y1 * 20)+100; // "

kevSTAR 28. Jun 2007 18:04

Re: Object bewegung (richtungen)
 
hmm es geht immernoch nicht..

ich möchte eine gerade zeichnen in einem angegebenen winkel aber es geht nicht habe folgednes:

form create:

winkel := 90 * pi / 180;
x := 100;
y := 100;
x1 := cos(winkel);
y1 := sin(winkel);
x := round(x1)+500;
y := round(y1)+500;


paintbox.paint:

paintbox1.canvas.Pen.Color := clblack;
Paintbox1.Canvas.MoveTo(100,100);
Paintbox1.Canvas.LineTo(x,y);

kevSTAR 28. Jun 2007 18:42

Re: Object bewegung (richtungen)
 
hm? keiner 'ne idee?

Namenloser 28. Jun 2007 19:41

Re: Object bewegung (richtungen)
 
Gib den Leuten doch auch mal Zeit, deinen Beitrag zu lesen. Pushen ist erst ab 24 Stunden erlaubt.

Delphi-Quellcode:
winkel := 90 * pi / 180;
x := 100;
y := 100;
x1 := cos(winkel);
y1 := sin(winkel);
x := round(x1)+500;
y := round(y1)+500;


paintbox.paint: // btw: das hier kann gar nicht gehen, weil da ein Doppelpunkt statt einem Semikolon steht

paintbox1.canvas.Pen.Color := clblack;
Paintbox1.Canvas.MoveTo(100,100);
Paintbox1.Canvas.LineTo(x,y);
Was mir als erstes auffällt ist, dass du x und y den wert 100 zuweist, den du aber nie benutzt. Außerdem kannst du im OnCreate noch nicht zeichnen. Packe das ganze Zeug in's OnPaint des Formulars oder noch besser der Paintbox. Außerdem hast du einen großen Denkfehler drin: Wenn du eine längere Linie Zeichnen willst, musst du x1 und y1 mit einem Wert multiplizieren, nicht einen Wert dazuaddieren!

kevSTAR 28. Jun 2007 20:53

Re: Object bewegung (richtungen)
 
Zitat:

Zitat von NamenLozer
Gib den Leuten doch auch mal Zeit, deinen Beitrag zu lesen. Pushen ist erst ab 24 Stunden erlaubt.

Delphi-Quellcode:
winkel := 90 * pi / 180;
x := 100;
y := 100;
x1 := cos(winkel);
y1 := sin(winkel);
x := round(x1)+500;
y := round(y1)+500;


paintbox.paint: // btw: das hier kann gar nicht gehen, weil da ein Doppelpunkt statt einem Semikolon steht

paintbox1.canvas.Pen.Color := clblack;
Paintbox1.Canvas.MoveTo(100,100);
Paintbox1.Canvas.LineTo(x,y);
Was mir als erstes auffällt ist, dass du x und y den wert 100 zuweist, den du aber nie benutzt. Außerdem kannst du im OnCreate noch nicht zeichnen. Packe das ganze Zeug in's OnPaint des Formulars oder noch besser der Paintbox. Außerdem hast du einen großen Denkfehler drin: Wenn du eine längere Linie Zeichnen willst, musst du x1 und y1 mit einem Wert multiplizieren, nicht einen Wert dazuaddieren!

das mit dem : was du kommentiert hast heisst nur das die folgenden zeilen in der onpaint prozedur der paintbox sind ;) er macht trotzdem nich das richtige


EDIT:


so habe ich es jetzt:



procedure TForm1.FormCreate(Sender: TObject);
begin
winkel := 90 * pi / 180;
x := clientwidth div 2;
y := clientheight div 2;
x1 := x+cos(winkel);
y1 := x+sin(winkel);
x := round(x1);
y := round(y1);

end;

procedure TForm1.PaintBox1Paint(Sender: TObject);
begin
paintbox1.canvas.Pen.Color := clblack;
Paintbox1.Canvas.MoveTo(ClientWidth div 2,clientheight div 2);
Paintbox1.Canvas.LineTo(x,y);
end;

Chaismo 29. Jun 2007 06:18

Re: Object bewegung (richtungen)
 
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var winkel, x,y,x1,y1:Double;
begin
PaintBox1.repaint;
x := PaintBox1.Width div 2;//nicht von dem ganzen FEnster sondern doch nur von der PaintBox oder?  :wink:
y := PaintBox1.height div 2;
randomize;
Winkel:=random(359)+1; //Zufallswinkel
Winkel:=Winkel*Pi/180;
x1:=x*cos(Winkel);//addieren nützt da nix..das muss multipliziert werden
y1:=y*sin(Winkel);
PaintBox1.Canvas.MoveTo(round(x),round(y));
PaintBox1.Canvas.LineTo(round(x1),round(y1));
Button1.Caption:=FloatToStr(Winkel);//damit siehst du gleich welches Bogenmaß verwendet wird...
end;
Die Linie wird aber nur in den linken oberen Quadranten gezeichnet aufgrund das der Wert für x1 und y1 immer kleiner sind als x und y
(der sinus, cosinus und Tangens wird nie höher als 1 :gruebel: ) vieleicht lässt du es per random dann nach links/recht oben/unten zeichnen mit...
Delphi-Quellcode:
var i:Integer;
begin
randomize;
i:=random(2);
If i=1 then x1:=x+x1;
Üfr oben /unten nimmste dann einfach y1 :angel2:

Nikolas 29. Jun 2007 07:47

Re: Object bewegung (richtungen)
 
Zitat:

der sinus, cosinus und Tangens wird nie höher als 1
Der Tangens hat die Eigenschaft für x->pi/4 gegen unendlich zu divergieren...

@ KevStar: Hast du eigentlich jemals schon von Sinus und Cosinus gehört? Les doch erst mal die Wikipedia Artikel durch, damit du weisst, was du eigentlich willst. Und dann nimm dir einen Taschenrechner und rechne dein Programm mal von Hand durch und male es dir auf einen Zettel. Sonst wirst du immer nur rumschreiben und hast im Endeffekt keine Ahnung, was du eigentlich machst.
Du must also erstmal selber genau wissen, wie du etwas berechnest, bevor du den Coumputer daran setzt.

Chaismo 29. Jun 2007 12:48

Re: Object bewegung (richtungen)
 
Zitat:

Zitat von Nikolas
Zitat:

der sinus, cosinus und Tangens wird nie höher als 1
Der Tangens hat die Eigenschaft für x->pi/4 gegen unendlich zu divergieren...

Jo stimmt...da war ich etwas zu voreilig :wall:
Naja egal...aber Nikolas hat schon recht...setz dich ersteinmal mit dem mathematischen Hintergrund auseinander, dann klappt das schon :thumb:


Alle Zeitangaben in WEZ +1. Es ist jetzt 05:52 Uhr.

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