/// <summary> /// Event handler for Kinect sensor's SkeletonFrameReady event /// </summary> /// <param name="sender">object sending the event</param> /// <param name="e">event arguments</param> private void SensorSkeletonFrameReady(object sender, SkeletonFrameReadyEventArgs e) { Skeleton[] skeletons = new Skeleton[0]; using (SkeletonFrame skeletonFrame = e.OpenSkeletonFrame()) { if (skeletonFrame != null) { skeletons = new Skeleton[skeletonFrame.SkeletonArrayLength]; skeletonFrame.CopySkeletonDataTo(skeletons); frame_act = skeletonFrame.FrameNumber; // Capturamos el número de frame en el que estamos } } using (DrawingContext dc = this.drawingGroup.Open()) { dc.DrawRectangle(Brushes.White, null, new Rect(0, 0, RenderWidth, RenderHeight)); if (skeletons.Length != 0) { foreach (Skeleton skel in skeletons) { //RenderClippedEdges(skel, dc); if (skel.TrackingState == SkeletonTrackingState.Tracked) { /****************************** IMPLEMENTACION DEL JUEGO *********************/ Point manoDer = new Point(); manoDer = SkeletonPointToScreen(skel.Joints[JointType.HandRight].Position); if (etapa == 0) { menu.Visibility = System.Windows.Visibility.Visible; Inicial1_1.Visibility = System.Windows.Visibility.Visible; Inicial1_2.Visibility = System.Windows.Visibility.Visible; Inicial2_1.Visibility = System.Windows.Visibility.Hidden; Inicial2_2.Visibility = System.Windows.Visibility.Hidden; Inicial3_1.Visibility = System.Windows.Visibility.Hidden; Inicial3_2.Visibility = System.Windows.Visibility.Hidden; Inicial3_3.Visibility = System.Windows.Visibility.Hidden; anterior.Visibility = System.Windows.Visibility.Hidden; siguiente.Visibility = System.Windows.Visibility.Visible; ayuda.Visibility = System.Windows.Visibility.Hidden; siguiente.Content = "SIGUIENTE"; puntuacionDos.Content = "0"; puntuacionUno.Content = "0"; dc.DrawRectangle(Brushes.LightGreen, null, new Rect(375, 295, 150, 40)); // Boton Siguiente if (tocaBoton(manoDer, bot_siguiente, new Point(150, 40))) // Toca el boton 'siguiente' { dc.DrawRectangle(Brushes.Green, null, new Rect(375, 295, 150, 40)); if (contando_sig == false) { id_jug_bot = skel.TrackingId; contando_sig = true; frame_ini = frame_act; } else { if ((frame_ini + 45) <= (frame_act)) // Hemos presionado el boton 'siguiente' { etapa += 1; contando_sig = false; id_jug_bot = -1; } } } else { if ((id_jug_bot != skel.TrackingId) && contando_sig) { contando_sig = true; } else { contando_sig = false; id_jug_bot = -1; } } } if (etapa == 1) { Inicial1_1.Visibility = System.Windows.Visibility.Hidden; Inicial1_2.Visibility = System.Windows.Visibility.Hidden; Inicial2_1.Visibility = System.Windows.Visibility.Visible; Inicial2_2.Visibility = System.Windows.Visibility.Visible; Inicial3_1.Visibility = System.Windows.Visibility.Hidden; Inicial3_2.Visibility = System.Windows.Visibility.Hidden; Inicial3_3.Visibility = System.Windows.Visibility.Hidden; anterior.Visibility = System.Windows.Visibility.Visible; siguiente.Visibility = System.Windows.Visibility.Visible; siguiente.Content = "SIGUIENTE"; dc.DrawRectangle(Brushes.LightGreen, null, new Rect(115, 295, 150, 40)); dc.DrawRectangle(Brushes.LightGreen, null, new Rect(375, 295, 150, 40)); // Boton Siguiente if (tocaBoton(manoDer, bot_siguiente, new Point(150, 40))) // Toca el boton 'siguiente' { dc.DrawRectangle(Brushes.Green, null, new Rect(375, 295, 150, 40)); if (contando_sig == false) { id_jug_bot = skel.TrackingId; contando_sig = true; frame_ini = frame_act; } else { if ((frame_ini + 45) <= (frame_act)) // Hemos presionado el boton 'siguiente' { id_jug_bot = -1; etapa += 1; contando_sig = false; } } } else { if ((id_jug_bot != skel.TrackingId) && contando_sig) { contando_sig = true; } else { contando_sig = false; id_jug_bot = -1; } } // Boton Anterior if (tocaBoton(manoDer, bot_anterior, new Point(150, 40))) // Toca el boton 'siguiente' { dc.DrawRectangle(Brushes.Green, null, new Rect(115, 295, 150, 40)); if (contando_ant == false) { id_jug_bot = skel.TrackingId; contando_ant = true; frame_ini = frame_act; } else { if ((frame_ini + 45) <= (frame_act)) // Hemos presionado el boton 'anterior' { id_jug_bot = -1; etapa -= 1; contando_ant = false; } } } else { if ((id_jug_bot != skel.TrackingId) && contando_ant) { contando_sig = true; } else { id_jug_bot = -1; contando_ant = false; } } } if (etapa == 2) { Inicial1_1.Visibility = System.Windows.Visibility.Hidden; Inicial1_2.Visibility = System.Windows.Visibility.Hidden; Inicial2_1.Visibility = System.Windows.Visibility.Hidden; Inicial2_2.Visibility = System.Windows.Visibility.Hidden; Inicial3_1.Visibility = System.Windows.Visibility.Visible; Inicial3_2.Visibility = System.Windows.Visibility.Visible; Inicial3_3.Visibility = System.Windows.Visibility.Visible; anterior.Visibility = System.Windows.Visibility.Visible; siguiente.Visibility = System.Windows.Visibility.Visible; dc.DrawRectangle(Brushes.LightGreen, null, new Rect(115, 295, 150, 40)); dc.DrawRectangle(Brushes.LightGreen, null, new Rect(375, 295, 150, 40)); siguiente.Content = "EMPEZAR"; // Boton Siguiente if (tocaBoton(manoDer, bot_siguiente, new Point(150, 40))) // Toca el boton 'siguiente' { dc.DrawRectangle(Brushes.Green, null, new Rect(375, 295, 150, 40)); if (contando_sig == false) { id_jug_bot = skel.TrackingId; contando_sig = true; frame_ini = frame_act; } else { if ((frame_ini + 45) <= (frame_act)) // Hemos presionado el boton 'siguiente' { id_jug_bot = -1; etapa += 1; contando_sig = false; } } } else { if ((id_jug_bot != skel.TrackingId) && contando_sig) { contando_sig = true; } else { contando_sig = false; id_jug_bot = -1; } } // Boton Anterior if (tocaBoton(manoDer, bot_anterior, new Point(150, 40))) // Toca el boton 'siguiente' { dc.DrawRectangle(Brushes.Green, null, new Rect(115, 295, 150, 40)); if (contando_ant == false) { id_jug_bot = skel.TrackingId; contando_ant = true; frame_ini = frame_act; } else { if ((frame_ini + 45) <= (frame_act)) // Hemos presionado el boton 'anterior' { id_jug_bot = -1; etapa -= 1; contando_ant = false; } } } else { if ((id_jug_bot != skel.TrackingId) && contando_ant) { contando_sig = true; } else { id_jug_bot = -1; contando_ant = false; } } } if (etapa == 3) { menu.Visibility = System.Windows.Visibility.Hidden; Inicial1_1.Visibility = System.Windows.Visibility.Hidden; Inicial1_2.Visibility = System.Windows.Visibility.Hidden; Inicial2_1.Visibility = System.Windows.Visibility.Hidden; Inicial2_2.Visibility = System.Windows.Visibility.Hidden; Inicial3_1.Visibility = System.Windows.Visibility.Hidden; Inicial3_2.Visibility = System.Windows.Visibility.Hidden; Inicial3_3.Visibility = System.Windows.Visibility.Hidden; anterior.Visibility = System.Windows.Visibility.Hidden; siguiente.Visibility = System.Windows.Visibility.Hidden; puntuacionUno.Visibility = System.Windows.Visibility.Visible; puntuacionDos.Visibility = System.Windows.Visibility.Visible; pausa1.Visibility = System.Windows.Visibility.Visible; pausa2.Visibility = System.Windows.Visibility.Visible; reiniciar.Visibility = System.Windows.Visibility.Visible; ayuda.Visibility = System.Windows.Visibility.Visible; // Dibujar el fondo negro dc.DrawRectangle(Brushes.Black, null, new Rect(0.0, 0.0, RenderWidth, RenderHeight)); // Fondo blanco fuera de la zona de juego dc.DrawRectangle(Brushes.White, null, new Rect(0.0, 0.0, RenderWidth, RenderHeight / 6.0)); dc.DrawRectangle(Brushes.White, null, new Rect(0.0, RenderHeight - RenderHeight / 6.0, RenderWidth, RenderHeight / 6.0)); // Dibujamos un marco para diferenciar la pantalla dc.DrawRectangle(Brushes.Black, null, new Rect(0.0, 0.0, RenderWidth, 2)); dc.DrawRectangle(Brushes.Black, null, new Rect(0.0, 0.0, 2, RenderHeight)); dc.DrawRectangle(Brushes.Black, null, new Rect(0.0, RenderHeight - 2, RenderWidth, 2)); dc.DrawRectangle(Brushes.Black, null, new Rect(RenderWidth - 2, 0.0, 2, RenderHeight)); // Linea discontinua central float ini = RenderHeight / 6, tam_ = 4; while ((ini + tam_) <= RenderHeight - (RenderHeight / 6)) { dc.DrawRectangle(Brushes.White, null, new Rect((RenderWidth / 2) - (tam_ / 2), ini, tam_, tam_)); ini += 2 * tam_; } // Pausa jugador 1 dc.DrawRectangle(Brushes.LightGreen, null, new Rect(bot_pausa1.X, bot_pausa1.Y, 90, 30)); // Pausa jugador 2 dc.DrawRectangle(Brushes.LightGreen, null, new Rect(bot_pausa2.X, bot_pausa2.Y, 90, 30)); // Reiniciar dc.DrawRectangle(Brushes.LightGreen, null, new Rect(bot_reiniciar.X, bot_reiniciar.Y, 110, 30)); // Ayuda dc.DrawRectangle(Brushes.LightGreen, null, new Rect(bot_ayuda.X, bot_ayuda.Y, 40, 30)); // Identificacion del Skeleton // El jugador que se encuentre en la mitad derecha controla esa pala y viceversa if (SkeletonPointToScreen(skel.Joints[JointType.Head].Position).X < (RenderWidth / 2)) { skeleton_id = 1; } else { skeleton_id = 2; } if (skeleton_id == 1) // Actualizamos la posicion del jugador 1 { pala1.CambiarPos(SkeletonPointToScreen(skel.Joints[JointType.HandRight].Position).Y); } if (skeleton_id == 2) // Actualizamos la posicion del jugador 2 { pala2.CambiarPos(SkeletonPointToScreen(skel.Joints[JointType.HandRight].Position).Y); } // Comprobamos si choca arriba o abajo ChoquePared(ball); // Comprobamos si choca con alguna de las palas de juego ColisionPelota(ball, pala1, pala2); // Comprobamos si algun jugador ha marcado int marcado = PuntoMarcado(ball, pala1, pala2); if (marcado > 0) { // Actualizamos la puntuacion if (marcado == 1) { jugador1.Marcar(); puntuacionUno.Content = jugador1.GetPuntuacion().ToString(); } if (marcado == 2) { jugador2.Marcar(); puntuacionDos.Content = jugador2.GetPuntuacion().ToString(); } ball = new Pelota(new Point(RenderHeight / 2, RenderWidth / 2), ball.GetTam()); } // Dibujamos las palas de juego pala1.Dibujar(dc); pala2.Dibujar(dc); // Actualizamos la posicion de la pelota ball.ActualizarPos(); ball.Dibujar(dc); // La dibujamos // Funcionalidad de los botones // Boton de pausa del jugador 1 if (tocaBoton(manoDer, bot_pausa1, new Point(90, 30))) // Toca el boton 'Pausar' { dc.DrawRectangle(Brushes.Green, null, new Rect(bot_pausa1.X, bot_pausa1.Y, 90, 30)); if (contando_pau1 == false) { id_jug_bot = skel.TrackingId; contando_pau1 = true; frame_ini = frame_act; } else { if ((frame_ini + 40) <= (frame_act)) // Hemos presionado el boton 'Pausar' { id_jug_bot = -1; if (pausa == true) { ball.ActualizarVel(velx, vely); pausa = false; } else { ball.ActualizarVel(0.0, 0.0); velx = ball.GetVel().X; vely = ball.GetVel().Y; pausa = true; } contando_pau1 = false; } } } else { if ((id_jug_bot != skel.TrackingId) && contando_pau1) { contando_pau1 = true; } else { id_jug_bot = -1; contando_pau1 = false; } } // Boton de pausa del jugador 2 if (tocaBoton(manoDer, bot_pausa2, new Point(90, 30))) // Toca el boton 'Pausar' { dc.DrawRectangle(Brushes.Green, null, new Rect(bot_pausa2.X, bot_pausa2.Y, 90, 30)); if (contando_pau2 == false) { id_jug_bot = skel.TrackingId; contando_pau2 = true; frame_ini = frame_act; } else { if ((frame_ini + 40) <= (frame_act)) // Hemos presionado el boton 'Pausar' { id_jug_bot = -1; if (pausa == true) { ball.ActualizarVel(velx, velx); pausa = false; } else { ball.ActualizarVel(0.0, 0.0); velx = ball.GetVel().X; vely = ball.GetVel().Y; pausa = true; } contando_pau2 = false; } } } else { if ((id_jug_bot != skel.TrackingId) && contando_pau2) { contando_pau2 = true; } else { id_jug_bot = -1; contando_pau2 = false; } } // Boton de reinicio if (tocaBoton(manoDer, bot_reiniciar, new Point(110, 30))) // Toca el boton 'Reiniciar' { dc.DrawRectangle(Brushes.Green, null, new Rect(bot_reiniciar.X, bot_reiniciar.Y, 110, 30)); if (contando_rei == false) { id_jug_bot = skel.TrackingId; contando_rei = true; frame_ini = frame_act; } else { if ((frame_ini + 60) <= (frame_act)) // Hemos presionado el boton 'Reiniciar' { id_jug_bot = -1; jugador1 = new Jugador(); jugador2 = new Jugador(); puntuacionUno.Content = jugador1.GetPuntuacion().ToString(); puntuacionDos.Content = jugador2.GetPuntuacion().ToString(); ball = new Pelota(new Point(RenderHeight / 2, RenderWidth / 2), ball.GetTam()); contando_rei = false; } } } else { if ((id_jug_bot != skel.TrackingId) && contando_rei) { contando_rei = true; } else { id_jug_bot = -1; contando_rei = false; } } // Boton de ayuda if (tocaBoton(manoDer, bot_ayuda, new Point(40, 30))) // Toca el boton 'Ayuda' { dc.DrawRectangle(Brushes.Green, null, new Rect(bot_ayuda.X, bot_ayuda.Y, 40, 30)); if (contando_ayu == false) { id_jug_bot = skel.TrackingId; contando_ayu = true; volver.Visibility = System.Windows.Visibility.Visible; frame_ini = frame_act; } else { if ((frame_ini + 30) <= (frame_act)) // Hemos presionado el boton 'Ayuda' { id_jug_bot = -1; jugador1 = new Jugador(); jugador2 = new Jugador(); puntuacionUno.Content = jugador1.GetPuntuacion().ToString(); puntuacionDos.Content = jugador2.GetPuntuacion().ToString(); ball = new Pelota(new Point(RenderWidth / 2, RenderHeight / 2), ball.GetTam()); volver.Visibility = System.Windows.Visibility.Hidden; etapa = 0; contando_ayu = false; } } } else { if ((id_jug_bot != skel.TrackingId) && contando_ayu) { contando_ayu = true; } else { id_jug_bot = -1; contando_ayu = false; volver.Visibility = System.Windows.Visibility.Hidden; } } } // Dibujamos la mano por encima de todo lo demas dc.DrawEllipse(Brushes.Black, null, SkeletonPointToScreen(skel.Joints[JointType.HandRight].Position), 10, 10); } else if (skel.TrackingState == SkeletonTrackingState.PositionOnly) { dc.DrawEllipse(Brushes.Black, null, SkeletonPointToScreen(skel.Joints[JointType.HandRight].Position), 10, 10); } } } // prevent drawing outside of our render area this.drawingGroup.ClipGeometry = new RectangleGeometry(new Rect(0.0, 0.0, RenderWidth, RenderHeight)); } }