15 octubre 2015

¡Auxilio! Mi hijo es un adicto a los videojuegos

¿Alguna vez has pensado que puedes sacarle más provecho a tus videojuegos que solo gozar de un rato de entretenimiento pasajero?  ¿Qué opinas sobre los mitos que presentan sobre estos juegos?  ¿Sabías que un buen videojuego tiene importantes beneficios psicológicos que te pueden ayudar en tu vida personal y profesional?

No hay suficiente análisis sobre estas formas de entretenimiento y es casi inexistente una voz informada sobre los beneficios de estos juegos y consejos acerca de como sacarles más provecho.  Por eso escribí este libro, ¡Auxilio! Mi hijo es un adicto a los videojuegos, que está orientado hacia padres de familia para que comprendan mejor el fenómeno de los videojuegos y puedan orientar mejor a sus hijos gamers.  Y seguramente los videojugadores de hueso colorado también encontrarán algunas claves que les pueden ser de utilidad.

Fue publicada en agosto de este año y hasta ahora ha tenido muy buena aceptación por los lectores.  Si te interesa conseguir uno, te invito a que te comuniques con nosotros en nuestra página de Facebook en Crea.

01 octubre 2015

Primer Torneo LOL Prepa Univa



Sí, por fin el momento ha llegado.  ¡Arrancamos el primer torneo de League of Legends en la Preparatoria Univa, cortesía de mis alumnos de 5 TPO.

Aquí les dejo las bases y la información de contacto.  ¡Se reciben inscripciones hasta el día 14/Octubre/2015!

El torneo es de equipos de 5 vs 5 y se va a armar el torneo con 8, 16 o 32 equipos inscritos.  Lo que se necesita de cada equipo es lo siguiente:
  • Nombre de Equipo
  • Nombre de invocador de cada integrante
  • División de cada integrante
  • Nombre de líder del equipo y teléfono
  • $100 de inscripción por equipo
Las reglas son las siguientes:
  • Están permitidas 3 pausas por equipo.
  • Solo tienen 15 minutos de tiempo de pausa por equipo.
  • El equipo tiene un límite de 20min después de la hora acordada para llegar a la partida, de ser así se le dará el gane automático al rival contrario, en caso de ser un mejor de 3 se le dará el gane para la primera partida y se les darán otros 10 min para llegar a la partida siguiente, de ser así si el equipo no llega se le dará el set al equipo contrario, en caso de un mejor de 5 se darán otros 10 min para llegar, si el equipo no llega se le dará el set al equipo contrario.
  • El lado del mapa se decidirá por un volado, el equipo ganador del volado elegirá el lado del mapa, en un mejor de 3 o un mejor de 5 se cambiaran los lados del mapa en el segundo, tercero, cuarto o quinto juego de ser necesario.
  • Sera en modo torneo con 3 bans, NO se permitirá usar a un campeón nuevo con menos de 3 semanas de su lanzamiento en la fase de grupos, en la fase de eliminación directa sí.
  • A un jugador se le permitirá una falta de atención, por flamear a sus rivales.
  • Si un jugador tiene 2 faltas de atención acabando la partida se notificara al jugador y al equipo, y el jugador con las faltas de atención no se le permitirá jugar en la siguiente partida, en caso de ser así se puede conseguir un suplente1.
  • Todo jugador tiene que tener minino 16 campeones.
  • La primera etapa del juego será en fase de grupos y se van a drafteara a los equipos dependiendo de la liga que tenga cada uno de sus jugadores en el equipo.
  • En caso de que el suplente y el titular no estén se puede jugar 4v5 si así lo desea el equipo
  • La partida la creara un moderador para poder espectar la partida
Draft
  • Se sumara la liga de los integrantes del equipo con las siguientes puntuaciones: bronce/unranked – 0, plata -1, oro -2, platino-3, diamante-4, liga maestra-5, challenger-6.
  • De ahí se tomaran los 2, 4 o 8 equipos con mayor puntuación y se les pondrá en el pool 1, después se tomaran los 2, 4 o 8 equipos con menor puntuación y se pondrán en el pool 3, el resto de los equipos estarán en el pool 2.
  • De ahí se pondrán los nombres de los equipos de cada pool en bolsas diferentes y se sacaran un papel para cada grupo. *Del pool 1 y el pool 3 no puede haber equipos del mismo pool en el mismo grupo.
  • Después de eso cada equipo de cada grupo jugara contra todos los demás equipos de su grupo 1 vez, de ahí se verán cuáles son los mejores 2 de cada grupo dependiendo de su número de victorias. A la fase de eliminación
Fase de eliminación:
  • Se pasa a la fase de eliminación hasta donde se jugaran al mejor de 3 en octavos y en cuartos de final, en las semifinales y finales se jugaran un mejor de 5.
El premio se dividirá con un 65% del dinero al ganador, al segundo lugar 15% y un 10% para el tercero. Se va a cobrar una comisión del 10% para los moderadores, organizadores, etc.

Dudas con Marco Antonio Rivera Neri en el salón 1114.

Para inscribirse vengan al 1114 durante los recesos con su dinero y el nombre del equipo, después manden un correo a torneosloluniva@gmail.com con toda la información requerida.

20 mayo 2015

Leyendo archivos en Java

Algo que es muy importante para cualquier programa o aplicación, es poder leer y escribir a archivos.  De otra manera, nuestra información se pierde al apagar la computadora.

En Java se puede leer de y escribir a archivos de diferentes maneras.  En el video que presento, usé streams (concretamente un FileInputStream) para leer los datos de un archivo MP3 y obtener la información sobre la canción, si es que se almacenó.

Aquí les presento el video y abajo hay una liga para descargar el código fuente.


El código fuente se puede descargar aquí.

La imagen de Duke (la mascota de Java) tocando la guitarra lo tomé del blog de La Playina del Norte y la idea de este proyecto surgió del siguiente libro:


01 abril 2015

Imágenes y sonidos en Java

Con este último post del proyecto de autos de carreras (si no has visto la serie completo, aquí está la parte donde se dibuja la pista, luego donde se mueven los carros usando Threads y donde se revisan colisiones y se escucha al teclado para mover los carros).  Ahora se va a mostrar la manera en que los carros parezcan carros (vamos a dibujar un bitmap en lugar de dibujar un rectángulo como en las parts anteriores) y poner un poco de sonido de fondo.

Dibujando imágenes
Antes que nada, hay que tener la imagen que deseas poner en la ventana (o JFrame como dijimos antes).  Lo puedes dibujar en Paint, Photoshop o bajar de internet.  En mi caso bajé esta imagen de dos carros que luego giré en las 4 direcciones (arriba, abajo, izquierda y derecha) para tener el total de 8 imágenes:

    

Luego estas imágenes se tienen que copiar a la carpeta donde está tu proyecto, dentro de la carpeta /build/classes donde  es el nombre que le asignaste al proyecto hecho en NetBeans.

Ahora para dibujar una de estas imágenes en la ventana, el código necesario antes de dibujar la imagen (en el constructor, por ejemplo) es algo como este:

Image img = null;
try {
    URL url1 = this.getClass().getResource("nombre del recurso");
    img = Toolkit.getDefaultToolkit().getImage(url1);
}
catch (Exception e) { }

Luego para dibujar la imagen, usa este código (que debe reemplazar el dibujo de los 2 rectángulos con los que estábamos representando a los carritos hasta ahora):

g.drawImage(img,x,y,this);

Obviamente, x y y son las coordenadas de la esquina superior derecha de la imagen (en nuestro caso, son las del Rectangle p1 y p2) y this hace referencia a la ventana actual (el JFrame donde está todo).

Para que todo esto funcione, se tiene que incluir al principio de la clase este import (para la clase URL):

import java.net.*;

¡Y listo!  Con eso debería quedar.  En el video mostraré el código que usé en este proyecto, mismo que puedes descargar aquí.

Audio en Java
Es muy sencillo poner audio en formato WAV (el método aquí descrito no funciona para MP3).  Al igual que con las imágenes de mapa de bits, hay que copiar el o los archivos a la carpeta donde está el proyecto.

Después de esto, deberá ingresar un código como este:

URL url1 = this.getClass().getResource("archivo.wav");
AudioClip sonido = JApplet.newAudioClip(url1);
sonido.loop();

Como se podrá suponer el lector archivo.wav es el nombre del archivo que se copió a la carpeta del proyecto.  Las instrucción sonido.loop() hace que el sonido suene y cuando termine vuelva a sonar y así repetir indefinidamente hasta que se termina el programa.  Si desea que solo suene una vez, en lugar de eso escriba sonido.play().

No olvides de importar la librería con import java.applet.AudioClip.

Explicación en video
Aquí les dejo el video donde comento los cambios realizados al proyecto.  El código fuente del proyecto final se puede descargar aquí.


¿Y qué sigue?
Hay mil cosas que se podrían hacer para que este proyecto quedara mejor.  Se puede crear una imagen que diga las instrucciones al entrar al juego, se pueden contar el número de vueltas que da cada jugador (revisando si el rectángulo del carro hace colisión con el rectángulo de la meta y que va en dirección UP) y que gane el primer jugador en completar 3 vueltas.  Pero eso ya lo dejo para que sea implementado por el lector.

Agradecimientos
La pintura hecha en una oficina de Duke (la mascota de Java) con un rubí, lo tomé del blog de JRuby.  Y como ha sucedido con los posts del proyecto de la carrera de carros, las ideas principales salieron de este libro:



¡Hasta la próxima!

26 marzo 2015

Detección de colisiones y escuchando al teclado

Hemos estado trabajando con un proyecto en Java que dibuja una pista de carreras (no muy estético, pero funcional) y luego usamos threads para mover 2 carros.  Hasta allí todo bien, pero no muy divertido que digamos.  Por eso, en este post, vamos a hacer dos cosas: detectar colisiones (para que los "carros" no puedan pasar por los obstáculos ni por encima del otro carro) y escuchar eventos del teclado para poder controlar los carros.  En pocas palabras, nuestro juego por fin va a ser funcional.

Pero como dijo Jack el destripador, vámonos por partes: primero vamos a ver que onda con la detección de colisiones y luego veremos que onda con  el teclado.  Así que sin más preámbulos, arrancamos...

Colisiones
Hacer la detección de colisiones (en otras palabras, ver si un objeto "choca" con otro) es bastante sencillo en Java cuando se usan objetos de la clase Rectangle (por eso los usamos desde el primer momento: era más sencillo dibujar sin ellos, pero nos sirven en este momento) porque tiene un método que revisa si hay colisión. Este método se llama intersects.

Digamos que quiero saber si el Rectangle r1 se intersecta (o colisiona) con un Rectangle r2, puedo usar el siguiente código:

if (r1.intersects(r2)) {
    // Código que se ejecuta si hay colisión
}

Y como podrán imaginar, para revisar múltiples colisiones, puedo usar el operador booleano AND (representado como &&) para ver si dos condiciones se cumplen o el operados OR (representado como ||) para ver si uno de los dos condiciones son verdaderos.

Por ejemplo, si quiero ver si el rectángulo r1 chocó con el rectángulo r2 o el r3, usaría este código:

if (r1.intersects(r2) || r1.intersects(r3)) {
    // Código que se ejecuta si choca con r2 o con r3
}

Esta imagen muestra si hay colisiones entre rectángulos (en otras palabras, si se intersectan):


Escuchando el teclado (KeyListener)
Ya en un post anterior hablé sobre "escuchar" eventos en Java (incluyendo el teclado), pero aquí me concentraré solo en el teclado para completar este proyecto.  Si desea profundizar, sugiero que vea el post Interfaces gráficas 4: Escuchando eventos.

El KeyListener permite recibir lo que ha escrito el usuario en el teclado.  Para usarlo, es necesario agregar, al final de la línea de "public class ..." lo siguiente (esto también aplica para clases internas como las que hicimos en los threads del post anterior):

implements KeyListener

Después de esto, en el constructor (o el método run si estás en un thread), hay que agregar el siguiente código para "despertar" al KeyListener y ponerlo a trabajar:

addKeyListener(this);

Recuerda que el this asocia los eventos que "escucha" del teclado a esta clase.

Después de esto, hay que agregar 3 métodos a la clase

public void keyPressed(KeyEvent e) { }
public void keyReleased(KeyEvent e) { }
public void keyTyped(KeyEvent e) { }

Estas funciones, al igual que el paint del que hablamos en el primer post de esta serie, son ejecutadas de forma automática: el keyPressed se llama cuando se presiona una tecla, el keyReleased se ejecuta cuando el usuario quita el dedo de la tecla y ésta se levanta y el keyTyped ocurre cuando el usuario presiona y suelta la tecla.  El mas usado de los tres es el keyTyped, que es precisamente el único que vamos a codificar en este ejemplo.

Finalmente, para saber qué tecla presionó el usuario, uso el código:

e.getKeyChar()

(Si te fijas, e es el parámetro que viene en los métodos y es objeto de la clase KeyEvent que tiene información sobre lo que se ha tecleado).

Integrando este rollo con el proyecto
Como explico con más detalle en el video, voy a crear variables para indicar la dirección del carrito: si vale 0 el carrito viaja hacia arriba, 1 a la izquierda, etc.  Para hacerlo más fácil, los voy a hacer constantes porque no quiero que se modifiquen en el código (usando la palabra final al declararlos).

Después de esto, voy a usar el KeyListener para cambiar la dirección del carrito del jugador.  También vamos a hacer que el rumbo del carrito cambie al alterar la coordenada x si se mueve hacia la izquierda o derecha y la coordenada y si va hacia arriba o abajo.

Finalmente hay que revisar si el usuario no chocó con un obstáculo o con el otro jugador.  Si sucede, vamos a poner la velocidad del jugador en un valor negativo para que el carro retroceda hasta "agarrar vuelo".

Aquí les dejo el video donde lo explico y el código fuente completo (bueno, completo hasta este momento) lo pueden descargar aquí.


Agradecimientos
La imagen de Duke evitando colisiones en patineta lo tomé del blog de CPU y la de los rectángulos que se intersectan son de una página de Tufts University.  Y como ha sucedido con los 2 posts anteriores, la idea vino de este libro:



¡Hasta la próxima!

24 marzo 2015

Hilos en Java: Threads

En mi post anterior dibujamos una pista de carreras rudimentaria con rectángulos usando Java.  Pero, ¿de qué sirve una pista sin carros?  Eso mismo pensé, así que en esta ocasión vamos a añadirle código al proyecto anterior para que podamos tener dos carritos moviéndose de forma independiente una de otra.

La mejor manera de hacer que cada carro se mueva de forma independiente a la ejecución del resto del programa es usar algo llamaos hilos o threads como se conocen en inglés.  Cada thread es un código (o "flujo de control" para que se oiga más interesante) que se ejecuta en paralelo con el resto del programa (o con otros threads).  Es la forma de implementar multiprocesamiento en un programa de Java (¿nunca han escuchado de multithreading cuando hablan de sistemas operativos?).

Para crear un thread, lo vamos a implemtar como una clase que está dentro de la clase principal (en el caso de este ejemplo, va a ser una clase dentro de mi clase RaceGame).  Lo único que hay que cuidar es que herede de la clase Thread.  El código de declaración de la clase interna sería esta:

public class extends Thread {
}

Como has de imaginar, puede ser cualquier cosa menos el nombre de la clase en la que está declarado (recuérdate que lo estoy implementando como una clase dentro de la otra clase).  En mi caso, declaré dos clases de este tipo (una para cada carrito) llamados moveCar1 y moveCar2.

El corazón de un thread es el método run().  Aquí es donde se define el código que se va a ejecutar.  En mi caso concreto voy a mover un carro y lo voy a poner dentro de un ciclo infinito para que siempre esté moviéndose.  Un ciclo while(true) me sirve para este fin.

Para hacer mi programa mas seguro, voy a poner mi código dentro de un bloque try...catch.  El código que ponga después de la instrucción try se va a ejecutar, pero si hay algún problema va a hacer lo que le diga en la sección catch.  De otra forma, mostraría error y truena mi programa.  Lo que he dicho hasta ahorita se vería así:

while (true) {
    try {
        // código para mover el carrito
    } catch (Exception e) {
        break;
    }
}

Como podrá observar el lector, si sucede un error simplemente lo ignoro (con el break).  A lo mejor en otro tipo de programa podría poner código aquí para cerrar bases de datos, liberar memoria, o intentar otra cosa.  Pero en este programa simplemente voy a hacer de cuenta que nada pasó.  Y como el lector podrá deducir, en lugar de lo que va en el comentario // código para mover el carrito debe ir el código que haga que se mueva el carro.

Finalmente para que el Thread se ejecute, es necesario crear el objeto y llamar su método start().  Así que en el constructor de la clase principal, en mi caso RaceGame, voy a escribir lo siguiente:

moveCar1 mc1 = new moveCar1();
mc1.start();

En este video muestro lo que expliqué aquí (con los cambios que realicé en el código del proyecto anterior) y el código modificado lo puedes descargar aquí.


La imagen de Duke (la mascota de Java) con hilos (o Threads) lo tomé de una página de crunchify.com.  Y, al igual que con el post anterior, la idea de este proyecto surgió de este libro:



¡Hasta la próxima!

23 marzo 2015

Dibujando con Java: JFrames

Hablando de Java, ya había comentado como hacer interfaces gráficas, usar Layout Managers para ventanas, hacer interfaces complejas, escuchar eventos y hasta como usar un ScrollPane.  En esta ocasión voy a hablar de la forma de usar la clase JFrame para dibujar rectángulos en una ventana.  Obviamente estos principios pueden ayudarte a dibujar lo que quieras, pero voy a crear una pista de carreras rudimentaria para un juego donde los jugadores podrán controlar unos carritos (rectángulos) a través de esta pista.

Antes de mostrar el video, quiero resaltar algunos aspectos importantes del programa (el código fuente se puede descargar también más adelante).

Antes de hacer otra cosa, para dibujar en un JFrame (el JFrame es la pura ventana vacía), se tiene que incluir en la línea de declaración de la clase.  En mi caso concreto, se hace de esta manera:

public class RaceGame extends JFrame

Después de esto, hay que cambiar la función main() para que contenga una línea de código donde se crea el objeto de la clase (lo cual hace que se llame el constructor de la clase).  En mi caso concreto se puede hacer de la siguiente forma:

RaceGame g = new RaceGame();

Todo el código necesario para correr tu clase debe estar en el constructor: por esta razón no escribo más código en la función main().  Si tienes dudas con constructores, no dudes en ver este post de mi blog donde lo explico.

Después para dibujar objetos en mi JFrame, es necesario incluir el método paint() en la clase.  Es aquí donde se establecen colores y dibujan figuras.  Esta función la ejecuta el sistema operativo cada vez que necesita redibujar la ventana.

Aquí les dejo un video que explica el programa hasta esta etapa:


Y si quieren el código, lo pueden descargar de aquí.

La imagen de la pisa de carreras que se está dibujando la tomé de la página de Bit Rebels.

La idea de este proyecto fue tomado de este libro:



¡Hasta la próxima!

El Tony y sus ondas...

Related Posts Plugin for WordPress, Blogger...