Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Y... como se hace?

Iniciado por Pescado, 28 de Octubre de 2006, 06:44:10 PM

« anterior - próximo »

Pescado

Bueno, antes que nada aviso que utilice por mucho tiempo el compilador FENIX y un poco de DBPro, asi que estoy muy flojo con C y SDL. Supongamos que tengo una imagen de fondo de 800x600 y un cuadrado de 20x20 que será el prota... como hago para que el personaje se mueva? he tratado con lo siguiente pero la imagen que se mueve no se borra y entonces hace varias copias...

Citar
SDL_Surface *background;            // Background surface
SDL_Surface *prota;
//....

background = IImage->Load(FILE_MENU,"background");
CRM32Pro.Blit(background,NULL,CRM32Pro.screen,NULL);
prota=IImage->Load(FILE_MENU,"prota");

SDL_Rect dest;
posx=300;
posy=200;
dest.w = prota->w;
dest.h = prota->h;
dest.x = posx-prota->w/2;   //mueve a partir del centro de la imagen
dest.y = posy-prota->h/2;   //" "

while(!done)
  {
  CRM32Pro.Blit(prota,NULL,CRM32Pro.screen,&dest);
  dest.x = posx-prota->w/2;
  dest.y = posy-prota->h/2;

    while(CRM32Pro.Update(&event))
     {
        switch(event.type)
        {
           case SDL_KEYDOWN:
              if(event.key.keysym.sym == SDLK_ESCAPE) done=1;
   //mueve el prota de der/izq
              if(CRM32Pro.keystate[SDLK_LEFT]) posx=posx-1;      
              if(CRM32Pro.keystate[SDLK_RIGHT]) posx=posx+1;
              break;  
           case SDL_QUIT:
              done = 1;
              break;
           default:
              break;
} ....

Se que no estoy limpiando la pantalla para que vuelva a actualizar para que el grafico del prota no salga encimado... porque no se como se limpia XD.
Con dbpro, dentro de mi bucle utilizaba primero la funcion CLS a continuacion las imagenes y finalmente SYNC para mostrar la pantalla.
Quiero saber como se hace lo que intento hacer... con sprites (al menos con el dbpro si uno usa sprites no hace falta usar el comando CLS) ? borrando cada ciclo la pantalla y volver a dibujar? nose :D.

Bueno eso es todo. Despues les muestro el "concept art" del Sudoku que voy a hacer con el CRM32pro para iniciarme de apoco con esta libreria (ya termine todos los graficos, "solo" falta programar ;) )
The Toonminator!
http://www.toonminator.com

warwolf

Uo uo uo, no corras tanto. Mmmmm digamos que lo estas intentando hacer "por la fuerza bruta".

Primero de todo, si quieres animar/mover imagnes utiliza el módulo de CSprite, no el de IImage (que es sólo un cargador de imágenes). Con el CSprite tienes funciones del tipo SetPosition() o MoveTo() que te serán muy útiles.

Pero vamos, yo te recomiendo que te descarges lo ejemplos de código y te mires el de colisiones, allí veras como se debe "montar" el render y todo eso.

PD. Si tubiera más tiempo seguiría con los tutorials para poder ir explicando todo poco a poco, pero como no dipsongo de mucho los iré sacando poco a poco (también estoy pendiente de que salga la última versión para modificar el primero y poner todo correctamente)

Suerte con el sudoku

TheAzazel

Eso eso, utiliza CSprites :)

y el esqueleto de la aplicacion y el render... como ya te ha dicho warwolf, usa por ejemplo el del ejemplo de la colision de sprites.

Ya nos diras como va la cosa, estoy deseando ver algun pantallazo :P

Pescado

Porque el cursor "desaparece" cuando no cambia su posicion si es que esta encima de un fondo y cuando esta encima de un sprite no pasa esto?
Este es el codigo

Citar
// ---Includes---
#include "CRM32Pro.h"

// ---Defines---
#define WINDOW_TITLE "Sudoku"
#define FILE_MENU "files/menu.dpf"     // DPF with graphic resources
#define AUDIO_RESOURCE "data/audio.dpf" // DPF with sound resources

// ---Prototypes---
void RenderGraphics();

int logox,logoy;
  Uint8       done = 0;
  SDL_Event   event;
  Uint32      cCursor;        // Cursor ID
  SDL_Surface *background;            // Background surface
  CRM32Pro_CSprite *bertesh;

// -------------MAIN FUNCTION----------------
int main(int argc,char *argv[])
{

  // -CRM32Pro and SDL initialize-
  if(CRM32Pro.Init(SDL_INIT_VIDEO | SDL_INIT_AUDIO | SDL_INIT_TIMER) < 0)
  {
     return 1;
  }

  // -Desired config-
  CRM32Pro.Config.Title = WINDOW_TITLE;
  CRM32Pro.Config.Icon = IImage->Load(FILE_MENU,"icon");
  CRM32Pro.Config.bMTFriendly = 1;
  CRM32Pro.Config.VideoWidth = 600;
  CRM32Pro.Config.VideoHeight = 500;
  CRM32Pro.Config.VideoBPP = 16;
  CRM32Pro.Config.VideoAccel = ACCEL_HARDSMOOTH;
  CRM32Pro.Config.VideoRenderer = RENDER_DIRECTX;
  // -Graphics system initialize-  
  if(!CRM32Pro.SetVideoMode())
  {
     CRM32Pro.Quit();
     return 1;
  }

   // -Sound system initialize-  
  ISoundFX->Init(44100, AUDIO_S16, 2, 4096);

   // -Time system initialize-
  ITimeSystem->Init();
  ITimeSystem->SetRate(0,20);

  // -Set our render graphics function to fullfil desired Rendering Frame Rate
  CRM32Pro.SetRenderCallback(RenderGraphics);
 
  // -Your code...-
  ICursor->Init();
  cCursor = ICursor->Load(FILE_MENU,"mouse");
  ICursor->Select(cCursor);
 
  // Load resources
  background = IImage->Load(FILE_MENU,"background");
  bertesh = new CRM32Pro_CSprite();
  bertesh->Load(FILE_MENU,"bertesh");
  bertesh->AutoRestore(0);
  logox=300-164;
  logoy=200-141;
  bertesh->SetPosition(logox,logoy);
  // -Main loop-
  while(!done)
  {
  // Main system update and events loop
     while(CRM32Pro.Update(&event))
     {
                                 
        switch(event.type)
        {
           case SDL_MOUSEBUTTONDOWN:
              break;
           case SDL_KEYDOWN:
              if(event.key.keysym.sym == SDLK_ESCAPE) done=1;
              if(CRM32Pro.keystate[SDLK_LEFT]) logox=logox-1;
              if(CRM32Pro.keystate[SDLK_RIGHT]) logox=logox+1;
              bertesh->SetPosition(logox,logoy);
              break;  
           case SDL_QUIT:
              done = 1;
              break;
           default:
              break;
        }


     }
  }

  // -Free resources, information and exit!-
  //ISoundFX->SoundFree(hndClick);
  CRM32Pro.FreeSurface(background);
  delete bertesh;
  ITimeSystem->Info();
  ICursor->Info();
  CRM32Pro.VideoInfo();
  CRM32Pro.AudioInfo();
  ICursor->Delete(cCursor);
  CRM32Pro.Quit();
  return 0;
}

// ---Our render graphics function---
void RenderGraphics()
{
  char  sTmp[16];
  // Blit background
  SDL_BlitSurface(background, NULL, CRM32Pro.screen, NULL);
 
  // Sprite blitting
  bertesh->Draw();                  
}

Por cierto, hay alguna forma de obtener el ancho y alto de la imagen de un sprite? Esto yo lo utilizo para posicionar el grafico a partir de su centro y no de la esquina superior izquierda que esta por defecto. En el codigo lo hice manualmente en la parte que dice logox=300-164; logoy=200-141 siendo 164 y 141 la mitad del ancho y alto de la imagen... el problema es que a veces cambio mucho una imagen por lo que tendria que volver a calcular de nuevo la mitad y cambiar los valores, en cambio si tengo algo como bertesh->w/2 y bertesh->h/2 me ahorraria ese esfuercito :D
The Toonminator!
http://www.toonminator.com

Harko

Para que no desaparezca cada vez que lo se para pon esto:

ICursor->AutoRestore(0);

Con ponerlo debajo del Select deberia bastar.

CitarPor cierto, hay alguna forma de obtener el ancho y alto de la imagen de un sprite? Esto yo lo utilizo para posicionar el grafico a partir de su centro y no de la esquina superior izquierda que esta por defecto. En el codigo lo hice manualmente en la parte que dice logox=300-164; logoy=200-141 siendo 164 y 141 la mitad del ancho y alto de la imagen... el problema es que a veces cambio mucho una imagen por lo que tendria que volver a calcular de nuevo la mitad y cambiar los valores, en cambio si tengo algo como bertesh->w/2 y bertesh->h/2 me ahorraria ese esfuercito Very Happy

En la siguiente version de la libreria van a estar las instrucciones hoyx y hoty que van a hacer precisamente eso que quieres. De todas maneras con un GetSizeX y un GetSizeY tienes el ancho y el alto del sprite, aunque no estoy seguro de si esta implementado del todo.

Harko.
-=Harko´s Blog=-
Fui el primer civil en probar el "Lord of Creatures" y ademas usaban mis cascos. :D

-=Portfolio=-

Alguno de mis juegos:
-=Feed The Frog=-

Neroncity

TheAzazel

Como te ha dicho harko, prueba con el ICursor->AutoRestore(0).

Al principio me llamo la atencion porque vi que usabas ACCEL_HARDSMOOTH y eso pone el doublebuffer...y con ello los autorestores se deshabilitan automaticamente PERO... lo que esta pasando realmente es el sistema no puede activar ACCEL_HARDSMOOTH porque estas en modo ventana y DirectDraw en hardware no tira en modo ventana!
(voy a agregar un msg en el log avisando cuando el modo obtenido no sea el deseado)

Para ver mejor lo que te digo, coloca un CRM32Pro.VideoInfo() despues del .SetVideoMode() y antes del .Quit() y veras que te esta usando el engine.

Y para coger el alto/ancho de cada frame, tienes que usar

int x,y;
sprite->GetOffset(&x,&y);


Tal como te indica Harko, lo del hotx y hoty esta de camino :)

Saludos






Stratos es un servicio gratuito, cuyos costes se cubren en parte con la publicidad.
Por favor, desactiva el bloqueador de anuncios en esta web para ayudar a que siga adelante.
Muchísimas gracias.