Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi reflektierender Ball - Hilfe! (https://www.delphipraxis.net/150219-reflektierender-ball-hilfe.html)

Smokey002 10. Apr 2010 14:34


reflektierender Ball - Hilfe!
 
hallo
Ich bin ein blutiger Anfänger, nur damit ich mir eventuelle Kommentare erspare ;)
ich muss ein kleines Programm schreiben, das dafür sorgt das ein Ball an den Wänden einer Begrenzung (eine weiße quadratische shape) abprallt bzw nach dem Motto "Einfallswinkel=Ausfallswinkel" reflektiert wird.
Im Moment macht der Ball noch nicht das was ich von ihm will.

Delphi-Quellcode:

unit Uball;

interface

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

type
  TForm1 = class(TForm)
    sgrenze: TShape;
    sball: TShape;
    Timer1: TTimer;
    procedure Timer1Timer(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;
  bx: Integer;
  by: integer;
implementation

{$R *.DFM}

procedure TForm1.Timer1Timer(Sender: TObject);
begin
bx:=10;
by:=20;

       sball.left:=sball.left+bx;
       if sball.left < 0 then
          begin
               sball.left := 1;
               bx := -bx;
          end;
          if sball.left > sgrenze.width - sball.left then
          begin
          sball.left := sgrenze.width - sball.left;
          bx := -bx;
          end;

       sball.top := sball.top+by;
       if sball.top < 0 then
          begin
          sball.Top := 1;
          by := -by;
          end;
       if sball.top > sgrenze.height - sball.height then
          begin
          sball.top := sgrenze.height - sball.height;
          by := -by;
          end;

end;
end.
Ich bräuchte eure Hilfe!
Außerdem würde ich gerne eine dritte Shape als bewegliche Wand einbauen (Mousemove) um ein bisschen mit dem Ball herumzuspielen, weiß aber nicht wie ich das anstelle.

vielen Dank im Vorraus,

Smokey

mkinzler 10. Apr 2010 14:36

Re: reflektierender Ball - Hilfe!
 
Was macht das Programm bisher?
Das Problem könnten die großen Schrittweiten sein.

Corpsman 10. Apr 2010 14:38

Re: reflektierender Ball - Hilfe!
 
Hast du dir schon mal mein Sample zu dem Thema angesehen ?

mkinzler 10. Apr 2010 14:40

Re: reflektierender Ball - Hilfe!
 
Zitat:

Zitat von Corpsman
Hast du dir schon mal mein Sample zu dem Thema angesehen ?

Warum auch selber machen, wenn man gut kopieren kann :zwinker: :mrgreen:

LargoD 10. Apr 2010 14:43

Re: reflektierender Ball - Hilfe!
 
Das
bx:=10;
by:=20;
am Anfang der Timerroutine macht Dir natürlich die ganze Reflexion im nächsten Schritt wieder zunichte.

Gruß
Erich

Corpsman 10. Apr 2010 14:45

Re: reflektierender Ball - Hilfe!
 
Naja ich hoffe nicht das er alles Kopiert, aber ich finde es imme rfürterlich wenn ich da was von "Shape" lese, und dadie Kollision in dem Sample auch gleich berücksichtigt wird ....

Das zu schnelle bewegen hat übrigens u.U. das Tunneling Problem..

Smokey002 10. Apr 2010 14:46

Re: reflektierender Ball - Hilfe!
 
klar hab ich mir schon samples und beispiele angeschaut, nur kopieren will ich eigentlich nicht. Ich würde die Vorgehensweiße gerne selbst nachvollziehen.

Der Ball wird an der linken Wand einwandfrei und auch richtig reflektiert. Sobald er an die untere Wand kommt, bleibt er dort stehen und "zittert" so komisch, als ob er festhängt. Die rechte Wand erreicht der Ball erst gar nicht. Er dreht vorher schon um.
Ich weiß einfach nicht was falsch läuft.

mkinzler 10. Apr 2010 14:48

Re: reflektierender Ball - Hilfe!
 
http://www.delphipraxis.net/internal...145796#1145796

Der.Kaktus 10. Apr 2010 14:51

Re: reflektierender Ball - Hilfe!
 
Zitat:

Zitat von mkinzler
http://www.delphipraxis.net/internal_redirect.php?p=1145796#1145796

dat war wohl nix :gruebel:

Smokey002 10. Apr 2010 14:51

Re: reflektierender Ball - Hilfe!
 
Liste der Anhänge anzeigen (Anzahl: 1)
Im Moment sieht das ganze so aus. Vielleicht wisst ihr dann was nicht korrekt ist.

--> im Anhang

LargoD 10. Apr 2010 14:52

Re: reflektierender Ball - Hilfe!
 
Zitat:

Zitat von Smokey002
Ich weiß einfach nicht was falsch läuft.

Hallo, vielleicht mal Beitrag #5 lesen?

mkinzler 10. Apr 2010 14:54

Re: reflektierender Ball - Hilfe!
 
Zitat:

Zitat von Der.Kaktus
Zitat:

Zitat von mkinzler
http://www.delphipraxis.net/internal_redirect.php?p=1145796#1145796

dat war wohl nix :gruebel:

Doch
Zitat:

Hallo, vielleicht mal Beitrag #5 lesen?

Der.Kaktus 10. Apr 2010 14:57

Re: reflektierender Ball - Hilfe!
 
Zitat:

Zitat von mkinzler
Zitat:

Zitat von Der.Kaktus
Zitat:

Zitat von mkinzler
http://www.delphipraxis.net/internal_redirect.php?p=1145796#1145796

dat war wohl nix :gruebel:

Doch
Zitat:

Hallo, vielleicht mal Beitrag #5 lesen?

:oops:

Smokey002 10. Apr 2010 18:17

Re: reflektierender Ball - Hilfe!
 
hi,

danke für die Hilfe. Der Ball reflektiert jetzt korrekt.

Delphi-Quellcode:

unit Uball;

interface

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

type
  TForm1 = class(TForm)
    Timer1: TTimer;
    Schlaeger: TShape;
    Pgrenze: TPanel;
    sball: TShape;
    BStart: TButton;
    procedure Timer1Timer(Sender: TObject);
    procedure BStartClick(Sender: TObject);
    procedure SchlaegerMouseMove(Sender: TObject; Shift: TShiftState; X,
      Y: Integer);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;
  bx: Integer;
  by: integer;
implementation

{$R *.DFM}

procedure TForm1.BStartClick(Sender: TObject);
begin
     bx:=5;
     by:=5;
     Timer1.enabled:=true;
end;


procedure TForm1.Timer1Timer(Sender: TObject);
begin

       sball.left:=sball.left+bx;
       if sball.left < 0 then
          begin
          sball.left := 1;
          bx := -bx;
          end;
          if sball.left > pgrenze.width - sball.width then
          begin
          sball.left := pgrenze.width - sball.width;
          bx := -bx;
          end;

       sball.top := sball.top+by;
       if sball.top < 0 then
          begin
          sball.Top := 1;
          by := -by;
          end;
       if sball.top > pgrenze.height - sball.height then
          begin
          sball.top := pgrenze.height - sball.height;
          by := -by;
          end;

end;


procedure TForm1.SchlaegerMouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
Schlaeger.Left := X - Schlaeger.Width div 2;
end;

end.

Bei dem Mousemove procedure stimmt anscheinend auch etwas nicht. Meine Shape haftet sich sofort an die linke Wand und bewegt sich nur ab und zu mit meiner Maus. Aber auch nur um dann sofort wieder an die linke Wand zu hüpfen.

Wie kann ich einen Schläger programmieren?

schöni 10. Apr 2010 18:49

Re: reflektierender Ball - Hilfe!
 
Zitat:

Zitat von mkinzler
http://www.delphipraxis.net/internal_redirect.php?p=1145796#1145796

Da will mal wirklich einer eigene Leistung erbringen und im konkreten Fall nix kopieren und stattdessen siene Programmierschritte wirklich auch selber verstehen lernen, wie das von Leiten wie Dir und denen aus der OpenSource Sparte und einigen, die sich schon über Hausaufgabenthreads ausgelassen haben, vehement gefordert wird und Du verlinkst zum Angucken den eigenen Thread, den der altuell gelesen wird, statt eines nützlichen Beispiels oder einer nützlichen Erlärung, wie man reflektierende Bälle programmieren kann. Ist es mit der Wirtschaftskriese schon so weit, das kein Profiprogrammierer sich mehr leisten kann (odeer will), auch nur den geringsten Teil seines kostbaren Wissens preiszugeben?

mkinzler 10. Apr 2010 18:54

Re: reflektierender Ball - Hilfe!
 
Hast du den verlinkten Beitrag gelesen? Dort stand, was sein Fehler war!
Und mir fehlende Hilfsbereitschaft voirzuwesen find ich echt zu Kotzen!

schöni 10. Apr 2010 18:55

Re: reflektierender Ball - Hilfe!
 
Zitat:

Zitat von Corpsman
Naja ich hoffe nicht das er alles Kopiert, aber ich finde es imme rfürterlich wenn ich da was von "Shape" lese, und dadie Kollision in dem Sample auch gleich berücksichtigt wird ....

Das zu schnelle bewegen hat übrigens u.U. das Tunneling Problem..

Wo in der PowerPoint Präsentation steht was über das Tunneling Problem?

schöni 10. Apr 2010 18:59

Re: reflektierender Ball - Hilfe!
 
Zitat:

Zitat von mkinzler
Hast du den verlinkten Beitrag gelesen? Dort stand, was sein Fehler war!
Und mir fehlende Hilfsbereitschaft voirzuwesen find ich echt zu Kotzen!

Wäre deuutlicher gewesen, wenn ein Hinweis auf die Beitragsnummer dabei gestanden hätte. Vorschlag an die DP Moderatoren: Die Beitragsnummer ist recht klein geschrieben. Da muss man sogar bei ausdrücklich genannter Beitragsnummer sehr genau hin schauen.

Inzwischen hab ich aber gesehen, das Du Beitrag 5 gemeint hast. Nehme daher meinen Vorwurf zurück. Sorry also!

waldforest 10. Apr 2010 19:05

Re: reflektierender Ball - Hilfe!
 
Hallo,
hast du das OnMouseover an den Panel-Ereignis gebunden. Wenn es auf dem Form liegt kanns nicht funktionieren

Corpsman 10. Apr 2010 19:08

Re: reflektierender Ball - Hilfe!
 
Zitat:

Zitat von schöni
Zitat:

Zitat von Corpsman
Naja ich hoffe nicht das er alles Kopiert, aber ich finde es imme rfürterlich wenn ich da was von "Shape" lese, und dadie Kollision in dem Sample auch gleich berücksichtigt wird ....

Das zu schnelle bewegen hat übrigens u.U. das Tunneling Problem..

Wo in der PowerPoint Präsentation steht was über das Tunneling Problem?

Folie 64 - 78

Smokey002 10. Apr 2010 19:20

Re: reflektierender Ball - Hilfe!
 
ok danke erstmal den Leuten, die mir versucht haben zu helfen :)

habe jetzt den Ball und den Schläger.
Jetzt bräuchte ich noch eine Art Kollisionsabfrage zwischen den Beiden. Wie bewerkstellige ich dies?

waldforest 10. Apr 2010 20:03

Re: reflektierender Ball - Hilfe!
 
Hallo,
Zusätzlich zu den Panelgrenzen die Positione x/y des Schlägers mit den x/y Wetenn des Balls vergleichen.

Leanahtan 10. Apr 2010 21:33

Re: reflektierender Ball - Hilfe!
 
Zitat:

Zitat von schöni
Zitat:

Zitat von mkinzler
http://www.delphipraxis.net/internal_redirect.php?p=1145796#1145796

... und Du verlinkst zum Angucken den eigenen Thread, den der altuell gelesen wird, ...

:wall:
:roll:

mkinzler 11. Apr 2010 11:14

Re: reflektierender Ball - Hilfe!
 
Ich entschuldige mich nun förmlich überhaupt was geschrieben zu haben und überlege meine Moderatoren-Job aufzugeben!

Leanahtan 11. Apr 2010 11:45

Re: reflektierender Ball - Hilfe!
 
Sorry, da hast du was falsch verstanden. Als ich die Antworten auf deinen Link gelesen habe, habe ich den Drang verspürt, mit dem Kopf auf die Tastatur zu schlagen. Für mich war es eigentlich sofort einleuchtend, worauf der link hinweisen sollte. Wollte eigentlich nicht noch mehr Verwirrung stiften :oops:

Smokey002 11. Apr 2010 18:39

Re: reflektierender Ball - Hilfe!
 
Zitat:

Zitat von waldforest
Hallo,
Zusätzlich zu den Panelgrenzen die Positione x/y des Schlägers mit den x/y Wetenn des Balls vergleichen.

hallo,
mir ist nicht ganz klar wie ich die x/y Position des Schlägers mit denen des Balls vergleichen soll, da sich diese Werte ja andauernd verändern.

waldforest 11. Apr 2010 18:45

Re: reflektierender Ball - Hilfe!
 
Ja, dies ist richtig, aber prinzipiell erfolgt der Vergleich wie bei den Raumgrenzen des Panels, halt werden nicht die Panelgrenzen, sondern die des Schlägers als Wertepaar verglichen.


z.B. im Timer folgendes noch hinzufügen, hier kannst du über die .TOP auch noch ggf. einen sich im Raum bewegenden Schläger abfragen, also nicht nur einen Schläger der sich auf der x-Achse verändert.

Delphi-Quellcode:
procedure TForm1.Timer1Timer(Sender: TObject);
begin

 If ((sball.top+sball.Height >= Schlaeger.Top) and (sball.top <= Schlaeger.Top)) then
         if (sball.left >= Schlaeger.left-Schlaeger.Width) and (sball.left <= Schlaeger.left+Schlaeger.Width) then
             by := -by;

// und weiter im bereits bestehenden Code
Dies lässt sich sicherlich noch optimieren, ist aber einmal ein Ansatz.


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:15 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