Escolar Documentos
Profissional Documentos
Cultura Documentos
1.- ndice
Realizar el juego Ping Pong ............................................................................... 1 1.- ndice ......................................................................................................... 1 2.- Objectivo.................................................................................................... 2 3.- Pasos a realizar......................................................................................... 3 3.1.- Dibujar el tablero ................................................................................. 3 3.2.- Crear objetos mviles ......................................................................... 4 3.3.- Controlar las 2 palas con el teclado .................................................... 5 3.4.- Movimientos y rebotes de la bola........................................................ 6 3.4.1.- Definicin ......................................................................................... 6 3.4.2.- Cdigo general completo ................................................................. 7 3.4.3.- Funcin gestionar_rebotes_bola ...................................................... 8 3.5.- Definicin de Constantes .................................................................. 10
www.mundoexcel.com
Por favor, antes de imprimir este documento piensa en el medio ambiente.
1/1
2.- Objectivo
Realizar el juego del Ping Pong en Excel utilizando macros y llamadas a funciones DLL.
www.mundoexcel.com
Por favor, antes de imprimir este documento piensa en el medio ambiente.
2/2
Las porteras sern de las filas 9 a las 16 Ponemos un botn y le asociamos el siguiente cdigo: Private Sub CommandButton1_Click() Call ejecutar_juego End Sub
www.mundoexcel.com
Por favor, antes de imprimir este documento piensa en el medio ambiente.
3/3
Realizamos un circulo azul con la herramienta elipse, a esta elipse la llamaremos bola
A este tablero le aadiremos un botn de inicio y informacin de las teclas de control www.mundoexcel.com
Por favor, antes de imprimir este documento piensa en el medio ambiente.
4/4
La funcin GetAsyncKeyState nos indica si el cdigo ASCII1 esta siendo apretado o no. Controles 0 l p q a Funcin salir del juego mover pala abajo del jugador2 mover pala arriba del jugador2 mover pala arriba del jugador1 mover pala abajo del jugador1
El procedimiento mover_pala gestiona el movimiento de la paleta; controlando que esta no se salga del tablero
1
Utilice la funcin CODIGO para dado una letra saber cual es su cdigo ASCII
www.mundoexcel.com
Por favor, antes de imprimir este documento piensa en el medio ambiente.
5/5
'Realiza el movimiento de la pala Private Sub mover_pala(nombre_pala As String, desfase As Long) Dim nueva_posicion As Long nueva_posicion = ActiveSheet.Shapes(nombre_pala).Top + desfase If nueva_posicion < CONST_PALA_EJEY_MAX And _ nueva_posicion > CONST_PALA_EJEY_MIN Then ActiveSheet.Shapes(nombre_pala).Top = nueva_posicion End If End Sub
Para descubrir cuales son los valores mximos y mnimos de las paletas se calcularon de manera emprica, es decir, que a medida que mova la paleta mostraba en que posicin se encontraba hasta ver donde se podra considerar que era el fin del tablero. Este mtodo tambin sirvi para definir los rangos del movimiento de la bola. Se realiza una espera activa de 20 milisegundos con el fin de que se pueda controlar bien las paletas
'Espera activa Public Sub esperar(milisegundos As Long) Dim tiempo As Long tiempo = GetTickCount Do While GetTickCount - tiempo < milisegundos DoEvents Loop End Sub
www.mundoexcel.com
Por favor, antes de imprimir este documento piensa en el medio ambiente.
6/6
3.- Definiremos que hay rebote con una pared (sea la superior, inferior, izquierda o derecha) cuando la posicin actual no llega pero en la siguiente la sobrepasa. ejemplo1: la pared izquierda esta en las coordenadas: 39 la bola esta en la posicin 45 y su velocidad es de 10 posicin actual:45, siguiente posicin: 35 ==> hay rebote ya que 39 esta en este intervalo(35,45) ejemplo2: la pared izquierda esta en las coordenadas: 39 la bola esta en la posicin 45 y su velocidad es de 5 posicin actual:45, siguiente posicin: 40 ==> no hay rebote ya que 39 no esta en este intervalo(40,45)
www.mundoexcel.com
Por favor, antes de imprimir este documento piensa en el medio ambiente.
7/7
Nuevos procedimientos: calcular_posicion_velocidad: retorna la velocidad inicial de la bola posicion_inicial_juego: coloca las paletas y las bola en la posicin inicial
Fjate como se definen 4 variables: x0: posicin horizontal actual de la bola, y0: posicin vertical actual de la bola x1: posicin horizontal futura de la bola, y1: posicin vertical futura de la bola Con estas variables podremos definir los diferentes rebotes (con las paletas o con la pared) o si ha habido gol. Al final de la funcin realiza el movimiento de la bola sumando la posicin actual a la velocidad. Los posibles rebotes solo cambiarn el signo de las velocidades, es decir, el sentido del movimiento
www.mundoexcel.com
Por favor, antes de imprimir este documento piensa en el medio ambiente.
8/8
La funcin gestionar_gol confirma si horizontalmente sobrepasa la pared y si verticalmente esta dentro de la portera. Recuerda el significado de estas variables: x0: posicin horizontal actual, y0: posicin vertical actual x1: posicin horizontal futura, y1: posicin vertical futura
Private Function gestionar_gol(nombre_bola As String, x0 As Long, x1 As Long, y0 As Long, y1 As Long) As Boolean Dim ret As Boolean ret = False If x0 >= CONST_BOLA_EJEX_MIN And _ x1 <= CONST_BOLA_EJEX_MIN Then 'porteria izquierda If y1 >= CONST_PORTERIA_EJEY_MIN And _ y1 <= CONST_PORTERIA_EJEY_MAX Then ret = True End If ElseIf x0 <= CONST_BOLA_EJEX_MAX And _ x1 >= CONST_BOLA_EJEX_MAX Then 'porteria derecha If y1 >= CONST_PORTERIA_EJEY_MIN And _ y1 <= CONST_PORTERIA_EJEY_MAX Then ret = True End If End If gestionar_gol = ret End Function
La funcin gestionar_rebotes_bola_paredes gestiona los rebotes con las paredes horizontales o verticales, si hay rebote lo que har ser multiplicar por -1 la componente horizontal o vertical
Private Sub gestionar_rebotes_bola_paredes(nombre_bola As String, x0 As Long, x1 As Long, y0 As Long, y1 As Long, velocidady As Long, velocidadx As Long) 'rebote vertical If y0 >= CONST_BOLA_EJEY_MIN And y1 <= CONST_BOLA_EJEY_MIN Then 'rebote inferior velocidady = velocidady * -1 ElseIf y0 <= CONST_BOLA_EJEY_MAX And y1 >= CONST_BOLA_EJEY_MAX Then 'rebote superior velocidady = velocidady * -1 End If 'rebote horizontal If x0 >= CONST_BOLA_EJEX_MIN And x1 <= CONST_BOLA_EJEX_MIN Then 'rebote izquierda velocidadx = velocidadx * -1 ElseIf x0 <= CONST_BOLA_EJEX_MAX And x1 >= CONST_BOLA_EJEX_MAX Then 'rebote derecha velocidadx = velocidadx * -1 End If End Sub
La funcin rebotes_palas comprueba que haya rebote con la pala. En caso de que exista modificar la velocidad vertical del rebote utilizando la funcin modificar_rebote_bola_ejey, este cambio ser en valor con el fin de simular si se rebota con las esquinas de la paleta. www.mundoexcel.com
Por favor, antes de imprimir este documento piensa en el medio ambiente.
9/9
Primero comprueba si horizontalmente tendr rebote con la paleta (sea la del jugador 1 o la del jugador 2); en caso afirmativo comprueba si verticalmente hay contacto; esto se da cuando la diferencia de posicin vertical entre la bola y la paleta esta entre 6 y 24. Este rango se da por que la paleta tiene altura con lo que hay que comprobar si la bola da en alguna zona de la paleta, estos valores se calcularon empricamente. Si hay rebote modificar el signo de la velocidad horizontal.
Private Function gestionar_rebotes_palas(nombre_bola As String, _ nombre_jugador1 As String, _ nombre_jugador2 As String, _ x0 As Long, x1 As Long, y0 As Long, y1 As Long, _ velocidadx As Long, velocidady As Long) As Boolean Dim ret As Boolean, diffy As Long ret = False If x0 >= CONST_BOLA_PALA_JUG1_REBOTE And _ x1 <= CONST_BOLA_PALA_JUG1_REBOTE Then 'Rebote con el jugador1 diffy = y1 - ActiveSheet.Shapes(nombre_jugador1).Top If diffy >= -6 And diffy <= 24 Then Call modificar_rebote_bola_ejey(diffy, velocidady, y0, y1) ret = True velocidadx = velocidadx * -1 End If ElseIf x0 <= CONST_BOLA_PALA_JUG2_REBOTE And _ x1 >= CONST_BOLA_PALA_JUG2_REBOTE Then 'Rebote con el jugador2 diffy = y1 - ActiveSheet.Shapes(nombre_jugador2).Top If diffy >= -6 And diffy <= 24 Then Call modificar_rebote_bola_ejey(diffy, velocidady, y0, y1) ret = True velocidadx = velocidadx * -1 End If End If gestionar_rebotes_palas = ret End Function
10 / 10