Einzelnen Beitrag anzeigen

Myribo

Registriert seit: 11. Sep 2007
Ort: Bielefeld
14 Beiträge
 
#5

Re: Andorra2D - FUllscreen/Vollbild/Stretch

  Alt 30. Jul 2009, 14:28
jau, sauber!
funktioniert einwadfrei!!
muss jetzt leider auf xp verzichten, weils damit leider gar nicht geht (directx und ogl) aber dafür klappts jetzt auch
schönen dank für die schnelle und kompetente hilfe!

das ganze sieht bei mir jetzt so aus:

Delphi-Quellcode:
procedure TfrmMain.FormCreate(Sender: TObject);
var GraphicsFolder:TStringList;
    GraphicsIndex:Integer;
begin
  // Grundlegendes
  IsMouseDown:=False;
  Randomize;

  // Klassen usw. initialisieren
  GlobalSounds:=TInstantSound.Create;
  GraphicsFolder:=TStringList.Create;

  EasyTimer:=TEasyTimer.Create;

  // Andorra 2D initialisieren
  OutputScreen:=TAdDraw.Create(self);
  OutputScreen.DllName:='DLL/AndorraDX93D.dll';

  OutputScreen.Options:=OutputScreen.Options+[aoAntialias];

  with OutputScreen.Display do
  begin
    Width:=Screen.Width;
    Height:=Screen.Height;
    BitDepth:=ad32Bit;
    DisplayMode:=dmFullscreen;
  end;

  OutputScreen.Initialize;

  GameScreen:=TAdTextureSurface.Create(OutputScreen);
  GameScreen.SetSize(1280,720);

  PerformanceCounter:=TAdPerformanceCounter.Create;
  PerformanceCounter.MaximumFrameRate:=150;
  PerformanceCounter.MaximumTimeGap:=30;

  // Bilder in die ImageList laden
  ImageList:=TAdImageList.Create(OutputScreen);

  // PNG Grafiken laden
  SpecialFunctions.FindAllFiles(GraphicsFolder,'Graphics','*.png',False);
  for GraphicsIndex:=0 to pred(GraphicsFolder.Count) do
  begin
    with ImageList.Add(ChangeFileExt(ExtractFileName(GraphicsFolder[GraphicsIndex]),'')) do
    begin
      Texture.LoadGraphicFromFile(GraphicsFolder[GraphicsIndex],True,clNone);
      Texture.Filter:=atAnisotropic;
    end;
  end;

  ImageList.Restore;

  // EasyDraw initialisieren
  EasyDraw:=TEasyDrawAd.Create(GameScreen,ImageList);

  // Spielszenen / Status initialisieren
  GameScenes[0]:=TScene_Loader.Create(frmMain,GameScreen,ImageList);
  GameScenes[1]:=TScene_Intro.Create(frmMain,GameScreen,ImageList);
  GameScenes[2]:=TScene_Splash.Create(frmMain,GameScreen,ImageList);
  GameScenes[3]:=TScene_MainMenu.Create(frmMain,GameScreen,ImageList);
  GameScenes[4]:=TScene_NewGame.Create(frmMain,GameScreen,ImageList);
  GameScenes[5]:=TScene_Game.Create(frmMain,GameScreen,ImageList);

  GameSceneNow:=0;
  GameSceneNext:=0;

  // Alles einschalten
  Application.OnIdle:=Cadence;
end;
...und...

Delphi-Quellcode:
procedure TfrmMain.Cadence(Sender:TObject; var Done:boolean);
begin
  // Initialisierung
  GameScreen.ClearSurface(clWhite);
  OutputScreen.BeginScene;
  PerformanceCounter.Calculate;

  // Timer berechnen
  EasyTimer.Cadence(PerformanceCounter.TimeGap);

  // Szene zeichnen
  if (GameSceneNow<>GameSceneNext) AND (NOT (GameSceneChangeSize<2)) then
    GameScenes[GameSceneNext].Draw(PerformanceCounter.TimeGap)
  else
    GameScenes[GameSceneNow].Draw(PerformanceCounter.TimeGap);


  if GameSceneNow<>GameSceneNext then
  begin
    EasyDraw.Image('Image_Star_ChangeScene',640,360,Round(GameSceneChangeAlpha),Round(GameSceneChangeSize*30),
                   Round(ImageList.Find('Image_Star_ChangeScene').Width*GameSceneChangeSize),
                   Round(ImageList.Find('Image_Star_ChangeScene').Height*GameSceneChangeSize));

    // Szenenwechsel
    if GameSceneChangeSize<2 then
    begin
      GameSceneChangeSize:=GameSceneChangeSize+PerformanceCounter.TimeGap/400 ;
    end
    else if GameSceneChangeAlpha>0 then
    begin

      if GameSceneChangeAlpha=255 then
      begin
        TRY
          GameScenes[GameSceneNext].Run;
        EXCEPT
          // Die Szene hat keine Run-Methode
        END;
      end;

      GameSceneChangeAlpha:=GameSceneChangeAlpha-PerformanceCounter.TimeGap/5;
    end
    else
    begin
      GameSceneNow:=GameSceneNext;

    end;
  end;

  // Surface zeichnen
  OPS_Height:=OutputScreen.Width/16*9;
  GameScreen.Image.Texture.Filter:=atAnisotropic;
  GameScreen.Image.StretchDraw(OutputScreen,AdRect(0,(OutputScreen.Height-OPS_Height)/2,OutputScreen.Width,OPS_Height+((OutputScreen.Height-OPS_Height)/2)),0);

  // Schwarze Balken zeichnen
  OutputScreen.Canvas.Brush.Color:=AdCol32_Black;
  OutputScreen.Canvas.Pen.Color:=AdCol32_Black;
  OutputScreen.Canvas.Rectangle(0,0,OutputScreen.Width,Round((OutputScreen.Height-OPS_Height)/2));
  OutputScreen.Canvas.Rectangle(0,Round(((OutputScreen.Height-OPS_Height)/2)+OPS_Height),OutputScreen.Width,OutputScreen.Height);

  // FPS anzeigen
  OutputScreen.Canvas.TextOut(2,1,IntToStr(PerformanceCounter.FPS)+' FPS');

  // Zeichnen beenden und ausgeben
  OutputScreen.EndScene;
  OutputScreen.Flip;

  Done:=False;
end;
die berechnungen sind nicht so ganz schön und sauber, aber erstmal funktionierts.


auf diesem wege auch noch einmal ein großes lob für andorra 2d. nicht schlecht, was du da mit deinen jungen jahren (bist ja genau 4 tage älter als ich^^) auf die beine gestellt hast.
ich werde dich mal informieren, wenn das spiel dann fertiggestellt ist.

in diesem sinne
schönen dank
myribo

[edit=TBx]Formatierung korrigiert, damits wieder auf den Schirm paßt Mfg, TBx[/edit]
Miniaturansicht angehängter Grafiken
td3_2_213.jpg   td3_1_193.jpg  
  Mit Zitat antworten Zitat