Autor Beitrag
Xearox
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 260
Erhaltene Danke: 3



BeitragVerfasst: Di 17.02.15 06:29 
Guten Morgen Zusammen =)

Ich hab hier mal wieder ein kleines Problemchen, über Sinn oder Unsinn kann man sich streiten, worum es hier geht, da mein "Wissen" begrenzt ist und ich so es derzeit mache, da ich keine andere Idee hab, wie man es anders realisieren kann, kommt sicherlich irgendwann später das "Wissen" dazu.

Jut, soviel zum Vorwort.

Also was mache ich in meinem Programm.

Ich erstelle dynamisch ein "array of array of TImage". Damit generiere ich ein "Spielfeld". Derzeit hab ich nur ein Bild drin, eine PNG mit einer Größe von 11kb ( 64px x 64px ).

Das Spielfeld hat verschiedene Größen, welche man sich im Programm aussuchen kann. Beginnend bei 8 x 8 bis hin zu 256 x 256.

Das heißt, bei einer Größe von 8 x 8 wird ein Array mit insgesamt 64 TImages erstellt. Das klappt auch einwandfrei, keine Fehler.
auch bei, 16 x 16, 32 x 32 und 64 x 64 funktioniert alles. Bei 64 x 64 sind es insgesamt 4096 TImages und das macht ein Arbeitspeicher Bedarf von 87876kb aus.
Warum das ganze, weil ich es nicht besser weiß, wie man eine Generierung eines Spielfeldes ohne irgendeine GameEngine(wie Andorra2D), erstellen kann.

So, also bis hier hin funktioniert alles ohne Probleme. Erstelle ich nun aber ein Spielfeld von 128 x 128, also insgesamt 16384 TImages, bleibt das Programm bei 105552kb Arbeitsspeicher Bedarf hängen und bekomme die folgende Fehlermeldung:
ausblenden Quelltext
1:
Erste Gelegenheit für Exception bei $76DBC42D. Exception-Klasse EAccessViolation mit Meldung 'Zugriffsverletzung bei Adresse 004047A7 in Modul 'Project1.exe'. Schreiben von Adresse 00000000'. Prozess Project1.exe (13176)					


Die Generierung ist allerdings noch nicht abgeschlossen. Es bleibt genau bei 4949( +/- 3) TImages hängen.

Meine frage ist nun, gibt es dort irgendeine Begrenzung drin? Ob beim Array oder im Programm selbst?

Die Prozedure, welche das ganze ausführt ist folgende:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
procedure TCreateTerrain.CreateTerrain(Zeilen, Spalten, ImageRes : integer; Owner : TWinControl;
          FilePath : string; ImageTyp : string = 'png'); //ImageRes = Auflösung des Bildes z.B. 64x64px
var
  Z,S : Integer;
begin
  SetLength(TerrainFeld,Zeilen,Spalten);
  for Z := 0 to Zeilen - 1 do
  begin
    for S := 0 to Spalten - 1 do
    begin
      TerrainFeld[Z,S] := TImage.Create(owner);
      if ImageTyp = 'bmp' then TerrainFeld[Z,S].Picture.Bitmap.LoadFromFile(ExtractFilePath(ParamStr(0))+FilePath+'.'+ImageTyp)
      else TerrainFeld[Z,S].Picture.LoadFromFile(ExtractFilePath(ParamStr(0))+FilePath+'.'+ImageTyp);
      TerrainFeld[Z,S].Left   := TerrainFeld[Z,S].Left + (Z * ImageRes);
      TerrainFeld[Z,S].Top    := TerrainFeld[Z,S].Top  + (S * ImageRes);
      TerrainFeld[Z,S].Width  := ImageRes;
      TerrainFeld[Z,S].Height := ImageRes;
      TerrainFeld[Z,S].Parent := owner;
      TerrainFeld[Z,S].OnMouseDown := GameForm.MyTImageMouseDownEvent;
      TerrainFeld[Z,S].OnMouseMove := GameForm.MyTImageMouseMoveEvent;
      TerrainFeld[Z,S].OnMouseUp := GameForm.MyTImageMouseUpEvent;
      GameForm.ProgressBar1.Position := GameForm.ProgressBar1.Position + 1;
      GameForm.Label2.Caption := IntToStr(GameForm.ProgressBar1.Position);
    end;
    Sleep(250); //Hat keinen Besonderen Zweck, viel mehr Spielerei :D
  end;
end;


Und hier meine Klasse, da ich die Generierung mit einem Thread mache.

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
{###############################################################################
############################ Thread Nummer 2 Anlegen ###########################
###############################################################################}

type
  TCreateTerrain = class(TThread)
    procedure Execute; override;
    procedure Ausgabe;
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
    procedure CreateTerrain(Zeilen, Spalten, ImageRes : integer; Owner : TWinControl;
              FilePath : string; ImageTyp : string = 'png'); //ImageRes = Auflösung des Bildes z.B. 64x64
    var
      TerrainFeld : array of array of TImage;
      MapWidth, MapHeight : integer; //Variabeln für die Kartengröße, wird mit MapSettings festgelegt.
  end;


Man schrieb mir zwar, das ich nicht jedesmal type schreiben muss, doch ich finde, das ich damit besser zur Übersicht meines Codes beitragen kann.

Achso, Delphi 2010 nutze ich.


Ich hoffe, das mir hier jemand helfen kann =)
Wenn ihr irgendwelche Tipps habt, wie ich die Erstellung eines Spielfeldes Sinnvoller erstellen kann, teilt mir dies bitte mit.
In meinem "Spiel" kann man bisher noch nichts machen, da wie gesagt, mein "Wissen" begrenzt ist und ich mir den Großteil erst erlesen muss, wie was funktioniert (Grundwissen besitze ich aber schon :D )

Vielen Dank =)

Liebe Grüße
Xearox
Einloggen, um Attachments anzusehen!


Zuletzt bearbeitet von Xearox am Di 17.02.15 12:58, insgesamt 1-mal bearbeitet
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 18702
Erhaltene Danke: 1620

W10 x64 (Chrome, IE11)
Delphi 10.2 Ent, Oxygene, C# (VS 2015), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Di 17.02.15 08:43 
Ich bezweifle, dass du dir mit so vielen TImage Komponenten einen Gefallen tust. Zumal du eigentlich ja nur TPicture brauchst und nicht das ganze TImage. Ob die reine Anzahl ein Problem ist, bezweifle ich aber eher, auch wenn du im Falle von Bitmaps intern sehr viele Handles belegst.

Ich sehe aber, dass du dich offenbar in einem TThread befindest, aber dennoch mit Komponenten auf dem Formular (insbesondere GameForm.ProgressBar1 usw.) ohne Synchronisation interagierst. Das kann nicht klappen. Nur der Hauptthread darf auf visuelle Komponenten zugreifen. Tust du das aus einem Thread heraus, musst du dich mit dem Hauptthread synchronisieren und diese Zugriffe dann in dessen Kontext ausführen statt im Thread.
Und auch TImage Komponenten darfst du nicht aus dem Thread heraus erzeugen. Selbst bei TPicture wäre ich vorsichtig, aber das könnte klappen.
Xearox Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 260
Erhaltene Danke: 3



BeitragVerfasst: Di 17.02.15 09:14 
Ich füge paar Codeabschnitte hinzu, vielleicht kann man das dann ein bisschen besser sehen, weil eine Synchronisation führe ich ja aus.

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
{###############################################################################
############################ Thread Nummer 2 Anlegen ###########################
###############################################################################}

type
  TCreateTerrain = class(TThread)
    procedure Execute; override;
    procedure Ausgabe;
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
    procedure CreateTerrain(Zeilen, Spalten, ImageRes : integer; Owner : TWinControl;
              FilePath : string; ImageTyp : string = 'png'); //ImageRes = Auflösung des Bildes z.B. 64x64
    var
      TerrainFeld : array of array of TImage;
      MapWidth, MapHeight : integer; //Variabeln für die Kartengröße, wird mit MapSettings festgelegt.
  end;


ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
{###############################################################################
############################ Thread Nummer 2 Start #############################
###############################################################################}


procedure TCreateTerrain.Ausgabe;
begin
  GameForm.MyMap.Repaint;
end;

procedure TCreateTerrain.Execute;
begin
  try
    CreateTerrain(MapWidth,MapHeight,65,gameform.MyMap,'image/gras64x64','png');
    Synchronize(Ausgabe);
  except
    on e: Exception do ShowMessage('Fehler aufgetreten');
  end;
  GameForm.Btn_StartGame.Enabled := true;
end;

procedure TCreateTerrain.CreateTerrain(Zeilen, Spalten, ImageRes : integer; Owner : TWinControl;
          FilePath : string; ImageTyp : string = 'png'); //ImageRes = Auflösung des Bildes z.B. 64x64px
var
  Z,S : Integer;
begin
  SetLength(TerrainFeld,Zeilen,Spalten);
  for Z := 0 to Zeilen - 1 do
  begin
    for S := 0 to Spalten - 1 do
    begin
      TerrainFeld[Z,S] := TImage.Create(owner);
      if ImageTyp = 'bmp' then TerrainFeld[Z,S].Picture.Bitmap.LoadFromFile(ExtractFilePath(ParamStr(0))+FilePath+'.'+ImageTyp)
      else TerrainFeld[Z,S].Picture.LoadFromFile(ExtractFilePath(ParamStr(0))+FilePath+'.'+ImageTyp);
      TerrainFeld[Z,S].Left   := TerrainFeld[Z,S].Left + (Z * ImageRes);
      TerrainFeld[Z,S].Top    := TerrainFeld[Z,S].Top  + (S * ImageRes);
      TerrainFeld[Z,S].Width  := ImageRes;
      TerrainFeld[Z,S].Height := ImageRes;
      TerrainFeld[Z,S].Parent := owner;
      TerrainFeld[Z,S].OnMouseDown := GameForm.MyTImageMouseDownEvent;
      TerrainFeld[Z,S].OnMouseMove := GameForm.MyTImageMouseMoveEvent;
      TerrainFeld[Z,S].OnMouseUp := GameForm.MyTImageMouseUpEvent;
      GameForm.ProgressBar1.Position := GameForm.ProgressBar1.Position + 1;
      GameForm.Label2.Caption := IntToStr(GameForm.ProgressBar1.Position);
    end;
    Sleep(100);
  end;
end;

{###############################################################################
############################ Thread Nummer 2 Ende ##############################
###############################################################################}


Was meinst du damit, das ich nur das TPicture brauche und nicht das ganze TImage?
Wenn ich TImage in TPicture änder, also array of array of TPicture, kann ich die Positionen, also .Left und .Top nicht mehr festlegen. Oder wie genau meinst du das?
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 18702
Erhaltene Danke: 1620

W10 x64 (Chrome, IE11)
Delphi 10.2 Ent, Oxygene, C# (VS 2015), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Di 17.02.15 09:42 
So wie du es im Moment hast brauchst du ein TImage, das ist richtig, weil du das direkt auf dem Formular anzeigen willst. Das geht aber nicht aus dem Thread heraus. Synchronisieren tust du nur die Methode Ausgabe. Das reicht aber nicht. Du musst so wie dein Quelltext aktuell ist alles im Thread synchronisieren, sprich auf den Thread verzichten...
Deine einzige Möglichkeit das Laden im Thread zu machen ist, dass du TPicture benutzt, sprich keine visuelle Komponente. Dann kannst du aus diesen Daten jeweils das in eine Anzeige aus TImage Komponenten laden, was angezeigt werden soll. Dann reicht auch ein großes TImage, auf dem die Anzeige nur zusammengesetzt wird (das ist das Rendern, das eine Engine macht).

Eine so große Kachelung aus TImages wäre nämlich so langsam, dass du das nicht als Spiel benutzen kannst...
Xearox Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 260
Erhaltene Danke: 3



BeitragVerfasst: Di 17.02.15 10:51 
Naja gut, das es langsam ist, so mindestens aktuell, kann ich nicht behaupten, alles funktioniert einwandfrei.

Aber, das ist ja auch nicht das Grundlegende Problem, das Problem ist ja hier, das ein Fehler Auftritt, sobald das Programm 100mb Arbeitsspeicher Bedarf erreicht. Also im Array 100MB Daten gespeichert sind.

Und daher beruht meine Ursprüngliche Frage darauf, ob es dort, also im Array, eine Speicherbegrenzung gibt oder ob es am Programm selber liegt oder ob es schlicht am TImage liegt.
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 18702
Erhaltene Danke: 1620

W10 x64 (Chrome, IE11)
Delphi 10.2 Ent, Oxygene, C# (VS 2015), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Di 17.02.15 11:25 
Wie ich schon geschrieben habe. Das Problem ist der Thread. Das geht so schlicht nicht. Du kannst auf visuelle Komponenten nicht aus dem Thread heraus unsynchronisiert zugreifen. Da hilft es überhaupt nichts, wenn du das abschließende Repaint synchronisierst.
Xearox Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 260
Erhaltene Danke: 3



BeitragVerfasst: Di 17.02.15 11:58 
user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
Wie ich schon geschrieben habe. Das Problem ist der Thread. Das geht so schlicht nicht. Du kannst auf visuelle Komponenten nicht aus dem Thread heraus unsynchronisiert zugreifen. Da hilft es überhaupt nichts, wenn du das abschließende Repaint synchronisierst.


Ich habe deinen Rat befolgt und habe jetzt wenigstens eine Vernünftige Fehlermeldung erhalten, mit der man jetzt evtl. mehr Anfangen kann als vorher.

ausblenden Quelltext
1:
Erste Gelegenheit für Exception bei $76DBC42D. Exception-Klasse EOutOfResources mit Meldung 'Fehler beim Erstellen des Fenster-Gerätekontexts'. Prozess Project1.exe (11896)					


Das ganze sieht jetzt so aus:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
procedure TCreateTerrain.Ausgabe;
begin
  GameForm.MyMap.Repaint;
  CreateTerrain(MapWidth,MapHeight,65,gameform.MyMap,'image/gras64x64','png');
end;

procedure TCreateTerrain.Execute;
begin
  try
    Synchronize(Ausgabe);
  except
    on e: Exception do ShowMessage('Fehler aufgetreten');
  end;
  GameForm.Btn_StartGame.Enabled := true;
end;


Aber im Programm sieht es nun ziemlich hässlich aus :D Aber da ich nun die Fehlermeldung hab, also EOutOfResources, kann man mehr damit anfangen, denk ich mal.
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 18702
Erhaltene Danke: 1620

W10 x64 (Chrome, IE11)
Delphi 10.2 Ent, Oxygene, C# (VS 2015), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Di 17.02.15 12:09 
Tja, und damit sind wir doch an der Stelle angekommen:
user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
auch wenn du im Falle von Bitmaps intern sehr viele Handles belegst.
So viele Handles auf einen Gerätekontext kannst du dann schlicht nicht parallel benutzen.
Ich hatte ein ähnliches Problem auch schon einmal, da waren ca. 9000-10000 das Maximum.

Eine Grafikengine macht das ja nicht umsonst anders, nämlich mit der Grafikkarte, die dafür auch ausgelegt ist. Bzw. zumindest ohne Handles.
Xearox Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 260
Erhaltene Danke: 3



BeitragVerfasst: Di 17.02.15 12:27 
user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
Tja, und damit sind wir doch an der Stelle angekommen:
user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
auch wenn du im Falle von Bitmaps intern sehr viele Handles belegst.
So viele Handles auf einen Gerätekontext kannst du dann schlicht nicht parallel benutzen.
Ich hatte ein ähnliches Problem auch schon einmal, da waren ca. 9000-10000 das Maximum.

Eine Grafikengine macht das ja nicht umsonst anders, nämlich mit der Grafikkarte, die dafür auch ausgelegt ist. Bzw. zumindest ohne Handles.


Und dann nehme ich mal an, bin ich an dem Punkt angelangt, wo ich mir dann doch mal Andorra2D an schauen sollte, ja? :D Ich wollte nämlich "eigentlich" Engine Unabhängig bleiben und es so einfach wie möglich zu belassen. Also ohne jetzt irgendwelche Engines zu benutzten (für 3D Anwendungen nutze ich Unity3D - Da ich aber kein C# kann, bzw. mich noch nie mit auseinander gesetzt habe, bliebt es meistens nur bei Tutorial Videos von Hummelwalker).

Aber nochmal auf das Thema zurück zu kommen, könnte ich nicht einfach, bach jeder Reihe, welche fertig erstellt worden ist, also z.b. die ersten 128 TImages, diese als ganzen zusammenfassen und dann weiter mit der nächsten Reihe? Also wenn die innere Schleife fertig ist, diese dann zuerst einmal die Bilder zusammen legt und anschließend die Bilder im Array freigibt um anschließend die nächsten 128 TImages anzulegen.

Bsp:
ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
begin
  for Z = 0 to Zeilen -1 do
  begin
    for S = 0 to Spalten -1 do
    begin
      Erstell die Bilder hier
    end;
  Mach aus allen Bilder von S0 ein Bild und gib die Bilder aus S0 wieder frei und mach das bei allen weiteren Zeilen
  end;
end;


Ich habe mal bewusst den Delphi Tag weggelassen, da es ja nur ein Beispiel ist und kein richtiger Delphi Code
Nersgatt
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1562
Erhaltene Danke: 268


Delphi 10 Seattle Prof.
BeitragVerfasst: Di 17.02.15 12:35 
Beschreibe mal bitte etwas detaillierter, was Du überhaupt vor hast.

Warum legst Du so viele TImages an? Sollen die später alle einzeln irgendwelche Aufgaben haben oder auf Ereignisse reagieren?
Wenn Du z.B. wissen möchtest, in welches TImage geklickt wurde, dann könnte man das auch mit einem einzigen Control machen und die Mausposition ermitteln, um rauszufinden, in welches Feld der Benutzer geklickt hat.

Also wie gesagt, beschreib mal, was bei Deinem Spiel später passieren soll.

_________________
Gruß, Jens
Zuerst ignorieren sie dich, dann lachen sie über dich, dann bekämpfen sie dich und dann gewinnst du. (Mahatma Gandhi)
Xearox Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 260
Erhaltene Danke: 3



BeitragVerfasst: Di 17.02.15 12:54 
user profile iconNersgatt hat folgendes geschrieben Zum zitierten Posting springen:
Warum legst Du so viele TImages an?


Weil ich es nicht besser kann, da ich nicht weiß, wie man es anders machen kann. Damit will ich ein Spielfeld anlegen, derzeit besteht dieses nur aus Gras, später sollen dort aber auch andere Oberflächen hinzu kommen. Das mit der CreateTerrain ist eigentlich auch nur solange drin, bis ich mir einen MapEditor gebastelt hab. Denn dort will ich dann die Maps vorfertigen um dann einfach nur noch im Programm selber die MapDaten rein zu laden. Somit würde das mit Threads eigentlich auch wegfallen, da das rein laden sicherlich nicht mehr soviel Leistung frisst, wie es jetzt der Fall ist.

Außerdem dient das Array gleichzeitig als Raster, um später auf den Kästchen "Gebäude/Bildchen" platzieren zu können. Daher ein Array of Array of TImage, damit habe ich dann auch direkt die Positionen, wo die Bilder liegen.

user profile iconNersgatt hat folgendes geschrieben Zum zitierten Posting springen:
Sollen die später alle einzeln irgendwelche Aufgaben haben oder auf Ereignisse reagieren?


Ja, wie man bereits sehen kann, habe ich ein OnMouseDown/Move/Up Event eingefügt, damit ich dann entsprechend mich auf der "Karte" bewegen kann, was auch bereits funktioniert.

Außerdem soll man dort auch Einheiten oder ähnliches hin und her schicken können.

user profile iconNersgatt hat folgendes geschrieben Zum zitierten Posting springen:
Also wie gesagt, beschreib mal, was bei Deinem Spiel später passieren soll.


Zum Großteil hab ich das bereits oben geschrieben. Kurz gesagt, es soll ein Age of Empires für "Arme" sein :D Ohne viel Schnickschnack, da ich so, meiner Meinung nach, am Besten lernen kann und vorallem die Sachen, was ich so benutze, besser im Kopf behalten kann (programmieren ist nur ein Hobby, mehr nicht, habe es auch nicht in der Schule gelernt, sondern selbst beigebracht Hauptberuflich bin ich Bäcker :D ) Was auch noch hinzu kommen wird, wird eine Kommunikation von 2 Rechner System sein, also ein Multiplayer. Habe vor einigen Monaten Bereits ein TicTacToe programmiert, welches übers Netzwerk funktioniert. Also ich denke, das ich auch dort Grundkenntnisse habe, die ich halt hier mit diesem Programm erweitern möchte. Da hier mehr Daten übertragen werden müssen.

Ich hoffe, das Ihr nun versteht, was ich vor habe und mir ggf. jetzt bessere Tipps geben könnt.

p.s. Ich habe oben eine ZIP eingefügt, also in meinem ersten Beitrag, allerdings ohne SourceCode, da ich so nur zeigen möchte, wie bzw. was bisher funktioniert.
@jaenicke die Syncronisation hab ich für TImage wieder raus genommen, also es läuft wieder über den Thread ohne Sync, da ich, bis ich weiß was ich nun machen werde, auf 128x128 große Map verzichten werde.
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 18702
Erhaltene Danke: 1620

W10 x64 (Chrome, IE11)
Delphi 10.2 Ent, Oxygene, C# (VS 2015), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Di 17.02.15 13:10 
user profile iconXearox hat folgendes geschrieben Zum zitierten Posting springen:
Ich wollte nämlich "eigentlich" Engine Unabhängig bleiben und es so einfach wie möglich zu belassen.
Du widersprichst dir. Ohne Engine wird es deutlich komplizierter als mit sobald man ein wenig mehr im Spiel macht. ;-)
Natürlich muss man sich mit einer Engine erst beschäftigen, aber am Ende nimmt sie sehr viel Arbeit ab.

Gerade bei einem Spiel wie Age of Empires bietet es sich an mit einer einzigen großen Hintergrundbitmap zu arbeiten, die aus den Tiles nur bei Bedarf (beim Scrollen der Karte, ...) zusammengesetzt wird. Danach packt man dann die Einheiten auf eine weitere Ebene.

user profile iconXearox hat folgendes geschrieben Zum zitierten Posting springen:
@jaenicke die Syncronisation hab ich für TImage wieder raus genommen, also es läuft wieder über den Thread ohne Sync, da ich, bis ich weiß was ich nun machen werde, auf 128x128 große Map verzichten werde.
Dass es so zufällig erst einmal funktioniert, heißt aber nicht, dass das so bleibt. Es kann auch sein, dass du so an ganz anderen Stellen erst einmal unerklärliche Fehler bekommst.
Xearox Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 260
Erhaltene Danke: 3



BeitragVerfasst: Di 17.02.15 13:19 
user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
user profile iconXearox hat folgendes geschrieben Zum zitierten Posting springen:
Ich wollte nämlich "eigentlich" Engine Unabhängig bleiben und es so einfach wie möglich zu belassen.
Du widersprichst dir. Ohne Engine wird es deutlich komplizierter als mit sobald man ein wenig mehr im Spiel macht. ;-)
Natürlich muss man sich mit einer Engine erst beschäftigen, aber am Ende nimmt sie sehr viel Arbeit ab.


Lohnt es sich dann die Andorra2D Engine zu nutzen? Oder gibt es auch andere Engines, welche zu Delphi Kompatibel sind, denn wie ich im Forum von Andorra2D gelesen habe, wird die Engine nicht mehr weiter entwickelt.
WasWeißDennIch
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 653
Erhaltene Danke: 160



BeitragVerfasst: Di 17.02.15 14:59 
Google doch mal nach "Delphi game engine", da wirst Du einige finden, z.B. Irrlicht, nxpascal, Asphyre Sphinx 3 usw. usf.
Xearox Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 260
Erhaltene Danke: 3



BeitragVerfasst: Di 17.02.15 15:11 
user profile iconWasWeißDennIch hat folgendes geschrieben Zum zitierten Posting springen:
Google doch mal nach "Delphi game engine", da wirst Du einige finden, z.B. Irrlicht, nxpascal, Asphyre Sphinx 3 usw. usf.


Hab ich bereits ;-) Die Frage beziehte sich viel mehr auf Empfehlungen ;-)

Auf wiki.lazarus.freepascal.org/Game_Engine hab ich ne kleine Übersicht gefunden.