Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Programando videojuegos: Tutorial XNA Game Studio 4.0

Iniciado por wardamo, 09 de Junio de 2010, 11:47:40 AM

« anterior - próximo »

wardamo

Hola, soy un programador con alguna experiencia con XNA, y estoy haciendo un blog sobre programación que ultimamente se centra bastante en las tecnologias .NET, pues viene a ser lo que mas utilizo. La cuestión es que me he puesto a hacer un tutorial sobre XNA (Haciendo un jueguito de naves) y lo intento explicar todo paso por paso.
El tutorial esta orientado tanto a la gente que quiera aprender a utilizar XNA como a la gente que es nueva programando videojuegos.
http://codecrab.blogspot.com/
De momento solo tengo hechas las 2 primeras partes.
Las criticas constructivas son bienvenidas :P

tewe76

Tewe
www.TAPAZAPA.com : Funny and easy to play games for all ages! - Fairy Match - Brain Crash
www.LaRebelionDelBiberon.com : Experiencias de unos padres primerizos

Vicente

Hola,

ta gracioso la verdad, un comentario de algo que a mi personalmente me saca de quicio: las cosas en inglés o en español, pero mezcladas no :S Es decir, si tu clase se llama Nave, y tus variables cosas como posicion,... luego no tengas un método que se llama UpdatePosition :p

Un saludo,

Vicente

Makaimura

Muy bueno, a ver si lo consigues acabar, thx me es muy util.

flipper83

cuando lo tenga completo le ponemos una chincheta? o ponemos un post recopilatorio de tutoriales y articulos?
un cobarde forero en el tanatorio al mes sería un placentero trofeo digno de merecer

wardamo

tercera parte del tutorial subida. A partir de ahora actualizare con más frecuencia :) http://codecrab.blogspot.com/

wardamo


wardamo


Vicente

Mmm, me he estado leyendo la parte 5, voy a ser un poco pijotero al respecto:

- Utiliza readonly mejor que const (da un poco igual, pero es un poco mejor).
- Deberías ser más constante en la nomenclatura. A veces a las variables privadas las llamas "imagen" y otras "_posicion". Yo no pondría el guión bajo nunca.
- Podrías usar propiedades autogeneradas (a gusto del consumidor la verdad):

public Vector2 Posicion { get; private set;}

- Deberías también ser constante en el uso de atributos o propiedades para detalles internos de la clase.

_posicion.Y += 3;  
bounds = new Rectangle((int)Posicion.X, (int)Posicion.Y, anchoImagen, altoImagen);  
if (_posicion.Y >= altoVentana)  

Primero usas el atributo para la asignación, luego las propiedades para la lectura, y luego el atributo otra vez para leer, queda fatal.

- Puedes actualizar las coordenadas del rectángulo sin tener que crear uno nuevo, igual que haces con el Vector2 (da un poco igual la verdad, pero bueno, como solo actualizas la Y a veces...).

- "Además añadimos varias propiedades para poder acceder a imagen, _posicion y bounds sin necesidad de implementar un método get (Gracias a esto se podra acceder simplemente con enemigo.Imagen o enemigo.Bounds"

Entiendo lo que quieres intentar explicar, pero no es correcto. Una propiedad es un método get, cuando compilas se traducen a eso, si tu tutorial va para gente que sabe .NET, saben seguramente lo que es una propiedad también, y si no lo saben la explicación es un poco rara (asumes que saben lo que es un método get...).

- "enemigos.ForEach(x => x.Update());" Esta línea es muy discutible, yo usaría un foreach normal:

foreach(Enemigo1 e in enemigos) { e.Update() };

Es igual de corto, y se entiende bastante bien. La discusión a fondo de porque esa línea es tan problemática está aquí: http://blogs.msdn.com/b/ericlippert/archive/2009/05/18/foreach-vs-foreach.aspx

- Este código:

private List<disparo>disparos;  
public List<disparo> _disparos  
{  
        get { return disparos; }  
}

De nuevo la nomenclatura, que es un lío terrible :S También estaría bien que probaras a devolver un IEnumerable<Disparo> en tu propiedad, aunque tendrías que cambiar algunas cosillas.

- Ten un Random general para toda la aplicación, no uno que creas continuamente en la función UpdateEnemigos.

- Esto:

bounds = new Rectangle((int)Posicion.X, (int)Posicion.Y, anchoImagen, altoImagen);
Rectangle rectanguloA = new Rectangle(Convert.ToInt32(posicionA.X), Convert.ToInt32(posicionA.Y), texturaA.Width, texturaA.Height);

A veces usas un cast, a veces el Convert, yo castearía siempre (aunque tendría que mirar que hace Convert.ToInt32 por dentro).

- - - - - - - - - - - -

Y poco más creo, en general eso, el código es bastante lioso porque no es nada uniforme, si lo pules un poco más te queda chapeau.

Un saludo,

Vicente

WaaghMan

Ya que estamos otra cosa que ví, no digo que tenga mucho remedio, pero haces dos new en el método para la colision por pixel:
uint[] bitsA = new uint[texturaA.Width * texturaA.Height]; 
    uint[] bitsB = new uint[texturaB.Width * texturaB.Height]; 
 


Esto en la Xbox 360 sería un asesinato, estaría saltando todo el rato el recolector de basura. En un tutorial está bien, pero yo advertiría al respecto.

Un poco difícil de remediar a mi entender, a menos que se use un array con el tamaño máximo de antemano y cosas así.
Milkstone Studios - Autores de Avatar Ninja!, Little Racers, MotorHEAT y Wool en Xbox Live Indie Games

Vicente

Cierto WaaghMan, buen apunte. Dado que las naves y los disparos tienen tamaño constante yo utilizaría siempre los dos mismos arrays y a correr.

blau

Dais miedo... no pienso enlazar un código mio a stratos en la vida.   :P


Vicente

Bueno, el apunte más importante es el que ha hecho WaaghMan, que estás creando dos referencias de tamaño considerable cada vez que tienes que comprobar una colisión por pixel. No son muchas pero estás generando basura y trabajo para el pobre recolector y eso en la Xbox se paga caro.

Mis apuntes eran más de estilo, que en un tutorial se agradece que el código sea fácil de seguir y esté ordenadito :)

[EX3]

#13
Cita de: blau en 09 de Julio de 2010, 01:19:30 AM
Dais miedo... no pienso enlazar un código mio a stratos en la vida.   :P
Yo si, a ver si alguien tiene cojones a revisar y corregir codigo en Visual Basic 6.0 >:D

Salu2...

Edit: Bueno, en verdad ya lo hizo años atras Zupervaca xDDD
http://www.stratos-ad.com/forums/index.php?topic=5120.0
José Miguel Sánchez Fernández
.NET Developer | Game Programmer | Unity Developer

Blog | Game Portfolio | LinkedIn | Twitter | Itch.io | Gamejolt

wardamo

Hay muchas cosas que tengo que cambiar, pero el problema es que tendria que modificar todas las partes del tutorial de forma retrospectiva. No obstante hay muchas cosas que estan ahi por algun motivo. En cuanto a los array que creo cada vez que se llama el metodo, si fuesen atributos de la clase el metodo solo valdria para colisiones de enemigos y disparos, lo que sera un problema más adelante.
En cuanto a la expresion lambda que utilizo, si usase un foreach me daría un error en tiempo de ejecución por borrar un elemento de la colección en medio de la colección (como explico en partes anteriores del tutorial). Las propiedades que dices que cambie..  pos bueno, están, y el convert, esa parte del código no la he hecho yo y por eso es algo incoherente.
No obstante tengo que cambiar algunas cosas, especialmente la nomenclatura.






Stratos es un servicio gratuito, cuyos costes se cubren en parte con la publicidad.
Por favor, desactiva el bloqueador de anuncios en esta web para ayudar a que siga adelante.
Muchísimas gracias.