Aktuelle Zeit: 22.12.2024, 10:58

Alle Zeiten sind UTC + 1 Stunde




Ein neues Thema erstellen Auf das Thema antworten  [ 1 Beitrag ] 
Autor Nachricht
BeitragVerfasst: 28.03.2007, 09:41 
Offline
Newsposter
Benutzeravatar

Registriert: 12.03.2007, 10:42
Beiträge: 338
Wohnort: Berlin
Dieses Tutorial zeigt wie man 2D Grafik unter Irrlicht realisiert. Es zeigt wie man Bilder, keycolor basierte sprites, transparente rechtecke und unterschiedliche fonts Darstellt. Dies kann nützlich sein wenn man ein 2D Spiel oder ein Userinterface für sein 3D Spiel programmieren will.

Das ergebnis kann wie folgend aussehen:
Bild

Los geht's!

So wie bisher immer includieren wir die nötigen header und Bibliotheksdateien und benutzen den irr namespace.
Code:
#include <Irrlicht.h>
#include <iostream>

using namespace irr;

#pragma comment(lib, "Irrlicht.lib")

Wir lassen den benutzer einen Treiber auswählen, starten die Engine, legen den Fensternamen fest und holen uns einen pointer auf den video Treiber.
Code:
int main()
{
  // abfrage des zu benutzenden Treibers
  video::E_DRIVER_TYPE driverType;

  printf("Bitte waehlen sie den Treiber aus den sie fuer dieses Programm benutzen wollen:\n"\
      " (a) Direct3D 9.0c\n (b) Direct3D 8.1\n (c) OpenGL 1.5\n"\
      " (d) Software Renderer\n (e) Apfelbaum Software Renderer\n"\
      " (f) NullDevice\n (alles andere) exit\n\n");

  char i;
  std::cin >> i;

  switch(i)
  {

             case 'a': driverType = video::EDT_DIRECT3D9; break;
    case 'b': driverType = video::EDT_DIRECT3D8; break;
    case 'c': driverType = video::EDT_OPENGL;   break;
    case 'd': driverType = video::EDT_SOFTWARE;  break;
    case 'e': driverType = video::EDT_SOFTWARE2; break;
    case 'f': driverType = video::EDT_NULL;     break;
    default: return 0;
  }

  // erstelle device
         

    IrrlichtDevice *device = createDevice(driverType,
    core::dimension2d<s32>(512, 384));

  if (device == 0)
    return 1;

  device->setWindowCaption(L"Irrlicht Engine - 2D Grafik Demo");

  video::IVideoDriver* driver = device->getVideoDriver();

Alle 2D Grafiken in diesem Beispiel sind in einer einzigen Bilddatei enthalten, diese nennt sich 2ddemo.bmp. Da wir colorkey basierte sprites zeichnen wollen, müssen wir der engine sagen welcher teil dieser Bilddatei der tranzparents basierte colorkey sein soll. In diesem Beispiel sagen wir der Engine nicht direkt welche Farbe der ColorKey sein soll sondern wir sagen ihr das Die Farbe an position 0,0 in unserer Textur der Colorkey sein soll. Wenn man aber lieber einen ColorKey basierend auf einer ganz bestimmten farbe haben möchte kann man driver->makeColorKeyTexture(images,video::SColor(0,0,0,0)); benutzen (hier ist der ColorKey für die Farbe schwarz gesetzt worden).
Code:
video::ITexture* images = driver->getTexture("2ddemo.bmp");
driver->makeColorKeyTexture(images, core::position2d<s32>(0,0));

Um die möglichkeit nutzen zu können mit zwei unterschiedlichen Schriftarten ein wenig Text zeichnen zu können laden wir die nötigen Fonts. Naja eigentlich laden wir blos einen denn der andere ist bereits bereits bei Irrlicht mit integriert. Ebenfals definieren wir noch zwei Rechtecke, welche die Position der Textur für zwei Rote Imps enthalten.
Code:
gui::IGUIFont* font = device->getGUIEnvironment()->getBuilInFont();
gui::IGUIFont* font2 = device->getGUIEnvironment()->getFont("fonthaettenschweiler.bmp");

core::rect<s32> imp1(349,15,385,78);
core::rect<s32> imp2(387,15,423,78);

So nun haben wir alles nötige jetzt müssen wir nurnoch alles zwischen dem beginScene und endScene aufruf Zeichnen. In diesem Beispiel benutzen wir nur 2D Grafik aber es ist durchaus möglich 2D und 3D zu mischen, Probiert es einfach aus und ladet noch ein 3D Model wenn ihr dieses Beipiel verstanden habt.
Code:
while(device->run() && driver)
{
  if (device->isWindowActive())
  {
    u32 time = device->getTimer()->getTime();
    driver->beginScene(true, true, video::SColor(0,120,102,136));

So und nun zeichnen wir die drei Sprites, für die wir den alpha channel mit mit hilfe von makeColorKeyTexture erstellt haben.
Code:
// zeichne fire & dragons Hintergrund (Welt)
driver->draw2DImage(images, core::position2d<s32>(50,50),
    core::rect<s32>(0,0,342,224),0,
    video::SColor(255,255,255,255),true);

// zeichne fliegenden Imp
driver->draw2DImage(images,core::position2d<s32>(164,125),
    (time/500 % 2)? imp1 : imp2,0,
    video::SColor(255,255,255,255),true);

// zeichne zweiten imp mit Farbwechsel
driver->draw2DImage(images,core::position2d<s32>(270,105),
    (time/500 % 2) ? imp1 : imp2,0,
    video::SColor(255,(time) % 255,255,255),true);

Es ist wirklich einfach den Text auszugeben. Der Code sollte fast selbsterklärend sein.
Code:
// Zeichne ein wenig Text
if (font)
  font->draw(L"Dies ist ein Text.",
    core::rect<s32>(130,10,300,50),
    video::SColor(255,255,255,255));

// Zeichne einen anderen Text
if (font2)
  font2->draw(L"Dies ist ein weiterer Text.",
    core::rect<s32>(130,20,300,60),
    video::SColor(255,time %255,time % 255,255));

Als letztes zeichnen wir das Irrlicht Engine Logo(ohne ColorKey oder alpha channel) und ein transparentes rechteck an der Position des Mauscursors
Code:
  // zeichne das Logo
  driver->draw2DImage(images, core::position2d<s32>(10,10),core::rect<s32>(354,87,442,118));

  // zeichne das transparente rechteck an mausposition
  core::position<s32> m = device->getCursorControl()->getPosition();
  driver->draw2DRectangle(video::SColor(100,255,255,255),
    core::rect<s32>(m.X-20,m.Y-20,m.X+20,m.Y+20));

  driver->endScene();
}
}

So und das wars ich hoffe es war nicht zu schwer.
Code:
  device->drop();
  return 0;
}


Und wie beim letztem mal, schreibt mir ne PM fals ihr Fehler findet :wink:


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

Alle Zeiten sind UTC + 1 Stunde


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast


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:  
cron
Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de