Codigo C# en XNA como es en VB2013 en XNA

Iniciado por Tazmania40, 8 Junio 2017, 13:15 PM

0 Miembros y 1 Visitante están viendo este tema.

Tazmania40

Buenas, estoy intentando traducir un ejemplo de C# para XNA donde trata una colisión por píxel entre 2 rectángulos. En C# para XNA me funciona correctamente, pero en VB2013 que también permite la librerias de XNA y ya he realizado varios programas sin problemas, tiene las mismas sentencias solo que cambia la sintaxis. Paso el código y en negrita donde muestra el problema, la línea del error es "Player.GetData(texturaPlayer), me imagino que este método lo que hace es copiar todos los colores de la textura. Estoy probando de muchas formas, inicializando  la instancia de todos los array y no doy con ello.

Mensaje de error al ejecutar: "The size of the data passed in is too large or too small for this resource."

Código (vbnet) [Seleccionar]

Private Player As Texture2D
Private rectPlayer As Rectangle
Private texturaPlayer() As Color

Protected Overrides Sub LoadContent()
' Carga textura Jugador 1 y copia el total número colores
Player = Content.Load(Of Texture2D)("Imagenes\Sprite1")
ReDim texturaPlayer(Player.Width * Player.Height)
Player.GetData(texturaPlayer)
...

End Sub


a la función que llamo luego es:
Código (vbnet) [Seleccionar]

If intersectPixel(rectPlayer, texturaPlayer, rectRoca, texturaRoca) Then
...


El código en C# para XNA donde funciona sin problemas es:
Código (csharp) [Seleccionar]

Texture2D Player;                               // Sprite del Jugador1
Rectangle rectPlayer;                          // Rectángulo Jugador1 (colisión)
Color[] texturaPlayer;                         // Colores Jugador1

protected override void LoadContent()
{
// Carga textura Jugador 1 y copia el total numero colores
Player = Content.Load<Texture2D>("Imagenes/Sprite1");
texturaPlayer = new Color[Player.Width * Player.Height];
Player.GetData(texturaPlayer);
...

}


Muchos pensaréis que porque no lo programo en C# para XNA y aunque lo entiendo, soy de los que le gusta seguir con el mismo lenguaje y el juego que estoy realizando lo quiero hacer en Visual Basic 2013 con XNA.

A ver si hay alguien que me pueda echar una mano y así poder continuar con el juego, suelo empezar por lo que me resulta más difícil e intento resolver mediante pequeños ejemplos todas las posibles dificultades antes de comenzar el proyecto.

Muchas gracias y saludos

Tazmania40

Ya está resuelto, gracias Electro por en enlace al traductor (http://converter.telerik.com), pensaba que para XNA no valía.  Aunque no entiendo si por ejemplo en VB.net declarar un array tipo variable u objeto es

Código (vbnet) [Seleccionar]
Dim var() As Integer

su traducción en C#
Código (csharp) [Seleccionar]
int[] var; por eso me ha dado indicio a error en la traducción y lo puse en "texturaPlayer". Aqui está el código correcto.

Código (vbnet) [Seleccionar]

Private Player As Texture2D                         ' Sprite del Jugador1
Private rectPlayer As Rectangle                     ' Rectángulo Jugador1 (colisión)
Private texturaPlayer As Color()                    ' Colores Jugador1

Protected Overrides Sub LoadContent()
        spriteBatch = New SpriteBatch(GraphicsDevice)
       ' Carga textura Jugador 1 y copia el total número colores
        Player = Content.Load(Of Texture2D)("Imagenes\Sprite1")
        texturaPlayer = New Color(Player.Width * Player.Height - 1) {}
        Player.GetData(texturaPlayer)
        .....
End Sub


Veo que el GetData también permite para tira de imágenes, en el argot llamado "sprite sheets" ya que utilizo animaciones y naturalmente la imagen de "Player" cambia cada cierto tiempo y tiene que evaluar esa imagen. Si alguien ya lo ha realizado se agradece, yo empezaré a intentarlo con C# y luego en VB.NET.

Saludetes

Eleкtro

#2
Cita de: Tazmania40 en  8 Junio 2017, 13:55 PM
Ya está resuelto, gracias Electro por en enlace al traductor (http://converter.telerik.com), pensaba que para XNA no valía.  

XNA es tan solo una librería (y obsoleta), me refiero, el lenguaje/sintaxis en el que desarrollas sigue siendo C#, así que por supuesto que un conversor de código C# <> VB.NET te servirá para traducir el código.

Cita de: Tazmania40 en  8 Junio 2017, 13:55 PM
Aunque no entiendo si por ejemplo en VB.net declarar un array tipo variable u objeto es

Código (vbnet) [Seleccionar]
Dim var() As Integer

su traducción en C#
Código (csharp) [Seleccionar]
int[] var;

No entiendo el error que has dicho tener en la declaración de ese Array, pero bueno al parecer dices que ya lo has resuelto, y eso es lo que importa :-)

Saludos!








Tazmania40

Referente a las librerías de XNA y comentario de obsoleto como dices Elektro no significa que no sirva, te lo he oido decir en muchas ocasiones y no todos los programadores están a la última, incluso los que trabajan y se ganan la vida en ello.

XNA termino el soporte de Microsoft en 2014, pero como bien dije en unos post anteriores yo tenía problemas para mis juegos con el tema de los tiempos y que fueran a la misma velocidad en distintos procesadores, la clase  Stopwatch me solucionó en parte, pero todavía viejos procesadores se notaba la velocidad y fallaba dicha clase. Tenía la opción de mirar directX (más difícil) y casi toda la ayuda va para C++ que no tenía ni idea o bien elegir XNA más fácil y que el usuario al que va dirigido el juego solo tiene que instalar unas librerias de 7 Mb y ya puede correr los juegos en XNA. Con XNA el ciclo del juego se realiza en 60 veces en 1 segundo (60Hz) y se soluciona el tiempo que era mi mayor problema para distintos procesadores. Con todo lo que trae para realizar juegos 2D (incluso también tiene 3D) para mi es más que suficiente, después de realizar juegos estilo arkanoid, serpiente, meteoritos, tetris... pues ya tocaba empezar con los scroll, animaciones e intentar hacer algo de plataformas. Yo con saber eso voy más que contento, si puedo realizar algo en 3D el día de mañana pues creo que me sobra librería. Como bien dije lo hago por hobby y si bien podía pasarme a motores como 3d Unity, pues no me llama la atención de momento y eso que veo tutoriales y lo respeto a todos aquellos que hacen maravillas con Unity, pero a mi me gusta seguir programando con VB.NET y todo lo que pueda hacer con el.

Bueno voy a intentar pegarme con lo que dije "sprite sheets" para mostar la imagen que quiero comparar con el sprite en tema de colisión de pixel. Se utiliza el mismo método GetData que lleva otros parámetros. Imaginemos que mi textura tiene 6 imágenes para la animación y quiero mostrar la número 3, naturalmente GetData tiene que capturar la 3 que es distinta a la 1. Si alguien sabe se lo agradezco, aunque me pegaré con ello y sino lo consigo pondré una nueva pregunta describiendo.

Gracias Elektro, eres todo una máquina, yo es que voy muy lento y con la edad ya me conformo con practicar lo que puedo cada día que muchas veces me quita tiempo de sueño, pero siempre con ganas.

Saludetes

Tazmania40

#4
Buenas a todos/as, ya lo he conseguido también la visualización mediante animaciones con "Sprite Sheet". La instrucción que solamente cambia es GetData.

Código (csharp) [Seleccionar]

Player.GetData(0,
              new Rectangle(currentFrameX * FrameWidth, currentFrameY * FrameHeight, FrameWidth, FrameHeight),
              texturaPlayer,
              currentFrameX * currentFrameY,
              FrameWidth * FrameHeight);


Donde currentFrameX es la imagen que queremos representar en el eje X. Normalmente comenzamos por la primera y la inicializamos con 0. CurrentFrameY sería la altura de esa imagen por si tenemos imágenes de diferentes alturas (creo que esto se realiza para las escalas...). Yo en mi juego como el "Sprit Sheet" tiene la misma altura y quiero coger cada recuadro en mi caso es 0 también.

FrameWidth y FrameHeight, corresponden a la anchura y altura de una sola imagen, por ejemplo mi "Sprite Sheet" es de 670x60 (aconsejo imágenes animadas en partes iguales cada recuadro). FrameWidth sería 67 y FrameHeight sería 60.

Recordar que la imagen que capturamos de origen en el rectángulo tiene que ser el ancho y alto de 1 sola imágen y la imagen rectángulo destino es lo mismo pero cambiamos la posiciones X e Y según vamos moviendo nuestro sprite.

Saludetes y bueno ahora lo pasaré a VB.net que es lo que me gusta.

plizze4

Has pensado en usar monogame? usa las misma api que xna y te permite crear juegos multiplataforma.

Eleкtro

#6
Cita de: Tazmania40 en  8 Junio 2017, 20:44 PM
Referente a las librerías de XNA y comentario de obsoleto como dices Elektro no significa que no sirva, te lo he oido decir en muchas ocasiones y no todos los programadores están a la última, incluso los que trabajan y se ganan la vida en ello.

Pero compañero, cuando me hayas leido decir que "X" cosa está obsoleta en el mundillo de la programación, no caigo en el error de decir algo así sin criterio o como quien da su opinión personal sobre algo, sino haciendo referencia a una afirmación/información/detalle de importancia y oficial. En este caso XNA es un proyecto descontinuado desde el año 2011, esto son 6 años de diferencias con respecto a los avances informáticos de los frameworks para el desarrollo de videojuegos... lo cual simplemente me pareció un motivo muy relevante como para hacer ese pequeño inciso añadiendo el paréntesis: "(está obsoleto)" simplemente para tratar de advertirte a ti (por si quizás no lo supieras) o a quien no supiera ese dato y estuviese interesado en el tema, puesto que oficialmente XNA está considerado muerto por las propias declaraciones de Microsoft.

Por otro lado por supuesto estar a la última no es sinónimo de "ser mejor programador" ni nada que se le parezca, ya que simplemente podriamos estar precisando de una versión antigua (u obsoleta) de algo por el motivo que sea, por motivos de compatibilidad con "X" plataforma, o por que nos gusta más y ya está, por lo que fuese. Tan solo quise resaltar que XNA está considerado obsoleto, pero no me meto ni cuestiono los motivos que te lleven a usarlo, de hecho yo no desarrollo videojuegos así que poco más puedo opinar.

PD: Tan solo quería aclarar mis palabras para que no se mal interpretasen... ahora que se ha vuelto a revivir este tema.

Saludos!