Einzelnen Beitrag anzeigen

N4r0

Registriert seit: 7. Feb 2010
14 Beiträge
 
#18

Re: Space Invaders in Delphi5

  Alt 14. Feb 2010, 16:53
Gut, ich habe jetzt mal was zusammengebastelt und mich würde interessieren, ob ich das soweit richtig verstanden habe:

Ich habe eine Basisklasse "TBasis" erstellt:

Delphi-Quellcode:
unit UnitBasis;

interface
uses extctrls;

  type TBasis = class

        protected

            Invader : array[1..21] of TImage;
            Spielfeld,
            Raumschiff,
            Schuss,
            Invader1,
            Invader2,
            Invader3,
            Invader4,
            Invader6,
            Invader7,
            Invader5,
            Invader8,
            Invader9,
            Invader10,
            Invader11,
            Invader12,
            Invader13,
            Invader14,
            Invader15,
            Invader16,
            Invader17,
            Invader18,
            Invader19,
            Invader20,
            Invader21 : TImage;

           procedure MoveSpaceShip ; virtual; abstract;
           function MoveInvader(level: integer): boolean; virtual; abstract;
           procedure ShotCreate ; virtual; abstract;
           procedure MoveShot ; virtual; abstract;
           function Collision(Schuss : TImage ; i : integer) : boolean; virtual; abstract;


   end;

implementation

end.
Vor dieser Klasse habe ich nun drei weitere Klassen abgeleitet:


"TSpaceShip":

Delphi-Quellcode:
unit UnitSpaceShip;

interface
uses UnitBasis, Dialogs, Windows;

  type TSpaceShip = class (TBasis)

        protected

           procedure MoveSpaceShip ;

  end;


implementation


   procedure TSpaceShip.MoveSpaceShip ;

   begin

      if getasynckeystate(VK_RIGHT)<>0 then
             Raumschiff.left := Raumschiff.left + 8
        else if getasynckeystate(VK_LEFT) <> 0 then
             Raumschiff.left := Raumschiff.left - 8;

        if Raumschiff.left < Spielfeld.left then
           Raumschiff.left := Spielfeld.left + 2
        else if Raumschiff.left + Raumschiff.width > Spielfeld.left + Spielfeld.width then
           Raumschiff.left := Spielfeld.left + Spielfeld.width - Raumschiff.width - 2;

   end;

end.

"TInvader":

Delphi-Quellcode:
unit UnitInvader;

interface
uses UnitBasis, Dialogs;

  type TInvader = class (TBasis)

        protected


           Bewegungsrichtung : integer;

           function MoveInvader( level: integer): boolean;

  end;

implementation


  function TInvader.MoveInvader(level: integer): boolean;

     var i,x,y : integer;

  begin


      for i := 1 to 21 do
      begin
        Invader[i].left := Invader[i].left + (Bewegungsrichtung * 10);
      end;

      if Invader7.left + Invader7.width > Spielfeld.left + Spielfeld.width then
      begin
        i := 1;
        for x := 1 to 3 do
          for y := 1 to 7 do
            begin
              Invader[i].top := Invader[i].top + 25;
              Invader[i].left := Spielfeld.left + Spielfeld.width - ((Invader[i].width + 7) * (8 - y)) - 2;
              i := i + 1;
            end;
        Bewegungsrichtung := -1
      end else
      if Invader1.left < Spielfeld.left then
      begin
        i := 1;
        for x := 1 to 3 do
          for y := 1 to 7 do
            begin
              Invader[i].top := Invader[i].top + 25;
              Invader[i].left := Spielfeld.left + ((Invader[i].width + 7) * (y - 1)) + 9;
              i := i + 1;
            end;
        Bewegungsrichtung := 1
      end;

      for i := 21 downto 1 do
        if (Invader[i].visible = true) and (Invader[i].top + Invader[i].height >= Raumschiff.top - 10) then
        begin
          showmessage('Game Over');
          break;
        end;

  end;

end.

und "TBullet":

Delphi-Quellcode:
unit UnitBullet;

interface
uses UnitBasis, extctrls, MMSystem, Unit1;

   type TBullet = class (TBasis)

       protected

           Schuss1 : array of TImage;

           procedure ShotCreate;
           procedure MoveShot;
           function Collision(Schuss : TImage ; i : integer) : boolean;

   end;

implementation


  procedure TBullet.ShotCreate ;

    var Schusstemp : TImage;

  begin

       SndPlaySound( '.\pew.wav', SND_ASYNC );

       Schusstemp := TImage.Create(FormStarship);

       Schusstemp.Parent := FormStarship; // this is important
       Schusstemp.Left := Raumschiff.left + (RaumSchiff.width div 2); // X coordinate
       Schusstemp.Top := RaumSchiff.top - 20; // Y coordinate

       Schusstemp.Picture := Schuss.Picture;

       SetLength(Schuss1, High(Schuss1) + 2);

       Schuss1[High(Schuss1)] := Schusstemp;

  end;


  function TBullet.Collision(Schuss : TImage ; i : integer) : boolean;

   var xposition, yposition: integer;

   begin

       Collision := false;

       xposition := Schuss.left;
       yposition := Schuss.top;

       if (xposition >= Invader[i].left) and (xposition <= (Invader[i].left + Invader[i].width)) then
       begin
         if (yposition <= (Invader[i].top + Invader[i].height)) and (yposition >= Invader[i].Top) then
           Collision := true
         else
           Collision := false
       end
       else
         Collision := false;

   end;



  procedure TBullet.MoveShot;

    var j,i,x : integer;
         collide : boolean;

  begin

    for j := High(Schuss1) downto 0 do
    begin

       collide := false;
       for i := 1 to 21 do
       begin
         if (Collision(Schuss1[j],i) = true) and (Invader[i].Visible = true) then
         begin

            collide := true;
            Invader[i].visible := false;
            SndPlaySound( '.\boom1.wav', SND_ASYNC );

            Schuss1[j].Free;
            for x:=j to high(Schuss1)-1 do
               Schuss1[x] := Schuss1[x+1];
            SetLength(Schuss1,length(Schuss1)-1);

            break;
         end
       end;

       if collide = false then
         if Schuss1[j].top > Spielfeld.top + 5 then
            Schuss1[j].top := Schuss1[j].top - 10
         else
         begin

            Schuss1[j].Free;
            for x:=j to high(Schuss1)-1 do
               Schuss1[x] := Schuss1[x+1];
            SetLength(Schuss1,length(Schuss1)-1);

         end;

    end;

  end;

end.

Sieht das soweit verständlich und logisch aus oder was sollte ich ändern?

Wenn ich jetzt die Procedure "TSpaceShip.MoveSpaceShip" in meiner Hauptprogramm aufrufen möchte sagt mir Delphi: "[Fehler] Unit1.pas(247): Undefinierter Bezeichner: 'MoveSpaceShip'".
Ich habe aber im Hauptprogramm die "UnitSpaceShip" unter "uses" bei "implemantation" bekannt gemacht und die Procedure wiefolgt aufgerufen:

Delphi-Quellcode:
procedure TFormStarship.SchiffTimerTimer(Sender: TObject);

  var x : TSpaceShip;

begin
       
  x.MoveSpaceShip;

end;
Woran kann es liegen, dass ich trotzdem diese Fehlermeldung bekomme?


Danke schonmal, hier wird einem wenigstens verständlich geholfen
  Mit Zitat antworten Zitat