Aktuelle Zeit: 12.05.2025, 18:43

Alle Zeiten sind UTC + 1 Stunde




Ein neues Thema erstellen Auf das Thema antworten  [ 5 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Variablenwert im GUI ausgeben [C++]
BeitragVerfasst: 04.10.2009, 11:39 
Offline

Registriert: 27.09.2009, 15:35
Beiträge: 1
Erstmal hallo und cool dass es eine solche Community gibt! 8)

Habe vor einiger Zeit angefangen C++ zu lernen, bin aber noch nicht wirklich sehr erfahren und eher unsicher auf dem Gebiet. Vor allem wenn es darum geht, gelernte Sachen in Projekten einzusetzen, die anders aufgebaut sind, dauert es oft länger bis ich auf die richtige Lösung komme. Aber so lernt man auch :)
Kenne ich von PHP, da war's anfänglich auch so und heute sprudelt mir der Quellcode nur so aus dem Handgelenk. :o
Seit kurzem habe ich mich auch an Irrlicht mit C++ gewagt und erstaunlicherweise auf diese Art viele Verständnislücken im Bereich OOP geschlossen - wobei ich immer noch Anfänger bin...

Soweit zu meinen Fähigkeiten :?

Nun zu meinem Problem:

Einen statischen Text mittels addStaticText im GUI auszugeben ist ja nun nicht sonderlich schwer gewesen. Was ich allerdings bisher nicht geschafft habe und auch nicht (in den Tutorials oder sonst wo) gefunden habe ist, wie ich den Wert einer Variable im GUI ausgeben kann. Egal nun ob int, float oder sonstige Genossen - irgendwie muss es ja gehen und scheinbar bin ich der einzige, der damit ein Problem hat. Mit addStaticText wird das wohl nicht möglich sein, weil ja schon der Name sagt - das ist ein STATISCHER Text. Also wie?


Konkretes Beispiel:

Code:
#include <irrlicht.h>
#include <iostream>

using namespace irr;
using namespace core;
using namespace video;
using namespace io;
using namespace gui;
using namespace scene;
using namespace std;

int main()
{
    // Device
    IrrlichtDevice *irrDevice = createDevice(video::EDT_OPENGL, dimension2d<u32>(640, 480), 16, false, false, false, 0);

    // Pointer
    IVideoDriver *irrDriver = irrDevice->getVideoDriver();
    ISceneManager *irrSceneMgr = irrDevice->getSceneManager();
    IGUIEnvironment *irrGUIEnv = irrDevice->getGUIEnvironment();
    IFileSystem *irrFileSys = irrDevice->getFileSystem();

    // WindowCaption
    irrDevice->setWindowCaption(L"TEST");

    // draw
    while(irrDevice->run() && irrDriver)
    {
        // Timer
        u32 RTimeMs = irrDevice->getTimer()->getRealTime();
        u32 RTime = RTimeMs/10;
        cout << RTime << endl;
        IGUIStaticText *SText = irrGUIEnv->addStaticText(L"Anstatt diesem Text möchte ich hier den Wert der Variable RTime ausgeben", core::rect<s32>(10,10,200,20), false, false, 0,-1,false);
        irrDriver->beginScene(true, true, SColor(255,255,255,0), 0, 0);
        irrSceneMgr->drawAll();
        irrGUIEnv->drawAll();
        irrDriver->endScene();
    }

    // delete device
    irrDevice->drop();
    return 0;
}


cout ist hier deshalb drinnen, weil ich sehen wollte ob RTime den Wert hat, den es haben sollte...

Wäre für eine entsprechende Korrektur des Listings sehr dankbar :)


Nach oben
 Profil  
 
BeitragVerfasst: 04.10.2009, 12:11 
Offline

Registriert: 17.11.2007, 11:15
Beiträge: 19
1. ist es relativ unklug, ein GUI-Element in der Hauptschleife immer wieder zu erzeugen.
2. Google -> "swprintf" oder "wstringstream"


Nach oben
 Profil  
 
BeitragVerfasst: 13.10.2009, 20:45 
Offline
Benutzeravatar

Registriert: 07.08.2008, 11:31
Beiträge: 104
Dafür gibt es die stringstreams aus der Standardbibleothek beispielsweise.


Nach oben
 Profil  
 
BeitragVerfasst: 13.10.2009, 22:43 
Offline

Registriert: 15.06.2007, 13:42
Beiträge: 12
Also wie schon erwähnt solltest du dein GUI Element nicht bei jedem Schleifendurchlauf neu erstellen.
Des weiteren erbt jedes GUI Element von irrGUIElement die Funktion setText( const wchar_t* text). Welche du einfach aufrufen kannst. Ich hab das mal in dein Programm eingebaut, damit ist es vllt leichter zu verstehen.
Ich hoffe nur du nutzt Windows sonst müsstest du das Linux pandant zu wsprintf+header suchen. Da bin ich aber grade zu faul zu.
Code:
#include <irrlicht.h>
#include <iostream>
#include <string>

// Nötig für wsprintf
#include <Windows.h>

using namespace irr;
using namespace core;
using namespace video;
using namespace io;
using namespace gui;
using namespace scene;

u32 RTimeMs, RTime;
wchar_t *text = new wchar_t();

int main()
{
    // Device
    IrrlichtDevice *irrDevice = createDevice(video::EDT_OPENGL, dimension2d<u32>(640, 480), 16, false, false, false, 0);

    // Pointer
    IVideoDriver *irrDriver = irrDevice->getVideoDriver();
    ISceneManager *irrSceneMgr = irrDevice->getSceneManager();
    IGUIEnvironment *irrGUIEnv = irrDevice->getGUIEnvironment();
    IFileSystem *irrFileSys = irrDevice->getFileSystem();

    // WindowCaption
    irrDevice->setWindowCaption(L"TEST");
    IGUIStaticText *SText = irrGUIEnv->addStaticText(L"Anstatt diesem Text möchte ich hier den Wert der Variable RTime ausgeben", core::rect<s32>(10,10,200,20), false, false, 0,-1,false);
    // draw
   while(irrDevice->run() && irrDriver)
    {
        // Timer
        RTimeMs = irrDevice->getTimer()->getRealTime();
        RTime = RTimeMs/10;
        //Umwandeln der Integers in ein wchar
      wsprintf( text, L"%i", RTime);
      //Setzen des Textes
      SText->setText( text );
        irrDriver->beginScene(true, true, SColor(255,255,255,0), 0, 0);
            irrSceneMgr->drawAll();
            irrGUIEnv->drawAll();
        irrDriver->endScene();
    }

    // delete device
    irrDevice->drop();
    return 0;
}


Edit:

Ich hab grade mal in der Doku gesehen, das man wsprintf gar nicht braucht. Irrlicht stellt im Namespace core die Klasse stringw zur Verfügung für diese Klasse sind auch die +/+= Operatoren überladen. Also schau dir mal die Klasse an


Nach oben
 Profil  
 
BeitragVerfasst: 16.10.2009, 22:54 
Offline
Newsposter
Benutzeravatar

Registriert: 12.03.2007, 10:42
Beiträge: 338
Wohnort: Berlin
nur mal so als kleiner einwurf nebenher:

auch einen static text element kann man innerhalb des programmes ändern, mach ich bei VB ständig und hab ich auch bei delphi damals immer wieder gemacht, der hintergrund eines static text elements ist lediglich, das dieser nicht vom benutzer per direkter eingabe verändert werden kann, denn dies wäre dann eine textbox.

du solltest also mit folgender funktion den Text eines static Text verändern können:
Code:
setText   (   const wchar_t *    text    )


Nach oben
 Profil  
 
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 5 Beiträge ] 

Alle Zeiten sind UTC + 1 Stunde


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 8 Gäste


Du darfst keine neuen Themen in diesem Forum erstellen.
Du darfst keine Antworten zu Themen in diesem Forum erstellen.
Du darfst deine Beiträge in diesem Forum nicht ändern.
Du darfst deine Beiträge in diesem Forum nicht löschen.
Du darfst keine Dateianhänge in diesem Forum erstellen.

Suche nach:
Gehe zu:  
Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de