AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Problem mit Rekursion...

Ein Thema von Teekeks · begonnen am 18. Jun 2009 · letzter Beitrag vom 18. Jun 2009
Antwort Antwort
Teekeks

Registriert seit: 19. Okt 2008
Ort: Dresden
765 Beiträge
 
FreePascal / Lazarus
 
#1

Problem mit Rekursion...

  Alt 18. Jun 2009, 14:19
Hallo!
Ich habe ein Problem mit einer Rekursion...

Was ich machen möchte:
Ich würde gerne für ein kleines Spiel eine Zentrierung des Aktuellen Spielers vornehmen.
Das klappt eigentlich auch ganz gut. Nur kriege ich ein Problem wenn ich an den Maprand komme, dann kann ja nichtmehr zentriert werden...
Meine Rekursive Zentrierungsprocedure stirgt dann daran das ich mit meinen lokalen Variablen den Speicher komplett vollschreibe. Ich kriege also einen speicherzugriffsfehler.

Hier der Code:
Delphi-Quellcode:
procedure TGame.Center_Player(X_Done,Y_Done:boolean);
var can_scroll_Left,Can_Scroll_Rigth:boolean;
    can_scroll_Up,Can_Scroll_Down:boolean;
begin
  if (X_Done and Y_Done) then
    exit;
  if ((_Act_Player_Position.x=(_Act_X+(_Paintrect.x div 2)))
   and (_Act_Player_Position.y=(_Act_Y+(_Paintrect.y div 2)))) then
   begin
     PaintMap;
     exit;
   end;
  can_Scroll_Left:= (_Act_X > 0);
  can_scroll_Rigth:=(_Act_X+_Paintrect.x < _Map_X);
  can_scroll_Up:= (_Act_Y > 0);
  can_Scroll_Down:= (_Act_Y+_Paintrect.y < _Map_Y);
  if (_Act_Player_Position.x<(_Act_X+(_Paintrect.x div 2))) then
    if can_Scroll_Rigth then
      ScrollMap_Rigth;
  if (_Act_Player_Position.x>(_Act_X+(_PaintRect.x div 2))) then
    if Can_Scroll_Left then
      ScrollMap_Left;
  if (_Act_Player_Position.y<(_Act_Y+(_Paintrect.y div 2))) then
    if Can_Scroll_Down then
      ScrollMap_Down;
  if (_Act_Player_Position.y>(_Act_Y+(_Paintrect.y div 2))) then
    if Can_Scroll_Up then
      ScrollMap_Up;
  X_Done:=((_Act_Player_Position.x=(_Act_X+(_Paintrect.x div 2))) or (_Act_X=0));
  Y_Done:=((_Act_Player_Position.y=(_Act_Y+(_Paintrect.y div 2))) or (_Act_Y=0));
  Center_Player(X_Done,Y_Done);
end;
Zur erklährung:
_Act_X+_Act_Y beschreibt die Position (das Feld) welches im aktuellen ausschnit oben Links liegt.
_Paintrect ist eine Variable vom Type TPoint die die größe des ausschnittes anzeigt.
_Act_Player_Position ist ebenfals von TPoint und gibt die aktuelle Position des Spielers an.

Die veränderung des Bildausschnittes geschiet in den Proceduren ScrollMap_X.

Wisst ihr warum die Procedure sich unendlich oft selbstaufruft? eigentlich müsste sie ja aufhören, oder hab ich einen Denkfehler?

gruß Teekeks
Peter
"Div by zero Error" oder auch: "Es geht auch ohne Signatur!".
  Mit Zitat antworten Zitat
SimStar001

Registriert seit: 18. Jan 2008
594 Beiträge
 
#2

Re: Problem mit Rekursion...

  Alt 18. Jun 2009, 14:23
naja sie wird sich sicherlich so oft aufrufen, weil die absprungkreterien nicht stimmen... überprüfe die doch mal und lass dir die anzeigen in nem memo oder so
  Mit Zitat antworten Zitat
quendolineDD

Registriert seit: 19. Apr 2007
Ort: Dresden
781 Beiträge
 
Turbo Delphi für Win32
 
#3

Re: Problem mit Rekursion...

  Alt 18. Jun 2009, 14:25
Edit: Was ein quatsch.
Edit2: Aber trotzdem. Am Anfang überprüfst du ja schonmal in Zeile 7 und 8 das, was weiter unten auch X_Done und Y_Done setzen soll. Lediglich kommt da noch ein OR xxx=0 hinzu. Debugge das ganze doch einmal und vergleiche deine Erwartung und das Resultat.
Lars S.
Wer nicht mit der Zeit geht, geht mit der Zeit.
  Mit Zitat antworten Zitat
SimStar001

Registriert seit: 18. Jan 2008
594 Beiträge
 
#4

Re: Problem mit Rekursion...

  Alt 18. Jun 2009, 14:31
Zitat von quendolineDD:
Edit: Was ein quatsch.
Edit2: Aber trotzdem. Am Anfang überprüfst du ja schonmal in Zeile 7 und 8 das, was weiter unten auch X_Done und Y_Done setzen soll. Lediglich kommt da noch ein OR xxx=0 hinzu. Debugge das ganze doch einmal und vergleiche deine Erwartung und das Resultat.
Solltest du das auf meinen Beitrag beziehen, ist dein Kommentar quatsch! Wenn er die Abbruchvariablen nicht richtig setzt in seiner Procedure kann er ja auch nie rausspringen
  Mit Zitat antworten Zitat
Teekeks

Registriert seit: 19. Okt 2008
Ort: Dresden
765 Beiträge
 
FreePascal / Lazarus
 
#5

Re: Problem mit Rekursion...

  Alt 18. Jun 2009, 14:31
ich habs rausgefunden:
Delphi-Quellcode:
//so müsste es heißen:
  X_Done:=not((_Act_Player_Position.x=(_Act_X+(_Paintrect.x div 2))) or (_Act_X=0));
  Y_Done:=not((_Act_Player_Position.y=(_Act_Y+(_Paintrect.y div 2))) or (_Act_Y=0));
// so war es:
  X_Done:=((_Act_Player_Position.x=(_Act_X+(_Paintrect.x div 2))) or (_Act_X=0));
  Y_Done:=((_Act_Player_Position.y=(_Act_Y+(_Paintrect.y div 2))) or (_Act_Y=0));
Peter
"Div by zero Error" oder auch: "Es geht auch ohne Signatur!".
  Mit Zitat antworten Zitat
SimStar001

Registriert seit: 18. Jan 2008
594 Beiträge
 
#6

Re: Problem mit Rekursion...

  Alt 18. Jun 2009, 14:35
OK, super, hast also nie ein true auf deine AbbruchVariablen bekommen!
  Mit Zitat antworten Zitat
shmia

Registriert seit: 2. Mär 2004
5.508 Beiträge
 
Delphi 5 Professional
 
#7

Re: Problem mit Rekursion...

  Alt 18. Jun 2009, 15:29
Die Parameter X_Done und Y_Done kannst du dir schenken:
Delphi-Quellcode:
procedure TGame.Center_Player;
var can_scroll_Left,Can_Scroll_Rigth:boolean;
    can_scroll_Up,Can_Scroll_Down:boolean;
begin
   repeat
     (* weg damit
    if (X_Done and Y_Done) then
      exit;
     *)

     ... jede Menge Berechnungen
    //so müsste es heißen:
    X_Done:=not((_Act_Player_Position.x=(_Act_X+(_Paintrect.x div 2))) or (_Act_X=0));
    Y_Done:=not((_Act_Player_Position.y=(_Act_Y+(_Paintrect.y div 2))) or (_Act_Y=0));
  until (X_Done and Y_Done);
end;
Damit hast du die Rekursion komplett beseitigt, was natürlich nur von Vorteil ist.
Andreas
  Mit Zitat antworten Zitat
Antwort Antwort


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 23:39 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz