non so se ho capito bene ma mi pare che
non c'è modo di "fermare" l'esecuzione del codice durante la visualizzazione dell'animazione
non sia corretto... cosa intendi esattamente?
osserva questo codice sotto, il form principale cambia colore in maniera indipendente dai cicli nel thread separato che gestisce un eventuale logica di gioco. nel particolare si tratta di un ciclo continuo che in caso risulti il turno del giocatore entra in un ciclo annidato dove attende la pressione del bottone da parte dell'utente, quando questa avviene esce dal ciclo annidato per eseguire il codice per il turno del computer.
codice:
using System;
using System.Linq;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Threading;
namespace SmartDeviceProject1
{
public partial class Form1 : Form
{
bool giocoAvviato;
bool GiocoAvviato
{
get
{
lock (lockThis) { return giocoAvviato; }
}
set
{
lock (lockThis) { giocoAvviato = value; }
}
}
bool attesaInput;
bool AttesaInput
{
get
{
lock (lockThis) { return attesaInput; }
}
set
{
lock (lockThis) { attesaInput = value; }
}
}
int numero=-1;
int Numero
{
get
{
lock (lockThis) { return numero; }
}
set
{
lock (lockThis) { numero = value; }
}
}
object lockThis = new object();
public Form1()
{
InitializeComponent();
timer.Interval = 2000;//imposto il timer a 2 secondi
timer.Tick += new EventHandler(timer_Tick);
timer.Enabled = true;
this.label1.Text = "Avvio gioco";
GiocoAvviato = true; //avvio il gioco
Thread t = new Thread(avviaGioco);//mando l'esecuzione in un thread separato dall'interfaccia
t.Start();
//da questo punto in poi il thread principale è in attesa di input e simula il funzionamento del tuo cambio del frame
//indipendente dal thread secondario che rimane in attesa di input dall'utente o della simulazione di attesa nel turno del computer
}
void timer_Tick(object sender, EventArgs e)
{
//cambio colore al form come prova di concetto della separazione dei thread
if (this.BackColor == Color.Red)
{
this.BackColor = Color.Yellow;
}
else
{
this.BackColor = Color.Red;
}
}
void avviaGioco()
{
//inizia il gioco
while (GiocoAvviato)
{
//se è in attesa di input dall'utente entra nel ciclo
while (AttesaInput)
{
//il ciclo continua finchè l'utente non preme il bottone che chiama Button1_Click ponendo numero = 1
if (Numero > -1)
{
//necessario per modificare il form da thread separato
if (this.InvokeRequired)
{
//eseguo il codice riguadante il turno del giocatore attraverso un delegato
this.Invoke(new cambio(turnoGiocatore));
}
else
{
//eseguo il codice riguadante il turno del giocatore
turnoGiocatore();
}
}
}
//se il codice non è nel primo loop significa che non è il turno del giocatore, ma se numero non è ancora -1 ma 0
//significa che il turno è già stato "passato" al codice del turno del computer che è fermo (simulato con Thread.Sleep(1000)
//questo serve a fare in modo che si riesca a leggere la label quando è il turno del computer
//se no è talmente veloce che si vede solo il turno del giocatore
if (Numero < 0)
{
//necessario per modificare il form da thread separato
if (this.InvokeRequired)
{
//eseguo il codice riguadante il turno del computer attraverso un delegato
this.Invoke(new cambio(turnoComputer));
}
else
{
//eseguo il codice riguadante il turno del computer
turnoComputer();
}
}
}
}
delegate void cambio();
void turnoComputer()
{
this.label1.Text = "Turno del giocatore";
//tuo codice di gioco per Giocatore ovvero il tuo "Gioco io"
Numero = 0;//imposto a 0 in modo che non entri nella condizione del turno del computer e nemmeno nel loop di attesa del turno del giocatore
Thread.Sleep(1000);//simulo un elaborazione di 1 secondo
AttesaInput = true;//faccio entrare il controllo del codice nel loop dell'attesa di input da parte del giocatore
this.button1.Enabled = true;//abilito il bottone per il turno del giocatore
}
void turnoGiocatore()
{
//se il numero è maggiore di 0 significa che l'utente ha premuto il bottone
if (Numero > 0)
{
//tuo codice di gioco per Computer ovvero il tuo "Gioca il computer;"
Numero = -1;//riporto numero a -1 per fare in modo che nel ciclo principale passi il turno del computer
AttesaInput = false;//faccio in modo che lesecuzione non si fermi sul turno del giocatore
this.button1.Enabled = false;//disabilito il bottone del giocatore
this.label1.Text = "Turno del computer";
}
}
private void button1_Click(object sender, EventArgs e)
{
Numero = 1;
}
private void button2_Click(object sender, EventArgs e)
{
GiocoAvviato = !GiocoAvviato;
}
}
}