Delphi-PRAXiS

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)

Relfend114 18. Feb 2015 13:52

Ball vom Paddle abprallen
 
Moin Leute,
habe jetzt wieder ein neues Problem undzwar kriege ich es nicht hin dass der Pong Ball vom Paddle abprallt. Ich habe schon so vieles versucht... Könnte mir jemand einen Tipp geben wie es denn machbar ist?

baumina 18. Feb 2015 13:57

AW: Ball vom Paddle abprallen
 
Google hat da echt nichts brauchbares ausgespuckt? Kann ich mir ja fast nicht vorstellen.

DeddyH 18. Feb 2015 14:04

AW: Ball vom Paddle abprallen
 
Es muss nicht einmal Google sein, die Forensuche sollte schon einige Treffer bringen (Stichwort Kollisionskontrolle).

Relfend114 18. Feb 2015 14:11

AW: Ball vom Paddle abprallen
 
Klar habe ich schon überall nachgeguckt nur handeln die anderen Beiträge nicht genau wie bei mir mit dem Paddle. Habe schon mal was von IntersectRect gelesen nur habe ich garkeine Ahnung wie man es anwendet.

Mavarik 18. Feb 2015 14:20

AW: Ball vom Paddle abprallen
 
An welcher Stelle hängt es den?

Relfend114 18. Feb 2015 14:23

AW: Ball vom Paddle abprallen
 
Also von den Wänden springt der Ball ab (also links und rechts). Links ist dann auch das Paddle jedoch fliegt der Ball einfach durch... und ich bekomm es einfach nicht hin dass er auch von dem Paddle abprallt...

BadenPower 18. Feb 2015 14:26

AW: Ball vom Paddle abprallen
 
Zitat:

Zitat von Relfend114 (Beitrag 1290376)
nur habe ich garkeine Ahnung wie man es anwendet.

Und wir haben keine Ahnung mit was Du arbeitest.

Läuft da eine GameEnginge, oder zeichnest Du das Paddle und den Ball selbst auf einen Canvas.

Oder, oder, oder...

Relfend114 18. Feb 2015 14:29

AW: Ball vom Paddle abprallen
 
Der Ball ist ein Timer und läuft halt auf einem kleinen Feld welches ein Shape ist. Das Paddle ist ebenfalls ein Shape

Mavarik 18. Feb 2015 14:36

AW: Ball vom Paddle abprallen
 
Zitat:

Zitat von Relfend114 (Beitrag 1290382)
Der Ball ist ein Timer und läuft halt auf einem kleinen Feld welches ein Shape ist. Das Paddle ist ebenfalls ein Shape

Läuft der Ball mit Geschwindigkeitsvektoren (Real) oder einfach nur als Integer : inc(X) inc(Y)?

BadenPower 18. Feb 2015 14:38

AW: Ball vom Paddle abprallen
 
Zitat:

Zitat von Relfend114 (Beitrag 1290382)
Der Ball ist ein Timer und läuft halt auf einem kleinen Feld welches ein Shape ist. Das Paddle ist ebenfalls ein Shape

Ein Timer ist eine Zeitkomponete und hat daher keine Form.
Dein Ball ist eher wahrscheinlich auch ein Shape, welches Du über einen Timer gesteuert, über die Oberfläche bewegen lässt.

Mach es uns doch nicht so schwer.
Lade mal Dein Projekt hoch.

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.

DeddyH 23. Feb 2015 12:26

AW: Ball vom Paddle abprallen
 
Mit XE auch nicht, und es würde mich wundern, wenn das mit XE7 ginge.

p80286 23. Feb 2015 16:28

AW: Ball vom Paddle abprallen
 
Also entweder

Delphi-Quellcode:
function TBall.Richtung: integer;
begin
   result := FRichtungX * -1;
end;
oder

Delphi-Quellcode:
function TBall.Richtung: boolean;
begin
   result:= FRichtungX<0;
// oder
//  result:= FRichtungX>-1;
end;
Wenn wir nur wüssten was Du willst:gruebel:

Gruß
K-H


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