Grupos de sprites en C++

Agrupa todas las consultas sobre los lenguajes de programacion como C, C++, Python, Java ...

Grupos de sprites en C++

Notapor endaramiz » Vie Nov 14, 2008 7:34 pm

Hola, me gustaría saber como implementar grupos de sprites en C++ para poder trabajar sobre todos a la vez (update + draw). Mi problema es que no tengo mucho dominio con el lenguaje. Con Python haría una lista y luego la recorrería y haría el update y el draw con todos los elementos (clases) uno por uno. Pero, como he dicho antes, mi problema es que no se como implementarlo en C++. Ni siquiera con un número limitado de clases en la lista. Tampoco sé si ese es el mejor método de hacerlo.

Saludos.
Avatar de Usuario
endaramiz
 
Mensajes: 283
Registrado: Vie Ago 31, 2007 9:25 am
Ubicación: Barcelona

Notapor julen26 » Mar Nov 18, 2008 2:18 pm

Puedes usar vectores. Suponiendo que tienes una clase llamada CSprite:

Código: Seleccionar todo
#include <vector>

std::vector<CSprite*> SpriteList;


Y para añadir elementos al vector simplemente haz:

Código: Seleccionar todo
SpriteList.push_back(punteroSprite);


Y para update y draw etc., puedes hacer algo asi sin preocuparte del tamaño que pueda tener el vector.

Código: Seleccionar todo
//update
for (unsigned int i = 0; i < SpriteList.size(); i++) {
    if (SpriteList[i] != NULL) {
        SpriteList[i]->Update();
    }
}

Código: Seleccionar todo
//draw
for (unsigned int i = 0; i < SpriteList.size(); i++) {
    if (SpriteList[i] != NULL) {
        SpriteList[i]->Draw();
    }
}


Y para eliminarlos, mas de lo mismo (suponiendo que los sprites los creas en la memoria dinamica):
Código: Seleccionar todo
for (unsigned int i = 0; i < SpriteList.size(); i++) {
    if (SpriteList[i] != NULL) {
        SpriteList[i]->Free();
        delete SpriteList[i];
    }
}
SpriteList.clear();


Saludos[/code]
Avatar de Usuario
julen26
 
Mensajes: 10
Registrado: Dom May 13, 2007 3:04 pm

Notapor lucesita » Mar Nov 18, 2008 3:36 pm

y si no quieres usar memoria dinamica:

Código: Seleccionar todo
SDL_Surface disparos[50];

for (int i = 0; i < 50; i++)
{
    disparos[i] = IMG_Load("C:\myproject\tiritos.jpg")
}


recorres el array con un for... y lo mismo es para dibujar.
Código: Seleccionar todo
for (int i = 0; i < 50; i++)
{
    if (disparos[i] != NULL)
       SDL_BlitSurface(disparos[i], NULL, screen, NULL);
}


y como consejo no uses el update, SDL soporta el famoso Doublebuffer (que alguien con mas conocimiento te explique de que va esto)
pero masomenos vos dibujas en una superficie, mientras se muestra la anterior, una vez que dibujaste toda la superficie nueva le das al comando Flip (el que intercambia las superficies)
el comando es...
Código: Seleccionar todo
SDL_Flip(screen);


PD: espero te alla servido.

PD2: espero no errar con el consejo que te di :$

SAludos Lucesita
lucesita
 
Mensajes: 57
Registrado: Mié Mar 12, 2008 2:49 pm

Notapor endaramiz » Mié Nov 26, 2008 10:20 pm

Muchas gracias!! siento contestar tan tarde, pero no me acababa de funcionar y tenía muy poco tiempo (no descubrí el error que tenía, comencé de nuevo xD). Ahora ya he conseguido que me funcione con el primer método aunque investigaré el otro porque puede ir bien dependiendo del caso.
Tuve problemas al eliminar solo algunos sprites, lo conseguí solucionar con el .erase de los vectores.


lucesita escribió:y como consejo no uses el update, SDL soporta el famoso Doublebuffer
Bueno, en realidad me refería al método update, que suele tener las clases que hacen de sprite. Y que se encarga de actualizar la posición teniendo en cuenta la velocidad y todo eso...

Saludos y gracias de nuevo. Sin saber hacer esto, no podía avanzar hacia casi ningún lado.
Avatar de Usuario
endaramiz
 
Mensajes: 283
Registrado: Vie Ago 31, 2007 9:25 am
Ubicación: Barcelona


Volver a Sobre lenguajes de programación

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 1 invitado

cron