elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Recuerda que debes registrarte en el foro para poder participar (preguntar y responder)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Necesito ayuda con scrollbar c/c++ en juego 2d.
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Necesito ayuda con scrollbar c/c++ en juego 2d.  (Leído 3,553 veces)
vangodp


Desconectado Desconectado

Mensajes: 455



Ver Perfil
Necesito ayuda con scrollbar c/c++ en juego 2d.
« en: 29 Julio 2014, 12:54 pm »

¡Hola, buenas amigos!
Estoy liado con un tema que me anda consumiendo XD
Ya estuve buscando por todas las partes pero poco encontré =(.
Estoy intentando hacer un scrollbar.
Me estoy dando mil vueltas para conseguirlo.
En Internet hay millones de resultados para java, c# ,html... pero para C++ nada de nada, y lo comprendo ya que c++ no es una librería gráfica. XD
Mi intención es hacer un scrollbar para un menú de un juego en SFML pero no se como hacer.
Lo que he logrado hasta ahora es conseguir saber el tamaño de la barra de scroll según el tamaño del contenido de la imagen.
Dejo una imagen para que lo vean mejor.

No se como lograr que al desplazar la barra hacia abajo mostre el restante del contenido.
Tengo un código echo en miniwin con la ventana y la barra ya con su ancho pero no logro hacer el resto =((
Hojala me puedan ayudar.
Dejo el código de miniwin:
Código
  1. #include "miniwin.h"
  2. #include <iostream>
  3. #include <sstream>
  4. #include <cmath>
  5. using namespace miniwin;
  6.  
  7. int main(){
  8.    float ancho = 800;            
  9.    float alto  = 600;            
  10.    float x     = 0;                 //parte de arriba de la pantalla
  11.    float y     = 0;                 //parte izquierda de la pantalla
  12.    float izq   = ancho-20;
  13.    float arr   = y;
  14.    float aba   = y+ancho;
  15.    float der   = izq+20;    
  16.    float borde_izquierdo = 0;    
  17.    float borde_derecho   = ancho;
  18.    float retraso         = 1000;    
  19.    float velocidad       = 5;    
  20.    float total           = 2000;     //contenido
  21.    float visible         = alto;     //area visible del contenido(ventana)
  22.    float scrollbar       = alto;     //digamos que es el rail donde puede desplazar la barra este es el alto de la pantalla
  23.    float anchoBarra      = 0;        //tamaño de la barra segun el tamaño contenido
  24.    std::stringstream ss;        //necesario para imprimir ya que miniwin no permite abrir consola.
  25.    int t;                      
  26.    vredimensiona(ancho, alto);
  27.  
  28.  
  29.  
  30.    while ( true ) {
  31.        //LOGICA DE JUEGO
  32.        anchoBarra = ( visible / total ) * scrollbar; //ancho de la barra.
  33.        ss << anchoBarra;
  34.  
  35.        t = tecla();
  36.  
  37.        if(t==ARRIBA){
  38.            //Desplazar hacia arriba
  39.        }
  40.        if(t==ABAJO){
  41.            //Desplazar hacia abajo
  42.        }
  43.  
  44.        //PINTAMOS CAMBIOS    
  45.        color(VERDE);
  46.        rectangulo_lleno( x, y, x+800-20, total);     //contenido
  47.        color(ROJO);
  48.        rectangulo_lleno( izq, arr, der, anchoBarra); //barra        
  49.        texto(0,0,ss.str());
  50.        refresca();                  
  51.        borra();                    
  52.        espera(retraso);            
  53.    }//FIN GAMELOOP
  54.  
  55.    return 0;
  56. }
  57.  
Si quieren probar el código miniwin se puede bajar de aquí: http://miniwin.readthedocs.org/en/latest/
Es un proyecto de codeblocks. Aquí tiene una explicación de las funciones de miniwin:
http://miniwin.readthedocs.org/en/latest/
Lo hago en miniwin por que es sumamente fácil en esta librería, pero tengo pensado llevar eso a SFML. Si para vosotros es mejor SFML seria genial.
No os pido que me lo hagan solo si me pueden echar un cable o alguna pagina que pueda tirar esa duda.
¡Gracias desde ya! Un saludo.  ;-)


En línea

eferion


Desconectado Desconectado

Mensajes: 1.248


Ver Perfil
Re: Necesito ayuda con scrollbar c/c++ en juego 2d.
« Respuesta #1 en: 29 Julio 2014, 13:47 pm »

La idea puede ser el disponer de un "viewport" que te facilite los datos del área visible en todo momento. Los datos de este viewport se verán afectados en el momento en el que se modifique el estado de la barra de scroll

Para empezar, el control de scroll. Este puede ser todo lo complejo que quieras, pero lo básico sería algo tal que:

Código
  1. class ScrollBar
  2. {
  3.  public:
  4.  
  5.    ScrollBar( int max )
  6.      : _max( max ),
  7.        _position( 0 )
  8.   { }
  9.  
  10.    void Slide( int value )
  11.    {
  12.      _position += value;
  13.  
  14.      _position = std::max( _position, 0 );
  15.      _position = std::min( _position, _max );
  16.    }
  17.  
  18.    void SlideUp( )
  19.    { Slide( -5 ); }
  20.  
  21.    void SlideDown( )
  22.    { Slide( +5 ); }
  23.  
  24.    int Position( ) const
  25.    { return _position; }
  26.  
  27.  private:
  28.  
  29.    int _position;
  30.    int _max;
  31. };

Como se ve, te limita la posición dentro de un rango determinado. Incluye un par de funciones para hacer desplazamientos rápidos, por ejemplo si pones los botones "arriba" y "abajo" característicos de las barras de scroll.

Ahora necesitamos definir el "viewport"... básicamente no deja de ser un rectángulo que podemos desplazar al gusto:

Código
  1. class ViewPort
  2. {
  3.  public:
  4.  
  5.    ViewPort( int x, int y, int width, int height )
  6.      : _x( x ), _y( y ), _width( width ), _height( height )
  7.   { }
  8.  
  9.    int X( ) const
  10.    { return _x; }
  11.  
  12.    int Y( ) const
  13.    { return _y; }
  14.  
  15.    int Width( ) const
  16.    { return _width; }
  17.  
  18.    int Height( ) const
  19.    { return _height; }
  20.  
  21.    int Left( ) const
  22.    { return _x; }
  23.  
  24.    int Right( ) const
  25.    { return _x + _width; }
  26.  
  27.    int Top( ) const
  28.    { return _y; }
  29.  
  30.    int Bottom( ) const
  31.    { return _y + _height; }
  32.  
  33.     void MoveTo( int x, int y )
  34.    {
  35.      _x = x;
  36.      _y = y;
  37.    }
  38.  
  39.  private:
  40.  
  41.    int _x;
  42.    int _y;
  43.    int _width;
  44.    int _height;
  45. };

Si ahora "cosemos" un poco los elementos, podemos tener un pequeño ejemplo... eso si... sin partes gráficas:

Código
  1. int main( )
  2. {
  3.  ScrollBar scroll( 0, 20 );
  4.  
  5.  ViewPort viewPort( 0, 0, 800, 600 );
  6.  
  7.  std::cout << "Desplazamiento hacia abajo:" <<  std::endl;
  8.  for ( int i = 0; i < 5; i++ )
  9.  {
  10.    scroll.SlideDown( );
  11.    viewPort.MoveTo( 0, scroll.Position( ) );
  12.    std::cout << "Posición: x=" << viewPort.X( ) << " y=" << viewPort.Y( ) << std::endl;
  13.  }
  14.  
  15.  std::cout << std::endl;
  16.  std::cout << "Desplazamiendo hacia arriba: " << std::endl;
  17.  for ( int i = 0; i < 5; i++ )
  18.  {
  19.    scroll.SlideUp( );
  20.    viewPort.MoveTo( 0, scroll.Position( ) );
  21.    std::cout << "Posición: x=" << viewPort.X( ) << " y=" << viewPort.Y( ) << std::endl;
  22.  }
  23. }

Como se puede apreciar... la barra de scroll limita el desplazamiento del área visible, impidendo que salga de los márgenes definidos.

Una vez echo esto queda "pintar" de forma efectiva el área apuntada por "ViewPort", pero eso ya debería ser facil conociendo las coordenadas del área a pintar... lo que tienes que hacer es coger todos los elementos de ese área y "desplazarlos". Me explico. Imagina que tienes un elemento en (20, 10) y el viewport tiene como coordenada superior (0, 2)... el elemento deberás desplazarlo ese (0, 2), es decir, deberás pintarlo en (20, 8) para que aparezca correctamente pintado en la ventana.

Si no queda muy clara la explicación avísame y te lo comento con más tranquilidad... me tengo que ir a comer XDDDD


En línea

vangodp


Desconectado Desconectado

Mensajes: 455



Ver Perfil
Re: Necesito ayuda con scrollbar c/c++ en juego 2d.
« Respuesta #2 en: 29 Julio 2014, 14:02 pm »

Gracias eferion.
Voy a intentar implementar el source a ver que tal me queda  y luego comento que tal:D
Muchas gracias =D  ;-)

Edit:
En main: creas un objeto llamando el constructor con 2 parámetros:   ScrollBar scroll( 0, 20 );

Pero el constructor solo tiene definido uno. El otro es _position?  :huh:
« Última modificación: 29 Julio 2014, 15:09 pm por vangodp » En línea

eferion


Desconectado Desconectado

Mensajes: 1.248


Ver Perfil
Re: Necesito ayuda con scrollbar c/c++ en juego 2d.
« Respuesta #3 en: 29 Julio 2014, 15:12 pm »

Edit:
En main: creas un objeto llamando el constructor con 2 parámetros:   ScrollBar scroll( 0, 20 );

Pero el constructor solo tiene definido uno. El otro es _position?  :huh:

Vaya, al final se me olvidó actualizar el main... hice un cambio de última hora y le quité el primer parámetro a ScrollBar... ya que una barra de scroll únicamente se mueve en un plano. Elimina el 0 y listo.
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
necesito ayuda con la instalacion de un juego :S
Juegos y Consolas
faku_73 7 2,483 Último mensaje 22 Diciembre 2006, 16:10 pm
por Grave
necesito ayuda para un juego...
Programación Visual Basic
marrison 3 2,226 Último mensaje 27 Junio 2013, 22:00 pm
por engel lex
Necesito ayuda de un juego T.T
Juegos y Consolas
mubies 8 4,684 Último mensaje 31 Julio 2013, 17:13 pm
por palo_tes
[AYUDA] ¡Necesito entrar a un juego!
Hacking
Zodiak98 2 2,442 Último mensaje 4 Diciembre 2013, 18:36 pm
por 0x98364
Juego MasterMind Java necesito ayuda
Java
Rasgaroth 2 6,365 Último mensaje 1 Febrero 2015, 18:59 pm
por Usuario Invitado
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines