karte erzeugen
-
hallo
ich benutze borland c++ builder 5 und winxp
das problem das ich momentan habe ist das ich eine karte wie in civilization erzeugen will
das grundgerüst sieht so aus
vater
klasse tterain wo die ressorcen als bool variablen einzeln abgefragt werden und mit den fkt, den ressorcen ihre eigenschaften gegeben werden.kind von tterain
tberg eigenschaften von berg
tgrass mit eigenschaften von weideland
uswmein problem ist jetzt, wie erstelle ich eine grafische oberfläche
also wie kann ich das berg bild laden und in die karte integrieren.
soll ich für jede grafik ein imagefeld bild nehmmen, also bei einer karte von 100 mal 100 felder 10000 imagefelder? das scheint mir etwas zu kompliziert habt ihr eine andere lösung?
ist es überhaubt sinvoll wie ich das mache?ich habe auch schon dran gedacht, eine ganze karte in paint oder photoshop zusammenzusetzen, aber das wäre dann ja nicht dynamisch.
wenn ich dann zb eine andere karte laden würde dann müsste ich erstmal wieder zuweisen was ein berg ist...guten leitwert flo
-
Hallo
da ja die einzelnen Kartenteile jeweils die gleiche Größe haben werden, würde ich lieber eine TImageList anstatt Windows-Ressourcen nehmen. Dann reicht ein einfacher Draw-Aufruf, um ein bestimmtes Teil aus der Liste auf ein Canvas zu zeichnen.
Willst du trotzdem Ressourcen (weil du sie unabhängige DLLs auslagern willst), dann würde ich bei Start des Programms alle wichtigen Bitmaps in ein dynamisches Array (std::vector<TBitmap> zum Beispiel)* laden, um zum Zeichnen einen schnelleren Zugriff zu haben.
bis bald
akari
-
hallo
danke für die antwort
wie kann ich dann die bilder die ich in den editor hinzugefügt habe ausgeben?
guten leitwert flo
-
Hallo
mit welcher von mir angesprochenen Art?
Bei TImageList siehe die Methode TImageList:Drawbis bald
akari
-
ich glaube der ersten?
was verstehst du unter windows ressorcen
wo ist da der unterschiedguten leitwert flo
-
Hallo
Windows-Ressourcen sind standardisierte Bestandteile von Windows-Executablen, wie Bitmaps, Icons, Sprachtabellen usw.
Mit dem Borland Bildeditor kannst du solche Resourcendateien anlegen und dann im Projekt einbinden.Allerdings sind im Builder grad für Bitmaps mit TImageList einfachere Alternativen vorhanden.
bis bald
akari
-
hallo
das ist mir jetzt etwas peinlich, hab auch seit fast ein jahr nicht mehr programmiert, wie genau benutze ich die imagelist
also in der hilfe steht unter draw:
void __fastcall Draw(Graphics::TCanvas* Canvas, int X, int Y, int Index, bool Enabled);int X, int Y, int Index, bool Enabled); das ist ja klar steht ja alles in der hilfe
void __fastcall Draw(Graphics::TCanvas* Canvas
also ich weiß noch das man canvas braucht um zb einen kreis zu zeichnen
erklärt mir das bitte nochmal
brauche ich dafür eine paintbox um die bilder auszugeben oder imagefeld?und ist es sinvoll wie ich die klassen angeordnet habe?
guten leitwert flo
-
Hallo
brauche ich dafür eine paintbox um die bilder auszugeben oder imagefeld?
Du willst doch die Bitmaps irgendwo darstellen, oder? Das kann ja das Form selber sein, aber auch ein TImage. Wichtig ist das diese Ziele die Eigenschaft Canvas haben, so das du schreiben kannst
ImageList->Draw(Image->Canvas, ...);
und ist es sinvoll wie ich die klassen angeordnet habe?
Keine Ahnung. Ich sehe keine von dir hier gepostete Klassenanordnung.
bis bald
akari
-
super danke
das ausgeben fkt jetzt, jetzt kommt das integrieren in das programmganz oben steht die klassen anordnung
guten leitwert flo
-
super danke
das ausgeben fkt jetzt, jetzt kommt das integrieren in das programmganz oben steht die klassen anordnung
pate kann gelöscht werden
guten leitwert flo
-
Hallo
Die paar Worte klingen ja schon nicht falsch, aber mehr läßt sich mangels Details nicht dazu sagen.
bis bald
akari
-
hallo
danke für deine hilfe, ist leichter als ich gedacht habe, hab malwieder zu kompliziert gedacht.
hab noch eine frage
ist es möglich die grafische oberfläche zu verändern, um es ein spieltypisches design zu geben?
wie würde man sowas in der suche nennen?guten leitwert flo
-
Hallo
sicher ist das möglich, nur must du dann eben alles selber zeichnen.
Stichwort ist Canvas.bis bald
akari
-
hab da wieder eine etwas peinliche frage
um die karte zwischen zuspeichern benutze ich ein array, ich benutze ein dreidimensionales array, zweidimensionen für die position und die dritte für das terrain also ob berg oder weideland... und was für ressorcen auf dem feld ist.
meine frage ist jetzt, wie kann ich die größe des array variable machen,
konstruktor(x,y)
{
array[x][y];
}ist das überhaubt möglich
und macht ein array hier überhaubt sin, oder gibs noch bessere metoden?nochmals danke
guten leitwert flo
-
Hallo
du kannst das Array dynamisch machen, in dem du entweder selber den Speicher dafür reservierst und dann auch wieder freigibst (new und delete), oder indem du zum Beispiel std::vector verwendest.
Zu beiden varianten findest du im C++ Forum genug Threads.bis bald
akari
-
akari schrieb:
Du willst doch die Bitmaps irgendwo darstellen, oder? Das kann ja das Form selber sein, aber auch ein TImage. Wichtig ist das diese Ziele die Eigenschaft Canvas haben, so das du schreiben kannst
ImageList->Draw(Image->Canvas, ...);
eins verstehe ich nicht:
wenn ich des so mache wie oben beschrieben wieso kann ich dann nicht wenn ich
des ganze bild vollgemalt hab irgendwelche stellen überschreiben,
sondern muss vorher immer des gesamte bild löschen??Edit: ich muss nicht mal des bild vollgemalt haben, sobald ich aufhöre zu malen,
und wieder anfangen möchte funktioniert das malen nicht mehr!!oder hab ich da was falsch verstanden??
Gruß KY
-
Hallo
du kannst dir das Zeichnen wie in einem einfachen Bitmap-Zeichenprogramm vorstellen. Du kannst immer nur überzeichnen, aber nichts mehr wieder wegnehmen. Also kein UNDO. Deshalb ist es meistens besser, für Bewegungen das gesamte Bild neu zu berechnen.
und wieder anfangen möchte funktioniert das malen nicht mehr!!
Weiß nicht was du meinst. Weder sehe ich was du du für Code ausführst, noch was du mit "funktioniert nicht" meinst.
bis bald
akari
-
also ich hatte gemeint, dass wenn ich folgendermasen zeichen:
for(int x=0;x<14;x++) { for(int y=0;y<9;y++) { Karte->Draw(Back->Canvas,x*32,y*32,map[x][y],true); } }
Karte ist meine TImageList, wo die Landschaften drin sind.
Back ist ein TImage wo die Karte drauf gezeichent wird.
map[][] ist ein int-Array wo meine Landschaftstyp gespeichert ist.
Jedes Landschaftsstück ist 32*32 pxl groß.Jetzt muss ich aber jedesmal wenn ich die Karte neuzeichnen möchte:
Back->Picture=0;
und dann kann ich die Fkt von oben anwenden.
Wenn ich des nicht mache, ändert sich rein gar nichts!!Ich bin grad an einer realisierung mit einem TBitmap,
da funktioniert des wunderbar
-
hallo
hab noch eine frage, hab eine wunderbare karte erzeugt, dank euch
nun möchte ich da noch gerne eine zoomfkt einbauen, gibs da auch irgendwelche tricks?
mir würde jetzt einfallen, nochmal alle kartenteile in eine neue imageliste laden, die dann aber kleiner ist... aber da das jetzt schon ziemlich langsam ist, würde ich eine andere methode bevorzugenmfg flo
-
Hallo
Du must anstelle der Methode Draw die Methode StretchDraw verwenden, und den Zoom-Faktor mit berechnen.
bis bald
akari