PDA

Ver la versión completa : Programación de videojuegos en XNA



El Peasso
28/05/2008, 17:16
Hola a todos, soy un programador de profesión el cual está investigando ultimamente como andar programando algún que otro juego. Me han hablado de este sitio y me he decidido a darme un paseito por aqui, pedir un poco de ayuda y a ser posible que todos compartamos conocimientos.

Estoy desarrollando un juego con XNA 2.0 y me gustaría poner aquí mis quebrantos con las cosas que no terminan de salirme a ver si hay alguien a quien se le ocurra la solución :rever:

Gracias a toos de antemano. Y si esto va bien y sigue adelante, voy a empezar a repartir unas cañas a diestro y siniestro (ahi está el soborno) :brindis:

pakoito
28/05/2008, 17:20
Una pregunta, dices que sabes c# pero no c/c++. ¿Sabes exactamente cuáles son las diferencias?

Malenko
28/05/2008, 17:21
Pues para empezar, las clases y el framework en sí. Lo que es sintaxis no hay apenas diferencia.

pakoito
28/05/2008, 17:25
Las clases son mas tipo Java por lo que estoy googleando ahora mismo. La asignatura de C++ ya la acabé y la verdad es que he programado como en java, pero con la ventaja de templates y sobrecargas.

El Peasso
28/05/2008, 17:25
Pues en su día aprendí a programar en C/C++, pero de aquello hace... unos 6 años. Luego estuve unos 4 años programando en Visual Basic 6.0/Visual Basic.NET y luego pasé a C# y hasta hoy en día. Imagino que el C/C++ habrá cambiado desde entonces. Hace muuuuucho tiempo que no toco ese lenguaje... Claro que todo es cuestión de ponerse de nuevo :D

pakoito
28/05/2008, 17:26
Y ahora me vienes con que sabes Visual 6.0, dos días después de entregar la putipráctica que necesitaba ayuda día si día no xDDD

c/c++ no han cambiado desde que aparecieron, por cierto. Puede que tengan nuevas librerías y demás, pero inherentemente son los mismos lenguajes desde los 70 y los 90.

Malenko
28/05/2008, 17:27
Las clases son mas tipo Java por lo que estoy googleando ahora mismo.

Que te refieres con eso? :S

Ñuño Martínez
28/05/2008, 17:28
Peasso, si de verdad quieres programar juegos deja el XNA y pásate a algo serio, como SDL o incluso Fenix, que no lo he utilizado nunca pero tiene buena pinta (te recomendaría Allegro (http://alleg.sourceforge.net/) y familia (http://alleg.sourceforge.net/bindings.es.html), pero todavía estamos currándonos el soporte OpenGL, el cual no estará listo hasta la versión 5). O mejor, diréctamente en OpenGL.

También te diría que mandases a paseo a C# y C++ y te pasases a Object Pascal, pero podría derivar en una Guerra Santa de difícil solución, así que ahí ya no me meto.

Y tranquilo, en 6 años el C no ha cambiado nada (al menos no en lo esencial). Que yo sepa a C le han metido un par de tipos nuevos, listas (arrays) vacíos y funciones inline al estilo C++, aunque yo nunca he necesitado utilizarlos.

Malenko
28/05/2008, 17:30
Eso de cambiar de framework...depende para que quieras desarrollar juegos... Además de que si quiere aprender a usar XNA no entiendo porque ha de cambiar así porque sí.

El Peasso
28/05/2008, 17:34
Mi intención no es hacer un juego como los que se hacen hoy en día. Prefiero hacer un juego como los que se hacían hace 10 años, como los Monkey Island y por el estilo. Me he decidido por el XNA porque puedes hacer cosas con relativa rapidez y sencillez y como tengo experiencia con C# me ahorro el aprendizaje del lenguaje y puedo ponerme directamente al tajo.
Actualmente tengo un pequeño problema con iluminando texturas en dos dimensiones, que por ahora no soy capáz de resolver. En cuanto pueda os explicaré más detenidamente el problema para ver si alguien encuentra una solución.

Ñuño Martínez
28/05/2008, 17:36
Bueno, vale, si prefiere pagar pudiéndolo hacer gratis, y limitarse a una o dos plataformas pudiendo publicar en prácticamente cualquiera, allá él :rolleyes: Aunque una cosa buena sí tiene AXN: uno de los jefazos es Shawn Hargreaves.

< - >

Actualmente tengo un peque&#241;o problema con iluminando texturas en dos dimensiones, que por ahora no soy cap&#225;z de resolver. En cuanto pueda os explicar&#233; m&#225;s detenidamente el problema para ver si alguien encuentra una soluci&#243;n. &#191;Ves? Si me hicieras caso ya lo tendr&#237;as solucionado (http://www.allegro.cc/manual/api/blitting-and-sprites/draw_gouraud_sprite). [wei]

Tranqui: utiliza la biblioteca y el lenguaje que quieras: es que hay d&#237;as que estoy revoltoso. :angel2:

El Peasso
28/05/2008, 17:37
Bueno, vale, si prefiere pagar pudiéndolo hacer gratis, y limitarse a una o dos plataformas pudiendo publicar en prácticamente cualquiera, allá él :rolleyes: Aunque una cosa buena sí tiene AXN: uno de los jefazos es Shawn Hargreaves.

< - >
Pues eso, con Allegro está solucionado (http://www.allegro.cc/manual/api/blitting-and-sprites/draw_gouraud_sprite). [wei]

XNA es gratuito y solo se puede utilizar con la versión gratuita de C#

pakoito
28/05/2008, 17:37
si prefiere pagar pudi&#233;ndolo hacer gratisEs gratis para juegos PC, el entorno y sacar las aplicaciones. Donde te cobran es para usarlas en 360.

Ñuño Martínez
28/05/2008, 17:39
Tranqui: utiliza la biblioteca y el lenguaje que quieras: es que hay d&#237;as que estoy revoltoso. :angel2:

Malenko
28/05/2008, 17:42
No, simplemente que si pide ayuda para XNA, no creo que le sirva de mucho decirle "cambia de sistema". Si le gusta o lo quiere hacer en XNA por "x" motivo, pues lo mejor es resolverle las dudas, nos guste o no ese sistema, pero es su elecci&#243;n.

El Peasso
28/05/2008, 17:45
A ver si voy a crear un conflicto por haber decidido XNA para programar juegos, jeje. Haya paz :brindis:

Malenko
28/05/2008, 17:47
No te preocupes. A mi tambi&#233;n me gustar&#237;a darle un vistazo. Llevo ya bastante tiempo programando en C#, y ahora queria hacer un juego online "sencillito". Me mirar&#233; lo de XNA por si me sirve.

El Peasso
28/05/2008, 17:50
Bueno, para los que estén interesados en aprender XNA, dejo aquí un enlace al que por ahora es el mejor sitio con ayuda que he encontrado en internet, tiene tutoriales y bla, bla, bla. Eso si, en perfecto inglés.

http://ziggyware.com/news.php

pakoito
28/05/2008, 18:02
Gracias, habr&#225; que probarlo.

El Peasso
28/05/2008, 19:43
Bueno, pues vamos a empezar a liarla parda...

Tengo un efecto en XNA (que me lo he agenciado del tutorial http://ziggyware.com/readarticle.php?article_id=137). Total, que el efecto descrito llamado "Deferred2DNormalMapping.fx" actua como un foco, de derecha a izquierda, quedando la zona de la derecha a oscuras. Lo que yo necesito es un foco que emita luz con un radio específico. He probado cambiando valores en el efecto, probando miles de cosas, pero como no se lo que hay que saber de matemáticas para hacer esos calculos, pues ando un poco a ciegas. Os pongo el código del efecto por si teneis alguna idea...

sampler ColorSampler : register(s0);
sampler NormalSampler : register(s1);

float3 LightPosition;
float4 LightColor = float4(1, 0, 0, 1);
float4 AmbientColor = 1;

float ScreenWidth;
float ScreenHeight;

float4 Deferred2DNormalMappingPS(float4 color : COLOR0,
float2 texCoord : TEXCOORD0) : COLOR0
{
float4 tex = tex2D(ColorSampler, texCoord);
float3 normal = tex2D(NormalSampler, texCoord);

float3 pixelPosition = float3(ScreenWidth * texCoord.x, ScreenHeight * texCoord.y, 0);
float3 lightDir = LightPosition - pixelPosition;
float lightAmount = max(dot(normal, normalize(lightDir)), 0);

return (tex * AmbientColor) + (color * lightAmount * LightColor * AmbientColor);
}

technique Deferred2DNormalMapping
{
pass Pass0
{
PixelShader = compile ps_3_0 Deferred2DNormalMappingPS();
}
}


Gracias de antemano.

pakoito
28/05/2008, 19:48
Fuera de tu duda, que no tengo ni idea. &#191;float3 float4 y tal son como los Wrappers de Java, arrays o clases declaradas por ti?

El Peasso
28/05/2008, 19:56
Por lo que he podido indagar (tampoco es que me haya enterado mucho por ahora), float3, float4 y compañía parecen arrays de objetos tipo float. Pero no sé muy bien como funcionan, porque en algunos casos al instanciarlos, no se rellenan todos los valores.

PD: Dejo una imagen de lo que me pasa por si había dudas con mi explicación (bastante mala, por cierto).

http://img511.imageshack.us/img511/2760/testky0.th.jpg (http://img511.imageshack.us/my.php?image=testky0.jpg)

Jedive
28/05/2008, 21:13
Peasso, si de verdad quieres programar juegos deja el XNA y p&#225;sate a algo serio, como SDL o incluso FenixClaro, todo el mundo sabe que Fenix es algo serio, no como eso de XNA que no usa nadie... :P

DarkDijkstra
28/05/2008, 22:32
Oye oye, un respeto, que est&#225;s hablando del sucesor del Div !!
Que con &#233;l hicieron el Tokenkai, pero con la cosa esa XNA no he visto yo juegos comerciales... : P

hardyx
29/05/2008, 10:49
Si quieres empezar a programar juegos y sabes C#, empieza con SDL.Net. Es una librería muy sencilla para programar juegos en C#. Y si luego quieres entrar en 3D puedes usar ManagedGL, que usa OpenGL y no esa caca no estándar de XNA. :quepalmo:

Además lo que aprendas te valdrá para muchos sistemas. No utilices frameworks hipercomplejos en 3D que te vas a desesperar a los dos días. Además de SDL tienes código y documentación en internet que necesitarías tres vidas para verlo todo.

Esta es la página de SDL.Net, tienes también tutoriales.
http://cs-sdl.sourceforge.net/index.php/Main_Page

Y esta es la de ManagedGL, que usa SDL y opengl
http://sourceforge.net/projects/managedgl

El Peasso
29/05/2008, 10:50
Jajaja, yo si quieres te puedo cobrar por el juego cuando lo termine :P

Ñuño Martínez
29/05/2008, 11:59
Peasso, &#191;el c&#243;digo que has puesto es C# + XNA? :confused:

Por cierto, utiliza las etiquetas
... cuando pongas c&#243;digo fuente, que queda m&#225;s chulo:


sampler ColorSampler : register(s0);
sampler NormalSampler : register(s1);

float3 LightPosition;
float4 LightColor = float4(1, 0, 0, 1);
float4 AmbientColor = 1;

float ScreenWidth;
float ScreenHeight;

float4 Deferred2DNormalMappingPS(float4 color : COLOR0,
float2 texCoord : TEXCOORD0) : COLOR0
{
float4 tex = tex2D(ColorSampler, texCoord);
float3 normal = tex2D(NormalSampler, texCoord);

float3 pixelPosition = float3(ScreenWidth * texCoord.x, ScreenHeight * texCoord.y, 0);
float3 lightDir = LightPosition - pixelPosition;
float lightAmount = max(dot(normal, normalize(lightDir)), 0);

return (tex * AmbientColor) + (color * lightAmount * LightColor * AmbientColor);
}

technique Deferred2DNormalMapping
{
pass Pass0
{
PixelShader = compile ps_3_0 Deferred2DNormalMappingPS();
}
} &#191;Ves? :brindis:


Jajaja, yo si quieres te puedo cobrar por el juego cuando lo termine :P Depende: &#191;podr&#233; ejecutarlo en Linux o MacOS? :demonio:

Malenko
29/05/2008, 12:43
No puedes especificar el ancho porque eso lo que hace es un foco de luz que irradia a su alrededor. Por decirlo as&#237;, es como una bombilla: puedes definir la cantidad de luz que emite, pero su tama&#241;o es el que tiene y punto. Para "dar" m&#225;s luz (a m&#225;s trozo de imagen) tendr&#225;s que jugar con la variable "lightAmount".

El Peasso
29/05/2008, 13:28
No puedes especificar el ancho porque eso lo que hace es un foco de luz que irradia a su alrededor. Por decirlo así, es como una bombilla: puedes definir la cantidad de luz que emite, pero su tamaño es el que tiene y punto. Para "dar" más luz (a más trozo de imagen) tendrás que jugar con la variable "lightAmount".

Cierto, después de pegarme durante interminables horas con esas cosas que no entendía (recordemos mis nulos conocimientos mátemáticos), he comprendido que es un foco de luz que está apuntando en un vector determinado para iluminar esa parte de la textura. Mi idea es a ser posible, colocar el foco de manera que ilumine la textura de frente, aumentando o disminuyendo el valor del eje z en el vector para cambiar la intensidad de la luz, pero... no sé como hacer girar el foco

Malenko
29/05/2008, 13:31
Cambiando el valor de lightPosition. Te has mirado la p&#225;gina que has puesto? Ah&#237; te comentan, casi linea por linea, que es lo que hace.

El Peasso
29/05/2008, 21:09
Cambiando el valor de lightPosition. Te has mirado la p&#225;gina que has puesto? Ah&#237; te comentan, casi linea por linea, que es lo que hace.

Si, lo he visto, revisto, pero no hay manera, porque el vector lightposition es para posicionar la luz en los ejes x,y,z, pero luego se le resta otro vector para sacar la direcci&#243;n de la luz y siempre me termina apuntando al mismo sitio. De todas formas, se me han ocurrido unas pruebas para hacer, pero en este momento no pueo probarlas :P

< - >
Creo que lo he conseguido, no estoy seguro, pero parece que funciona (al menos por ahora). He puesto otros 3 focos invirtiendo los ejes x e y para cubrir los 4 v&#233;rtices de la pantalla. Os pongo el c&#243;digo:



sampler ColorSampler : register(s0);
sampler NormalSampler : register(s1);

float3 LightPosition;
float4 LightColor = float4(0.5, 0, 0, 0.5);

float4 AmbientColor = 1;

float ScreenWidth;
float ScreenHeight;

float4 Deferred2DNormalMappingPS(float4 color : COLOR0,
float2 texCoord : TEXCOORD0) : COLOR0
{
float4 tex = tex2D(ColorSampler, texCoord);
float3 normal = tex2D(NormalSampler, texCoord);

float3 pixelPosition = float3(ScreenWidth * texCoord.x, ScreenHeight * texCoord.y, 0);
float3 lightDir = LightPosition - pixelPosition;
float3 lightDir2 = float3(lightDir.x * -1, lightDir.y * -1, lightDir.z);
float3 lightDir3 = float3(lightDir.x, lightDir.y * -1, lightDir.z);
float3 lightDir4 = float3(lightDir.x * -1, lightDir.y, lightDir.z);
float lightAmount = max(dot(normal, normalize(lightDir)), 0);
float lightAmount2 = max(dot(normal, normalize(lightDir2)), 0);
float lightAmount3 = max(dot(normal, normalize(lightDir3)), 0);
float lightAmount4 = max(dot(normal, normalize(lightDir4)), 0);

return (tex * AmbientColor) + (color * lightAmount * LightColor * AmbientColor) + (color * lightAmount2 * LightColor * AmbientColor) + (color * lightAmount3 * LightColor * AmbientColor) + (color * lightAmount4 * LightColor * AmbientColor);
}

technique Deferred2DNormalMapping
{
pass Pass0
{
PixelShader = compile ps_3_0 Deferred2DNormalMappingPS();
}
}