Aceleración y Fricción

En el mundo real, el movimiento es mucho más complejo de lo que hemos visto hasta ahora. Hay fuerzas que lo producen, otras que lo mantienen y otras que lo frenan. Un objeto en movimiento  está sometido al menos, a dos de ellas: aceleración y fricción. En nuestra sencilla simulación veremos cómo la aceleración pone en movimiento un objeto en la dirección deseada y cómo la fricción frena el movimiento y al mismo tiempo limita la velocidad máxima. Aunque la escena de naves que usaremos para montar un juego de asteroides al final de esta serie de artículos se desarrolla en el espacio, es obvio que en éste no hay atmósfera  y por tanto no puede haber fricción, pero para que el juego tenga una mínima jugabilidad y a efectos de estudio, se ha optado por hacer uso de estas características. También veremos cómo se relacionan entre sí estas fuerzas entendidas como vectores y cómo extraer un vector de dirección a partir del ángulo que forma el eje del objeto con el eje de coordenadas X.

 

Este es el efecto que conseguimos al mover la nave. Podemos girar en cualquier dirección, pero la aceleración sólo se produce en la dirección en la que apunta la nave, que es independiente de la trayectoria y aceleración que tuviera anteriormente.

Leer más ›

Etiquetado con: , , , , , , ,
Publicado en: Programación

Pong, el juego

Hola de nuevo.

En la entrada anterior se ha explicado cómo comenzar a programar el juego Pong, vimos qué variables y constantes son necesarias y dimos algún consejo de buenas prácticas. Vimos también los eventos de teclado para que cada jugador disponga de dos teclas para mover su pala. Hoy vamos a terminar el código para que el juego funcione y nos permita medir nuestra pericia con algún compañero o amigo.

Si recapitulamos a entradas anteriores donde se explicaba la forma de animar objetos en un DrawingArea, recordaremos que usábamos un Timer con un delay de 16ms, que equivale mas o menos a 60 fps. El evento del timer se dispara 60 veces por segundo refrescando el DrawingArea que a su vez dispara su evento Draw. Todo el código que situemos dentro del evento Draw se ejecutará 60 veces por segundo, código que en su mayoría son rutinas y cálculos de dibujo, dando la sensación de animación. Veamos el código completo de ese evento y después lo analizamos:
Leer más ›

Etiquetado con: , , , , , , , ,
Publicado en: Programación

Pong y los números mágicos

Hola de nuevo

Después de una temporada sin publicaciones debido al trabajo y a unas merecidas vacaciones, volvemos a la carga con el esperado juego Pong, una demostración muy sencilla de cómo en alrededor de 200 líneas de código se puede realizar un juego entretenido usando sólo el control DrawingArea de Gambas.

Pong (o Tele-Pong) fue un videojuego de la primera generación de videoconsolas publicado por Atari, creado por Nolan Bushnell y lanzado el 29 de noviembre de 1972. Pong está basado en el deporte de tenis de mesa (o ping pong). La palabra Pong es una marca registrada por Atari Interactive, mientras que la palabra genérica “pong” se usa para describir el género de videojuegos “pala y bola”. Podéis ver la información completa en Wikipedia.

Magic numbers

Antes de meternos en harina con el código, me gustaría hacer un apunte respecto de algo que seguramente os sonará: magic numbers o números mágicos. ¿Y eso qué es?… os preguntaréis algunos. Bien, simplemente son esos valores numéricos que se asignan en nuestro código y que realmente nadie sabe de dónde vienen, pero hacen que el programa funcione. Si, efectivamente estoy en “modo irónico”, porque a decir verdad, estamos hablando de una mala práctica. Veamos un ejemplo:

DrawingArea1.Width = 800
DrawingArea1.Height = 600
$ball_pos = [800 / 2, 600 / 2]
$paddle1_vel = [0, 0]
$paddle2_vel = [0, 0]
$paddle1_pos = [10, (600 / 2) - 50]
$paddle2_pos = [800 - 10, (600 / 2) - 50]

¿Qué significan todos esos números y de dónde vienen? Un programador que lea nuestro código tendría problemas para entenderlo y mantenerlo; incluso nosotros mismos aunque lo hayamos escrito, olvidaremos su significado tras un periodo de tiempo corto.

Leer más ›

Etiquetado con: , ,
Publicado en: Programación

La clase Paint en Gambas3

De vuelta con lo que iba a ser una entrada dedicada a la clase Paint que incorpora Gambas3 y que posiblemente deje obsoleta a la clase Draw.

Las ventajas de la clase Paint son bastantes, por ejemplo y por citar las más evidentes, es que todos sus métodos soportan números Float y que incorpora un filtro Antialiasing para el suavizado de las líneas y las formas. Mi intención era explicar un poco cómo empezar a pintar, pero después de ver el ejemplo que viene con Gambas3, es un poco absurdo. Es uno de los mejores ejemplos que trae gambas y además de incorporar ejemplos de todo lo que se puede hacer con la clase Paint, se puede ver en otra solapa del mismo formulario el código que se ha usado para generar cada dibujo.

Por lo tanto, lo mejor es echar un vistazo al ejemplo “Painting” y estudiar un poco el código con una copia del programa, modificarlo y jugar con él para familiarizarse con sus métodos y propiedades.

Formulario del ejemplo Painting

Formulario del ejemplo Painting

En la próxima entrada usaremos la clase Paint y un poco de lógica para hacer un pequeño juego de Pong. Hasta entonces, espero que juguéis con con la clase Paint!

Etiquetado con: , , ,
Publicado en: Programación

Colisiones y reflexiones

Hola. En la serie de artículos sobre el evento Draw() del DrawingArea vimos la forma de dibujar objetos y animarlos dentro de la superficie de dibujo, pero se nos plantean dos nuevas cuestiones relacionadas con el movimiento. Por una parte, si un objeto se mueve en línea recta lo que puede ocurrir  es que dicho objeto desaparezca para siempre al sobrepasar los límites de nuestro “lienzo” y por otro lado quizás lo que queremos es que ese objeto rebote contra algún otro cuerpo o los bordes del lienzo o reaparezca de nuevo en pantalla. Comencemos por el último caso. Leer más ›

Etiquetado con: , , , , , , , ,
Publicado en: Programación

DrawingArea y su evento Draw() – III

En el post anterior vimos cómo funcionaba el evento Draw del DrawingArea y cómo establecer algunas variables que afectaban a la forma de dibujar. Los métodos y propiedades de la clase Draw () y cómo disparar el evento usando un Timer. Pues bien, si nuestra intención es no sólo dibujar algo en un DA, sino además dotarlo de movimiento, parece lógico pensar que necesitamos disparar el evento Draw varias veces por segundo para conseguir “animar” los objetos. Leer más ›

Etiquetado con: , , , , , ,
Publicado en: Programación

DrawingArea y su evento Draw() – II

Retomando el post anterior, vamos a ver -ahora sí- cómo funciona realmente el evento Draw del DrawingArea y cómo nos va a facilitar las cosas para crear movimiento, gráficos incluso algún juego interactivo.

Anteriormente vimos que la Propiedad Cached debía de establecerse a True para evitar el borrado de nuestros dibujos y que para dibujar debíamos de encerrar nuestras sentencias de dibujo entre dos métodos Draw.Begin(device) y Draw.End(). Pues bien, si ahora  hacemos lo contrario, es decir, establecemos Cached = False y omitimos los métodos Begin y End… bueno alguno habrá comprobado que Leer más ›

Etiquetado con: , , ,
Publicado en: Programación

DrawingArea y su evento Draw()

Aprovechando que ya casi está terminado el curso de “Programación Interactiva en Python” de la plataforma Coursera, voy a hacer un recorrido por los proyectos acometidos que básicamente usan un widget capaz de dibujar en él. En el caso de la herramienta que proporcionan durante el curso (CodeSkulptor) dispone de una clase “simplegui” que han creado sus autores y que no es más que un wrapper del elemento Canvas de HTML5, con una interface Python. En realidad esto es lo más parecido al control DrawingArea de Gambas, y en esta serie de posts trataré de reproducir cada uno de estos proyectos usando como superficie de dibujo dicho control. Ciertamente existen otros componentes que están mejor enfocados al dibujo y la creación de juegos, como SDL y OpenGL, pero de momento nos vamos a centrar sólo en DrawingArea porque además tiene un gran potencial como base para crear otros controles gráficos.

Leer más ›

Etiquetado con: , , ,
Publicado en: Programación

Bienvenidos

Bienvenidos a un blog más dedicado a Gambas de los muchos que ya existen.

Como administrador de los foros gambas-es.org no quería dejar pasar la oportunidad de poder establecer una comunicación un poco más directa y mundana con todos vosotros a través de este blog que inicio en este día. En cierto modo podría explicarse como otro medio alternativo para aquellos que no estén acostumbrados a los foros  y una especie de proyección personal de mi visión de Gambas, aunque quiero hacer hincapié en que esto no pretende ser un consultorio a medida. Quiero dejar claro que la forma más participativa es efectivamente el uso de los foros que desde hace ya casi 4 años permanecen a vuestra disposición en http://www.gambas-es.org

Leer más ›

Publicado en: General

Categorías

Uso de cookies

Este sitio web utiliza cookies para que usted tenga la mejor experiencia de usuario. Si continúa navegando está dando su consentimiento para la aceptación de las mencionadas cookies y la aceptación de nuestra política de cookies, pinche el enlace para mayor información.plugin cookies