C# Divisione PictureBox

Stato
Discussione chiusa ad ulteriori risposte.

1T1

Utente Silver
6 Gennaio 2017
117
41
0
98
Sto cercando di creare un ostacolo 2D con il form che però si deve frantumare quando incontra il proiettile. Come posso fare? Deve solo danneggiarsi l'ostacolo non rompersi a metà
 
Sto cercando di creare un ostacolo 2D con il form che però si deve frantumare quando incontra il proiettile. Come posso fare? Deve solo danneggiarsi l'ostacolo non rompersi a metà

Non ho ben capito in che ambiente stia lavorando, ma l'idea in generale è quella di rappresentare lo stato dell'ostacolo con una variabile (per spaceinvaders mi sa che sia una 3 bit).

All'evento "ostacolo colpito" decrementi questa variabile, a meno che non sia 0: in questo caso elimini l'oggetto o fai quel che vuoi che succeda.
Ad ogni update del sistema leggi la variabile ed aggiorni l'ambiente ;)
 
Su Visual Studio con un Windows Form. Per la vita avevo capito, ma per la parte grafica non so come distruggere la parte colpita
 
Su Visual Studio con un Windows Form. Per la vita avevo capito, ma per la parte grafica non so come distruggere la parte colpita

In questo caso, se vuoi che sia esattamente la parte colpita a deteriorarsi devi semplicemente espandere il concetto ad un sistema più grande: il singolo ostacolo non va più considerato come tale, ma come l'insieme di tanti piccoli ostacoli.

Il mio suggerimento precedente in tal senso perde di significato: non serve che l'ostacolo si deteriori gradualmente ma che si distrugga nel punto in cui è stato colpito. Puoi anche far sì che ogni punto dell'ostacolo si deteriori gradualmente, e per questo quanto già detto va bene.
Infatti il concetto è sempre lo stesso: dal punto di vista implementativo puoi gestire la cosa con un vettore o con una matrice.

In pratica ad ogni ostacolo devi associare una serie di punti "colpibili", il cui numero dipende dalla precisione che vuoi dare al singolo colpo e da quanto realistico deve apparire il tutto.

Semplicisticamente, supponiamo che ogni ostacolo grande (n righe)x(m colonne) sia descritto da un array bidimensionale "parti_ostacolo[n][m]" i cui valori rappresentino lo stato complessivo dell'ostacolo.
Il valore descritto da parti_ostacolo[0][0] sarà lo stato dell'angolino in alto a sinistra dell'ostacolo, quello di parti_ostacolo[0][m-1] sarà quello dell'angolino in alto a destra, quello di parti_ostacolo[n-1][0] sarà quello in basso a sinistra, quello di parti_ostacolo[n-1][m-1] sarà quello in basso a destra, parti_ostacolo[0][1] sarà il secondo quadratino della prima riga contando da sinistra a destra, e così via.

Ora, come prima, all'evento "particella dell'ostacolo colpita", cambi il valore della matrice relativo al punto colpito ed all'update del sistema aggiorni opportunamente la grafica.
Puoi introdurre facilmente la forza del proiettile ed altri fattori e far sì che anche le "particelle" dell'ostacolo limitrofe a quelle colpite subiscano deterioramento.

In questo caso inoltre ti ricordo che bisogna far sì che le parti già distrutte dell'ostacolo non siano più "colpibili", quindi andrà opportunamente modificato l'evento "ostacolo colpito".


Spero sia chiaro, sono a disposizione per eventuali delucidazioni :)
 
Ora il problema è che tutti quei pixel rallentano il gioco. Ho provato ad ingrandire i "pixel" a 5, ma non funziona lo stesso e tutto lagga rimanendo ingiocabile...
 
allora il metodo del movimento della navicella è richiamato da un timer ed è costruito così
C#:
        private void movement()
        {
            if (_moveLeft)
                ship.Left += -15;

            if (_moveRight)
                ship.Left += 15;
        }
dove _moveleft e _moveright sono due booleane settate dall'evento KeyDown
C#:
        private void Form1_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.A)
            {
                _moveLeft = true;
                _moveRight = false;
            }
            else if (e.KeyCode == Keys.D)
            {
                _moveLeft = false;
                _moveRight = true;
            }
        }
e vengono risettati dall'evento KeyUp in questo modo per farli fermare
C#:
        private void Form1_KeyUp(object sender, KeyEventArgs e)
        {
            _moveLeft = false;
            _moveRight = false;
        }

Il movimento del fuoco invece viene controllato da un ciclo for ogni tick del timer
C#:
             for (int i = 0; i < Fuoco.Count; i++)
            {
                Fuoco[i].Top -= 10;
                ...
                ...
                ...
            }
 
Hai fatto un vero e proprio strumento di autodistruzione [emoji23]
Per il movimento del fuoco puoi usare un timer che sposta l'immagine su asse X in base Y senza cicli ed inserisci un controllo che ad ogni spostamento controlla se esiste un picturebox "cioè il nemico" e se esiste lo elimina. Per il movimento selezioni il winform e metti che il tasto Key left e key right spostano il Player su asse y di tot punti.

www.freewardeveloper.net
 
Ma il fuoco deve essere più di uno, ma comunque ci proverò, poi se si tiene premuto con gli eventi KeyDown c'è un blocco iniziale è per questo che ho cambiato il modo di muoversi
 
Ho creato una List di Picturebox, ma devo sempre scorrere tutti gli per farli renderizzare, no?
 
Sto cercando di usare il ConcurrentDictonary, devo usare i bool come key e le PictureBox come value, giusto? Quindi ogni frame devo fare un for che mostra il fuoco e lo sposta. Se c'è il click ne aggiunge uno, così?
 
Sto cercando di scorrere il dictionary ma non posso indicizzarlo, come posso scorrerlo? In più le values non riesco a "prenderle", né riesco ad aggiungere. Devo fare un nuovo dizionario?
 
In teoria sono riuscito:
C#:
            PictureBox[] values = new PictureBox[listaFuoco.Count];
            int x = 0;
            foreach (object fire in listaFuoco)
            {
                values[x] = (PictureBox)fire;
                x++;
            }
Ma non capisco cosa cambia a questo punto rispetto la soluzione di prima. Ora non riesco però ad aggiungere il fuoco nel dizionario perché mi segna che listaFuoco è null. Un'altra cosa è il parametro in TryAdd della Value che viene passato come out, per cui come fa ad inserire il valore se poi viene azzerato?
 
Stato
Discussione chiusa ad ulteriori risposte.