Menú

Mostrar Mensajes

Esta sección te permite ver todos los mensajes escritos por este usuario. Ten en cuenta que sólo puedes ver los mensajes escritos en zonas a las que tienes acceso en este momento.

Mostrar Mensajes Menú

Mensajes - Tazmania40

#21
Buenas a todos/as, quería saber si hay alguna manera sencilla de saber el tipo de procesador y velocidad de este para asignar la información a una variable (integer) por ejemplo y así poder aumentar la velocidad o disminuir de un juego que estoy programando.
Busco código o información para Windows Forms. El tema de WMI (Windows Management Instrumentation) no lo entiendo y aparecen errores en ejemplos de Microsoft.

Si puede ser como digo algo sencillo del tipo...

Código (vb.net) [Seleccionar]

MsgBox(My.Computer.Info.OSVersion)
MsgBox(My.Computer.Info.OSPlatform)
...


Naturalmente sin utilizar DirectX. Seguiré buscando por si veo algo que me convenza, si lo encuentro lo pondre aquí el código.

Gracias y saludos
#22
Buenas otra vez, para acabar comentarte El Benjo que tienes razón respecto al dibujado, tan solo añadí a la estructura otra variable de tipo Boleano y cuando esta False no lo dibujo y no influye en las coordenadas. El tema Dispose lo elimino como en anteriores juegos en Form1_FormClosing puesto que como ya dije no soy muchos los objetos, si creara una clase entonces si tendría que implementar Disposing como en el enlace que puse.

Respecto a Theread.Sleep() ahí tengo que discrepar, aunque voy a realizar una nueva pregunta y decir solucionado esta puesto que hacía referencia a Mover un Sprite. Según el código que expuse al principio

Código (vb.net) [Seleccionar]

Protected Overrides Sub OnPaint(e As PaintEventArgs)
   Dim de As Graphics = e.Graphics
   MOVER()
   DIBUJAR(de)
   'Thread.Sleep(100)                                  ' No lo pongo, va bien el programa
End Sub


veo que la velocidad el juego va bien sin poner el retardo, es más si lo pongo aunque sea Thread.Sleep(1) se ralentiza demasiado y no me interesa. Para aumentar la velocidad tan solo tengo que aumentar el código siguiente

Código (vb.net) [Seleccionar]

Private Sub MOVER()
   Bola1.Pos.X = Bola1.Pos.X + 1                 ' Aquí es donde aumentamos velocidad +2, +3 ....
   Bola2.Pos.X = Bola2.Pos.X + 1

   If Bola1.Pos.X >= 800 Then Bola1.Pos.X = 0
   If Bola2.Pos.X >= 800 Then Bola2.Pos.X = 0
   Invalidate()                                  ' Vuelva a dibujar el control
End Sub


donde los objetos los movemos más rápidos, el valor mínimo es 1 puesto que es de tipo Point y representa el pixel en pantalla. Es una buena velocidad para un procesador I5, I3, pero baja un poco en un DUAL Core y sobre todo se ralentiza en un Pentium IV. Solución aumentar a +2 o +3 los objetos. Por eso voy a exponer otra nueva pregunta, aunque intentaré buscar por mi cuenta como siempre.

Gracias y saludos
#23
Buenas, gracias okik por toda la información y es un comienzo para empezar por DirectX aunque de momento lo que estoy utilizando me gusta y he eliminado los reflejos por completo, pero esta claro que si quiero añadir por ejemplo más de un sonido wav al mismo tiempo tendría que usar DirectX y sus librerias, es uno de los problemas que siempre te encuentras (aunque solucioné en un juego que hice con la dll del Windows Media Player, pero no es la forma correcta de representar más de un sonido al mismo tiempo). Esta claro que casi toda la ayuda y lo que encuentras es para Visual C++, yo intentaré primero con Visual Basic porque creo que con Visual C++ además de Net Framework los usuarios que quieran emplear juegos realizados con DirectX se tienen que instalar las runtime de Visual C++ 2010 y por experiencia cuando un juego ocupa mucho y encima se tienen que instalar algo entonces pasan de bajarselo.

Ya he probado el tema de colisiones y perfecto, aunque la sintaxis que puse no era la correcta (es para un objeto de tipo control), se que a muchos que hacéis esto no os gusta poner el código de un ejemplo pero bueno después de probar informo como es, corregirme si alguien lo emplea de otra forma.

Código (vb.net) [Seleccionar]

Private ObjP As Rectangle               ' Objeto principal, por ejemplo puede ser una Nave
Private Obj(6) As Rectangle             ' Objetos secundarios, demás Sprites que comprobamos

' Colisión de 2 objetos
ObjP = New Rectangle(Nave.Pos.X, Nave.Pos.Y, 40, 40)
For B As Short = 0 To 6
   Obj(B) = New Rectangle(Bola(B).Pos.X, Bola(B).Pos.Y, 40, 40)
   If ObjP.IntersectsWith(Obj(B)) = True Then
       My.Computer.Audio.Stop()          
       My.Computer.Audio.Play(My.Resources.Explosion1, AudioPlayMode.Background)
       Nave.Imagen = My.Resources.Explo1             ' Explota Nave
       ...
        Exit For                          
   End If
Next B


Si quisieramos comprobar por pixel, en vez de establecer el codigo de finalización anterior podriamos llamar a otra rutina pasandole el objeto 2 a comprobar y aquí miramos el color del pixel
con el objeto principal que es la Nave, si es transparente no hacemos nada y si no lo es es cuando ponemos el código de finalización. Es así como yo lo hago, aunque como digo en este juego que realizo al ser los gráficos casi cuadrados y en continuo movimiento no me hace falta.

El Benjo mirare Dispose, naturalmente los objetos que yo declaro son "no administrativos" por eso la buena costumbre de liberar recursos. También lo decía porque en este juego no son muchos los Sprites que utilizo y siempre estan en memoria hasta que finalice juego, pero por ejemplo no se como hacéis el borrado de un Objeto (lo que es visible = false), en mi caso o bien suelo situarlo en límites fuera del recuadro de juego para que no se vea o utilizar un Switch en las propiedades del Sprite de tipo Booleano y pintarlo con una imagen transparente, por eso comentaba también el método dispose si se puede eliminar objeto y crear nuevamente de una forma correcta y rápida o bien si hay alguna otra forma correcta.

Por cierto otra pregunta ¿Como utilizáis el tema de retardos de tiempo en las animaciones?, está claro que el timer lo eliminamos, el Thread.Sleep si lo utilizo es para toda la carga (afecta a todo el programa) y de momento yo utilizo contadores normales y claro por ejemplo el juego probado en un i5 y un dual core apenas hay mucha diferencia aunque este último va un poquito más lento, pero si lo pruebo en el Pentium IV que tengo en casa de mi padre (todavía no lo he hecho) me imagino que si se apreciará.

Gracias y saludetes
#24
Buenas, voy a comenzar por okik respondiendote y preguntando para aclararme el tema de DirectX, aunque de momento no lo voy a utilizar pero para avanzar y mejorar creo que es lo próximo a utilizar o bien XNA.

Me baje hace un tiempo DXSDK_Jun10.exe que veo que es el enlace que me has puesto. Mis preguntas son si lo instalo.

1º Estas son las ultimas librerias de DirectX para Visual Studio 2010, yo tengo el Visual Studio 2013 update 5, si lo instalo no tendré problemas, me podrá servir, tan solo como comentas actualizar los componentes cuando lo solicite o bien en Herramientas, elegir elementos del cuadro de herramientas. Luego en el código importar las librerias que vayas a utilizar (que de momento no tengo ni idea), pero es así??

2º Si todo esta bien (punto 1), al realizar un programa con DirectX, me imagino que la versión DXSDK_Jun10.exe que es la última será para el DirectX 11, en ordenadores de otros usuarios tan solo tienen que tener instalado DirectX 11, al igual que las librerias Net Framework, es decir no tienen que instalarse nada puesto que casi todos los ordenadores llevan esto instalado ??

3º Para Windows 10, vale también. De momento los programa que he realizado y publicado (con versión 3.5 de Net Framework) se ha ejecutado sin problemas para esta plataforma. En Windows 10 tengo entendido que ya utiliza DirectX 12, pero me imagino que programas creado con versiones antiguas de DirectX se ejecutarán sin problemas, es así ??

Como bien dices la mayor parte de ejemplos de DirectX es para Visual C++, hace mucho tiempo estudie C y bueno se entiende algo, al igual que C#, a lo mejor es preferible pasarse alguno de esos lenguajes para el tema de juegos, pero como programo por hobby y siempre me gustó Visual Basic prefiero seguir con el hasta donde llegue, ya lo abandoné hace años el Visual Basic 6.0 y el año pasado cuando empezé de nuevas con VB2013 me estoy adaptando bien y no quiero dejarlo, además que ha mejorado mucho y se va pareciendo a Visual C++ en su estructura de código, abandonando las formas antiguas de programar y que dicen que son malas. Gracias okik


Respecto El Benjo responderte que al principio utilizaba lo tipico label para saber coordenadas y no veo que sea correcto en un objeto gráfico GDI+, aqui solamente hay que emplear métodos gráficos y representar mediante "d.DrawString" para hacer pruebas con las coordenadas.

La verdad que el juego que estoy haciendo me está quedando muy bien y bastante satisfecho con el código principal expuesto del principio. Puedo cambiar los fondos de pantalla (he creado un pequeño scroll horizontal) y los Sprites que he colocado se mueven fluidamente, al igual que el Objeto principal (Nave), no se ven reflejos al emplear DobleBuffering del Formulario. Todavía no he llegado a la parte de colisiones, decir que los Objetos empleados son casi cuadrados y aplicaré la técnica

Código (vb.net) [Seleccionar]

Objeto1.Bounds.IntersectsWith(Objeto2.Bounds)


Conozco algo de la técnica del pixel, aunque aqui no lo voy a emplear por ser casi cuadrados los objetos. Cuando empleaba solía mirar 20-30 puntos (GetPixel) del Objeto principal como marcando su referencia, aunque no era exacto pero evitaba la ralentización mirando todos los puntos del Sprite. Me pondre con ello y comentaré aqui si me ha ido bien las Colisiones.

Respecto al XNA leí algo y veo que aunque está en desuso porque se realizó para la consola Xbox 360, Windows Phone y Visual Studio me imagino versión 2010. Quería preguntarte si ese enlace que facilitas que veo que es la última versión vale igual para Visual Studio 2013, porque tengo entendido que XNA esta pensado para utilizarlo en Visual C#, aunque a lo mejor se puede implementar también en Visual Basic 2013. Es a modo de consulta, puede que me lo baje tambien para tenerlo, pero seguramente en un futuro me decante por DirectX, me imagino que me servirá mejor para Windows 10.

Por último preguntarte si hay que implementar el método Dispose, paso enlace de ejemplo https://msdn.microsoft.com/es-es/library/bb972198.aspx
Yo lo que hacía era en el Form1_FormClosing eliminar los objetos que había creado al cerrar el Formulario. Como véis en el ejemplo del post1 cargo los gráficos y los voy a emplear durante todo el juego. Dicen que se eliminan automáticamente o al cerrar el Formulario, la verdad estoy un poco verde en el método Dispose, si podéis aclararme un poco pero de un modo sencillo. Yo suelo ser lento para coger las cosas, pero al final de tanto insistir o probar doy con ello y lo comprendo, aqui veo mucho nivel, jeje. Gracias y saludos
#25
Buenas he realizado pruebas, pongo ejemplo

Código (vb.net) [Seleccionar]

Public Class Form1
   Private Conta As Short = 0

   Private Sub Form1_Paint(sender As Object, e As PaintEventArgs) Handles Me.Paint
       e.Graphics.DrawString("Texto", New Font("Tahoma", 16, FontStyle.Bold), _
                              Brushes.Blue, New Point(100, 30))
       Conta += 1
       Label1.Text = "Ejecución = " & Conta.ToString 'Aqui muestra 2 ejecución
   End Sub
End Class


Veo que el evento Paint se ejecuta 2 veces cuando iniciamos el Formulario, si colocamos OnPaint

Código (vb.net) [Seleccionar]

Protected Overrides Sub OnPaint(e As PaintEventArgs)
   MyBase.OnPaint(e)
End Sub


efectivamente no impide que se ejecute eventos Paint, pero siempre y cuando dejemos la llamada al método base "MyBase.OnPaint(e)", si lo quitamos no vemos nada (en este caso el color Texto de color azul), por eso lo vemos por defecto. Ampliamos ejemplo:

Código (vb.net) [Seleccionar]

Private Conta As Short = 0

Private Sub Form1_Paint(sender As Object, e As PaintEventArgs) Handles Me.Paint
    e.Graphics.DrawString("Texto", New Font("Tahoma", 16, FontStyle.Bold), _
                               Brushes.Blue, New Point(100, 30))
    Conta += 1
    Label1.Text = "Ejecución = " & Conta.ToString
End Sub

Protected Overrides Sub OnPaint(e As PaintEventArgs)
    MyBase.OnPaint(e)
    e.Graphics.DrawString("Texto", New Font("Tahoma", 16, FontStyle.Bold), _
                              Brushes.Red, New Point(100, 80))
    Conta += 1
    Label1.Text = "Ejecución = " & Conta.ToString 'Aqui muestra 4 ejecución
End Sub


Ahora muestra los dos textos y el contador es igual a 4. Quitamos "MyBase.OnPaint(e)" y solo mostrará el texto en color rojo y contador a 2. Esta claro que se ejecuta 2 veces tanto evento Paint como OnPaint al inicio del Formulario. Pero siguiendo el ejemplo de arriba, el tema de coordenadas parece que de inicio no lo muestra bien (seguiré con pruebas).

El código que he expuesto como he comentado utilizo el Doble Buffering activando en el Formulario o bien con código y ampliando opciones. Veo que es lo mejor y casi apenas se nota, ha mejorado mucho respecto a métodos que utilizaba anteriormente. La clase que comentas El Benjo, BufferedGraphics dice "Proporciona un búfer gráfico para el doble búfer", deduzco que sería un triple búfer porque ya el Formulario había activado la propiedad. Es como lo hacía con un timer, copiando imagen en un objeto y luego representandola por ejemplo en otro objeto como un PictureBox. Las dos han sido probadas y este código (primero) es lo mejor que veo sin utilizar DirectX u OpenGL.

Tan solo veo cosas extrañas con las coordenadas (Pos.X, PosY), si alguien ha realizado juegos 2D y sabe la mejor manera de posicionar los objetos y que te den el valor exacto, incluso cuando inicias el juego implementado el código expuesto al principio se lo agradecería, aunque seguiré haciendo pruebas. Gracias "El Benjo" por tu comentario.

También si alguien sabe de algún manual sencillo y que lo explique bien desde el principio (en español) sobre el tema DirectX , para 2D solamente en Visual Basic 2013 se lo agradezco. Normalmento lo que encontraba es bastante difícil (inglés) y para tener una base se debe empezar por lo más fácil.

Saludos y gracias
#26
Buenas a todos, estoy intentando mejorar el tema de movimientos de Sprites, puesto que lo utilizado hasta ahora todavia veo reflejo, aún poniendo DoubleBuffered = True en el Formulario y buscando información y probando veo que la mejor forma es utilizando "Protected Overrides Sub OnPaint". Naturalmente con DirectX o OpenGL sería otra cosa, pero no tengo ni idea.
Pongo código y lo explico (programa compilado con .NET Framework 4.0)

Código (vb.net) [Seleccionar]

Imports System.Threading

Public Class Form1

' Tenemos un fondo de pantalla jpg 800x600 y dos imágenes transparentes png 50x50
' DECLARACIONES de los Objetos

Private Grafico As Graphics         ' Declaramos Objeto principal del GDI+
Private BitGrafico As Bitmap        ' Declaramos Bitmap que se copia en Objeto principal
Private Fondo As Bitmap             ' Imagen de fondo que utilizamos
Private Structure DSprite           ' Declaramos el Sprite (imagen y posición)
   Dim Imagen As Bitmap
   Dim Pos As Point
End Structure
Private Bola1, Bola2 As DSprite   ' Objetos de tipo Sprite

Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
   ' Cargamos los Gráficos
   Fondo = My.Resources.Tierra
   Bola1.Imagen = My.Resources.Bola
   Bola1.Pos = New Point(0, 100)
   Bola2.Imagen = My.Resources.Bola2
   Bola2.Pos = New Point(0, 300)

   ' Inicializamos los Objetos GDI+
   Grafico = Me.CreateGraphics()
   BitGrafico = New Bitmap(800, 600)
   Grafico = Graphics.FromImage(BitGrafico)
End Sub


Hasta aquí todo bien, ahora es cuando utilizo OnPaint y mi primera pregunta (más bien duda y confirmación). ¿Este evento impide que se ejecuten los demás eventos Paint? (sobre todo del Formulario), que para eso tendríamos que llamarlo con MyBase.OnPaint(e), al colocar evento te lo coloca automáticamente, por eso sino hace falta llamarlo ¿se puede eliminar? ¿Es bueno llamar a los eventos Paint de otros controles desde aquí?.
En el juego que realice no voy a llamar a ningún otro evento Paint y tan solo voy a tener gráficos en el Formulario principal, solo por confirmar.

Código (vb.net) [Seleccionar]

Protected Overrides Sub OnPaint(e As PaintEventArgs)
   MyBase.OnPaint(e)                                 ' Esto se prodría omitir ??
   Dim de As Graphics = e.Graphics
   MOVER()
   DIBUJAR(de)
   Thread.Sleep(100)                                  ' Retardo
End Sub

Private Sub MOVER()
   Bola1.Pos.X = Bola1.Pos.X + 5
   Bola2.Pos.X = Bola2.Pos.X + 10

   If Bola1.Pos.X >= 800 Then Bola1.Pos.X = 0
   If Bola2.Pos.X >= 800 Then Bola2.Pos.X = 0
   Invalidate()                                  ' Vuelva a dibujar el control
End Sub

Private Sub DIBUJAR(ByVal d As Graphics)
   d.DrawImage(Fondo, 0, 0)                ' Dibujamos el fondo de pantalla
   d.DrawImage(Bola1.Imagen, Bola1.Pos)    ' Dibujamos Sprite1
   d.DrawImage(Bola2.Imagen, Bola2.Pos)    ' Dibujamos Sprite2
End Sub
 
End Class


El programa va bien y se ve fluido (naturalmente el Formulario utilizo Doble buffer puesto que sino se ve el reflejo), pero al iniciar se ejecuta 2 veces OnPaint y aunque puedes variar el tema de coordenadas, parece que de inicio no informa bien si pongo unos label

Código (vb.net) [Seleccionar]

Label1.Text = "Obj1 PosX = " & Bola1.Pos.X
Label2.Text = "Obj2 PosX = " & Bola2.Pos.X


Estoy con pruebas y con un botón para parar. Veo que esta forma no hay que poner nada en diseño, a no ser por código porque hace cosas extrañas con las coordenadas. En principio estoy probando y mi segunda pregunta es ¿Es la forma correcta para saber el tema de coordenadas de los Sprites que coloque en Formulario? ¿Se puede mejorar algo para saber exactamente el tema de coordeandas x, y de los Sprites?

Colocare una nave y mas objetos y quería saber si me va a dar problemas con las coordenadas, la nave la muevo yo y los objetos como en el ejemplo se mueven automáticamente.
Gracias y saludos

#27
Gracias Elektro, como siempre das muchos temas para mirar. Yo soy lento pero constante, además como dije programo por hobby (aunque alguna base de datos con vb he realizado para la empresa). Tengo algunos temarios que todavía tengo que revisar y actualizarme de vb6 a vb.net y el tema de ficheros es uno. Gracias por los consejos y miraré varias formas de poder crear ficheros.

De momento el procedimiento quedó de la siguiente manera y cumple su función, que no sea legible el archivo y si lo tocas porque no coincide las búsquedas que he realizado se vuelve a crear fichero con los parámetros por defecto. Paso código, por otro lado copié unas funciones de CIFRADO y DESCIFRADO que saqué de aqui también.

Código (vb.net) [Seleccionar]

Imports System.IO

Public ARCHIVOC As String = Application.StartupPath & "\DisGlobosCla.dat"
Public TopClasi(4) As String
Public TextoC As String  ' = Aqui asignamos el Texto Cifrado
Public TextoSC As String  ' = Asignamos el texto sin cifrar (para valores por defecto)

Public Sub LeerArchivo_PasoArray()
       Try
           '1º Comprueba si el archivo no existe para crearlo
           If Not My.Computer.FileSystem.FileExists(ARCHIVOC) Then
               My.Computer.FileSystem.WriteAllText(ARCHIVOC, TextoC, False)
           End If
           '2º Desciframos el archivo, asignamos y volvemos a transladar al archivo
           TextoSC = My.Computer.FileSystem.ReadAllText(ARCHIVOC)  'Lee todo archivo
           TextoSC = DESCIFRA(TextoSC)
           My.Computer.FileSystem.WriteAllText(ARCHIVOC, TextoSC, False)
           '3º Lee archivo de texto (sin cifrar) y lo pasa a los Arrays
           Using SR As New StreamReader(File.OpenRead(ARCHIVOC))
               For A As Integer = 0 To 4
                   TopClasi(A) = SR.ReadLine()                     'Leer una sola línea                    
               Next A
           End Using
           '4º Vuelve a cifrar archivo y lo guarda
           TextoC = CIFRA(TextoSC)
           My.Computer.FileSystem.WriteAllText(ARCHIVOC, TextoC, False)
       Catch ex As Exception
           MsgBox(ex.Message, 16, "Error Archivo Clasificación")
       End Try
End Sub


Puede que me repita un poco. El programa descifra el archivo, lo pasa a los array mediante filas para saber el orden de clasificación (mediante otro procedimiento ordeno y escribo), lo vuelvo a cifrar y guardar en el archivo.

Saludetes
#28
Muchas gracias a los dos, funciona la perfección. Voy a implementarlo al programa principal. Este es todo el código del ejemplo para Net.Framework 3.5

Código (vb.net) [Seleccionar]

Imports System.IO

Public ARCHIVOC As String = Application.StartupPath & "\DisGlobosCla.dat"
Public TopClasi(4) As String

Dim A As Integer
Using SR As New StreamReader(File.OpenRead(ARCHIVOC))
    For A = 0 To 4
         TopClasi(A) = SR.ReadLine()
    Next A
End Using


A ver si cuando acabe me pongo a mirar el tema de ficheros, puesto que en este juego he creado un archivo de clasificación con un archivo plano (aunque he puesto extensión dat) y lo he cifrado para que no se entienda y no hagamos trampas cambiando valores, pero me imagino que lo suyo es poner un archivo binario como hacía con vb6.

Saludos
#29
Buenas, ya estoy acabando mi proyecto y me encuentro con este problema

"ReadLines no es miembro de System.IO.File"

Se que son las Net.Framework porque el proyecto lo tengo con 3.5, pero no quiero cambiarlo a 4.0 o 4.5 (ya los próximos utilizaré esas versiones), pero en este proyecto deseo poder utilizar el programa en equipos con Windows XP.

Hay alguna otra forma de leer filas en los archivos, si tengo que utilizar otra importación o cualquier otro comando que lea filas y lo guarde en un array de texto. Tal y como aparece en el siguiente código, que repito funciona a partir de la versión Net Framework 4.0, pero yo lo requiero para la Net Framework 3.5 (en Windows Form).

Gracias y saludos


Código (vb.net) [Seleccionar]

Imports System.IO

Dim Valor(4) As String
For A = 0 To 4
    Valor(A) = File.ReadLines(ARCHIVOC)(A)           'Leer una sola línea
Next A
#30
Muchas gracias de nuevo Elektro, un post tuyo da muchos temas que mirar sobre todo cuando llevas 1 año con el cambio de vb6 a vb2013, aunque eso está bien siempre hay que ver varias formas para aplicar un mismo resultado.

Estuve probando Windows Media Player en un equipo con XP y lamento decirte que el código que me proporcionastes no me funciona y en cambio de esta forma

Código (vbnet) [Seleccionar]

AxWindowsMediaPlayer1.URL = "C:\Temp\Sonido1.wav"


no hay problemas y se escucha la canción de fondo bien. Me dirás que soy un nostálgico y la verdad que viendo también que la nave que muevo (al usar la tecnica del doble buffer) se aprecia con el WXP y en W7 va fluido, aunque aqui posiblemente puede ser el equipo (es un P4 a 3 GHz con 3 Gb RAM), en otros que tengo Core2 (4 Gb RAM) e I5 (6 Gb RAM) va bien aunque tienen W7 de 32 y 64 bits. Puede que ya me plantee en dejar de utilizar Net Framework 3.5 y me pase al 4.5 por lo menos en los programas donde utilice graficos o sonido. Lo que pasa que mucha gente todavía tiene WXP, pero habrá que actualizarse.

El componente WMP aunque sea pesado las librerías principales las lleva Windows y aunque deja esas 2 librerias que no ocupan casi nada y como te he comentado no da problemas, para una canción de fondo y un sonido wav aparte va bien.

Auque ya empiezo a ver las limitaciones cuando ya empiezas a mover varios objetos, colocar imagenes de fondo que se mueven, utilizar varios sonidos y también me planteo mirar algo e ir al hardware. La verdad que estoy muy perdido y me gustaria seguir con vb.net. Aunque ahora es muy versatil la programación con Visual Studio y se ve con más facilidad para pasar de un lenguaje a otro. Mire que Visual c# podía utilizar las XNA Game Studio, pero estas han dejado de dar soporte Microsoft para las nuevas versiones de Visual Studio. El problema de DirectX es que la gente se tiene que bajar las librerias con Windows 7 (no se si van implentadas para versiones superiores, como NET Framework) y ocupan lo suyo y cuando publicas un programa he visto que si ocupa poco (se lo bajan mucho aunque sea peor) pero si ocupa y encima se tiene que bajar las librerías pues ya desisten.

Muchas gracias de nuevo, lo más probable que cuando acabe este proyecto para el próximo parecido utilice ya NET Framework 4.5 y descarte Windows XP.

Un saludo