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? |
AW: Ball vom Paddle abprallen
Google hat da echt nichts brauchbares ausgespuckt? Kann ich mir ja fast nicht vorstellen.
|
AW: Ball vom Paddle abprallen
Es muss nicht einmal Google sein, die Forensuche sollte schon einige Treffer bringen (Stichwort Kollisionskontrolle).
|
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.
|
AW: Ball vom Paddle abprallen
An welcher Stelle hängt es den?
|
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...
|
AW: Ball vom Paddle abprallen
Zitat:
Läuft da eine GameEnginge, oder zeichnest Du das Paddle und den Ball selbst auf einen Canvas. Oder, oder, oder... |
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
|
AW: Ball vom Paddle abprallen
Zitat:
|
AW: Ball vom Paddle abprallen
Zitat:
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. |
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. |
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. |
AW: Ball vom Paddle abprallen
Ich verstehe gerade nicht, wie eine Funktion da weiterhelfen bzw. was die zurückgeben soll.
|
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.
|
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.
|
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' |
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? |
AW: Ball vom Paddle abprallen
Zitat:
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. |
AW: Ball vom Paddle abprallen
Code:
Was ist denn das für eine Zuweisung?
result := FRichtungX := -FRichtungX;
Geht sowas neuerdings? Vielleicht sollte ich mich mal wieder belesen... lg Caps |
AW: Ball vom Paddle abprallen
Zitat:
|
AW: Ball vom Paddle abprallen
Mit XE auch nicht, und es würde mich wundern, wenn das mit XE7 ginge.
|
AW: Ball vom Paddle abprallen
Also entweder
Delphi-Quellcode:
oder
function TBall.Richtung: integer;
begin result := FRichtungX * -1; end;
Delphi-Quellcode:
Wenn wir nur wüssten was Du willst:gruebel:
function TBall.Richtung: boolean;
begin result:= FRichtungX<0; // oder // result:= FRichtungX>-1; end; 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