Einzelnen Beitrag anzeigen

Premaider

Registriert seit: 31. Mär 2012
160 Beiträge
 
#1

Bugs und Zugriffsverletzungen in meinem Spiel (Aspirin)

  Alt 24. Okt 2012, 23:09
Hey Leute,
vielleicht kennt einer von euch das Spiel Aspirin. Man muss den Spieler durch die sich bewegenden Gegner zum Ziel bringen. Ich habe noch Items hinzugefügt und man verliert erst wenn die 5 Herzen (5,4,3,2 oder 1 je nach Schwierigkeitsgrad). Mein Probleme sind:
- Manchmal erscheind oben-links in der Form einfach ein weißer Shape (vermutl. Item)
- Ab einer bestimmten Anzahl an Gegnern (TGegner=Abgeleitet von TShape) bekomme ich eine Zugriffsverletzung bei Verlieren (wenn keine Herzen mehr da wären)
- Manchmal passiert nichts wenn man ein Item berührt

Vielleicht ein paar mal spielen. Dann werdet ihr damit sicher "bekanntschaft machen"
Bei mir wird die Hauptarbeit von Timer1 übernommen.
Das gesammte Spiel befindet sich hier: http://www.mediafire.com/?edd20mq7c5f2if2 (Auch mit Grafiken usw., daher kein Anhang mehr möglich)
Den Quellcode von Timer1 findet ihr hier:

Delphi-Quellcode:
procedure TForm1.Timer1Timer(Sender: TObject);
var
l,k,m,n,o,AL1,AL2,Zufall: Integer;
begin
//Spieler bewegegen
If Spielerbewegung=True then
  begin
    If ((KeyPressed(VK_Up)) or (KeyPressed($57)) and (Spieler.Top >= Spielflaeche.Top)) Then Spieler.top := Spieler.top - Spieler.Speed;
    If ((KeyPressed(VK_Down)) or (KeyPressed($53)) and (Spieler.Top <= Spielflaeche.height + Spielflaeche.top - Spieler.Height)) Then Spieler.top := Spieler.top + Spieler.Speed;
    If ((KeyPressed(VK_Left)) or (KeyPressed($41)) and (Spieler.Left >= Spielflaeche.left)) Then Spieler.Left := Spieler.Left - Spieler.Speed;
    If ((KeyPressed(VK_Right)) or (KeyPressed($44)) and (Spieler.Left <= Spielflaeche.width + Spielflaeche.left - Spieler.width)) Then Spieler.Left := Spieler.Left + Spieler.Speed;
  end;
//Kollision Spieler und Ziel
if IsCollision(Spieler.BoundsRect, Ziel.BoundsRect) then
  begin
  Punktzahl:=Punktzahl+1;
  PunkteAnzeige.caption:='Punkte: '+IntToStr(Punktzahl);
    If Sounds='EnabledThen
      begin
        SoundPlayer.FileName:=Pfad+'\Datein\Ziel.wav';
        SoundPlayer.Open;
        SoundPlayer.play;
      end;
    ItemCount:=ItemCount+1;
    Ziel.Top:=random(Spielflaeche.Height - Ziel.Height) + Spielflaeche.top;
    Ziel.Left:=random(Spielflaeche.Width - Ziel.width) + Spielflaeche.left;
    // Gegner hinzufügen
      begin
       setLength(gegner,length(Gegner)+1);
       AL1 := length(Gegner)-1;
       Gegner[AL1]:= TGegner.Create(Self);
         With Gegner[AL1] do
          begin
            speed:=3;
            Parent := self;
            Cooldown := 1000;
            BringToFront;
            If RandomAusgabe(1)=1 Then
               begin
                  Width:=5;
                  Height:=30;
                  top:= random( Spielflaeche.Height - height ) + Spielflaeche.top;
                  Left := random( Spielflaeche.Width - Width ) + Spielflaeche.left;
                end;
            If RandomAusgabe(1)=0 Then
               begin
                  Width:=30;
                  Height:=5;
                  top:= random( Spielflaeche.Height - height ) + Spielflaeche.top;
                  Left := random( Spielflaeche.Width - Width ) + Spielflaeche.left;
                end;
          end;
        end;
    //Item hinzufügen
      begin
        If ItemCount=5 Then
          begin
            ItemCount:=0;
            Zufall:=RandomAusgabe(3);
            setLength(Item,length(Item)+1);
            AL2 := length(Item)-1;
            Item[AL2]:= TItem.Create(Self);
            With Item[AL2] do
              begin
                Picture.LoadFromFile(Pfad+'\Datein\Item.jpg');
                Parent:=Self;
                Height:=16;
                Width:=16;
                Stretch:=True;
                Top:=random(Spielflaeche.Height - Ziel.Height) + Spielflaeche.top;
                Left:=random(Spielflaeche.Width - Ziel.width) + Spielflaeche.left;
                Brush.Color:=clblack;
                BringToFront;
                Enabled:=True;
                If ((Zufall=1) or (Zufall=2)) then
                  begin
                    Typ:=True;
                  end;
                If Zufall=3 then
                  begin
                    Typ:=False;
                  end;
              end;
        end;
    end;
  end;
    //Gegner bewegen
    If length(gegner)>=1 then
      begin
        For m:= 0 to high(gegner) do
          begin
            If Gegner[m].width > Gegner[m].Height Then
              begin
                //Waagrecht
                Gegner[m].left:=Gegner[m].left + Gegner[m].Speed;
              end;
            If Gegner[m].width < Gegner[m].Height Then
              begin
                //Senkrecht
                Gegner[m].Top:=Gegner[m].top + Gegner[m].Speed;
              end;
          end;
      end;

//Gegner Cooldown
For o:= low(Gegner) to high(Gegner) do
  begin
    If Gegner[o].cooldown>=1 Then Gegner[o].cooldown:=Gegner[o].cooldown-50;
  end;

//Kollision Gegner und Wand
For l:= low(gegner) to high(gegner) do
  begin
    if Gegner[l].Left <= Spielflaeche.Left then Gegner[l].speed:=Gegner[l].speed*-1;
    if Gegner[l].Left >= Spielflaeche.Width + Spielflaeche.Left - Gegner[l].Width then Gegner[l].speed:=Gegner[l].speed*-1;
    if Gegner[l].top <= Spielflaeche.Top - Gegner[l].Width then Gegner[l].speed:=Gegner[l].speed*-1;
    if Gegner[l].top >= Spielflaeche.height + Spielflaeche.top - Gegner[l].height then Gegner[l].speed:=Gegner[l].speed*-1;
  end;

//Kollision Spieler und Gegner
For k:= low(gegner) to high(gegner) do
  begin
    if ((IsCollision(Gegner[k].BoundsRect, Spieler.BoundsRect)) and (Gegner[k].Cooldown<=0))Then
          begin
            If Spieler.Verletzbar Then Dec(Herzen);
            If ((Herzen=4) and (Spieler.Verletzbar)) Then
              begin
                Spieler.Verletzbar:=False;
                Abwarten2.Enabled:=True;
                Herz5.picture.loadfromfile(Pfad+'\Datein\Herz_Leer.jpg');
              end
            Else If ((Herzen=3) and (Spieler.Verletzbar)) Then
              begin
                Spieler.Verletzbar:=False;
                Abwarten2.Enabled:=True;
                Herz4.picture.loadfromfile(Pfad+'\Datein\Herz_Leer.jpg');
              end
            Else If ((Herzen=2) and (Spieler.Verletzbar)) Then
              begin
                Spieler.Verletzbar:=False;
                Abwarten2.Enabled:=True;
                Herz3.picture.loadfromfile(Pfad+'\Datein\Herz_Leer.jpg');
              end
            Else If ((Herzen=1) and (Spieler.verletzbar)) Then
              begin
                Spieler.Verletzbar:=False;
                Abwarten2.Enabled:=True;
                Herz2.picture.loadfromfile(Pfad+'\Datein\Herz_Leer.jpg');
              end;
          end
        Else If Herzen<=0 then
          begin
            Verloren;
            Herz1.Picture.LoadFromFile(Pfad+'\Datein\Herz_leer.jpg');
          end;
  end;

//Kollision Spieler und Item
For n := low(item) to high(item) do
  begin
    If ((IsCollision(Spieler.BoundsRect,Item[n].BoundsRect)) and (Item[n].Enabled=True)) Then
      begin
        Spieler.Upgrade(n,Item[n].Typ);
        Item[n].Enabled:=False;
      end;
  end;
end;
Könnt ihr mir vielleicht beantworten warum diese Bugs entstehen ? Ich habe nämlich keine Ahnung :S
  Mit Zitat antworten Zitat