AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Multimedia Delphi Problem mit Pixelcheck!
Thema durchsuchen
Ansicht
Themen-Optionen

Problem mit Pixelcheck!

Ein Thema von Joe_the_Junkie · begonnen am 26. Mär 2006 · letzter Beitrag vom 4. Apr 2006
Antwort Antwort
Joe_the_Junkie
(Gast)

n/a Beiträge
 
#1

Problem mit Pixelcheck!

  Alt 26. Mär 2006, 15:11
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!
  Mit Zitat antworten Zitat
Benutzerbild von igel457
igel457

Registriert seit: 31. Aug 2005
1.622 Beiträge
 
FreePascal / Lazarus
 
#2

Re: Problem mit Pixelcheck!

  Alt 26. Mär 2006, 15:23
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.
Andreas
"Sollen sich auch alle schämen, die gedankenlos sich der Wunder der Wissenschaft und Technik bedienen, und nicht mehr davon geistig erfasst haben als die Kuh von der Botanik der Pflanzen, die sie mit Wohlbehagen frisst." - Albert Einstein
  Mit Zitat antworten Zitat
ijcro

Registriert seit: 30. Mär 2006
37 Beiträge
 
Delphi XE Professional
 
#3

Re: Problem mit Pixelcheck!

  Alt 4. Apr 2006, 21:16
Hello

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

Regards
ijcro
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:14 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