Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





SDL c++ dudas con scrolling

Iniciado por vib, 16 de Octubre de 2012, 05:10:41 PM

« anterior - próximo »

vib

Hola gente!
Tengo un lio formado a la hora de hacer un side scrolling en c++ usando las librerias SDL.
No tengo ni idea de como hacerlo.
Me he bajado ejemplo pero pasandome horas leyendo el codigo y provando cosas me he dado cuenta que nose como diablos se hace.

Alguien sabe de algun tutorial que explique como hacer un side-scroll? lo agradeceria muchisimo.
Ya sabeis eso para que el mapa sea mas grande que lo que vemos y podamos explorarlo entero.

En programacion tengo experiencia y en usar SDL tambien ya que hice un juego online a tiempo real.
Ahora queria ir mas allá con esto y me he perdido.

Veo por los ejemplos que se suele usar la libreria vector.. es como una array dinamica no? al menos es la conclusion que he sacado.

BUENO os agradeceria que me ayudarais! xao!

Hechelion

SDL o no, los conceptos son los mismos y tienes dos formas (que yo sepa), o dibujas TODO el escenario independiente de lo que te sobre (es válido hacer esto, solo que no es muy eficiente pues desperdicias muchos recursos y por eso no se suele usar) o haces "tiles", el concepto es el mismo que al dibujar un tilemap convencional, solo que en vez de tener la pantalla dividida en cientos de pequeñas partes, sueles tener unas pocas baldosas del tamaño de la pantalla.

Si buscas por tilemap deberías encontrar más información técnica sobre como montar la escena.

julen26

#2
Aquí tienes un tutorial de como hacerlo. Aunque la teoría es la misma se puede implementar de muchas maneras. Yo te recomiendo que experimentes un poco y saques tus conclusiones, crea un objeto que hará de Vista o Cámara... Que todos los objetos se dibujen relativamente a la posición de la cámara...

Ánimo!

p.d: Siempre puedes pasarte a otra librería como SFML que te facilita esto, entre otras muchas cosas...

vib

Gracias por las respuestas!
La verdad esque viendo en un tutorial que el scroll era nada mas que una matriz..ya saque mis conclusiones y acaben haciendo un correcto scrolling.
Ahora me a surgido una pequeña duda... es la hora de hacer la colision con el escenario...
Cual es la mejor manera?

Yo ahora mismo lo que hago es:
Mi personaje siempre esta en medio, osea tiene las coordenadas x,y siempre fijas.
Luego tengo las coordenadas de la camara, que siempre apuntan a la posicion de la matriz que hay en posicion x,y de (0,0)

ok la cosa es que siempre comparo todos los tiles que van aparecer en la pantalla..los comparo con la posicion del personaje para saber si hay colision o no.
Me parece una solucion un poco mala..ya que hago comparaciones innecesarias.

La idea que tengo aunque decidme cuala es la manera mas optima.. es

si tengo una matriz

1111111111
1001000001
1000100011
1001010101
1111111111

i visualizo por ejemplo 4x4

si estuviera en el matriz[0]
se veria :
1111
1001
10<0>0
1111
si yo estoy en <0> entonces me gustaria poder comparar las posiciones adjacentes ami...
pero no me sale ninguna formula correcta para poder hacerlo..i que canviando las variables y medidas siga funcionando.

Como lo hariais? gracias

julen26

Siempre puedes conseguir la posición de la matriz a partir de la posición real del personaje. Simplemente divide la posición del personaje entre el tamaño del tile.

tileX = player.x div tile.width;
tileY = player.y div tile.height;
..
matriz[tileX][tileY]


Sabiendo la posición del personaje en a matriz luego puedes lograr las adyacentes sumando y restando 1 tile.

matriz[tileX+1][tileY]
matriz[tileX][tileY-1]
...


Claro que este método funciona si el tamaño del personaje es menor al tamaño de los tiles. De lo contrario se debería comprobar la colisión entre un rango mayor de tiles.

vib

Soirry por contestar tan tarde

Si mas o menos eso es lo que queria buscar!
cuando tenga un rato seguire en ello de nuevo
gracias! :D

[EX3]

No me acordaba ya de este post.

Cita de: vib en 25 de Octubre de 2012, 02:25:27 PM
Ahora me a surgido una pequeña duda... es la hora de hacer la colision con el escenario...
Cual es la mejor manera?
Aunque aun no lo he publicado en mi blog todavía (tengo que terminar cuando tenga un hueco una publicación pendiente antes) te dejo por aquí un pequeño sistema para gestionar colisiones en 2D, que aunque esta implementado en XNA no te debería ser difícil de portar a C++ y SDL y podria servirte para tu proyecto:
https://github.com/VisualStudioEX3/2DCollisionSample

Salu2...
José Miguel Sánchez Fernández
.NET Developer | Game Programmer | Unity Developer

Blog | Game Portfolio | LinkedIn | Twitter | Itch.io | Gamejolt

bnl

Ex3 da gusto leer codigo asi, claro, limpito y comentado.

Mi web: http://www.brausoft.com/
No sabían que era imposible, así que lo hicieron.

[EX3]

Cita de: bnl en 12 de Noviembre de 2012, 09:30:30 PM
Ex3 da gusto leer codigo asi, claro, limpito y comentado.
Gracias :)

Salu2...
José Miguel Sánchez Fernández
.NET Developer | Game Programmer | Unity Developer

Blog | Game Portfolio | LinkedIn | Twitter | Itch.io | Gamejolt

bnl

Para que se podrian usar los manejadores de PreUpdate y PostUpdate en un juego real? por ejemplo para actualizar los frames de la animacion o le das otra utilidad?
Mi web: http://www.brausoft.com/
No sabían que era imposible, así que lo hicieron.

[EX3]

Buena pregunta :)

Fíjate en el código de la clase principal del proyecto (Game1.cs) donde defino el cuerpo móvil que se maneja como player en la demostración. Como indico en el repositorio, este sistema de colisiones no implementa ni sistema de fuerzas ni gravedad, pero en el ejemplo muestro como simular gravedad como si de un juego de plataformas fuera (el objetivo con el que diseñe el sistema de colisiones), y al tratar de hacerlo me surgió la necesidad de hacerlo así, con un mecanismo para definir individualmente un método de pre actualización y pre dibujado y post actualización y post dibujado, para así poder responder antes y después de los procesos internos del propio sistema de colisiones.

La sección del código donde inicializo el player:

            // Creamos un cuerpo no fijo que manejaremos como si fuera el jugador:
            body = new Body(new Rectangle(80 * 2, 80 * 2, 80, 80), Color.Red, false, true);
            body.Debug = true;
            world.bodies.Add(body);
            body.WorldInstance = world;
            body.PreUpdate += this.PreUpdate;
            body.PostUpdate += this.PostUpdate;
            body.PostDraw += this.PostDraw;


La sección del código con sus preUpdate, postUpdate y preDraw:

        Rectangle sensor;
        /// <summary>
        /// Simulamos la logica de gravedad y deteccion de suelo del cuerpo.
        /// </summary>
        /// <param name="owner"></param>
        public void PreUpdate(Body owner)
        {
            Body[] collideWith;
            world.IntersectRect(sensor, out collideWith);
            {
                int condition = 0;
                for (int i = 0; i < collideWith.Length; i++)
                    if (collideWith[i] != owner && collideWith[i].Solid && collideWith[i].Enabled)
                        condition++;

                if (condition == 0) owner.Rectangle.Y+=10;
            }
        }

        /// <summary>
        /// Actualizamos la vista del area que hace las funciones de sensor del cuerpo para detectar el suelo.
        /// </summary>
        /// <param name="owner"></param>
        public void PostUpdate(Body owner)
        {
            sensor.X = owner.Rectangle.X;
            sensor.Y = owner.Rectangle.Y + owner.Rectangle.Height;
            sensor.Width = owner.Rectangle.Width - 1;
            sensor.Height = 1;
        }

        /// <summary>
        /// Dibujamos el area del sensor.
        /// </summary>
        /// <param name="owner"></param>
        public void PostDraw(Body owner)
        {
            Helper.DrawBox(sensor, Color.Yellow);
        }


Seguro que habrá muchas y mejores formas de hacerlo, no lo niego, este ejemplo lo hice rápidamente en una tarde, pero estoy seguro también de que habrá otros usos útiles para estos manejadores :)

Salu2...
José Miguel Sánchez Fernández
.NET Developer | Game Programmer | Unity Developer

Blog | Game Portfolio | LinkedIn | Twitter | Itch.io | Gamejolt

bnl

Mi web: http://www.brausoft.com/
No sabían que era imposible, así que lo hicieron.

vib

#12
Buenas de nueva;
me he mirado tu web, parece esta muy bien ya le hechare un ojo con mas calma...aunque ese lenguaje no lo he visto demasiadas veces me cuesta un poco entender algunas funciones pero eso ya es cosa mia.
Me he puesto hace unos dias con el codigo de nuevo y para la colision tengo mas problemas que pensaba que me daria esa funcion. Os dejo el codigo de lo que he hecho y bueno nose porque me falla.


bool colisio(int pos)//pos es la posicion para saber si es hacia arriba, derecha etc las demas variables de momento las tengo como uso general
{
   //yo colisiona con cada escroll
   ///yo posicon real.."siempre medio si pero para usarse en otro tipo de scroll
   /// camara para saber la posicion real de mapa
//camara indica el 1r numero de la matriz en la posicio 0,0
//yo es el personaje que en este "juego" esta en el centro del mapa
//para colocar el colx y coly encima del personaje pero teniendo en cuenta "creo" las posiciones de la matriz

   int colx=camara.x+(yo.x-TAMANO_W); //tamano es el tamano de la imagen del personaje
   int coly=camara.y+(yo.y-TAMANO_H);

///PARA SABER LA POSICION DEL MAPA YA QUE SE DIVIDDE POR EL SCROLL

   colx=colx/TILESIZE_x;//el tamano delos tiles del scroll
   coly=coly/TILESIZE_y;
   cout <<" col x " <<colx<<" col y "<<coly<<endl;


   ///col del jugador con los tiles de su alrededor " se da por exo que el esta sobre algo que no colisiona...

   ///derecha
   if(pos==1){
       if(map[coly][colx+1]==1 )return true;//or map[coly+1][colx+1]==1 or map[coly-1][colx+1]==1)return true;
       else return false;
   }
   ///zki
   if(pos==2){
       if(map[coly][colx-1]==1)return true;// or map[coly+1][colx-1]==1 or map[coly-1][colx-1]==1)return true;
       else return false;
   }
   ///ar
   if(pos==3){
       if(map[coly+1][colx]==1)return true;// or map[coly+1][colx-1]==1 or map[coly+1][colx+1]==1)return true;
       else return false;
   }
   ///abj
   if(pos==4){
       if(map[coly-1][colx]==1)return true;// or map[coly-1][colx-1]==1 or map[coly-1][colx+1]==1)return true;
       else return false;
   }
};
bueno gracias por vuestro tiempo :D






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.