¡Hola! Bueno, esta semana acabo las clases, así que parece que en breve podré dedicarme de nuevo al proyecto con algo más de tiempo del que ahora mismo dispongo. No tengo nada nuevo que decir respecto a actualizaciones, así que me limitaré a comentar los últimos mensajes y, si surje algo, comentarlo también. ¡Ah, sí! He subido una noticia a SF.net que pensaba pegar en la página del proyecto cuando Drincast nos brinde su mini-guía. Echadle un vistazo si teneis tiempo.
Primero de todo, agradecer las felicitaciones de Thepoi e invitarle a que participe en próximos proyectos. Será un honor contar con él. Vamos ya al mensaje de Lucas. Gracias a ti también por las felicitaciones, y gracias también por lo del
bug. Era algo que ya había detectado yo hace unos días pero que me había olvidado de comentar. Lo cierto es que no entiendo muy bien por qué pasa lo que dices... Hay que tener mucha precisión y, si lo intentáis, acabaréis consiguiendo lo que tú dices, que es que la figura se dibuje en el mapa de colisiones donde no está. ¿El por qué? Pues no lo sé, si no ya estaría resuelto... Aunque tengo una ligera idea. Si revisáis el archivo
"principal.cpp" veréis que lo primero que se hace en el
loop en el caso de que el juego esté activo es generar una nueva figura si no la hay. Luego se dibujan los datos en pantalla y
luego se realiza el movimiento vertical del mapa. Ojo, este movimiento se realiza
antes de comprobar la pulsación de las teclas y de sus consecuencias, lo que, si no me equivoco, hace que la figura se dibuje en el mapa y a continuación se mueva lateralmente por la pulsación de los cursores. Esto da un ciclo del
loop después de que la figura se dibuje para moverla en con las flechas. O sea, 20 milisegundos. De ahí que haya que ser bastante preciso para detectar el error. Para corregirlo, supongo que bastaría con comprobar que la figura no se haya dibujado ya en el mapa o, en su defecto, invirtiendo el orden de las funciones (es decir, comprobando antes la pulsación de teclas y haciendo descender a la figura después). Esto es algo que se me ha ocurrido ahora mismo, a bote pronto mientras leía el mensaje, por lo que tendré que implementarlo y comprobar que esté en lo cierto. Se aceptan críticas y correcciones, pero creo que he argumentado bastante bien mi postura. Y en cuanto al giro de la "I"... Creo que por ahora podemos dejarlo como está, si eso en un futuro lo cambiamos y analizamos más detenidamente los pros y los contras.
Voy ahora al mensaje de J. Carlos. Gracias por las felicitaciones a ti también, tenía ganas de conseguir acabar un proyecto porque es algo que motiva mucho y da fuerzas para continuar y, hasta ahora, no lo había logrado. En cuanto a lo del array de 200 figuras, es porque todas las figuras que estén en el mapa se mantienen dentro de este array, se estén o no controlando. Fíjate en que, cuando se dibujan en pantalla, se recorre el array entero, se comprueba que estén activas y se dibujan. Lo del número 200 es, básicamente, porque si tenemos un mapa de 20 X 10 y suponiendo un muy difícil caso de que todas las figuras que hay tengan un sólo bloque (porque los otros se han eliminado), tendremos 200 posiciones bloques en pantalla, uno de cada figura. Aunque creo que sería más correcto poner 201, porque hay que contar con la "siguiente figura". No sé si me he equivocado en algún razonamiento, así que, si lo hice, corrígeme, por favor. Y lo de las variables globales... He de reconocer que soy adicto a ellas, aún a sabiendas de lo peligrosas que son. Trataré de corregirlo y así de paso me voy olvidando de ellas. Lo que sí creo que es interesante dejar como globales son las constantes, ya que, al no ser modificadas, no suponen tanto problema. De nuevo, corrígeme si me equivoco. Y vamos ya con los dos puntos que diste...
Debo decir que no me enojaron, al contrario, me pareció una información interesantísima y muy bien sintetizada y estructurada. Debo darte las gracias por la ayuda que nos prestas. En cuanto a lo de las funciones sobrecargadas, he de decir que tenía pensado reestructurar un poco
main(), ya que lo cierto es que actualmente es algo compleja (sobre todo en el caso de que el juego esté activo). Pero lo de las otras funciones no se me había planteado y, repasando un poco, me he dado cuenta de que tienes toda la razón, hay miles de cosas que no se corresponden con el objetivo principal de la función. Creo que trataré también de partir un poco más el código a partir de ahora. Es un vicio como otro cualquiera que tengo, pero, si ves mis programas, observarás que las funciones hacen más cosas de lo que tenían que hacer en principio. Como es un buen momento para cambiar eso, creo que me pondré a ello. Y en el tema de las clases... Debo decirte que no se me planteó reorganizar los métodos, pero, de nuevo, a base de repasar y repasar código, me he dado cuenta de las burradas que hay: funciones que devuelven direcciones de memoria de datos privados que pueden ser fácilmente modificados, funciones que no tienen nada que ver con las características del objeto... En fin, que he roto casi todos los conceptos básicos de POO

. Ahora bien, no comparto contigo el ejemplo de borrar filas de un mapa. Si hay que borrar una fila del mapa de una figura, ¿desde dónde quieres hacerlo? Desde mi punto de vista, lo mejor es incluirlo como una función propia dentro de esa figura. Otra cosa distinta es borrar completamente una fila del mapa de colisiones. Eso actualmente se hace desde el propio objeto que es el mapa de colisiones, mediante una función que es la de
BorrarFila(). Por lo tanto, desde mi punto de vista ambos métodos son correctos. Acepto tu opinión y, seguramente, por tu experiencia tengas más razón que yo, pero para convencerme me gustaría que me dieses más argumentos y me dijeses dónde y cómo colocarías tú el método que borra esa fila de la figura. Espero que no te haya ofendido, simplemente quiero asegurarme de qué opción es mejor y más correcta. De nuevo, mil gracias por tu ayuda.
Nada más. ¡Ah, sí! Creo que fue precisamente J. Carlos quien, en otro post de este foro, recomendó un libro sobre C++:
"Thinking in C++" de Bruce Eckel. Debo agradecerte también este aporte porque llevo solamente dos capítulos y he aprendido muchísimo. Incluso creo que me ha metido el gusanillo por aprender polimorfismo y otras cosas que hasta ahora había dejado. Si lo buscáis en Google, incluso encontraréis traducciones del primer volumen. Es, simplemente, genial. No dejéis de echarle un vistazo. Ahora sí, nada más. Y perdón por el testamento que acabo de soltar...
Un saludo.
EDITO:
Por si el mensaje aún no fuera lo suficientemente largo, os voy a hacer leer algo más editando básicamente por culpa de una actualización que subí. Lo único que añade es el inicio del repaso del código y la reorganización. Ya puse todas las variables como locales (excepto las tres superficies de SDL, que no me convencí a ponerlas locales, pero si a alguien le apetece hacerlo o tiene una buena razón para ello, no creo que cambie nada ni que sea muy difícil) y creo que lo he hecho bastante bien, porque no da fallos. Puede ser que pasando la referencia a algún que otro puntero me haya equivocado, pero creo que, en general, no hay errores garrafales. Y luego comencé con la revisión de funciones para "descargarlas" un poco, como recomendó J. Carlos, pero sólo repasé las tres primeras (las de inicialización), así que no he descargado gran cosa... Más bien he añadido comprobaciones por si acaso hay fallos al cargar las superficies... ¡Ah! Y he añadido, a los prototipos de las funciones que quedan por revisar (a las de las clases también) lo siguiente: "
/*REV*/". Básicamente lo hice para diferenciar esas funciones de las que ya están revisadas. Aunque "
main()" no tiene ese distintivo (me olvidé), también está por revisar. Y creo que en cuanto a la actualización nada más...
Ahora ya para acabar,
¿creéis que podemos sacar ya una versión Beta?. Lo planteo porque, desde mi punto de vista, no vamos a añadir ninguna funcionalidad nueva a la versión 1.0 (lo de los niveles y eso, aunque no sea muy difícil tal como me lo planteó Lucas una vez, creo que es mejor dejarlo para futuras versiones). Y, obviamente, no vamos a lanzar la v. 1.0 sin pasar por la Beta, ya que por ahora aún hay
bugs en el juego. O sea, que lo tenemos todo para sacar ya la beta. Bueno, todo no. Yo todavía quiero esperar una respuesta clara de alguien (y cuando digo alguien me refiero básicamente a Drincast, ya que él es nuestro Mesías en estos temas) para saber si se va a decidir a hacer un nuevo fondo, o vamos a dejar el que está. Ojo, no estoy pidiendo que hagas uno nuevo, Drincast. Simplemente te pido que nos confirmes tu decisión. Sería de gran ayuda para tomar esta decisión. Con que postees un mensaje en el que digas
"Lo voy a intentar hacer / No lo voy a hacer" me llega. Así no pierdes mucho tiempo y nos sacas de dudas. A mí personalmente no me disgusta el fondo que hay ahora, pero creo que habría que quitarle la parte izquierda en la que está escrito todo eso del
"soporte TCP/IP". Es un texto muy importante para aclarar la función de esa zona de pantalla, pero creo que no sería bueno sacar una versión Beta de un juego en la que aparece eso... Digamos que es poco elegante. Básicamente, eso era lo que quería decir. Espero respuesta.
Un saludo.
P.D.: Todavía no comprobé que el
bug que dijo Lucas en su anterior mensaje se deba a lo que yo planteé en este, pero espero poder hacerlo pronto.