Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi DelphiX Kollisionsabfrage (https://www.delphipraxis.net/16291-delphix-kollisionsabfrage.html)

-homer- 14. Feb 2004 14:42


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-

-homer- 14. Feb 2004 15:46

Re: DelphiX Kollisionsabfrage
 
hi,

auch hier weiß keiner die lösung???


-homer- :cry: :cry:

Dagon 14. Feb 2004 15:52

Re: DelphiX Kollisionsabfrage
 
Einfach den Abprallen-Teil in die DoMove-Methode vom TPaddel reinschreiben. Das wärs. Und sonst zeig mal ein bisschen Code.

-homer- 14. Feb 2004 16:50

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-

-homer- 14. Feb 2004 16:53

Re: DelphiX Kollisionsabfrage
 
hi,

was ich vergessen habe zu sagen ist: Image0 = Ball, Image1 = Hintergrund, Image2 = Paddel.



-homer-

Dagon 14. Feb 2004 17:00

Re: DelphiX Kollisionsabfrage
 
Du solltest unbedingt mit Klassen arbeiten, sonst wird das nie was!

-homer- 14. Feb 2004 17:18

Re: DelphiX Kollisionsabfrage
 
hi,

geht das denn nicht auch ohne klassen???


-homer-

Dagon 14. Feb 2004 17:23

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.

-homer- 14. Feb 2004 19:42

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-

Dagon 14. Feb 2004 20:00

Re: DelphiX Kollisionsabfrage
 
So sieht die deklaration der Klasse aus (ist ein Beispiel, kann aber einfach erweitert werden):

Delphi-Quellcode:
  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;
Im Konstruktor ordnest du z. B. das Image dem Sprite zu, initialisierst die Startposition und alles was es sonst noch braucht:

Delphi-Quellcode:
  inherited Create (AParent);
  Image := Form1.DXImageList1.Items.Find('Ball');
  Width := Image.Width;
  Height := Image.Height;
  Winkel := 220;
  X := 200;
  y := 400;
  Z := 0;
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!).
Beispiel:
Delphi-Quellcode:
...
if isLeft in Form1.DXInput1.States then
  X := X - xDiff;
....
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:

Delphi-Quellcode:
if Sprite is TGegenstand then
  self.Dead;
Am besten du liest ein paar Tuts durch (sowohl zu den Klassen als auch zu DelphiX).

:hi:


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