wxWidgets LevelEditor basteln

Dark Ranger

Erfahrenes Mitglied
Hi

Ich habe mal eine Frage!
Beschäftige mich gerade mit wxWidgets und wollte mir einen kleinen Level editor basteln!
Die Levels bestehen aus TxT-Dateien, diese einzulesen und abzuspeichern ist kein Problem, das habe ich schon.

Das Problem ist nun, dass jedes Zeichen in der Txt Datei eine bestimmte grafik hat und ich nun diese Grafien anzeigen lassen will.

Ich habe allerdings keine Ahnung wie ich das anstellen soll, dass er mir auf die wxWidget Oberfläche etwa ein Bild legt, wobei ich ja viele Bilder nebeneinander benötige, gibt es da irgendwas? Kennt sich damit überhaupt wer aus?

Vielen Dank
 
Hi,
ich bin recht fit in wxWidgets, außer Grafik. :-(
Aber wie immer finde ich gute Ansätze im wxWidgets Manual.
Ich stoße da z.B. auf die Klasse wxBitmap, insbesondere wxBitmap::LoadFile(const wxString& name, wxBitmapType type).

type ist eins aus
wxBITMAP_TYPE_BMP Load a Windows bitmap file.
wxBITMAP_TYPE_BMP_RESOURCE Load a Windows bitmap resource from the executable.
wxBITMAP_TYPE_PICT_RESOURCE Load a PICT image resource from the executable. Mac OS only.
wxBITMAP_TYPE_GIF Load a GIF bitmap file.
wxBITMAP_TYPE_XBM Load an X bitmap file.
wxBITMAP_TYPE_XPM Load an XPM bitmap file.

Du müsstest zunächst deine Textdatei in ein entsprechendes Format wandeln.
Wie gesagt, ich bin darin kein Experte. Vielleicht führt der Tipp aber in die richtige Richtung.
 
Hi,

ich beschäftige mich zur Zeit mit dem Bau einer "SkinEngine" von wxWidgets und habe daher etwas, was dir vielleicht weiter hilft.

Zunächst erstellst du (z.Bsp. in der OnInit-Funktion) einen ImageHandler mit:
wxImage::AddHandler(new wxPNGHandler);
Mit diesem kannst du nun PNG-Bilder in wxWidgets laden.
Dann ist es (meiner Meinung nach) am einfachsten, wenn du eine neue Klasse erstellst, welche die Eigenschaften von wxPanel erbt. Mit Konstruktor usw. sieht das dann so aus:
Code:
class Picture: public wxPanel
{
    public:
        Picture(wxWindow* parent, const wxWindowID &id, const wxPoint &pos, const wxSize &size, const long &style, const wxString &name, wxString image);
    void OnPaint(wxPaintEvent& evt);
    private:
        wxBitmap t_bmp;
        DECLARE_EVENT_TABLE()
};
Als nächstes erstellst du den Konstruktor zu dieser Klasse.
Code:
Picture::Picture(wxWindow* parent,const wxWindowID &id, const wxPoint &pos, const wxSize &size, const long &style, const wxString &name, wxString image)
: wxPanel(parent, id, pos, size, style, name)
{
   t_bmp = wxBitmap(wxImage(image, wxBITMAP_TYPE_PNG));
}
Jetzt musst du noch die OnPaint-Funktion schreiben.
Code:
void Picture::OnPaint(wxPaintEvent& evt)
{
    wxPaintDC dc(this);
    dc.DrawBitmap(t_bmp, 0, 0, true);
}
Jetzt darf die EventTable nur nicht fehlen.
Code:
BEGIN_EVENT_TABLE ( Picture, wxPanel )
    EVT_PAINT(Picture::OnPaint)
END_EVENT_TABLE()
Wenn du dann ein Bild einfügen willst, geht das schnell und einfach mit einer Zeile Code.
Code:
Picture *MeinFoto = new Picture(this, -1, wxPoint(100,100), wxSize(25,25), 0, _T(""), _T("foto.png"));

Jetzt in Verbindung mit deinem Level Editor.
Übergebe einfach im Konstruktor von Picture keinen String, sondern eine char-Variable. Im Konstruktor würde dann mit einer if-Frage geprüft werden, ob es sich bei der char-Variable um ein A handelt. Sollte dies so sein, so wird ein String mit Pfad zum Bild (welches bei A erscheinen soll) gefüllt. Solltest du mehrere Zeichen haben, dann solltest du das mit switch-case machen.
Der neue Konstruktor müsste so aussehen:
Picture::Picture(wxWindow* parent,const wxWindowID &id, const wxPoint &pos, const wxSize &size, const long &style, const wxString &name, char zeichen)
: wxPanel(parent, id, pos, size, style, name)
{
wxString image;
if(zeichen=='A')
{
image="bilder/bild01.png";
}
t_bmp = wxBitmap(wxImage(image, wxBITMAP_TYPE_PNG));
}
 
Zuletzt bearbeitet:
Zurück