|
GIUBBE
SOFTWARE
|
Guida psMenu |
![]() |
|
|
|
![]() |
![]() |
![]() |
|
|
Sezione sheet, i Comandi Eccoci arrivati al fulcro del programma, fino ad ora è stato facile, ora comincia la parte complicata... ma non troppo. Eravamo rimasti qui [SHEET 1] e allora andiamo con ordine. La prima azione da considerare è la 00 relativa all'item01. Per indicare a psMenu che stiamo lavorando sull'azione 00 basta usare la direttiva ActionXX, dove XX è il numero dell'azione. Action00= Questa direttiva è scritta subito sotto l'ultimo Item e a destra del simbolo "uguale" ha una lista di comandi. Una cosa che ancora non ho detto è come inserire i commenti nello script, questa operazione si fa aggiungendo un punto e virgola ; all'inizio della riga. Lo stesso simbolo (;) serve anche per separare i comandi gli uni dagli altri nella lista. Una parentesi, come creare un file .bsi (.mkv, .ogm) corretto per psMenu Come già sapete psMenu usa bsPlayer e
quest'ultimo usa i file .bsi per la configurazione dei filmati. PsMenu
ha bisogno di leggere alcuni parti del file .bsi per un corretto
funzionamento di alcune funzioni. L'unica parte in cui bisogna prestare
la massima attenzione è dove si descrivono i capitoli. [ChaptersX] dove X è il numero del CD, hh:mm:ss
è il classico formato in ore, minuti, secondi e startime
è opzionale, ma deve essere presente dal secondo cd in poi. Il
suo formato può essere anche in frame (cosa proibita per i
capitoli). [Chapters1] Il terzo capitolo comincia al minuto 18:00 e
termina al minuto 55:14, ma dato che il secondo CD comincia al minuto
20:00 occorre dividere il capitolo terzo in due parti, la seconda parte
deve cominciare nello stesso minuto di inizio del secondo CD,
cioè 20:00 I comandi Per la sintassi dei singoli comandi e per la lista completa vi rimando al manuale, qui vedremo "solo" come metterli insieme per ottenere ciò che desideriamo. La prima cosa che richiede il menù è avviare il filmato con la lingua di base e i sottotitoli "forced", abbiamo anche deciso che dopo che il filmato è stato avviato non ci serve più il menù. Se il file è un ogm o mkv suppongo che il primo sottotitolo sia quello "forced", il secondo sia quello "presa diretta", il terzo "commento suo", lo stesso ordine è supposto nel file .bsi, dove per default è caricato il sottotitolo "forced". Per semplicità di esposizione anche i
due flussi audio sono nell'ordine appena descritto (1: "presa diretta",
2: "commento suo"). Per avviare il filmato useremo il comando openbsi (o openogm per i file .ogm e .mkv), quindi la nostra riga sarà: Action00=openbsi("..\filmato.bsi",1,0,0,0) supponendo che il file filmato.bsi sia nella cartella superiore rispetto al menu (in genere è consigliabile mettere il menu e i suoi file in una cartella separata). L'altra azione che volevamo compiere è la chiusura del menu: Action00=openbsi("..\filmato.bsi",1,0,0,0);close Ed eccoli qua, gli unici due comandi che
vengono eseguiti in parallelo da psMenu. Se il comando close
è preceduto immediatamente (nella sintassi, non nella logica) da
un comando di apertura file allora viene avviato il programma in grado
di leggere il file (chi ha detto bsplayer?) e contemporaneamente chiuso
lo script e quindi psMenu. Avevo detto che si poteva scegliere la lingua e quant'altro, ma nel comando appena visto questa possibilità non c'è. Manca perché non ho ancora introdotto due comandi fondamentali: Memory e action. Da un'altra parte ho dichiarato che si può scrivere uno script per psMenu senza mai utilizzare quei due comandi, è vero, ma in questa guida voglio essere un po' più completo. Una altra osservazione è per action. L'abbiamo vista come indice (Action=, nella direttiva Item), come direttiva (ActionXX) e ora la vediamo come comando (Action), in ogni modo non dovrebbe creare confusione. Il comando action, come già sapete (il manuale...) non è altro che un comando di salto, che unito al comando per aprire le pagine (opensheet), è il responsabile della presenza di istruzioni in sospeso (fra poco sarà più chiaro). Il comando Memory è uno dei comandi poliedrici di psMenu, nel senso che ha comportamenti diversi dipendentemente dalla sintassi usata, in particolare se è presente un solo parametro questo sarà considerato come indice della cella di memoria e il comando sarà di lettura della cella, se i parametri sono due allora il primo è ciò che va scritto nella cella di memoria indicata dal secondo parametro. Ammettendo che la cella 0 contenga il numero del sottotitolo e la cella 1 contenga il numero della lingua, la direttiva Action00 (da ora la chiamerò lista di comandi o riga XX) la possiamo scrivere così: Action00=openbsi("..\filmato.bsi",1,Memory(0),Memory(1),0);close Se qualcuno si sta domandando quali siano i valori iniziali delle due celle di memoria, deve rileggere la prima parte di questa guida. Gli altri ricorderanno che in DefaultMemory si è deciso di assegnare i valori 0 ad entrambe le celle. Per ora non è cambiato nulla nel programma, ma l'uso della memoria rende quella riga molto più flsessibile, basta cambiare il valore delle celle per ottenere un comportamento diverso. Due note importati. La prima riguarda il fatto che non si può andare a capo (cioè premere "invio" prima della fine della riga stessa) durante la scrittura di una riga, e la seconda è che viene eseguita solo la riga indicata, le altre sono ignorate. Se si desidera continuare i comandi nella riga successiva occorre usare il comando action. Ora bisogna scrivere la parte di script che fa scegliere i valori da inserire nelle due celle di memoria, ma prima occorre scrivere la pagina due. Chiudere due discorsi lasciati in sospeso. Vorrei chiudere due discorsi che avevo rimandato. Il primo riguarda la sequenzialità sintattica e logica del comando close, la seconda riguarda DefaultAction. Le seguenti righe: Action00=Openfile("miofile.avi",1);close e Action01=Openfile("miofile.avi",1);Action(02) hanno la stessa logica (o quasi), cioè avviano il filmato e chiudono il programma, ma la riga 00 lo fa in un unica operazione, mentre la riga 01 aspetta prima che sia finita l'esecuzione di OpenFile e quindi del filmato e poi esegue il salto ed infine chiude il programma Resta da vedere un esempio di limitazione nell'uso di cache e di DefaultAction con memory. Poniamo che nelle celle 7 e 8 siano memorizzati rispettivamente i valori 3 e 0. [SHEET 1] Senza considerare l' inutilità (o quasi!) di questo esempio e sapendo che OpenSheet(X) apre la pagina X, cosa fa questo piccolo script? (tenete presente che la sezione Main e le altre sono quelle scritte in precedenza) Va in loop? (cioè continua a girare dentro se stesso dando l'impressione che il programma sia bloccato?) Ai più distratti ricordo che tutte le direttive hanno un valore di default (vedi manuale), cioè sono presenti anche se non esplicitamente scritte. Il valore di default per cache è 1. Per rispondere alle due domande vediamo
passo-passo il comportamento. E' questa la limitazione di cui parlavo, se la direttiva DefaultAction permette l'inserimento del numero di pagina nella memoria, poi qualsiasi valore dei parametri di defaultaction sarà ignorato. Se invece avessimo voluto che ad ogni apertura della prima pagina venisse mostrata la lingua e il sottotitolo scelto e poi avviato il filmato allora bisogna fare in modo che il numero di pagina non sia mai inserito in memoria, per far questo occorre impostare a zero la direttiva cache. In questo caso per terminare il ciclo occorre mettere a -1 uno dei due parametri di DefaultAction. In verità in questo caso il ciclo termina non appena si sposta il mouse, non occorre mettere a -1 uno dei due parametri di DefaultAction. La risposta alla seconda domanda (se va in loop) è ovviamente no anche nel caso di cache=0 (nel senso che si può uscire spostando il mouse e premendo il tasto esci), ma ciò non toglie che alcuni script scritti male possono mandare in loop il programma psMenu. Vi state chiedendo come mai la riga 03 mostra la frase che ho scritto prima? Il merito va alla direttiva VisMemory nella sezione Main (diceva di mostrare il contenuto della memoria 3 e 4) e alla sezione Format. Il comando Memory(Memory(3),3) dà il via a VisMemory, nel senso che scrive nella cella 3 (secondo parametro di Memory più sinistra) il contenuto della cella 3 (il primo parametro di Memory più a sinistra è Memory(3), cioè prendo il contenuto della cella 3). Il comando non modifica il contenuto nella cella, dato che ci scrive lo stesso valore presente, ma tanto basta a VisMemory per entrare in funzione. Per vedere un esempio di operazione in sospeso vi rimando alla descrizione del comando Action nel manuale. La creazione della seconda pagina Ormai è chiaro (o quasi, alcune cose non le ho ancora spiegate) come sarà la pagina numero 2, eccola: [SHEET 2] Tutto ciò che è in corsivo dovrebbe essere chiaro, le righe da 00 a 05 non fanno altro che aprire le pagine indicate dall'argomento del comando OpenSheet Le righe da 10 a 12 non sono complicate, ma necessitano di una spiegazione in più. Ad ogni pressione del terzo pulsante si cambia la sua intestazione, in pratica si alternano le scritte attivato e disattivato. Il comando contenuto nella riga 10 è
detto anche salto incondizionato indiretto, nel senso che ci
sarà comunque un salto da qualche parte, ma a priori non
è dato sapere dove perchè dipende dal contenuto della
memoria. All'inizio dello script abbiamo messo il valore 11 all'interno
della cella 5 (si è fatto con la direttiva DefaultMemory
in Main) e quindi la riga 10 è come se fosse action(11),
cioè salta alla riga 11. Siamo sicuri che quanto esposto funziona? Stai
pensando che se te lo chiedo la risposta non può che essere
negativa? Hai indovinato. A questo problema ci sono due soluzioni, una facile per noi, ma antiintuitiva per chi usa il menu (che poi potremmo essere sempre noi), e l'altra un po' più complicata, ma perfettamente coerente con l'intuizione. Cominciamo dalla prima. A questo punto dovrebbe essere chiaro quello che si deve fare, bisogna fare qualcosa quando si entra nella pagina e prima che l'utente possa effettuare le sue scelte. Esiste un meccanismo che consente di fare ciò? Chi ha risposto no deve rileggere tutto! (quanto sono cattivo!). Gli altri hanno capito che bisogna utilizzare la direttiva DefaultAction con i parametri del caso 2, cioè: [SHEET 2] In questo modo all'apertura della pagina si eseguiranno le azioni indicate nella riga 20. L'idea più semplice che può venire in mente per questa riga è il ripristino delle condizioni iniziali: Action20=Memory("06",6);Memory("11",5) Come si diceva questa riga rende il menu antiintutivo perchè il pulsante viene riportato alla condizione iniziale anche se l'utente aveva solo l'intezione di controllarne lo stato. Questo può portare anche incertezza nell'uso del menu, perchè si potrebbe pensare che il tasto non funziona (esco e rientro e trovo sempre il valore originale). D'accordo che lo abbiamo scritto noi e quindi sapiamo come funziona, ma se lo volessimo riusare tra qualche mese? Quello che vogliamo è che lo stato indicato dal terzo pulsante sia sempre coerente con il contenuto nella memoria, cioè la pagina si ricordi quale impostazioni abbiamo scelto. Ecco come si fa: Action20=ifjump(Memory(6),07,"=",21);Items.Rename("Capitolo
singolo: disattivato",3) Non è difficile, si deve solo usare un salto condizionato. In queste due righe non si cambia lo stato della memoria, si cambia solo la scritta che appare nel menu in modo da risultare coerente con lo stato della memoria. Se il contenuto della cella 6 vale 07 allora avevamo scelto di attivare la possibilità di vedere un capitolo alla volta (capitolo singolo: attivato) e di conseguenza lo si deve scrivere, cosa che fa la riga 21. Se invece il contenuto della cella 6 vale 06 si prosegue con il comando successivo che guarda caso scrive il testo di default per il terzo pulsante. In verità si poteva anche omettere il comando Item.rename nella riga 20 perchè il menu è stato già scritto in modo corretto dalla direttiva Item03. Il motivo per cui ho usato valori come 07 e 06 al posto dei più classici 0 e 1 sarà chiaro più avanti. Una nota importante riguarda il comando ifjump, questo è un esempio di quanto esposto all'inizio circa al tipo di dato contenuto nella cella. In questo caso abbiamo "07" nella cella numero 6 e lo confrontiamo con 07 (senza virgolette) nel comando ifjump. Come ho scritto in precedenza i numeri "n", "0n" e n, con n numero intero sono tutti considerati uguali e in particolare sono numeri o parole a seconda dell'uso che se ne fa. C'è solo un'eccezione che si presenta con l'istruzione add (che vedremo in seguito) perchè deve avere comportamenti diversi a seconda di cosa gli si chiede di sommare. Anche nell'istruzione ifjump è possibile utilizzare una cella di memoria al posto dell'indirizzo di salto, in questo caso si parla si salto condizionato indiretto che ha usi analoghi al salto incodiziona indiretto. Si è visto come creare un pulsante con stato con un menu testuale, ma in menu DVD like come si fa? Occorre preparare due immagini identiche tranne nello stato del pulsante e poi caricare di volta in volta l'immagine corretta. Vedremo una cosa analoga quando arriveremo alla pagina degli extra, in verità si farà qualcosa di diverso, ma una volta imparato è facile fare qualche cambiamento. Uno sguardo veloce alle pagine della lingua e dei sottotitoli. In queste non ci sarà nulla di nuovo e quindi vedremo solo poche righe dato che le altre sono identiche. Potremmo anche pensare di creare qualcosa di più sosfisticato. Se per esempio avessimo più filmati con caratteristiche (lingua e sottotitoli) diverse, si potrebbe costruire più pagine per ogni filmato e una sola pagina per le lingue e i sottotitoli, ma con entrate diverse, una per ogni tipo di filmato. Supponiamo di avere un filmato con due lingue e uno con una lingua sola, nel caso si scelga una lingua non presente si deve essere avvertiti dell'errore. [SHEET 3] [SHEET 4] [SHEET 5] A questo punto non dovrebbe essere complicato capire il codice appena scritto. Nella pagina 3 si apre la pagina 5 e si esegue la riga 10. Ricordo ai più distratti (o che non hanno letto il manuale) che Action lavora sulla pagina corrente e OpenSheet rende corrente la nuova pagina aperta, quindi la riga 02 della sezione Sheet 3 fa eseguire il codice contenuto nella riga 10 della pagina 5. Lo stesso vale per la riga 01 di pagina 4, ovviamente eseguirà la riga 11. Nella pagina 5 quando l'utente preme il tasto per la seconda lingua dovremmo prima controllare che il filmato abbia due lingue (informazione contenuta nella cella 3) e i caso che ciò non fosse viene eseguita la riga 05, altrimenti si cambia la lingua. Riprendiamo il nostro esempio e vediamo come cambaire la lingua [SHEET 3] Il primo comando della riga 01 chiederà alla riga 00 della pagina 1 di caricare la prima lingua del filmato, il secondo comando chiederà a VisMemory di scrivere in alto a sinistra la frase "Commento in presa diretta", analogamente la seconda riga. Capitoli singoli e continui Anche qui potremmo essere molto veloci in quanto ormai abbiamo abbastanza dimestichezza con i comandi. Sostanzialmente abbiamo un elenco di capitoli che faremo partire in base alle scelte dell'utente. Contrariamente agli esempi forniti con psMenu faremo partire i capitoli scelti direttamente da questa pagina. [SHEET 5] Quello che succede ora dovrebbe essere chiaro,
nella cella 6 è memorizzata la riga a cui si salta (ecco
perchè ho usato quesi valori "strani", se avessi usato 0 e 1 ora
sarei costretto ad eseguire un salto condizionato). Le celle 0 e 1
contengono la lingua e il sottotitoli, mentre la cella 2 contiene il
capitolo da cui iniziare la visione, infine la cella 9 contiene il
capitolo in cui terminare la visione ed è usata solo
dall'istruzione Openbsi.stop. Da notare che il numero che indica su quale cd
cercare il capitolo è sempre 1 anche se in verità il
capitolo stesso si trova sul secondo cd. E' solo una scelta, si dice a
psMenu di cercare il file miofilm.bsi sul primo cd e sarà poi
bsplayer che chiederà di inserire il secondo cd, nel secondo cd
lo script sarà lievemente diverso in quanto sarà indicato
sempre il cd numero 2. Si poteva anche scrivere il cd corretto, in
questo modo è psMenu che chiede di inserire il cd giusto prima
di proseguire. Se usi il bsPlayer 1.x leggi la nota allegata al
programma. Extra (in formato grafico) Ed eccoci all'ultima parte del menu che
presenterà una serie di fotografie. Su ognuna di esse si sono
aggiunti tre selettori (e volendo anche una cornice) con un editor
grafico. Il primo selettore (non presente nella prima foto) mostra la
foto precedente, il secondo esce, e il terzo selettore (non presente
nell'ultima foto) mostra la foto successiva. [SHEET 4] A questo punto dovrebbe essere tutto chiaro,
le prime tre direttive caricano le immagini e gli hotspot, poi a
seconda di quale hotspot si prema saranno eseguite le relative
istruzioni. Le righe 01 e 10 non sono necessarie perchè nella
prima e ultima foto manca l'hotspot corrispondente, ma così mi
sembrava più completo. E' possibile ottenere la stessa cosa (o quasi) senza usare il menu grafico? Si, si deve aver installato sul pc un visualizzatore di immagini jpg e si deve usare nello script il comando openfile.memory, in questo caso non ci si deve preoccupare dell'estensione perchè ci pensa il comando a mettere le cose a posto, ma in compenso ci si deve preoccupare di costruire un ciclo (nel caso visto il ciclo è effettuato gratis dall'utilizzatore). Ovviamente con openfile.memory non si potrà andare avanti e indietro e per proseguire nella visione si deve chiudere il programma di visualizzazione, inoltre non è possibile interrompere la sequenza. Per sapere come utilizzare il comando si rimanda al manuale, mentre per conoscere un esempio di ciclo si rimanda al file demo.psmu contenuto negli esempi forniti con psMenu (il ciclo è desritto nella prima voce del menu). Per come è stato scritta la pagina quattro ogni volta che si rientra sarà mostrata l'ultima foto vista, se si desidera ricominciare sempre dall'inizio occore modificare la pagina 2 in modo da caricare i dati per visualizzare la prima immagine prima di passare alla pagina quattro. Conclusioni. Siete arrivati fin qui? Avete avuto una pazienza infnita, grazie. Se avete un qualsiasi problema con questa guida o avete un qualsiasi commento (positivo è meglio ^_^) , o ancora avete un problema con psMenu non dovete far altro che contattarmi. L'indirizzo è segnato in contatti.
![]() Alcuni diritti riservati. Questa guida è pubblicato sotto una Licenza Creative Commons. Per un uso diverso da quello indicato nella licenza si prega di contatatre l'autore. |
|---|