Hola esk estoy programando en SDL "Visual C++ 2010 express" y no me compila bien.
El codigo:
(Recuerden que en vc++ #include "SDL.h" se incluye asi la libreria.)
#include "SDL.h" int main(int argc, char *argv[]) { SDL_Surface *screen; // Definimos una superficie //Surfaces de las imegenes------------------ SDL_Surface *screen, *imagen1; /* Declararos como punteros */ //Se acaba surface de las imagenes---------- if(SDL_Init(SDL_INIT_VIDEO) < 0) //iniciamos el modo video { fprintf(stderr, "Error al inicializar SDL: %s\n", SDL_GetError()); exit(1); } atexit(SDL_Quit); // Al salir, cierra SDL screen = SDL_SetVideoMode(640, 480, 16, SDL_SWSURFACE); if(screen == NULL); { //En caso de error fprintf(stderr, "Error al crear la superficie: %s\n", SDL_GetError()); exit(1); } //Cargamos la imagen------------------ imagen1=SDL_LoadBMP("Imagen.bmp"); SDL_Rect rectangulo; rectangulo.x=413; rectangulo.y=242; rectangulo.w=imagen->w; /* El operador flecha (->) solo funciona con punteros */ rectangulo.h=imagen->h; SDL_BlitSurface(Imagen1,NULL,Screen,&rectangulo); SDL_UpdateRects(screen,1,&rectangulo); SDL_Quit(); return 0; }
El error:
1>------ Operación Generar iniciada: proyecto: SDLWin, configuración: Debug Win32 ------
1> SDLWin.cpp
1>c:\users\samsung\documents\visual studio 2010\projects\sdlwin\sdlwin\sdlwin.cpp(32): error C2227: el operando izquierdo de '->w' debe señalar al tipo class/struct/union/generic
1> el tipo es 'int'
1>c:\users\samsung\documents\visual studio 2010\projects\sdlwin\sdlwin\sdlwin.cpp(33): error C2227: el operando izquierdo de '->h' debe señalar al tipo class/struct/union/generic
1> el tipo es 'int'
========== Generar: 0 correctos, 1 incorrectos, 0 actualizados, 0 omitidos ==========
Veamos
Lo primero, estás declarando dos veces SDL_Surface *screen . Imagino que es ese el error (más bien advertencia).
if(SCREEN == NULL); <-- Ese ; sobra, supongo que es la instrucción vacía que encuentra el compilador.
Por otro lado, el conflicto con la palabra imagen se debe a que tú creaste imagen1, no imagen (o al menos yo no veo declarada imagen en ningún lado), además de que para usar el operando -> imagen tiene que ser un tipo de variable que evidentemente no es, puesto que no la has declarado.
Y otra vez lo mismo con Imagen1 y Screen. El lenguaje C y C++ distinguen entre mayúsculas y minúsculas, así que no las uses indiscriminadamente.
Ten cuidado con lo que haces porque por lo visto todos los errores son de sintaxis, y el código no es extenso...
Salu2
Para recibir ayuda por parte de otros usuarios más rápidamente, recomendamos que pongas títulos descriptivos y no utilices abreviaturas (estilo MSN) en tus post de los foros. Recuerda que accediendo al Manual del perfecto forero y las Normas de la Comunidad aprenderás trucos para resolver tus dudas antes.
Gracias
Gracias pero aun me da error. He actualizado el tema con el nuevo codigo y el nuevo error.
Arreglado.
Tenías bastantes errores de sintaxis. Creo que exterminator los ha dicho todos. Este es el código, y funciona 100%. Si te da un error de ejecución, asegúrate de que el archivo Imagen.bmp está en el sitio correcto. Además, te hará falta poner un system("pause"); o algo, ya que el programa no para y solo se ve una ventana durante una fracción de segundo:
PD: La próxima vez di los errores nuevos. Si no, no te podemos ayudar.
PD2: Con esto te demuestro que he instalado el SDL en VC++ 2010, tal y como te ponía en la otra hebra.
Dennis Ritchie. Padre de C y cocreador de UNIX.
R.I.P.
Gracias pero
Gracias pero me sigue dando error esta es la carpeta del proyecto:
Y esta es el error que me da el SDLwin.exe tras averlo compilado/ejecutado:
No se encuentra el punto de entrada del procedimiento SDL_strlcat en la biblioteca de vinculos dinamicos SDL.dll
Esta claro que tiene que ver con SDL.dll pero lo tengo puesto como ven en la primera imagen.
Codigo de error:
'SDLWin.exe': se cargó 'C:\Users\samsung\Documents\Visual Studio 2010\Projects\SDLWin\Debug\SDLWin.exe', Símbolos cargados.
'SDLWin.exe': se cargó 'C:\Windows\SysWOW64\ntdll.dll', Cannot find or open the PDB file
'SDLWin.exe': se cargó 'C:\Windows\SysWOW64\kernel32.dll', Cannot find or open the PDB file
'SDLWin.exe': se cargó 'C:\Windows\SysWOW64\KernelBase.dll', Cannot find or open the PDB file
'SDLWin.exe': se cargó 'C:\Users\samsung\Documents\Visual Studio 2010\Projects\SDLWin\Debug\SDL.dll', El binario no se generó con la información de depuración.
'SDLWin.exe': se cargó 'C:\Windows\SysWOW64\winmm.dll', Cannot find or open the PDB file
'SDLWin.exe': se cargó 'C:\Windows\SysWOW64\msvcrt.dll', Cannot find or open the PDB file
'SDLWin.exe': se cargó 'C:\Windows\SysWOW64\user32.dll', Cannot find or open the PDB file
'SDLWin.exe': se cargó 'C:\Windows\SysWOW64\gdi32.dll', Cannot find or open the PDB file
'SDLWin.exe': se cargó 'C:\Windows\SysWOW64\lpk.dll', Cannot find or open the PDB file
'SDLWin.exe': se cargó 'C:\Windows\SysWOW64\usp10.dll', Cannot find or open the PDB file
'SDLWin.exe': se cargó 'C:\Windows\SysWOW64\advapi32.dll', Cannot find or open the PDB file
'SDLWin.exe': se cargó 'C:\Windows\SysWOW64\sechost.dll', Cannot find or open the PDB file
'SDLWin.exe': se cargó 'C:\Windows\SysWOW64\rpcrt4.dll', Cannot find or open the PDB file
'SDLWin.exe': se cargó 'C:\Windows\SysWOW64\sspicli.dll', Cannot find or open the PDB file
'SDLWin.exe': se cargó 'C:\Windows\SysWOW64\cryptbase.dll', Cannot find or open the PDB file
El programa '[2712] SDLWin.exe: Nativo' terminó con código -1073741511 (0xc0000139).
Codigo:
#include <SDL.h>
#include <iostream>
using namespace std;
int main(int argc, char *argv[]) {
//Surfaces de las imegenes------------------
SDL_Surface *screen, *imagen1;
//Se acaba surface de las imagenes----------
if(SDL_Init(SDL_INIT_VIDEO) < 0){ //iniciamos el modo video
fprintf(stderr, "Error al inicializar SDL: %s\n", SDL_GetError());
exit(1);
}
atexit(SDL_Quit); // Al salir, cierra SDL
screen = SDL_SetVideoMode(640, 480, 16, SDL_SWSURFACE);
if(screen == NULL){
//En caso de error
fprintf(stderr, "Error al crear la superficie: %s\n", SDL_GetError());
exit(1);
}
//Cargamos la imagen------------------
imagen1=SDL_LoadBMP("Imagen.bmp");
SDL_Rect rectangulo;
rectangulo.x=413;
rectangulo.y=242;
rectangulo.w=imagen1->w;
rectangulo.h=imagen1->h;
SDL_BlitSurface(imagen1,NULL,screen,&rectangulo);
SDL_UpdateRects(screen,1,&rectangulo);
SDL_Quit();
return 0;
}
Editado: El límite del ancho de las imágenes es de 500 pixeles, sobrepasar este límite puede descolocar la web e incumple las Normas de la Comunidad, antes de volver a postear por favor revíselas.| AORV
Mi blog: adriel0000.wordpress.com
un saludo.
Ok, es es un problema de configuración de VC++.
No tiene nada que ver con el código. El error que comentas es bastante común en VC++ al usar SDL. Presupongo que ya has copiado los .lib y los .h:
A ver, dale con el botón derecho en el proyecto-> propiedades y cambias lo siguiente:
Haz eso y mira a ver si funciona.
Saludos!
Dennis Ritchie. Padre de C y cocreador de UNIX.
R.I.P.
Nada
Nada todo eso lo tengo pero me sigue sin funcionar... :(
Vale
Según he leido, es un problema de incompatibilidad entre versiones, es decir que los archivos .lib tienen otra versión a la DLL. Es posible que tengas en System32 otra versión antigua del dll que te la haya instalado algún juego. Aunque sé que es un coñazo, vuelve a hacerlo todo de nuevo:
Prueba a ver ahora. Debería de funcionar.
Dennis Ritchie. Padre de C y cocreador de UNIX.
R.I.P.
Hice lo que me dijiste
Hice lo que me dijiste y como estoy en windows 7 por si acaso meti la dll en system y nada no me va en ningun lado e vuelto a hacer todo y nah por cierto los archivos de inclusion los tengo en otra carpeta pero los meti en el proyecto... Ayuda....
Edit: Me sigue saliendo el mismo problema
Mi blog: adriel0000.wordpress.com
un saludo.
Mmm
Como nunca me ha salido ese error, he estado googleando y hay muchos casos como el tuyo, y todos se arreglan al instalar la última versión. Tienes que tener algún SDL.dll antiguo peridido por alguna parte. Haz una búsqueda rápida para asegurarte. No se me ocurre nada más por ahora.
Por supuesto, después tienes que volver a generar la solución, para que tome las nuevas bibliotecas.
Por cierto, no hace falta que pongas el dll en system ni los arhivos de cabecera en el proyecto (yo también estoy en win7 de 64 bits y el dll lo tengo en system32 y los .h en la carpeta include).
Dennis Ritchie. Padre de C y cocreador de UNIX.
R.I.P.
Gracias
Gracias, Solucione eso pero aora viene el siguiente error xD
Cuando compilo me sale una ventana con un mensaje asi:
Excepción no controlada en 0x012315df en SDLWin.exe: 0xC0000005: Infracción de acceso al leer la ubicación 0x00000008.
y me da dos opciones: interrumpir o siguiente. Siguiente no me va asi que le doy a interrumpir. y me marca con una flecha amarilla este codigo:
rectangulo.w=imagen1->w;
Una captura por si acaso:
Mi blog: adriel0000.wordpress.com
un saludo.
Bien
Bueno, si ya has conseguido configurar el VisualC++, el resto es coser y cantar.
Respuesta sencilla: la imagen no está donde debería.
Respuesta larga: Si te marca una excepción en esa línea es porque el puntero imagen1 está a null, lo que quiere decir que SDL_LoadBMP no ha conseguido leer la imagen, lo que a su vez quiere decir, casi con total seguridad, que la imagen Imagen.bmp no está en el sitio correcto. La tienes en Debug, verdad? Cópiala a la carpeta anterior, a la del proyecto.
Otra cosa, te conviene, para estos casos, que compruebes que la imagen se ha leido correctamente. Una forma sencilla de hacer esto es:
Para utilizar printf tienes que hacer un #include <stdio.h>.
Saludos!
Dennis Ritchie. Padre de C y cocreador de UNIX.
R.I.P.
Acualize
Actualize el codigo con ese trozo que me as dado despues copie la imagen en la raiz del proyecto y en donde esta el SDLwin.cpp y..... !!Nada¡¡ Me da error :(...
Codigo de error:
'SDLWin.exe': se cargó 'C:\Users\samsung\Documents\Visual Studio 2010\Projects\SDLWin\Debug\SDLWin.exe', Símbolos cargados.
'SDLWin.exe': se cargó 'C:\Windows\SysWOW64\ntdll.dll', Cannot find or open the PDB file
'SDLWin.exe': se cargó 'C:\Windows\SysWOW64\kernel32.dll', Cannot find or open the PDB file
'SDLWin.exe': se cargó 'C:\Windows\SysWOW64\KernelBase.dll', Cannot find or open the PDB file
'SDLWin.exe': se cargó 'C:\Windows\system\SDL.dll', El binario no se generó con la información de depuración.
'SDLWin.exe': se cargó 'C:\Windows\SysWOW64\advapi32.dll', Cannot find or open the PDB file
'SDLWin.exe': se cargó 'C:\Windows\SysWOW64\msvcrt.dll', Cannot find or open the PDB file
'SDLWin.exe': se cargó 'C:\Windows\SysWOW64\sechost.dll', Cannot find or open the PDB file
'SDLWin.exe': se cargó 'C:\Windows\SysWOW64\rpcrt4.dll', Cannot find or open the PDB file
'SDLWin.exe': se cargó 'C:\Windows\SysWOW64\sspicli.dll', Cannot find or open the PDB file
'SDLWin.exe': se cargó 'C:\Windows\SysWOW64\cryptbase.dll', Cannot find or open the PDB file
'SDLWin.exe': se cargó 'C:\Windows\SysWOW64\gdi32.dll', Cannot find or open the PDB file
'SDLWin.exe': se cargó 'C:\Windows\SysWOW64\user32.dll', Cannot find or open the PDB file
'SDLWin.exe': se cargó 'C:\Windows\SysWOW64\lpk.dll', Cannot find or open the PDB file
'SDLWin.exe': se cargó 'C:\Windows\SysWOW64\usp10.dll', Cannot find or open the PDB file
'SDLWin.exe': se cargó 'C:\Windows\SysWOW64\winmm.dll', Cannot find or open the PDB file
'SDLWin.exe': se cargó 'C:\Windows\SysWOW64\msvcr100.dll', Cannot find or open the PDB file
'SDLWin.exe': se cargó 'C:\Windows\SysWOW64\imm32.dll', Cannot find or open the PDB file
'SDLWin.exe': se cargó 'C:\Windows\SysWOW64\msctf.dll', Cannot find or open the PDB file
'SDLWin.exe': se cargó 'C:\Windows\SysWOW64\ddraw.dll', Cannot find or open the PDB file
'SDLWin.exe': se cargó 'C:\Windows\SysWOW64\dciman32.dll', Cannot find or open the PDB file
'SDLWin.exe': se cargó 'C:\Windows\SysWOW64\setupapi.dll', Cannot find or open the PDB file
'SDLWin.exe': se cargó 'C:\Windows\SysWOW64\cfgmgr32.dll', Cannot find or open the PDB file
'SDLWin.exe': se cargó 'C:\Windows\SysWOW64\oleaut32.dll', Cannot find or open the PDB file
'SDLWin.exe': se cargó 'C:\Windows\SysWOW64\ole32.dll', Cannot find or open the PDB file
'SDLWin.exe': se cargó 'C:\Windows\SysWOW64\devobj.dll', Cannot find or open the PDB file
'SDLWin.exe': se cargó 'C:\Windows\SysWOW64\dwmapi.dll', Cannot find or open the PDB file
'SDLWin.exe': se descargó 'C:\Windows\SysWOW64\ddraw.dll'
'SDLWin.exe': se descargó 'C:\Windows\SysWOW64\dwmapi.dll'
'SDLWin.exe': se descargó 'C:\Windows\SysWOW64\setupapi.dll'
'SDLWin.exe': se descargó 'C:\Windows\SysWOW64\devobj.dll'
'SDLWin.exe': se descargó 'C:\Windows\SysWOW64\oleaut32.dll'
'SDLWin.exe': se descargó 'C:\Windows\SysWOW64\ole32.dll'
'SDLWin.exe': se descargó 'C:\Windows\SysWOW64\cfgmgr32.dll'
'SDLWin.exe': se descargó 'C:\Windows\SysWOW64\dciman32.dll'
'SDLWin.exe': se cargó 'C:\Windows\SysWOW64\uxtheme.dll', Cannot find or open the PDB file
'SDLWin.exe': se cargó 'C:\Program Files (x86)\SweetIM\Messenger\mgAdaptersProxy.dll', El binario no se generó con la información de depuración.
'SDLWin.exe': se cargó 'C:\Windows\SysWOW64\shlwapi.dll', Cannot find or open the PDB file
'SDLWin.exe': se cargó 'C:\Program Files (x86)\SweetIM\Messenger\msvcr71.dll', Cannot find or open the PDB file
'SDLWin.exe': se cargó 'C:\Windows\SysWOW64\dwmapi.dll', Cannot find or open the PDB file
'SDLWin.exe': se cargó 'C:\Windows\SysWOW64\KBDUS.DLL', Cannot find or open the PDB file
'SDLWin.exe': se descargó 'C:\Windows\SysWOW64\KBDUS.DLL'
'SDLWin.exe': se cargó 'C:\Windows\SysWOW64\KBDSP.DLL', Cannot find or open the PDB file
'SDLWin.exe': se descargó 'C:\Windows\SysWOW64\KBDSP.DLL'
'SDLWin.exe': se cargó 'C:\Windows\SysWOW64\ole32.dll', Cannot find or open the PDB file
El programa '[3172] SDLWin.exe: Nativo' terminó con código -1 (0xffffffff).
Mi blog: adriel0000.wordpress.com
un saludo.
Vamos por buen camino.
Realmente no hay ningún error (lo de cannot find PDB no son errores, pasa de ellos) Como ves en la última línea:
El programa '[3172] SDLWin.exe: Nativo' terminó con código -1 (0xffffffff).
Lo que quiere decir que la imagen no se ha podido leer (es decir, que llega al return(-1) que le hemos puesto). Lo que no se es porqué no sale la frasecita de ERROR: La imagen Imagen.bmp no se ha podido leer , pero bueno.
Para empezar, supongo que has copiado el código tal cual. Si te has saltado por ejemplo el símbolo ! produce lo contrario a lo que queremos. También puedes poner
Si te resulta más sencillo. Asegúrate de que el nombre de la imagen sea exactamente el que has puesto en el código, INCLUIDA LA EXTENSION! e ir probando a copiarlo en varias carpetas (en principio debería estar en la carpeta del proyecto, donde están los archivos .sdf, .sln, .suo, .vcxproj etc, pero por probar...).
Si sigues sin conseguirlo, copia la imagen al lado del ejecutable (en Debug) y ejecútalo DESDE LA CARPETA, no desde el visual. Eso debería funcionar.
Por cierto, le pusiste el system("pause"); ? Tienes que ponerlo justo antes de SDL_Quit();
Ya me dirás que resultados te ha dado cada cosa.
Dennis Ritchie. Padre de C y cocreador de UNIX.
R.I.P.
Hice eso
Hice eso que me dijiste y me sale una ventana que se llama inspeccion , solo sale unos segundos. y este es el resultado:
Codigo:
y si abro el .exe con la imagen en la misma carpeta se me abre el .exe 2 segundos y no se muestra nada. (Tengo puesto system("pause"); )
Mi blog: adriel0000.wordpress.com
un saludo.
Mmm
Lo único que se me ocurre es que la imagen esté mal, que sea un PNG con extensión BMP, que esté dañada, o algo por el estilo. Intenta probar con otro BMP, con uno creado por tí mismo con el paint por ejemplo.
Si aún sigue sin funcionar, también puedes intentar abrir el CMD, irte a la carpeta Debug donde tienes el exe y ejecutarlo desde el cmd. Te debería poner ERROR: La imagen Imagen.bmp no se ha podido leer\nSaliendo si es que no la ha podido leer. Si no te sale el mensaje, es que el problema no está en SDL_LoadBMP. (otra forma de verificarlo es cambiando el return (-1) por return (4) por ejemplo. Si lo haces debería cambiar el mensaje terminó con código -1 por terminó con código 4).
Espero que te funcione pronto porque se me empiezan a acabar las ideas. Es más facil deupurar algo cuando lo tienes delante :)
Dennis Ritchie. Padre de C y cocreador de UNIX.
R.I.P.
Vale
Vale hice una nueva imagen bmp y la meti en la carpeta del proyecto. Me lo creaba pero no se veia nada asi que use la imagen en debug y abir el exe y bravo funciono. Se me ve la imagen y despues me pone en una ventana estilo consola. Presione una tecla para continuar
gracias. te devo mil. Aunque me pone SDL_app (No Responde) xD
Mi blog: adriel0000.wordpress.com
un saludo.
Me alegro.
Osea que al final la imagen estaba mal. Con este tipo de errores te puedes volver loco buscando la causa xD.
Lo de que no te responde, lo veo normal, no te asustes. Es como que se queda colgado (no hace nada) hasta que pulsas una tecla.
Ahora tienes un LAAARGO camino por delante para aprender SDL (sprites, animaciones, sonido, música, texto, etc, etc) y al final poder hacer un jueguecillo. A veces será frustrante y tendrás que armarte de paciencia, pero no desistas, al final es gratificante.
Si tienes más dudas o problemas (que te aseguro que los tendrás), ya sabes donde estamos.
Saludos!
Dennis Ritchie. Padre de C y cocreador de UNIX.
R.I.P.
Muchas gracias
Muchas gracias, y sabes algun tutorial en español para iniciarme en los eventos del teclado??? osea solo quiero por ejemplo que al pulsar A se crease la imagen pero no se que tutorial cojer.
Gracias.
Mi blog: adriel0000.wordpress.com
un saludo.
Tutorial
Si quieres mi humilde opinion, para mí, el mejor de los mejores es:
Programación de videojuegos con SDL de alberto garcía serrano
http://www.agserrano.com/libros/sdl/%5Bebook%5DProgramacion%20de%20videojuegos%20con%20SDL.pdf
El primer capítulo es un poco de paja y de cultura general, aunque está interesante si tienes tiempo. El resto son muy prácticos y muy completos. A mí este documento me ayudó mucho :) (incluso de vez en cuando lo miro para consultar algo).
Aunque esa es mi opinión, hay muchos otros tutoriales, que no son ni mejores ni peores.
Saludos!
Dennis Ritchie. Padre de C y cocreador de UNIX.
R.I.P.
Gracias pero
Gracias pero ese ya me lo conocia... Yo decia algo asi como los tutoriales de c de scenebeta que te explique el codigo y que vallas mas o menos de cero.
P.D Deverias hacer tutoriales. Sabes mucho.
Mi blog: adriel0000.wordpress.com
un saludo.
Me temo que no.
Lo normal es aprender a programar y luego aprender a usar alguna biblioteca como SDL, pero todo a la vez no se si es bueno. Yo te recomiendo que aprendas C antes. No te llevará tanto tiempo, aunque depende de cada caso. Respecto a tutoriales de C, no conozco muchos, lo siento, aunque sé que hay millones (los de Scenebeta están bien por ejemplo).
Dennis Ritchie. Padre de C y cocreador de UNIX.
R.I.P.
Espera
Espera que no me entendiste. Yo se C algo de C++ lo unico es un tutorial de SDL que te lo explique todo muy paso a paso y no te meta a hacer un jueo cuando quieres hacer que al pulsar un boton te ponga una imagen.
Mi blog: adriel0000.wordpress.com
un saludo.
Ah.
Entonces, si sabes C, te vuelvo a aconsejar el doc que te he puesto antes. No es como piensas, va paso a paso. De hecho el primer capítulo trata de pintar una imágen en la ventana, básicamente lo que has puesto tú aquí, y después te explica cada línea de código. En los otros capítulos te explica como poner transparencia a una imagen, como gestionar el teclado, etc todo muy bien explicado. Además te explica varias cosas que en otros tutoriales no explican.
Si por lo que sea no te gusta, también tienes este: http://lazyfoo.net/SDL_tutorials/index.php. Aunque a mi gusto no es tan bueno.
Dennis Ritchie. Padre de C y cocreador de UNIX.
R.I.P.
...
Te Amo... GRACIAS MEN!!!
Fue una Grandiosa ayuda.. :D
Vale
Vale muchas gracias. :)
Yo sigo
viendo exactamente el mismo código.