![]() |
DelphiX Kollisionsabfrage
hi,
ich habe mich gerade daran gemacht DelphiX zu lernen. Als Übung habe ich mir selber eine Aufgabe gegeben: Das Spiel, EarthPong (Delphi/Demos), nachzumachen. Soweit habe ich alles geschafft (Der Ball springt munter hin und her). Nur eines klappt noch nicht: Den Ball davor zu stoppen, dass er unten aufkommt. Genau wie in dem DemoSpiel will ich das auch mittels Paddel machen (Der Ball soll wieder Apprallen). Ich weiß schon, wie ich das mit dem 'Abprallen' machen muss, aber leider weiß ich nicht, wie ich feststellen kann, wann der ball den schläger berührt. Gibt es hier jemanden, der eine Antwort darauf weiß??? -homer- |
Re: DelphiX Kollisionsabfrage
hi,
auch hier weiß keiner die lösung??? -homer- :cry: :cry: |
Re: DelphiX Kollisionsabfrage
Einfach den Abprallen-Teil in die DoMove-Methode vom TPaddel reinschreiben. Das wärs. Und sonst zeig mal ein bisschen Code.
|
Re: DelphiX Kollisionsabfrage
hi,
also das ist mein Code:
Delphi-Quellcode:
unit Unit1;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, DXDraws, DXSprite, StdCtrls, DXClass; type TForm1 = class(TForm) DXDraw1: TDXDraw; DXTimer1: TDXTimer; DXImageList1: TDXImageList; Blinks: TButton; Brechts: TButton; procedure FormActivate(Sender: TObject); procedure DXTimer1Timer(Sender: TObject; LagCount: Integer); procedure BlinksClick(Sender: TObject); procedure BrechtsClick(Sender: TObject); private { Private-Deklarationen } public { Public-Deklarationen } end; var Form1: TForm1; x: Integer = 0; y: Integer = 0; px: Integer = 320; vx: Integer = 1; vy: Integer = 1; implementation {$R *.dfm} procedure TForm1.FormActivate(Sender: TObject); begin Form1.Cursor := crCross; end; procedure TForm1.DXTimer1Timer(Sender: TObject; LagCount: Integer); begin if not DXDraw1.CanDraw then Exit; x := x + vx; y := y + vy; if x <= 0 then vx := vx * -1; if x >= DXDraw1.Width - DXImageList1.Items[0].Width then vx := vx * -1; if y <= 0 then vy := vy * -1; if y >= Form1.Height - DXImageList1.Items[0].Height then ShowMessage('Sie haben verloren!'); DXImageList1.Items[1].draw(DXDraw1.Surface, 0, 0, 0); DXImageList1.Items[0].Draw(DXdraw1.Surface, x, y, 0); DXImageList1.Items[2].Draw(DXDraw1.Surface, px, 400, 0); DXDraw1.Flip; DXDraw1.Surface.Fill(0); end; procedure TForm1.BlinksClick(Sender: TObject); begin px := px - 10; end; procedure TForm1.BrechtsClick(Sender: TObject); begin px := px + 10; end; end. Bin mal gespannt. -homer- |
Re: DelphiX Kollisionsabfrage
hi,
was ich vergessen habe zu sagen ist: Image0 = Ball, Image1 = Hintergrund, Image2 = Paddel. -homer- |
Re: DelphiX Kollisionsabfrage
Du solltest unbedingt mit Klassen arbeiten, sonst wird das nie was!
|
Re: DelphiX Kollisionsabfrage
hi,
geht das denn nicht auch ohne klassen??? -homer- |
Re: DelphiX Kollisionsabfrage
Ich würde eher sagen: nein. Die SpriteEngine und so ist in die Klasse TIMageSprite eingebetet. Du wirst also schwierigkeiten bei der Kollision haben und so. Mit Klassen istes einfacher, übersichtlicher, und einfach besser. Was spricht also dagegen?
P.S. Ich habs noch nie ohne Klassen versucht. |
Re: DelphiX Kollisionsabfrage
hi,
leider kenne ich mich mit Klassen noch nicht so aus. Kannst du mir da vielleicht ein Beispiel geben?? Danke, schon mal im Vorraus. -homer- |
Re: DelphiX Kollisionsabfrage
So sieht die deklaration der Klasse aus (ist ein Beispiel, kann aber einfach erweitert werden):
Delphi-Quellcode:
Im Konstruktor ordnest du z. B. das Image dem Sprite zu, initialisierst die Startposition und alles was es sonst noch braucht:
TBall = class (TImageSprite)
private Winkel: Extended; public constructor Create (AParent: TSprite); override; procedure DoMove (MoveCount: Integer); override; procedure DoCollision (Sprite:TSprite; var Done: Boolean); override; end;
Delphi-Quellcode:
In der DoMove-Methode schreibst du alles rein, was mit der Bewegung des jeweiligen Sprites zutun hat (auch die Kollision mit dem Rand eines Spielfelds kommt da rein!).
inherited Create (AParent);
Image := Form1.DXImageList1.Items.Find('Ball'); Width := Image.Width; Height := Image.Height; Winkel := 220; X := 200; y := 400; Z := 0; Beispiel:
Delphi-Quellcode:
Und in die DoCollision-Methode schreibst du alles rein, was mit der Kollision zutun hat. Folgendes Bsp. macht, dass wenn der Ball mit einem Gegenstand zusammen trifft er zerstört wird:
...
if isLeft in Form1.DXInput1.States then X := X - xDiff; ....
Delphi-Quellcode:
Am besten du liest ein paar Tuts durch (sowohl zu den Klassen als auch zu DelphiX).
if Sprite is TGegenstand then
self.Dead; :hi: |
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:31 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