![]() |
Re: Andorra 2D [Ver. 0.40, 01.07.08]
Ist es eigentlch normal, dass wenn ich Setup2DScene aufrufe, dass dann zwar die Grafiken resized werden, aber scheinbar die Größe und die Position intern nicht? Onclickevents meiner Sprites die über position und Größe definiert werden klappen dann nicht mehr korrekt...
|
Re: Andorra 2D [Ver. 0.40, 01.07.08]
Liste der Anhänge anzeigen (Anzahl: 1)
Was genau meinst du? Wenn ich setup2dScene aufrufe, wird die Spielfeldgröße geändert, sonst keine Größen verändert :gruebel:
@EugenB: benutzt du Windows oder Linux? Unter Linux läuft das ganze ohne Probleme bei mir, nachdem ich cthreads als erste Unit des programms hinzugefügt habe, in der Projektdatei habe ich also stehen:
Delphi-Quellcode:
Wenn du das Problem unter Windows hast, versuche mal aktuelle Grafiktreiber zu installieren.
{$ifdef unix}
cthreads, {$endif} Forms, Main in 'Main.pas', lazopenglcontext; |
Re: Andorra 2D [Ver. 0.40, 01.07.08]
Benutze Windows, unter Windows laufen Threads eigentlich sofort
wenn ich die aktuelle Treiber von ATI installieren will kommt auf einmal "Die Treiber passen nicht zur Grafikkarte" = ATI Doof -.- ich versuchs später nochmal mal sehn ob dann die Treiber passen löl Edit: Da die Installation immer abgebrochen ist, war ich mal so dreist und habe die Treiber von hand ausgewählt und voila die Demos laufen schonmal ^^ Edit2: Also ich kann nichtmal das erstellte Programm starten, benutze die SVN Version von Lazarus also 0.9.25 werde es später mit der 0.9.24 probieren mal sehn ob es dann geht |
Re: Andorra 2D [Ver. 0.40, 01.07.08]
Liste der Anhänge anzeigen (Anzahl: 3)
Zitat:
Wie auch immer, ich habe jetzt die Beobachtung gemacht, dass die Sprites irgendwie ihre richtige Größe behalten, obwohl sie gleichzeitig bei steigender Größe des Fensters/Panels pixeliger werden. Es macht fast den Eindruck, als würde hier etwas erst herunterskaliert und dann wieder hochskaliert. Wenn ich das Fenster kleiner als die Ursprungsgröße mache, werden die Sprites verkleinert. Bei der exakten Ursprungsgröße ist alles perfekt. Ich habe 3 Screenshots angehängt, die das Problem ganz gut zeigen. Vielen Dank für eure Hilfe! |
Re: Andorra 2D [Ver. 0.40, 01.07.08]
Hmmm,d as sieht in der Tat falsch aus. Zeig mir mal bitte deinen Initialisierungscode, also da wo du dein AdDraw erstellst.
|
Re: Andorra 2D [Ver. 0.40, 01.07.08]
Hallo, inherited.
Also ich habe eine Klasse namens TSgGame, die sich um die Erstellung und Verwaltung des AdDraw-Objekts kümmert. Das Fenster, auf das gezeichnet werden soll, wird als Parameter Parent übergeben.
Delphi-Quellcode:
Meine Mainform erzeugt im OnCreate eine Instanz von TSgGame:
constructor TSgGame.Create(const Parent: tWinControl);
begin inherited Create; fPerformanceCounter := tAdPerformanceCounter.Create; AdDraw := TAdDraw.Create(parent); AdDraw.DllName := 'AndorraDX93D.dll'; {...} // Setup(parent.width,parent.height); <-- hab ich testweise in's OnCreate der Form verschoben. weiß nicht mehr wieso >.< adDraw.Initialize; end;
Delphi-Quellcode:
TSgGame.Setup sieht so aus:
procedure TfrmMain.FormCreate(Sender: TObject);
begin {...} pDrawScreen.Align := alClient; // pDrawScreen ist das TPanel auf das gezichnet werden soll pDrawScreen.Caption := '...'; {...} game := tsggame.Create(pDrawScreen); game.setup(pdrawscreen.width,pdrawscreen.height); {...} windowstate := wsmaximized; {...} end;
Delphi-Quellcode:
Der Vollständigkeit halber noch der Code aus dem OnResize des Panels:
procedure TSgGame.setup(width, height: integer);
begin {...} if AdDraw.Initialized then AdDraw.Setup2DScene; end;
Delphi-Quellcode:
procedure TfrmMain.pDrawScreenResize(Sender: TObject);
begin if assigned(game) then // <-- Die Prüfung ist wegen dem doofen Bug, dass OnResize auch nach dem OnDestroy noch aufgerufen wurde oder so... game.setup(pdrawscreen.width,pdrawscreen.height); end; |
Re: Andorra 2D [Ver. 0.40, 01.07.08]
Da bin ich jetzt ehrlich gesagt etwas ratlos, das sieht eigentlich korrekt aus :gruebel:
Könntest du eventuell nochmal deine Zeicheroutine zeigen? |
Re: Andorra 2D [Ver. 0.40, 01.07.08]
Liste der Anhänge anzeigen (Anzahl: 1)
Also zum Thema Texturen werden vergrößert, die OnClick-Events aber nicht richtig berechnet geb ich euch hier mal eine Demo.
Einfach mal das Spiel starten und dann das Fenster resizen. Dann versucht mal die Buttons anzuklicken... Der Code zum Überprüfen ob ein Button gedrückt wurde ist der folgenden:
Delphi-Quellcode:
function TGameButton.CheckOnClick(aX, aY: Integer; Up: Boolean): Boolean;
begin Result := false; if Enabled then begin if ((aX < X + Width) and (aX > X)) and ((aY > Y) and (aY < Y + Height)) then begin Result := true; if Up then OnUp else OnDown; end else begin ButtonStat := bsUp; ChangeTex(true); end; end; end; |
Re: Andorra 2D [Ver. 0.40, 01.07.08]
Zitat:
Delphi-Quellcode:
Erläuterung:
// Diese procedure wird von TSgGame für jedes Tile aufgerufen, dass gezeichnet werden soll:
procedure TSgGame.DoPaintTile(const Tile: tSgTile); var done: boolean; begin done := false; if Assigned(fOnPaintTile) then fOnPaintTile(Tile,done); if not done then if Tile.sprite <> nil then Tile.DrawTo(adDraw,Camera); end; // Diese procedure wird durch den obigen Code aufgerufen: procedure TSgEditMode.PaintTile(const Tile: tSgTile; var Done: Boolean); {...} begin {...} if Tile.sprite <> nil then begin Tile.sprite.Color := cl; // Tile wird je nach Typ eingefärbt Tile.sprite.Draw(fParent.adDraw,round(Tile.left-fParent.Camera.left), round(Tile.top-fParent.Camera.top),0); Tile.sprite.Color := clwhite; end; {...} Done := True; end; Ich habe Zusatzfunktionen, wie zum Beispiel die Editorfunktion als eine Art "Plugin" geplant. TSgGame verwaltet eine Liste mit Plugins, die sich in bestimmte Events einklinken können, um bestimmte Funktionen nachzurüsten (praktisch z.B. für einen Debug-Mode). Dieses Plugin belegt das Event OnPaintTile des TSgGame-Objektes. Das Plugin sorgt dann dafür, dass z.B. ein Rahmen um das Tile gezeichnet wird, der im Spiel hinterher natürlich nicht erschinen soll, und dass das Tile eingefärbt wird. Schlussendlich noch die Paint-Routine von TSgGame:
Delphi-Quellcode:
procedure TSgGame.Paint;
var x1,y1,x2,y2: integer; i: integer; tmptilelist: tsgtilelist; begin if addraw.CanDraw then begin fPerformanceCounter.Calculate; fTimeGap := fPerformanceCounter.TimeGap/100; adDraw.BeginScene; adDraw.ClearSurface(clblack); // Der folgende Code scheint etwas komplex, was daran liegt, dass ich die gesamte Spielfläche // zur Optimierung in ein Raster unterteile. Jede Zelle enthält eine Liste, die speichert, welche // Tiles in ihr liegen. // Der Code tut also folgendes: Er sucht alle Quadrate die im Sichtfeld liegen und liest alle in // diesen Quadraten vorhandenen Tiles in eine temporäre Liste ein. In der for-Schleife wird dann // jedes Element gezeichnet. (natürlich kann schlimmstenfalls es passieren, dass ein Tile so 4 mal // gezeichnet wird, was aber imemr noch effizienter sein dürfte, als immer ALLE Tiles zu zeichnen x1 := floor(camera.left-bg_sectorsize); y1 := floor(camera.top-bg_sectorsize); x2 := floor(camera.left+camera.width); y2 := floor(camera.top+camera.height); tmptilelist := tsgtilelist.Create(false); Map.Grid.TilesNearRect(x1,y1,x2,y2,tmptilelist); for i := 0 to tmptilelist.Count - 1 do DoPaintTile(tmptilelist[i]); freeandnil(tmptilelist); {...} adDraw.EndScene; adDraw.Flip; end; end; @Diamondback2007: Also das erste Fenster kann ich bei dir nicht in der Größe verändern, und im zweiten ändert sich die Größe der Darstellung nicht und die Buttons funktionieren auch. Bei mir werden die Koordinaten nur beim kleinen Screenshot falsch zugeorndet, der Rest funktioniert. |
Re: Andorra 2D [Ver. 0.40, 01.07.08]
Ähm ich meine nicht die GUI, sondern das Spiel. erst mal Spiel starten drücken ;)
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:44 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