Autor Beitrag
Smokey002
Hält's aus hier
Beiträge: 3



BeitragVerfasst: Sa 10.04.10 15:18 
hallo
Ich bin ein blutiger Anfänger, nur damit 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.

ausblenden volle Höhe 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:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
 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

Moderiert von user profile iconKha: Delphi-Tags hinzugefügt
Jann1k
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 866
Erhaltene Danke: 43

Win 7
TurboDelphi, Visual Studio 2010
BeitragVerfasst: Sa 10.04.10 16:08 
Das Problem ist, dass du im Timer die Werte für bx und by neu setzt. D.h. wenn deine Prozedur erkannt hat, dass der Ball abprallen soll und dx bzw dy entsprechend negiert, kommt vor der nächsten Bewegung dein Timer und setzt bx und by wieder auf die Startwerte.

Das mit der beweglichen Wand: Du kannst im OnMouseMove-Ereignis deiner Form, einfach ein Shape an den Mauszeiger "drankleben" lassen. Dann musst du nur noch im Timer schauen ob der Ball mit dem Shape kollidiert.
Smokey002 Threadstarter
Hält's aus hier
Beiträge: 3



BeitragVerfasst: Sa 10.04.10 19:18 
hi,

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

ausblenden volle Höhe 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:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
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?
Smokey002 Threadstarter
Hält's aus hier
Beiträge: 3



BeitragVerfasst: Sa 10.04.10 20:20 
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?
ALF
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1085
Erhaltene Danke: 53

WinXP, Win7, Win10
Delphi 7 Enterprise, XE
BeitragVerfasst: Sa 10.04.10 20:36 
CrossPost www.delphipraxis.net...nder+ball+hilfe.html
Solltest Du aber mindestens angeben!

Gruss Alf

_________________
Wenn jeder alles kann oder wüsste und keiner hätt' ne Frage mehr, omg, währe dieses Forum leer!