private void Form1_Load(object sender, EventArgs e) //Interfaz cargando { PB_Lienzo2.Parent = PB_Lienzo; //Lienzo 2 debe ser hijo de Lienzo para que pueda aplicarse transparencia sobre este último PB_Lienzo2.Location = new Point(0, 0); //Se coloca el lienzo 2 en la posicion (0,0) sobre el Lienzo 1, quedando uno sobre otro (esto se debe a que se ha hecho uno hijo del otro) g = PB_Lienzo2.CreateGraphics(); //Se asigna el lienzo2 como fondo para la herramienta de dibujo PB_Lienzo2.Image = new Bitmap(640, 480); //Se debe crear una imagen en el lienzo para poder mantener cada objeto dibujado CB_TAM.SelectedIndex = 5; //Se selecciona un valor de tamaño por defecto de 10 actualizar_jugador(1); //Configura la interfaz para adaptarla al jugador 1 reconect(); //Inicializa el sensor Kinect }
private void PB_Lienzo2_MouseMove(object sender, MouseEventArgs e) //Esta función dibuja usando el ratón { if (click) //Si se esta presionando el botón del ratón se dibuja { //se crean variables locales de color y tamaño a un valro por defecto Color color_elejido = Color.Black; int grosor = 24; if (jugador_sel == 1) //Si el jugador seleccionado es el 1 { //Se asiganan a las anteriores variables los valores de color y tamaño almacenados para el jugador 1 color_elejido = B_Selec1.BackColor; grosor = tam1; } else //Si el jugador seleccionado es el 2 //Se asiganan a las anteriores variables los valores de color y tamaño almacenados para el jugador 1 { color_elejido = B_Selec2.BackColor; grosor = tam2; } //se crean variables X e Y que corresponden a la posición del cursor sobre el Lienzo de dibujo. (Es necesario mapearlo segun el tamaño del Lienzo) int x = (int)(PB_Lienzo2.PointToClient(Cursor.Position).X *(640.0 / (float)PB_Lienzo2.Width)); int y = (int)(PB_Lienzo2.PointToClient(Cursor.Position).Y *(480.0 / (float)PB_Lienzo2.Height)); //Se dibuja un dirculo en la posición obtenida (se usa "Graphics.FromImage" de forma que se alamacene el dibujo anterior y se dibuje encima de este. De esta forma no se elimina lo dibujado) Graphics.FromImage(PB_Lienzo2.Image).FillEllipse(new SolidBrush(color_elejido), x - (grosor / 2), y - (grosor / 2), grosor, grosor); if (antx[6] > 0 || anty[6] > 0) //Si existe un punto anterior registrado { //Se dibuja una linea entre el punto anterior y el actual. De esta forma se suaviza el dibujo Graphics.FromImage(PB_Lienzo2.Image).DrawLine(new Pen(color_elejido, grosor), x, y, antx[6], anty[6]); } PB_Lienzo2.Invalidate(); //necesario para que no se refresque el dibujo y no se borre //Finalmente se guarda el valor actual como ultimo punto registrado antx[6] = x; anty[6] = y; } else { //si no se esta pulsando el ratón se borra el punto anterior antx[6] = 0; anty[6] = 0; } }
private void SpeechRecognized(object sender, SpeechRecognizedEventArgs e) { //se comprueban todos los comandos de voz registrados para ver cual coincide con el captado pro la kinect const double ConfidenceThreshold = 0.3; if (e.Result.Confidence >= ConfidenceThreshold) { switch (e.Result.Semantics.Value.ToString()) { case "PEQUEÑO": //se ha seleccionado el tamaño de pincel pequeño CB_TAM.SelectedIndex = 1; //cambia el combobox al valor en la posicion 1 break; case "MEDIANO": //se ha seleccionado el tamaño de pincel mediano CB_TAM.SelectedIndex = 5; //cambia el combobox al valor en la posicion 5 break; case "GRANDE": //se ha seleccionado el tamaño de pincel grande CB_TAM.SelectedIndex = 8; //cambia el combobox al valor en la posicion 8 break; case "C_ROJO": //se ha seleccionado el color de pincel rojo if (jugador_sel == 1) //si esta seleccionado el jugador 1 { B_Selec1.BackColor = Color.Red; //se actualiza el color del jugador 1 } else { B_Selec2.BackColor = Color.Red; //se actualiza el color del jugador 2 } break; case "C_NEGRO": //se ha seleccionado el color de pincel negro if (jugador_sel == 1) //si esta seleccionado el jugador 1 { B_Selec1.BackColor = Color.Black; //se actualiza el color del jugador 1 } else { B_Selec2.BackColor = Color.Black; //se actualiza el color del jugador 2 } break; case "C_BLANCO": //se ha seleccionado el color de pincel blanco if (jugador_sel == 1) //si esta seleccionado el jugador 1 { B_Selec1.BackColor = Color.White; //se actualiza el color del jugador 1 } else { B_Selec2.BackColor = Color.White; //se actualiza el color del jugador 2 } break; case "C_GRIS": //se ha seleccionado el color de pincel gris if (jugador_sel == 1) //si esta seleccionado el jugador 1 { B_Selec1.BackColor = Color.Gray; //se actualiza el color del jugador 1 } else { B_Selec2.BackColor = Color.Gray; //se actualiza el color del jugador 2 } break; case "C_NARANJA": //se ha seleccionado el color de pincel naranja if (jugador_sel == 1) //si esta seleccionado el jugador 1 { B_Selec1.BackColor = Color.Orange; //se actualiza el color del jugador 1 } else { B_Selec2.BackColor = Color.Orange; //se actualiza el color del jugador 2 } break; case "C_ROSA": //se ha seleccionado el color de pincel rosa if (jugador_sel == 1) //si esta seleccionado el jugador 1 { B_Selec1.BackColor = Color.Pink; //se actualiza el color del jugador 1 } else { B_Selec2.BackColor = Color.Pink; //se actualiza el color del jugador 2 } break; case "C_AMARILLO": //se ha seleccionado el color de pincel amarillo if (jugador_sel == 1) //si esta seleccionado el jugador 1 { B_Selec1.BackColor = Color.Yellow; //se actualiza el color del jugador 1 } else { B_Selec2.BackColor = Color.Yellow; //se actualiza el color del jugador 2 } break; case "C_AZUL": //se ha seleccionado el color de pincel azul if (jugador_sel == 1) //si esta seleccionado el jugador 1 { B_Selec1.BackColor = Color.Blue; //se actualiza el color del jugador 1 } else { B_Selec2.BackColor = Color.Blue; //se actualiza el color del jugador 2 } break; case "C_VERDE": //se ha seleccionado el color de pincel verde if (jugador_sel == 1) //si esta seleccionado el jugador 1 { B_Selec1.BackColor = Color.Green; //se actualiza el color del jugador 1 } else { B_Selec2.BackColor = Color.Green; //se actualiza el color del jugador 2 } break; case "C_MORADO": //se ha seleccionado el color de pincel morado if (jugador_sel == 1) //si esta seleccionado el jugador 1 { B_Selec1.BackColor = Color.Purple; //se actualiza el color del jugador 1 } else { B_Selec2.BackColor = Color.Purple; //se actualiza el color del jugador 2 } break; case "FOTO": //se ha seleccionado hacer una foto photo(); break; case "BORRAR": //se ha seleccionado hacer borrar PB_Lienzo2.Invalidate(); PB_Lienzo2.Image = new Bitmap(640, 480); //Crea un nuevo mapa de bits sobre el que dibujar (borrando todo lo anterior) break; case "AYUDA": //se ha seleccionado ayuda Ayuda.Visible = true; //hace visible un dialogo de ayuda break; case "CERRAR": //se ha seleccionado cerrar la ayuda Ayuda.Visible = false; //hace invisible el dialogo de ayuda break; case "P1": //jugador 1 (círculo) seleccionado actualizar_jugador(1); //configura todos los controles para indicar que se ha seleccionado el juagador 1 break; case "P2": //jugador 2 (cuadrado) seleccionado actualizar_jugador(2); //configura todos los controles para indicar que se ha seleccionado el juagador 1 break; } } }
private void PB_Lienzo2_Resize(object sender, EventArgs e) { //Si el lienzo cambia de tamaño se debe asignar a la herramienta grafica el lienzo de nuevo (actualizando el tamaño del area de dibujo) g = PB_Lienzo2.CreateGraphics(); }
private void Borrador_Click(object sender, EventArgs e) { //Si se pulsa el boton borrar PB_Lienzo2.Invalidate(); PB_Lienzo2.Image = new Bitmap(640, 480); //Crea un nuevo mapa de bits sobre el que dibujar (borrando todo lo anterior) }
private void PB_Lienzo_SizeChanged(object sender, EventArgs e) { //Si el lienzo sobre el que se dibuja cambia de tamaño se debe refrescar el dibujo (Lienzo 2) PB_Lienzo2.Refresh(); }
private void SensorSkeletonFrameReady(object sender, SkeletonFrameReadyEventArgs e) // Nueva transmision de datos de los esqueletos { esqueletos = new Skeleton[0]; //Elimina esqueletos anteriores using (SkeletonFrame skeletonFrame = e.OpenSkeletonFrame()) { if (skeletonFrame != null) { //Si se han detectado esqueletos se asiganan a la variable "esqueletos" esqueletos = new Skeleton[skeletonFrame.SkeletonArrayLength]; skeletonFrame.CopySkeletonDataTo(esqueletos); } } if (esqueletos.Length != 0) //Si hay algun esqueleto detectado { Color color_elejido = Color.Black; //Se crea una variable común (color_elegido) para disminuir codigo int grosor = 10; //Se crea una variable común (grosor) para disminuir codigo busca(); //busca cambios con respecto a la posicion de los esqueletos anteriormente for (int i = 0; i < esqueletos.Length; i++) { //Se recorre cada esqueleto y se guardan las posiciones de la mano derecha mapeadas sobre la camara de video int x = (int)(sensor.CoordinateMapper.MapSkeletonPointToDepthPoint(esqueletos[i].Joints[JointType.HandRight].Position, DepthImageFormat.Resolution640x480Fps30).X); int y = (int)(sensor.CoordinateMapper.MapSkeletonPointToDepthPoint(esqueletos[i].Joints[JointType.HandRight].Position, DepthImageFormat.Resolution640x480Fps30).Y); if (x != 0 && y != 0) //Si X e Y no son 0 (ha encontrado la posición de la mano) { if (esq[0] == i) //Si el esqueleto que se esta procesando es el primero (posicion 0), es porque es el jugador 1 { color_elejido = B_Selec1.BackColor; //Se asigna el color del jugador 1 grosor = tam1; //Se asigna el grosor del pincel del jugador 1 } else if (esq[1] == i) //Si el esqueleto que se esta procesando es el Segundo (posicion 1), es porque es el jugador 2 { color_elejido = B_Selec2.BackColor; //Se asigna el color del jugador 2 grosor = tam2; //Se asigna el grosor del pincel del jugador 2 } //Si se detecta una distancia en el eje Z, entre la mano y el centro de los hombros, superior a tolerancia, se debera dibujar if (esqueletos[i].Joints[JointType.ShoulderCenter].Position.Z - esqueletos[i].Joints[JointType.HandRight].Position.Z > tolerancia) { //como se esta dibujando se debe pintar en el lienzo un punto (elipse) en la posicion de la mano. Graphics.FromImage(PB_Lienzo2.Image).FillEllipse(new SolidBrush(color_elejido), x - (grosor / 2), y - (grosor / 2), grosor, grosor); if (antx[i] > 0 || anty[i] > 0) //Si existe un punto anterior, se dibuja entre este y el actual una linea recta. (Así se evitan saltos y el dibujo se ve mas fluido) //se usa "Graphics.FromImage" para evitar que se limpie el dibujo al refrescar el lienzo. { Graphics.FromImage(PB_Lienzo2.Image).DrawLine(new Pen(color_elejido, grosor), x, y, antx[i], anty[i]); } PB_Lienzo2.Invalidate(); //Ademas se actualizan los valores anteriores con la posicion actual antx[i] = x; anty[i] = y; } else { //Si no, se dibujará un objeto para marcar la posición que desaparecera al refrescar la pantalla if (esq[0] == i) // si es el jugador 1 dibujara un ciruclo { g.DrawEllipse(new Pen(color_elejido, 12), new Rectangle((int)((x * ((float)PB_Lienzo2.Width / 640))), (int)((y * (float)PB_Lienzo2.Height / 480)), 50, 50)); } else { // si es el jugador 2 dibujara un rectangulo g.DrawRectangle(new Pen(color_elejido, 12), new Rectangle((int)((x * ((float)PB_Lienzo2.Width / 640))), (int)((y * (float)PB_Lienzo2.Height / 480)), 50, 50)); } //Ademas como se ha dejado de dibujar, el punto guardado como anterior se resetea. antx[i] = 0; anty[i] = 0; } } } } }