![]() |
Re: Andorra 2D - GUI Tutorial
Achso, ja, fast vergessen ;)
Ist alles etwas durcheinander und nicht durchkommentiert, weil es nur ein Test ist. Aber so schwer sollte der Quelltext nicht sein ;)
Delphi-Quellcode:
Konkret tritt das Problem auf, wenn TSpieler erzeugt wird (wird vom GUI aufgerufen).
unit uSpiel;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, AdDraws, AdClasses, AdTypes, AdSprites, AdPNG, AdPerformanceCounter, AdComponents, AdGUI, AdGUIConnector; type TBild = class(TImageSpriteEx) private protected procedure DoMove(TimeGap: double); override; public shake: boolean; procedure pict(pict: string); constructor Create(AParent:TSprite); override; end; type TSpieler = class private protected public name: string; StatsPic: tBild; StatsPos: tPoint; Spielernummer: integer; constructor create(pName: string); destructor frei; end; type TForm1 = class(TForm) procedure FormCreate(Sender: TObject); procedure FormDestroy(Sender: TObject); procedure Idle(Sender:TObject; var Done:boolean); private { Private declarations } public procedure HauptSpielerHinzu(Sender: TObject); procedure HauptSpielerEntf(Sender: TObject); procedure HauptSpielerDone(Sender: TObject); procedure AddPlayerDone(Sender: TObject); end; var Form1: TForm1; AdDraw: TAdDraw; AdSpriteEngine: TSpriteEngine; AdImageList: TAdImageList; AdPerCounter: TAdPerformanceCounter; AdGui: TAdGUI; AdConnector: TAdGUIConnector; Spieler: Array[0..9] of tSpieler; AnzSpieler: integer; implementation {$R *.dfm} procedure TForm1.FormCreate(Sender: TObject); begin AdDraw := TAdDraw.Create(self); AdDraw.DllName := 'AndorraOGl.dll'; AdSpriteEngine := TSpriteEngine.Create(nil); AdSpriteEngine.Surface := AdDraw; AdImageList := TAdImageList.Create(AdDraw); AdPerCounter := TAdPerformanceCounter.Create; AnzSpieler := 0; AdGUI := TAdGUI.Create(AdDraw); if AdDraw.Initialize then begin Application.OnIdle := Idle; AdGUI.Skin.LoadFromFile('sunna.axs'); AdGUI.Cursors.LoadFromFile('cursors.xml'); AdGUI.LoadFromFile('hauptmenu.axg'); AdConnector := TAdGUIConnector.Create(AdGUI); AdConnector.ConnectEventHandlers(AdDraw.Window); TAdButton(AdGUI.FindComponent('SpielerHinzu')).OnClick := HauptSpielerHinzu; AdImageList.Restore; end else begin ShowMessage('Grafikenginefehler.'); halt; end; end; procedure TForm1.HauptSpielerHinzu(Sender: TObject); begin AdGUI.LoadFromFile('Spielerhinzu.axg'); TAdButton(AdGUI.FindComponent('done')).OnClick := AddPlayerDone; end; procedure TForm1.HauptSpielerEntf(Sender: TObject); begin end; procedure TForm1.HauptSpielerDone(Sender: TObject); begin end; procedure TForm1.AddPlayerDone(Sender: TObject); begin inc(AnzSpieler); Spieler[AnzSpieler] := tSpieler.create(TAdEdit(AdGUI.FindComponent('name')).text); AdGUI.LoadFromFile('Hauptmenu.axg'); end; procedure TForm1.Idle(Sender: TObject; var Done: boolean); begin if AdDraw.CanDraw then begin AdPerCounter.Calculate; AdDraw.ClearSurface(clBlack); AdDraw.BeginScene; AdSpriteEngine.Move(AdPerCounter.TimeGap / 1000); AdSpriteEngine.Draw; AdSpriteEngine.Dead; AdGUI.Update(AdPerCounter.TimeGap / 1000); AdDraw.EndScene; AdDraw.Flip; end; Done := false; end; procedure TForm1.FormDestroy(Sender: TObject); begin AdDraw.Free; end; constructor TBild.Create(AParent:TSprite); begin inherited; end; procedure TBild.Pict(pict: string); begin if AdImageList.Find(pict) = nil then begin with AdImageList.Add(pict) do begin Texture.LoadGraphicFromFile(pict, true, clFuchsia); end; AdImageList.Restore; end; self.SetImage(AdImageList.Find(pict)); end; procedure TBild.DoMove(TimeGap: double); begin inherited; end; constructor TSpieler.create(pName: string); begin name := pName; Spielernummer := AnzSpieler; StatsPic := tBild.create(AdSpriteEngine); StatsPic.pict('pic/stats.png'); StatsPic.Y := 1; StatsPic.X := (StatsPic.Width)*(Spielernummer) - StatsPic.Width; if StatsPic.X = 0 then StatsPic.X := 1; end; destructor TSpieler.frei; begin end; end. |
Re: Andorra 2D - GUI Tutorial
Weiß niemand Rat? Das komische ist, dass ich andere Sprites erzeugen kann, ohne dass das Menü nicht mehr bneuztbar ist - es muss also an tBild liegen, ich sehe jedoch gar keinen Unterschied zum anderen Sprite..
Edit: Stimmt nicht ganz. tBild kann ich auch ohne Probleme erzeugen, das Problem tritt nur auf, wenn tSpieler es erzeugt. :gruebel: Edit2: Stimmt auch nicht ganz. Wenn ich tSpieler manuell erzeuge (mit einer eigenen Variabele), dann geht auch noch alles. Edit3: Nun, es liegt scheinbar gar nicht an dem Sprite :oops: Diese Zeile:
Delphi-Quellcode:
macht das GUI unbrauchbar. Muss ich das irgentwie anders laden (Hauptmenu.axg wurde ja vorher schonmal geladen)?
AdGUI.LoadFromFile('menu/Hauptmenu.axg');
|
Re: Andorra 2D - GUI Tutorial
Aloha,
ich habe gleich mehrere Probleme mit der GUI :( Erstens mal kann ich den AdGUIConnector nicht verwenden, da er in der Zeile
Delphi-Quellcode:
meckert: "[Fehler] Unit1.pas(43): Inkompatible Typen: 'TAdWindowFramework' und 'TForm1'"...
AdConnector.ConnectEventHandlers(self);
Wieso? Und, bissl blöder, weil man das nicht so leicht umgehen kann wie das AdConnector-Problem (da gibts ja ne Alternative): Sobald ich
Delphi-Quellcode:
aufrufe, kriege ich eine Exception: "Im Projekt Project2.exe ist eine Exception der Klasse ENoValidCompressor aufgetreten. Meldung: 'No compressor not found to load the compressed bitmap data.'. Prozeß wurde angehalten. Mit Einzelne Anweisung oder Start fortsetzen."
AdGUI.Skin.LoadFromFile('sunna.axs'); //Laden des Skins
Was für ein Kompressor fehlt da? Habe den mitgelieferten Sunna-Skin unverändert übernommen. Er springt dann übrigens in die AdBitmap, Zeile 307 (procedure TAdBitmap.ReadRawData(AStream: TStream);). Könnte irgendeiner der beiden Fehler damit zusammenhängen, dass ich partout die JVCL im Moment nicht installiert bekomme? |
Re: Andorra 2D - GUI Tutorial
Liste der Anhänge anzeigen (Anzahl: 1)
Okay, die Exception ist weg, man musste noch die TAdPNG einbinden :)
Aber noch ein anderes Problem: Wieso sieht die GUI bei mir so hässlich aus? Der scheint das ja irgendwie nicht richtig zu zeichnen (siehe Anhang). |
Re: Andorra 2D - GUI Tutorial
Probiere mal die neuste CVS-Version aus. Kann sein, dass das Problem dort gelöst ist. Mit meiner neuen Grafikkarte hatte ich auch so ähnliche Grafikfehler, ich habe sie jedoch weg bekommen. Du kannst aber auch noch ein paar Tage warten, dann wird es eine Bugfixversion geben.
|
Re: Andorra 2D - GUI Tutorial
OK, jetzt funktioniert es tatsächlich, danke! :)
|
Re: Andorra 2D - GUI Tutorial
Ich bins schon wieder :mrgreen:
Und zwar lade ich jetzt meine GUI (Hauptmenü) und setze danach die OnClick-Events einiger Buttons. Das funktioniert auch prima, die entsprechenden Funktionen werden dann nach einem Klick aufgerufen. Später will ich aber eine neue GUI laden+anzeigen (Pause-Menü) und weise den neuen Elementen wiederrum andere OnClick-Events zu - diese werden dann aber nicht mehr ausgeführt! Sprich er ignoriert bei der später geladenen GUI einfach die Events. Was ist da los? Das ganze tritt immer dann auf, wenn ich durch neu-laden die alte GUI überschreiben und durch eine neue ersetzen will. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:21 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz