AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Projekte Andorra2D - FUllscreen/Vollbild/Stretch
Thema durchsuchen
Ansicht
Themen-Optionen

Andorra2D - FUllscreen/Vollbild/Stretch

Ein Thema von Myribo · begonnen am 29. Jul 2009 · letzter Beitrag vom 31. Jul 2009
Antwort Antwort
Myribo
Registriert seit: 11. Sep 2007
hallo liebe gemeinde!

ich weiß nicht genau, ob dieses thema hierhin gehört, denn ich hab mal ne frage (eigentlich 2...) zu andorra2d...

und zwar programmiere ich inzwischen schon eine ganze weile an einem spiel.
TAdDraw läuft ganz normal in einem formular, welches 1280x720 px groß ist.
meine fragen sind nun ganz simpel.

ich möchte
a) das programm im vollbildmodus laufen lassen (hab ich aber schon nen bisschen hinbekommen...)

so evtl?...

Delphi-Quellcode:
with GameScreen.Display do
  begin
    Width := 1280;
    Height := 800;
    BitDepth := ad32Bit;
    DisplayMode := dmFullscreen;
  end;
und beim onidle
Delphi-Quellcode:
// Schwarze Balken zeichnen
  GameScreen.Canvas.Brush.Color:=AdCol32_Black;
  GameScreen.Canvas.Rectangle(0,720,1280,800);
und

b) dass sich das programm auf den bildschirm "quetscht" ober vergrößert.

bisschen unglücklich formuliert, aber ich hoffe ihr wisst, was ich meine. im grunde möchte ich nur, dass sich das spiel automatisch an verschiedene bildschirmgrößen anpasst, aber immer im 16:9 format bleibt. müssten ja quasi schwarze ränder gezeichnet werden denk ich mal. auf kleineren monitoren müsste das bild demnach irgendwie verkleinert werden.

ich hoffe, dass mir jemand hier weiterhelfen kann.
bedanke mich schon mal fürs lesen!

gruß
myribo

[edit=TBx]neu gepostet, die Formatierung war hin Mfg, TBx[/edit]
 
Benutzerbild von igel457
igel457

 
FreePascal / Lazarus
 
#2
  Alt 29. Jul 2009, 15:09
Zu a)
So sollte das richtig sein, du musst allerdings eine Auflösung angeben, die von der Grafikkarte und dem Monitor unterstützt werden.

Zu b)
Ich würde ein Surface erstellen (wie das geht ist in der Andorra 2D Demo "Surfaces" gezeigt), welches immer im 16:9 Format ist. Dort landen deine Bildschirmausgaben. Das Surface würde ich dann mittig auf das eigentliche TAdDraw zeichnen.

Hoffe dir geholfen zu haben,
Andreas

PS: Fragen zu Andorra 2D solltest du in Zukunft im Forum "Multimedia" stellen und am besten nur eine Frage pro Thread . Schreibe so was wie "[Andorra 2D]" vor deinen Thread-Titel, dann finde ich das auch schnell (hast du ja schon gemacht).
Andreas
  Mit Zitat antworten Zitat
Myribo
 
#3
  Alt 29. Jul 2009, 18:58
hi!

super, vielen dank für die schnelle und nette antwort, chef

allerdings bekomme ich ein problem beim umsetzung der TAdTextureSurface-Lösung...

die demo habe ich mit angeschaut, allerdings stürzt diese immer ab (hat ein prob. festgestellt...). dies geschieht unter vista x64 und xp x86(vmware).

dann habe ich die lösung auf mein projekt angewendet und siehe da:
... auch ein fehler :'(
und zwar immer dann, wenn ich
GameScreen:=TAdTextureSurface.Create(OutputScreen); aufrufe.

der ganze formcreate code sieht 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/AndorraOGL.dll';

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

  {with Gamescreen.Display do
  begin
    Width := 1280;
    Height := 800;
    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;
wäre super, wenn du mal drüberschauen könntest...
der fehler tritt immmer dann auf, wenn ich die create-zeile drinne lasse.
hab ich irgendetwas in der reihenfolge vertauscht?

arbeite mit ad2d 0.451, delphi 7 enterprise und win xp 32 auf virtualbox

schönen gruß
myribo

__________________________________________________ ____________________________________

ps zurück: jo danke, werd ich beim nächsten mal dort rein schieben

__________________________________________________ ____________________________________

// edit: hab evtl nochmal nen screen drangehängt...
Miniaturansicht angehängter Grafiken
td3error_356.jpg  
  Mit Zitat antworten Zitat
Benutzerbild von igel457
igel457

 
FreePascal / Lazarus
 
#4
  Alt 29. Jul 2009, 22:02
Hm, ja...

Ich habe vergessen zu erwähnen, dass diese Lösung auch eine Grafikkarte benötigt, die Surfaces (in der OpenGL Welt "FBOs", Frame Buffer Objects) unterstützt. Das ist ab Grafikkarten, die DirectX 9 oder höher unterstützen der Fall.

Ist dies nicht der Fall schmiert die Anwendung leider ab. Der Virtual Box OpenGL Treiber hatte damit (bei meinen Tests auf jeden Fall) Probleme.

Ich habe jetzt noch ein bisschen in der Andorra 2D Dokumentation gekramt, und da ist mir die Eigenschaft "Viewport" eines jeden TAdRenderingSurface.Scene (also auch TAdDraw.Scene) eingefallen:

Zitat:
TAdScene.Viewport
Defines the rectangle where graphic operations take place. Viewport is automatically set when a change in the size of the surface occurs. If you want to use your own viewport, don't forget to reset it after such a change happened. The viewport is always given in absolute coordinates.
Also: Einfach dein Ausgaberechteck angeben (in absoluten Bildschirm/Fensterkoordinaten) und gut sollte es sein.

PS: Ich bin mir nicht ganz sicher, aber es könnte sein, dass du nach dem setzen von Viewport die "Setup2DScene"-Methode aufrufen musst und dort Breite und Höhe übergeben, damit die Ausgabe nicht verzerrt.
Andreas
  Mit Zitat antworten Zitat
Myribo
 
#5
  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
Myribo
 
#6
  Alt 30. Jul 2009, 16:05
oha entschuldige, aber ich habe nur noch eine ganz kurze frage zur videowiedergabe:

Delphi-Quellcode:
unit pScene_Intro;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls,
  AdDraws, AdClasses, AdTypes, AdPerformanceCounter, AdPNG, AdVideo,
  Main, pGameScene, pEasyDrawAd;

type
  TScene_Intro = class(TGameScene)
    constructor Create(pMainForm:TfrmMain;pGameScreen:TAdTextureSurface;pImageList:TAdImageList);
  private
    { Private-Deklarationen }
    MainForm:TfrmMain;
    GameScreen:TAdTextureSurface;
    ImageList:TAdImageList;
    EasyDraw:TEasyDrawAd;

    IntroVideo:TAdVideoPlayer;
  public
    { Public-Deklarationen }
    procedure Draw(TimeGap:Double); override;
    procedure Run; override;

    procedure KeyPress(Key:Integer); override;
  end;

implementation

constructor TScene_Intro.Create(pMainForm:TfrmMain;pGameScreen:TAdTextureSurface;pImageList:TAdImageList);
begin
  MainForm:=pMainForm;
  GameScreen:=pGameScreen;
  ImageList:=pImageList;
  EasyDraw:=TEasyDrawAd.Create(GameScreen,ImageList);

  IntroVideo:=TAdVideoPlayer.Create(GameScreen.Parent);
  IntroVideo.Image.Texture.Filter:=atLinear;
  IntroVideo.Open('Video/Intro.mpg');
end;

procedure TScene_Intro.Draw(TimeGap:Double);
begin
  IntroVideo.Move(TimeGap);
  IntroVideo.Image.Draw(GameScreen,0,0,0);
  Main.frmMain.Caption:=IntToStr(IntroVideo.CurrentFPS);
end;

procedure TScene_Intro.KeyPress(Key:Integer);
begin
  if (Key=27) OR (Key=32) OR (Key=13) then
  begin
    MainForm.ChangeGameScene(2);
  end;
end;

procedure TScene_Intro.Run;
begin
  IntroVideo.Play;
end;


end.
was ist daran denn so falsch?
ich sehe und höre nichts und die videofps sind bei null.
ich habs doch eigentlich so gemacht wie in der demo (in der das video auch abgespielt wird...)

schönen gruß
  Mit Zitat antworten Zitat
Benutzerbild von igel457
igel457

 
FreePascal / Lazarus
 
#7
  Alt 30. Jul 2009, 19:02
Du solltest vielleicht noch AdAcinerella als Dekoder einbinden und die "acinerella.dll" in dein Programmverzeichnis kopieren. Allerdings fällt dein Programm dann unter die GPL (da die von Acinerella verwendeten Bibliotheken ebenfalls unter der GPL stehen). Siehe http://de.wikipedia.org/wiki/GNU_General_Public_License .
Andreas
  Mit Zitat antworten Zitat
Myribo
 
#8
  Alt 30. Jul 2009, 23:48
jau, funktioniert super, danke

allerdings bekomme ich es nur hin, dass das video auf ein TAdDraw gezeichnet wird. da ich jetzt aber mit TAdTextureSurface arbeite, soll das video natürlich darauf gezeichnet werden.
laut der gpl darf ich die dll doch mitliefert, oder? ist es eigentlich möglich, den acinerella.dll speicherort anzugeben, wenn diese sich nicht im hauptverzeichnis befinden soll?

lg myribo =)
  Mit Zitat antworten Zitat
Benutzerbild von igel457
igel457

 
FreePascal / Lazarus
 
#9
  Alt 31. Jul 2009, 16:48
Zitat von Myribo:
allerdings bekomme ich es nur hin, dass das video auf ein TAdDraw gezeichnet wird. da ich jetzt aber mit TAdTextureSurface arbeite, soll das video natürlich darauf gezeichnet werden.
Ich wüsste nicht, was dagegen sprechen sollte ein Video nicht auf ein TAdDraw zu zeichnen - verwaltet TAdVideo intern ein TAdImage. Probiere aber vor dem Aufruf der Videozeichenfunktion mal ein TAdTextureSurface.Activate aufzurufen. Intern machen die ganzen Funktionen, denen du ein Surface übergibst auch nichts anderes.

Die GPL schreibt dir nur vor, deinen eigenen Quelltext ebenfalls öffentlich zugänglich zu machen, sobald du Sourcecode der unter der GPL steht verwendest. Mitliefern darfst du die DLL natürlich.

Um die acinerella.dll aus einem anderen Verzeichnis laden zu können, musst du den acinerella.pas Header anpassen, der die DLL momentan leider statisch Lädt.
Andreas
  Mit Zitat antworten Zitat
Myribo
 
#10
  Alt 31. Jul 2009, 17:55
klasse, danke!

funktioniert NUR so bei mir:

Delphi-Quellcode:
  GameScreen.Activate;

  IntroVideo.Image.StretchDraw(GameScreen,AdRect(0,0,1280,720),0);
  IntroVideo.Draw(GameScreen.Parent,AdRect(0,0,1280,720));
schönen dank für die schnelle und kompetente hilfe.

gruß myribo
  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 14:06 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