![]() |
Problem mit Rekursion...
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:
Zur erklährung:
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; _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 |
Re: Problem mit Rekursion...
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
|
Re: Problem mit Rekursion...
Edit: Was ein quatsch. :wall:
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. |
Re: Problem mit Rekursion...
Zitat:
|
Re: Problem mit Rekursion...
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)); |
Re: Problem mit Rekursion...
OK, super, hast also nie ein true auf deine AbbruchVariablen bekommen! :angel:
|
Re: Problem mit Rekursion...
Die Parameter X_Done und Y_Done kannst du dir schenken:
Delphi-Quellcode:
Damit hast du die Rekursion komplett beseitigt, was natürlich nur von Vorteil ist.
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; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:54 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