![]() |
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 :-) |
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 ![]() |
Re: Frage zu Shapes: Shape2 soll Shape1 abblocken/reflektier
Zitat:
Wie genau mach ich das mit der Maus? Kannst du mir vielleicht jeden Schritt erklären? :| |
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:
ein. Im Ganzen sollte das nun so aussehen:
shpSchlaeger.Left := X - shpSchlaeger.Width div 2;
Delphi-Quellcode:
Nun F9 drücken und die Maus auf dem Formular bewegen.
procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer); begin shpSchlaeger.Left := X - shpSchlaeger.Width div 2; end; |
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. |
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. |
Re: Frage zu Shapes: Shape2 soll Shape1 abblocken/reflektier
Zitat:
und kann mir unter deiner Beschreibung nichts vorstellen, was ich mir jetzt vorstellen muss. Sorry und danke für deine Mühe |
Re: Frage zu Shapes: Shape2 soll Shape1 abblocken/reflektier
Dann mach Dir doch einfach eine Zeichnung.
|
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. |
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.
|
Re: Frage zu Shapes: Shape2 soll Shape1 abblocken/reflektier
Zitat:
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. |
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.
|
Re: Frage zu Shapes: Shape2 soll Shape1 abblocken/reflektier
Zitat:
Delphi-Quellcode:
Und das ist die mTBrett (Schläger):
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.
Delphi-Quellcode:
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:
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. |
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.
|
Re: Frage zu Shapes: Shape2 soll Shape1 abblocken/reflektier
Zitat:
Weißt du jetzt nicht was ich eingeben muss? Das kann doch nicht so schwer sein :( |
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] |
Re: Frage zu Shapes: Shape2 soll Shape1 abblocken/reflektier
Zitat:
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: |
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? |
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.
|
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 04:24 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz