Buonasera. Ho un problema che non riesco da risolvere ormai da giorni. Il problema consiste nel sincronizzare le azioni tra due processi che comunicano usando due pipe. In particolare un processo, si occupa di "muovere un giocatore" e scrivere all'altro processo le coordinate aggiornate, in modo tale che l'altro processo(padre) lo possa rappresentare. Il padre, inoltre controlla se il giocatore salga su un oggetto in movimento, in tal caso aggiorna una copia locale ad esso del giocatore per tutto il tempo in cui esso si trova sull'oggetto. Non appena il giocatore "scende", questo deve essere disegnato esattamente nel punto in cui è sceso, anziché essere disegnato nel punto da cui era salito sull'oggetto. Vorrei chiedervi di darmi una mano a risolvere il problema, dovuto al fatto che il giocatore, una volta che collide con l’oggetto(che è un altro processo che si aggiorna nel mentre) non sale affatto sull’oggetto.Inoltre il giocatore, nel suo processo, legge da un’altra pipe in cui il padre scrive la sua versione aggiornata, in modo tale che se si trova in una posizione diversa rispetto alla precedente, assume la nuova posizione, mantenendo le altre caratteristiche invariate. Nel processo giocatore, la funzione che si occupa di aggiornarlo, riceve l’input da tastiera, ma non in maniera bloccante, ovvero se non viene rilevato nulla, il codice va avanti. Vi allego il codice, ripulito da dettagli insignificanti, mantenendo solo ciò che serve per "sbrogliare" la logica, perciò è più uno pseudocodice, anziché il codice vero e proprio “funzionante”. Vi ringrazio per l’aiuto.
void giocatore(Giocatore *giocatore, //.. parametri vari)
{
// Chiusura degli estremi delle pipe inutilizzati
close(pipeGiocatore1Lettura);
close(pipeGiocaScrittura);
Giocatore giocatoreLocale;
while (true)
{
read(pipeGiocatore2Lettura, &giocatoreLocale, sizeof(Giocatore));
if(giocatoreLocale.pos != giocatore->poi) // E’ cambiata la posizione
Giocatore = giocatoreLocale;
aggiornaGiocatore(giocatore);
giocatore->aggiornato = true;
muoviGiocatore(giocatore);
write(pipeGiocatore1Scrittura, giocatore, sizeof(Giocatore));
gioocatore->aggiornato = false;
}
}
void gioco(// Vari parametri)
{
Giocatore giocatoreLocale;
close(pipeGiocatore1Scrittura);
close(pipeGiocatore2Lettura);
while (true)
{
// Se il giocatore non si è mosso, viene disegnato dove era prima, altrimenti si cancella e si disegna nella nuova posizione
if(giocatoreLocale.aggiornato)
{
distruggiGiocatore(&giocatoreLocale);
disegnaGiocatore(&giocatoreLocale);
}
// Rilevamento collisione con un oggetto di un'array di oggetti
for(int i = 0; i < NUM_OGGETTI; i++)
{
if(vaSopra(giocatoreLocale, oggetto[i]))
{
if(!giocatoreLocale.aggiornato)
{
giocatoreSopra = true;
Posizione pos = oggetto[i].pos;
impostaPosGiocatore(&giocatoreLocale, pos);
muoviGiocatore(&giocatoreLocale);
distruggiGiocatore(&giocatoreLocale);
disegnaGiocatore(&giocatoreLocale);
}
}
giocatoreLocale.aggiornato = false;
giocatoreSopra = false;
}
}
}