![]() |
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:
Wäre Super, wenn mir jemand helfen könnte!
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. |
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. |
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 16:56 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