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