Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Menu

Mostrar Mensajes

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

Mostrar Mensajes Menu

Temas - Puyover

#1
Hola a todos!

Bueno veréis, resulta que yo tengo este código, dentro de una función que controla la nave:

if(Nave.dstrect.x - 19 > 480) Nave.dstrect.x = 0;
else if(Nave.dstrect.x + 19 < 0) Nave.dstrect.x = 480; // No funciona
else if(Nave.dstrect.y - 19 > 272) Nave.dstrect.y = 0;
else if(Nave.dstrect.y + 19 < 0) Nave.dstrect.y = 272; // No funciona


El problema es que yo quiero que cuando la nave se meta por ejemplo por el lado izquierdo de la pantalla, aparezca por el derecho, pero lo único que consigo es que se pare en seco.

Las lineas con comentarios son las que deberían funcionar, y no lo hacen mientras que las demas si que funcionan -.-U

Al principio pense que era porque lo estaba haciendo para la psp, pero ejecutandolo en el pc, me pasa lo mismo. Por si sirve de ayuda, la configuración que estoy usando de video esta:

SDL_SetVideoMode(480, 272, 16, SDL_HWSURFACE | SDL_DOUBLEBUF);

Bueno, gracias y salu2!!

EDITO: Acabo de hacer una prueba moviendo 6 sprites al limite izquierdo y superior, y nada, se bloquean al llegar al final de la pantalla :(
#2
CRM32Pro / Problemas con la velocidad...
05 de Diciembre de 2007, 09:34:07 PM
Hola a todos!

Bueno veréis estoy intentando mostrar un mapa de tiles de 32x32, de 64 tiles de ancho y 20 tiles de alto. Lo muestro en la función que se le pasa a SetRenderCallback(...) para luego poder hacer un scroll horizontal, ya que si muestro el mapa una vez, el scroll no funciona.

La cuestión es que lo hago así, y el juego me va a unos 43 ~ 45 frames, por lo que al mover el personaje, éste se mueve bastante lento.

Aquí os dejo el contenido de la función que renderiza todo en pantalla y la que muestra el mapa:

// Renderizado de los graficos
void RenderAll(int bLogicUpdate) {
   // Dibuja el mapa de tiles
   DibujarMapa();

   // Realiza los calculos de movimiento
   MoverTombi();
   if(Tombi.saltando) Saltar();

   // Funcion que dibuja a Tombi
   Koka.gfx->Draw();
   Tombi.gfx->Draw();

   // Muestra los frames por segundo
   ShowFPS();
}


// Dibuja los mapas segun convenga
void DibujarMapa() {
   short x, y;

   for(x = 0; x < 64; x++) {
    for(y = 0; y < 20; y++) {
        Level1.tile->SetPosition(x * TILE_SIZE, y * TILE_SIZE);
        Level1.tile->Draw(NULL, stage1[Level1.posY + y][Level1.posY + x]);
    }
}
}


Y por si acaso os dejo la estructura Map:

struct Map {
   CRM32Pro_CTile* tile;
   int posX, posY;
   int posX_off, posY_off;
} Level1;


Las variables posX_off y posY_off aun no las he usado xD.

Bueno salu2 y gracias!
#3
Programación gráfica / Problema con disparos en Blitz3D
08 de Septiembre de 2007, 11:11:55 PM
Hola a todos!

Vereis estoy haciendo un juego tipo asteroids en Blitz3D y funciona todo perfectamente excepto un pequeño detalle: Si mientras me muevo en la direccion Abajo+Izquierdas y pulso la tecla disparar, la nave no dispara, solo lo hace si me quedo QUIETO en esa direccion :S

Os dejo el codigo de las funciones referentes al movimiento de la nave y las balas:

Citar
Function UpdateBullet()
   For Bala.BULLETS = Each BULLETS
      If Bala\Direccion = BABAJO_I Then
         Bala\Y = Bala\Y + Bala\Velocidad
         Bala\X = Bala\X - Bala\Velocidad
      ElseIf Bala\Direccion = BARRIBA_D Then
         Bala\Y = Bala\Y - Bala\Velocidad
         Bala\X = Bala\X + Bala\Velocidad
      ElseIf Bala\Direccion = BDERECHA_A Then
         Bala\Y = Bala\Y + Bala\Velocidad
         Bala\X = Bala\X + Bala\Velocidad
      ElseIf Bala\Direccion = BIZQUIERDA_A Then
         Bala\Y = Bala\Y - Bala\Velocidad
         Bala\X = Bala\X - Bala\Velocidad
      ElseIf Bala\Direccion = BARRIBA Then
         Bala\Y = Bala\Y - Bala\Velocidad
      ElseIf Bala\Direccion = BDERECHA Then
         Bala\X = Bala\X + Bala\Velocidad
      ElseIf Bala\Direccion = BABAJO Then
         Bala\Y = Bala\Y + Bala\Velocidad
      ElseIf Bala\Direccion = BIZQUIERDA Then
         Bala\X = Bala\X - Bala\Velocidad
      EndIf
      
      DrawImage(Bala\Grafico, Bala\X, Bala\Y, 0)
      
      If Bala\X > X_Final Then
         Delete Bala
      ElseIf Bala\X < X_Inicial Then
         Delete Bala
      ElseIf Bala\Y > Y_Final Then
         Delete Bala
      ElseIf Bala\Y < Y_Inicial Then
         Delete Bala
      EndIf
      
      For rock.ASTEROIDE = Each ASTEROIDE ;Recorremos todos los asteroides
         If Bala <> Null Then ;Si la Bala existe entonces...
            If ImagesCollide(Bala\Grafico, Bala\X, Bala\Y, 0, rock\Grafico, rock\X, rock\Y, 0) Then               
               PlaySound sndExplosion
               Explosionar(rock\X, rock\Y)
               Colision = 1
               rock\NivelHP = rock\NivelHP + 1
               rX = rock\X: rY = rock\Y
               Delete Bala
               If rock\NivelHP > 7 Then
                  Asteroides_Destruidos = Asteroides_Destruidos + 1
                  Delete rock
               EndIf
            EndIf
         EndIf
      Next
   Next
End Function

Citar
Function Disparar()
   Municion = Municion + 1
   PlaySound sndDisparo
   Bala.BULLETS = New BULLETS
   Bala\Grafico = LoadAnimImage("gfx/SpriteSheet.png", 64, 64, 8, 8)
   Bala\X = ship\X
   Bala\Y = ship\Y
   Bala\Velocidad = 4
   MaskImage Bala\Grafico, 255, 0, 255
   HandleImage Bala\Grafico, 2, 3
   
   If ship\Direccion = ARRIBA_D Then Bala\Direccion = BARRIBA_D
   If ship\Direccion = IZQUIERDA_A Then Bala\Direccion = BIZQUIERDA_A
   If ship\Direccion = DERECHA_A Then Bala\Direccion = BDERECHA_A
   If ship\Direccion = ABAJO_I Then Bala\Direccion = BABAJO_I
   If ship\Direccion = ARRIBA Then Bala\Direccion = BARRIBA
   If ship\Direccion = DERECHA Then Bala\Direccion = BDERECHA
   If ship\Direccion = ABAJO Then Bala\Direccion = BABAJO
   If ship\Direccion = IZQUIERDA Then Bala\Direccion = BIZQUIERDA
End Function

Citar
Function MoverNave()
   If KeyDown(DUP) And KeyDown(DRIGHT) Then
      ship\Y = ship\Y - ship\Velocidad ;...Si se pulsa arriba y derecha entonces...
      ship\X = ship\X + ship\Velocidad
      ship\Direccion = ARRIBA_D
   
   ElseIf KeyDown(DLEFT) And KeyDown(DUP) Then
      ship\Direccion = IZQUIERDA_A
      ship\Y = ship\Y - ship\Velocidad ;...Si se pulsa izquierda y arriba entonces...
      ship\X = ship\X - ship\Velocidad
      
   ElseIf KeyDown(DRIGHT) And KeyDown(DDOWN) Then
      ship\X = ship\X + ship\Velocidad ;...Si se pulsa derecha y abajo entonces...
      ship\Y = ship\Y + ship\Velocidad
      ship\Direccion = DERECHA_A
      
   ElseIf KeyDown(DDOWN) And KeyDown(DLEFT) Then
      ship\Y = ship\Y + ship\Velocidad ;...Si se pulsa abajo e izquierda entonces...
      ship\X = ship\X - ship\Velocidad
      ship\Direccion = ABAJO_I
   
   ElseIf KeyDown(DUP) Then
      ship\Y = ship\Y - ship\Velocidad ;...Si se pulsa arriba entonces...
      ship\Direccion = ARRIBA
   
   ElseIf KeyDown(DRIGHT) Then
      ship\X = ship\X + ship\Velocidad ;...Si se pulsa derecha entonces...
      ship\Direccion = DERECHA
   
   ElseIf KeyDown(DDOWN) Then
      ship\Y = ship\Y + ship\Velocidad ;...Si se pulsa abajo entonces...
      ship\Direccion = ABAJO
      
   ElseIf KeyDown(DLEFT) Then
      ship\X = ship\X - ship\Velocidad ;...Si se pulsa izquierda entonces...
      ship\Direccion = IZQUIERDA
   EndIf
   
   If ship\Y < Y_Inicial Then ship\Y = Y_Final
   If ship\Y > Y_Final Then ship\Y = Y_Inicial
   If ship\X < X_Inicial Then ship\X = X_Final
   If ship\X > X_Final Then ship\X = X_Inicial
   
   If KeyHit(57) Then Disparar()
   
   DrawImage ship\Grafico, ship\X, ship\Y, ship\Direccion
End Function

En fin, gracias adelantadas por vuestra ayuda!
#4
CRM32Pro / Colisiones con tiles, en un tileset.
06 de Marzo de 2007, 05:33:02 PM
Hola a todos!

Siento molestar tanto, pero llevo ya un buen rato, intentando que el protagonista de mi "juego", al colisionar con un objeto, como un arbol o una piedra, se pare y no avance mas. El método que yo utilizo es el de tener todos los terrenos por los que el muñeco puede pasar en un tileset, y en otro tileset, tengo los elementos con los que colisiona.

Aquí os dejo el código:


// Cargamos el mapa
   Pradera = new CRM32Pro_CTile();
   Pradera_col = new CRM32Pro_CTile();
   Pradera->Load(TILESET_RESOURCE, "Pradera");
   Pradera_col->Load(TILESET_RESOURCE, "Pradera_col");
   Pradera_col_sur = Pradera_col->GetSurface();

// Propiedades de cada tile
   offset.x = Pradera_col->GetPosX()-7;
   offset.y = Pradera_col->GetPosY()-7;
   offset.w = Pradera_col->GetSizeX();
   offset.h = Pradera_col->GetSizeY();
............................................................................................
while(!done) {
       PJHandler();
// Bucle de eventos, para salir del programa
       while(CRM32Pro.Update(&event)) {
           switch(event.type) {
               case SDL_KEYDOWN:
                   if(event.key.keysym.sym == SDLK_ESCAPE) done = 1;
                   break;
               case SDL_QUIT:
                   done = 1;
                   break;
           }
       }
   }
............................................................................................
/** FUNCION DE MANEJO DEL PROTAGONISTA **/
void PJHandler(void) {
// Realizamos un mapeado del teclado
   keyboard = SDL_GetKeyState(NULL);

// Resumimos la animacion del sprite
   Link->Resume();

// Comprobamos los movimientos de Link
   if(keyboard[SDLK_UP]) {
       Link->SelectAnim(SPRSTATE_UP);
       spr_posX = Link->GetPosX();
       spr_posY = Link->GetPosY() - spr_velY;
       Link->SetPosition(spr_posX, spr_posY);
       if(Link->Collision(Pradera_col_sur, &offset)) Link->SetPosition(spr_posX, spr_posY + spr_velX);
   } else if(Link->GetAnim() == SPRSTATE_UP) { Link->SelectFrame(7); Link->Pause(); }

   if(keyboard[SDLK_LEFT]) {
       Link->SelectAnim(SPRSTATE_LEFT);
       spr_posX = Link->GetPosX() - spr_velX;
       spr_posY = Link->GetPosY();
       Link->SetPosition(spr_posX, spr_posY);
       if(Link->Collision(Pradera_col_sur, &offset)) Link->SetPosition(spr_posX + spr_velX, spr_posY);
   } else if(Link->GetAnim() == SPRSTATE_LEFT) { Link->SelectFrame(0); Link->Pause(); }

   if(keyboard[SDLK_RIGHT]) {
       Link->SelectAnim(SPRSTATE_RIGHT);
       spr_posX = Link->GetPosX() + spr_velX;
       spr_posY = Link->GetPosY();
       Link->SetPosition(spr_posX, spr_posY);
       if(Link->Collision(Pradera_col_sur, &offset)) Link->SetPosition(spr_posX - spr_velX, spr_posY);
   } else if(Link->GetAnim() == SPRSTATE_RIGHT) { Link->SelectFrame(7); Link->Pause(); }

   if(keyboard[SDLK_DOWN]) {
       Link->SelectAnim(SPRSTATE_DOWN);
       spr_posX = Link->GetPosX();
       spr_posY = Link->GetPosY() + spr_velY;
       Link->SetPosition(spr_posX, spr_posY);
       if(Link->Collision(Pradera_col_sur, &offset)) Link->SetPosition(spr_posX, spr_posY - spr_velY);
   } else if(Link->GetAnim() == SPRSTATE_DOWN) { Link->SelectFrame(0); Link->Pause(); }
}


La cuestión es que el protagonista se para, pero luego ya no puedo salir de ahí; es como si se quedara bloqueado... y otra cosa es que el juego se mueve muy lento. el bucle para recorrer todos los tiles del tileset y que los dibuje está en una función, a la que llamo con SetRenderCallback(...);

En fin, haber si podéis hecharme una mano.

Salu2!!
#5
CRM32Pro / Problema con sprites.
05 de Marzo de 2007, 10:37:08 PM
Hola a todos!

veréis tengo esta función:

void PJHandler(void) {
// Realizamos un mapeado del teclado
   keyboard = SDL_GetKeyState(NULL);

// Comprobamos los movimientos de Link
   if(keyboard[SDLK_UP]) {
       Link->SelectAnim(SPRSTATE_UP);
       spr_posX = Link->GetPosX();
       spr_posY = Link->GetPosY() - spr_velY;
       Link->SetPosition(spr_posX, spr_posY);
   }
   if(keyboard[SDLK_LEFT]) {
       Link->SelectAnim(SPRSTATE_LEFT);
       spr_posX = Link->GetPosX() - spr_velX;
       spr_posY = Link->GetPosY();
       Link->SetPosition(spr_posX, spr_posY);
   }
   if(keyboard[SDLK_RIGHT]) {
       Link->SelectAnim(SPRSTATE_RIGHT);
       spr_posX = Link->GetPosX() + spr_velX;
       spr_posY = Link->GetPosY();
       Link->SetPosition(spr_posX, spr_posY);
   }
   if(keyboard[SDLK_DOWN]) {
       Link->SelectAnim(SPRSTATE_DOWN);
       spr_posX = Link->GetPosX();
       spr_posY = Link->GetPosY() + spr_velY;
       Link->SetPosition(spr_posX, spr_posY);
   }
}


Funcionar funciona bien. El problema es que no se hacer, para que cuando se deje de pulsar la tecla Arriba, la animación se pare, y se el muñeco se quede mirando hacia arriba.

Muchas gracias y saludos!!
#6
Hola a todos!

Vereis, tengo un problemita con esas funciones del Blitz3D. Resulta que yo quiero cargar un sprite con la funcion LoadSprite(...), pero al posicionarla en pantalla con PositionEntity me dice que la entidad no existe, y segun la documentacion de Blitz3D, pone que al usar la funcion LoadSprite(...), creamos un sprite y le asignamos una textura a la vez. Bien pues eso hago y no me funciona... Espero que me podais decir cual es el problema :(

Os dejo el source, para que lo veais mas claro:

Graphics3D 640, 480, 16, 2
SetBuffer BackBuffer()

campivote = CreatePivot()
cam = CreateCamera(campivote)
MoveEntity cam, 0, 0, -5

Type Objeto
Field X#, Y#, Z#
Field Grafico
End Type

Prota.Objeto = New Objeto
Prota\Grafico = LoadSprite("/Sprite/Bolt.png", 1)
Prota\X# = 0
Prota\Y# = 0
Prota\Z# = 0

Fondo.Objeto = New Objeto
Fondo\Grafico = LoadImage("/Sprites/Tierra.png")
Fondo\X# = 0
Fondo\Y# = 506
Fondo\Z# = 0

MoveEntity Prota\Grafico, Prota\X#, Prota\Y#, Prota\Z#

Repeat
RenderWorld:Flip
Forever


Saludos y gracias adelantadas!
#7
Proyectos / Mi blog sobre la programación
09 de Julio de 2006, 08:18:27 PM
Hola!

Abro este hilo para informaros de un blog que tengo en el que hay decargas con su codigo fuente y algunos programas. Tambien hay un foro.

//lagrutatomberi.blogspot.com

Saludos y espero que se registren en el foro!
#8
Hola a todos!

Vereis soy nuevo en el foro y me gustaría que me respondieran a esta duda.

He estado estudiando SDL desde que empezo el verano y ya lo entiendo todo perfectamente. He hecho algunas cosillas, como mostrar un sprite y poder moverlo con el teclado, cargar audio, etc. Lo unico que no he hecho es mostrar una animacion ni un fondo, pero eso no viene al caso. Me estoy dando cuenta, que conforme avanzas en SDL, como cualquier otro lenguaje, se te amontona el codigo y no sabes por donde vas, por lo que he decidido estudiar Visual Basic para crear un editor de niveles. Luego he visto una cosa, que es el lenguaje de script, que no se para que vale ni en que puede ayudar como complemeto en la programación...

Me gustaria que me contaran sus experiencias, para poder orientarme, ya que he llegado a un punto en el que estoy bastante perdido y no se que hacer... y que me explicaran eso de los lenguajes de script.

Muchas gracias y por favor ayudadme que estoy muy perdido en esto y no se por donde irme.

Saludos y gracias otra vez.