Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Spiel nachprogrammieren - Gegnerberührung funktioniert nicht (https://www.delphipraxis.net/170057-spiel-nachprogrammieren-gegnerberuehrung-funktioniert-nicht.html)

Premaider 28. Aug 2012 18:54

Spiel nachprogrammieren - Gegnerberührung funktioniert nicht
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hey ich habe versucht das Spiel "Aspirin" nachzuprogrammieren.
Leider habe ich es nicht hinbekommen die Berechnung von einer Berührung der Gegnereinheiten zu berechnen. Ich habe mich immer weiter rein programmiert und wahrscheinlich völlige scheisse gebaut xD

Habe euch das Projekt mal in den Anhang gepackt.
TGegner und der Shape "Spieler" sind hierbei entscheidend.
Hoffendlich könnt ihr mir helfen.

LG
Premaider

s.h.a.r.k 28. Aug 2012 20:34

AW: Spiel nachprogrammieren - Gegnerberührung funktioniert nicht
 
Ich glaube nicht, dass dir jemand sehr exakten Code liefern wird, sodass dein Programm funktioniert. Du musst schon eine Eigenleistung bringen, d.h. präsentiere die Stellen, wo das Problem liegt/die Probleme liegen, denn, davon gehe ich aus, du hast ja schließlich Ahnung, wo in deinem Projekt die entsprechenden Abfragen stecken, die eben nicht so funktionieren, wie sie sollen.

Premaider 28. Aug 2012 20:42

AW: Spiel nachprogrammieren - Gegnerberührung funktioniert nicht
 
Das habe ich auch garnicht erwartet.
Wäre schön wenn du mir die Fehler nennen könntest.

himitsu 28. Aug 2012 21:34

AW: Spiel nachprogrammieren - Gegnerberührung funktioniert nicht
 
Ohne Fehlerbeschreibung weiß ich nichtmal wonach ich suchen soll.

Tipp: Es haben hier schon ein/zwei Andere versucht dieses Spiel nachzuprogrammieren ... da darf man gerne abgucken, wie die es gemacht haben und auch das lesen was dort geantwortet wurde.

Premaider 28. Aug 2012 21:39

AW: Spiel nachprogrammieren - Gegnerberührung funktioniert nicht
 
Zitat:

Zitat von himitsu (Beitrag 1180388)
Ohne Fehlerbeschreibung weiß ich nichtmal wonach ich suchen soll.

Tipp: Es haben hier schon ein/zwei Andere versucht dieses Spiel nachzuprogrammieren ... da darf man gerne abgucken, wie die es gemacht haben und auch das lesen was dort geantwortet wurde.

Naja möchte es auf meine Weise machen. Der Fehler ist, dass es nicht funktioniert..
Es fehlt nurnoch die "Zusammenstossfunktion" von Spieler und Gegner. Aber da es theoretisch unendlich viele Gegner sein können krieg ich das nicht so ganz hin. Spieler und Ziel hab ich meiner Meinung nach schon elegant gelöst :D

Sir Rufo 28. Aug 2012 21:59

AW: Spiel nachprogrammieren - Gegnerberührung funktioniert nicht
 
Zitat:

Zitat von Premaider (Beitrag 1180389)
Zitat:

Zitat von himitsu (Beitrag 1180388)
Ohne Fehlerbeschreibung weiß ich nichtmal wonach ich suchen soll.

Tipp: Es haben hier schon ein/zwei Andere versucht dieses Spiel nachzuprogrammieren ... da darf man gerne abgucken, wie die es gemacht haben und auch das lesen was dort geantwortet wurde.

Naja möchte es auf meine Weise machen. Der Fehler ist, dass es nicht funktioniert..

Achso, ja dann schau doch mal bei der Zeile da, da rechts musst du was anderes schreiben, dann sollte es funktionieren. :roll:

Hast du schon mal versucht, das mit der Kollision auf einem Blatt Papier aufzumalen und dann überlegt, wie man rechnerisch die Kollision erkennen kann?
Nein -> warum fängst du an zu programmieren, wenn du nicht weißt was?
Ja -> wo kommst du nicht weiter? Lad mal die Zeichnung hoch und die Berechnung, dann schauen wir mal

s.h.a.r.k 28. Aug 2012 22:04

AW: Spiel nachprogrammieren - Gegnerberührung funktioniert nicht
 
Um was genau gehts bei dem Spiel eigentlich? Wenn ich einen Gegner berühre kommt ein weiterer hinzu? Ist das der Trick des Spiels? Sorry, aber von dem Spiel habe ich wahrlich noch nie was gehört :stupid:

Premaider 28. Aug 2012 22:07

AW: Spiel nachprogrammieren - Gegnerberührung funktioniert nicht
 
Zitat:

Zitat von Sir Rufo (Beitrag 1180390)
Zitat:

Zitat von Premaider (Beitrag 1180389)
Zitat:

Zitat von himitsu (Beitrag 1180388)
Ohne Fehlerbeschreibung weiß ich nichtmal wonach ich suchen soll.

Tipp: Es haben hier schon ein/zwei Andere versucht dieses Spiel nachzuprogrammieren ... da darf man gerne abgucken, wie die es gemacht haben und auch das lesen was dort geantwortet wurde.

Naja möchte es auf meine Weise machen. Der Fehler ist, dass es nicht funktioniert..

Achso, ja dann schau doch mal bei der Zeile da, da rechts musst du was anderes schreiben, dann sollte es funktionieren. :roll:

Hast du schon mal versucht, das mit der Kollision auf einem Blatt Papier aufzumalen und dann überlegt, wie man rechnerisch die Kollision erkennen kann?
Nein -> warum fängst du an zu programmieren, wenn du nicht weißt was?
Ja -> wo kommst du nicht weiter? Lad mal die Zeichnung hoch und die Berechnung, dann schauen wir mal

ja habe ich. Für Spieler und Ziel funktionierts ja auch. Nur für die Gegner krieg ichs nicht hin, da es ja theoretisch unendlich viele sein können und dadurch alles womit ich das Berechne ein dynamischer Array sein muss, oder nicht ? Also sonst war mein Prinzip so:
Ankatete:= Ziel.left - Spieler.left
Gegenkatete:= Ziel.top - Spieler.top
HypotenuseHoch2:=(Ankatete*Ankatete)+(Gegenkatete* Gegenkatete)
Hypotenuse:=sqrt(HypotenuseHoch2)

sqrt mit Hilfe der Math-unit

Zitat:

Zitat von s.h.a.r.k (Beitrag 1180391)
Um was genau gehts bei dem Spiel eigentlich? Wenn ich einen Gegner berühre kommt ein weiterer hinzu? Ist das der Trick des Spiels? Sorry, aber von dem Spiel habe ich wahrlich noch nie was gehört :stupid:

Man geht mit seinem Spieler zum ziel möglichst ohne von den Gegnern getroffen zu werden. Wenn man das Ziel erreicht hat spawnt es woanders/"ein neues"

Sir Rufo 28. Aug 2012 22:39

AW: Spiel nachprogrammieren - Gegnerberührung funktioniert nicht
 
Nur mal so für Spaß eine vereinfachte Betrachtungsweise:
Delphi-Quellcode:
type
  TFigur = class
    Top, Left : Integer;
    function AbstandZu( aFigur : TFigur ) : Extended;
  end;

  TSpieler = class( TFigur )
  end;

  TZiel = class( TFigur )
  end;

  TGegner = class( TFigur )
  end;

function TFigur.AbstandZu( aFigur : TFigur ) : Extended;
begin
  Result := Sqrt( Sqr( Self.Left - aFigur.Left ) + Sqr( Self.Top - aFigur.Top ) );
end;
Und im Code dann:
Delphi-Quellcode:
var
  Spieler : TSpieler;
  Ziele : TList;
  Gegner : TList;

begin
  // Gegner berührt?
  for idx := 0 to Pred( Gegner.Count ) do
    if Spieler.AbstandZu( TFigur( Gegner[idx] ) ) < 10 then // 10 ist jetzt einfach nur als Beispiel genommen
      GegnerKollision( TGegner( Gegner[idx] ) ); // Behandlung der Kollision mit einem Gegner
 
  // Ziel berührt?
  for idx := 0 to Pred( Ziele.Count ) do
    if Spieler.AbstandZu( TFigur( Ziele[idx] ) ) < 10 then // 10 ist jetzt einfach nur als Beispiel genommen
      ZielEingefangen( TZiel( Ziele[idx] ) ); // Behandlung der Kollision mit einem Ziel
end;
BTW: Für die Kollisionsbehandlung würde sich hier das Visitor-Pattern anbieten, das habe ich aber bewusst herausgelassen um nicht mehr zu verwirren. Obschon es sehr viel Charme hätte und den Code insgesamt nochmals verkürzen würde.

Premaider 29. Aug 2012 10:25

AW: Spiel nachprogrammieren - Gegnerberührung funktioniert nicht
 
Zitat:

Zitat von Sir Rufo (Beitrag 1180394)
Nur mal so für Spaß eine vereinfachte Betrachtungsweise:
Delphi-Quellcode:
type
  TFigur = class
    Top, Left : Integer;
    function AbstandZu( aFigur : TFigur ) : Extended;
  end;

  TSpieler = class( TFigur )
  end;

  TZiel = class( TFigur )
  end;

  TGegner = class( TFigur )
  end;

function TFigur.AbstandZu( aFigur : TFigur ) : Extended;
begin
  Result := Sqrt( Sqr( Self.Left - aFigur.Left ) + Sqr( Self.Top - aFigur.Top ) );
end;
Und im Code dann:
Delphi-Quellcode:
var
  Spieler : TSpieler;
  Ziele : TList;
  Gegner : TList;

begin
  // Gegner berührt?
  for idx := 0 to Pred( Gegner.Count ) do
    if Spieler.AbstandZu( TFigur( Gegner[idx] ) ) < 10 then // 10 ist jetzt einfach nur als Beispiel genommen
      GegnerKollision( TGegner( Gegner[idx] ) ); // Behandlung der Kollision mit einem Gegner
 
  // Ziel berührt?
  for idx := 0 to Pred( Ziele.Count ) do
    if Spieler.AbstandZu( TFigur( Ziele[idx] ) ) < 10 then // 10 ist jetzt einfach nur als Beispiel genommen
      ZielEingefangen( TZiel( Ziele[idx] ) ); // Behandlung der Kollision mit einem Ziel
end;
BTW: Für die Kollisionsbehandlung würde sich hier das Visitor-Pattern anbieten, das habe ich aber bewusst herausgelassen um nicht mehr zu verwirren. Obschon es sehr viel Charme hätte und den Code insgesamt nochmals verkürzen würde.

Wenn ich deinen Code einbaue bekomme ich ein paar Fehlermeldungen:
Delphi-Quellcode:
[Fehler] Unit1.pas(51): Bezeichner redefiniert: 'TFigur.AbstandZu'
[Fehler] Unit1.pas(52): Undefinierter Bezeichner: 'Result'
[Fehler] Unit1.pas(52): Undefinierter Bezeichner: 'Self'
[Fehler] Unit1.pas(52): Undefinierter Bezeichner: 'aFigur'
[Fehler] Unit1.pas(52): 'END' erwartet, aber ')' gefunden
[Fehler] Unit1.pas(100): Undefinierter Bezeichner: 'idx'
[Fehler] Unit1.pas(102): Undefinierter Bezeichner: 'GegnerKollision'
[Fehler] Unit1.pas(107): Undefinierter Bezeichner: 'ZielEingefangen'
[Fataler Fehler] Project1.dpr(5): Verwendete Unit 'Unit1.pas' kann nicht compiliert werden
Geht das denn so überhaupt für Delphi7 ?

Sir Rufo 29. Aug 2012 10:34

AW: Spiel nachprogrammieren - Gegnerberührung funktioniert nicht
 
Das war eine vereinfachte Betrachtungsweise, wo es nur darum ging, wie man die Kollisionsüberwachung der Figuren vereinfachen kann. Du musst das Konzept in deine Klassen einbauen.

Was damit gezeigt werden sollte, wie man mit Vererbung den Code einfacher hält.

CopyPaste funktioniert da nicht

s.h.a.r.k 29. Aug 2012 10:36

AW: Spiel nachprogrammieren - Gegnerberührung funktioniert nicht
 
Ohoh... Lege dir doch bitte erst mal die Grundlagen zu. Ich glaube, du hast da einige Defizite udn es ist schwer dir dann richtig zu helfen.

Der Code von Sir Rufo funktioniert und das auch mit Delphi 7. Die Typdeklarationen kommen in den Type-Deklaration über den implementation-Teil. Und der Code gehört in den implementation-Teil, also darunter.

Aber nur Copy&Paste ist halt nicht, es gehört auch dazu den Code zu verstehen, denn du musst schon noch ein wenig drum herum programmieren, sodass der Code von Sir Rufo komplett funktioniert.

[add]
Wo war die rote Box? :shock:

DeddyH 29. Aug 2012 10:37

AW: Spiel nachprogrammieren - Gegnerberührung funktioniert nicht
 
Klar geht das, man muss nur noch die fehlenden Methoden implementieren und die fehlenden Variablen deklarieren.

[edit]
Zitat:

Zitat von s.h.a.r.k (Beitrag 1180422)
[add]
Wo war die rote Box? :shock:

Das frag ich mich auch. [/edit]

Jumpy 29. Aug 2012 10:43

AW: Spiel nachprogrammieren - Gegnerberührung funktioniert nicht
 
Liste der Anhänge anzeigen (Anzahl: 1)
[OT]
Hab das mit der roten Box mal gegoogelt. Scheinbar macht die gerade in Spanien Urlaub. Siehe Foto :-D
[/OT]

Premaider 29. Aug 2012 11:03

AW: Spiel nachprogrammieren - Gegnerberührung funktioniert nicht
 
Zitat:

Zitat von Sir Rufo (Beitrag 1180421)
Das war eine vereinfachte Betrachtungsweise, wo es nur darum ging, wie man die Kollisionsüberwachung der Figuren vereinfachen kann. Du musst das Konzept in deine Klassen einbauen.

Was damit gezeigt werden sollte, wie man mit Vererbung den Code einfacher hält.

CopyPaste funktioniert da nicht

Ach so hast du das gemeint xDD
Ja dann ist das klar ^^
Ich werds versuchen wenn ich wieder von der Schule da bin, muss jetzt wieder weg :(

Zitat:

Zitat von Jumpy (Beitrag 1180428)
[OT]
Hab das mit der roten Box mal gegoogelt. Scheinbar macht die gerade in Spanien Urlaub. Siehe Foto :-D
[/OT]

Sinn ?

Jumpy 29. Aug 2012 12:22

AW: Spiel nachprogrammieren - Gegnerberührung funktioniert nicht
 
Zitat:

Zitat von Premaider (Beitrag 1180435)
Zitat:

Zitat von Jumpy (Beitrag 1180428)
[OT]
Hab das mit der roten Box mal gegoogelt. Scheinbar macht die gerade in Spanien Urlaub. Siehe Foto :-D
[/OT]

Sinn ?

Un-Sinn
Sollte ein Insider-Witz bzgl. der Bemerkungen zur roten Box in den vorhergegangenen Posts sein. Daher auch mit Pseudo-Off-Topic-Tags gekennzeichnet. Sorry, wenn ich dich damit irritiert haben sollte.
Nur falls nicht bekannt: Die rote (Warn-)Box sollte immer dann kommen, wenn du einen Post abschickst aber es bereits neue Posts gab, während du noch geschrieben hast.

Premaider 30. Aug 2012 18:01

AW: Spiel nachprogrammieren - Gegnerberührung funktioniert nicht
 
Habe mich jetzt erstmal an die Bewegung und das abprallen der Gegner gesetzt:

Delphi-Quellcode:
procedure TForm1.Timer2Timer(Sender: TObject);
var
m,l,k,links,rechts,oben,unten,Geschwindigkeit:Integer;
begin
    //Gegner bewegen
    If length(Gegner)>=1 Then
      begin
        For l:= 0 to length(gegner)-1 do
          begin
            If Gegner[l].width > Gegner[l].height Then
              begin
                //Wenn Gegner waagrecht ist
                Gegner[l].Left:=Gegner[l].left + Gegner[l].speed;
                for k := 0 to high(Gegner) do
                  begin
                    links := Gegner[k].left;
                      if links <= 0 then
                        begin
                          Gegner[k].speed := Gegner[k].speed * -1;
                        end;
                      if Links + Gegner[k].Width >= Form1.clientwidth + Gegner[k].left then
                        begin
                         Gegner[k].speed := Gegner[k].speed * -1;
                        end;
                  end;

              end;
            If Gegner[l].width < Gegner[l].height Then
              begin
             //Wenn Gegner senkrecht ist
                Gegner[l].top:=Gegner[l].top + Gegner[l].speed;
                for m := 0 to high(Gegner) do
                  begin
                    oben := Gegner[m].top;
                      if oben <= 0 then
                        begin
                          Gegner[m].speed := Gegner[m].speed * -1;
                        end;
                      if oben + Gegner[m].Height >= Form1.clientheight then
                        begin
                          Gegner[m].speed := Gegner[m].speed * -1;
                        end;
                  end;
              end;
        end;
   end;
end;
Leider funktioniert das nicht ganz. Die Gegner prallen manchmal ab und manchmal nicht und ich
verstehe nicht warum. Kann mir jemand sagen, was ich falsch mache ?
Ich kann euch auch nochmal das Projekt hochladen, damit ihr es euch mal anschauen könnt.

Bjoerk 30. Aug 2012 19:46

AW: Spiel nachprogrammieren - Gegnerberührung funktioniert nicht
 
Ich hab's mir letztens auch mal angeschaut, kapier' das Spiel aber leider nicht. Mir ist auch aufgefallen, daß du von fünf Timer benutzt mit einem Intervall von 1 ms. Der Sinn dieser Timer war mir auch nicht klar.

Auch das könnte weiterhelfen:

http://www.delphi-treff.de/tipps/gra...e-kollidieren/

Premaider 30. Aug 2012 20:54

AW: Spiel nachprogrammieren - Gegnerberührung funktioniert nicht
 
Das hat mir sehr geholfen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:23 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 by Thomas Breitkreuz