|
![]() |
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:
und beim onidle
with GameScreen.Display do
begin Width := 1280; Height := 800; BitDepth := ad32Bit; DisplayMode := dmFullscreen; end;
Delphi-Quellcode:
und
// Schwarze Balken zeichnen
GameScreen.Canvas.Brush.Color:=AdCol32_Black; GameScreen.Canvas.Rectangle(0,720,1280,800); 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] |
FreePascal / Lazarus |
#2
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 ![]()
Andreas
|
![]() |
|
#3
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:
wäre super, wenn du mal drüberschauen könntest...
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; 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... |
![]() |
FreePascal / Lazarus |
#4
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: ![]() 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. 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
|
![]() |
|
#5
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:
...und...
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;
Delphi-Quellcode:
die berechnungen sind nicht so ganz schön und sauber, aber erstmal funktionierts.
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; 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] |
![]() |
|
#6
oha entschuldige, aber ich habe nur noch eine ganz kurze frage zur videowiedergabe:
Delphi-Quellcode:
was ist daran denn so falsch?
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. 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ß ![]() |
![]() |
FreePascal / Lazarus |
#7
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
![]()
Andreas
|
![]() |
|
#8
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 =) |
![]() |
FreePascal / Lazarus |
#9
![]() 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.
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
|
![]() |
Ansicht |
![]() |
![]() |
![]() |
ForumregelnEs 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
|
|
Nützliche Links |
Heutige Beiträge |
Sitemap |
Suchen |
Code-Library |
Wer ist online |
Alle Foren als gelesen markieren |
Gehe zu... |
LinkBack |
![]() |
![]() |