Delphi-PRAXiS
Seite 1 von 2  1 2      

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.


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:44 Uhr.
Seite 1 von 2  1 2      

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