AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Multimedia Delphi Space Invaders in Delphi5
Thema durchsuchen
Ansicht
Themen-Optionen

Space Invaders in Delphi5

Ein Thema von N4r0 · begonnen am 7. Feb 2010 · letzter Beitrag vom 15. Feb 2010
 
N4r0

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

Re: Space Invaders in Delphi5

  Alt 14. Feb 2010, 15: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
 


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 16:25 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