Hola gente,
Como primera aportación al foro traigo este proyecto del que sólo tengo la idea y este primer boceto que cuelgo al final del mensaje. Se trata de un juego con scroll horizontal contínuo (no controlamos nosotros) donde tenemos que ir matando a los aviones/helicópteros/ovnis... que nos van saliendo en la parte superior de la pantalla desde los dos lados. Nosotros nos encontramos en la parte inferior del mapa (carretera/camino...) siendo un vehículo tipo tanque/coche/plataforma... Para quien no lo entienda, me baso en el juego para xbox360 arcade "Heavy Weapon" salvando las distancia claro :D: http://www.youtube.com/watch?v=wgD0OWgk0lY (http://www.youtube.com/watch?v=wgD0OWgk0lY).
De momento sólo tengo hecho el proceso para el protagonista, los enemigos y los disparos. El fondo está sacado del mismo juego anterior y las demás (aviones, misiles,...) también sacadas de por ahí. Lo que sería interesante es poder crearlas yo mismo, pero de creación artística no voy muy sobrado. Aun tengo que encontrar la imagen para el protagonista (ahora hay un rectangulo rojo).
Una vez terminado el juego, o durante, se tendria que hacer el port para la consola CAANOO, ya que me la compré para algo ;D. Ya tengo estudiado el sistema para hacerlo, lo único que tengo dudas es en el tema de los 16/32 bits. Tengo entendido que sólo se pueden pasar juegos con profundidad de 16 bits? Luego no se podrian hacer juegos con estas imágenes que tengo? Me lo tengo que mirar mejor o si alguien me puede guiar le estaría agradecido.
A continuación cuelgo los dos únicos archivos que tengo del proyecto. Vereis que la cosa está bastante verde, a continuación postearé los próximos pasos que seguiré y los principales fallos que tengo que corregir o que de momento no sé como solventar.
Juego: 05/12/2010 (http://ubuntuone.com/p/SJc/)
nota: Como entorno de programación utilizo Ubuntu, así que si hay alguien interesado podríamos compartir mi carpeta con UbuntuOne para mas comodidad.
Lista de los principales errores hasta el momento 22/11/2010 (AYUDA!?):
[HECHO 22/11/10]- Colisiones entre los procesos tiro() y enemigo(): Ahora estan puestas dos sentencias de "Type collision" en cada proceso y existen fallos en la ejecución, sólo colisionan algunas imagenes y la secuencia de explosioń de tiro() no queda "quieta" en cuanto chocan. Además, parece que solo colisionan en el centro de la imagen del avioń, tendrían que colisionar en todo el gráfico (entre el morro y la cola) -/- Solucionado con signal() dentro del IF(idtiro=collision (type tiro)...
[HECHO 21/11/10]- Depurar el scroll: actualmente el protagonista cuando esta quieto sigue el sroll, se tendría que quedar quieto si no se pulsa ninguna tecla y que lo "arrastre" la pantalla si toca el límite izquierdo. Lo solucioné mediante una sentencia "ctype=C_SCROLL;" en el proceso "protagonista()" pero luego no combinaba bien al disparar -/- Se tiene que poner el "ctype=C_SCROLL;" a todos los procesos.
[HECHO 23/11/10]- Depurar el scroll: los enemigos generados a la izquierda del scroll no se ven en pantalla -/- Al final he puesto un tercer parámetro a enemigo() donde le digo la dirección a seguir.
Lista de los próximos pasos a seguir:
[HECHO 21/11/10]- Hacer que los enemigos dejen caer bombas sobre el protagonista (de momento de forma aleatoria en calquier lugar).
[HECHO 21/11/10]- Que estas bombas hagan daño al protagonista (ya esta definida una TYPE con las características del proceso).
[HECHO 25/11/10]- Que el protagonista sólo pueda disparar "x" tiros a la vez. Que sólo puedan haber "x" procesos tiro() en pantalla. -/- Ahora se dispara con mas pausa entre ejecuciones. Implementado con una variable "contador".
- Diseño de armas.
- Diseño de items de mejoras.
[HECHO 01/12/10]- Encontrar una forma de "bonus" de armas, ya sea como en el Heavy Weapon con avion amigo que deje caer items, haciéndolos caer del cielo, que te lo traiga un espontáneo por el suelo,...-/- Al morir el enemigo saldra un item diferente cada x veces.
- Que las armas cambien en cuanto se recoja un bonus y establecer un daño superior/inferior para éstas.
NOTAS:
- Sonido: de momento no hay sonido. Alguna sugerencia?
- Si este post no tiene éxito lo dejaré como seguimiento personal del proyecto.
Bueno, de momento eso es todo. Si has llegado hasta el final, gracias por leer y espero que te guste lo expuesto.
Saludos!
Primero: bienvenido al foro. Espero que te lo pases bien programando, ya verás que con Bennu es realmente fácil.
Segundo: enhorabuena, eres de los pocos novatos que escoge un juego fácil de implementar para los principiantes, y creo que el primero que pasa de los típicos matamarcianos (aunque bueno, este también lo es, pero es algo más original ^^U).
Respecto a tus dudas, te solventaré algunas:
-Si vas a poner al prota dentro del scroll usando CTYPE, todos los demás procesos deberías situarlos también en él, o tendrás que hacer una conversión de coordenadas (ten en cuenta que la esquina superior izquierda de la pantalla está determinada por la posición de scroll[0].x0 y scroll[0].y0 para los procesos con ctype=c_scroll, mientras que los de pantalla lo están por la coordenada (0,0).
-No es recomendable que dos procesos que chocan entre sí detecten la misma colisión, puesto que si uno de ellos desaparece de forma inmediata (como suele ser con el disparo), el otro proceso ya no podrá chocar con él. Uno debe detectar el choque y luego avisar al otro proceso o actuar sobre él.
-Si vas a pasarlo a CAANOO, hazlo pensándolo desde el inicio. CAANOO tiene unos recursos mucho más limitados que el PC y creeme, encontrarse de pronto que hay que reescalar, separar gráficos, cambiar formatos y recortar virguerías gráficas, no es una buena sensación. Como poder se puede, pero ya depende mucho del tipo de juego. CAANOO tiene una resolución de 320x240 y se pueden usar los modos gráficos de 8 y 16 bits, no se puede usar el de 32 por algún tipo de limitación. Si estás usando FPGEdit, tiene una opción para convertir la calidad, aunque no se si puede pasar de 32 a 16 ni los resultados que se obtienen.
-Por último, si vas a compartir, debes pasar el código (el .prg) o de lo contrario no podremos decirte los fallos que veamos, el .dcb no se puede leer. Y si compartes el .dcb, debes decir qué versión de Bennu has usado, por si acaso.
Un saludo y suerte con el proyecto ;)
Ya he colgado el *.prg. Te ha descargado bien el archivo? Estoy probando lo del UbuntuOne pero no se muy bien como va...
Lo que me comentas de avisar al otro proceso ya lo probé con el "signal()" y poniendo como parámetro el identificador del proceso tiro (mediante una varible global "idtiro") pero no me funciona. Le echare otro vistazo.
Y lo de la CAANOO y los 16/32 bits aun no entiendo bien la diferencia. Probaré de hacer un reescalado de toda la ventana y pasarla a 320x240, la pega es que tengo todos los *.png a 32 bits... A ver que tal va lo de la conversion a 16 que dices que hace el FPGedit.
mmm, me recuerda muchísimo a mi marcianitos. Luego, por la noche te colgaré mi carpeta entera de códigos para ese juego (igual te resulta un desorden xD).
Igual, en alguno de los códigos encuentras alguna ayuda xD
Parece que el FPGedit no me puede convertir los .png a 16bits. Hay 2 opciones: para convertir a 16bits para CDIV y para Fenix; sólo me funciona el primero pero las imagenes no se me ven en el juego.
algunas cosas que veo en el hilo.
- los procesos para que colisionen correctamente deben ser todos (los que van a colisionar entre si) del mismo ctype, si no lo son, entonces no colisionaran correctamente.
- si tus procesos se mueven dentro del scroll y el scroll no es solo un decorado, entonces todos los procesos deben ser c_scroll.
- la limitacion de los 32bits en caanoo es por que el hardware no lo soporta.
- el signal no es para mandar mensajes, el signal es para matar, congelar, mandar a domir o despertar un proceso.
- no es del todo correcto decir que solo 1 haga la colision cuando chocan entre si o sobre un mismo tipo de proceso, lo unico que tenes que tener en cuenta es que si el que detecta la colision mata al proceso con el que colisiona, solo 1 de todos los procesos que chequean a ese tipo detectara la colision, porque para el siguiente proceso el proceso en cuestion habra desparecido.
- Utilizaba el signal del siguiene modo dentro del proceso "enemigo()" y a su vez dentro de un LOOP-END:
IF(collision (type tiro1))
carac.vida-=3;
signal(idtiro1,S_KILL); //Envia una señal a tiro para que "muera" (¡¡¡no funciona!!!)
IF(carac.vida<=1)
puntos+=1;
BREAK;
END
END
La variable "idtiro" la defino dentro del proceso protagonista() cuando se ejecuta. A lo mejor el fallo esta aquí.
- Ahora tengo todos los procesos en el scroll ("ctype=C_SCROLL;"), lo que pasa que al ejecutar el enemigo de forma aleatoria para que salga a izquierda o a derecha, los de la izquierda no se ven en pantalla. Puede que sea porque se queda fijo en el scroll y no avanza por el eje "x".
Buenas, la respuesta a esa pregunta ,una vez que los procesos se les asigna ctype=C_SCROLL las variables deven ser relativas al scroll ...Porque si tu haces por ejemplo X=RAND ( 1,500), es proceso se dibujaria en esa X pero el Scroll igual se llega por el 1000 con lo que queda fuera de vista,al no ser que retrocedieras y ya verias el proceso.Algo asi:
x=rand(0,500)+scroll[0].x0;
te solucionaria el problema.
Bueno, estos son los códigos de mi juego. Espero que te ayuden en algo:
http://pensarescompartir.com/lahsoft/lahsoftcorp/?direc=fenix/&id=c%F3digos.rar
bien, mas alla de que sea la solucion o no a tu problema, estas haciendo un mal uso de colision...
collision te da el id del proceso que colisiona, por ende, vos tenes que obtener eso en una variable, y luego enviarle la señal, asi
IF(idtiro1=collision (type tiro1))
carac.vida-=3;
signal(idtiro1,S_KILL); //Envia una señal a tiro para que "muera" (¡¡¡no funciona!!!)
IF(carac.vida<=1)
puntos+=1;
BREAK;
END
END
Gracias a los 3 por contestar. Luego le hecho un vistazo a tu .prg yawin :).
DjSonik, si, ya he tenido en cuenta lo de que se tienen que crear los procesos en las coordenadas con referencia al scroll. Lo que pasa es que los que se crean a la izquierda digamos que no avanzan hacia la derecha. Supongo que se deben quedar quietos siguiendo el scroll. Por otro lado, los que se crean a la derecha si que se ven, pero se quedan quietos en el scroll, no avanzan.
SplinterGU, voy a probar lo que dices. Pero, en la declaración del IF no tendrias que poner un "==" en vez de "="? Si pones = es que defines la variable y podria dar problemas, creo...
precisamente, lo que le estas diciendo es:
Si (el resultado de guardar en esta variable (el resultado de una colisión) tiene algún valor)
Quote from: NesKy on November 22, 2010, 08:34:19 AM
Gracias a los 3 por contestar. Luego le hecho un vistazo a tu .prg yawin :).
DjSonik, si, ya he tenido en cuenta lo de que se tienen que crear los procesos en las coordenadas con referencia al scroll. Lo que pasa es que los que se crean a la izquierda digamos que no avanzan hacia la derecha. Supongo que se deben quedar quietos siguiendo el scroll. Por otro lado, los que se crean a la derecha si que se ven, pero se quedan quietos en el scroll, no avanzan.
SplinterGU, voy a probar lo que dices. Pero, en la declaración del IF no tendrias que poner un "==" en vez de "="? Si pones = es que defines la variable y podria dar problemas, creo...
no, lo que quiero es que se asigne el resultado de collision a la variable idtiro1, como bien dice yawin
OK, las colisiones de momento solventadas. THkx de nuevo, ahora queda profesional y todo con las explosiones 8) jaja.
Ahora me meto con las jkeys.lib y probar que sólo puedan haber "x" procesos disparos en pantalla.
De cara al port para CAANOO, ahora estoy programando con una resolución 640x480x16. Después del set_mode he puesto la sentencia: "scale_resolution=m320x240;". Me harà la conversión a la resolución nativa de la CAANOO o tendré que cambiar los .png y reducirlos a la mitad? Alguna solución para que pueda utilizar 640x480 en el PC y 320x240 en la portátil?
el scale_resolution va antes del set_mode.
el juego correra a 640x480, visualmente estara a 320x240.
...no se ve muy bien el rescalado :-\.
No consigo sacar los procesos creados a la izquierda del scroll. Si lo detengo si que me salen de los dos lados, pero es ponerle velocidad=1 y sólo me salen de la derecha. Los invoco de la siguiente forma dentro del proceso main():
REPEAT
IF(rand(1,75)==1)
enemigo(scroll[0].x0-90,rand(600,603)); //Parámetros=(Posición de inicio,gráfico) referente al scroll
contenemigo+=1;
END
IF(rand(1,75)==1)
enemigo(scroll[0].x0+740,rand(600,603)); //Parámetros=(Posición de inicio,gráfico) referente al scroll
contenemigo+=1;
END
write(0,250,15,0,"Num.enemigos: " + contenemigo); //Mostramos el nº de enemigos en ejecución para comprobar que "mueren"
FRAME;
UNTIL(key(_esc))
Además, ahora he puesto un contador de enemigos para ver si mueren al llegar a un límite y he visto que no mueren. La condición para que mueran dentro de enemigo() es esta:
IF(x<scroll[0].x0-150)
contenemigo-=1;
BREAK;
END
IF(x>scroll[0].x0+800)
contenemigo-=1;
BREAK;
END
EDIT: Vale, si que mueren, no habia puesto la accion de restar el contador al llegar a esas coordenadas :o.
nop, el reescalado no se ve bien, pero solo debe ir en la consola caanoo y como ultimo recurso, pero no pongas el scale_resolution, eso se puede hacer por linea de comando luego seteando unas variables.
pues he visto el juego que dices y creo que puedes hacer algo muy similar.
Lleva un fondo de nubes,dos scrolls para las montañas y un suelo,si lo diseñas con algun tutorial de photoshophay pinceles de nubes muy sencillos de usar, la nieve por ejemplo o el agua,veo que son todos crolls estaticos sin animar.
Cogelo sin miedo y veras como haces algo muy parecido.
Las explosiones usa el after effects que las hace bien,hay muchos tutoriales o el explosionGen, es sencillo y las hace solas y quedas parecidas.
El humo tambien,pero eso mejor haces un solo humo pequeño y lo replicas,así con particulas.
Los aviones son planos planos,puedes coger fotos,cortarlas y pasarlas a vectores (con illustrator) y una vez vectorizadas las pones estilo Cartoon con Paint.net o photoshop,es solo aplicarle un efecto.
Las lineas de la nieves,parece un simple archivo de imagen que lo genera a la vez que anda, con usar el time() para controlar la hora del ordenador,y en dos segundos o asi le haces un alpha y desaparecera la linea del suelo.
Nos se que mas aconsejar,solo que no le temas al diseño,prueba cosas como te digo y veras que no es tan complicado.
Corregirme si me equivoco la gente del foro! yo tambien soy principiante!
Un saludo
Ahí ahí metiendo caña con el tema gráfico ;D. Es lo que me da mas palo la verdad, sobre todo los escenarios... les tengo pavor jaja. Probaré los recursos que dices, pero con el Gimp. Conoces una alternativa del illustrator para opensource que funcione en Linux?
Para las explosiones he utilizado un conjunto de 7 sprites y la verdad que queda muy bien. Pero lo tendré en cuenta si quiero meter mas de diferentes.
Me tengo que mirar el timer() bien porque creo que puedo sacar mucho de aqui...
Inkscape,alternativa opensource al Illustrator ;)
No hace falta que dibujes en vectores a mano alzada,coge un png y transformalo a vectores que te dejará y ademas te ocupara la mitad y podras ampliarlo o reducirlo sin perder calidad.
Yo es que soy más de Illustraror,aunqueno lo domino demasiado pero todos esos juegos que ves por ahi que tienen como una calidad grande es con Illustrator que tiene unos pinceles para contornos que los deja así de bien.Luego un poco de maña ;)
Tu puedes sencillamente coger un dibujo tuyo,mal o bien hecho,coger la herramienta de trazos en Illustrator o Inkscape y los mismos contornos que usas en tu dibujo,los haces pero con buena calidad.Así de simple.
El color,no te compliques,tu imaginale al muñeco o avion una luz encima de el,a la izquierda...y pones unas lineas donde crees que
daría la luz y en esa parte del dibujo,usa el mismo color pero más claro.
Prueba,no tengas miedo.
Buf, ayer me metí con el Inkscape, menuda herramienta.
Una cosa que no cojo. Tengo entendido que Bennu sólo trabaja con mapas de bits no? Si le metes imagenes por vectores no mantendrá la misma calidad, y menos si utilizas imagenes de 16 bits.
La verdad es que para crear recursos gráficos es la herramienta ideal. Puedes tener un resultado muy bueno, eso si, con mucha práctica.
No bueno,lo que si que puedes hacer,ya que para usar vectores en bennu creo que tiene una complicacion especial.
Corregirme si me equivoco porque no lo he probado.
ASi que lo que si que puedes hacer es una vez tengas tu imagen en vectores,pasala de nuevo a pgn.
aunque menos,te reduce la imagen y la puedes usar en Bennu sin complicaciones.
Ta lue
que tal va el diseño nesky!
Respondiendo a lo de anteayer, por desgracia, Bennu no trabaja con formatos vectoriales. No se si había un módulo que renderizaba un SVG a un mapa en memoria, pero Bennu sólo trabaja con mapas de bits, por lo que puedes hacer imágenes con inkscape, pero luego sólo exportarlos con el tamaño que necesites. Al hacer el reescalado se verá mal, pero oye, como pasaba en SNES y nadie se quejaba :P
He estado haciendo pruebas estos dias con el Inkscape. Como dice Drumpi, primero hago el dibujo en vectoriales, luego lo grabo en .png con el tamaño que quiero y lo edito con el gimp para sacarle las transparencias. Es un poco laborioso pero we...
Os cuelgo un par de ejemplos a ver que os parecen, si podeis no reiros demasido ;D. He estado pensando la forma del protagonista y al final se me ha ocurrido poner una pickup con una torreta en la parte trasera, asi a lo taliban. Aun me faltan la torreta y el artillero como veries Si algun artista quiere poner su broche adelante, seguro que con poco lo mejorais.
Avion (http://ubuntuone.com/p/R3N/)
Prota(alternativa) (http://ubuntuone.com/p/R3O/)
Prota (http://ubuntuone.com/p/R3P/)
Tanque (http://ubuntuone.com/p/R3Q/)
Veo que no se pueden bajar con la extensión original .svg. Cuelgo un .zip con los 4 archivos: Archivo (http://ubuntuone.com/p/R3S/)
EDIT: En el primer post he colgado el juego con los archivos actualizados con estos gráficos. Ahora parece que no me detecta todas las colisiones con el protagonista...
Me gustan los graficos,sobre todo del primer avion,ahora le haces las elices en dos posiciones y quedara muy bien,el protagonista no me gusta tanto te voy a poner un vehiculo de ejemplo,le puedes poner personajes po las ventanas que disparen,es una idea nada mas como en la foto que te envio.jeje
en cualquier caso,de los dos protas me gusta mas el verde,el rojo es muy chillón!
(http://latiendadereme.com/images/Hucha%20Vacas%20en%20Furgoneta.jpg)
sigue asi!
ta luee!
NOTA: Editado para poner la imagen directamente.
Pues a mi me gusta mas el rojo ;D. Una vez lo ves en el juego no es tan chillón, se ve muy pequeño. La idea de la furgo esta guay pero de momento voy a dejar los gráficos, te dejas una de tiempo que no veas.
Actualizo el primer mensaje con el fondo cambiado, ahora he puesto 2 scrolls (tierra+cielo). Si pensabais que los diseños no podian ser peores... os equivocabais! jaja. De momento sera provisional para hacer pruebas, a ver que os parecen!
ah vale es que no sabia el tamaño del vehiculo,pero si el color rojo contrasta mejor que el verde usa ese entonces.el diseño si que esta muy bien hecho.
salu2
He actualizado un poco el código. Ahora al morir se para el scroll y vuelves a empezar en el inicio (gracias a DCelso ;)). Tambien he puesto vidas (3) aunque no pasa nada si llegas a 0 jaja.
Dudas... He puesto que el scoll tenga un ratio=150 para que pasen las nubes. Pero veo que al pasar una vez el scroll de fondo (nubes) se queda parado. No se tendria que repetir indefinidamente? Tambien he probado en meter 2 scrolls diferentes pero sólo se me veia el fondo con nubes, supongo que se debe de meter uno por encima del otro pero no vi como.
Eso es porque no has seteado el flag de repetición horizontal en el plano de fondo del scroll. Puedes poner flags para que se repitan horizontal o verticalmente (o ambas a la vez) la imagen del scroll o la del segundo plano de forma independiente.
Consulta START_SCROLL, concretamente, el último parámetro.
Entiendo. En este caso tendria que poner el 5 (1+4). No había caído, thkx!
QuoteThe locking indicator can be combinations of the following flags:
1 - The foreground will be displayed horizontally cyclical
2 - The foreground will be displayed vertically cyclical
4 - The background will be displayed horizontally cyclical
8 - The background will be displayed vertically cyclical
Combine them using the bitwise OR operator.
Estoy intentando portar el intento de juego a la CAANOO pero me peta al iniciar. Le pongo estos archivos (http://ubuntuone.com/p/SO7/), sabeis que puede faltar?
No consigo hacer funcionar el dichoso juego...
He cambiado los "if(key..." por "IF (jkeys_state[_JKEY_...])" por si acaso, los graficos estan en 16 bits, la resolucion es de 320x240x16, 60 frames. No sé que puede fallar ya.
Hay alguna particularidad mas que deba aplicar? He revisado algunos programas hechos para Caanoo y he hecho los mismos archivos el *.ini y dentro de la carpeta el *.gpe. Estoy atascado :P
Tienes que tener el ultimo firmware y version de Bennu en tu Caanoo para que funcionen bien los joy, aparte de esto hay que inicializar los joy siempre que uses los botones de Caanoo (mirate el ejemplo)