Jump to content
Nokioteca Forum

[mshell] Far Rotolare Il Barile


lento
 Share

Recommended Posts

Beato tè che tra un pò ti godi le vacanze.....

Dopo 9 lunghissimi mesi di scuola un po' di vacanza me la merito... :D

Beh un po' di inglese io lo conosco :D tanto è vero che ho già fatto una domandina sul forum di mShell... :blush:

Comunque se tu magari mi dicessi in che modo formulare la domanda (in italiano) io un tentativo ce lo farei :thumbs:

Link to comment
Condividi su altri siti

  • Risposte 114
  • Created
  • Ultima Risposta

Top Posters In This Topic

Beh un po' di inglese io lo conosco :thumbsup_anim: tanto è vero che ho già fatto una domandina sul forum di mShell... :incazzato:

Comunque se tu magari mi dicessi in che modo formulare la domanda (in italiano) io un tentativo ce lo farei :incazzato:

Prova a metterla così:

Ho un cellulare Nokia 6630 con la versione 3.02-30 di mShell... quando eseguo questo programma:

use ui;

ui.keys(true,false);

do

tasto=ui.cmd(300);

print(tasto);

until tasto=48

Display:

null

null

null

54 <------premo tasto 6

null

null

null

-54 <-----rilascio tasto 6

Tutto bene!

Mentre...così......

Display:

null

null

54 <------premo tasto 6

null

null

null <------ premo tasto 4 ?????

null

null

-52 <------rilascio tasto 4

null

-54 <-----rilascio tasto 6

Perchè mentre tengo premuto il tasto 6 non legge la pressione del tasto 4 ?

come avviene su altri cellulari?

Vi sarei grato se mi indicate cosa sbaglio, sto tentando di realizzare un gioco

dove due giocatori agiscono in contemporanea sulla tastiera.

Link to comment
Condividi su altri siti

  • 7 mesi dopo...
Prova a metterla così:

Ho un cellulare Nokia 6630 con la versione 3.02-30 di mShell... quando eseguo questo programma:

use ui;

ui.keys(true,false);

do

tasto=ui.cmd(300);

print(tasto);

until tasto=48

Display:

null

null

null

54 <------premo tasto 6

null

null

null

-54 <-----rilascio tasto 6

Tutto bene!

Mentre...così......

Display:

null

null

54 <------premo tasto 6

null

null

null <------ premo tasto 4 ?????

null

null

-52 <------rilascio tasto 4

null

-54 <-----rilascio tasto 6

Perchè mentre tengo premuto il tasto 6 non legge la pressione del tasto 4 ?

come avviene su altri cellulari?

Vi sarei grato se mi indicate cosa sbaglio, sto tentando di realizzare un gioco

dove due giocatori agiscono in contemporanea sulla tastiera.

'Nick_7' dovendo imparare j2me casualmente ho trovato la risposta a questo problema.

E' una differenza hardware e non cè niente da fare.

E' un problema presente anche in j2me quando si vuole gestire la pressione dei tasti.

Tutto dipende dai costruttori dei cellulari.

Alcuni modelli permettono di leggere la pressione di un tasto, il rilascio e la eventuale pressione di un secondo tasto mentre se ne tiene premuto un altro.

Altri permettono solo di leggere la pressione di un tasto e non rilevano ulteriori tasti finchè non si rilascia il tasto premuto.

Altri addirittura rendono il codice di tasto premuto e eventuali altri premuti solo al rilascio!. (bufferizzazione della tastiera)

Quindi posso risponderti che non è un difetto di mShell.

Se aspettavi ancora un pò deventevamo nonni! Alter è vero ma ho dovuto arrangiarmi.

Link to comment
Condividi su altri siti

  • 1 anno dopo...

Per lento.

Allego il file di far rotolare il barile, nella sua versione nr. 6 adattato per E71, con la speranza di poter realizzare la collisione tra Mario ed il Barile.

Grazie.-

Ciao '6587gianluca' la funzione collisione(); è stata lasciata incompleta proprio per permetterti di completare il tuo gioco.

Sempe in questa sezione (Vedi altri giochini) dovresti trovare tutto quanto ti serve per scrivere una funzione sulle collisioni.

Domanda: hai adattato anche gli scenari all' E71?.

Link to comment
Condividi su altri siti

Ciao '6587gianluca' la funzione collisione(); è stata lasciata incompleta proprio per permetterti di completare il tuo gioco.

Sempe in questa sezione (Vedi altri giochini) dovresti trovare tutto quanto ti serve per scrivere una funzione sulle collisioni.

Domanda: hai adattato anche gli scenari all' E71?.

Si, ho adattato anche gli scenari all'E71, provalo se puoi, è simpatico da vedere, scorre benissimo, poi aggiugerò qualche suono per renderlo più vivo. Per quanto riguarda la collisione ci ho provato in vari modi ma non ci sono riuscito.

Ciao.-

Link to comment
Condividi su altri siti

Quali modi? hai provato...

Purtroppo sono diventato totalmente Alieno ora posseggo Un Samsung Galaxy_Ace (Android) mi sarà difficile provare il gioco.

allora ho fatto le seguenti prove :

if .barilix=.brosx then

...istruzioni

end;

poi ho provato

for cu=0 to .nbarili do

if .barilix[cu]=.brosx then

....istruzioni

end;end;

e poi mi sembra di aver fatto altre prove che però ora non mi vengono in mente in quanto dopo le prove le ho cabncellate.

Dando l'invio alle precedenti prove e mi appariva l'errore nel main al seguente punto:

g.put(0,0,sfondo);

Ho controllato gli altri giochini ma tutte le funzioni colisione erano relative ad (mi sembra che si dice) array, nel senso che si controllavano una per una le bombe che colpivano ad esempio i sottomarini (ricordi!) quindi veniva scansionata bomba per bomba e sottomarino per sottomarino, invece in questo caso bisognerebbe prendere in considerazione solo l'eventuale collisiona tra un qualsiasi barile con mario bross.

Tu che ne pensi....le prove che ho fatto sono tutte sbagliate vero ????

Link to comment
Condividi su altri siti

Tu che ne pensi....le prove che ho fatto sono tutte sbagliate vero ????

Mi congratulo per i tentativi fatti.

Il primo tentativo è sicuramente sbagliato perché .barilix è una matrice.

Quindi devi indicare l'indice, come giustamente hai fatto nel secondo tentativo.

Direi: prima chiariamoci le idee su cosa vogliamo ottenere.

Io la vedo così:

1) Sfruttando le matrici barilix[], bariliy[] e brosx, brosy

possiamo identificare con assoluta precisione dove si trova Bros e i barili.

2) Quindi ad ogni ciclo di movimento verifichiamo scansionando le matrici se Bros e un barile sono in contatto.

3) Se sono in contatto assegnamo un valore che indica collisione avvenuta ad una variabile globale (Oppure facciamo si che la funzione Collisione() ci renda un valore Vero o falso.

4) Nel ciclo principale del gioco oltre a verificare tasto verifichiamo

anche l'avvenuta collisione e decidiamo di togliere vite o terminare il gioco.

Ok!

Ora concentriamo la nostra attenzione sul punto 1).

for cu=0 to .nbarili do
if .barilix[cu]=.brosx then
	....istruzioni
end;
end;

in teoria è giusta, l'errore sta nella eccessiva precisione dei dati contenuti in barili[cu] e brosx

è praticamente impossibile che il vertice sinistro in alto della figura di Bros coincida con il vertice in alto a sinistra del barile.

(Vedi spiegazione https://www.nokioteca.net/home/forum/index.php/topic/150216-mshell-far-rotolare-il-barile/page__view__findpost__p__1287891 )

Bross si muove con velocità diverse ed in più salta.

Bisogna ragionare in termini di sovrapposizione di rettangoli.

Dobbiamo verificare quando una parte del rettangolo di Bross si sovrappone al rettangolo del barile.

quadri.png

Il ciclo che Hai scritto fa un confronto solo del punto (A) con il punto (E) è quasi impossibile che coincidano.

Per verificare la sovrapposizione delle due immagini applichiamo la regola:

Due rettangoli si intersecano se la distanza assoluta sull'asse x tra i centri dei due rettangoli è minore della somma delle semilarghezze dei rettangoli e la distanza assoluta sull'asse y tra i centri dei due rettangoli è minore della somma delle semialtezze

Puoi trovare spiegazioni in internet (come ho fatto io!)

Allora bisogna confrontare:

mezzoBrosx=10 // considero figura di 20x30 pixel  20 in x 30 in y
mezzaBottex=10  // considero botte 20x20 pixel
mezzox=mezzoBrosx+mezzaBottex
mezzoBrosy=15 // considero figura di 20x30 pixel  20 in x 30 in y
mezzaBottey=10  // considero botte 20x20 pixel
mezzoy=mezzoBrosy+mezzaBottey
// mezzox e mezzoy ti converrà utilizzarle come costanti globali già pre_calcolate
for cu=0 to .nbarili do
if (math.abs((.barilix[cu]+mezzaBottex)-(.brosx+mezzoBrosx))< mezzox) and
          (math.abs((.bariliy[cu]+mezzaBottey)-(.brosy+mezzoBrosy))< mezzoy) then
	....istruzioni
end;
end;

Per velocizzare il tutto puoi ridurre il confronto sopra indicato solo per i barili che sono sul piano di Bros leggendo la matrice pbarile[] .

for cu=0 to .nbarili do
if .pbarile[cu]=.pmario then
	if (math.abs((.barilix[cu]+mezzaBottex)-(.brosx+mezzoBrosx))< mezzox) and
       	   (math.abs((.bariliy[cu]+mezzaBottey)-(.brosy+mezzoBrosy))< mezzoy) then
		....istruzioni
	end;
end;
end;

Spero di non aver sbagliato qualcosa....

Modificato da lento
Link to comment
Condividi su altri siti

Direi: prima chiariamoci le idee su cosa vogliamo ottenere.

Ok ! Ok!,,ora sono a lavoro ho letto velocemente, poi riesaminerò il tutto con più attenzione...però mi chiedo

mezzoBrosx=10 // considero figura di 20x30 pixel 20 in x 30 in y

mezzaBottex=10 // considero botte 20x20 pixel

mezzox=mezzoBrosx+mezzaBottex

mezzoBrosy=15 // considero figura di 20x30 pixel 20 in x 30 in y

mezzaBottey=10 // considero botte 20x20 pixel

mezzoy=mezzoBrosy+mezzaBottey

questi valori vanno dichiarati all'iniziono del programma ????

Ciao e grazie per ora....

Link to comment
Condividi su altri siti

E' preferibile dichiararli ad inizio programma come variabili Globali.

Così facendo si evita di crearle e distruggerle ogni volta si chiamerà la funzione collisione()

Non Hai allegato le immagini che utilizzi quindi mezzaBottex=10,mezzoBrosy=15 sono valori da mè inventati...

Un altra cosa:

nel ciclo principale del programma

do
g.put(0,0,sfondo);
g.pen(0xff0000); g.text(160,15,"score");g.text(205,15,p);
g.show();
for z=1 to lives do
g.put(z*15+195,25,life);
end;g.show();
escibarile()=0;
sbarili();
brosmovi(tasto);
//collisione();
g.show();
.....ecc..
.....ecc..
until tasto=false

non ci sono troppi g.show(); ???

Ricorda che ogni volta che chiami quel comando viene ridisegnato lo schermo rallentando di molto il programma e consumando

parecchia energia della batteria.

Modificato da lento
Link to comment
Condividi su altri siti

E' preferibile dichiararli ad inizio programma come variabili Globali.

Così facendo si evita di crearle e distruggerle ogni volta si chiamerà la funzione collisione()

Non Hai allegato le immagini che utilizzi quindi mezzaBottex=10,mezzoBrosy=15 sono valori da mè inventati...

Un altra cosa:

nel ciclo principale del programma

do
g.put(0,0,sfondo);
g.pen(0xff0000); g.text(160,15,"score");g.text(205,15,p);
g.show();
for z=1 to lives do
g.put(z*15+195,25,life);
end;g.show();
escibarile()=0;
sbarili();
brosmovi(tasto);
//collisione();
g.show();
.....ecc..
.....ecc..
until tasto=false

non ci sono troppi g.show(); ???

Ricorda che ogni volta che chiami quel comando viene ridisegnato lo schermo rallentando di molto il programma e consumando

parecchia energia della batteria.

Ti ringrazio per la tua solita grande disponibilità, ma purtroppo non ci arrivo.

Grazie comunque, ciao.-

Link to comment
Condividi su altri siti

  • 4 anni dopo...

Premessa:

Apro questa nuova discussione nel tentativo di illustrare dei concetti basilari della programmazione sfruttando l'idea di '6587gianluca' che si stà prodigando a realizzare un gioco. Per sua gentile concessione utilizzo le sue immagini.

Non spiegherò quello che si trova sui manuali di mshell.(devo finire di leggerli pure io...)

Leggete anche l'eccellente "Miniguida per Iniziare" di 'masmil1988' https://www.nokioteca.net/home/forum/index....showtopic=38298

Non sono un insegnante...conosco qualcosa...e molto non sò, correrò il rischio di trasmettere anche qualche concetto sbagliato.

Spero che altri verifichino l'esattezza di quel che si dirà intervenendo con correzioni per il bene di tutti, Grazie!.

Nota: si tratta di un colloquio tra me e il mio alter ego che per dipiù è convinto di avere personalità multiple!!.

Per il corretto funzionamento dovete installare nella MemoryCard queste due immagini:

Nella Directory "E:\Images\" immagine donkeysfondo.png attachicon.gifdonkeysfondo.pnge barile.png attachicon.gifbarile.png

Sono immagini per cellulari con schermo 240x320, per i possessori di cellulari con schermo 320x240

all'inizio dovranno vedere solo 3/4 dell'immagine.

Torniamo a noi:

L'idea è di far cadere e rotolare un barile lungo dei piani. Si pone un barile sul piano più alto, cade, rotola, cade,rotola così percorre tutto lo scenario del gioco "DonkeyKong", quando esce di scena ne riparte un altro. L'immagine dovrebbero essere sufficiente per capire.

attachicon.gifdonkeysfond_1.png

La prima regola è avere le idee chiare di cosa si vuol realizzare!.

Ovvero conoscere il problema e come si vuol risolverlo (a grandi linee).

Allora il programma sarà così:

  • mostra "donkeysfondo.png" (l'immagine di fondo a pieno schermo)
  • mostra il barile in alto a destra pronto a cadere "barile.png"

    Qui ci sono due azioni che si ripetono parecchie volte una per ogni piano:

  • il barile cade sul piano sottostante
  • il barile rotola sino al lato opposto del piano
  • Ultima cosa, quando il barile giunge all'estremità dell'ultimo piano esce di scena e riappare al punto 1) pronto a ripetere la sequenza.
Tutto chiaro?. Siii!(alter ego).

Ecco il sorgente:

use graph;graph.size(240,320);graph.full(true);sfondo=graph.icon("e:\\Images\\donkeysfondo.png");

barile=graph.icon("e:\\Images\\barile.png");graph.put(0,0,sfondo);graph.put(214,97,barile);graph.show();

sleep(10);graph.put(0,0,sfondo);graph.put(214,98,barile);graph.show();sleep(10);

graph.put(0,0,sfondo);graph.put(214,99,barile);graph.show();sleep(10);graph.put

(0,0,sfondo);graph.put(214,100,barile);graph.show();sleep(10);graph.put(0,0,

sfondo);graph.put(214,101,barile);graph.show();sleep(10);graph.put(0,0,sfondo);

graph.put(214,102,barile);graph.show();sleep(10);graph.put(0,0,sfondo);graph.put

(214,103,barile);graph.show();sleep(10);graph.put(0,0,sfondo);graph.put(214,104,

barile);graph.show();sleep(10);graph.put(0,0,sfondo);graph.put(214,105,barile);

graph.show();sleep(10);graph.put(0,0,sfondo);graph.put(214,106,barile);graph.

show();sleep(10);graph.put(0,0,sfondo);graph.put(214,107,barile);graph.show();

sleep(10);graph.put(0,0,sfondo);graph.put(214,108,barile);graph.show();sleep

(10);graph.put(0,0,sfondo);graph.put(214,109,barile);graph.show();sleep(10);

graph.put(0,0,sfondo);graph.put(214,110,barile);graph.show();sleep(10);graph.

put(0,0,sfondo);graph.put(214,111,barile);graph.show();sleep(10);graph.put(0,0,

sfondo);graph.put(214,112,barile);graph.show();sleep(10);graph.put(0,0,sfondo);

graph.put(214,113,barile);graph.show();sleep(10);graph.put(0,0,sfondo);graph.

put(214,114,barile);graph.show();sleep(10);graph.put(0,0,sfondo);graph.put(214,

115,barile);graph.show();sleep(10);graph.put(0,0,sfondo);graph.put(214,116,

barile);graph.show();sleep(10);graph.put(0,0,sfondo);graph.put(214,117,barile);

graph.show();sleep(10);graph.put(0,0,sfondo);

...... Fermo! fermo!ma cosè sta roba qua?.

Il programma!...ci sono molte altre righe che devo scrivere per completarlo.....

E' PAZZO!...presto chiudete la discussione e chiamate l'ospedale....

Vi assicuro che il sorgente qui riportato salvato in un file testuale con un nome di fantasia e estensione obbligatoria .m viene aperto dall'interprete mShell, lo legge e lo esegue tutto e non si lamenta! si vede il barile cadere per qualche piano, funziona!!.

attachicon.gifDk0.txt

Ma non si capisce niente! e come fa l'interprete mShell a capirci qualcosa?? son tutte parole appiccicate!.

Allora possiamo immaginare che l'interprete quando esegue un programma su file fa quanto segue:

  • Apre il programma da eseguire (Il programma deve essere scritto come testo)
  • Parte dal primo carattere in alto a sinistra legge la prima istruzione,

    verifica che sia scritta correttamente e la esegue, poi legge la seconda e cosi via,

    scorre tutto esattamente come si legge un libro.

    Man mano che compie questa azione interpreta e esegue le istruzioni una dopo l'altra

    fino al termine del file e con esso termina anche il programma.

Anche se non è esattamente così.

Qui si capisce che siamo noi umani ad avere la necessità di una scrittura del programma che sia in grado

di farci capire cosa compie.

Dobbiamo poter scrivere in un modo tale, che sia il programma stesso a spiegarsi.

Pazzesco!!! mi stai dicendo che quel ammasso alfanumerico può diventare un programma che si spiega??

Vuoi dire che il programma mi insegna come funziona??

Si! Ora te lo riscrivo....

Ok! questo è il sorgente:

use graph;

graph.size(240,320);

graph.full(true);

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

barile=graph.icon("e:\\Images\\barile.png");

graph.put(0,0,sfondo);

graph.put(214,97,barile);

graph.show();sleep(10);

graph.put(0,0,sfondo);

graph.put(214,98,barile);

graph.show();sleep(10);

graph.put(0,0,sfondo);

graph.put(214,99,barile);

graph.show();sleep(10);

graph.put(0,0,sfondo);

graph.put(214,100,barile);

graph.show();sleep(10);

graph.put(0,0,sfondo);

graph.put(214,101,barile);

graph.show();sleep(10);

graph.put(0,0,sfondo);

graph.put(214,102,barile);

graph.show();sleep(10);

graph.put(0,0,sfondo);

graph.put(214,103,barile);

graph.show();sleep(10);

graph.put(0,0,sfondo);

graph.put(214,104,barile);

graph.show();sleep(10);

attachicon.gifDk1.txt

...... Fermo! fermo!

Ma?..dovevo scrivere ancora 60 centimetri di programma e il barile cade di un piano!

e se aggiungo altri 6 metri di programma vedrai il barile cadere fino in fondo!

e se poi aggiungo altri 6 metri e 60 centimetri rifà un altra volta il tutto!.

Niente da fare...è proprio pazzo, richiama l'ospedale....non vorrai farci scrivere 6 metri e 60 di comandi

per vedere un barile rotolare?

Fine prima puntata...

scusa ma in ke linguaggioè scritto, e come compilarlo per ottenere un eseguibile....???? grazie per la risponta.....

Link to comment
Condividi su altri siti

Please sign in to comment

You will be able to leave a comment after signing in



Accedi Ora
 Share


×
×
  • Crea Nuovo...

Informazione Importante

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