hallo...
ich würde gerne nen BreakoutClone schreiben in Delphi mit nem Shape als Ball und Panels als Schläger und Bricks...
erst hatte ich diesen Quelltext selber geschrieben:
Delphi-Quellcode:
function TFormMain.collision(pCollisionObject: TPanel) : Boolean;
var
I: Integer;
J: Integer;
begin
result:=FALSE;
for J := 0 to pCollisionObject.Height do
begin
if ((SBall.Left+SBall.Width)=(pCollisionObject.Top+J)) then
begin
result:=TRUE;
end
else
begin
if (SBall.Top=(pCollisionObject.Top+J)) then
begin
result:=TRUE;
end
else
begin
for I := 0 to pCollisionObject.Width do
begin
if ((SBall.Top+SBall.Height)=(pCollisionObject.Left+I)) then
begin
result:=TRUE;
end
else
begin
if (SBall.Top=(pCollisionObject.Left+I)) then
begin
result:=TRUE;
end;
end;
end;
end;
end;
end;
end;
der funktioniert überhaupt nicht, dann hab ich von der Funktion IntersectRect gelesen,
die funktioniert zwar, aber ich weiß nicht wie ich damit das Reflektieren hinbekommen soll...
dann bin ich darauf gestoßen:
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?
den Quelltext kann ich nicht ganz nachvollziehen und ich weiß nicht was das mit dem Pannel PGrenze auf sich hat...
Vielleicht bin ich einfach zu doof
Grundsätzlich hab ich einfach nur vor den einfallswinkel je nach dem ob er > oder < 90,180 oder 270 bzw. 360 ist, in seiner differenz zu 180 zu behandeln.
(klingt komplizierter als es ist <siehe Anhang>)
__________________________________________________ __________________________________________________ __________
Jetz noch mal ganz bündig mein Problem: Mir fehlt bei IntersectRect der Einfallswinkel um den Ausfallswinkel zu berechnen und weiß nicht wie mans richtig machen muss....
Kann mir da bitte jemand helfen