Aiuto - Cerca - Utenti - Calendario
Versione completa: PRIMI PASSI
OldGamesItalia > Area Dev > AGS - Adventure Game Studio - Il forum italiano > Aiuti tecnici
Pagine: 1, 2, 3
LargoLagrande
Qui potete postare tutte le domande generiche e più frequenti relative all'utilizzo di AGS. Riservato a chi muove i primi passi.

Qualche utente più esperto vi risponderà. in bocca al lupo!
Squall_Leonheart
Ragazzi ho un problema, nonostante come da screen abbia selezionato le aree giuste per il movimento del personaggio, non clicca il "vai a" quando la sua posizione è più in alto del cursore :( come mai?


AprilSkies
Intendi dire che se clicchi al di fuori dell'area "camminabile" non ti cammina?
Oppure intendi dire che se il personaggio è più in alto del cursore?

Stai usando una interfaccia standard? Se sì che tipo? (sierra, 9verbs, verb-coin)?

Non è che dove clicchi ci sono hotspot?

Dammi qualche info in più.
Squall_Leonheart
No non ci sono hotspot in quel punto. Praticamente se clicco sulla parte della parete (che come vedi non ho impostato come walkable areas) si muove verso l'alto, va anche verso Barman. Ma nel resto non si muovo. Sono partito dal Default, l'unica modifica è stata quella di predisporre la visualizzazione della GUI solo quando il mouse scorre nella parte alta.
Anche la Baseline e le edge sembrano apposto. Ti posto vari screen :



Le Regions non sono proprie settate.
AprilSkies
E' un comportamento abbastanza strano, per come lo descrivi.

Visto che sei all'inizio del gioco, immagino hai fatto abbastanza poco, per cui se vuoi, potresti uppare i file "sorgente" (non il gioco compilato) su qualche sharing (tipo dropboz o altro) così gli do un'occhiata.

perché detto così non so proprio a cosa pensare. Non ho mai riscontrato cose strane di questo tipo.
Squall_Leonheart
Dimmi i file che ti servono e te li mando in mp

Comunque per essere più specifico, non clicca tutta la zona in basso in cui normalmente è presente la Gui. Ora nonostante l'abbia impostata in al alto quando il mouse passa lì. Non è che qualche opzione è rimasta in basso e quindi non posso proprio cliccarci?
AprilSkies
A-Ah!

Allora c'era qualcosa in basso!!!

La GUI per esempio!
Quella è una spiegazione!!!

Prima di passarmi i file, fammi uno screenshot dei menù di impostazione delle GUI e scopriamo subito se c'è qualche cose che rimane in basso!

Se non risolviamo ti mando un MP con i fileche mi servono.
Squall_Leonheart
Perdonami ho appena risolto nel gDialogsGui avevo rimasto il valore top a 142 quindi leggeva quello in basso!
Ora ho un altro problema, se voglio rendere la gui visibile attraverso un pulsante, ad esempio la classica Gui di Monkey Island attivata con la barra spaziatrice. Inoltre volevo sapere come accelerare l'animazione della camminata oltre il valore Delay che sta nelle Views, visto che utilizzo un 50 frame blush.gif
Grazie mille per l'aiuto blush.gif!
AprilSkies
Per attivare una GUI con la barra spaziatrice, nulla di più facile.
Vai nel global script e sotto la funzione
on_key_press (che dovresti già avere bell'è pronta se usi il gioco default) scrivi:

if (keycode == eKeySpace)
{
// qui metti il tuo script che fa comparire la gui se è invisibile e, sempre premendo spazio la fa scomparire se visibile
// supponiamo la gui si chiami gPROVA
if (gPROVA.Visible == true) gPROVA.Visible = false;
else gPROVA.Visible = true;
}

Per la camminata, attenzione: il valore "delay" che sta nelle view non influisce sulla camminata. quello serve solo per vedere l'animazione così ti rendi conto.
Il valore del delay usato "in game" si imposta nel menù del personaggio (menù a destra) Lì devi impostare due valori:
Animation Delay e Movement Speed.
Variali finchè non becchi i valori che ti aggradano l'occhio ;-)
Squall_Leonheart
Aggiustato tutto, ma una curiosità :
Se voglio utilizzare mappe più grandi del 320 x 200 come posso fare? :(
Rimanendo la stessa risoluzione però
AprilSkies
CITAZIONE (Squall_Leonheart @ 18 Nov 2014, 22:31) *
Aggiustato tutto, ma una curiosità :
Se voglio utilizzare mappe più grandi del 320 x 200 come posso fare? :(
Rimanendo la stessa risoluzione però


Molto semplice:

Disegna lo sfondo grande a piacimento (ad esempio 1000 x 1000).
Importa lo sfondo nella room.
E fai tutto normalmente (occhio ad una sola cosa: le coordinate degli oggetti sono riferiti alla mappa 1000x1000 - le coordinate del mouse, qualora usi funzioni tipo GetAtScreenX o Y sono riferite allo "schermo" 320x200).
Noterai, testando che il gioco "scrolla" automaticamente seguendo il personaggio biggrin2a.gif

Ovviamente lo scrolling di default è abbastanza rigido e segue il personaggio in maniera fissa.

Se vuoi effetti più "cinematografici" nello scrolling puoi usare il "parallax module" scaricabile sul sito di AGS tra i moduli e plug-ins oppure puoi scriptare un tuo "modulo" di scrolling (ad esempio come quello che ho creato io nel mio gioco in produzione "TALES").
Ma per questo magari aspetta di essere un po' pratico.
Per il momento vapiù che bene lo scrolling di default.
AprilSkies
Edit: avevo erroneamente inviato due risposte identiche.
Squall_Leonheart
Ok, ti ringrazio di tutto.
Lo so che rompo, ma ora ho un nuovo problema XD
Praticamente piazzato l'oggetto, mi si vede così poi in gioco:



AprilSkies
Si vede così perché hai impostato un "walkbehind" sul tavolo che ha un "baseline" maggiore del punto base dell'oggetto, per cui dovresti, nel menù a destra relativo all'oggetto impostare "BaselineOveridden" su true a poi inserire un baseline maggiore del baseline della tua walk-behind area.
Squall_Leonheart
Ho provato a mettere true e baseline 2, dove non ho disegnato le aree ma continua a sovrapporsi il tavolo.
AprilSkies
Metti baseline 300 e vedrai che non si sovrappone più. Prova biggrin2a.gif
probabilmente ci sono disegnate delle walkbehind areas o, in alternativa, il tavolo in questione è un oggetto, e come ogni oggetto ha una baseline, che in tal caso è maggiore della coppa blu ^^
Squall_Leonheart
Ho optato per la baseline 300 xD Scusami ma c'è un modo per spostare la scritta vai etc sopra il cursore?
AprilSkies
Beh, per quello che vuoi fare tu, non c'è una funzione "build-in". Andrebbe "scriptata".
Io ho creato uno script di questo tipo nel mio gioco in produzione "Tales" in ui le descrizioni degli oggetti seguono il cursore.

Ora visto che stai iniziando adesso te ne fornisco uno, spero tu riesca a farlo funzionare. Magari ne approfitti per cercare di capire come funziona e quindi per cercare di capire come usare AGS.

Allora prima cosa: individua (o crea) la GUI che contiene il testo che varia a seconda di quello che fai (quindi il tuo famoso testo "vai verso".. usa questo" ecc.)
Se mi chiedi come posizionarla sul mouse, evidentemente l'hai già bella e pronta e nel gioco default.
Ora, non so come tu l'hai chiamata, ma supponiamo si chiami: gSQUALL_OVER_HOTSPOT

Bene, Operazioni preliminari:
1) Tale gui, che conterrà una "label" il cui testo varia a seconda di cosa c'è sotto il mouse, andrebbe ridimensionata, di dimensioni tali da non essere troppo grande, soprattutto in altezza. Io per sempio credoche l'ho fatta grande tipo 150 x 50. Cmq fai un po' di prove.
2) Imposto lo sfondo e il bordo della gui "TRASPARENTE" (colore 0).
3) POSIZIONA la label TUTTA A SINISTRA rispetto alla gui. Inoltre imposta il testo della label TUTTO A SINISTRA (TopLeft, nel menù di impostazone del centraggio scritta)
4) Fai la label bella larga, anche come la GUI, in modo che il testo, anche se lungo, non vada a capo.

Fatto?

OK. Ora creiamo gli script:

Nel menù a destra, cerca "Scripts". Clicca col destro su "Scripts" e crea un nuovo script.
Chiamalo and esempio MOUSE_FOLLOWER
si creeranno due files:
MOUSE_FOLLOWER.asc e MOUSE_FOLLOWER.ash

Apri MOUSE_FOLLOWER.asc

Lo troverai vuoto (a parte un commento in alto)
NOTA: i commenti sono cose che sono precedute da "//" e non vengono lette dal "compilatore" quindi puoi scriverci ciò che vuoi.
NOTA2: i tuoi codici cerca di commentarli MOLTO, così quando poi li riapri sai cosa fa una parte di codice.

Bene, ora dentro il file MOUSE_FOLLOWER.asc, sotto il commento di intestazione incolla, esattamente, quanto segue:
(copia integralmente)

// COPIA DA QUI ==================================================================
function repeatedly_execute()
{
// di seguito metteremo un operatore logico IF-THEN-ELSE per capire se il mouse si trova o no sopra un oggetto/hotspot/personaggio/item di inventario

if (Hotspot.GetAtScreenXY(mouse.x, mouse.y) == hotspot[0] && Object.GetAtScreenXY(mouse.x, mouse.y) == null && Character.GetAtScreenXY(mouse.x, mouse.y) == null && InventoryItem.GetAtScreenXY(mouse.x, mouse.y) == null)
{
// in questa parte del codice puoi mettere qualcosa che avviene se il mouse NON è sopra nessun oggetto, personaggio oppure hotspot.
// ad esempio puoi fare sì che la GUI scompaia
gSQUALL_OVER_HOTSPOT.Visible = false;
}
else
{
//in questa parte del codice scrivi ciò che avviene se il mouse E' sopra nessun oggetto, personaggio oppure hotspot
// innanzitutto la GUI è visibile
gSQUALL_OVER_HOTSPOT.Visible = true;
//===============
// ricava la larghezza del testo contenuto nella label della GUI
// non so come l'hai chiamata, ma supponiamo tu l'abba chiamata "LABEL_SQUALL_OVER_HOTSPOT"
String TESTO_TEMP; // dichiaro una variabile di tipo stringa
TESTO_TEMP = LABEL_SQUALL_OVER_HOTSPOT.Text; // assegno alla stringa il contenuto della label della gui che vogliamo far seguire il mouse
int TESTO_Width = GetTextWidth(TESTO_TEMP, eFontNormal); //dichiaro una variabile integer e contestualmente ricavo la larghezza del testo. Qui suppongo che abbia usato il font "Normal". se hai usato un altro font, metti il font che hai usato.
int label_position = TESTO_Width / 2; //dichiaro una variabile integer e contestualmente gli assegno il valore pari a metà della larghezza testo
// la "label_position" in pratica mi identifica il punto centrale del testo. Mi servirà per posizionarlo sopra il mouse.
//===============
// Ora devo stare attento che, se il mouse va vicino ai bordi, la scritta non esca fuori dallo schermo.
int label_offset; //dichiaro una variabile di offset
if (mouse.x - label_position < 0) label_offset = 5; //bordo sinistro 5 pixel
else if (mouse.x + label_position > 315) label_offset = 315 - TESTO_Width; //qui suppongo tu abbia la risoluzione larga 320 pixel
else label_offset = mouse.x - label_position;
//===============
//ora posso posizionare la gui, che ricordiamo si chiama gSQUALL_OVER_HOTSPOT
// nel farlo, attenzione, devo far sì che se sposto il mouse troppo in alto, la scritta vada sotto. negli altri casi sta sopra:
//a tal fine individuo una fascia di 50 pixel in alto
if (mouse.y > 50)
{
// sritta sopra, perché il mouse va in basso. ricorda che la Y cresce se vai verso il,basso.
gSQUALL_OVER_HOTSPOT.SetPosition(label_offset, mouse.y - 20); //gli do 20 pixel in alto. poi vedi tu. varia il "20" e vedi come si vede.
}
else
{
//scritta sotto perché il mouse si trova nella parte alta, nella fascia di 50 pixel in alto
gSQUALL_OVER_HOTSPOT.SetPosition(label_offset, mouse.y + 30); //gli do 30 pixel in basso. poi vedi tu. varia il "30" e vedi come si vede.
}
}
}
// COPIA FINO QUI ==========================================

Dovrebbe funzionare, se non ho commesso refusi e se imposti BENE i nomi delle GUI e delle LABEL.
SE CAMBI I LORO NOMI RISPETTO A QUELLO CHE HO SCRITTO IO, MODIFICA IL MIO SCRIPT DI CONSEGUENZA, ALTRIMENTI DARA' ERRORE.


Squall_Leonheart
Mi da un errore qui, ma credo sia io in errore. Ti posto degli screen.
TESTO_TEMP = LABEL_SQUALL_OVER_HOTSPOT.Text;


Mi sembra di aver messo tutti i valori bene, top left etc. Ma credo di sbagliare nome quando richiamo la label, che sta scritto ID 0 ActionLine
AprilSkies
Attenzione, i nomi che ho usato io sono nomi che ho inventato al momento,
Quindi io ho usato, per esempio LABEL_SQUALL_OVER_HOTSPOT ... ma se nel tuo caso la label si chiama ActionLine,
come ti ho scritto, devi rimpiazzare sul mio script LABEL_SQUALL_OVER_HOTSPOT con ActionLine

Stessa cosa per la GUI dentro cui la label si trova, che io chiamato PER ESEMPIO gSQUALL_OVER_HOTSPOT
se a te si chiama diverso devi mettere il nome della GUI reale.

Capito?
Squall_Leonheart
Il font era FontFont0, ho risolto anche i nomi. Però la scritta non si visualizza :(
AprilSkies
Scusa ma nella "label" che utilizzi, cosa hai scritto??

c'è scritto @OVERHOTSPOT@ ?

che label stai utilizzando? è quella del gioco di default che serve per visualizzare il nome delle cose su cui sei sopra con il mouse?
perché dovresti usare quella.

Se l'hai eliminata e se quella che stai usando è vuota, scrivici dentro: @OVERHOTSPOT@

altra cosa che pure devi controllare: ai assegnato dei nomi agli oggetti? perché quella cosa visualizza i "nomi" degli oggetti.
Squall_Leonheart
Tenevo scritto Text, ti mostro uno screen:



Poi ecco il codice dentro MOUSE_FOLLOWER.asc che ho messo nel gioco

function repeatedly_execute()
{
// di seguito metteremo un operatore logico IF-THEN-ELSE per capire se il mouse si trova o no sopra un oggetto/hotspot/personaggio/item di inventario

if (Hotspot.GetAtScreenXY(mouse.x, mouse.y) == hotspot[0] && Object.GetAtScreenXY(mouse.x, mouse.y) == null && Character.GetAtScreenXY(mouse.x, mouse.y) == null && InventoryItem.GetAtScreenXY(mouse.x, mouse.y) == null)
{
// in questa parte del codice puoi mettere qualcosa che avviene se il mouse NON è sopra nessun oggetto, personaggio oppure hotspot.
// ad esempio puoi fare sì che la GUI scompaia
gAction.Visible = false;
}
else
{
//in questa parte del codice scrivi ciò che avviene se il mouse E' sopra nessun oggetto, personaggio oppure hotspot
// innanzitutto la GUI è visibile
gAction.Visible = true;
//===============
// ricava la larghezza del testo contenuto nella label della GUI
// non so come l'hai chiamata, ma supponiamo tu l'abba chiamata "LABEL_SQUALL_OVER_HOTSPOT"
String TESTO_TEMP; // dichiaro una variabile di tipo stringa
TESTO_TEMP = ActionLine.Text; // assegno alla stringa il contenuto della label della gui che vogliamo far seguire il mouse
int TESTO_Width = GetTextWidth(TESTO_TEMP, eFontFont0); //dichiaro una variabile integer e contestualmente ricavo la larghezza del testo. Qui suppongo che abbia usato il font "Normal". se hai usato un altro font, metti il font che hai usato.
int label_position = TESTO_Width / 2; //dichiaro una variabile integer e contestualmente gli assegno il valore pari a metà della larghezza testo
// la "label_position" in pratica mi identifica il punto centrale del testo. Mi servirà per posizionarlo sopra il mouse.
//===============
// Ora devo stare attento che, se il mouse va vicino ai bordi, la scritta non esca fuori dallo schermo.
int label_offset; //dichiaro una variabile di offset
if (mouse.x - label_position < 0) label_offset = 5; //bordo sinistro 5 pixel
else if (mouse.x + label_position > 315) label_offset = 315 - TESTO_Width; //qui suppongo tu abbia la risoluzione larga 320 pixel
else label_offset = mouse.x - label_position;
//===============
//ora posso posizionare la gui, che ricordiamo si chiama gSQUALL_OVER_HOTSPOT
// nel farlo, attenzione, devo far sì che se sposto il mouse troppo in alto, la scritta vada sotto. negli altri casi sta sopra:
//a tal fine individuo una fascia di 50 pixel in alto
if (mouse.y > 50)
{
// sritta sopra, perché il mouse va in basso. ricorda che la Y cresce se vai verso il,basso.
gAction.SetPosition(label_offset, mouse.y - 20); //gli do 20 pixel in alto. poi vedi tu. varia il "20" e vedi come si vede.
}
else
{
//scritta sotto perché il mouse si trova nella parte alta, nella fascia di 50 pixel in alto
gAction.SetPosition(label_offset, mouse.y + 30); //gli do 30 pixel in basso. poi vedi tu. varia il "30" e vedi come si vede.
}
}
}

Gli oggetti nel gioco li ho semplicemente tradotti : bluecup coppablu etc.. Non saprei :/
AprilSkies
Che proprietà hai messo alla GUI gAction?
gli hai messo la proprietà "normal, initially on"?


Mi è venuta in mente una cosa:
POVA A FARE COSI':

1) Assicurati che la GUI gAction sia Normal, initially on

2) Cancella @OVERHOTSOP@, lascia la label VUOTA e IMPOSTA IL ETSTO ALLINEATO A SINISTRA (TOP-LEFT non TOP CENTER)

3) MODIFICA LO SCRIPT COSI':

function repeatedly_execute()
{
// di seguito metteremo un operatore logico IF-THEN-ELSE per capire se il mouse si trova o no sopra un oggetto/hotspot/personaggio/item di inventario

if (Hotspot.GetAtScreenXY(mouse.x, mouse.y) == hotspot[0] && Object.GetAtScreenXY(mouse.x, mouse.y) == null && Character.GetAtScreenXY(mouse.x, mouse.y) == null && InventoryItem.GetAtScreenXY(mouse.x, mouse.y) == null)
{
// in questa parte del codice puoi mettere qualcosa che avviene se il mouse NON è sopra nessun oggetto, personaggio oppure hotspot.
// ad esempio la label è vuota
ActionLine.Text = "";
}
else
{
//in questa parte del codice scrivi ciò che avviene se il mouse E' sopra nessun oggetto, personaggio oppure hotspot
//===============
// ricava la larghezza del testo contenuto nella label della GUI
// non so come l'hai chiamata, ma supponiamo tu l'abba chiamata "LABEL_SQUALL_OVER_HOTSPOT"
String TESTO_TEMP = Game.GetLocationName(mouse.x, mouse.y); // dichiaro una variabile di tipo stringa e gli assegno il nome dell'oggetto su cui è
ActionLine.Text = TESTO_TEMP; // assegno alla label il contenuto di text temp
int TESTO_Width = GetTextWidth(TESTO_TEMP, eFontFont0); //dichiaro una variabile integer e contestualmente ricavo la larghezza del testo. Qui suppongo che abbia usato il font "Normal". se hai usato un altro font, metti il font che hai usato.
int label_position = TESTO_Width / 2; //dichiaro una variabile integer e contestualmente gli assegno il valore pari a metà della larghezza testo
// la "label_position" in pratica mi identifica il punto centrale del testo. Mi servirà per posizionarlo sopra il mouse.
//===============
// Ora devo stare attento che, se il mouse va vicino ai bordi, la scritta non esca fuori dallo schermo.
int label_offset; //dichiaro una variabile di offset
if (mouse.x - label_position < 0) label_offset = 5; //bordo sinistro 5 pixel
else if (mouse.x + label_position > 315) label_offset = 315 - TESTO_Width; //qui suppongo tu abbia la risoluzione larga 320 pixel
else label_offset = mouse.x - label_position;
//===============
//ora posso posizionare la gui, che ricordiamo si chiama gAction
// nel farlo, attenzione, devo far sì che se sposto il mouse troppo in alto, la scritta vada sotto. negli altri casi sta sopra:
//a tal fine individuo una fascia di 50 pixel in alto
if (mouse.y > 50)
{
// sritta sopra, perché il mouse va in basso. ricorda che la Y cresce se vai verso il,basso.
gAction.SetPosition(label_offset, mouse.y - 20); //gli do 20 pixel in alto. poi vedi tu. varia il "20" e vedi come si vede.
}
else
{
//scritta sotto perché il mouse si trova nella parte alta, nella fascia di 50 pixel in alto
gAction.SetPosition(label_offset, mouse.y + 30); //gli do 30 pixel in basso. poi vedi tu. varia il "30" e vedi come si vede.
}
}
}

VEDI SE VA
Squall_Leonheart
Ora si muove col cursore, però non mi legge gli oggetti nella mappa :(
E comunque non è precisa sopra il cursore
AprilSkies
in che senso non ti legge?
spiegati meglio.
Cosa appare scritto?
Squall_Leonheart


Questo sulla coppa blu e sull'armadio invece proprio niente, mentre prima dello script usciva tranquillamente
AprilSkies
fai questa prova:
Crea un'altra gui e un'altra label, con altri nomi e usa quelle nello script.
Vedi cosa succede.
Squall_Leonheart
Ma ora che ci penso, non faccio prima a mettere nella stessa immagine con quella del cursore?
AprilSkies
No.
Cmq ora ho visto l'immagine, prima non la vedevo.
Stai usando i 9-verbs!!!!!!

Ora ho capito perché non ti va.

Cmq, ora devo uscire, proseguiamo domani.

Nel frattempo fai la prova che ti ho detto (crea altra GUI e altra label e metti quelle nello script), così capisci cosa fa lo script.
(e così inizi ad imparare il linguaggio)

Poi domani lo modifichiamo in modo che vada bene anche il 9-Verbs ;-)

a domani
Squall_Leonheart
Va bene, aspetto una tua risposta, intanto testo e nel caso edito blush.gif
AprilSkies
Ho appena provato lo script che ti avevo dato la prima volta....

in realtà.. FUNZIONAVA PERFETTAMENTE!

A te non funzionava per un semplice motivo..... che è lo stesso per cui all'inizio non ti cliccava l'area camminabile: ovverosia la GUI.

La gui che ti portavi a spasso con il mouse era troppo grande e andava a finire sopra al puntatore.

ORA segui attentamente queste piccole istruzioni:

CANCELLA LO SCRIPT CHE HAI ADESSO E INCOLLA QUESTO SCRIPT (che poi era quello originario), senza cambiare nulla:

//COPIA DA QUI ==============
function repeatedly_execute()
{
if (Hotspot.GetAtScreenXY(mouse.x, mouse.y) == hotspot[0] && Object.GetAtScreenXY(mouse.x, mouse.y) == null && Character.GetAtScreenXY(mouse.x, mouse.y) == null && InventoryItem.GetAtScreenXY(mouse.x, mouse.y) == null)
{
gAction.Visible = false;
}
else
{
gAction.Visible = true;
String TESTO_TEMP; // dichiaro una variabile di tipo stringa
TESTO_TEMP = ActionLine.Text; // assegno alla stringa il contenuto della label della gui che vogliamo far seguire il mouse
int TESTO_Width = GetTextWidth(TESTO_TEMP, eFontFont0); //dichiaro una variabile integer e contestualmente ricavo la larghezza del testo. Qui suppongo che abbia usato il font "Normal". se hai usato un altro font, metti il font che hai usato.
int label_position = TESTO_Width / 2; //dichiaro una variabile integer e contestualmente gli assegno il valore pari a metà della larghezza testo
int label_offset; //dichiaro una variabile di offset
if (mouse.x - label_position < 0) label_offset = 5; //bordo sinistro 5 pixel
else if (mouse.x + label_position > 315) label_offset = 315 - TESTO_Width; //qui suppongo tu abbia la risoluzione larga 320 pixel
else label_offset = mouse.x - label_position;
if (mouse.y > 50)
{
gAction.SetPosition(label_offset, mouse.y - 20); //gli do 20 pixel in alto. poi vedi tu. varia il "20" e vedi come si vede.
}
else
{
gAction.SetPosition(label_offset, mouse.y + 10); //gli do 30 pixel in basso. poi vedi tu. varia il "30" e vedi come si vede.
}
}
}
//COPIA FINO QUI ==============

POI IMPORTANTE:

VAI NELLA GUI gAction
e cambia questi parametri:
gAction ----> MENU a destra HEIGHT di default il valore è 57, tu portalo a 10 <---- molto importante
label ActionLine ----> MENU a destra TextAlignement di default è "topMiddle" , tu portalo a TOP-LEFT <---- molto importante
Squall_Leonheart
Il risultato purtroppo è questo, avevo dimenticato di dirti che all'inizio la GUI non è visibile, la tolgo e metto attraverso il tasto F

AprilSkies
Metti l label all'interno della GUI in alto, il più alto possible.
E poi ricorda: metti l'allineamento a SINISTRA

Ti fa così perché hai lasciato il testo centrato.
Squall_Leonheart
Bene adesso va con tranquillità blush.gif Grazie mille, se avrò ancora problemi riposterò!
Squall_Leonheart
Eccomi di nuovo, non mi è chiara una cosa.
Cercavo di creare un animazione della porta che si apre, ora ho capito il comando per riprodurre un suono e quello per muovere il personaggio nella stanza e per fargliela cambiare. Però non riesco a far muovere un oggetto. Per creare questa piccola animazione, avevo pensato funzionasse questo comando "MoveObject (1, 15, 100, 0) ;" Ma mi sbagliavo. Quindi mi chiedevo innanzitutto se la mia scelta, ossia quella di muovere la porta e poi cambiarle grafica fosse giusta, e nel caso anche quale comando si usa per intendere il movimento di un oggetto. Consigli?
AprilSkies
Allora bisogna distinguere due casi:

- Animazione propriamente detta, ovverosia una sequenza di immagini (una sequenza di sprites) che si susseguono ad una certa velocità (esattamente come l'animazione del personaggio che cammina)

- Movimento di un oggetto su schermo, ovverosia il traslare quest'ultimo da una posizione ad un'altra, ad una certa velocità.

NOTA: le due cose si possono anche "combinare" ovvero un oggetto mentre si muove può anche essere animato.

Nel primo caso, Animazione propriamente detta, è necessario creare una "view" a all'interno della view uno o più "loop" di animazioni.
Quindi si "assegna" preliminarmente una "vista all'oggetto, tramite script: Esempio oCup.SetView(..., ..., ..) VEDI MANUALE PER MAGGIORI DETTAGLI
Poi si può eseguire l'animazione. Il comando è oCup.Animate(..........) VEDI MANUALE PER MAGGIORI DETTAGLI

Nel secondo caso, il comando è oCup.Move(X, Y, velocità ecc. ecc.....) VEDI MANUALE PER MAGGIORI DETTAGLI
Squall_Leonheart
Grazie blush.gif
Ora purtroppo ho un altro problema, avevo creato un interruttore della luce, poi avevo pensato di renderlo interaggibile e quindi di cambiare frame del background per luce accesa o spenta.. Però mi succede che il gioco si blocca. Se metto Background 0 invece non fa nulla. Vi posto lo script :

function hLuce_AnyClick()
{
if(UsedAction(eGA_LookAt)) {
player.Say("L'interrutore della luce.");
}
else if(UsedAction(eGA_Use)) {
SetBackgroundFrame(2);
}
else Unhandled();
}


AprilSkies
Prova:

function hLuce_AnyClick()
{
if(UsedAction(eGA_LookAt)) {
player.Say("L'interrutore della luce.");
}
else if(UsedAction(eGA_Use))
{
if (GetBackgroundFrame()==0) SetBackgroundFrame(1);
else SetBackgroundFrame(0);
}
else Unhandled();
}
Squall_Leonheart
Ma come si disattiva l'animazione della stanza? Perché ora è animata.
AprilSkies
devi bloccarla all'inizio, in RoomLoad scrivendo SetBackgroundFrame(0)
Squall_Leonheart
Riuscito blush.gif!
Squall_Leonheart
Aspetta dimenticavo di dirti che accendevo e spegnevo delle REgions..
if (GetBackgroundFrame()==0) SetBackgroundFrame(1);
else SetBackgroundFrame(0);
region[1].Enabled = true;
region[2].Enabled = true;
region[0].Enabled = false;
}
else Unhandled();
}
Così quando la uso si muovono quelle regions però quando ho bisogno di invertirle di nuovo mi da un errore se le affianco a Get..
AprilSkies
Occhio che così non le accendi spegni correttamente biggrin2a.gif

dovresti fare una cosa del genere:

.....
if (GetBackgroundFrame()==0)
{
SetBackgroundFrame(1);
region[1].Enabled = true;
region[2].Enabled = true;
region[0].Enabled = false;
}
else
{
SetBackgroundFrame(0);
region[1].Enabled = false;
region[2].Enabled = false;
region[0].Enabled = true;
}
}
else Unhandled();
}
Squall_Leonheart
Una curiosità, associando una Region e quindi uno schiarimento del pg in base all'apertura o meno della porta, scrivendo il codice in questo modo sarebbe corretto?

if (GetBackgroundFrame()==0)
{
SetBackgroundFrame(1);
region[1].Enabled = true;
region[2].Enabled = true;
region[0].Enabled = false;
if (hPorta.Enabled ()==true) {
region[3].Enabled = true;
}
else
{
region[3].Enabled = false;
}
}
else
{
SetBackgroundFrame(0);
region[1].Enabled = false;
region[2].Enabled = false;
region[3].Enabled = false;
region[0].Enabled = true;
}
}
else Unhandled();
}
AprilSkies
Ciao SQ
Scusa il ritardo.

Detto così faccio un po' fatica a seguirti.
Spiegami meglio cosa vuoi fare. L'ideale sarebbe che tu editassi il post precedente aggiungendo dei commenti per spiegare, in ogni riga, cosa vorresti fare. Così riesco a dirti se il codice fa o meno quello che hai in mente. E, in caso contrario, ti dico come fare.
I commenti sono importanti. Cerca di prendere "il vizio" di metterli.

P.S. C'è cmq un errore di sintassi togli () da hPorta.Enabled
Si scrive hPorta.Enabled e basta.
Squall_Leonheart
Ti spiego subito , ho due problemi. Il primo è che avendo la porta all'ingresso che si apre, se a luce spenta nella stanza la apro, dovrebbe attivarsi la region che gestisce la luce proveniente da fuori.
Due, Gestisco la stessa stanza in due room. Una per una metà e una per l'altra. Quindi volevo attribuire il cambio sfondo in due stanze per quel solo interruttore. Ora riflettendoci credo che bisognerebbe attribuirlo ad una variabile e scriptare questo:
// dichiaro variabile
int LUCE

LUCE == 0

Se comando usa su interrutore della luce
se sfondo zero passa ad uno e fissa LUCE a 1
Altrimenti
sfondo zero e luce a 0

E poi nell'altra stanza mettere la condizione :
Se luce è 0 sfondo zero, se luce e 1 sfondo 1.

Sono stato comprensibile?
AprilSkies
Quella della variabile è un'ottima idea, però attento ad una cosa:
Se dichiari una variabile in una stanza essa non viene letta nell'altra stanza.
Nel vecchio AGS (versione 2.7 e precedenti) bisognava "esportare" le variabili il che era fastidioso.
Ora, dalla versione 3 in poi, per fortuna esiste una cosa utilissima che si chiama "GLOBAL VARIABLE" ... ecco scoperto a cosa serve, nel menù a destra la voce "global variables". vai lì e crea lì dentro una variabile globale che si chiama "luce" biggrin2a.gif

A quel punto sì, la tua idea può funzionare!

IMPORTANTE:
ogni volta che entri in una stanza, in RoomLoad
metti uno script che se luce == 1 imposta le regions e gli sfondi in modo giusto ;-)
Squall_Leonheart
Ho fatto così ma mi da un errore di sintassi :/

function hLuce_AnyClick()
{
if(UsedAction(eGA_LookAt)) {
player.Say("L'interrutore della luce.");
}
else if(UsedAction(eGA_Use))
{
MovePlayer(20, 167);
if (GetBackgroundFrame()==0)
{
SetBackgroundFrame(1);
Luce = 1;
region[1].Enabled = true;
region[2].Enabled = true;
region[0].Enabled = false;
if hPorta.Enabled = true
region[3].Enabled = true;
}
else
region[3].Enabled = false;
}
else
{
SetBackgroundFrame(0);
Luce = 0;
region[1].Enabled = false;
region[2].Enabled = false;
region[0].Enabled = true;
}
}
else Unhandled();
}
AprilSkies
Quando ti da errore di sintassi, però devi annotarti in quale riga te lo da e magari evidenziarmela...
cmq ce n'è uno abbastanza lampante:
RICORDA: gli operatori logici come IF, WHILE ecc. Vogliono l'argomento tra parentesi,
inoltre quando attribuisci un valore ad un variabile si usa "=" quando vuoi verificare un'ugualianza, invece, devi scrivere "=="

tu ad esempio hai scritto:
if hPorta.Enabled = true
invece dovrebbe essere if (hPorta.Enabled == true)

inoltre move player non esiste, al più è player.Move... e cmq è meglio usare la funzione "walk" così se hai il walkcycle lo usa automaticamente.

CITAZIONE (Squall_Leonheart @ 27 Nov 2014, 20:58) *
Ho fatto così ma mi da un errore di sintassi :/

function hLuce_AnyClick()
{
if(UsedAction(eGA_LookAt)) {
player.Say("L'interrutore della luce.");
}
else if(UsedAction(eGA_Use))
{
Player.Walk(20, 167,eBlock,eWalkableArea);
if (GetBackgroundFrame()==0)
{
SetBackgroundFrame(1);
Luce = 1;
region[1].Enabled = true;
region[2].Enabled = true;
region[0].Enabled = false;
if (hPorta.Enabled == true) region[3].Enabled = true;
}
else region[3].Enabled = false;
// DA QUI IN POI HAI FATTO UN PASTICCIO CON LE PARENTESI GRAFFE c'è un else che chiude le if delle azioni e poi else unhandled.....
}
else
{
SetBackgroundFrame(0);
Luce = 0;
region[1].Enabled = false;
region[2].Enabled = false;
region[0].Enabled = true;
}
}
else Unhandled();
}


TI PREGO, METTI I COMMENTI PRIMA DI OGNI BLOCCO E SPIEGAMI COSA VUOI FARE
Così controllo se il codice lo fa o meno.

Questa è la versione 'lo-fi' del forum. Per visualizzare la versione completa con molte più informazioni, formattazione ed immagini, per favore clicca qui.
Invision Power Board © 2001-2019 Invision Power Services, Inc.