Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Frage zu Shapes: Shape2 soll Shape1 abblocken/reflektieren (https://www.delphipraxis.net/149351-frage-zu-shapes-shape2-soll-shape1-abblocken-reflektieren.html)

AddiDelphi 19. Mär 2010 11:13


Frage zu Shapes: Shape2 soll Shape1 abblocken/reflektieren
 
Hey Leute,

bin neu hier und hoffe, dass ich hier meine Frage in der richtigen Rubrik stelle. :stupid:


Ich bin im Moment dran, ein Spiel zu programmieren,
in dem man mit einem Schläger (Shape2) einen Ball (Shape1) wegschlagen muss.
Also wenn Shape1 auf Shape2 kommt, sollte die Y-Bewegung von Shape1 umgewandelt werden.

Wie stelle ich das an?

Achja, und ist es möglich das Brett statt mit seperaten Knöpfen per, MAUS oder Pfeiltasten nacht rechts oder links zu verschieben?

Bitte sehr ausführlich und einfach beschreiben, ist mein erstes Spiel! :hello:

Vielen Dank :-)

DeddyH 19. Mär 2010 11:27

Re: Frage zu Shapes: Shape2 soll Shape1 abblocken/reflektier
 
Hallo und Willkommen in der DP :dp:,

falls es sich wirklich um .NET handelt, kann ich nicht viel dazu sagen. Du könntest aber einmal die DP-Suche nach dem Stichwort Hier im Forum suchenKollisionsabfrage bemühen, da findest Du schon einige Ansätze. Und zur Bewegung des Schlägers: hierfür könntest Du z.B. das OnMouseMove-Ereignis des Formulars verwenden, damit kannst Du zumindest eine Maussteuerung implementieren.

AddiDelphi 19. Mär 2010 11:30

Re: Frage zu Shapes: Shape2 soll Shape1 abblocken/reflektier
 
Zitat:

Zitat von DeddyH
Hallo und Willkommen in der DP :dp:,

falls es sich wirklich um .NET handelt, kann ich nicht viel dazu sagen. Du könntest aber einmal die DP-Suche nach dem Stichwort Hier im Forum suchenKollisionsabfrage bemühen, da findest Du schon einige Ansätze. Und zur Bewegung des Schlägers: hierfür könntest Du z.B. das OnMouseMove-Ereignis des Formulars verwenden, damit kannst Du zumindest eine Maussteuerung implementieren.

Ich benutze Delphi 7, ist das Delphi.NET oder Delphi (Win23)?


Wie genau mach ich das mit der Maus? Kannst du mir vielleicht jeden Schritt erklären? :|

DeddyH 19. Mär 2010 12:03

Re: Frage zu Shapes: Shape2 soll Shape1 abblocken/reflektier
 
Delphi 7 ist definitiv Win32. Und zur Mausbewegung: pack Dir ein TShape auf Dein Formular und nenn es shpSchlaeger. Dann klickst Du auf das Formular, wechselst im Objektinspektor auf den Reiter "Ereignisse" und machst einen Doppelklick neben "OnMouseMove". Dort trägst Du nun die Zeile
Delphi-Quellcode:
  shpSchlaeger.Left := X - shpSchlaeger.Width div 2;
ein. Im Ganzen sollte das nun so aussehen:
Delphi-Quellcode:
procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
  shpSchlaeger.Left := X - shpSchlaeger.Width div 2;
end;
Nun F9 drücken und die Maus auf dem Formular bewegen.

AddiDelphi 19. Mär 2010 12:34

Re: Frage zu Shapes: Shape2 soll Shape1 abblocken/reflektier
 
Suuper!

Danke dir.

Jetzt muss ich es nurnoch hinbekommen, den Ball vom Schläger abprallen zu lassen..

das krieg ich nicht hin.

Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls,mtBall, mTBrett, StdCtrls, Buttons;

type
  TForm1 = class(TForm)
    Shape1: TShape;
    Button8: TButton;
    Button10: TButton;
    Timer1: TTimer;
    Button3: TButton;
    Button12: TButton;
    Shape2: TShape;
    BitBtn1: TBitBtn;
    Label1: TLabel;
    procedure FormCreate(Sender: TObject);
    procedure Button8Click(Sender: TObject);
    procedure Button10Click(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure Timer1Timer(Sender: TObject);
    procedure Button12Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure BitBtn1Click(Sender: TObject);
    procedure FormMouseMove(Sender: TObject; Shift: TShiftState; X,
      Y: Integer);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;
  Ball:TBall;
  Brett:TBrett;
  rechts:Integer;
  runter:Integer;
implementation

{$R *.dfm}




procedure TForm1.FormCreate(Sender: TObject);
begin
  Ball:=TBall.create;
  Brett:=TBrett.create;
  Ball.setzex (Shape1.left);
  Ball.setzey (Shape1.top);
  Brett.setzea (Shape2.left);
  Brett.Setzeb (Shape2.top);
  rechts:=5;
  runter:=5;

end;




procedure TForm1.Button8Click(Sender: TObject); //Brett links
begin
  Brett.bewegebrett(-20,0);
  Shape2.Left:=Brett.GibA;
  Shape2.Top:=Brett.GibB;
end;


procedure TForm1.Button10Click(Sender: TObject); //Brett rechts
begin
  Brett.bewegebrett(20,0);
  Shape2.Left:=Brett.GibA;
  Shape2.Top:=Brett.GibB;
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  Ball.free;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
  begin
    Ball.bewege(rechts,runter);
    Shape1.Left:=Ball.GibX;
    Shape1.Top:=Ball.GibY;

      if Ball.gibX>Form1.clientwidth-Shape1.width
          then
            begin
              rechts:=-rechts;
              Ball.setzeFarbe(clblue);
              Shape1.brush.color:=Ball.gibFarbe;
            end
      else
          if Ball.gibY>Form1.clientheight-Shape1.height
              then
                  begin
                        runter:=-runter;
                        timer1.Enabled:=false;
                        showmessage('Game Over Baby!')
                  end
      else
          if Ball.gibX<0
              then
                begin
                  rechts:=-rechts;
                  Ball.setzeFarbe(clyellow);
                   Shape1.brush.color:=Ball.gibFarbe;
                end
      else
          if Ball.gibY<0
            then
              begin
                runter:=-runter;
                Ball.setzeFarbe(clred);
                Shape1.brush.color:=Ball.gibFarbe;
              end

      else
          if

                   [b]HIER MUSS ES REIN... ABER WAS?[/b]

            then runter:=-runter;

end;

procedure TForm1.Button12Click(Sender: TObject);
begin
  timer1.Enabled:=false;
end;

procedure TForm1.Button3Click(Sender: TObject);
begin
  timer1.Enabled:=true;
end;

procedure TForm1.BitBtn1Click(Sender: TObject);
begin
  close;
end;

procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
  Shape2.Left := X - Shape2.Width div 2;
end;

end.

DeddyH 19. Mär 2010 12:44

Re: Frage zu Shapes: Shape2 soll Shape1 abblocken/reflektier
 
Überleg doch einmal: die Y-Koordinate (= Ball.Top) des Balls muss ja Schäger.Top - BallHeight sein (ggf. mit einer gewissen Toleranz). Und für X gibt es die folgenden Möglichkeiten:
- die linke Seite des Balls liegt zwischen der linken und der rechten Seite des Schlägers
- die rechte Seite des Balls liegt zwischen der linken und der rechten Seite des Schlägers
- die linke Seite des Balls ist kleiner als die linke des Schlägers und die rechte größer als die des Schlägers (völlige Überlappung)

Versuch das einmal in Code zu formulieren.

AddiDelphi 19. Mär 2010 13:12

Re: Frage zu Shapes: Shape2 soll Shape1 abblocken/reflektier
 
Zitat:

Zitat von DeddyH
Überleg doch einmal: die Y-Koordinate (= Ball.Top) des Balls muss ja Schäger.Top - BallHeight sein (ggf. mit einer gewissen Toleranz). Und für X gibt es die folgenden Möglichkeiten:
- die linke Seite des Balls liegt zwischen der linken und der rechten Seite des Schlägers
- die rechte Seite des Balls liegt zwischen der linken und der rechten Seite des Schlägers
- die linke Seite des Balls ist kleiner als die linke des Schlägers und die rechte größer als die des Schlägers (völlige Überlappung)

Versuch das einmal in Code zu formulieren.

Ich versuchs schon seit gestern..

und kann mir unter deiner Beschreibung nichts vorstellen, was ich mir jetzt vorstellen muss.

Sorry und danke für deine Mühe

DeddyH 19. Mär 2010 13:25

Re: Frage zu Shapes: Shape2 soll Shape1 abblocken/reflektier
 
Dann mach Dir doch einfach eine Zeichnung.

AddiDelphi 19. Mär 2010 14:12

Re: Frage zu Shapes: Shape2 soll Shape1 abblocken/reflektier
 
mit "die Y-Koordinate (= Ball.Top) des Balls muss ja Schäger.Top - BallHeight sein"

und "die linke / rechte Seite vom Schläger / Ball" ..


Darüber denke ich die ganze Zeit nach, kannst du mir nicht den Quellext geben?

Dann kann ichs ehernachvollziehen, da ich nicht genau weiß was du mir damit sagen willst (habs versucht zu zeichnen). :lol:

Danke.

DeddyH 20. Mär 2010 16:09

Re: Frage zu Shapes: Shape2 soll Shape1 abblocken/reflektier
 
Die untere Kante des Balls entspricht doch Ball.Top + Ball.Height, sind wir uns da einig? Dementsprechend ist dann die rechte Kante des Balls Ball.Left + Ball.Width, das gleiche gilt äquivalent für den Schläger. Nun kann man das ganz einfach ausrechnen, dafür muss ich Dir keinen Quelltext geben.

AddiDelphi 20. Mär 2010 17:13

Re: Frage zu Shapes: Shape2 soll Shape1 abblocken/reflektier
 
Zitat:

Zitat von DeddyH
Die untere Kante des Balls entspricht doch Ball.Top + Ball.Height, sind wir uns da einig? Dementsprechend ist dann die rechte Kante des Balls Ball.Left + Ball.Width, das gleiche gilt äquivalent für den Schläger. Nun kann man das ganz einfach ausrechnen, dafür muss ich Dir keinen Quelltext geben.

Ich stehe vollkommen auf dem Schlauch, wie kann ein Ball ne Kante haben? Meinst du den untersten Y-Punkt den der Ball haben kann?

Dann muss ja unterste Kante vom Ball > die Y-Koordinate vom Schläger an der Stelle sein, also

untere Kante vom Ball > als was?

Wenn ich bei mir Ball.Top/Height eingebe, steht da undefinierter Begriff, dabei hab ich es genauso gemacht wie bei dem Ball, da kommt keine Fehlermeldung.

DeddyH 20. Mär 2010 17:30

Re: Frage zu Shapes: Shape2 soll Shape1 abblocken/reflektier
 
Da ich Deine "Ball"-Klasse nicht kenne, kann ich Dir das auch nicht sagen. Aber anscheinend benutzt Du ein Shape, um den Ball zu zeichnen, also musst Du dann dessen Koordinaten zur Berechnung hernehmen.

AddiDelphi 20. Mär 2010 18:11

Re: Frage zu Shapes: Shape2 soll Shape1 abblocken/reflektier
 
Zitat:

Zitat von DeddyH
Da ich Deine "Ball"-Klasse nicht kenne, kann ich Dir das auch nicht sagen. Aber anscheinend benutzt Du ein Shape, um den Ball zu zeichnen, also musst Du dann dessen Koordinaten zur Berechnung hernehmen.

Das ist die mTBall:
Delphi-Quellcode:
UNIT mtBall;

interface

//--------------------  ggf Uses-Liste einfügen !  --------------------
uses graphics;

type
  TBall = class

  private //Attribute
    X : Integer;
    Y : Integer;
    Farbe : TColor;

  public //Methoden
    procedure bewege (px,py: Integer); virtual;
    procedure SetzeFarbe (pFarbe: TColor); virtual;
    procedure SetzeX (pX: Integer); virtual;
    procedure SetzeY (pY: Integer); virtual;
    function GibFarbe : TColor; virtual;
    function GibX : Integer; virtual;
    function GibY : Integer; virtual;
   

   end;

implementation

//+---------------------------------------------------------------------
//|         TBall: Methodendefinition
//+---------------------------------------------------------------------

//-------- bewege (public) ---------------------------------------------
procedure TBall.bewege (px,py: Integer);
begin
  x:=x+px;
  y:=y+py;
end;


//-------- SetzeFarbe (public) -----------------------------------------
procedure TBall.SetzeFarbe (pFarbe: TColor);
begin
  Farbe := pFarbe
end;

//-------- SetzeX (public) ---------------------------------------------
procedure TBall.SetzeX (pX: Integer);
begin
  X := pX
end;

//-------- SetzeY (public) ---------------------------------------------
procedure TBall.SetzeY (pY: Integer);
begin
  Y := pY
end;

//-------- GibFarbe (public) -------------------------------------------
function TBall.GibFarbe : TColor;
begin
  result := Farbe
end;

//-------- GibX (public) -----------------------------------------------
function TBall.GibX : Integer;
begin
  result := X
end;

//-------- GibY (public) -----------------------------------------------
function TBall.GibY : Integer;
begin
  result := Y
end;

end.
Und das ist die mTBrett (Schläger):
Delphi-Quellcode:
UNIT mTBrett;

interface

//--------------------  ggf Uses-Liste anpassen !  --------------------
uses Graphics;

type
  TBrett = class


  private //Attribute
    a : Integer;
    b : Integer;
    Farbe : TColor;

  public //Methoden
    procedure Bewegebrett (pa,pb: Integer); virtual;
    procedure SetzeA (pA: Integer); virtual;
    procedure SetzeB (pB: Integer); virtual;
    function GibA : Integer; virtual;
    function GibB : Integer; virtual;

   end;

implementation

//+---------------------------------------------------------------------
//|         TBrett: Methodendefinition
//+---------------------------------------------------------------------

//-------- Bewegebrett (public) ---------------------------------------------
procedure TBrett.Bewegebrett (pa,pb: Integer);
begin
  a:=a+pa;
  b:=b+pb;
end;

//-------- SetzeA (public) ---------------------------------------------
procedure TBrett.SetzeA (pA: Integer);
begin
  a := pa
end;

//-------- SetzeB (public) ---------------------------------------------
procedure TBrett.SetzeB (pB: Integer);
begin
  b := pB
end;

//-------- GibA (public) -----------------------------------------------
function TBrett.GibA : Integer;
begin
  result := a
end;

//-------- GibB (public) -----------------------------------------------
function TBrett.GibB : Integer;
begin
  result := b
end;






end.
Bitte hilf mir auf die Sprünge und sag mir was ich einfügen muss, alleine ohne Lösung wird das nix bei mir :shock:

DeddyH 20. Mär 2010 18:22

Re: Frage zu Shapes: Shape2 soll Shape1 abblocken/reflektier
 
Im Moment verstehe ich den Sinn der beiden Klassen noch nicht, außer dass Du alles doppelt machst (erst den Klassen etwas zuweisen, dann den Shapes). Rund wird das IMO erst dann, wenn die Klassen Properties (= Eigenschaften) bekommen und ihre Koordinaten dann in den Setter-Methoden selbst berechnen.

AddiDelphi 20. Mär 2010 18:30

Re: Frage zu Shapes: Shape2 soll Shape1 abblocken/reflektier
 
Zitat:

Zitat von DeddyH
Im Moment verstehe ich den Sinn der beiden Klassen noch nicht, außer dass Du alles doppelt machst (erst den Klassen etwas zuweisen, dann den Shapes). Rund wird das IMO erst dann, wenn die Klassen Properties (= Eigenschaften) bekommen und ihre Koordinaten dann in den Setter-Methoden selbst berechnen.

Genau so hat es uns unser Lehrer gezeigt..

Weißt du jetzt nicht was ich eingeben muss? Das kann doch nicht so schwer sein :(

DeddyH 20. Mär 2010 19:08

Re: Frage zu Shapes: Shape2 soll Shape1 abblocken/reflektier
 
Liste der Anhänge anzeigen (Anzahl: 1)
So, für den Ball hab ich jetzt einmal ein Beispiel erstellt. Schau Dir das einfach mal in Ruhe an.

[edit] Bevor jemand meckert: die Klasse ist noch nicht fertig, ich wollte den TE nur nicht mit Code "erschlagen" :mrgreen: [/edit]

sx2008 20. Mär 2010 20:12

Re: Frage zu Shapes: Shape2 soll Shape1 abblocken/reflektier
 
Zitat:

Zitat von AddiDelphi
habs versucht zu zeichnen

Mit dem Handy abfotografieren, auf den PC laden, mit Bildbearbeitung zurechtschneiden und als Anhang anfügen.

Warum gibt's eigentlich keine Maus mit eingebauter Kamera mit der man ein Schriftstück mit einem Klick fotografieren kann??
Und dass mir keiner meine Erfindung klaut... :spin:

AddiDelphi 22. Mär 2010 16:36

Re: Frage zu Shapes: Shape2 soll Shape1 abblocken/reflektier
 
Habs hinbekommen! Danke an alle die versucht haben, mir zu helfen :-D

Jetzt muss ich nurnoch rausfinden, wie ich einstelle, dass der Ball mit der Zeit immer schneller wird.
Stell ich das im Timer ein oder wie?

DeddyH 22. Mär 2010 17:08

Re: Frage zu Shapes: Shape2 soll Shape1 abblocken/reflektier
 
Entweder das Timer-Intervall runtersetzen oder die "Sprungweite" erhöhen. Letzteres könnte aber schnell unschön aussehen.

AddiDelphi 22. Mär 2010 17:45

Re: Frage zu Shapes: Shape2 soll Shape1 abblocken/reflektier
 
Liste der Anhänge anzeigen (Anzahl: 1)
Ja, wie schreibe ich das dann?

In den Timer? Zum Beispiel:

when 1min over then Intervall:=5
when 2min ober then Intervall:=4

usw..

Oder gehts auch einfacher?

das der sich Stück für Stück verschnellert, ohne abprubt beschleuningt, sondern kontinuierlich wie zum Beispiel beim beschleunigen eines Autos?


P.S.: Sollte genau so sein wie in diesem Spiel, was ich im Web gefunden habe. (s. Anhang)


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