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
    usw

    mein 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:Draw

    bis bald
    akari



  • ich glaube der ersten?

    was verstehst du unter windows ressorcen
    wo ist da der unterschied

    guten 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 programm

    ganz oben steht die klassen anordnung

    guten leitwert flo



  • super danke
    das ausgeben fkt jetzt, jetzt kommt das integrieren in das programm

    ganz 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 bevorzugen

    mfg flo



  • Hallo

    Du must anstelle der Methode Draw die Methode StretchDraw verwenden, und den Zoom-Faktor mit berechnen.

    bis bald
    akari


Log in to reply