AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Multimedia Delphi Spiel (Aspirin): Spieler kurzzeitig unverletzlich machen

Spiel (Aspirin): Spieler kurzzeitig unverletzlich machen

Ein Thema von Premaider · begonnen am 19. Okt 2012 · letzter Beitrag vom 20. Okt 2012
Antwort Antwort
Premaider

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

Spiel (Aspirin): Spieler kurzzeitig unverletzlich machen

  Alt 19. Okt 2012, 19:42
Delphi-Quellcode:
//Auszug aus Timer1 (der regelt bei mir alles)

//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
        Spieler.Verletzbar:=False;
        If Herzen>=2 then
          begin
            Herzen:=Herzen-1;
            If ((Herzen=4) and (Spieler.Verletzbar=True)) Then
              begin
                Spieler.Verletzbar:=False;
                Abwarten2.Enabled:=True;
                Herz5.picture.loadfromfile(Pfad+'\Datein\Herz_Leer.jpg');
              end;
            If ((Herzen=3) and (Spieler.Verletzbar=True)) Then
              begin
                Spieler.Verletzbar:=False;
                Abwarten2.Enabled:=True;
                Herz5.picture.loadfromfile(Pfad+'\Datein\Herz_Leer.jpg');
                Herz4.picture.loadfromfile(Pfad+'\Datein\Herz_Leer.jpg');
              end;
            If ((Herzen=2) and (Spieler.Verletzbar=True)) Then
              begin
                Spieler.Verletzbar:=False;
                Abwarten2.Enabled:=True;
                Herz5.picture.loadfromfile(Pfad+'\Datein\Herz_Leer.jpg');
                Herz4.picture.loadfromfile(Pfad+'\Datein\Herz_Leer.jpg');
                Herz3.picture.loadfromfile(Pfad+'\Datein\Herz_Leer.jpg');
              end;
            If ((Herzen=1) and (Spieler.Verletzbar=True)) Then
              begin
                Spieler.Verletzbar:=False;
                Abwarten2.Enabled:=True;
                Herz5.picture.loadfromfile(Pfad+'\Datein\Herz_Leer.jpg');
                Herz4.picture.loadfromfile(Pfad+'\Datein\Herz_Leer.jpg');
                Herz3.picture.loadfromfile(Pfad+'\Datein\Herz_Leer.jpg');
                Herz2.picture.loadfromfile(Pfad+'\Datein\Herz_Leer.jpg');
              end;
          end;
        If Herzen<=1 then
          begin
            Verloren;
            Herz1.Picture.LoadFromFile(Pfad+'\Datein\Herz_leer.jpg');
          end;
      end;
  end;
...

procedure TForm1.Abwarten2Timer(Sender: TObject);
begin
Spieler.Verletzbar:=True;
Abwarten2.Enabled:=false;
end;
Es gibt insgesammt 5 Herzen (leben). Immer wenn der Spieler einen Gegner berührt soll eins abgezogen werden. Bis man schließlich bei 0 Herzen stirbt. Leider wurden immer alle 5 Herzen abgezogen, sobald man den Gegner (der sich bewegt) berührte, da der Spieler den Gegner ja noch berührte als ein Herz abgezogen wurde. Also wurden eins nach dem anderen Abgezogen. Ich dachte ich mache den Spieler für kurze zeit unverwundbar, denn der Gegner bewegt sich ja und ist dann "weg". 1000ms müssten locker reichen. Leider funktioniert das irgendwie nicht. Kann mir jemand sagen warum und mir helfen ?
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
38.563 Beiträge
 
Delphi 10.4 Sydney
 
#2

AW: Spiel (Aspirin): Spieler kurzzeitig unverletzlich machen

  Alt 19. Okt 2012, 19:49
Sowas wie if (Spieler.Verletzbar=True) then solltest du dringen mal ausbauen.
if Spieler.Verletzbar then oder das Gegenteil if not Spieler.Verletzbar then .


Und nun zu deinem Problem:

Du stellst zwar die Herzen-Bilder entsprechend (falsch) dar,
aber eigentlich solltest, aber eigentlich solltest du die Herzen-Variable nicht verändern, wenn sie nicht verändert werden soll (not Spieler.Verletzbar)

"falsch", da deine Bilder nicht zur Variable passen.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
Delphi-Tage 2005-2014
  Mit Zitat antworten Zitat
Premaider

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

AW: Spiel (Aspirin): Spieler kurzzeitig unverletzlich machen

  Alt 19. Okt 2012, 19:53
Sowas wie if (Spieler.Verletzbar=True) then solltest du dringen mal ausbauen.
if Spieler.Verletzbar then oder das Gegenteil if not Spieler.Verletzbar then .


Und nun zu deinem Problem:

Du stellst zwar die Herzen-Bilder entsprechend (falsch) dar,
aber eigentlich solltest, aber eigentlich solltest du die Herzen-Variable nicht verändern, wenn sie nicht verändert werden soll (not Spieler.Verletzbar)

"falsch", da deine Bilder nicht zur Variable passen.
Hä? Aber sie soll doch verändert werden. Es soll doch ein Herz abgezogen werden. Sorry verstehe dich nicht :S

P.s. Wieso soll ich das denn ausbauen ? Hat das irgendeine auswirkung ??

Geändert von Premaider (19. Okt 2012 um 19:59 Uhr)
  Mit Zitat antworten Zitat
Progman

Registriert seit: 31. Aug 2007
Ort: 99974 MHL
695 Beiträge
 
Delphi 10.1 Berlin Starter
 
#4

AW: Spiel (Aspirin): Spieler kurzzeitig unverletzlich machen

  Alt 19. Okt 2012, 20:09
Spieler.Verletzbar ist doch vom Typ Boolean.
Daher erübrigt sich die Abfrage nach True oder False.
Daher der Hinweis:
Zitat:
Sowas wie if (Spieler.Verletzbar=True) then solltest du dringen mal ausbauen.
if Spieler.Verletzbar then oder das Gegenteil if not Spieler.Verletzbar then .
Das ist eben sauberere Programmierung
Karl-Heinz
Populanten von Domizilen mit fragiler, transparenter Aussenstruktur sollten sich von der Translation von gegen Deformierung resistenter Materie distanzieren!
(Wer im Glashaus sitzt sollte nicht mit Steinen werfen)
  Mit Zitat antworten Zitat
Premaider

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

AW: Spiel (Aspirin): Spieler kurzzeitig unverletzlich machen

  Alt 19. Okt 2012, 20:15
Spieler.Verletzbar ist doch vom Typ Boolean.
Daher erübrigt sich die Abfrage nach True oder False.
Daher der Hinweis:
Zitat:
Sowas wie if (Spieler.Verletzbar=True) then solltest du dringen mal ausbauen.
if Spieler.Verletzbar then oder das Gegenteil if not Spieler.Verletzbar then .
Das ist eben sauberere Programmierung
Ich werds mir abgewöhnen
Jetzt aber wieder zum eigendlichen Problem..
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
38.563 Beiträge
 
Delphi 10.4 Sydney
 
#6

AW: Spiel (Aspirin): Spieler kurzzeitig unverletzlich machen

  Alt 19. Okt 2012, 20:22
Ja, es ist sauberer, aber auch Fehlerunanfälliger.

Ein Boolean hat eben nicht nur zwei Zustände wie True und False, sondern mindestens 256. (Boolean = 1 Byte und z.B. LongBool = 4 Byte)

Ganz genau ist es so definiert:
False = 0
True <> 0

Aber da eine Konstante nur einen Wert haben kann, ist in Delphi das True als 1 definiert. (in C-Sprachen dagegen meist als -1)

=True kann daher eine falsches Ergebnis liefern.

Das ist so ähnlich, wie bei den Floats (Fließkommazahlen ala Single oder Double), walche man auch nicht unbedingt auf "Gleichheit" prüfen sollte.

Delphi-Quellcode:
var B: Boolean;

B := Boolean(2);

if B = True then
  ShowMessage('B = True');
if B = False then
  ShowMessage('B = False');

if B then
  ShowMessage('B');
if not B then
  ShowMessage('not B');




Das Herz soll doch aber nur abgezogen werden, wenn man verletzbar ist.
Ist man nicht verletzbar, dann darf auch nichts abgezogen werden, sonst stirbt man ja dennoch.
Und wieviele Leben die Bilder anzeigen ist ja egal ... es kommt doch auf die Variable drauf an.
Abgesehn davon, daß die Bilder besser mit der Variable übereinstimmen sollten, sonst sieht man ja was Falsches.

Du mußt also die Variable abhängig von "Verletzbar" verändern, oder eben nicht.
Aber die Bilder dennoch das anzeigen lassen, was in der Variable steht.


PS: Wenn du etwas OOP-iger werden willst, dann erstell dir eine Komponente "THerzen", welche ein Property Herzen (Integer) besitzt, worüber man diesen Wert setzen und auslesen kann.
Und diese Klasse kümmert sich "intern" auch um die Anzeige ihrer Herz-Bildchen, entsprechend dem Wert.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
Delphi-Tage 2005-2014

Geändert von himitsu (19. Okt 2012 um 20:30 Uhr)
  Mit Zitat antworten Zitat
Premaider

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

AW: Spiel (Aspirin): Spieler kurzzeitig unverletzlich machen

  Alt 19. Okt 2012, 20:27
Ja, es ist sdauberer, aber auch Fehlerunanfälliger.

Ein Boolean hat eben nicht nur zwei Zustände wie True und False, sondern mindestens 256. (Boolean = 1 Byte und z.B. LongBool = 4 Byte)

Ganz genau ist es so definiert:
False = 0
True <> 0

Aber da eine Konstante nur einen Wert haben kann, ist in Delphi das True als 1 definiert. (in C-Sprachen dagegen meist als -1)

=True kann daher eine falsches Ergebnis liefern.

Das ist so ähnlich, wie bei den Floats (Fließkommazahlen ala Single oder Double), walche man auch nicht unbedingt auf "Gleichheit" prüfen sollte.

Delphi-Quellcode:
var B: Boolean;

B := Boolean(2);

if B = True then
  ShowMessage('B = True');
if B = False then
  ShowMessage('B = False');

if B then
  ShowMessage('B');
if not B then
  ShowMessage('not B');
Okay werd ich machen danke
" aber eigentlich solltest du die Herzen-Variable nicht verändern, wenn sie nicht verändert werden soll (not Spieler.Verletzbar)" meinst du damit das die herzen verringert werden sollen wenn der Spieler unverletzlich wird ?

Dann werd ich das dann machen wenn mein eigendliches Problem gelöst ist.

Geändert von Premaider (19. Okt 2012 um 20:41 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
38.563 Beiträge
 
Delphi 10.4 Sydney
 
#8

AW: Spiel (Aspirin): Spieler kurzzeitig unverletzlich machen

  Alt 19. Okt 2012, 21:01
wenn verletzlich dann verändern

if Spieler.Verletzbar then Dec(Herzen);


Gut, wenn man den "unverletzbarkeits"-Modus als solchen ansieht, dann

wenn nicht unverletzlich dann verändern

if not Spieler.Unsterblich then Dec(Herzen);
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
Delphi-Tage 2005-2014

Geändert von himitsu (19. Okt 2012 um 22:46 Uhr)
  Mit Zitat antworten Zitat
Premaider

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

AW: Spiel (Aspirin): Spieler kurzzeitig unverletzlich machen

  Alt 19. Okt 2012, 21:39
Jo danke es geht
  Mit Zitat antworten Zitat
Premaider

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

AW: Spiel (Aspirin): Spieler kurzzeitig unverletzlich machen

  Alt 20. Okt 2012, 12:39
Delphi-Quellcode:
//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 //hier wird die Zugriffsverletzung angzeigt
          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) and (Spieler.verletzbar)) then //hier müsste die Zugriffsverletzung eigendlich stehen oder ?
          begin
            Verloren;
            Spieler.verletzbar:=false;
            Abwarten2.Enabled:=True;
            Herz1.Picture.LoadFromFile(Pfad+'\Datein\Herz_leer.jpg');
          end;
  end;
Leider bekomme ich jetzt manchmal eine Zugriffsverletzung. Wenn nur wenige Gegner exsistieren dann ist alles ganz normal. Doch sobald es mal ein paar mehr sind(Ich weiß leider nicht wieviele es dafür sein müssen) bekomme ich eine Zugriffsverletzung sobald man verliert. (Verloren-Procedure)
Weiß jemand warum ?
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 +2. Es ist jetzt 23:54 Uhr.
Powered by vBulletin® Copyright ©2000 - 2021, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2021 by Daniel R. Wolf