# R3D3

Kommen wir nun zu unserem Prototypen R3D3. Das Aussehen sollte uns nicht weiter stören. Ausgestattet ist der R3D3 mit jeder Menge Sensoren und Steuereinheiten. Dies ist auch der Grund weswegen sich dieser Roboter so kinderleicht bedienen lässt. Voraussetzung hierfür ist allerdings eine fehlerfreie Aktion, die wir uns ansehen werden. Auch der R3D3 hat eine eigene WDL-Datei, welche wir aus dem Verzeichnis "bibliothek" in unseren Editor laden.

Bei der Berechnung werden die objekteigenen Variablen (Skills) verwendet. Um bei der Programmierung die 100 verschiedenen Skills nicht zu verwechseln, kann diesen ein eindeutiger Name zugewiesen werden. Dies geschieht mit dem Befehl "DEFINE". Diese Namenszuweisung ist aber für alle Objekte gültig. Aus diesem Grund sind diese Zuweisungen in einer extra WDL-Datei ("defskill.wdl") abgelegt.

Hauptbestandteil der R3D3 Aktion ist die Steuerung der Gravitationsdüsen. Diese Düsen halten den R3D3 am Boden. Hier im schwerelosen Raum ist dies besonders wichtig.

`

    	vec_set(temp, my.x);
    	temp.z -= 4000;
    	trace_mode = ignore_me + ignore_passable + ignore_sprites + use_box;
    	result = trace(my.x, temp);

`

Je nachdem ob der Roboter Bodenkontakt hat, erfolgt die Steuerung über die Cursor-Tasten in X und Y Richtung. Mit einer seitlichen Bewegung der Maus wird der R3D3 gedreht.

`

    if (result < 15)
    	{
    	my.POWER_X = key_force.y * 5;
    	my.POWER_Y = key_force.x * -5;
    	my.POWER_Z = result * -0.1;
    	}
    else
    	{
    	my.POWER_Z = -10;
    	}
    vec_accelerate(my.IPos_X, my.SPEED_X, my.POWER_X, 0.5);
    // ---- Berechnung Drehung in PAN ------
    my.POWER_PAN  = MOUSE_FORCE.X * -0.5;
    accelerate(my.SPEED_PAN, my.POWER_PAN, 0.5);
    my.SPEED_TILT = 0;
    my.SPEED_ROLL = 0;

`

Die eigentliche Bewegung wird durch den "ent_move" Befehl ausgeführt, welcher auch gleich eine Kollisionserkennung durchführt. Gedreht wird der Roboter durch eine Addition seiner jetzigen Winkel und der drei aufeinander folgenden Winkel, die in den Skills stehen.

`

    move_mode = ignore_passable + ignore_passents + activate_trigger + glide + use_box;
    ent_move (my.IPos_X, nullvector);
    vec_Add(my.pan, my.SPEED_PAN);

`

Erfolgt eine Auf- oder Abbewegung der Maus, so wird die Kamera nach oben oder unten geneigt. Hier sind allerdings Maximalwerte zu beachten.

`

    my.POWER_TILT =  MOUSE_FORCE.y * 0.5;
    accelerate(my.SPEED_TILT, my.POWER_TILT, 0.5);
    my.IPos_TILT = clamp(my.POWER_TILT,-30 ,30) + camera.tilt;
    my.IPos_Pan = my.pan;
    vec_set(camera.pan, my.IPos_Pan);
    vec_set(temp.x, my.x);
    my.STRECKE %=180;
    temp.z += 40;
    vec_set(camera.x, temp.x);

`

Zum Schluss muss noch die Kamera auf die neue Position bewegt und in die neue Sichtrichtung gedreht werden.

Zum jetzigen Zeitpunkt lasse ich Dich noch nicht an diesem Skript rumschreiben. Versuche zunächst einmal zu verstehen was dieses Skript bewirkt.