PDA

Ver la versión completa : [Ayuda] Mi primeros pasos con C y SDL



Gabs86
10/09/2008, 15:58
Hola, estoy haciendo mis primeros pinitos con C y SDL, y bueno, se supone que ya debería saber manejar C con soltura (lo mío es java) pero no es el caso así que os preguntaré un par de dudas. Ahí van!:

-Bucle principal de un pong


while(done==0){
// (Re)draw the screen

SDL_FillRect(screen, &jugador.area, color);
SDL_FillRect(screen, &enemigo.area, color);
SDL_Flip(screen);

if(SDL_PollEvent(&event)){
// Handle events (keyboard input, mainly)
if(event.type==SDL_KEYDOWN){
if(keys[SDLK_ESCAPE]==1){
done=1;
}
if(keys[SDLK_LEFT]==1){
jugador.area.x-=15;
}else if(keys[SDLK_RIGHT]==1){
jugador.area.x+=15;
}
}

// Give the CPU a break
}

SDL_FillRect(screen, &dest,SDL_MapRGB(screen->format,0,0,0));
}

Mi duda es la última linea, que está en negrita, se supone que ahí debería poner SDL_FreeSurface(screen); pero si hago eso ... no se porqué no borra la pantalla y se quedan los residuos de la imagen anterior.


La otra duda es sobre punteros, entiendo perfectamente el concepto pero esta es la duda:

cuando hago "surface *screen;" screen es un puntero de tipo surface, así que cuando quiero hacer referencia a la superficie basta con hacerlo mediante "screen", no? es decir no tengo que poner "*screen" ni "&screen", solo tendría que hacer "&screen" si quisiese cambiar la referencia, es decir, que "screen" apuntase a otra surface diferente. no?

Un saludo y gracias!

xzakox
10/09/2008, 16:10
cuando hago "surface *screen;" screen es un puntero de tipo surface, así que cuando quiero hacer referencia a la superficie basta con hacerlo mediante "screen", no? es decir no tengo que poner "*screen" ni "&screen", solo tendría que hacer "&screen" si quisiese cambiar la referencia, es decir, que "screen" apuntase a otra surface diferente. no?

Un saludo y gracias!

Asi es, ya que las funciones de SDL ya esperan que les pases un puntero como parámetro, asi que no tienes que poner nada raro ;-)

Gabs86
10/09/2008, 16:12
Asi es, ya que las funciones de SDL ya esperan que les pases un puntero como parámetro, asi que no tienes que poner nada raro ;-)

thanks!!

Aiken
10/09/2008, 16:35
yo pondria el SDL_FillRect(screen, &dest,SDL_MapRGB(screen->format,0,0,0)); al principio justo antes de los otros dos fillrect. sabes lo que hace no? simplemente colorea de negro la pantalla entera. luego tiene sentido pintarla de negro justo antes de dibujar encima los jugadores no? ;)

y en cuanto al Free, el free no limpia la pantalla libera la memoria para que otro la pueda usar pero no la limpia queda con el grafico anterior hasta que otro la coge e inicializa.


yo pondria el FREE, pero ya fuera de todo bucle, para liberar la memoria antes de acabar el programa

:brindis:

Aiken

Gabs86
10/09/2008, 16:38
ahá, vale, muchas gracias Aiken, creía que el free además de liberar la memoria también la borraba, entonces ya está todo claro :D.

turco
10/09/2008, 16:57
Como dice Aiken, con SDL_FreeSurface(screen); no sólo no la limpia sino que además liberarás la variable screen y no podrás volver a operar sobre la SDL_Surface apuntada por screen, ya que ahora screen apuntaría a NULL

Gabs86
10/09/2008, 16:58
otra duda!, a ver esta vez con los structs!!

Un ejemplo, tengo el siguiente struct:

struct unaCosa{
int x;
int y;
}punto;

en la estructura que es punto y que es unaCosa?, en el caso de que sean lo mismo he visto que puedes hacer referencias a las estructuras, es decir, puedo tener "punto *mipunto;" y de esta manera tengo un puntero a una estructura punto, pero si despues de tener mipunto, hago "punto *otropunto", ¿mipunto y otropunto apuntan al mismo sitio?, es decir si hago mipunto.x=5; ¿otropunto.x==5? si no quiero que esto pase que debo de hacer?

Muchas gracias de nuevo!

Jurk
10/09/2008, 17:06
si no me equivoco has generado con eso una estructura (un tipo de datos) llamado unaCosa(con dos enteros dentro), y has definido punto como una variable de tipo unaCosa
Si no es asi, que me flagelen los dioses dela computacion del foro...

Gabs86
10/09/2008, 17:10
entonces :

struct unaCosa{
int x;
int y;
}punto;

sería igual que :

struct unaCosa{
int x;
int y;
}

unaCosa punto;

Buah! esque desde primero hemos dado Java, y ahora ver C ... me cuesta mucho más que C++

Jurk
10/09/2008, 17:14
supongo
ya te h dicho que me puedo equivocar...

pero en c las asignaciones de variables van de esta manera, oseaque me parece totalmente logico:

(tipodevariable) (variable);

cesta claro, por lo tanto, que justo despues de l definiion de la estructura puedes definir la variable

Gabs86
10/09/2008, 17:16
Muchas gracias Jurk!! pronto vendré con más dudas :D:D

Aiken
10/09/2008, 17:24
pues de lo del nombre de la estructura no estoy seguro, creo que simplemente algunos compiladores te dejan ponerle las dos cosas y otros una.

lo que si es seguro es que mipunto y miotropunto no tienen nada que ver, sea como sea.

Aiken

hardyx
10/09/2008, 17:28
Sobre los punteros:
Para acceder al contenido de un puntero sería: *puntero.
Para las funciones que aceptan punteros de parámetro: puntero.

Sobre las estructuras, es como has puesto, pero es más clara la segunda sintaxis.
Además, en C para declarar una variable de estructura tienes que poner: struct (tipo) (variable). Pero si usas C++ puedes poner sólo: (tipo) (variable).

Gabs86
10/09/2008, 17:33
pues esque estoy intentando hacer mi primer juego en C, tengo experiencia con Java, pero he decidido hacer algo sencillo en C, pensando que me costaría menos que con C++, además siendo una cosa sencilla como puede ser un pong he pensado que sería mejor C.... pero vamos acostumbrado a usar objetos... me estoy haciendo un lio con C . :loco:

hardyx
13/09/2008, 00:35
Con C++ puedes usar clases (Jugador, Pelota, Marcador, etc) si estás más acostumbrado a Java, lo único que es obligatorio que sea global es la función main(). Aunque seguirás llamado a funciones de C como atoi(str) en vez de str.toInt().

Aiken
13/09/2008, 01:38
Con C++ puedes usar clases (Jugador, Pelota, Marcador, etc) si estás más acostumbrado a Java, lo único que es obligatorio que sea global es la función main(). Aunque seguirás llamado a funciones de C como atoi(str) en vez de str.toInt().

tu programas c++ como yo :D que uso las clases, a veces la herencia y luego todo lo demas en C jeje :) bueno a veces uso la clase de Strings esa que hay para C++ en lugar de las funciones de C para cadenas :D pero se supone que habria que usar para todo las funciones de C++ que las hay no? :) yo soy el primero que programa en en C++C :D

Aiken

hardyx
13/09/2008, 13:25
La razón es que muchas funciones no existen en clases de C++ (estándar). Por ejemplo, la clase std::string (http://www.cplusplus.com/reference/string/string/) no tiene nada para imprimir con formato, o convertir la cadena a entero. Por eso también se usan las librerías de C.