Jump to content

Recommended Posts

Posted

Salve a tutti!

Premetto che ho cercato e l'unico topic adatto era dedicato principalmente a phyton (il motore di ricerca fa pena, con la parola programmazione il topic suddetto è alla 4a paginna su 5 e indovinate come si chiama??? :-D "Programmazione") quindi ho pensato di aprirne uno nuovo perchè ho un problema con un linguaggio insolito...

Sto cercando di capire come programmare un videogioco stile Monkey Island (sono solo delle prove che sto facendo) con AGS Editor 3.1 e ho un problema che potete risolvere anche se non conoscete il linguaggio!

In poche parole sullo sfondo c'è disegnato un pilastro e c'è una mattonella a terra con sotto nascosta una chiave che diventerà visibile solo quando osserverò o poi in seguito dopo aver interagito (spostato la mattonella) comparirà la chiave a terra.

Questo è lo script di quando il giocatore "osserva" il pilastro:

function hHotspot3_Look()

{

Display("La base di questo pilastro si muove!");

i ++;

}

la prima parte dice che è lo script di osservare (look) l'Hotspot3 (il pilastro)

la parte con scritto "Display..." è un messaggio che compare, come se il peronaggio stia pensando e dice la frase scritta nelle virgolette in parentesi.

Subito sotto ho incrementato un contatore (dichiarata in precedenza) chiamato "i" di 1 (scrivere "++" è uguale allo scrivere "+1")

spiegato questo passo alla parte dell'interazione con il pilastro:

function hHotspot3_Interact()

{

if (i>=1)

Display("C'e' una chiave sotto.");

i ++;

if (i>=2)

Chiave.Visible=true;

}

Come prima, questo è lo script dove si interagisce con il pilastro e qui c'è il mio problema:

Se il giocatore osserva per 2 (o più) volte il pilastro oppure interaggisce per 2 (o più) volte con il pilastro la chiave si renderà visibile subito saltando quindi uno di questi due passaggi (osservare oppure interaggire).

Ho pensato ad aggiungere un altro contatore, ma è sempre lo stesso problema, voi come fareste???

Non sò se potrete darmi una mano, perchè forse dovete conoscere il linguaggio, però io ci provo! :-p

Grazie per gli aiuti!

Bye byez :bye:


  • Replies 16
  • Created
  • Last Reply

Top Posters In This Topic

Top Posters In This Topic

Posted

Guarda il linguaggio non lo conosco, ma sembra molto simile al c++. A occhio posso dire che mi pare di capire che in questa scena i contatore parta smepre da 0. Quiindi invece di incrementare secco potresti fare una cosa del genere:

function hHotspot3_Look()
{
Display("La base di questo pilastro si muove!");
if(!i) i ++;
} [/code]

Ossia, incrementi solo se i è uguale a zero. E sotto lo puoi lasciare così. Poi non so se i ti serva anche in altre parti, ma se la usi solo per le funzioni del tipo di quella sopra, dovrebbe funzionare.

Posted

Provo subito per vedere se funge e poi ti faccio sapere!

Intanto ti ringrazio!

EDIT: Allora così si risolve il problema del usare due volte l'osservare, però se si usa due volte l'interaggire la chiave si visualizza... quindi è comunque un passo avanti! :-D

Grazie per l'aiuto, hai in mente come risolvere quest'altra cosa???

EDIT2: aggiungo che se interaggisco la prima volta non da messaggi, mentre alla seconda dà il messaggio citato nel primo post e mi mostra la chiave...

Bye byez :bye:

Posted

prova a fare 2 variabili booleane, osservato e trovato per esempio, cosi vai sul sicuro.

:bye:

il problema è che trovato deve uscire solo dopo aver osservato, e sinceramente non ricordo molto di quel poco che ho studiato a scuola... :-(

Bye byez :bye:

Posted

Provo subito per vedere se funge e poi ti faccio sapere!

Intanto ti ringrazio!

EDIT: Allora così si risolve il problema del usare due volte l'osservare, però se si usa due volte l'interaggire la chiave si visualizza... quindi è comunque un passo avanti! :-D

Grazie per l'aiuto, hai in mente come risolvere quest'altra cosa???

EDIT2: aggiungo che se interaggisco la prima volta non da messaggi, mentre alla seconda dà il messaggio citato nel primo post e mi mostra la chiave...

Hmmm... prova con una cosa del genere:


function hHotspot3_Look()
{
Display("La base di questo pilastro si muove!");
if(i==0) i ++;
}

function hHotspot3_Interact()
{
if (i==1)
Display("C'e' una chiave sotto.");
i ++;

if (i==2)
Chiave.Visible=true;
} [/code] Ora domanda semplice: non conosco il linguaggio, ma sei sicuro che
[code]if (i==1)
Display("C'e' una chiave sotto.");
i ++;
sia corretto e che non ti ci voglia qualche delimitatore di blocco? perchè a occhio sembra non prendere l'incremento del contatore come componente del primo blocco if. Il problema è che questo algoritmo è sequenziale, ergo quando tu fai il check:
if (i>=1)
//random code 1
i++;

if (i>=2)
//random code 2
[/code] all'interno di uno stesso blocco, lui fa il controllo e i=1 è vera, quindi esegue la sua robina e incrementa, ma dopo fa il controlloif(i>=2), che è vero anche questo. Quindi lui con una singola interazione esguirà sia il random code 1 che il random code 2. Per il fatto che al primo giro non ti dia messaggi la vedo strana assai. Prova con if(i==0) invece che !i. EDIT: Ho controllato:
Also, the { } brackets are only needed if you are using more than one command inside them. Since we have only one command, the "my_counter++;" line, we can remove the { } completely and just be left with:
Quindi la mia supposizione era corretta, il tuo blocco deve essere:
[code]function hHotspot3_Interact()
{
if (i==1)
[INDENT][b]{
Display("C'e' una chiave sotto.");
i ++;
}[/b][/INDENT]


if (i==2)
Chiave.Visible=true;
}

Le graffe vanno usate per racchiudere tutti iblocchi, non solo quelli della funzione. Questo è il motivo per cui in questo caso ti sei trovato ad avere il contatore incrementato a prescindere (e giustamente lui mostrava la chiave).

PS: anche il problema della mancata visualizzazione sembra essere correttamente individuato: non sembra che ci sia l'operatore di negazione.

Posted

quoto blackstorm, in effetti è vero come l'hai scritto tu esegue l'incremento a prescindere... cmq metti il controllo del trovato prima dell'osservazione, se ho ben capito devi cercare 2 volte, come l'hai scritto fa una cosa dietro l'altra e si risolve con un solo giro...

Posted

Ringrazio Blackstorm, era proprio il problema del blocco! :redface:

Immaginavo fosse una cosa stupida, ma non così stupida...

Se avrò altri problemi sò a chi rivolgermi (spero di non farne un abitudine :-D)!

@M4G3: va bene così, forse mi ero spiegato male, prima bisogna osservare e poi trovare e così funziona perfettamente, se provo prima a trovare non fa nulla! ;-) Ringrazio anche te per gli aiuti!

Grazie ancora a tutti e due! :-D

Bye byez :bye:

Posted

Ringrazio Blackstorm, era proprio il problema del blocco! :redface:

Immaginavo fosse una cosa stupida, ma non così stupida...

Tranquillo :)

Non hai idea di quante volte un programma non mi si compilava per un ; mancato.

Se avrò altri problemi sò a chi rivolgermi (spero di non farne un abitudine :-D)!

A tua disposizione, finchè ci arrivo... poi se non ci arrivo dovrai chiedere ad altri :)

Posted

Non hai idea di quante volte un programma non mi si compilava per un ; mancato.

mai affermazione fu più vera :-D

insieme ad una graffa in eccesso o difetto...

:bye:

Posted

In realtà un topic per programmatori c'è, anche se poco popolato: http://dragonslair.it/forum/showthread.php?t=18879 ;-)

Riguardo al tuo problema poco da aggiungere, noto che ti hanno già dato il consiglio vincente. A me non rimane altro da aggiungere se non "interagire si scrive con una g sola". :-p

EDIT - Altro errore comune è quello di confondere "=" con "==" (o ":=" con "=" o cose così).

Ecco, bravo!

Visto che a scuola programmavo con VB 6.0 Pro, e il tutorial scritto di questo Editor è in inglese (e tra l'altro non spiega molto... :-() mentre quello avanzato e su YouTube parlato e illustrato (finche si tratta di tradurre ci rieso ancora, ma col parlato mi diventa più dificoltoso) mi spiegheresti per bene la differenza tra "=", "==" ":=" e le altre esistenti???

Grazie mille!

Bye byez :bye:

Posted

Generalmente l'imbarazzo nasce dalla confusione tra l'operatore di assegnamento e quello di uguaglianza. Il modo in cui sono distinti dipende dal linguaggio, per fare un esempio in C/C++ l'operatore di uguaglianza si scrive "==" ed è quello da usare ad esempio per scrivere un'espressione del tipo:

if( x == y) {OPERAZIONI_DA ESEGUIRE}[/CODE]

con il significato di "Se la condizione 'x è uguale a y' è rispettata allora esegui le operazioni elencate" (le parentesi graffe non fanno male anche nel caso di un'operazione sola ;-)).

L'operatore di assegnamento invece si scrive (sempre in C/C++) "=" e sta per "assegna alla variabile a sinistra dell'uguale il valore risultante dal calcolo dell'operazione a destra".

Usare "=" nella scrittura della condizione di un if è un errore piuttosto subdolo e grave: subdolo perché spesso diviene di difficile individuazione, grave perché altera potenzialmente in modo anche pesante il funzionamento dell'algoritmo.

Non è detto che le cose filino sempre in questo modo: in TurboPascal ad esempio l'operatore di assegnamento è":=", mentre l'operatore di uguaglianza "=", altri linguaggi avranno altre convenzioni.

Cosa differente sono i vari "/=", "+=", "-=" e compagnia cantante: si tratta fondamentalmente di "scorciatoie" il cui utilizzo è non indispensabile all'atto pratico. Tu stesso usi l'operatore di incremento per "comodità" nel codice che hai postato: quegli operatori sono alla stessa stregua. Certo, male non fanno ma la cosa fondamentale è capire subito la differenza tra assegnamento e uguaglianza.

Posted

ok, credo di aver capito tutto, però mi sorge un dubbio:

Se volessi incrementare la variabile "x" di 3, scriverò

x += 3;

Ma non è uguale a scrivere

x + 3;

oppure è sbagliato così? :confused:

In VB non c'era questo sistema (o almeno la prof non ce l'ha spiegato...)

Grazie ancora!

Bye byez :bye:

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...