Nb. Il procedimento per costruire ascensori e piattaforme mobili in Quake 4 e PREY è
sostanzialmente lo stesso, ma cambiano entità e parametri, per cui dedicheremo tutorials specifici a questi due videogames.
Qui trovi comunque le basi per procedere, valide per tutti e tre i giochi
Come costruire un ascensore a due fermate con porte interne ed esterne by CARNUFEX
0. Introduzione
In questo tutorial di livello intermedio ti mostrerò come costruire un ascensore a due fermate per Doom 3, completo di porte interne ed esterne, gui per
la chiamata e suoni. Per aggiungere un'altra fermmata e dunque un terzo piano bisogna mettere mano allo scripting, per
cui lo lasciamo per un altro tutorial di livello avanzato.
Ok carica la tua mappa o costruisci due stanze sovrapposte e sotto col lavoro :)
1. Il modello di ascensore
Per prima cosa carichiamo il modello, in modo da avere un punto di riferimento preciso per le dimensioni del condotto che
dovrà ospitare l'ascensore:
- click sulla griglia 2D e scegli func_elevator;
- va su Entity, clicca sul pulsante Model e sulla finestra che si è aperta naviga seguendo il seguente percorso:
models/mapobjects/elevators/elevator.lwo
- Seleziona elevator.lwo e dà l'OK.
Ora dalla stessa finestra Entity assegnamo tutte le proprietà al nostro func_elevator, a incominciare dal nome (che è puramente convenzionale:
puoi chiamarlo come ti pare; per brevità, io l'ho chiamato lift) e le proprietà dinamiche ovvero relative al movimento dell'ascensore [a];
poi quelle relative all'assemblaggio, che predisporranno l'ascensore a funzionare assieme alle porte [b]; poi ancora
quelle relative al posizionamento sui due piani [c], e infine carichiamo i giu(s) interni all'ascensore e attraverso i gui_parms ci scriviamo le scritte
che compariranno sul gui interattivo dell'ascensore [d].
Digita i seguenti key/vals:
1.1 Nome e proprietà dinamiche
- name: lift [come detto sopra, il nome è convenzionale]
- move_time: 6 [tempo di percorrenza]
- accel_time: 1 [tempo di accelerazione]
- decel_time: 1 [tempo di decelerazione]
1.2 proprietà di assemblagio
- innerdor: func_door_1 [nome della porta interna]
- floorDoor_1: piano1 [nome della porta esterna del 1° piano o pian terreno]
- floorDoor_2: piano2 [nome della porta esterna del 2° piano]
NB. 'piano1' e 'piano2' sono anch'esse denominazioni convenzionali: puoi chiamarle come ti pare a
condizione che una delle due anti che compongono le porte esterne rispettivamente del 1° e 2° piano abbiano lo stesso nome assegnato nelle loro proprietà.
1.3 Posizionamento dell'ascensore
- floorpos_1: (posizione al 1° piano - assi X Y Z) *
- floorpos_2: (posizione al 2° piano - assi X Y Z) *
* Per ricavare le coordinate precise dell'ascensore nello spazio del worldspan piazzalo al punto di partenza (pian terreno) e nella finestra YZ Side posiziona il cursore sul punto rosso dell'entità: nella finestra sotto puoi leggere la posizione sui due assi Y e Z.
Passa alla veduta XY Top per ricavare il valore sull'asse X. Infine sposta l'ascensore sopra e ripeti l'operazione per ricavare la sua posizione nel piano superiore.
1.4 GUI(s) dell'ascensore
- gui: guis/doors/elevator2floor.gui [Gui primario, interattivo]
- gui2: guis/doors/elevatortop.gui [Gui secondario, passivo]
- gui_parm3: Livello 2 [o quel che ti pare: scritta che comparirà a video]
- gui_parm4: Livello 2 [idem sopra]
E con questo abbiamo finito di assegnare le proprietà al nostro ascensore. Ecco uno screenshot che riassume tutti gli attributi del func_elevator:
il passo sucessivo è caricare le porte interne.
2. Le porte interne
Carica un func_door e, come prima, dalla finestra Entity premi su Model e carica la porta relativa al modello di ascensore che stiamo usando:
models/mapobjects/elevators/elevator_door.lwo
Mettila in posizione e sempre dalla finestra Entity inserisci i Key/Vals cone nella figura sotto:
- name : func_door_1 (assegnato di default se è la prima porta nel livello: in ogni caso, controlla che corrisponda all'attributo per innerdoor nelle proprietà dell'ascensore);
- movedir : X (direzione del movimento della porta, relativa alla posizione dell'ascensore nel livello: nel mio caso 180°);
- team : [nome del func_elevator]1 (questo attributo ordina alla porta di muoversi in sincronia con
l'ascensore, per cui il valore deve corrispondere al nome del func_elevator, seguito, in questo caso - trattandosi delle
porte interne - da 1: in questo tutorial lift1);
- no_touch : 1 (fa in modo che la porta non si apra al semplice avvicinarsi del player, ma tramite Gui).
Fatto questo, clona la porta, posiziona il clone e aggiusta l'angolo di movimento in modo che scorra nella direzione
opposta alla prima porta NB: il nome di questo secondo func_door non ha importanza, purché abbia l'attributo
team settato con lo stesso valore di prima.
3.
Le Porte esterne
Per le porte esterne possiamo usare lo stesso modello di quelle interne, oppure, come faremo qui, impiegare un altro modello,
in modo da diversificare un po' l'ambientazione ;)
In ogni caso, possiamo comunque partire clonando le due porte interne e poi sostituire il modello, p.e. con quello che troverai
a capo del seguente percorso:
models/mapobjects/doors/delelev/delelevlf.lwo
Una volta sostituito il modello, seleziona una delle due ante della porta, va su Entity e correggi i key/vals come
nella figura:
- name : [valore per l'attributo floorDor_1 nelle prorietà dell'ascensore]
(in questo tutorial: piano1);
- team : [nome del func_elevator nelle prorietà dell'ascensore]2 (come prima,
il valore deve corrispondere al nome dell'ascensore seguito, in questo caso, da 2. In questo tutorial: lift2;
* Optional: le porte dell'ascensore hanno un suono assegnato per defaut, ma è possibile cambiarlo, come nell'esempio seguente:
- snd_open : elavator_outer_open (suono all'apertura delle porte esterne);
- snd_close : elavator_outer_close (suono alla chiusura delle porte esterne);
Trattandosi di cloni delle porte interne, gli altri attributi sono stati ereditati e non vanno modificati.
Ora possiamo clonare le porte esterne e spostare i cloni al piano superiore, deselezionare la coppia, selezionare una delle due anti della porta e correggere solo
i seguenti due Key/vals:
- name : [valore per l'attributo floorDor_2 nelle prorietà dell'ascensore]
(in questo tutorial: piano2);
- team [nome del func_elevator nelle prorietà dell'ascensore]3 (come prima,
il valore deve corrispondere al nome dell'ascensore seguito, in questo caso, da 3. In questo tutorial: lift3;
Il nome della seconda anta non ha importanza e può rimanere func_door_x, dove x sta per la numerazione
progressiva assegnata per default dall'editor. E con le porte abbiamo finito. Non ci rimane che occuparci dei Guis.
4.
Guis
Disegna un piccolo brush accanto alla porta esterna del pian terreno e convertilo in func_static. Da Entity
clicca su Model e carica il seguente modello:
poi premi sul pulsante Gui... e carica il pannello di chiamata:
guis/doors/elevatorcall2.gui
Ora possiamo settare i valori per gli attributi del Gui, come nella figura sotto:
- gui_parm1 : 1 (Indentifica il piano in cui si trova il gui: in questo caso il 1° piano ovvero il pian terreno);
- gui_parm3 : Livello 2 (scritta che comparirà a video indicando il piano superiore; è convenzionale: ci puoi scrivere quel che ti pare);
- gui_parm4 : Livello 1 (come sopra per il piano inferiore);
- target : valore per l'atributo name dell'ascensore (in questo tutorial: lift).
Ci siamo quasi. Ora cloniamo il Gui, spostiamo il clone nel piano superiore e correggiamo solo il seguente Key/val:
- gui_parm1 : 2 (valore per il Gui del piano superiore).
Per finire in bellezza aggiungiamo una luce all'interno dell'ascensore: carica una luce, premi J e riduci il radius
a 128 unità e assegnale un colore a piacimento; poi va su Entity e aggiungi la seguente coppia di key/val:
- bind : valore per l'atributo name dell'ascensore (in questo tutorial: lift).
Abbiamo finito: salva, compila e collauda il tuo ascensore ;)
5.
Test .map
Ecco il lavoro finito. Sotto tovi il link per scaricare il test map, che puoi aprire nell'editor per vedere da vicino come
ho costruito l'ascensore ;)