Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi Problem mit Pixelcheck! (https://www.delphipraxis.net/66193-problem-mit-pixelcheck.html)

Joe_the_Junkie 26. Mär 2006 14:11


Problem mit Pixelcheck!
 
Ich habe einfach mal so, um ein bisschen mit DelphiX klarzulkommen, ein PONG programmiert. Wenn ich jetzt aber bei meinem Ball "Pixelcheck" auf true setze, dann geht dr Ball einfach durch den Schläger und ich weiß nicht wieso. Sonst so tut das programm aber halt nur nicht mit Pixelcheck:= true;

Hier der Quelltext:

Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, DXSounds, DXDraws, DXClass, DXSprite, DXInput,Math;

type
  TForm1 = class(TForm)
    DXDraw1: TDXDraw;
    DXInput1: TDXInput;
    DXSpriteEngine1: TDXSpriteEngine;
    DXTimer1: TDXTimer;
    DXImageList1: TDXImageList;
    DXSound1: TDXSound;
    procedure FormCreate(Sender: TObject);
    procedure DXTimer1Timer(Sender: TObject; LagCount: Integer);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

TBall = Class(TImagesprite)
  public
    procedure DoMove(Movecount: Integer);override; //Bewegung des Balles
    procedure DoCollision(Sprite: Tsprite;var Done: Boolean);override; //Hat der Schlaeger getroffen?
  end;

TSchlaeger = Class(TImagesprite)
  public
    procedure DoMove(Movecount: Integer);override; //Gewegung des Schlaegers

  end;

var
  Form1      : TForm1;
  Schlaeger1 : TSchlaeger; //Schlaeger des 1. Spielers
  Schlaeger2 : TSchlaeger; //Schlaeger des 2. Spielers
  Ball      : TBall;     //Der Ball ;-)
  mx,my,sy  : real;      //mx und my sind die Bewegung des Balles & Richtung! Sy die des Schlaegers
  coll      : boolean;   //Ist der Ball im aus?
  c         : integer = 0;//Wie oft wurde der Ball schon getroffen? Wenn mehr,dann wird der Ball schneller!
  p1,p2      : integer;   //Die Punkte der jeweiligen Spieler!

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
//DXDraw1.DoubleBuffered := True;
Schlaeger1 := TSchlaeger.Create(DXSpriteengine1.Engine); //Erstellen des ersten Schlaegers!
with Schlaeger1 do
  begin
    Image := DXImagelist1.Items.Items[0]; //Das bild audwählen!
    X := 20;                             //Die X-Position des Bildes
    Y := (480 div 2) - 32;               //Die Y-Position des Bildes
    Z := 0;
    Width := Schlaeger1.Image.Width;     //Die Breite des Bildes
    Height := Schlaeger1.Image.Height;   //Die Höhe des Bildes
  end;

Schlaeger2 := TSchlaeger.Create(DXSpriteengine1.Engine); //Der 2. Schläger
with Schlaeger2 do                                      //Die Angaben: Siehe oben!
  begin
    Image := DXImagelist1.Items.Items[0];
    X := 772;
    Y := (480 div 2) - 32 + 50;
    Z := 0;
    Width := Schlaeger2.Image.Width;
    Height := Schlaeger2.Image.Height;
  end;

Ball := TBall.Create(DXSpriteEngine1.Engine); //Der Ball
with Ball do                                 //Angaban: Siehe Schlaeger 1;
  begin
    //Pixelcheck := true;
    Image := DXImageList1.Items.Items[1];
    X := (800 div 2) - 8;
    Y := (480 div 2) - 8 + 50;
    Z := 0;
    Width := Ball.Image.Width;
    Height := Ball.Image.Height;
  end;
mx := -2; //X Bewegung des Balles;
my := -2; //Y Bewegung des Balles;
sy := 3; //Die Bewegung des Schlägers!
coll := false; //Noch keine Kollision;
p1 := 0; //Die Punkte der Spieler!
p2 := 0; //Die Punkte der Spieler!
end;

Procedure TSchlaeger.DoMove(MoveCount: Integer);
begin
  Inherited DoMove(Movecount);

  if IsUp in Form1.DXInput1.States then   //Wird Pfeil nach oben gedrückt, dann geht Schlaeger 1 nach oben!
    Schlaeger2.Y := Schlaeger2.Y - sy;

  if IsDown in Form1.DXInput1.States then //Wird Pfeil nach unten gedrückt, dann geht Schlaeger 1 nach unten!
    Schlaeger2.Y := Schlaeger2.Y + sy;

  if IsButton1 in Form1.DXInput1.States then //Wird die Taste Q gedrückt, dann geht Schlaeger 2 nach oben!
    Schlaeger1.Y := Schlaeger1.Y - sy;

  if IsButton2 in Form1.DXInput1.States then //Wird die Taste A gedrückt, dann geht Schlaeger 2 nach unten!
    Schlaeger1.Y := Schlaeger1.Y + sy;

  if Schlaeger1.Y < 57 then // Geht der Schlaeger über den Bildschrirm hinaus, wird er zurückgesetzt!
    Schlaeger1.Y := 57;

  if Schlaeger2.Y < 57 then
    Schlaeger2.Y := 57;

  if Schlaeger1.Y > 462 then
    Schlaeger1.Y := 462;;

  if Schlaeger2.Y > 462 then
    Schlaeger2.Y := 462;
end;

Procedure TBall.DoCollision(Sprite: TSprite; var Done: Boolean);
begin
  if (Sprite is TSchlaeger) then
    begin
      mx := mx * -1;
      inc(c);

      if (c mod 5) = 0 then
      begin
        mx := mx * 1.3;
        my := my * 1.3;
        sy := sy * 1.1;
      end;
    end;
end;

Procedure TBall.DoMove(MoveCount: Integer);
begin
  Inherited DoMove(MoveCount);
  Ball.X := Ball.X + mx;
  Ball.Y := Ball.Y + my;
  collision;                               //Kollidoert der Schlaeger?

  if (Ball.Y < 54) or (Ball.Y > 522) then
    my := my * -1;

  if Ball.X < 0 then
    begin
      inc(P2);
      Ball.X := (800 div 2) - 8;
      Ball.Y := (480 div 2) - 8 + 50;
      mx := 2;
      my := 2;
      sy := 3;
      coll := true;
      c := 0;
    end;

  if Ball.X > 800 then
    begin
      inc(P1);
      Ball.X := (800 div 2) - 8;
      Ball.Y := (480 div 2) - 8 + 50;
      mx := -2;
      my := -2;
      sy := 3;
      coll := true;
      c := 0;
    end;

end;

procedure TForm1.DXTimer1Timer(Sender: TObject; LagCount: Integer);
begin
DXInput1.Update;
DXDraw1.Surface.Fill(0);
with DXDraw1.Surface.Canvas do
  begin
    Brush.Style := bsClear;
    Font.Color := clWhite;
    Font.Name := 'BankGothic Md BT';
    Font.Size := 50;
    Textout(100, -10, inttostr(P1));
    Textout(640, -10, inttostr(P2));
    pen.Color := clWhite;
    pen.Width := 2;
    Moveto(0,50);
    lineto(800,50);
    release;
  end;

DXSpriteEngine1.Move(1);

DXSpriteEngine1.Draw;
DXDraw1.Flip;
if coll = true then
  sleep(300);

coll := false;
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
DXDraw1.Finalize;
end;

end.
Wäre Super, wenn mir jemand helfen könnte!

igel457 26. Mär 2006 14:23

Re: Problem mit Pixelcheck!
 
Verwendest du DelphiX oder UndelphiX? Bei UndelphiX funktioniert das Pixelcheck nicht. Im Notfall überschreib die TestCollision Methode deines Sprites und bau der selbst ein PixelCheck. Bei einem Ball ist das ja nicht besonders schwer.

PS: Außerdem must du "PixelCheck := true" in doMove von deinem Ball setzten.

ijcro 4. Apr 2006 20:16

Re: Problem mit Pixelcheck!
 
Hello

in version unDelphiX 1.06 was poke into DXClass unit some functions for intersection decide. So it can help for you.

Regards


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