Dragon Ball en C

ReBeNTuk0

Buenas! Hace poco abrí un post sobre Animaciones ASCII en C y ya he terminado una para explicarme mejor y hacer algunas preguntas. Mi intención es intentar hacer una especie de juego de Dragon Ball con magias, ataques, bolas universales, etc. utilizando animaciones ASCII. He cogido muchas animaciones de internet y he hecho videos para copiar los movimientos uno a uno en C. Mi duda es si hay formas de hacerlo más facilmente que tener que ir dibujándolo a base de printf.
He intentado simplificarlo a base de printf y haciendo arrays de cadenas para simplificar el tema. Algo así sería el movimiento de acercamiento de los personajes:

char *espacios[27]={" "," "," "," "," "," "," "," ",
" "," "," "," "," ",
" "," "," "," ",
" "," "," "," ",
" "," "," ",
" "," "," "};
char *atras[27]={" "," ",
" "," ",
" "," ",
" "," ",
" "," ",
" "," "," ",
" "," "," "," ",
" "," "," "," "," "," "," ",
" "," "," "};
int i;
for (i=0;i<lejania;i++){
system("cls");
printf ("\n\n\n\n\n\n");
printf ("%i\n",i);
printf ("%s _ o %so _\n",espacios,atras);
printf ("%s / %s\\n",espacios,atras);
printf ("%s/ > %s< \\n\n",espacios,atras);
Sleep(10);
}

Lejania es el valor que le tengo que dar para que se acercen más o menos los muñecos en función del ataque que sea. Por ahora un ejemplo entero de pelea solo tengo una patada hecha que se encuentra en el video. No se si habra formas de hacerlo más fácil porque si no puedo tardar 3 meses en todas las animaciones que tengo pensada hacer.

El juego como es lógico (por lo poco que se en C) estará hecho por turnos. No se si habra alguna forma de hacerlo interactivo y que se pueda luchar sin tener que esperar a turnos, en plan los flash de los muñequitos negros estos que pelean que supongo que conocereis. Supongo que será muy complicado hacerlo de esa manera no? Bueno no me enrollo más, os dejo con el pequeño video y a ver si me dais consejillos. Gracias.

http://www.dailymotion.com/relevance/video/x56bd8_animaciones-ascii-dragon-ball-en-c_videogames

PD: Aunque no se vea en el post, *ataques[] va incrementando el numero de espacios y *atras[] lo va decrementando.

cabron

No me entero muy bien de lo que quieres hacer, pero te doy un consejo...

#define NUM_ESPACIOS 26

int i = 0;
char espacios[NUM_ESPACIOS];

for(; i < NUM_ESPACIOS;i++)
{
   espacios[i] = ' ';
}

Creo que es bastante más cómodo que meter 26 espacios uno a uno, ponerte a contarlos todos para ver que no has puesto de menos ni de más, eso sin contar que si derepente en lugar de necesitar 26, necesitas más o menos, solo tendrás que cambiar esta línea:

#define NUM_ESPACIOS 26

mientras que de la forma que lo has hecho tú, tienes que cambiar la dimensión del array, y además ponerte a añadir y quitar espacios, y volver a contar si te has dejado alguno o has puesto de más.

elkaoD

No sé si lo entiendo bien lo que estás haciendo, pero por lo que creo captar, hacer un char *cadena[] no está bien. char cadena[] es lo correcto, ya que char *cadena[] lo que hace es un array de punteros (Un array de cadenas.) Ahí lo que tienes son uno montón de cadenas de dos bytes con un espacio y un \0 al final. Lo que (Creo) que quieres es:

char *cadena = "                           ";
char cadena[27] = "                           ";

O lo que es lo mismo:

char cadena[] = {' ' ,' ', ' ', etc. etc.} // Nótense las comillas simples, que indican un carácter y no una cadena

Por otro lado, ¿atras y espacios no son iguales?

Sigo sin entender exactamente qué preguntas ReBeN. Como consejo personal, para la próxima vez ten en cuenta que entender una pregunta es más fácil si está hecha de forma y directa, clara y concisa. Es más fácil entender "¿Cómo sumo dos números?" que "Pues mirad, quiero coger un número (Ninguno en concreto, vamos, que acepte cualquier número), coger otro número (También otro cualquiera) y con esos dos números (Los dos elegidos antes) hacer un tercer número que sea igual a la suma de estos."

No te lo tomes a malas ReBeN, es simplemente un consejo para que así entenderte y nosotros podamos responder bien sea más fácil.

De todas formas si preguntas lo que he entendido que preguntas, ya te lo expliqué. En lugar de printf y poner espacios, haz un gotoxy(x, y) (O lo que use tu entorno de desarrollo para cambiar el puntero en la consola) para dibujar sólo donde quieras. Incluso puedes hacerlo caracter a caracter y definir alguno para que sea transparente con lo que podrías tener un fondo e ir dibujando los personajes encima.

Mírate libcaca y aalib en Google que a lo mejor te interesan.

Como toque final podrías hacer sumas de caracteres para simular semitransparencias, en plan "-" y "|" = "+" (Vamos, como un XOR pero con definiciones.) Esto ya es muy pijo pero da un efecto bastante bonito. En JavE lo usan.

cabron

#3:

Lo que ha hecho, no es incorrecto (aunque sí absurdo xd)

con:

char *a[4];

Estas creando un array de cadenas, un ejemplo que sí tendría sentido sería este:


#define  ERROR_LECTURA 0
#define  ERROR_ESCRITURA 1
#define  ERROR_CARGAFICHERO 2

typedef int  error;
char *errores[3] = {"Error al leer al archivo", 
                             "Error al escribir en el archivo", 
                             "El archivo no está formateado correctamente"};

/*Se pone a hacer cosas y detecta que se ha producido un error*/

error tipoError = obtError();

printf("%s",errores[tipoError]);

Aunque en su caso no tiene ningún sentido usar un char* para meter espacios.

elkaoD

#4, quería decir incorrecto para lo que está haciendo xD

Si yo mismo en el código de ejemplo que le puse en un post que puso de lo mismo (http://www.mediavida.com/vertema.php?fid=9&tid=322508) http://pastebin.com/f4adb93a7 uso un array de cadenas.

De hecho usando mi mismo código y poniéndole un gotoxy(x, y) al principio y sustituyendo el printf por un bucle con un putch() que sólo imprima cuando no hay cierto caracter (Por ejemplo, alguno de los no imprimibles) que podría usar como caracter de definición de transparencia, tendría todo lo que quiere y más.

El gran problema de ReBeN es que no entiendo exactamente que pregunta, porque comenta un montón de cosas pero no hace ninguna pregunta clara, por lo tanto muchas veces no sé qué responder.

cabron

Eh perro que has editado el post con más cosas xD antes tenías solo puesto que era un incorrecto por que era un array de punteros, y no habías explicado más, por eso puse yo una explicación.

elkaoD

#6, sí, es una manía malísima que tengo, poner un post y luego ir editándolos según veo fallos y cosas que me faltaban por decir xD

De todas formas ReBeN creo que antes de hacer juegos y tal deberías hacer antes programas más simples, porque me da que lo estás haciendo todo "a lo bruto", y muchas de las cosas que estás haciendo se podrían hacer más fácilmente.

De hecho, hay un montón de librerías como SDL o Allegro que te simplificarían todo, incluso para dibujar en 2D. Si hasta OpenGL es más fácil de lo que parece.

Aún así quizá te interesaría mirarte algún curso sobre programación de videojuegos en concreto. Google.

El problema principal es que creo que no entendiste bien a qué me refería cuando te pasé el código. Como ejemplo práctico para que entiendas lo que quiero decir, imagina una funcion dibujar_anim(char *animacion[], int x, int y) como la que yo tenía hecha pero sin printf sino con putch() o con un buffer, sin system("clear") y sin control de repeticiones, puedes hacer algo así:

int i;
for (i=0; i<lejania; i++)
{
 iniciar_frame(); // Aqui borramos la pantalla y tal
 dibujar_anim(guerrero1, i, 3);
 dibujar_anim(guerrero2, ANCHO_PANTALLA-i, 3); // O algo asi xD
 terminar_frame(); // Aqui hacemos un print del buffer
}
Santii

la verdad q es un follon de la ostia el juego xDD si lo acabas avisame q me gustaria verlo :P no me importaria hacer algo por el estilo, pero no tengo fuerzas :P

elkaoD

Aquí un código de ejemplo con todo lo que te decía :) Sí, últimamente me aburro mucho:

http://pastebin.com/f629a4f4

ReBeNTuk0

#2 Creo que me he explicado mal con lo de los espacios. Quedan así:

http://img259.imageshack.us/my.php?image=velocidaduo5.jpg

Lo que queria hacer es que *espacios[] vaya sumando un espacio cada vez para que el personaje de la izquierda se fuera poco a poco hacia la derecha de la ventana. El *atras[] hace lo contrario, resta espacios para que el personaje de la derecha vaya hacia el centro.

#3 Claro que no me molesto para nada!! Quiero consejos y aceptar críticas. Estoy estudiando un Grado Superior de Administración de Sistemas Informáticos y tengo una asignaturas que es Fundamentos de Programación donde damos C. Se muy poco de programación pero me gusta comerme la cabeza para inventar lo que sea con lo que se y aprender algo más. No he dado más que arrays, cadenas, punteros, structuras, funciones y poco más. Ahora estoy terminando ficheros. Yo se que tengo muchos fallos y que me propongo cosas muy difíciles para lo que aún se.
Lo del gotoxy() yo uso dev-c++ y creo que no funciona bien porque son de la librería conio.h de Borland. Supongo que habrá formas para ponerla.
Aver si me puedes poner un ejemplo del efecto ese que me dices para simular semitransparencias.

#4 En clase para cualquier frasecitas así usamos el char* :S

#6 Ya lo siento, lo que pasa es que si me he explicado mal en este post, imagínate como me he explicado en el anterior que ni si quiera tenía una animación hecha y era una caos :S

#7 Si lo estoy haciendo a lo bruto. No preguntaré aquí cuando el juego falle, para eso uso el IRC o mis profesores. Aquí sólo quiero una recomendación para encontrar la mejor forma y recibir consejos para llevarlo a cabo. Vengo de realizar un jueguecito en Feria de medio ROL y se me ha antojado otro de Dragon Ball xd Probaré el código ese que me has pasado.
En cuanto a lo de Allegro, he leido sobre el tema, pero ahora mi intención cuando termine los exámenes en Mayo será dejar C a un lado y estudiar en el verano algún lenguaje. No se aún si Java porque me lo recomiendan los profesores porque tiene más salida en las empresas o estudiar C++ que tiene las librerías Allegro entre otras muchas cosas.

#8 Aún queda un tiempo que ya mismo tengo los exámenes pero cuando lo termine lo pondré por aquí a ver que opinan.

PD: A pesar de estar en C, usamos librerias iostream de C++ para utilizar los system("pause"), system("cls") y poco más. Ya se que no se debe hacer pero bueno... :/

LOc0

Si quieres usar gotoxy() sin conio.h tendrás que usar el API WIN32. En concreto la función que coloca el cursor en una posición (x, y) es: http://msdn2.microsoft.com/en-us/library/ms686025.aspx

Un mini ejemplo de uso:

#include <stdio.h>
#include <windows.h>

int main()
{
COORD punto;

punto.X=30;
punto.Y=30;

SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), punto);

putchar('*');

return 0;
}

Tienes un ejemplo de su uso para desplazar el cursor lateralmente aquí -> http://www.hackvalue.org/fuentes/coloreator.php?fichero=chateitor/varios.c
(Función mueve_cursor)

Es completamente normal que si has empezado a programar hace poco y te gusta, tengas ganas de hacer de todo, pero la idea de una asignatura de fundamentos es que aprendas bien a leer/escribir el lenguaje antes de ponerte a publicar "novelas".

Salu2 ;)

elkaoD

Además yo recomiendo que te centres de momento en aprender a programar en C, dado que aprender otro lenguaje lo único que va a hacer DE MOMENTO es que aprendas otra sintaxis y no te va a enriquecer para nada.

Lo mejor es que aprendas en C bien, te tires un tiempo programando en C (Pero no porque sea C, sino porque es el primer lenguaje con el que te has puesto y punto) y cuando ya sepas los fundamentos de programación te metas a aprender C++ o lo que sea, que sólo tendrás que aprender la sintaxis y, si eso, lo que es POO (O lo que sea, depende del lenguaje que elijas...)

Respecto a lo de la suma de caracteres, es una chorrada. Lo único que digo es que, en mi código de ejemplo puedes comprobar en la función blit que frame es '-' y que buffer[x+x_rel][y+y_rel] es '|' y entonces seteas buffer a '+'. Si frame es '/' y buffer[x+x_rel][y+y_rel] = '\', seteas el buffer a 'X'. Es una chorra pero se puede usar para semitransparencias, en el borde de los muñecos para hacer que no estén tan definidos etc. etc.

Como te dije, bájate JavE y trastea un poco con él :)

Y

[para crear unas risas]
hay una forma más fácil y guapa.

mplayer -vo aa pelicula-drangon-ball.avi

Puros movimientos en ascii en cuestión de segundos :D

ReBeNTuk0

#11 He probado con eso pero no se que uso puede tener a parte de que me sirva para quitar mis *espacios e ir haciendo un bucle incrementando punto.X para que el personaje se desplace hacia un lado o hacia otro. A la hora de crear los movimientos y eso no se si me podría ayudar. También supongo que a la hora de introducir la siguiente animación dentro de la anterior me sería también más facil si ya conozco la posición.

#12 La animación no se me ve porque me da error en la función putch porque no la tengo para Dev-C++, la intentaré conseguir. De todas formas, he leido esto en internet Muesrta un carácter, especificado por el argumento c, directamente a la ventana de texto en uso. La función putch usa el vídeo directamente para mostrar caracteres. Esto se realiza mediante una escritura directa a la memoria de la pantalla o mediante una llamada a la BIOS, dependiendo del valor de la variable global _directvideo. Esta función no convierte los caracteres de nueva línea (\n) en la pareja de caracteres de retorno de línea/nueva línea (\r\n).
Creo que ya entiendo lo que me querías explicar xD
Por cierto, el JaVe se lo bajaron en mi clase y estaba gracioso pero no creia que me pudiese ayudar tanto para muñecos tan simples, pero voy a investigar el programita. Gracias !! xD

elkaoD

#14, es raro, yo uso Dev-C++ y sí me funciona.

Se me olvidó hacer un "#include <conio.h>", pero creo que viene en el windows.h, así que no sé...

Si no, prueba con putchar.

Usuarios habituales