|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Registered User
Iscritto dal: Jan 2004
Città: legoland
Messaggi: 121
|
[VB6] Problemi del Videogioco
Sono uno studente autodidatta privatista di in formatica delle superiori e sto facendo un programma in vb 6 per potermi allenare con le tecniche studiate.
Il progetto in questione è una versione e-emhhh.. come dire.... "personalizata", di campo minato, ultimata al 90%. Ma il programma (tralasciando alcune funzionalità extra che devo ancora implementare) presenta due gravi bug e comportamenti inspiegabile che vanno molto oltre le mie capacità: 1°) Se il campo di gioco è quadrato tutto ok, ma se ha un numero di righe diverso da quello delle colonne mi scopre caselle diverse da quelle premute con il mouse. P.S. Nessun progresso ![]() ![]() 2°)La tabella con i punteggi viene cancellata tutte le volte che chiudo il form FrmClassifica, senza un motivo apparente! P.S. Risolto! Nell' evento queryUnload disattivo la chiusura del form e lo rendo invisibile. Nel pulsante che mostra la classifica nel form principale ho modificato il codice in modo che usi il comando Show la prima volta che viene aperta la tabella, e setti la propietà visible a true tutte le altre volte. In questo modo si consuma un pò più di memoria ram ma si risparmia tempo di CPU. Se poi trovate altri errori o parti migliorabili avvisatemi. Avviso che ho la bruttisima tendenza a dare NOMI STUPIDI a variabili e funzioni e spesso il codice risulta un pò oscuro,ma HO COMMENTATO TUTTE LE PARTI INNERENTI AL PROBLEMA per cui non dovrebbero esserci difficoltà. Spedisco l'intero progetto in formato Zip. Ri-aggiornato Ultima modifica di visual_b : 22-07-2005 alle 00:24. |
![]() |
![]() |
![]() |
#2 | |
Senior Member
Iscritto dal: Jul 2004
Messaggi: 853
|
Quote:
ma cmq dovresti imparare la lettura e scrittura sul file, così la classifica rimane sempre in memoria... ciao |
|
![]() |
![]() |
![]() |
#3 |
Registered User
Iscritto dal: Jan 2004
Città: legoland
Messaggi: 121
|
E' gia memorizzato in un file.
Non volevo rieditare la tabella inutilmente. E se faccio semplicemete diventare invisibile il form? La tabella rimane? E le prestazioni migliorano? |
![]() |
![]() |
![]() |
#4 |
Registered User
Iscritto dal: Jan 2004
Città: legoland
Messaggi: 121
|
3°) Le caselle "catturano" l' evento move del mouse quando vengono premute, quindi anche spostandosi da una casella, se la si tiene premuta, gli eventi mouse move delle altre caselle non si attivano.
Lo stesso accade se si esce con il mouse fuori dall' area di gioco, (per esempio sul dekstop), si tiene premuto il 1° pulsante del mouse e si rietra sul campo di gioco. Sembrerebbe cosa da poco se cio non bastasse a neutralizzare l' effetto dei soldati nemici. (tutti tranne il cecchino ![]() 4°) Tutti i soldati nemici non "ti vedono" se stai fermo con il mouse su una casella senza premere un bottone. Infatti lo "sparo" dei soldati è attivato da un evento MouseMove sulla casella, e questo evento non si verifica se tu sei fermo, ma solo se passi su una casella su cui c'è un soldato. Nel caso del cecchino non è un problema, in quanto se non "ti vede" (attivi un evento MouseMove su una casella) per più di 2 Sec. muori lo stesso, e muori anche se rimani fermo per più di 0,2 Sec. per poi muoverti. Ma con gli altri due tipi di nemici basta "stare fermi" per esserne immuni. Spero di essere stato chiaro. Ultima modifica di visual_b : 21-07-2005 alle 10:00. |
![]() |
![]() |
![]() |
#5 |
Registered User
Iscritto dal: Jan 2004
Città: legoland
Messaggi: 121
|
Per comodità vostra inserisco una parte del codice qui:
Codice (parziale) del form principale Codice PHP:
Ultima modifica di visual_b : 21-07-2005 alle 10:46. |
![]() |
![]() |
![]() |
#6 |
Registered User
Iscritto dal: Jan 2004
Città: legoland
Messaggi: 121
|
Codice (sempre parziale) dell' oggetto Campo:
Codice PHP:
Codice PHP:
|
![]() |
![]() |
![]() |
#7 |
Registered User
Iscritto dal: Jan 2004
Città: legoland
Messaggi: 121
|
Niente? Nessun commento, nessuna risposta?
Nemmeno tu, cionci, dici qualcosa? |
![]() |
![]() |
![]() |
#8 |
Senior Member
Iscritto dal: Mar 2004
Messaggi: 16053
|
io e il VB siamo due cose opposte ma qualche cosuccia la so
![]() ora ho scaricato il progetto ![]() ![]() ![]() |
![]() |
![]() |
![]() |
#9 | |
Registered User
Iscritto dal: Jan 2004
Città: legoland
Messaggi: 121
|
Quote:
Grazie |
|
![]() |
![]() |
![]() |
#10 | |
Senior Member
Iscritto dal: Mar 2004
Messaggi: 16053
|
Quote:
comunque una mano me la daresti se scrivi due righe di come hai implementato il programma...una specie di analisi ![]() |
|
![]() |
![]() |
![]() |
#11 |
Registered User
Iscritto dal: Jan 2004
Città: legoland
Messaggi: 121
|
Ci sono tre form:
Il principale con il campo da gioco, uno con i punteggi, uno con le opzioni per personalizare la partita. Ai form secondari ci si accede selezionando la relativa voce nel menu, e per tornare in dietro basta chiuderli. Ci sono quatro difficoltà, (l' ultima è nascosta) e inizialmente solo la più facile è sbloccata, poi completando un livello si accede a quello successivo. In ogni livello del gioco ci sono ingredienti extra che non sono presenti nel prato fiorito di windows, evoluti a seconda della difficoltà: - Le caselle si ricoprono dopo un tot di secondi. Più il livello di difficoltà è alto, più tempo ti viene concesso prima che ciò accada - Ogni tanto degli aerei aggiungono mine. Attualmente in fase di programmazione. - Soldati. Graficamente sono rapresentati da un mirino che si muove per il campo. Se ci passi sopra con il mouse muori. ce ne sono di tre tipi: Il 1° si mouve lento sollo parallelamente agli assi e solo sulle caselle coperte. Se non ha un attorno a lui una casella dove spostarsi sparisce. Il 2° va in diagonale e sempre solo su caselle coperte, è veloce, e se rimane bloccato non sparisce, ma aspetta che le caselle si ricoprano e torna a muoversi. il 3° e' l'unico che può muoversi dappertutto, è sempre a una casella di distanza dalla freccia del tuo mouse, e se ti fermi in una casella per più di tre decimi ti raggiunge. Muori anche se abbandoni il terreno di gioco. I punteggi si basano sul numero di mine presenti nel campo, sul numero di soldati nemici, (+ un extra per quelli "uccisi"), e sul tempo impiegato, e vengono memorizati su un file (malamente) criptato per impedire che venga editato. |
![]() |
![]() |
![]() |
#12 |
Registered User
Iscritto dal: Jan 2004
Città: legoland
Messaggi: 121
|
prima ho spiegato com' è il gioco. Ora invece faccio uno schema generale del codice.
Le caselle compongono una matrice monodimensionale (ImgCas()) di controlli image creati dinamicamente, che durante il gioco prendo le immagini da un secondo array fisso che contiene tutte le figure (imgcrlt()). Per poter lavorare più semplicemente ho creato una matrice bidimensionale di immagini (più altri dati che mi servivano) nell oggetto campo (fi.g()), e l' ho associata a quella sul form. Esempio: Ho un campo di 10 X 10 e le istruzioni imgcas(20) sul Form e g(2,0) in Campo puntano alla stessa casella. Per evitare di fare controlli fra immagini, uso il tag delle caselle per contenere in numero di indice del relativo controllo image nel arrey imgcrtl(). Esempio: Voglio controllare se una casella è coperta. L'immagine della casella copertà è contenuta nella posizione 0 dell' arrey imgcrtl(). al posto di usare questo controllo if imgcas(index).picture=imgcrtl.picture(1) then che è un controllo pixel per pixel dell 'intera bipman, all inizio assegno il numero dell immagine insieme all immagine stessa e poi faccio un confronto sui tag imgcas(index).picture=imgcrtl(1).picture imgcas(index).tag=1 ..... if imgcas(index).tag=1 then Ultima modifica di visual_b : 22-07-2005 alle 00:28. |
![]() |
![]() |
![]() |
#13 |
Registered User
Iscritto dal: Jan 2004
Città: legoland
Messaggi: 121
|
Ogni soldato (tranne il cecchino), è contenuto in un array dinamico di oggetti che viene ridimensionato a seconda del numero di caselle,e in base alle impostazioni della partita i soldati vengono divisi fra i 2 tipi, e viene assegnata loro una posizione casuale (controllando di non sovrapporli).
Nella sub Sol (che è quella dove vengono istanziati i soldati), viene creato un soldato ogni 100 caselle (se l'opzone è stata attivata) +1 (per arrotondamento), e se una sola tipologia è attiva, diventano tutti dello stasso tipo, mentre se sono presenti soldati di tutte e due i tipi, due terzi diventano del primo tipo (più semplici), e i restanti diventano del secondo Esempi: campo da 200 caselle, tutt' e due i tipi attivati ==> 2 del 1° tipo e 1 del 2° campo da 780 solo primo tipo ==> 8 del 1° campo da 50 solo 2°tipo ==> 1 del 2° Il cecchino invece è sempre e solo uno, e viene semplicemente attivato con set xxx= new cosone (xxx è il nome della variabile e Cosone della classe oggetto) (avevo già setto che ho usato nomi stupidi !!!!) ho disattivato set xxx= nothing ha seconda della partita. Ultima modifica di visual_b : 22-07-2005 alle 00:29. |
![]() |
![]() |
![]() |
#14 |
Registered User
Iscritto dal: Jan 2004
Città: legoland
Messaggi: 121
|
Gli aerei e il "fattore sorpresa" sono in lavorazione.
Le impostazioni degli extra sono memorizati nella variabile globale di un byte GTO nel modulo bas standar settando a 0 o 1 il bit relativo all impostazione. Ordine dei bit: 1°- soldati semplici (bit a 0 disattivato/bit a uno attivato) 2°- soldati plus "" "" 3°-cecchino "" "" dal 4° al 6° Aerei "" "" 7°-fattore sorpresa "" "" 8°-vuoto Esempio: gto=3 (00000011 in binario) ==>i primi 2 tipi di soldato sono attivati gto=68 (01000100 "" ) ==>fattore sorpresa e cecchino attivati gto=127 (01111111 "" ) ==>attivato tutto gto=0 (00000000 "" ) ==>niente di attivato L' unico extra non disattivabile e sempre presente nel gioco è la ricopertura delle caselle. Il numero di secondi prima che una casella si ricopra è uguale a il numero totale di caselle diviso 2,4 Esempio campo 12*12==>144 caselle==> Le caselle rimangono scoperte 1 minuto campo 20*30==>600 caselle==> Le caselle rimangono scoperte 4 min. e 10 Le mine sono presenti in percentuale variabile in dipendenza alle dimensioni del campo con una funzione matematica e che và dal 15% del livello più facile, al 20% del più duro. |
![]() |
![]() |
![]() |
#15 |
Registered User
Iscritto dal: Jan 2004
Città: legoland
Messaggi: 121
|
Schema Logico Generale
1) il programma si parte con il formV (il principale) vuoto. 2) si legge sul file "classifica.mine" il livello più difficile completato e si parte con quello successivo, altrimenti si parte con quello base 3)si controlla se c'e gia un campo sul form==> SI-prosegui / No-vai al 5) 4)distruggi il vecchio campo 5)le caselle nuove vengono create, impostate con l'immagine della casella chiusa e associate al corrispondente nell' oggetto campo 6)in LblMine viene scritto il numero di bandiere a disposizione 7)la faccina e le caselle con il tempo e le bendiere vengono piazzati 8)nell 'ogg. Campo la sub Mine() aggiunge le mine in posizione casuale nelle caselle voute, scrive in un arrey le loro coordinate e passa l'arrey alla funzione Poli() (nota- il numero di mine è uguale a quello delle bandiere scritto in LblMine) 9)La funzione Poli nella classe ogg. Campo somma 1 alla variabile m di ogni casella addiacente alle coordinate dell' arrey 10)vengono creati e soldati e aerei 11)se si preme sulla faccina si comporta come un pulsante (cambio di "espressione") ==> SI- va al punto 3)/ NO- prosegui 12)quando la prima casella viene premuta si attiva il timer 13)i cicli del timer gestiscono il muovimento dei soldati, gli attachhi aerei e la ricopertura delle caselle. - vedi 18) 14)gli eventi del mouse sulle caselle gestiscono le bandiere, lo "sparo dei soldati", la scoppritura del terreno, la simulazione grafica di "pressione pulsante" e il "cambio di pressione" della faccina. - vedi 17) 15)se si scopre una casella vuota si passano le sue coordinate all' arrey della funzione Poli nell' ogg. Campo che svuota tutte le casselle addiacenti, e se fra loro scopre altri spazzi vuoti, li aggiunge all' arrey e ricomincia 16)controlla se si scopre una mina==>SI- vai a 26) / NO-prosegui 17)controlla se si passa su un soldato==>SI- vai a 26) / NO-prosegui 18)controlla se il tempo di una casella scoperta scade ricoprila 19)controlla se tutte le caselle coperte hanno sotto una mina o sono coperte da un soldato ==> SI- prosegui / NO- vai a 28) 20)faccina con occhiali da sole (vittoria) 21)controlla se ci si è classificati==> SI- Prosegui / No vai a 24) 22)Aggiungi il punteggio alla classifica nel file 23)Esegui 35) poi prosegui qui 24)blocca il timer e la possibilità di premere le caselle 25) Vai alla 2) 26)faccina da morto (sconfitta) 27)vai a 2) 28)scelta nel menù di una nuova partita con il livello di difficolta n°Tot==>vai a 3) 29)scelta nel menù di una nuova partita con il livello di difficolta personalizzato 30)nascodi FrmV 31)mostra FrmZ (form partita personalizata) 32)abilità le opzioni in base alle modalità di gioco sbloccate 33)imposta le scelte del giocatore sulla varaiabile globale GTO 34)alla chiusura di FrmZ nascondi FrmZ e mostra FrmV 35)Disabilità i punti 36)vai a 3) 37)scelta nel menù di mostrare la classifica 38)mostra il form FrmU Ultima modifica di visual_b : 21-07-2005 alle 23:54. |
![]() |
![]() |
![]() |
#16 |
Registered User
Iscritto dal: Jan 2004
Città: legoland
Messaggi: 121
|
Se voui sapere qualcosa di più specifico chiedi pure.
Se le mie spiegazioni (fatte da cane) non le capisci puoi sempre piazzare break point in massa per il gioco e provare. Comunque oltre agli errori citati non DOVREBBERO essercene altri. Grazie ancora. |
![]() |
![]() |
![]() |
#17 |
Registered User
Iscritto dal: Jan 2004
Città: legoland
Messaggi: 121
|
up
|
![]() |
![]() |
![]() |
#18 |
Senior Member
Iscritto dal: Mar 2004
Messaggi: 16053
|
OK grazie per le INFO adesso le leggo e do un'occhiata al sorgente e faccio qualche prova di debug per capire dove sbaglia
![]() |
![]() |
![]() |
![]() |
#19 |
Registered User
Iscritto dal: Jan 2004
Città: legoland
Messaggi: 121
|
sirus come và?
|
![]() |
![]() |
![]() |
#20 | |
Senior Member
Iscritto dal: Mar 2004
Messaggi: 16053
|
Quote:
![]() ![]() ![]() |
|
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 03:41.