Tutorial Für Irrlicht

  • Wie findet ihr dieses Tutorial 26

    1. Verständlich erklärt (15) 58%
    2. Sehr gut (7) 27%
    3. Einfach Mies (3) 12%
    4. Zu Langweilig (1) 4%

    [Blockierte Grafik: http://www.irrlicht3d.org/images/irrlicht_new_logo.png] _ _ _ _ _ _ _ _ _


    Hallo zum ersten Irrlicht Tutorial in Deutsch, welches zugleich mein erstes Tutorial ist.
    In diesem Tutotial zeige ich euch wie ihr Irrlicht in AutoIt verwenden könnt.
    Zu beginn werde ich euch das Wichtigste über die 2D-Welt von Irrlicht erklären.
    Dann zeige ich euch wie man eine Map sowie einen Charakter in eine Scene hinzufügt,
    und welche tollen Features Irrlicht hat, aber liest einfach selbst:

    Was ihr dazu bracht:

    • Grundlegende Autoitkenntnisse
    • Die Irrlicht-engine
    • Autoit selbst :P

    Ich verwende die 2.0.4 Version

    Fangen wir mal ganz von vorne an:
    So gut wie jedes engine muss gestartet und beendet werden, das macht ihr mit:

    [autoit]

    _Irrstart()
    _Irrstop()

    [/autoit]


    Doch so einfach ist es nicht, denn mit _IrrStart() müsst ihr gleich ein Fenster einstellen.

    [autoit]

    _IrrStart( $IRR_EDT_OPENGL, 400, 200, $IRR_BITS_PER_PIXEL_32, _
    $IRR_WINDOWED, $IRR_NO_SHADOWS, $IRR_IGNORE_EVENTS, _
    $IRR_VERTICAL_SYNC_ON )

    [/autoit]
    "Parameter"

    Wird mit Irrlicht über OpenGL gerendert
    X und Y Größe
    Die Anzahl verschiedener Farben
    Ein Fenster wird erzeugt
    Keine Schatten werden berechnet
    die Tastatur und Mausevents werden ignoriert
    Die vertikale Synchro bestimmt afaik nur, dass die FPS an die Hz vom Bildschirm angepoasst werden, ab später mehr dazu

    Zusätzlich müssen wir natürlich auch erst die Irrlicht-au3 includieren.
    Wenn man dann ein Fenster erzeugen, sieht der Quellcode dann folgendermaßen aus:

    "Irrlicht starten"
    [autoit]

    #include "../au3Irrlicht2.au3"

    [/autoit] [autoit][/autoit] [autoit]

    opt("MustDeclareVars", True)
    HotKeySet("{ESC}", "_exit")

    [/autoit] [autoit][/autoit] [autoit]

    _IrrStart( $IRR_EDT_OPENGL, 400, 200, $IRR_BITS_PER_PIXEL_32, _
    $IRR_WINDOWED, $IRR_NO_SHADOWS, $IRR_IGNORE_EVENTS, _
    $IRR_VERTICAL_SYNC_ON )

    [/autoit] [autoit][/autoit] [autoit]

    Func _exit()
    _IrrStop()
    Exit
    EndFunc ; _exit

    [/autoit]


    Jetzt wird unser Fenster geöffnet und gleich wieder geschlossen. Außerdem fällt uns auf, dass wir noch keinen Titel bestimmt haben. Und das machen wir mit diesem Befehl:

    [autoit]

    _IrrSetWindowCaption( "Irrlicht Tutorial" )

    [/autoit]


    Dann fügen wir noch eine Endlos-While hinzu und wir haben unser Fenster:

    "Fenster mit Titel"
    [autoit]

    #include "../au3Irrlicht2.au3"

    [/autoit] [autoit][/autoit] [autoit]

    opt("MustDeclareVars", True)
    HotKeySet("{ESC}", "_exit")

    [/autoit] [autoit][/autoit] [autoit]

    _IrrStart( $IRR_EDT_OPENGL, 400, 200, $IRR_BITS_PER_PIXEL_32, _
    $IRR_WINDOWED, $IRR_NO_SHADOWS, $IRR_IGNORE_EVENTS, _
    $IRR_VERTICAL_SYNC_ON )

    [/autoit] [autoit][/autoit] [autoit]

    _IrrSetWindowCaption( "Irrlicht Tutorial" )

    [/autoit] [autoit][/autoit] [autoit]

    WHILE 1
    Sleep(100)
    WEND

    [/autoit] [autoit][/autoit] [autoit]

    Func _exit()
    _IrrStop()
    Exit
    EndFunc ; _exit

    [/autoit]


    Das Tolle ist, dass Irrlicht das Fenster auch gleich nach dem betätigen des X-Buttons oder nach dem drücken der ESC-Taste das Fenster schließt.

    Als nächstes wollen wir einen Text anzeigen lassen. Diesen Text müssen wir zuerst einmal add’n. Dazu lernen wir eine neue Funktion kennen:

    [autoit]

    _IrrAddStaticText()

    [/autoit]


    Dabei wird ein Rechteck definiert welches einen Text enthält.
    Die Parameter:
    Zuerst der Text
    X und Y Koordinaten des Anfangspunktes des Rechtecks (links-oben)
    X und Y Koordinaten des Endpunktes des Rechtecks (rechts-unten)
    Ob ein Rahmen gezeichnet wird
    Ob der Text gewickelt wird

    Wenn wir jetzt versuchen den Text anzuzeigen:

    "Versuch: Text anzeigen"
    [autoit]

    #include "../au3Irrlicht2.au3"

    [/autoit] [autoit][/autoit] [autoit]

    opt("MustDeclareVars", True)
    HotKeySet("{ESC}", "_exit")

    [/autoit] [autoit][/autoit] [autoit]

    _IrrStart( $IRR_EDT_OPENGL, 400, 200, $IRR_BITS_PER_PIXEL_32, _
    $IRR_WINDOWED, $IRR_NO_SHADOWS, $IRR_IGNORE_EVENTS, _
    $IRR_VERTICAL_SYNC_ON )

    [/autoit] [autoit][/autoit] [autoit]

    _IrrSetWindowCaption( "Irrlicht Tutorial" )

    [/autoit] [autoit][/autoit] [autoit]

    _IrrAddStaticText( "Wir lernen Irrlicht!", 20, 20, 200, 50, $IRR_GUI_NO_BORDER, $IRR_GUI_NO_WRAP)

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    WHILE 1
    Sleep(100)
    WEND

    [/autoit] [autoit][/autoit] [autoit]

    Func _exit()
    _IrrStop()
    Exit
    EndFunc ; _exit

    [/autoit]


    Sehen wir, dass der Text nicht „gezeichnet“ wird. Dazu brauchen wir weitere Funktionen:

    [autoit]

    ; startet die Scene, Löschen der Leinwand (weiß) vor dem Rendern
    _IrrBeginScene( 255,255,255 )

    [/autoit][autoit][/autoit][autoit]

    ; zeichnet die GUI (Graphical User Interface)
    _IrrDrawGUI()

    [/autoit][autoit][/autoit][autoit]

    ; beendet das zeichnen der Scene und rendert sie
    _IrrEndScene()

    [/autoit]


    Bei _IrrBeginScene() werden noch die Farbintensitäten eingegeben (R,G,B)
    Diese Befehle werden jetzt in die While hineingeschrieben. Dazu löschen wir das Sleep() und fügen das in den Quellcode ein,außerdem wollen wir einen grün-farbenen Hintergrund:

    "Text und grüner Hintergrund"
    [autoit]

    #include "../au3Irrlicht2.au3"

    [/autoit] [autoit][/autoit] [autoit]

    opt("MustDeclareVars", True)
    HotKeySet("{ESC}", "_exit")

    [/autoit] [autoit][/autoit] [autoit]

    _IrrStart( $IRR_EDT_OPENGL, 400, 200, $IRR_BITS_PER_PIXEL_32, _
    $IRR_WINDOWED, $IRR_NO_SHADOWS, $IRR_IGNORE_EVENTS, _
    $IRR_VERTICAL_SYNC_ON )

    [/autoit] [autoit][/autoit] [autoit]

    _IrrSetWindowCaption( "Irrlicht Tutorial" )

    [/autoit] [autoit][/autoit] [autoit]

    _IrrAddStaticText( "Wir lernen Irrlicht!", 20, 20, 200, 50, $IRR_GUI_NO_BORDER, $IRR_GUI_NO_WRAP)

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    WHILE 1
    _IrrBeginScene( 0,255,0 )

    [/autoit] [autoit][/autoit] [autoit]

    _IrrDrawGUI()

    [/autoit] [autoit][/autoit] [autoit]

    _IrrEndScene()
    WEND

    [/autoit] [autoit][/autoit] [autoit]

    Func _exit()
    _IrrStop()
    Exit
    EndFunc ; _exit

    [/autoit]


    Damit wir nicht immer eine Endlosschleife haben lernen wir noch eine Weitere Funktion kennen:

    [autoit]

    _IrrRunning()

    [/autoit]


    Damit ersetzten wir den 1er bei while, sprich "solange die Scene läuft"!

    Nachdem wir nun den Text kaum lesen können weil er so klein ist lernen wir nun eine Funktion mit der wir eigene Schriftarten einfügen können kennen. Dazu müssen wir eine Schriftart zuerst wieder "add'n". Ich verwende für dieses Tutorrial eigentlich nur Datein, die bei der Irrlicht UDF schon enthalten sind:

    [autoit]

    $BitmapFont = _IrrGetFont ( "../media/bitmapfont.bmp" )

    [/autoit]


    Wie man sieht wird der Pfad als Parameter eingegeben. So können wir aus einer Bitmap eine Schriftart hinzufügen,welche wir dann auch gleich in eine Variable speichern.
    Doch nur "herrufen" bringt uns nichts. Wir müssen sie auch zeichnen:

    [autoit]

    _Irr2DFontDraw ( $BitmapFont, "UNSERE EIGENE SCHRIFTART", 120, 80, 250, 96 )

    [/autoit]


    Diese ersetzt jetz in userem Quellcode das _IrrDrawGui(). Damit müssen wir auch keinen Text mehr hinzufügen. Wie beim Text wird ein Rechteck gezeichnet.
    Parameter:
    Der Rückgabewert von der Schriftart
    "Der Text"
    X und Y vom Rechteck, jeweils links-oben und rechts-unten.

    Wenn wir das jetzt in unseren Quellcode einfügen, sieht das ganze so aus:

    "Schriftart"
    [autoit]

    #include "../au3Irrlicht2.au3"

    [/autoit] [autoit][/autoit] [autoit]

    opt("MustDeclareVars", True)
    HotKeySet("{ESC}", "_exit")

    [/autoit] [autoit][/autoit] [autoit]

    _IrrStart( $IRR_EDT_OPENGL, 400, 200, $IRR_BITS_PER_PIXEL_32, _
    $IRR_WINDOWED, $IRR_NO_SHADOWS, $IRR_IGNORE_EVENTS, _
    $IRR_VERTICAL_SYNC_ON )

    [/autoit] [autoit][/autoit] [autoit]

    _IrrSetWindowCaption( "Irrlicht Tutorial" )

    [/autoit] [autoit][/autoit] [autoit]

    Global $BitmapFont = _IrrGetFont ( "../media/bitmapfont.bmp" )

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    WHILE _IrrRinning()
    _IrrBeginScene( 0,255,0 )

    [/autoit] [autoit][/autoit] [autoit]

    _Irr2DFontDraw ( $BitmapFont, "UNSERE EIGENE SCHRIFTART", 120, 80, 250, 96 )

    [/autoit] [autoit][/autoit] [autoit]

    _IrrEndScene()
    WEND

    [/autoit] [autoit][/autoit] [autoit]

    Func _exit()
    _IrrStop()
    Exit
    EndFunc ; _exit

    [/autoit]


    Genug mit Texten gearbeitet, jetz kommen wir zu den 2D-Bildern: Dazu verwenden wir wieder neue Funktionen:

    [autoit]

    _IrrGetTexture( "../media/IrrlichtLogo.bmp" ) ;zu aufrufen
    _IrrDraw2DImage( $IrrlichtLogo, 10, 10 ) ;zum zeichnen

    [/autoit]


    Jetzt versuchen wir mal das in useren Quellcode zu bringen. Dazu brauchen wir wieder eine Variable die das Bild speichert. Diesesmal machen wir den Hintergrund blau. Und zeichnen es dann in der While in das Fenster.

    "Bild anzeigen"
    [autoit]

    #include "../au3Irrlicht2.au3"

    [/autoit] [autoit][/autoit] [autoit]

    opt("MustDeclareVars", True)
    HotKeySet("{ESC}", "_exit")

    [/autoit] [autoit][/autoit] [autoit]

    _IrrStart( $IRR_EDT_OPENGL, 400, 200, $IRR_BITS_PER_PIXEL_32, _
    $IRR_WINDOWED, $IRR_NO_SHADOWS, $IRR_IGNORE_EVENTS, _
    $IRR_VERTICAL_SYNC_ON )

    [/autoit] [autoit][/autoit] [autoit]

    _IrrSetWindowCaption( "Irrlicht Tutorial" )

    [/autoit] [autoit][/autoit] [autoit]

    Global $IrrlichtLogo = _IrrGetTexture( "../media/IrrlichtLogo.bmp" )

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    WHILE _IrrRunning()
    _IrrBeginScene( 0,0,255 )

    [/autoit] [autoit][/autoit] [autoit]

    _IrrDraw2DImage( $IrrlichtLogo, 10, 10 )

    [/autoit] [autoit][/autoit] [autoit]

    _IrrEndScene()
    WEND

    [/autoit] [autoit][/autoit] [autoit]

    Func _exit()
    _IrrStop()
    Exit
    EndFunc ; _exit

    [/autoit]


    So um alles noch ein wenig zu festigen, lassen wir zusätzlich noch einen Text mit userer Schriftart anzeigen. Den Hintergrund machen wir rot.
    Doch das allein wär noch zu einfach. Wir lassen user Bild von rechts nach links wandern und useren Text von links nach rechts. Das machen mit der Variable $Vektor. Um es einfacher zu machen speichern wir unsere Fenstergröße in eine Variable.

    "Bild und Text bewegen sich!"
    [autoit]

    #include "../au3Irrlicht2.au3"

    [/autoit] [autoit][/autoit] [autoit]

    opt("MustDeclareVars", True)
    HotKeySet("{ESC}", "_exit")

    [/autoit] [autoit][/autoit] [autoit]

    Global $IrrlichtLogo, $BitmapFont, $Vektor[2], $screen_width, $screen_height

    [/autoit] [autoit][/autoit] [autoit]

    $screen_width = 400
    $screen_height = 200

    [/autoit] [autoit][/autoit] [autoit]

    _IrrStart( $IRR_EDT_OPENGL, $screen_width, $screen_height, $IRR_BITS_PER_PIXEL_32, _
    $IRR_WINDOWED, $IRR_NO_SHADOWS, $IRR_IGNORE_EVENTS, _
    $IRR_VERTICAL_SYNC_ON )

    [/autoit] [autoit][/autoit] [autoit]

    _IrrSetWindowCaption( "Irrlicht Tutorial" )

    [/autoit] [autoit][/autoit] [autoit]

    $IrrlichtLogo = _IrrGetTexture( "../media/IrrlichtLogo.bmp" )
    $BitmapFont = _IrrGetFont ( "../media/bitmapfont.bmp" )

    [/autoit] [autoit][/autoit] [autoit]

    $Vektor[0] = 10.0
    $Vektor[1] = 10.0

    [/autoit] [autoit][/autoit] [autoit]

    WHILE _IrrRunning()
    _IrrBeginScene( 255,0,0 )

    [/autoit] [autoit][/autoit] [autoit]

    _IrrDraw2DImage( $IrrlichtLogo, 20 + $Vektor[1], 80 + $Vektor[0])

    [/autoit] [autoit][/autoit] [autoit]

    _Irr2DFontDraw ( $BitmapFont, "WIR UEBEN FLEISSIG", $screen_width - 125 - $Vektor[1], 30 + $Vektor[0], 100, 50 )

    [/autoit] [autoit][/autoit] [autoit]

    If $Vektor[1] < $screen_width -88 -40 Then
    $Vektor[1] += 0.5
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    _IrrEndScene()
    WEND

    [/autoit] [autoit][/autoit] [autoit]

    Func _exit()
    _IrrStop()
    Exit
    EndFunc ; _exit

    [/autoit]


    Diesen Code kann man dann noch erweitern.

    Wenn ein Bild jetzt weiße Flächen hat, kann man die über Irrlicht transparent machen:

    [autoit]

    _IrrColorKeyTexture( $Bild, 255, 255, 255 )

    [/autoit]


    Wie man sieht kann man auch andere Farben transparent machen, aber wir beschränken uns bei unserem Beispiel nur auf weiß.
    Parameter:
    Der Rückgabewert von der "Bild aufruf"-Funktion
    R G B; welche Farbe transparent gemacht wird.

    Um gleich bei der Sache zu bleiben, es gibt auch noch einen anderen Befehl ein Bild zu zeichnen:

    [autoit]

    _IrrDraw2DImageElement( $Bild, 10, 10, _
    0,0,60,31, $IRR_USE_ALPHA )

    [/autoit]
    &quot;Parameter&quot;

    Der Rückgabewert von der "Bild aufruf"-Funktion
    X und Y Koordinaten wo das Bild gezeichnet wird
    X und Y Koordinaten vom Rechteck , jeweils links-oben ; rechts-oben Damit kann man das Bild in gewünschter Größes zeichnen.
    Ob der Alpha-Kanal verwendet wird.


    Jetzt schreiben wir einen Quellcode mit mehreren Bildern; mit Transparenz; mit veschiedenen Arten ein Bild zu zeichnen.

    &quot;Mehrere Bilder&quot;
    [autoit]

    #include "../au3Irrlicht2.au3"

    [/autoit] [autoit][/autoit] [autoit]

    opt("MustDeclareVars", True)
    HotKeySet("{ESC}", "_exit")

    [/autoit] [autoit][/autoit] [autoit]

    Global $IrrlichtLogo, $FreeBasicLogo, $FBIDELogo, $CodeBlocksLogo, $WrapperLogo
    Global $screen_width, $screen_height

    [/autoit] [autoit][/autoit] [autoit]

    $screen_width = 400
    $screen_height = 200

    [/autoit] [autoit][/autoit] [autoit]

    _IrrStart( $IRR_EDT_OPENGL, $screen_width, $screen_height, $IRR_BITS_PER_PIXEL_32, _
    $IRR_WINDOWED, $IRR_NO_SHADOWS, $IRR_IGNORE_EVENTS, _
    $IRR_VERTICAL_SYNC_ON )

    [/autoit] [autoit][/autoit] [autoit]

    _IrrSetWindowCaption( "Irrlicht Tutorial" )

    [/autoit] [autoit][/autoit] [autoit]

    $IrrlichtLogo = _IrrGetTexture( "../media/IrrlichtLogo.bmp" )
    $FreeBasicLogo = _IrrGetTexture( "../media/FreeBasicLogo.bmp" )
    $FBIDELogo = _IrrGetTexture( "../media/FBIDELogo.bmp" )
    $CodeBlocksLogo = _IrrGetTexture( "../media/CodeBlocksLogo.bmp" )
    $WrapperLogo = _IrrGetTexture( "../media/wrapperby.tga" )

    [/autoit] [autoit][/autoit] [autoit]

    WHILE _IrrRunning()
    _IrrBeginScene( 255,0,255 )

    [/autoit] [autoit][/autoit] [autoit]

    _IrrDraw2DImage( $IrrlichtLogo, 4, 4 )

    [/autoit] [autoit][/autoit] [autoit]

    _IrrDraw2DImageElement( $FreeBasicLogo, _
    $screen_width - 60 - 4, 4, _
    0,0,60,31, $IRR_USE_ALPHA )
    _IrrDraw2DImageElement( $FBIDELogo, _
    4, $screen_height - 32 - 4, _
    0,0,128,32, $IRR_IGNORE_ALPHA )
    _IrrDraw2DImageElement( $WrapperLogo, _
    ( $screen_width - 110 ) / 2, $screen_height - 32 - 4, _
    0,0,100,32, $IRR_USE_ALPHA )
    _IrrDraw2DImageElement( $CodeBlocksLogo, _
    $screen_width - 110 - 4, $screen_height - 32 - 4, _
    0,0,110,32, $IRR_IGNORE_ALPHA )

    [/autoit] [autoit][/autoit] [autoit]

    _IrrEndScene()
    WEND

    [/autoit] [autoit][/autoit] [autoit]

    Func _exit()
    _IrrStop()
    Exit
    EndFunc ; _exit

    [/autoit]


    Jetzt wissen wir über Irrlicht in der 2D-Welt bescheid.
    Doch was viel interessanter ist: Die 3D-Welt.

    Aber in der 3D-Welt wird vieles komplexer.
    Wenn man sich überlegt was man alles dazu braucht fällt einem sofort auf das man eine Map braucht.

    Mit dem beginnen wir auch. Um eigene Maps zu erstellen empfiele ich Hammer.
    So wenn wir jetzt unsere Map (.bsp) erstellt haben beginnen wir damit sie in Irrlicht aufzurufen:

    [autoit]

    _IrrGetMesh()

    [/autoit]


    Damit rufen wir eine Map (aber auch anderes) auf. Den Rückgabewert speichern wir in einer Variabele. Jetz kann es vorkommen, dass unsere Map gezippt wurde. Um die zip zu öffnen verwenden wir diese Funktion:

    [autoit]

    _IrrAddZipFile()

    [/autoit]


    Als Parameter wird jeweils der Pfad angegeben. Bei _IrrAddZipFile() gibt es noch zwei weitere Parameter: $IRR_IGNORE_CASE, $IRR_IGNORE_PATHS
    $IRR_IGNORE_PATHS damit kann ich es dann gleich einfach mit dem Dateinamen öffnen!
    Wie immer haben wir sie aber erst jetzt aufgerufen. Wir müssen sie aber noch zeichenen.
    Am einfachsten ist es, wenn wir die Map zu einer Scene hinzufügen und dann die Scene zeichnen.
    Um eine Scene zu zeichnen haben wir bereits _IrrDrawScene() gelernt. Aber um die Map zur Scene hinzuzufügen verwenden wir eine neue Funktion:

    [autoit]

    _IrrAddMeshToSceneAsOcttree()

    [/autoit]


    Dabei wird als Parameter der Rückgabewert vom Mesh-aufruf verwendet.
    Den Rückgabewert speichern wir wieder in eine Variabel.
    Wenn wir das jetz in unseren Quellcode eifügen sieht das so aus (ich verwende weiterhin die Datein von Irrlicht) :

    &quot;Map hinzfügen&quot;
    [autoit]

    #include "../au3Irrlicht2.au3"

    [/autoit] [autoit][/autoit] [autoit]

    opt("MustDeclareVars", True)
    HotKeySet("{ESC}", "_exit")

    [/autoit] [autoit][/autoit] [autoit]

    Global $BSPMesh, $BSPNode
    Global $screen_width, $screen_height

    [/autoit] [autoit][/autoit] [autoit]

    $screen_width = 800
    $screen_height = 600

    [/autoit] [autoit][/autoit] [autoit]

    _IrrStart( $IRR_EDT_OPENGL, $screen_width, $screen_height, $IRR_BITS_PER_PIXEL_32, _
    $IRR_WINDOWED, $IRR_NO_SHADOWS, $IRR_IGNORE_EVENTS, _
    $IRR_VERTICAL_SYNC_ON )

    [/autoit] [autoit][/autoit] [autoit]

    _IrrSetWindowCaption( "Irrlicht Tutorial" )

    [/autoit] [autoit][/autoit] [autoit]

    _IrrAddZipFile( "../media/map-20kdm2.pk3", $IRR_IGNORE_CASE, $IRR_IGNORE_PATHS )

    [/autoit] [autoit][/autoit] [autoit]

    $BSPMesh = _IrrGetMesh( "20kdm2.bsp" )

    [/autoit] [autoit][/autoit] [autoit]

    $BSPNode = _IrrAddMeshToSceneAsOcttree( $BSPMesh )

    [/autoit] [autoit][/autoit] [autoit]

    WHILE _IrrRunning()
    _IrrBeginScene( 0,0,0 )

    [/autoit] [autoit][/autoit] [autoit]

    _IrrDrawScene()

    [/autoit] [autoit][/autoit] [autoit]

    _IrrEndScene()
    WEND

    [/autoit] [autoit][/autoit] [autoit]

    Func _exit()
    _IrrStop()
    Exit
    EndFunc ; _exit

    [/autoit]


    Aber warum wird denn jetz nichts angezeigt?
    Das liegt daran, dass wir keine Kamera definiert haben, die die Scene aufnimmt.
    Um eine Kamera "aufzurufen" gibt es folgende Funktion:

    [autoit]

    _IrrAddCamera()

    [/autoit]


    Parameter:
    X, Y und Z Koordinaten der Kamera sozusagen ein Ortsvektor
    anschließend X, Y und Z Koordinaten eines Vektors des in die Richtung anzeigt in die die Kamera schauen soll.

    Wenn wir das jetzt in unseren Quellcode hinzufügen:

    &quot;Kamera und Map&quot;
    [autoit]

    #include "../au3Irrlicht2.au3"

    [/autoit] [autoit][/autoit] [autoit]

    opt("MustDeclareVars", True)
    HotKeySet("{ESC}", "_exit")

    [/autoit] [autoit][/autoit] [autoit]

    Global $BSPMesh, $BSPNode, $Camera
    Global $screen_width, $screen_height
    Global $LocalCamera[3], $DirectionCamera[3]

    [/autoit] [autoit][/autoit] [autoit]

    $screen_width = 800
    $screen_height = 600

    [/autoit] [autoit][/autoit] [autoit]

    _IrrStart( $IRR_EDT_OPENGL, $screen_width, $screen_height, $IRR_BITS_PER_PIXEL_32, _
    $IRR_WINDOWED, $IRR_NO_SHADOWS, $IRR_IGNORE_EVENTS, _
    $IRR_VERTICAL_SYNC_ON )

    [/autoit] [autoit][/autoit] [autoit]

    _IrrSetWindowCaption( "Irrlicht Tutorial" )

    [/autoit] [autoit][/autoit] [autoit]

    _IrrAddZipFile( "../media/map-20kdm2.pk3", $IRR_IGNORE_CASE, $IRR_IGNORE_PATHS )

    [/autoit] [autoit][/autoit] [autoit]

    $BSPMesh = _IrrGetMesh( "20kdm2.bsp" )

    [/autoit] [autoit][/autoit] [autoit]

    $BSPNode = _IrrAddMeshToSceneAsOcttree( $BSPMesh )

    [/autoit] [autoit][/autoit] [autoit]

    $LocalCamera[0] = 150.0
    $LocalCamera[1] = 50.0
    $LocalCamera[2] = 50.0

    [/autoit] [autoit][/autoit] [autoit]

    $DirectionCamera[0] = 0.0
    $DirectionCamera[1] = 0.0
    $DirectionCamera[2] = 0.0

    [/autoit] [autoit][/autoit] [autoit]

    $Camera = _IrrAddCamera($LocalCamera[0], $LocalCamera[1], $LocalCamera[2], $DirectionCamera[0], $DirectionCamera[1], $DirectionCamera[2])

    [/autoit] [autoit][/autoit] [autoit]

    WHILE _IrrRunning()
    _IrrBeginScene( 255,255,255 )

    [/autoit] [autoit][/autoit] [autoit]

    _IrrDrawScene()

    [/autoit] [autoit][/autoit] [autoit]

    _IrrEndScene()
    WEND

    [/autoit] [autoit][/autoit] [autoit]

    Func _exit()
    _IrrStop()
    Exit
    EndFunc ; _exit

    [/autoit]


    Jetzt sehen wir vielleicht etwas, aber das ist nur ein kleines Stück von der Map.
    Um jetzt sozusagen durch die Map wandern zu können kann man einen andere Kamera verwenden. Um die aufzurufen gibt es die Funktion:

    [autoit]

    _IrrAddFPSCamera()

    [/autoit]


    Diese Funktion hat keine Parameter.
    Jetzt erstetzen wir diese Kamera mit der alten:

    &quot;Durch die Map durch&quot;
    [autoit]

    #include "../au3Irrlicht2.au3"

    [/autoit] [autoit][/autoit] [autoit]

    opt("MustDeclareVars", True)
    HotKeySet("{ESC}", "_exit")

    [/autoit] [autoit][/autoit] [autoit]

    Global $BSPMesh, $BSPNode, $Camera
    Global $screen_width, $screen_height

    [/autoit] [autoit][/autoit] [autoit]

    $screen_width = 800
    $screen_height = 600

    [/autoit] [autoit][/autoit] [autoit]

    _IrrStart( $IRR_EDT_OPENGL, $screen_width, $screen_height, $IRR_BITS_PER_PIXEL_32, _
    $IRR_WINDOWED, $IRR_NO_SHADOWS, $IRR_IGNORE_EVENTS, _
    $IRR_VERTICAL_SYNC_ON )

    [/autoit] [autoit][/autoit] [autoit]

    _IrrSetWindowCaption( "Irrlicht Tutorial" )

    [/autoit] [autoit][/autoit] [autoit]

    _IrrAddZipFile( "../media/map-20kdm2.pk3", $IRR_IGNORE_CASE, $IRR_IGNORE_PATHS )

    [/autoit] [autoit][/autoit] [autoit]

    $BSPMesh = _IrrGetMesh( "20kdm2.bsp" )

    [/autoit] [autoit][/autoit] [autoit]

    $BSPNode = _IrrAddMeshToSceneAsOcttree( $BSPMesh )

    [/autoit] [autoit][/autoit] [autoit]

    $Camera = _IrrAddFPSCamera()

    [/autoit] [autoit][/autoit] [autoit]

    WHILE _IrrRunning()
    _IrrBeginScene( 255,255,255 )

    [/autoit] [autoit][/autoit] [autoit]

    _IrrDrawScene()

    [/autoit] [autoit][/autoit] [autoit]

    _IrrEndScene()
    WEND

    [/autoit] [autoit][/autoit] [autoit]

    Func _exit()
    _IrrStop()
    Exit
    EndFunc ; _exit

    [/autoit]


    Der Unterschied ist faszinierend.
    Hier kann man mit der Maus und den Pfeiltasten durch die Map fliegen.

    ////////////////////////////////////////////////////////////////////////////
    ///////--------------*FORTSETZUNG*-------------///////
    ////////////////////////////////////////////////////////////////////////////

    Jetzt nervt uns aber, dass wir immer irgendwo im nirgendswo stehen, anstatt gleich in der Mitte der Map zu sein. Sozusagen müssen wir unseren Startpunkt und usere Startrichtung festlegen. Diese haben wir mit _IrrAddCamera() direkt eingegeben. Aber bei der FPS-Kamera müssen wir dazu diese Funktionen verwenden:

    [autoit]

    _IrrSetNodePosition()
    _IrrSetNodeRotation()

    [/autoit]
    &quot;parameter&quot;

    _IrrSetNodePosition():
    Das Handle von dem wir die Position bestimmen wollen (sprich man kann damit nicht nur die Kamera verschieben)
    X, Y und Z Koordinaten des Ortsvektors. (also die Koordinaten an die das Objekt gesetzt werden soll)
    _IrrSetNodeRotation():
    Das Handle von dem wir die Rotation bestimmen wollen
    X, Y und Z Koordinaten des Richtungsvektors


    Auserdem nervt uns die Maus. Die bekommen wir aber schnell weg, und zwar mit:

    [autoit]

    _IrrHideMouse()

    [/autoit]


    Diese Funktion hat keine Parameter.

    So jetzt sehen wir mal was das an useren Quellcode ändert:

    &quot;Startpunkt definieren&quot;
    [autoit]

    #include "../au3Irrlicht2.au3"

    [/autoit] [autoit][/autoit] [autoit]

    opt("MustDeclareVars", True)
    HotKeySet("{ESC}", "_exit")

    [/autoit] [autoit][/autoit] [autoit]

    Global $BSPMesh, $BSPNode, $Camera
    Global $screen_width, $screen_height

    [/autoit] [autoit][/autoit] [autoit]

    $screen_width = 800
    $screen_height = 600

    [/autoit] [autoit][/autoit] [autoit]

    _IrrStart( $IRR_EDT_OPENGL, $screen_width, $screen_height, $IRR_BITS_PER_PIXEL_32, _
    $IRR_WINDOWED, $IRR_NO_SHADOWS, $IRR_IGNORE_EVENTS, _
    $IRR_VERTICAL_SYNC_OFF )

    [/autoit] [autoit][/autoit] [autoit]

    _IrrSetWindowCaption( "Irrlicht Tutorial" )

    [/autoit] [autoit][/autoit] [autoit]

    _IrrAddZipFile( "../media/map-20kdm2.pk3", $IRR_IGNORE_CASE, $IRR_IGNORE_PATHS )

    [/autoit] [autoit][/autoit] [autoit]

    $BSPMesh = _IrrGetMesh( "20kdm2.bsp" )

    [/autoit] [autoit][/autoit] [autoit]

    $BSPNode = _IrrAddMeshToSceneAsOcttree( $BSPMesh )

    [/autoit] [autoit][/autoit] [autoit]

    $Camera = _IrrAddFPSCamera()

    [/autoit] [autoit][/autoit] [autoit]

    _IrrSetNodePosition( $Camera, 1750, 149, 1369 )
    _IrrSetNodeRotation( $Camera, 4, -461.63, 0 )

    [/autoit] [autoit][/autoit] [autoit]

    _IrrHideMouse()

    [/autoit] [autoit][/autoit] [autoit]

    WHILE _IrrRunning()
    _IrrBeginScene( 255,255,255 )

    [/autoit] [autoit][/autoit] [autoit]

    _IrrDrawScene()

    [/autoit] [autoit][/autoit] [autoit]

    _IrrEndScene()
    WEND

    [/autoit] [autoit][/autoit] [autoit]

    Func _exit()
    _IrrStop()
    Exit
    EndFunc ; _exit

    [/autoit]


    Was uns jetzt noch stört, ist dass wir einfach durch die Map fliegen. Wir wollen nun den Boden nicht unter den Füßen verlieren und auch nicht durch Wände spazieren gehen können. Dazu brauchen wir zwei weitere Funktionen, die erste lautet so:

    &quot;_IrrGetCollisionGroupFromComplexMesh()&quot;

    Wir speichern den Rückgabewert in eine Variable.
    Der erste Parameter ist der Rückgabewert vom "hinzufügen der Map zur Scene"
    Der zweite ist der Rückgabewert der Map selber.


    Erstellt eine optimierte Dreieck Auswahl Gruppe aus einem großen, komplexen Netz wie eine Landkarte.
    Die zweite Funktion lautet:

    &quot;_IrrAddCollisionAnimator()&quot;

    Diese Funktion hat folgende Parameter:
    Das Objekt das mit der anderen Funktion ertellt wurde, sprich an was es kollidieren soll
    Das Objekt, das mit Kollidiert. (in unserem Fall wäre das die Kamera)
    X,Y und Z, die ein Ellipsoid darstellen. Dieses Ellipsoid soll sozusagen den Körper umschließen.
    X,Y und Z für die Gravitation.. (y wird meist als 9.8 verwendet) man kannes auch für Windverhältinisse verwenden.
    X,Y und Z für die Verschiebung des Mittelpunktes des Körpers bzw. der Kamera


    Aber das wird gleich um einiges verständlicher, wenn wir ein Beispiel machen:

    &quot;Kollision&quot;
    [autoit]

    #include "../au3Irrlicht2.au3"

    [/autoit] [autoit][/autoit] [autoit]

    opt("MustDeclareVars", True)
    HotKeySet("{ESC}", "_exit")

    [/autoit] [autoit][/autoit] [autoit]

    Global $BSPMesh, $BSPNode, $Camera
    Global $screen_width, $screen_height
    Global $MapCollision

    [/autoit] [autoit][/autoit] [autoit]

    $screen_width = 800
    $screen_height = 600

    [/autoit] [autoit][/autoit] [autoit]

    _IrrStart( $IRR_EDT_OPENGL, $screen_width, $screen_height, $IRR_BITS_PER_PIXEL_32, _
    $IRR_WINDOWED, $IRR_NO_SHADOWS, $IRR_IGNORE_EVENTS, _
    $IRR_VERTICAL_SYNC_OFF )
    _IrrSetWindowCaption( "Irrlicht Tutorial" )

    [/autoit] [autoit][/autoit] [autoit]

    _IrrAddZipFile( "../media/map-20kdm2.pk3", $IRR_IGNORE_CASE, $IRR_IGNORE_PATHS )
    $BSPMesh = _IrrGetMesh( "20kdm2.bsp" )
    $BSPNode = _IrrAddMeshToSceneAsOcttree( $BSPMesh )

    [/autoit] [autoit][/autoit] [autoit]

    $Camera = _IrrAddFPSCamera()

    [/autoit] [autoit][/autoit] [autoit]

    _IrrSetNodePosition( $Camera, 1750, 149, 1369 )
    _IrrSetNodeRotation( $Camera, 4, -461.63, 0 )

    [/autoit] [autoit][/autoit] [autoit]

    $MapCollision = _IrrGetCollisionGroupFromComplexMesh( $BSPMesh, $BSPNode )

    [/autoit] [autoit][/autoit] [autoit]

    _IrrAddCollisionAnimator($MapCollision, _
    $Camera, _
    30.0,30.0,30.0, _
    0.0,-9.8,0.0, _
    0.0,50.0,0.0 )

    [/autoit] [autoit][/autoit] [autoit]

    _IrrHideMouse()

    [/autoit] [autoit][/autoit] [autoit]

    WHILE _IrrRunning()
    _IrrBeginScene( 255,255,255 )

    [/autoit] [autoit][/autoit] [autoit]

    _IrrDrawScene()

    [/autoit] [autoit][/autoit] [autoit]

    _IrrEndScene()
    WEND

    [/autoit] [autoit][/autoit] [autoit]

    Func _exit()
    _IrrStop()
    Exit
    EndFunc ; _exit

    [/autoit]


    Jetzt sehen wir, dass unsere Kamera weder herumfliegt noch durch Wände gehen kann.

    Weil es schon ein paar Verwirrungen gab, will ich noch etwas klar stellen:
    Da in der 2-Dimensionalen Welt die X-Achse nach rechts geht und Y-Nach oben, wird in Irrlicht die Z-Achse als "Raumachse" nach vorne hinzugefügt. Also wird, wenn wir die Y-Achse sagen die Achse nach oben gemeint.
    Soviel dazu.

    Doch eine Map allein reicht uns nicht. Wir wollen nun Objekte und Charakter importiern.
    Dazu lernen wir weitere Funktionen kennen:

    [autoit]

    _IrrGetMesh()

    [/autoit]

    Hier haben wir einfach den Pfad als Parameter.
    Wir speichern den Rückgabewert um ihn bei deiser Funktion zu verwenden:

    [autoit]

    _IrrAddMeshToScene()

    [/autoit]

    Hier machen wir wider einen Scene für unseren Charakter.
    Wo schon gesagt ist der Parameter der Rückgabewert der anderen Funktion.
    Den Rückgabewert speichern wir wieder für alle Fälle.
    Wenn wir das nun in ein Beispiel schreiben (ich habe den Charakter von den vergefertigten Irrlicht Objekten verwendet):

    &quot;Herumgehen&quot;
    [autoit]

    #include "../au3Irrlicht2.au3"

    [/autoit] [autoit][/autoit] [autoit]

    opt("MustDeclareVars", True)
    HotKeySet("{ESC}", "_exit")

    [/autoit] [autoit][/autoit] [autoit]

    Global $BSPMesh, $BSPNode, $Camera
    Global $screen_width, $screen_height
    Global $MD2Mesh, $SceneNode

    [/autoit] [autoit][/autoit] [autoit]

    $screen_width = 800
    $screen_height = 600

    [/autoit] [autoit][/autoit] [autoit]

    _IrrStart( $IRR_EDT_OPENGL, $screen_width, $screen_height, $IRR_BITS_PER_PIXEL_32, _
    $IRR_WINDOWED, $IRR_NO_SHADOWS, $IRR_IGNORE_EVENTS, _
    $IRR_VERTICAL_SYNC_OFF )
    _IrrSetWindowCaption( "Irrlicht Tutorial" )

    [/autoit] [autoit][/autoit] [autoit]

    _IrrAddZipFile( "../media/map-20kdm2.pk3", $IRR_IGNORE_CASE, $IRR_IGNORE_PATHS )
    $BSPMesh = _IrrGetMesh( "20kdm2.bsp" )
    $BSPNode = _IrrAddMeshToSceneAsOcttree( $BSPMesh )

    [/autoit] [autoit][/autoit] [autoit]

    $MD2Mesh = _IrrGetMesh( "../media/zumlin.md2" )
    $SceneNode = _IrrAddMeshToScene( $MD2Mesh )

    [/autoit] [autoit][/autoit] [autoit]

    $Camera = _IrrAddFPSCamera()

    [/autoit] [autoit][/autoit] [autoit]

    _IrrSetNodePosition( $Camera, 1750, 149, 1369 )
    _IrrSetNodeRotation( $Camera, 4, -461.63, 0 )

    [/autoit] [autoit][/autoit] [autoit]

    _IrrHideMouse()

    [/autoit] [autoit][/autoit] [autoit]

    WHILE _IrrRunning()
    _IrrBeginScene( 255,255,255 )

    [/autoit] [autoit][/autoit] [autoit]

    _IrrDrawScene()

    [/autoit] [autoit][/autoit] [autoit]

    _IrrEndScene()
    WEND

    [/autoit] [autoit][/autoit] [autoit]

    Func _exit()
    _IrrStop()
    Exit
    EndFunc ; _exit

    [/autoit]


    Nach ein wenig suchen, sehen wir, dass unser Objekt weit ausserhalb unsere Map ist. Deswegen positionieren wir unseren Charakter in die Map. Dazu verwenden wir wieder die Funktion "_IrrSetNodePosition()", die wir bereits kennen gelernt haben:

    &quot;Charakter positionieren&quot;
    [autoit]

    #include "../au3Irrlicht2.au3"

    [/autoit] [autoit][/autoit] [autoit]

    opt("MustDeclareVars", True)
    HotKeySet("{ESC}", "_exit")

    [/autoit] [autoit][/autoit] [autoit]

    Global $BSPMesh, $BSPNode, $Camera
    Global $screen_width, $screen_height
    Global $MD2Mesh, $SceneNode

    [/autoit] [autoit][/autoit] [autoit]

    $screen_width = 800
    $screen_height = 600

    [/autoit] [autoit][/autoit] [autoit]

    _IrrStart( $IRR_EDT_OPENGL, $screen_width, $screen_height, $IRR_BITS_PER_PIXEL_32, _
    $IRR_WINDOWED, $IRR_NO_SHADOWS, $IRR_IGNORE_EVENTS, _
    $IRR_VERTICAL_SYNC_OFF )
    _IrrSetWindowCaption( "Irrlicht Tutorial" )

    [/autoit] [autoit][/autoit] [autoit]

    _IrrAddZipFile( "../media/map-20kdm2.pk3", $IRR_IGNORE_CASE, $IRR_IGNORE_PATHS )
    $BSPMesh = _IrrGetMesh( "20kdm2.bsp" )
    $BSPNode = _IrrAddMeshToSceneAsOcttree( $BSPMesh )

    [/autoit] [autoit][/autoit] [autoit]

    $MD2Mesh = _IrrGetMesh( "../media/zumlin.md2" )
    $SceneNode = _IrrAddMeshToScene( $MD2Mesh )

    [/autoit] [autoit][/autoit] [autoit]

    $Camera = _IrrAddFPSCamera()

    [/autoit] [autoit][/autoit] [autoit]

    _IrrSetNodePosition( $Camera, 1750, 149, 1369 )
    _IrrSetNodeRotation( $Camera, 4, -461.63, 0 )

    [/autoit] [autoit][/autoit] [autoit]

    _IrrSetNodePosition( $SceneNode, 1600, 93, 1369 )

    [/autoit] [autoit][/autoit] [autoit]

    _IrrHideMouse()

    [/autoit] [autoit][/autoit] [autoit]

    WHILE _IrrRunning()
    _IrrBeginScene( 255,255,255 )

    [/autoit] [autoit][/autoit] [autoit]

    _IrrDrawScene()

    [/autoit] [autoit][/autoit] [autoit]

    _IrrEndScene()
    WEND

    [/autoit] [autoit][/autoit] [autoit]

    Func _exit()
    _IrrStop()
    Exit
    EndFunc ; _exit

    [/autoit]


    Huh! Jetzt fällt uns erst auf, dass er für unsere Map ein wenig zu klein ist ist. Anstatt jetzt den Charakter in irgendeinem Programm größer zu skalieren können wir das ganze auch in Irrlicht machen, und zwar mit dieser Funktion:

    [autoit]

    _IrrSetNodeScale()

    [/autoit]


    Als erstes müssen wir der Funktion sagen was es skalieren soll (erster Parameter)
    Anschließend die X, Y und Z -Skalierungsfaktoren

    &quot;Größe anpassen&quot;
    [autoit]

    #include "../au3Irrlicht2.au3"

    [/autoit] [autoit][/autoit] [autoit]

    opt("MustDeclareVars", True)
    HotKeySet("{ESC}", "_exit")

    [/autoit] [autoit][/autoit] [autoit]

    Global $BSPMesh, $BSPNode, $Camera
    Global $screen_width, $screen_height
    Global $MD2Mesh, $SceneNode

    [/autoit] [autoit][/autoit] [autoit]

    $screen_width = 800
    $screen_height = 600

    [/autoit] [autoit][/autoit] [autoit]

    _IrrStart( $IRR_EDT_OPENGL, $screen_width, $screen_height, $IRR_BITS_PER_PIXEL_32, _
    $IRR_WINDOWED, $IRR_NO_SHADOWS, $IRR_IGNORE_EVENTS, _
    $IRR_VERTICAL_SYNC_OFF )
    _IrrSetWindowCaption( "Irrlicht Tutorial" )

    [/autoit] [autoit][/autoit] [autoit]

    _IrrAddZipFile( "../media/map-20kdm2.pk3", $IRR_IGNORE_CASE, $IRR_IGNORE_PATHS )
    $BSPMesh = _IrrGetMesh( "20kdm2.bsp" )
    $BSPNode = _IrrAddMeshToSceneAsOcttree( $BSPMesh )

    [/autoit] [autoit][/autoit] [autoit]

    $MD2Mesh = _IrrGetMesh( "../media/zumlin.md2" )
    $SceneNode = _IrrAddMeshToScene( $MD2Mesh )
    _IrrSetNodeScale( $SceneNode, 1.25, 1.25, 1.25 )

    [/autoit] [autoit][/autoit] [autoit]

    $Camera = _IrrAddFPSCamera()

    [/autoit] [autoit][/autoit] [autoit]

    _IrrSetNodePosition( $Camera, 1750, 149, 1369 )
    _IrrSetNodeRotation( $Camera, 4, -461.63, 0 )

    [/autoit] [autoit][/autoit] [autoit]

    _IrrSetNodePosition( $SceneNode, 1600, 93, 1369 )

    [/autoit] [autoit][/autoit] [autoit]

    _IrrHideMouse()

    [/autoit] [autoit][/autoit] [autoit]

    WHILE _IrrRunning()
    _IrrBeginScene( 255,255,255 )

    [/autoit] [autoit][/autoit] [autoit]

    _IrrDrawScene()

    [/autoit] [autoit][/autoit] [autoit]

    _IrrEndScene()
    WEND

    [/autoit] [autoit][/autoit] [autoit]

    Func _exit()
    _IrrStop()
    Exit
    EndFunc ; _exit

    [/autoit]


    Nun gefällt uns das Ausehen nicht ganz. Wenn wir eine Textur verwenden wollen, müssen wir sie zuerst "herrufen":

    [autoit]

    _IrrGetTexture()

    [/autoit]

    (hier wird der Pfad als Parameter eingegeben, und der Rückgabewert gespeichert)
    ... und dann auf usere Scene Draufkleben:

    [autoit]

    _IrrSetNodeMaterialTexture()

    [/autoit]


    Der erste Parameter ist das Handle von der Scene, der Zweite das Handle von der Textur.
    Und der dritte Parameter ist der Materialindex, meistens 1 oder 0
    Nun geben wir das in unseren Code ein:

    &quot;Textur aufrufen&quot;
    [autoit]

    #include "../au3Irrlicht2.au3"

    [/autoit] [autoit][/autoit] [autoit]

    opt("MustDeclareVars", True)
    HotKeySet("{ESC}", "_exit")

    [/autoit] [autoit][/autoit] [autoit]

    Global $BSPMesh, $BSPNode, $Camera
    Global $screen_width, $screen_height
    Global $MD2Mesh, $SceneNode, $MeshTexture

    [/autoit] [autoit][/autoit] [autoit]

    $screen_width = 800
    $screen_height = 600

    [/autoit] [autoit][/autoit] [autoit]

    _IrrStart( $IRR_EDT_OPENGL, $screen_width, $screen_height, $IRR_BITS_PER_PIXEL_32, _
    $IRR_WINDOWED, $IRR_NO_SHADOWS, $IRR_IGNORE_EVENTS, _
    $IRR_VERTICAL_SYNC_OFF )
    _IrrSetWindowCaption( "Irrlicht Tutorial" )

    [/autoit] [autoit][/autoit] [autoit]

    _IrrAddZipFile( "../media/map-20kdm2.pk3", $IRR_IGNORE_CASE, $IRR_IGNORE_PATHS )
    $BSPMesh = _IrrGetMesh( "20kdm2.bsp" )
    $BSPNode = _IrrAddMeshToSceneAsOcttree( $BSPMesh )

    [/autoit] [autoit][/autoit] [autoit]

    $MD2Mesh = _IrrGetMesh( "../media/zumlin.md2" )
    $MeshTexture = _IrrGetTexture( "../media/zumlin.pcx" )
    $SceneNode = _IrrAddMeshToScene( $MD2Mesh )
    _IrrSetNodeMaterialTexture( $SceneNode, $MeshTexture, 0 )
    _IrrSetNodeScale( $SceneNode, 1.25, 1.25, 1.25 )

    [/autoit] [autoit][/autoit] [autoit]

    $Camera = _IrrAddFPSCamera()

    [/autoit] [autoit][/autoit] [autoit]

    _IrrSetNodePosition( $Camera, 1750, 149, 1369 )
    _IrrSetNodeRotation( $Camera, 4, -461.63, 0 )

    [/autoit] [autoit][/autoit] [autoit]

    _IrrSetNodePosition( $SceneNode, 1600, 93, 1369 )

    [/autoit] [autoit][/autoit] [autoit]

    _IrrHideMouse()

    [/autoit] [autoit][/autoit] [autoit]

    WHILE _IrrRunning()
    _IrrBeginScene( 255,255,255 )

    [/autoit] [autoit][/autoit] [autoit]

    _IrrDrawScene()

    [/autoit] [autoit][/autoit] [autoit]

    _IrrEndScene()
    WEND

    [/autoit] [autoit][/autoit] [autoit]

    Func _exit()
    _IrrStop()
    Exit
    EndFunc ; _exit

    [/autoit]


    Jetzt sehen wir, dass sich noch nicht viel geändert hat. Wenn wir überlegen, fällt uns auf, dass wir die Textur auf ein Material gegeben haben. Jetzt müssen wir also nur noch das Material anzeigen lassen:

    &quot;_IrrSetNodeMaterialFlag()&quot;

    Als erstes verweisen wir wieder auf die Scene mit deren Handle
    Als zweites kommt der Typ vor: Damit bestimmt man ob es auf Licht empfindlich sein soll oder anderes. Hier möchte ich auf die Hilfe verweisen.
    Und als dritter Parameter können wir diese Eigenschaft ein oder ausschalten


    Jetzt fügen wir das zu unserem Quellcode hinzu:

    &quot;Material-Textur anzeigen&quot;
    [autoit]

    #include "../au3Irrlicht2.au3"

    [/autoit] [autoit][/autoit] [autoit]

    opt("MustDeclareVars", True)
    HotKeySet("{ESC}", "_exit")

    [/autoit] [autoit][/autoit] [autoit]

    Global $BSPMesh, $BSPNode, $Camera
    Global $screen_width, $screen_height
    Global $MD2Mesh, $SceneNode, $MeshTexture

    [/autoit] [autoit][/autoit] [autoit]

    $screen_width = 800
    $screen_height = 600

    [/autoit] [autoit][/autoit] [autoit]

    _IrrStart( $IRR_EDT_OPENGL, $screen_width, $screen_height, $IRR_BITS_PER_PIXEL_32, _
    $IRR_WINDOWED, $IRR_NO_SHADOWS, $IRR_IGNORE_EVENTS, _
    $IRR_VERTICAL_SYNC_OFF )
    _IrrSetWindowCaption( "Irrlicht Tutorial" )

    [/autoit] [autoit][/autoit] [autoit]

    _IrrAddZipFile( "../media/map-20kdm2.pk3", $IRR_IGNORE_CASE, $IRR_IGNORE_PATHS )
    $BSPMesh = _IrrGetMesh( "20kdm2.bsp" )
    $BSPNode = _IrrAddMeshToSceneAsOcttree( $BSPMesh )

    [/autoit] [autoit][/autoit] [autoit]

    $MD2Mesh = _IrrGetMesh( "../media/zumlin.md2" )
    $MeshTexture = _IrrGetTexture( "../media/zumlin.pcx" )
    $SceneNode = _IrrAddMeshToScene( $MD2Mesh )
    _IrrSetNodeMaterialTexture( $SceneNode, $MeshTexture, 0 )
    _IrrSetNodeMaterialFlag( $SceneNode, $IRR_EMF_LIGHTING, $IRR_OFF )
    _IrrSetNodeScale( $SceneNode, 1.25, 1.25, 1.25 )

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    $Camera = _IrrAddFPSCamera()

    [/autoit] [autoit][/autoit] [autoit]

    _IrrSetNodePosition( $Camera, 1750, 149, 1369 )
    _IrrSetNodeRotation( $Camera, 4, -461.63, 0 )

    [/autoit] [autoit][/autoit] [autoit]

    _IrrSetNodePosition( $SceneNode, 1600, 93, 1369 )

    [/autoit] [autoit][/autoit] [autoit]

    _IrrHideMouse()

    [/autoit] [autoit][/autoit] [autoit]

    WHILE _IrrRunning()
    _IrrBeginScene( 255,255,255 )

    [/autoit] [autoit][/autoit] [autoit]

    _IrrDrawScene()

    [/autoit] [autoit][/autoit] [autoit]

    _IrrEndScene()
    WEND

    [/autoit] [autoit][/autoit] [autoit]

    Func _exit()
    _IrrStop()
    Exit
    EndFunc ; _exit

    [/autoit]


    Und schon wird unsere Textur angezeigt.
    Was uns auch bestimmt aufgefallen ist, ist die Animation, die in unserem Objekt gespeichert ist, und diese automatisch abgespielt wird.
    Das Blöde allerdings ist, dass sie alle Animationen abspiel, wobei wir nur eine abspielen wollen. Das können wir mit folgender Funktion bestimmen:

    [autoit]

    _IrrPlayNodeMD2Animation()

    [/autoit]

    Zuerst wird wieder auf die Scene verwiesen und dann wird die Animation gewählt
    Wenn wir also jetzt wollen, dass die Animation fürs Stehen abgespielt werden soll, dann verwenden wir $IRR_EMAT_STAND :

    &quot;Animation-Stehen&quot;
    [autoit]

    #include "../au3Irrlicht2.au3"

    [/autoit] [autoit][/autoit] [autoit]

    opt("MustDeclareVars", True)
    HotKeySet("{ESC}", "_exit")

    [/autoit] [autoit][/autoit] [autoit]

    Global $BSPMesh, $BSPNode, $Camera
    Global $screen_width, $screen_height
    Global $MD2Mesh, $SceneNode, $MeshTexture

    [/autoit] [autoit][/autoit] [autoit]

    $screen_width = 800
    $screen_height = 600

    [/autoit] [autoit][/autoit] [autoit]

    _IrrStart( $IRR_EDT_OPENGL, $screen_width, $screen_height, $IRR_BITS_PER_PIXEL_32, _
    $IRR_WINDOWED, $IRR_NO_SHADOWS, $IRR_IGNORE_EVENTS, _
    $IRR_VERTICAL_SYNC_OFF )
    _IrrSetWindowCaption( "Irrlicht Tutorial" )

    [/autoit] [autoit][/autoit] [autoit]

    _IrrAddZipFile( "../media/map-20kdm2.pk3", $IRR_IGNORE_CASE, $IRR_IGNORE_PATHS )
    $BSPMesh = _IrrGetMesh( "20kdm2.bsp" )
    $BSPNode = _IrrAddMeshToSceneAsOcttree( $BSPMesh )

    [/autoit] [autoit][/autoit] [autoit]

    $MD2Mesh = _IrrGetMesh( "../media/zumlin.md2" )
    $MeshTexture = _IrrGetTexture( "../media/zumlin.pcx" )
    $SceneNode = _IrrAddMeshToScene( $MD2Mesh )
    _IrrSetNodeMaterialTexture( $SceneNode, $MeshTexture, 0 )
    _IrrSetNodeMaterialFlag( $SceneNode, $IRR_EMF_LIGHTING, $IRR_OFF )
    _IrrPlayNodeMD2Animation( $SceneNode, $IRR_EMAT_STAND )
    _IrrSetNodeScale( $SceneNode, 1.25, 1.25, 1.25 )

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    $Camera = _IrrAddFPSCamera()

    [/autoit] [autoit][/autoit] [autoit]

    _IrrSetNodePosition( $Camera, 1750, 149, 1369 )
    _IrrSetNodeRotation( $Camera, 4, -461.63, 0 )

    [/autoit] [autoit][/autoit] [autoit]

    _IrrSetNodePosition( $SceneNode, 1600, 93, 1369 )

    [/autoit] [autoit][/autoit] [autoit]

    _IrrHideMouse()

    [/autoit] [autoit][/autoit] [autoit]

    WHILE _IrrRunning()
    _IrrBeginScene( 255,255,255 )

    [/autoit] [autoit][/autoit] [autoit]

    _IrrDrawScene()

    [/autoit] [autoit][/autoit] [autoit]

    _IrrEndScene()
    WEND

    [/autoit] [autoit][/autoit] [autoit]

    Func _exit()
    _IrrStop()
    Exit
    EndFunc ; _exit

    [/autoit]

    Wie wir sehen wird nun nur mehr die Animation fürs Stehen abgespielt.

    Jetzt gibt es noch eine Funktion, die die Kamera zwingt auf einen bestimmten Punkt zu sehen. Diese können wir verwenden um usere Kamera auf unseren Charakter zu verweisen:

    [autoit]

    _IrrSetCameraTarget()

    [/autoit]

    Hier wird auf die Kamera verwiesen und anschließend die X, Y und Z Koordinaten des Punktes, auf den die Kamera gerichtet werden soll.
    Wenn wir das nun in die While hinein schreiben sieht das ganze so aus:

    &quot;Blickrichtung bestimmen&quot;
    [autoit]

    #include "../au3Irrlicht2.au3"

    [/autoit] [autoit][/autoit] [autoit]

    opt("MustDeclareVars", True)
    HotKeySet("{ESC}", "_exit")

    [/autoit] [autoit][/autoit] [autoit]

    Global $BSPMesh, $BSPNode, $Camera
    Global $screen_width, $screen_height
    Global $MD2Mesh, $SceneNode, $MeshTexture

    [/autoit] [autoit][/autoit] [autoit]

    $screen_width = 800
    $screen_height = 600

    [/autoit] [autoit][/autoit] [autoit]

    _IrrStart( $IRR_EDT_OPENGL, $screen_width, $screen_height, $IRR_BITS_PER_PIXEL_32, _
    $IRR_WINDOWED, $IRR_NO_SHADOWS, $IRR_IGNORE_EVENTS, _
    $IRR_VERTICAL_SYNC_OFF )
    _IrrSetWindowCaption( "Irrlicht Tutorial" )

    [/autoit] [autoit][/autoit] [autoit]

    _IrrAddZipFile( "../media/map-20kdm2.pk3", $IRR_IGNORE_CASE, $IRR_IGNORE_PATHS )
    $BSPMesh = _IrrGetMesh( "20kdm2.bsp" )
    $BSPNode = _IrrAddMeshToSceneAsOcttree( $BSPMesh )

    [/autoit] [autoit][/autoit] [autoit]

    $MD2Mesh = _IrrGetMesh( "../media/zumlin.md2" )
    $MeshTexture = _IrrGetTexture( "../media/zumlin.pcx" )
    $SceneNode = _IrrAddMeshToScene( $MD2Mesh )
    _IrrSetNodeMaterialTexture( $SceneNode, $MeshTexture, 0 )
    _IrrSetNodeMaterialFlag( $SceneNode, $IRR_EMF_LIGHTING, $IRR_OFF )
    _IrrPlayNodeMD2Animation( $SceneNode, $IRR_EMAT_STAND )
    _IrrSetNodeScale( $SceneNode, 1.25, 1.25, 1.25 )

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    $Camera = _IrrAddFPSCamera()

    [/autoit] [autoit][/autoit] [autoit]

    _IrrSetNodePosition( $Camera, 1750, 149, 1369 )
    _IrrSetCameraTarget( $Camera, 1600, 93, 1369)

    [/autoit] [autoit][/autoit] [autoit]

    _IrrSetNodePosition( $SceneNode, 1600, 93, 1369 )

    [/autoit] [autoit][/autoit] [autoit]

    _IrrHideMouse()

    [/autoit] [autoit][/autoit] [autoit]

    WHILE _IrrRunning()
    _IrrBeginScene( 255,255,255 )

    [/autoit] [autoit][/autoit] [autoit]

    _IrrSetCameraTarget( $Camera, 1600, 93, 1369)

    [/autoit] [autoit][/autoit] [autoit]

    _IrrDrawScene()

    [/autoit] [autoit][/autoit] [autoit]

    _IrrEndScene()
    WEND

    [/autoit] [autoit][/autoit] [autoit]

    Func _exit()
    _IrrStop()
    Exit
    EndFunc ; _exit

    [/autoit]

    Soweit erstmal wieder genug.. mit dem wisst er schon über viel bescheid und könnt auch schon viel machen.
    Bitte gebt mir über Fehler bescheid! (Rechtschreib- und Programmierfehler)

    10 Mal editiert, zuletzt von Schnacko (30. August 2011 um 19:07)

  • Servus,

    sehr schön gemacht, den ein oder anderen Rechtschreibfehler habe ich ignoriert.

    Hat mir Irrlicht auf jeden Fall ein wenig näher gebracht, Danke :)

    Gruß

    Prajoss

    ps: warte auf das nächste Tut :D

    "Never touch a running System!"

  • i bedanke mich fürs lesen..
    eine Fortsetzung kommt bestimmt ^^

    eigentlich wärs mir lieber gewesen du hättest mir die Fehler mitgeteilet ^^

  • ist gut geworden ;). Wenn du Lust und Zeit hast, kannst du dein Tutorial auch noch ein wenig unterteilen, für diese Teile Überschriften anlegen, und vielleicht auch ein kleines Inhaltsverzeichnis machen. Das wäre besonders hilfreich, falls dein Tutorial in Zukunft noch umfangreicher werden soll. ^^

  • Danke name fürs lesen
    Ich werd vielleicht einen Unterteilung machen ...
    So wies kommt so kommts!!

  • Mit was soll ich jetzt weitermachen?
    Hab vor Kollison und Gravitation zu machen will aber noch jemand etwas unbedingt lernen?
    Bitte um Vorschläge..

  • Du könntest diese "offiziellen" Tutorials ja statt in C++ in AutoIt und deutsch schreiben.
    http://irrlicht.sourceforge.net/tutorials.html

  • keinen Schlechte idee.. aber ich glaub das mach ich erst wenn ich c++ auch verstehe.. dann edecke ich mehr die Paralellen!

  • Man könnte die Irrlicht.dll durch die Version 1.7.2 ersetzen.
    Es gibt keine neuen Funktionen, es wurde nur Bugs gefixt.

    Spoiler anzeigen
  • wenn ich c++ auch verstehe.


    Ist nicht schwer. Du brauchst meiner Meinung nach nur Grundkenntnisse um diese Texte zu verstehen.

  • jo.. ich werd mir mal ein 100 seitiges tut durchles, welches die Basic erklärt.. dann kann ich mich daran mal an die arbeit machen.

    Danke für eure antworten clezz und Marthog

  • Hallo,
    mir war mal langweilig. Hab mir en paar sachen angeschaut und im folgenden, sollen kleine verbesserungen aufgezeigt werden:

    Ob der Text gewickelt wird


    Wie wird ein Text denn gewickelt? :D

    #include "../au3Irrlicht2.au3"


    Ich mag dieses ""../" einfach nicht. Ich fände es besser, wenn man die include von Anfang an in den altbekannten Include-Ordner schmeißt.

    while 1 _Irr2DFontDraw ( $BitmapFont, "UNSERE EIGENE SCHRIFTART", 120, 80, 250, 96 )wend


    Ich bin mir nicht ganz sicher, ob das Label in der While-Schleife immer wieder neu gezeichnet werden muss. Ich glaub, es reicht, wenn man das label einfach schon davor hinzufügt. Generell bevorzugt meine wenigkeit _irraddstatictext() und _irrsetstatictext() (oder so ähnlich :))

    If $Vektor[1] < $screen_width -88 -40 Then $Vektor[1] += 0.5


    Als Vektoren muss man die Teile glaub noch nicht bezeichnen. Sind, wenn ich mich nicht irre, simple Koordinaten im 3-dimensionalen Koordinatensystem.

    Aber in der 3D-Welt wird vieles komplexer.


    Ach ja? was denn? die dritte Koordinatenvariable? oder etwa die kollisionsanimatoren? präzisieren, wenn möglich!

    Um eigene Maps zu erstellen empfiele ich Hammer.


    Earth Sculptor ist eine sehr einfache und effektive Alternative!

    Der Unterschied ist faszinierend.


    Unglaublich!

    So das wars. Sind wie gesagt nur Kleinigkeiten; ansonsten: super tutorial!
    Gruß, Billie

    [align=center]Meine Werke mit der Irrlicht Engine
    AutoIt Picture Viewer Dreidimensionaler Bildbetrachter
    Mr Bubble 3D Neue Interpretation des Flashklassikers Bubble trouble

  • Danke Billie..
    Ich weiß auch nicht ganz as ein gewickelter text ist aber wes ist es dann?

  • Nun ist sie fertig: die Fortsetzung!!!

    wer schon ein wenig gelesen hat muss nur nach

    ////////////////////////////////////////////////////////////////////////////
    ///////--------------*FORTSETZUNG*-------------///////
    ////////////////////////////////////////////////////////////////////////////

    ausschau halten ^^

    MFG Schnacko

  • Ich brauche noch Tipps, wie es nun weiter gehen soll..

    Also was wollt ihr wissen.. oder glaubt ihr dass interessant ist

    Bitte benachrichtigt mich wenn Fehler vorhanden sind

  • Gutes Tutorial, ich vermisse nur die geneuere Erklärung zum darstellen von Aktionen eines Objekts. Du hast zwar die Variablen Gehen etc angesprochen, aber die waren jetzt nur füe das Objekt. Wie macht man seine eigenen Aktionen für eigene Objekte?

    Rechtschreibfehler:
    Das Objekt, das mit Kollidiert. (in unserem Fall würe das die Kamera) ; entweder wäre oder ein sein ans Ende.

    mfg BB

    "IF YOU'RE GOING TO KILL IT
    OPEN SOURCE IT!"

    by Phillip Torrone

    Zitat von Shoutbox

    [Heute, 11:16] Andy: ....böseböseböseböse....da erinnere ich mich daran, dass man den Puschelschwanz eines KaRnickels auch "Blume" nennt....ob da eins zum anderen passt? :rofl: :rofl: :rofl: :rofl:

    https://autoit.de/index.php?page…leIt#post251138

    Neon Snake

  • Naja mir hätten die examples auch gereicht aber trotzdem danke das du dir die mühe gemacht hast ;)

  • Ich weiß das Thema ist schon bissl älter, aber ich hab es mir gerade durchgelesen und fand es eigentlich sehr gut. Dabei bin ich auf einige Fehler in deinem Tut gestoßen :) wenn du skype, Icq hast pn mich mal, denn es währ bisschen viel hier zu posten.

    mfg YellowWeedSeed

    Ich hoffe mal das dass jetzt nicht als pushen von alten threads gilt,
    wenn doch tuts mir leid aber es sind doch auch teilweise fehler im script dabei

    §1 Ich kann nicht für meine scripts inhaftiert werden, auch wenn bereits 3 Menschen erblindeten an den Folgen der Korrekturlesung.  8o

  • Hei!

    Nein ich bin froh dass überhaupt noch jemand mein Tut liest ;)
    Schreib mir einfach mal eine PN.. Es ist gut wenn es besser wird ^^

    MFG Schnacko

  • Es ist gut wenn es besser wird ... soso, schön formuliert XD
    Wie schauts denn mit der Fortsetzung + Flutch aus ?

    Es gibt sehr viele Leute, die glauben. Aber aus Aberglauben.
    - Blaise Pascal