Delphi-PRAXiS
Seite 2 von 3     12 3      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Ball vom Paddle abprallen (https://www.delphipraxis.net/183995-ball-vom-paddle-abprallen.html)

DeddyH 18. Feb 2015 14:59

AW: Ball vom Paddle abprallen
 
Oder erstell mal ein neues Projekt, benenne das Formular frmDemo und die Unit uDemoMain. Die überschreibst Du dann komplett mit dem folgenden Code und weist im Objektinspektor dem OnCreate-Ereignis die FormCreate-Methode zu.
Delphi-Quellcode:
unit uDemoMain;

interface

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

type
  TfrmDemo = class(TForm)
    procedure FormCreate(Sender: TObject);
  private
    { Private-Deklarationen }
    FPaddle: TPanel;
    FBall: TImage;
    FTimer: TTimer;
    procedure DoOnTimer(Sender: TObject);
    function Collision(FirstRect, SecondRect: TRect): Boolean;
  public
    { Public-Deklarationen }
  end;

var
  frmDemo: TfrmDemo;

implementation

{$R *.dfm}

const
  STEP = 2;

{ TfrmDemo }

function TfrmDemo.Collision(FirstRect, SecondRect: TRect): Boolean;
var
  OutRect: TRect;
begin
  Result := IntersectRect(OutRect, FirstRect, SecondRect);
end;

procedure TfrmDemo.DoOnTimer(Sender: TObject);
var
  PaddleRect, BallRect: TRect;
begin
  FBall.Top := FBall.Top + STEP;
  PaddleRect := Rect(FPaddle.Left, FPaddle.Top, FPaddle.Left + FPaddle.Width,
    FPaddle.Top + FPaddle.Height);
  BallRect := Rect(FBall.Left, FBall.Top, FBall.Left + FBall.Width,
    FBall.Top + FBall.Height);
  if Collision(PaddleRect, BallRect) then
    begin
      FTimer.Enabled := false;
      ShowMessage('Kollision');
    end;
end;

procedure TfrmDemo.FormCreate(Sender: TObject);
const
  EDGELENGTH = 20;
var
  FBitmap: TBitmap;
begin
  //Paddel erzeugen
  FPaddle := TPanel.Create(self);
  FPaddle.Parent := self;
  FPaddle.Top := ClientHeight - FPaddle.Height;
  FPaddle.Left := (ClientWidth - FPaddle.Width) div 2;
  //Ball erzeugen
  FBall := TImage.Create(self);
  FBall.Parent := self;
  FBall.Width := EDGELENGTH;
  FBall.Height := EDGELENGTH;
  FBall.Top := 0;
  FBall.Left := (ClientWidth - FBall.Width) div 2;
  //Ball malen und darstellen
  FBitmap := TBitmap.Create;
  try
    FBitmap.Width := EDGELENGTH;
    FBitmap.Height := EDGELENGTH;
    FBitmap.Canvas.Brush.Color := clRed;
    FBitmap.Canvas.Ellipse(0, 0, FBitmap.Width, FBitmap.Height);
    FBall.Picture.Assign(FBitmap);
  finally
    FBitmap.Free;
  end;
  //Timer erzeugen
  FTimer := TTimer.Create(self);
  FTimer.Interval := 20;
  FTimer.OnTimer := DoOnTimer;
end;

end.

Relfend114 18. Feb 2015 15:06

AW: Ball vom Paddle abprallen
 
Ich könnte vielleicht die Lösung gefunden haben aber jetzt habe ich ein weiteres Problem...
Ich möchte ja die Richtung des Balls ändern wenn er das Paddle berührt. Das mache ich mit FRichtungX := -FRichtungX.
Ich wollte FRichtungX := -FRichtungX in eine function einpacken damit es dann so aussieht: result := FRichtungX := -FRichtungX;
Dann kriege ich jedoch eine Fehlermeldung -.- wollte dann einfach diese function dann aufrufen wenn Paddle und Ball kollidieren.

DeddyH 18. Feb 2015 15:08

AW: Ball vom Paddle abprallen
 
Ich verstehe gerade nicht, wie eine Funktion da weiterhelfen bzw. was die zurückgeben soll.

Relfend114 18. Feb 2015 15:11

AW: Ball vom Paddle abprallen
 
Ich habe 2 Units und der Richtungswechsel soll bei der erste Unit passieren. Da FRichtungX jedoch in der 2 Unit im privat Teil steht, kann ich da nicht zugreifen und wollte es ganz einfach über diese function machen. Die function einfach in der 2ten unit im public teil schreiben und dann in der ersten unit verwenden um die Richtung zu wechseln. Ob Paddle und Ball kolliedieren hab ich auch in der ersten unit gemacht.

DeddyH 18. Feb 2015 15:14

AW: Ball vom Paddle abprallen
 
Wie soll diese Funktion denn aussehen? Und wenn Du schon auf 2 Units verteilst (was ja an sich nicht schlimm ist), dann verteile das doch auch richtig nach Kontext (eine Unit für die Logik und eine für die Darstellung), dann treten solche Probleme eigentlich gar nicht erst auf.

Relfend114 18. Feb 2015 15:18

AW: Ball vom Paddle abprallen
 
function TBall.Richtung: Boolean;
begin
result := FRichtungX := -FRichtungX;
end;

so sollte sie aussehen. Und dann einfach in der ersten Unit verwenden, wenn Kollision (paddle und ball) dann TBall.Richtung...

Jedoch kriege ich diese Fehlermeldung beim starten: [Fehler] mBall.pas(98): Inkompatible Typen: 'Boolean' und 'Integer'

Relfend114 18. Feb 2015 15:23

AW: Ball vom Paddle abprallen
 
Liegt es vllt dadrann das FRichtung mit Integer deklariert sind und die function Boolean sein soll?
Falls ja, wie sollte ich das lösen?

BadenPower 18. Feb 2015 15:25

AW: Ball vom Paddle abprallen
 
Zitat:

Zitat von Relfend114 (Beitrag 1290395)
function TBall.Richtung: Boolean;
begin
result := FRichtungX := -FRichtungX;
end;

Jedoch kriege ich diese Fehlermeldung beim starten: [Fehler] mBall.pas(98): Inkompatible Typen: 'Boolean' und 'Integer'

FRichtungX ist wohl ein Integer und das Ergebnis der Funktion ein Boolean.

Und da Boolean und Integer nicht kompatibel sind gibt es die Fehlermeldung.

Ohne das Du das Projekt hochlädst ist das hier das reinste Rätselraten.

Caps 23. Feb 2015 10:33

AW: Ball vom Paddle abprallen
 
Code:
result := FRichtungX := -FRichtungX;
Was ist denn das für eine Zuweisung?
Geht sowas neuerdings? Vielleicht sollte ich mich mal wieder belesen...

lg Caps

BadenPower 23. Feb 2015 11:51

AW: Ball vom Paddle abprallen
 
Zitat:

Zitat von Caps (Beitrag 1291074)
Code:
result := FRichtungX := -FRichtungX;
Was ist denn das für eine Zuweisung?
Geht sowas neuerdings? Vielleicht sollte ich mich mal wieder belesen...

Mit D2007 geht so etwas nicht.


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