C# Divisione PictureBox

Stato
Discussione chiusa ad ulteriori risposte.
Secondo me non sono i pixel nel form a far laggare, non penso che ce ne siano 3000 e passa, rendi il codice asyncrono e ti si fixa.
 
Ultima modifica:
Un altro problema in corso d'opera. La soluzione asincrona funziona poi però la collisione tra il fuoco e l'ostacolo viene "ritardata" (a causa dello spostamento del fuoco di 15 che però non posso diminuire) e per questo non si elimina il primo pixel che sarebbe dovuto andare in contatto. Come posso fare? Dovrei trovare un modo di calcolare la possibile collisione anche in mezzo ai tick del timer
 
Praticamente la collisione tra due oggetti avviene in mezzo agli eventi tick del timer, per cui la collisione non viene colta
Come lo hai impostato il codice nella win form? Non dovresti avere problemi

//il timer richiamato ogni 30frame al secondo
void Update_Tick() {

//logica, movimenti e tutto
player.move()
proiettili.move()
etc...

//render, qua li muovi effettivamente nello schemrmo

player.render()
proiettili.render()

}
Messaggio unito automaticamente:

Hai piu timer? se ne hai uno per tutti la cosa dovrebbe essere sequenziale, trovi le collisioni, fixi le coordinate e poi li muovi tutti insieme alla fine
 
Il codice è impostato così con un solo timer:
Codice:
void timer_tick(...)
{
    // aggiorna le label dello score
    
    // movimento nave
    // stampa le pictureBox della vita
    
    // ciclo che renderizza il fuoco spostato
    //        dentro controlla le collisioni del fuoco
    
    // ciclo che sposta il fuoco nemico
    //        controlla le collisioni
    //                aggiunge eventuale score
}

Il problema è che le collisioni vengono trovate in ritardo perché l'evento non viene richiamato abbastanza spesso
 
Le collisioni devi cercarle quando le muovi, se non ne trovi modifichi la posizione altrimenti no.
Non modificarle a prescindere
 
Ok, ho corretto ma ancora non trova le giuste collisioni, lascio la foto per far capire meglio

Immagine.png


Questo è la prova dell'ostacolo e i colpi che gli arrivano non vengono intersecati subito, ma dopo un po'
 
Ultima modifica:
Mh continuo a non capire scusa lol
Quello rosso è l'ostacolo classico di Space Invaders, il fuoco arriva da sotto per adesso è ovviamente si vede che il bordo non è stato toccato mentre il centro si. Come mai, come si potrebbe risolvere?
Messaggio unito automaticamente:

Un altro problema coinvolge invece la creazione degli oggetti. Anche se asincrona il 50% delle volte che avvio il programma, questo non risponde bloccando completamente la form
 
Penso sia problema di codice la collisione, non c'è motivo per cui te la trovi dopo.

---

Anche questo problema di codice
 
Il ciclo che calcola lo spostamento del fuoco nemico è così scritto (il break è una soluzione temporanea):
C#:
// ciclo principale per il movimento e le intersezioni del fuoco del player
                for (int i = 0; i < listaFuoco.Count; i++)
                {
                    listaFuoco[i].Top -= 15;

                    // se riceve un errore => break;
                    try
                    {
                        for (int j = 0; j < alieni.Length; j++)
                            if (Colpito(listaFuoco[i], alieni[j]))
                            {
                                score++;
                                if (score > maxScore)
                                    maxScore = score;

                                eliminaOggetto(alieni[j]);
                                eliminaOggetto(listaFuoco[i]);

                                listaFuoco.Remove(listaFuoco[i]);
                            }
                        for (int j = 0; j < ostacoli.Length; j++)
                            if (Colpito(listaFuoco[i], ostacoli[j]))
                            {
                                eliminaOggetto(ostacoli[j]);
                                eliminaOggetto(listaFuoco[i]);

                                listaFuoco.Remove(listaFuoco[i]);
                            }
                        if (listaFuoco[i].Location.Y < 0)
                            eliminaOggetto(listaFuoco[i]);
                    }
                    catch (Exception)
                    {
                        break;
                    }
                }
Ho già provato a mettere lo spostamento dopo, ma senza successo.

Colpito invece è semplicemente scritta così:
C#:
private bool Colpito(Control fire, Control toHitObject)
        {
            int x = fire.Location.X;
            int y = fire.Location.Y;
            
                if (fire.Bounds.IntersectsWith(toHitObject.Bounds))
                    return true;
 
            return false;
        }
 
Stato
Discussione chiusa ad ulteriori risposte.