Jump to content
Nokioteca Forum

[mshell] Far Rotolare Il Barile


lento
 Share

Recommended Posts

Ciao lento, ancora non sono tornato a casa e tò scrivendo m olto velocemente dal pc di mio fratello quindi sarò concisissimo.

Innanzi tutto mi complimento con te in quanto ciò che il tuo alte ti ha costretto a fare è a dir poco meraviglioso, se voglismo fare un paragone in riferimento ala tua e mia capacità di programmare, io mi paragono ad un albero....tu sei una intera foresta e a dirti la verità in riferimento a ciò che tu hai scritto io non ci capisco niente.....comunqeveniamo a noi.....

Ho scaricato il file DK4 e l'ho caricato sul mio telefono e dando l'invio mi da un errore alle seguenti righe

mario=[0,1,2];

mario[0]=g.icon("e:\\Images\\mario1.png");

mario[1]=g.icon("e:\\Images\\mario2.png");

se le tolgo mettendoci le sbarrettine davanti il tutto parte e cioè si vede lo schermo sfondo, non si vede mario ed i barili meravigliosamente rotolano in maniera eccellente.

Ora mi chiedevo, perchè mi da errore su quelle righe ??

Come faccio a far funzinare i tutto vedendo Marioche viaggia sullo schermo ???

Grazie lento e complimenti.-

Link to comment
Share on other sites

  • Replies 114
  • Created
  • Last Reply

Top Posters In This Topic

mario=[0,1,2];

mario[0]=g.icon("e:\\Images\\mario1.png");

mario[1]=g.icon("e:\\Images\\mario2.png");

Ciao '6587gianluca' mi fa piacere risentirti.

Ho provato il programma su due cellulari diversi e mi funziona puntualmente. Ti pongo delle domande anche banali ma vediamo se riesco a risolvere.

1) hai caricato le due immagini di Bros in E:\Images e ti sei accertato che abbiano come nome mario1.png e mario2.png ?

2) Che versione di mShell stai utilizzando (Io uso la 3.01)

3) Il tuo cellulare potrebbe avere un problema di quantità di memoria, Versione di Symbian?...

4) Mi riporti cosa dice l'errore.?

Approposito non mi hai dato l'immagine di Bros che salta.

Alter ti ha lasciato un programma funzionante ma scritto un pò male perché spera che ci metti mano.......anche la funzione di collisione ora se

capisci il programma è semplice da aggiungere....

Famme sapè.

Edited by lento
Link to comment
Share on other sites

Ciao '6587gianluca' mi fa piacere risentirti.

Ho provato il programma su due cellulari diversi e mi funziona puntualmente. Ti pongo delle domande anche banali ma vediamo se riesco a risolvere.

1) hai caricato le due immagini di Bros in E:\Images e ti sei accertato che abbiano come nome mario1.png e mario2.png ?

2) Che versione di mShell stai utilizzando (Io uso la 3.01)

3) Il tuo cellulare potrebbe avere un problema di quantità di memoria, Versione di Symbian?...

4) Mi riporti cosa dice l'errore.?

Approposito non mi hai dato l'immagine di Bros che salta.

Alter ti ha lasciato un programma funzionante ma scritto un pò male perché spera che ci metti mano.......anche la funzione di collisione ora se

capisci il programma è semplice da aggiungere....

Famme sapè.

_________________________________

1) Si, ho caricato le immagini di mario1 e mario2;

2) per ciò che riguarda la versione, non so dirti di preciso che versione è (da dove si vede la versione ???) comunque è abbastanza vecchiotta, una delle prime;

3) per ciò che riguarda la versione del mjio symbian è symbian 3rd edition del Nokia N95;

4) l'errore è il seguente : ErrArgument: Invalid function argument ed il cursore si ferma all'inizio della riga mario[0]=g.icon("e:\\Images\\mario1.png");

Booooo, non lo so perchè !!!!

In effetti ho installato sull'altro cellulare (Nokia N82) la versione di mShell 3.02 e tutto funziona egreggiamente.

Il problema grosso per me è che non capendo il programma è difficile, se non impossibile, che riesco ad apportare modifiche ed a svilupparlo a mio piacimento.

Edited by 6587gianluca
Link to comment
Share on other sites

In effetti ho installato sull'altro cellulare (Nokia N82) la versione di mShell 3.02 e tutto funziona egreggiamente.

Il problema grosso per me è che non capendo il programma è difficile, se non impossibile, che riesco ad apportare modifiche ed a svilupparlo a mio piacimento.

Dalla schermata principale-> mshell->View->About-> ti dice che versione mshell stai usando (Leggi il manuale..)

Mi verrebbe voglia di dirti "aggiornalo!" ma, potrebbero esserci altre persone con quella versione e non se la sentono di smanettare il cellulare.

Dato che si può eccoti la versione che dovrebbe andare bene anche per mShell piu vecchie della 3.01-3.02.Dk5.txt

Provalo e fammi sapere. Come ti sembra il Mario bross salta bene? e corre?.

Se hai difficoltà con il sorgente: o gli hai dedicato poco tempo per capirlo, oppure dovresti partire con qualcosa di più semplice.

Alternativa... comincia a leggerlo, quello che non capisci chiedi facendo così puoi imparare con più facilità e magari

permetti ad altri di imparare dalle tue domande.

Parti leggendo il pezzo compreso tra MAIN e END MAIN. Nel leggerlo vedi cosa gentilmente ti aveva scritto 'Il.Socio' qualche post più addietro.

Se invece ti interessava solo il gioco... be! posso chiedere ad Alter.... di sicuro le collisioni te le sistema, la musica, i punteggi non sò anche perché non era nostra intenzione scrivere videogiochi.

Ciao Facci sapé.

Edited by lento
Link to comment
Share on other sites

Dato che si può eccoti la versione che dovrebbe andare bene anche per mShell piu vecchie della 3.01-3.02.Dk5.txt

Provalo e fammi sapere. Come ti sembra il Mario bross salta bene? e corre?.

Ciao, ho provato il file Dk5 però purtroppo non funziona sul mio N95, appena lo avvio con il go mi torna a display la schermata principale.....

Per ciò che riguarda Mario a correre corre perfettamente, per ciò che riguarda il salto invece secondo me ci sono alcuni problemi in quanto nel momento in cui andremo a valutare le collisioni sarà difficile che Mario riesca a saltare qualche barile. Secondo me oltre a saltare in alto dovrebbe saltare anche in avanti ed indietro, premendo ad esempio il tasto 1 dovrebbe saltare e contemporaneamente spostarsi sulla sinistra, premendo il tasto 3 dovrebbe saltare e spostarsi sulla destra.

Resta il fatto che il tuo è un lavoro eccezionale.......magari io riuscissi a fare cose del genere !!!!!!!!!!!!!

Link to comment
Share on other sites

Resta il fatto che il tuo è un lavoro eccezionale.......magari io riuscissi a fare cose del genere !!!!!!!!!!!!!

Comincia a fare quello che ti ho scritto al post precedente....vedrai che impari e qualcuno che ti risponde alle domande lo trovi.

Dal messaggio di errore che mi avevi riportato sembrava che non supportasse le assegnazioni agli array di immagini.

Ma visto che anche il modificato Dk5.txt ti da problemi (non avendo la tua vecchia versione di mShell), credo che ti convenga aggiornare

il cellulare alla mShell3.02 o 3.01.

O sperare che qualcuno in grado di adattarlo partecipi alla discussione.

Per via del salto condivido le tue idee ma ricorda, prima si crea un funzionante ROZZO poi lo si affina.

Ci sono altre cose da sistemare es. Mario non sale le scale le salta!

Quando raggiunge la sua bella può ancora scorrere in lungo e in largo nel vuoto....

Non viene aggiudicato nessun punteggio ecc. ecc.

Il gioco non è ancora completo... si sà Ti toccherà finirlo che cé voi fà! ^_^

Link to comment
Share on other sites

Con tutta la mia buona volontà.....avoglia a sbattere la testa sul sorgente....leggo, rileggo, rileggo, rileggo...non ci riesco, non riesco a capire funzioni, passaggi e collegamenti.

Mi arrendo, non sarò mai in grado di fare da solo un lavoro così complicato.

Link to comment
Share on other sites

sono necessari come minimo giorni per acquisire lo stretto indispensabile, mesi per impratichirsi un po' e diversi anni per arrivare ad avere una certa padronanza della programmazione...

se perdi subito di motivazione al primo ostacolo, mi trovi d'accordo con te: "non sarai mai in grado di fare da solo un lavoro così complicato"

se la materia ti appasiona, potresti iniziare con un corso di programmazione basilare in cui ti spiegano flow-chart e logica di programmazione, per poi passare ad affrontare il linguaggio vero e proprio.

alcuni di questi corsi sono interamente finanziati dalla comunita' europea e non hanno alcun costo.

Edited by Il.Socio
Link to comment
Share on other sites

Con tutta la mia buona volontà.....avoglia a sbattere la testa sul sorgente....leggo, rileggo, rileggo, rileggo...non ci riesco, non riesco a capire funzioni, passaggi e collegamenti.

Mi arrendo, non sarò mai in grado di fare da solo un lavoro così complicato.

Di complicato cè solo quello che non conosci.

Prova a leggere un libro in aramaico o in ostrogoto, ti sembrerà un insieme di simboli senza senso.

Un qualcosa di impossibile da decifrare, o di trovare un senso logico,

La stesa cosa è la programmazione.

Sto dando una sbirciatina al linguaggio java (j2me per la precisione) e mi trovo nella tua stessa condizione!.

Non ci capisco un H. Ora ti chiedo cosa devo fare abbandono?? Dammi un consiglio.....

Ciao a presto...

C'è qualcosa che posso fare?

Edited by lento
Link to comment
Share on other sites

C'è qualcosa che posso fare?

No, no.....non ti consiglio assolutamente di abbandonare. Io ho detto che mi arrendo in un momento di debolezza, ma sono già qui che trascrivo le righe a penna su di un foglio al fine di capire che cosa stò scrivendo. Non mi arrendo neanche io, comunque è difficile.

Sono sicuro che tu possa fare moltissimo per uno come me che vorrebbe veramente imparare delle nozioni. Il programma che hai scritto forse per uno come me é un po lungo per poterlo capire, sono sicuro pero` che se tu scrivessi qualcosa di piu' semplice e piu' corto (come una specie di corso) magari riuscirei a trarne vantaggi. Ti ringrazio della tua grande e rara disponibilita'.

Spero che questa discussione non finisca qui, spero che vada ancora avanti molto.

Ad esempio al fine di scrivere qualcosa con l'utilizzo delle funzioni, ma più semplice, potresi (dico potresti in quanto tu sei l'insegnante in questo caso) scrivere un sorgente che faccia muovere a display (anche display completamente bianco) una pallina, ad esempio, da destra verso sinistra. In questo modo leggendo poche righe si potrebbe meglio comprendere il funzionamento.

Ti dico la verità, mi stai quasi contagiando....il mio alter mi hadetto "giallllluuuu gli stai a rompe, l'hai capito o no ???

Edited by 6587gianluca
Link to comment
Share on other sites

scrivere un sorgente che faccia muovere a display (anche display completamente bianco) una pallina, ad esempio, da destra verso sinistra. In questo modo leggendo poche righe si potrebbe meglio comprendere il funzionamento.

Ti dico la verità, mi stai quasi contagiando....il mio alter mi hadetto "giallllluuuu gli stai a rompe, l'hai capito o no ???

Non stai a rompe! non preoccuparti.

Ti allego una pallina rimbalzanteball.txt Porta pazienza ma sono un pò preso. Devi aspettare Sabato per il resto.

Ti riporterò il sorgente commentato e cominceremo a definire il concetto di variabile, in seguito modificheremo il programma.

aggiungendo funzioni, e spiegandole.....poi vedremo...

Ciao fammi sapere se non ti funziona, per fermarlo premi il tasto 0.

Edited by lento
Link to comment
Share on other sites

Analizziamo brevemente il PROBLEMA:

Come precedentemente detto è fondamentale sapere cosa si vuole ottenere e conoscere come si fà per averlo.

(Problema ---> soluzione del problema)

Ricordate questa è l'unica cosa veramente importante! è il luogo dove dei geniacci della matematica

e informatica hanno dato il meglio.

PROBLEMA:

Vogliamo realizzare una pallina in modo grafico che si muove in linea retta, quando incontra

i limiti dello schermo rimbalza in direzione opposta.

SOLUZIONE:

Visto che il nostro schermo lo possiamo considerare come un insieme di piccole celle

(tipo quaderno a quadretti) individuablili tramite le coordinate cartesiane 240x320.

Se consideriamo y i valori del lato lungo 320 pixel x i valori del lato corto 240 pixel.

Vogliamo che la nostra pallina (barile) scenda basso-destra in linea retta

Scermo1.png

Ora:

partendo dal vertice alto-sinistra (y=0,x=0) tracciamo una retta che lo congiunge al

vertice opposto in basso-destra (y=320,x=240).

Se vogliamo creare l'ilusione della pallina che scende lungo la retta dobbiamo:

1) cancellare la precedente pallina disegnata sullo schermo.

2) disegnare la nuova pallina sulla retta un unità piu in basso della volta precedente.

3) Mostrare sullo schermo del cellulare la nuova immagine ottenuta.

4) continuare cosi fino al raggiungimento del vertice opposto (pareti dello schermo).

5) in caso di collisione con pareti invertire il movimento

Come si intuisce si tratta di aumentare di un unità sia il valore della y che di x.

Per otenere che la pallina rimbalzi indietro basta fare l'opposto diminuire prograssivamente

i valori di x e y.

Qui si scopre l'arcano! si scopre che con quattro variazioni di y e x si può avere la pallina

che si muove in tutte le direzioni:

Praticamente:

1)giu-destra : x aumenta y aumenta

2)giu-sinistra : x aumenta y diminuisce

3)su-destra : x diminuisce y aumenta

4)su-sinistra : x diminuisce y diminuisce

			lato  A
+-----------------+
|				 |
|				 |
|				 |
C   |				 | lato D
|				 |
|				 |
|		B		|
+-----------------+

Non solo ma scopriamo anche che a seconda della parete che la pallina colpisce dovremo

cambiare direzione in modo diverso:

Colpisce parete C

se si stava muovendo giu-sinistra diventa giu-destra

se si stava muovendo su-sinistra diventa su-destra

Colpisce parete D

giu-destra -> giu-sinistra

su-destra -> su-sinistra

Colpisce parete A

su-destra -> giu-destra

su-sinistra -> giu-sinistra

Colpisce parete B

giu-destra -> su-destra

giu-sinistra -> su-sinistra

Qui si riscopre un altro arcano:

avete notato che le pareti A e B non fanno altro che invertire il valore della x?

e che le pareti C e D non fanno altro che invertire il valore della y?.

( Spunto per migliorare il programma in futuro.)

Ora il programma lo possiamo sintetizzare così:

Facendo riferimento allo specchietto:

1)giu-destra : x aumenta y aumenta

2)giu-sinistra : x aumenta y diminuisce

3)su-destra : x diminuisce y aumenta

4)su-sinistra : x diminuisce y aumenta

Parto con la pallina in un punto qualsiasi dello schermo

Assegno alla variabile v un numero che indica come muoversi (come variare i valori x e y)

ripeto

^ se v= 1 (aumento x , aumento y )

| se v= 2 (aumento x , diminuisco y)

| se v= 3 (diminuisco x, aumento y )

| se v= 4 (diminuisco x, diminuisco y)

| se incontro la parete C o D eseguo --> (se v=1 lo cambio in v=2)(se v=2 lo cambio in v=1)

| se incontro la parete A o B eseguo --> (se v=3 lo cambio in v=4)(se v=4 lo cambio in v=3)

+--- se non premi il tasto 0 ripeto il tutto.

Allego programma commentato.ballcom.txt

Link to comment
Share on other sites

A grande richiesta (N.1 utente) di popolo!: Le variabili.

Dato che il mio scopo non è fare un trattato (per mia incapacità), qui riporto come le vedo io.

Cosa sono le variabili:

contanti=13;

In questa istruzione si è creata una variabile di nome "contanti" e si è assegnato ad essa il valore

numerico di 13.

In questa azione bisogna distinguere 4 cose:

0) la disposizione nome "contanti" -> simbolo "=" -> numero "13"

1) il nome della variabile

2) il segno =

3) il contenuto della variabile.

Per capire meglio ricominciamo a creare fantasie mentali:

Immaginiamo che la memoria del cellulare sia come un enorme casellario o se preferite come una pagina

quadrettata.mem1.png (Prego cliccare per ingrandire immagine!)

La caratteristica di questa memoria sta nella possibilità di depositare da parte di mShell dei numeri, delle

parole, delle immagini, e tante altre cose.

Questi valori possono essere cancellati e riscritti a piacimento.

Dall'immagine si vede un numero 13 depositato in una casella, e un pò più in là delle lettere in più caselle

che unite formano la parola HELLO. (Cè sta pure Batman!).

Queste che state vedendo sono i CONTENUTI cioè i valori che avete incaricato mShell di conservare.

Ora come fà mShell a sapere dove sono?

Notare la numerazione ai due lati del casellario. E' il vecchio sistema a coordinate cartesiane!.

mShell ad esempio imdividua dove si trova realmente in memoria il numero tredici grazie ai due valori

02 e 07 (Colonna 02 Riga 07).

Fa anche una cosa strana li accosta ottenendo un numero 0207.

Con questo numero mShell trova il valore depositato nella memoria fisica del cellulare.

Ma noi come possiamo dire a mShell di prendere il valore 13 per farne qualcosa?.

Non possiamo di certo dirgli:"Ei! la la! in fondo a destra...NO! non quello lì latro, si quello!"

contanti=13; svolge questo compito.

mShell legge la riga da sinistra verso destra, si accorge che cè un nome valido subito dopo un sibolo di =

questo indica a mShell che vogliamo assegnare alla variabile "contati" quello che si trova dopo =.

mShell è un interprete di bocca buona! capisce da solo se quello dopo = è un numero, una stringa, o una funzione.

MECCANISMO di assegnazione:

Ora cosa fa nella mia immaginaria macchina mShell?

1)prende la parola "contanti" la immagazzina in un indice che tiene nascosto alla nostra vista.

Questo indice è molto simile a quello dei libri.

Parola -> pagina dove si parla di quella parola.

  |contanti  0207 tipo | 
 |batman	0505 tipo |
 |scacchi   0904 tipo |
 |dadi	  1203 tipo |
 |edificio  0302 tipo |
 |hello	 0708 tipo | 
 |.........		   |
 |____________________|

Il suo indice è composto da una parola letterale "scacchi","contanti", ecc seguito da un valore numerico

unico! unico significa che indica una e solo una casella nella memoria senza possibilità di errore, e

dal tipo che gli serve per capire se è un numero corto lungo se sono lettere e quante sono.

Nel caso del 13 gli indica che si tratta di un numero intero e che è contenuto solo in una casella.

e il nostro numero 13? dové?.

il numero 13 mShell lo ha depositato nella casella indicata dal numero 0207.

Due parole sulle caselle:

Effettivamente il 13 sta in una casella ma la scritta hello no! come mai?

Piccola complicazione: nonostante la nostra fervida immaginazione nella memoria esistono solo numeri

e per giunta binari!, cioè 01001101 ogni casella e composta da 8 o 16 o 32 numeri binari l'ampiezza

dei numeri binari dipende dal tipo di processore e da come li gestisce.

Per semplificare diciamo che certi numeri riesce a immagazzinarli in una sola casella altri deve usare piu

caselle (quelli con la virgola per esempio). Le lettere stanno in una casella una per ogni lettera.

Ma se noi vogliamo, Assegnare alla variabile hello la stringa "HELLO" come fa?.

hello="HELLO"; ?

Fa esattamente quello che ha fatto con contanti assegna un numero che identifica la prima casella della

frase, in "tipo" depone che si tratta di testo, e quante caselle occupa nella memoria e dove sono.

Con queste informazioni è in grado di gestire qualsiasi cosa mettiamo in memoria.

Per concludere:

print hello;

questo comando stampa a video il contenuto della variabile hello. Cosa fà mShell?

Legge la riga da sinistra verso destra trova il comando print e sà che deve stampare quello che segue.

Si accorge che hello non è una costante letterale (non è racchiusa tra "" o '') si accorge che non è

un numero, ne una funzione e capisce che si tratta di una variabile e che vogliamo stampare a video

il suo contenuto.

Per sapere qualé il suo contenuto, va al suo indice e lo scorre per vedere se contiene una parola uguale a hello, la trova!.

  |contanti  0207 tipo | 
 |batman	0505 tipo |
 |scacchi   0904 tipo |
 |dadi	  1203 tipo |
 |edificio  0302 tipo |
 |hello	 0708 tipo |  <----------Trovata!
 |.........		   |
 |____________________|

Guarda che tipo di valore è (trattasi di stringa composta da 5 legge) legge il numero 0708 per sapere dove

si trova preleva 5 caselle successive e le stampa sul video.

+-------------+
|			 |
| HELLO	   | <----video del telefonino
|			 |
+-------------+
 o		 o

Cè l'abbiamo fatta!.

Con questo meccanismo mentale riesco a capire il funzionamento delle variabili nei programmi.

Spero che sarà più facile per chi è totalmente digiuno capire quello che si dirà in seguito.

Sempre se dopo questa onirica spiegazione non sarò cacciato dal forum!. :)

Edited by lento
Link to comment
Share on other sites

Non stai a rompe! non preoccuparti.

Ti allego una pallina rimbalzanteball.txt Porta pazienza ma sono un pò preso. Devi aspettare Sabato per il resto.

Ti riporterò il sorgente commentato e cominceremo a definire il concetto di variabile, in seguito modificheremo il programma.

aggiungendo funzioni, e spiegandole.....poi vedremo...

Ciao fammi sapere se non ti funziona, per fermarlo premi il tasto 0.

Ciao, ho provato ball su N95 con versione vecchia non funziona, sull'N82 con versione nuova di mShell funziona benissimo.

sai che giochino simpatico ne nascerebbe se in basso ci fosse una piccola base che se incontrata dalla pallina quest'ultima rimbalsasse invece se non incontrasse la base non rimbalsasse e si perderebbe una vita ???

Dai alter.....non pensare sempre ai giochini....vabbene !!!!

Sai, lo script è molto lineare, l'unica cosa che non mi nascerebbe spontanea sarebbe quella di assegnare i valori dei lati del display alla variabile v, nel senso che come faccio a dire che la parete superiore ad esempio deve assumere il valore v=1, quella inferiore v=2 e cosi via ??? Comunque leggendo lo script si capisce molto bene.

Complimenti per il lavoro ed anche per le varie spiegazioni delle variabili.

Se non ti crea problemi continua così è tutto meraviglioso.

Edited by 6587gianluca
Link to comment
Share on other sites

sai che giochino simpatico ne nascerebbe se in basso ci fosse una piccola base che se incontrata dalla pallina quest'ultima rimbalsasse invece se non incontrasse la base non rimbalsasse e si perderebbe una vita ???

Questa è la molla che deve aiutarti a imparare...Per poter modificare il gioco come vuoi.

Adesso studialo con calma....

come faccio a dire che la parete superiore ad esempio deve assumere il valore v=1, quella inferiore v=2 e cosi via ??? Comunque leggendo lo script si capisce molto bene.

Uuuaaaa! :D me tapino....me meschino... non sono riuscito a spiegare il problema!.

Consigli da alter...prova a leggere con più calma tutto poi famme sapè....ciao

Se dopo la lettura (compreso il programma) non capisci indicami quali righe.

Link to comment
Share on other sites

Visto che i cicli for...to..do.., do..until, while...end li conosci ed anche if..then..else..end.

Tento di darti un idea delle funzioni.

Possiamo immaginare una funzione come un microprocessore.

				| | | | | 
		       +----------+
 1°segnale in entrata-> 10   -| funzione |-  -> segnale in uscita 18
		      -|somma(a,|-
 2°segnale in entrata-> 8    -|	  |-
		       +----------+
			| | | | |

Dove dando dei segnali in ingresso su dei piedini questo ne rende altri sui altri piedini.

In teoria una funzione può avere più valori in ingresso ed un solo valore in uscita.

risultato=8;

function somma(a,;
risulato= a+b;
return risultato;
end;

print risultato;  --> stamperà 8
print somma(10,8); --> stamperà 18
print risultato;  --> stamperà ancora 8

In mShell le funzioni sono viste effettivamente come una scatola chiusa dove tutto quello che

si trova tra function e end sono per cosi dire isolate dal resto del programma che le contiene.

La variabile risultato vale 8 sia prima che dopo l'uso della funzione perché non è la stessa

variabile che vedi all'interno della funzione.

Praticamente possiamo immaginare che mShell trasformi internamente il programma in questo modo:

functio somma(somma.a,somma.;
somma.risultato=somma.a+somma.b;
return somma.risultato;
end;

Per mShell nella funzione somma() ci sono variabili completamente diverse da quelle esterne alla funzione stessa.

(Che strano? assomiglia molto alla programmazione ad oggetti this.risultato)

Perciò la definizione della funzione è come uno stampo l'archetipo che gli dice cosa deve fare

( che strano sembra di parlare di programmazione ad oggetti?)

Ogni volta che attiviamo questa funzione mShell creerà le variabili

somma.a somma.b e somma.risultato

e le userà per gestire i valori che gli passerai. Terminata la funzione le eliminerà dal suo

indice delle variabili.

Ragioniamo come le gestisce mShell: (Forti del meccanismo di immagazzinamento sopra spiegato)

Allora quando definisci la prima variabile risultato mshell immagazzina il valore 8 nella

memoria e nel suo indice personale pone il nome risultato

| risultato 0207 tipo| <-- qui mette il nome e dove si trova in memoria il numero 8.
| Batman    0809 tipo|
+--------------------+

Premetto che fisicamente non sò come le nomina ma di sicuro fa qualcosa di simile.

Quando incontra

print somma(10,8);

Crea le due variabili locali per ricevere i valori che gli ai assegnato.

somma.a e gli assegna il valore 10 poi crea

somma.b e gli assegna il valore 8

e crea anche somma.risultato e gli assegna il risultato dell'operazione 10+8

| somma.risultato   0910 tipo| <----     ----->18 in memoria
| somma.b           1011 tipo| <----     ----->8  in memoria
| somma.a           1010 tipo| <----     ----->10 in memoria
| risultato         0207 tipo|           ----->8  in memoria
| Batman            0809 tipo|
+---------------------------+

Terminato lo svolgimento del programma contenuto nella funzione elimina le variabili

ad essa associate che aveva messo nel suo indice.

|                           | <---- 
|                           | <---- Terminato l'uso della funzione vengono eliminate
|                           | <---- 
| risultato        0207 tipo| ---->8 in memoria rimane
| Batman           0809 tipo|
+---------------------------+

Una precisazione sul comando return:

Abbiamo detto che una funzione restituisce al programma chiamante un valore, questo in genere lo fa

il comando return (return termina lo svolgimento della funzione e rende il valore che lo segue)

function folle();
return 8;
end;

a=folle()
print a  -> 8

In questo caso dopo return cè il valore 8 che renderà a print per stamparlo a video.

function folle();
 return 9;
 print "non sono folle!";
 return 12;
end;

print folle() --> 9

Attenzione return rende un valore ma termina anche la funzione, non importa se dopo di essa

ci sono altri comandi, questi non vengono eseguiti.

Ultima cosa importante una funzione prima di poter essere usata deve essere definita.

Perciò il tuo programma potresti suddividerlo così:

+----------------------------------------------------+
| chiamata ai moduli da utilizzare	<---- prima cosa da fare
| 
| a=10;				       <---- poi definisci le variabili globali
| colore="verde";
|
|funcion folle();	  	      <----- poi definisci tutte le funzioni che vuoi usare
|	return 9;								 nel programma attuale
|end;
|
| //====== main======		   <---  da qui in poi scrivi il programma che 
| ......  ........						utilizza i valori  sopra  riportati.
| ..   .....  .......
|//======END MAIN===
+---------------------------------------------------+

Un momento! fermi tutti! e questa che roba è??

risultato=8;

function somma(a,;
 risultato a+b;
 return .risultato;
end;

print somma(10,8);   -------> stampa a video 8

Dimenticavo, se all'interno di una funzione si vuol utilizzare una variabile esterna ad essa

(Le cosi dette variabili globali) bisogna aggiungere il punto .risultato

o doppio punto ..risultato per far capire a mShell che si sta usando una variabile non

interna alla funzione, e che non deve distruggerla quando termina la funzione.

Perciò questo da risultati diversi da quanto scritto sopra.

risultato=8;

function somma(a,;
.risulato= a+b;
return .risultato;
end;

print risultato;  --> stamperà 8
print somma(10,8); --> stamperà 18
print risultato;  --> stamperà 18  <-------vedi come cambia!

Un ultima cosa poi dovrai camminare con i tuoi piedini.......

Le variabili globali che vedi nel programma sono tali solo all'interno di questo programma.

Consideriamo che hai una parte di programma in un file e lo richiami in memoria per usarlo.

(I cosi detti moduli.)

file di nome mio.mm
+---------------------+
|risultato=8;	      |	<------ variabile globale all'interno di mio.mm
| 		      |
|function folle();    |
| print .risultato;   |
|end;		      |
----------------------+

Programma principale:
+-------------------+
|use mio;	    |
|		    |
|risultato=6;	    |
|		    |
|print mio.folle(); |  <------- stamperà 8 e non 6
|print risultato;   |  <------  stampa 6 come previsto.
+-------------------+

Come vedi le variabili sono globali sì ma solo all'interno del loro programma.

Penso di averti incasinato la mente a sufficienza per poter usare al minimo mShell.

Qui termina quanto mi ero prefisso, il resto lo devi imparare dai libri, esempi vari ecc.

Sul forum puoi sempre chiedere aiuto e troverai di sicuro risposte da più persone.

Magari riportando parte del codice che ti da problemi.

Capisco cosa vuol dire tentare di scrivere un programma da autodidatta, imparare da soli leggendo libri è difficile.

Se poi (come nel mio caso) la scuola non ti ha dato le minime basi sulla programmazione è dura.

Edited by lento
Link to comment
Share on other sites

Ciao lento, il lavoro che hai fatto è veramente da lode. Lo leggo e lo rileggo ed a volte pensando che non ho analizzato bene qualche parte della discussione riparto da capo e la rileggo tutta. Comunque complimentoni, sei veramente una persona eccezionale in quanto ti sei dedicato a noi altri con vera dedizione e spirito di sacrificio.

Ho buttato giù anche io uno script, naturalmente senza l'uso delle funzioni, che in linea di massima fa fare a Mario ciò che volevo, oggi seriesco ad apportare l'ultima modifica lo allego cosi gli dai un occhiata e mi fai sapere un tuo parere.

Ciao e grazie.-

Link to comment
Share on other sites

Ciao lento, il lavoro che hai fatto è veramente da lode. Lo leggo e lo rileggo ed a volte pensando che non ho analizzato bene qualche parte della discussione riparto da capo e la rileggo tutta. Comunque complimentoni, sei veramente una persona eccezionale in quanto ti sei dedicato a noi altri con vera dedizione e spirito di sacrificio.

Ho buttato giù anche io uno script, naturalmente senza l'uso delle funzioni, che in linea di massima fa fare a Mario ciò che volevo, oggi seriesco ad apportare l'ultima modifica lo allego cosi gli dai un occhiata e mi fai sapere un tuo parere.

Ciao e grazie.-

Ti ringrazio ancora per la tua super valutazione delle mie visioni oniriche, e attendo di poter vedere il tuo sorgente!.

Un ultima cosa: Alter (preso dall'entusiasmo) ha scritto anche una base per il gioco della pallina con tanto di paletta come

avevi accennato, ti può interessare?

Link to comment
Share on other sites

Ti ringrazio ancora per la tua super valutazione delle mie visioni oniriche, e attendo di poter vedere il tuo sorgente!.

Un ultima cosa: Alter (preso dall'entusiasmo) ha scritto anche una base per il gioco della pallina con tanto di paletta come

avevi accennato, ti può interessare?

Mi chiedi se mi può interessare ??????????????????

MA CERTOOOOOOOOO !!!!!!! scusa per l'entusiasmo ad alta voce, ma io sbavo per queste cose.

Attendo che Alter pubblichi il tutto.

Link to comment
Share on other sites

Allora, di seguito allego il mio sorgente. Le immagini da utilizzare (tutte da copiare in galleria) sono le seguenti :

donkeysfondo.png

mario1.png

mario2.png

barilep1.png

mlife1.png

Mario si sposta a destra ed a sinistra su ogni piano con i tasti 4 (sinistra) e 6 (destra);

sale le scale (non perfettamente in corrispondenza esatta con la scala) con il tasto 2 (sale);

salta verso sinistra con il tasto 1 e salta verso destra con il tasto 3.

Quando mario giunge sul piano ove si trova la sua bella vedrete i punti incrementarsi di 10, nello stesso punto apparirà una scritta con scritto "PIU' VELOCE" e contemporaneamente mario riprenderà la sua posizione iniziale (in basso a sinistra) e la velocità del barile anche se impercettibilmente aumenterà....se avete pazionza di scalare il palazzo qualche volta vi accorgerete che il barile verrà giù abbastanza velocemente.

Per ora mi sono fermato qui, stò lavorando per fare in modo che Mario debba obbligatoriamente saltare i barili al fine di evitare di perdere una vita.

use graph as g,ui;

g.size(240,320);

g.full(true);

sfondo=g.icon("e:\\Images\\donkeysfondo.png");

mariod=g.icon("e:\\Images\\mario1.png",0x000000);

marios=g.icon("e:\\Images\\mario2.png",0x000000);

bariled=g.icon("e:\\Images\\barilep1.png");

bariles=g.icon("e:\\Images\\barilep1.png");

life=g.icon("e:\\Images\\mlife1.png");

a=30;b=284;

score=0;lives=3;vb=30;p=0;

do

for y=97 to 292 do

if (y=169) or (y=251) then

for x=23 to 214 do

ui.keys(false,false);

Key=ui.cmd(vb);

if Key=51 then

a=a+10;dir=1;

b=b-10;

g.put(a,b,mariod);

g.show();

sleep(100);

if (b<284) then

a=a+10;

b=b+10;

g.put(a,b,mariod);

g.show();

end;

end;

if Key=49 then

a=a-10;dir=-1;

b=b-10;

g.put(a,b,marios);

g.show();

sleep(100);

if (b<284) then

a=a-10;

b=b+10;

g.put(a,b,marios);

g.show();

end;

end;

if Key=52 then

a=a-10;

dir=-1;

end;

if Key=54 then

dir=1;

a=a+10;

end;

if Key=50 and (a=180) and (b>242) then

b=b-2; piano=0;

end;

if Key=50 and (a=60) and (b>203) then

b=b-2; piano=1;

end;

if Key=50 and (a=170) and (b>160) then

b=b-2; piano=2;

end;

if Key=50 and (a=70) and (b>120) then

b=b-2; piano=3;

end;

if Key=50 and (a=180) and (b>88) and(piano>1) then

b=b-2;

end;

if Key=50 and (a=140) and (b>55) then

b=b-2; piano=5;

end;

if b=54 then

p=p+10;vb=vb-2;

g.text(100,170,"PIU' VELOCE......");

g.show();sleep(900);

a=30;b=284;end;

g.put(0,0,sfondo);

g.put(x,y,bariled);

if dir=-1 then

g.put(a,b,marios);

else

g.put(a,b,mariod);

end;

for z=1 to lives do

g.put(z*15+165,25,life);

end;g.show();

g.pen(0xff0000); g.text(160,15,"score");g.text(205,15,p);

g.show();

end;end;

if (y=128) or (y=209) or (y=292) then

for x=214 to 23 by-1 do

ui.keys(false,false);

Key=ui.cmd(vb);

if Key=51 then

a=a+10;dir=1;

b=b-10;

g.put(a,b,mariod);

g.show();sleep(100);

if (b<284) then

a=a+10;

b=b+10;

g.put(a,b,mariod);

g.show();

end;

end;

if Key=49 then

a=a-10;dir=-1;

b=b-10;

g.put(a,b,marios);

g.show();

sleep(100);

if (b<284) then

a=a-10;

b=b+10;

g.put(a,b,marios);

g.show();

end;

end;

if Key=52 then

a=a-10;

dir=-1;

end;

if Key=54 then

a=a+10;

dir=1;

end;

if Key=50 and (a=180) and (b>242) then

b=b-2; piano=0;

end;

if Key=50 and (a=60) and (b>203) then

b=b-2; piano=1;

end;

if Key=50 and (a=170) and (b>160) then

b=b-2; piano=2;

end;

if Key=50 and (a=70) and (b>120) then

b=b-2; piano=3;

end;

if Key=50 and (a=180) and (b>88)and(piano>1) then

b=b-2;

end;

if Key=50 and (a=140) and (b>55) then

b=b-2; piano=5;

end;

if b=54 then

p=p+10;vb=vb-2;

g.text(100,170,"PIU' VELOCE......");

g.show();sleep(900);

a=30;b=284;end;

g.put(0,0,sfondo);

g.put(x,y,bariled);

if dir=-1 then

g.put(a,b,marios);

else

g.put(a,b,mariod);

end;

for z=1 to lives do

g.put(z*15+165,25,life);

end;g.show();

g.pen(0xff0000); g.text(160,15,"score");g.text(205,15,p);

g.show();

end;end;

end;

until lives=0;

Edited by 6587gianluca
Link to comment
Share on other sites

piccolo appunto... le variabili dovrebbero essere autoesplicative ed in genere hai rispettato questa regola, ma ad una prima occhiata, non mi e' chiaro cosa sono "a", "b", "vb", "p"... le altre invece sono chiarissime...

potresti assegnargli nomi piu' comprensibili? :shifty:

EDIT:

Mi pare di capire che:

"a" e "b" sono la posizione x e y di mario?

"p" e' il punteggio?

"vb" invece non lo capisco proprio...

P.S.

per postare il codice sorgente puoi usare il tag:

[code ]

codice sorgente

[ /code]

oppure il tag

[codebox ]

codice sorgente

[ /codebox]

Cosi' mantiene l'intentatura ed e' piu' chiaro...

Edited by Il.Socio
Link to comment
Share on other sites

allora ci sono diverse cose che non mi tornano...

la velocita' del barile viene inizializzata a 30

poi Key=ui.cmd(vb);

1) cosa centra quello che che credo sia il rilevamento del tasto premuto con la velocita' del barile?

2) perche' se la posizione y di mario ("b") e' uguale a 54, la velocita' del barile diminuisce?

3) facendo sue e giu' con mario e facendolo passare continuamente attraverso la posizione 54 e' possibile portare la velocita' del barile a zero, fermando di fatto il barile.

EDIT: aaaahhhh... forse ho capito... quel ui.cmd(vb) aspetta (vb) tempo prima di restituire il valore... ed il 54 e' la posizione in alto dello schermo dove si trova la principessa? In questo caso tornerebbe tutto, ma cosi' facendo non si influenza solo la velocita' del barile, ma la velocita' dell'intero gioco... compresa la velocita' di mario.

Qui c'e' il codice originale, con indentazione per chi volesse capirci qualcosa:

use graph as g,ui;

g.size(240,320);
g.full(true);

sfondo=g.icon("e:\\Images\\donkeysfondo.png");
mariod=g.icon("e:\\Images\\mario1.png",0x000000);
marios=g.icon("e:\\Images\\mario2.png",0x000000);
bariled=g.icon("e:\\Images\\barilep1.png");
bariles=g.icon("e:\\Images\\barilep1.png");
life=g.icon("e:\\Images\\mlife1.png");
a=30;b=284;
score=0;lives=3;vb=30;p=0;
do
for y=97 to 292 do	
	if (y=169) or (y=251) then	
		for x=23 to 214 do
			ui.keys(false,false);
			Key=ui.cmd(vb);

			if Key=51 then
				a=a+10;dir=1;
				b=b-10;
				g.put(a,b,mariod);
				g.show();
				sleep(100);		

				if (b<284) then	
					a=a+10;
					b=b+10;
					g.put(a,b,mariod);
					g.show();
				end;
			end;

			if Key=49 then
				a=a-10;dir=-1;
				b=b-10;
				g.put(a,b,marios);
				g.show();
				sleep(100);

				if (b<284) then	
					a=a-10;
					b=b+10;
					g.put(a,b,marios);
					g.show();
				end;
			end;


			if Key=52 then
				a=a-10;
				dir=-1;
			end;

			if Key=54 then
				dir=1;
				a=a+10;
			end;
			if Key=50 and (a=180) and (b>242) then
				b=b-2; piano=0;
			end;
			if Key=50 and (a=60) and (b>203) then
				b=b-2; piano=1;
			end;
			if Key=50 and (a=170) and (b>160) then
				b=b-2; piano=2;
			end;
			if Key=50 and (a=70) and (b>120) then
				b=b-2; piano=3;
			end;
			if Key=50 and (a=180) and (b>88) and(piano>1) then
				b=b-2;
			end;
			if Key=50 and (a=140) and (b>55) then
				b=b-2; piano=5;
			end;

			if b=54 then
				p=p+10;vb=vb-2;
				g.text(100,170,"PIU' VELOCE......");
				g.show();sleep(900);
				a=30;b=284;
			end;

			g.put(0,0,sfondo);
			g.put(x,y,bariled);
			if dir=-1 then
				g.put(a,b,marios);
			else
				g.put(a,b,mariod);
			end;

			for z=1 to lives do
				g.put(z*15+165,25,life);
			end;

			g.show();	
			g.pen(0xff0000); g.text(160,15,"score");g.text(205,15,p);
			g.show();
		end;
	end;


	if (y=128) or (y=209) or (y=292) then
		for x=214 to 23 by-1 do
			ui.keys(false,false);
			Key=ui.cmd(vb);
			if Key=51 then
				a=a+10;dir=1;
				b=b-10;
				g.put(a,b,mariod);
				g.show();sleep(100);
				if (b<284) then
					a=a+10;
					b=b+10;
					g.put(a,b,mariod);
					g.show();
				end;
			end;

			if Key=49 then
				a=a-10;dir=-1;
				b=b-10;
				g.put(a,b,marios);
				g.show();
				sleep(100);

				if (b<284) then	
					a=a-10;
					b=b+10;
					g.put(a,b,marios);
					g.show();
				end;
			end;

			if Key=52 then
				a=a-10;
				dir=-1;
			end;

			if Key=54 then
				a=a+10;
				dir=1;
			end;
			if Key=50 and (a=180) and (b>242) then
				b=b-2; piano=0;
			end;
			if Key=50 and (a=60) and (b>203) then
				b=b-2; piano=1;
			end;
			if Key=50 and (a=170) and (b>160) then
				b=b-2; piano=2;
			end;
			if Key=50 and (a=70) and (b>120) then
				b=b-2; piano=3;
			end;
			if Key=50 and (a=180) and (b>88)and(piano>1) then
				b=b-2;
			end;
			if Key=50 and (a=140) and (b>55) then
				b=b-2; piano=5;
			end;
			if b=54 then
				p=p+10;vb=vb-2;
				g.text(100,170,"PIU' VELOCE......");
				g.show();sleep(900);
				a=30;b=284;
			end;

			g.put(0,0,sfondo);
			g.put(x,y,bariled);
			if dir=-1 then
				g.put(a,b,marios);
			else
				g.put(a,b,mariod);
			end;

			for z=1 to lives do
				g.put(z*15+165,25,life);
			end;

			g.show();
			g.pen(0xff0000); g.text(160,15,"score");g.text(205,15,p);
			g.show();
		end;
	end;
end;
end;

Edited by Il.Socio
Link to comment
Share on other sites

Ora che vedo la logica che c'e' alla base del codice inizio a sentirmi male... :D ( senza offesa eh!? )

Ad occhio e croce direi che sei partito dal codice ed hai cercato di rattoppare qua e la per riuscire a far funzionare il tutto...

In realta', per la realizzazione dei programmi bisognerebbe fare il processo inverso, partire da uno schema logico a livello macroscopico per poi arrivare ad ottenere il codice sorgente.

P.S.

probabilmente mi consideri eccessivamente critico, ma credimi, sto gia' cercando di contenermi. :)

Edited by Il.Socio
Link to comment
Share on other sites

Allora, di seguito allego il mio sorgente.

Bravo! mi complimento per il programma...

Ci ho giocato un pò per vedere finalmente la tua opera in azione e devo dire (usando le parole di un marines famoso)

Adattarsi, Improvvisare, Raggiungere lo scopo.Gunny.png

hai fatto esattamente questo!.

Ai raggiunto il tuo scopo che era di riuscire a gestire Bros e il suo barile.

Nel leggere il programma ho notato che hai compreso molte delle parti di quanto ha scritto Alter e come direbbe lui: Al diavolo le funzioni! le imparerai quando il programma diventerà più complesso.

Ora ho poco tempo....Domani mi farò vivo in modo più completo.

Non preoccuparti se Il.Socio ha la mano un pò pesante, vedrai che se vorrai andare oltre con il programma dovrai fare come ti ha

suggerito lui.

Un pò per volta dicono che le persone possono imparare solo quello che gli serve!

Ciao a presto. (Bella la schermata con i punteggi!)

Link to comment
Share on other sites

Please sign in to comment

You will be able to leave a comment after signing in



Sign In Now
 Share


×
×
  • Create New...

Important Information

Questo sito utilizza i cookie per analisi, contenuti personalizzati e pubblicità. Continuando la navigazione, accetti l'utilizzo dei cookie da parte nostra | Privacy Policy