{Diese Procedure macht es noch nicht 100%ig richtig.
Ich möchte es Eigentlich so, dass das Objekt wo ich hinscrolle evlt. in der Mitte angezeigt wird.
}
procedure TPluto2DEngine.ScrollToObject(aSprite: TPluto2DSprite);
var
r,r1:Boolean;
begin
ViewRect:=Rect(0,0,0,0);
r:=False; r1:=False;
while not r do begin
r1:=(ViewRect.Left >= aSprite.Left);
if not r1 then
ViewRect.Left:=ViewRect.Left+30
else begin
ViewRect.Top:=ViewRect.Top+30;
r:=(ViewRect.Top >= aSprite.Top)
end;
end;
end; // TPluto2DEngine.ScrollToObject
{
Hier ein Ausschnitt aus der DrawSprite Methode und ein die Methode SetRect
}
procedure TPluto2DSprite.DrawSprite(const event:Boolean = True; const NewDraw:Boolean = True);
var
x,y,i,c:Integer;
begin
if isScrolledWindow then begin
ChangeScrollWindow:=False;
x:=Left; y:=top;
ChangeScrollWindow:=True;
Left:=x-ViewRect.Left;
Top:=y-ViewRect.Top;
end;
...
end;
procedure TPluto2DSprite.SetRect(Index: integer; const AValue: integer);
begin
case index of
0: begin
if not ChangeScrollWindow then
fLeft:=AValue
else
fPLeft:=AValue;
end;
1: begin
if not ChangeScrollWindow then
fTop:=AValue
else
fPTop:=AValue;
end;
2: fWidth:=AValue;
3: fHeight:=AValue;
end;
end; // TPluto2DSprite.SetRect
{
Die Methode NewAllDraw regelt das Eigentiche Scrollen
}
procedure TPluto2DEngine.NewAllDraw;
var
px,py,pw,ph:Integer;
x,y:Integer;
sprite:TPluto2DSprite;
begin
Buffer.Canvas.Draw(0,0,BackupBuffer);
for y:=0 to SpriteMangerList.Count-1 do begin
for x:=0 to TPluto2SpriteManger(SpriteMangerList[y]).fItems.Count-1 do begin
sprite:=TPluto2DSprite(TPluto2SpriteManger(SpriteMangerList[y]).fItems[x]);
if sprite.Visible then begin
sprite.ViewRect:=ViewRect;
sprite.ChangeScrollWindow:=False;
if (sprite.Left >=ViewRect.Left-100) and
(sprite.Left <=ViewRect.Left+Buffer.Width+100) and
(sprite.Top >=ViewRect.Top-100) and
(sprite.Top <=ViewRect.Top+Buffer.Height+100) then
sprite.DrawSprite(True);
end;
end; // for x
end; // for y
flip
end;
{
Diese Methode wertet die Tatenevents aus. UNd scrollt.
}
procedure TPLRGame.KeyDown(var Key: Word; Shift: TShiftState);
begin
inherited KeyDown(Key, Shift);
case Key of
VK_RIGHT: begin
Engine.ViewRect.Left:=Engine.ViewRect.Left+30;
Engine.NewAllDraw;
end; // VK_RIGHT
VK_LEFT: begin
if Engine.ViewRect.Left-30 >= 0 then begin
Engine.ViewRect.Left:=Engine.ViewRect.Left-30;
// Engine.NewAllDraw;
Engine.NewAllDraw;
end;
end; // VK_RIGHT
VK_DOWN: begin
Engine.ViewRect.Top:=Engine.ViewRect.Top+30;
Engine.NewAllDraw;
end; // VK_RIGHT
VK_UP: begin
if Engine.ViewRect.Top-30 >=0 then begin
Engine.ViewRect.Top:=Engine.ViewRect.Top-30;
Engine.NewAllDraw;
// Engine.NewAllDraw;
end;
end; //
VK_1: AktivPlayer:=0;
VK_2: AktivPlayer:=1;
VK_3: AktivPlayer:=2;
VK_4: AktivPlayer:=3;
end;
end; // TPLRGame.KeyDown
{
Dies ist ein Teil von einer Eigenschaft die in der Engine die Methode ScrollToObjekt aufruft die ich als erste zeige.
}
procedure TPLRGame.SetAktivPlayer(const AValue: Integer);
begin
if fAktivPlayer=AValue then exit;
fAktivPlayer:=AValue;
Engine.ScrollToObject(Player[AValue]);
engine.NewAllDraw;
end; // TPLRGame.SetAktivPlayer