Foros - Stratos

Programadores => Programación gráfica => Mensaje iniciado por: SkyNetBCN en 19 de Febrero de 2005, 03:35:14 PM

Título: Dibujar Lineas
Publicado por: SkyNetBCN en 19 de Febrero de 2005, 03:35:14 PM
 Buenas! Perdonad mi ignorancia sobre este tema (soy novato... y la pregunta es un poco triste... :P ). Quiero hacer que en el menú de uno de mis juegos pase lo siguiente: captar en todo momento en qué posicion está el ratón y trazar 4 líneas, una para arriba, otra para abajo,otra para la izquierda y otra para la derecha, y que el punto de interseccion de estas sea el punto en el que está el ratón? Me he explicado bien?? jeje (ole) .
Espero que me puedan ayudar... GRACIAS
Título: Dibujar Lineas
Publicado por: vicho en 19 de Febrero de 2005, 03:54:56 PM
 algo como lo que hace el doom 3?, no es complicado pero no se entiende donde es que topas, osea donde tiene s el problema
Título: Dibujar Lineas
Publicado por: _Grey en 19 de Febrero de 2005, 03:59:18 PM
 Pues vendria bien algo mas de informacion.

Podriamos dejarlo en 2 lineas :P para empezar, y lo que respecta a los datos tecnicos.... bueno, si estas programando para Win32, puedes saber cual es la posicion del raton con GetCursorPos(), o controlarla capturando los mensajes de WM_MOUSEMOVE, que se envian a la funcion de proceso de mensajes de la ventana, esta ultima forma puede interesarte mas por que te dara las coordenadas dentro de la ventana no en coordenadas de pantalla como la primera.

Para dibujar las lineas usa las funciones de GDI de window, usa GetDC en la documentacion de VisualC++ y tendras la puerta a todo el cotarro.

y si era para DirectX, pues en la documentacion de Dx en DirectInput encontraras lo que busques.... para dibujar la linea tendras mas complicaciones.

Saludos, espero que sea eso.
Título: Dibujar Lineas
Publicado por: Sacrifai en 19 de Febrero de 2005, 04:06:44 PM
 ¿ No sería incluso más facil colocar una imagen con el handle en medio justo en la posición del ratón ?
Título: Dibujar Lineas
Publicado por: _Grey en 19 de Febrero de 2005, 04:13:06 PM
 Dudo que haya muchas cosas mas faciles que poner un par de LineTo() en una ventanita.... -_-  
Título: Dibujar Lineas
Publicado por: BeRSeRKeR en 19 de Febrero de 2005, 04:25:15 PM
 En realidad son dos líneas las que tienes que dibujar, una vertical y otra horizontal. Para dibujar la vertical sólo necesitas saber la posición X del ratón y entonces dibujar la línea con esa X y con las Ys necesarias para que la línea cruce toda la pantalla (a lo alto). En el caso de la línea horizontal es igual salvo que la coordenada del ratón que necesitas es la Y, después no tienes más que utilizar las coordenadas mínima y máxima de tu ventana en el eje X.

Por ejemplo, si tu ventana es de 800x600, las coordenadas serían:

LineaVerticalPunto1 = (RatonX, 0)
LineaVerticalPunto2 = (RatonX, 600)

LineaHorizontalPunto1 = (0, RatonY)
LineaHorizontalPunto2 = (800, RatonY)

Cómo dibujes las líneas depende que qué estés utilizando. Si estás utilizando algún API3D tal como Direct3D u OpenGL, las líneas no serían más que polígonos rectangulares con las coordenadas que he puesto antes y con el grosor y el color que tú quieras.

Saludos.
Título: Dibujar Lineas
Publicado por: Sacrifai en 19 de Febrero de 2005, 04:35:56 PM
 
Cita de: "_Grey"Dudo que haya muchas cosas mas faciles que poner un par de LineTo() en una ventanita.... -_-
Entoces que es lo que le falla  (ole)  . Por cierto, creía que lo que querías era una imagen de mouse, pero al leer el post de berseker comprendí : ).
Título: Dibujar Lineas
Publicado por: SkyNetBCN en 20 de Febrero de 2005, 11:31:11 AM
 Vamos a ver... es que creo (es evidente) que hago algo mal... utilizo estre trozo de código... pero éste tiene 2 problemas:
a) Sólo me dibuja líneas horizontales de izquierda a derecha, ni me hace lineas verticales ni nada de nada...
B) Me dibuja las lineas(aunk mal) sólo la primera vez que pasa por la función render(), despues aunque mueva el ratón no se me actualizan las coordenadas de la líneas... y éstas se quedan como estáticas en la pantalla.... (nooo)

ID3DXLine *linea ;
if (S_OK == D3DXCreateLine(m_pd3dDevice,&linea))
{
       linea->SetWidth(3);
       POINT ptCursor;
       GetCursorPos( &ptCursor );

D3DXVECTOR2 *LineaVertical1 = new D3DXVECTOR2((float)ptCursor.x, 0.0f);
D3DXVECTOR2 *LineaVertical2 = new D3DXVECTOR2((float)ptCursor.x, (DWORD)GetSystemMetrics(SM_CYSCREEN));
D3DXVECTOR2 *LineaHorizontal1 = new D3DXVECTOR2(0, (float)ptCursor.y);
D3DXVECTOR2 *LineaHorizontal2 = new D3DXVECTOR2((DWORD)GetSystemMetrics(SM_CXSCREEN), (float)ptCursor.y);
            
  linea->Begin();
   linea->Draw( LineaVerticalPunto1, 2, D3DXCOLOR( 1.0f, 1.0f, 1.0f, 1.0f ) );
   linea->Draw( LineaVerticalPunto2, 2, D3DXCOLOR( 1.0f, 1.0f, 1.0f, 1.0f ) );
   linea->Draw( LineaHorizontalPunto1, 2, D3DXCOLOR( 1.0f, 1.0f, 1.0f, 1.0f ) );
   linea->Draw( LineaHorizontalPunto2, 2, D3DXCOLOR( 1.0f, 1.0f, 1.0f, 1.0f ) );

   linea->End();         
} :P  
Título: Dibujar Lineas
Publicado por: Sacrifai en 20 de Febrero de 2005, 12:27:58 PM
 ¿ Está todo ese codigo en el bucle principal ?
Título: Dibujar Lineas
Publicado por: MA]Mestre en 20 de Febrero de 2005, 12:44:25 PM
 
Cita de: "Sacrifai"
Cita de: "_Grey"Dudo que haya muchas cosas mas faciles que poner un par de LineTo() en una ventanita.... -_-
Entoces que es lo que le falla  (ole)  . Por cierto, creía que lo que querías era una imagen de mouse, pero al leer el post de berseker comprendí : ).
?¿

No recuerdo como es el del Doom3, pero vamos creo que se os va la olla. Con canviar el puntero del mouse va que chuta. Ademas es más facil que el LineTo(), aunque este ya es muy facil...

a.)
Nuevo -> Recurso -> Cursor ( lo dibujas o lo importas )

b.) Incluyes en tu proyecto el include generado del recurso...

#include "resource.h"

c.)
En la estructura WNDCLASSEX, cuando estas registrando tu ventana...

xxx.hCursor= MAKEINTRESOURCE ( #IDC_DE_TU_CURSOR )

Un saludo.
Título: Dibujar Lineas
Publicado por: Sacrifai en 20 de Febrero de 2005, 12:58:38 PM
 MA]Mestre te ha pasado igual que a mi. Creí que era un simple crosshair, pero resulta que son dos lineas que cruzan todo la pantalla. Algo así como un plotter o las maquinas con gancho  (uoh)  .
Título: Dibujar Lineas
Publicado por: BeRSeRKeR en 20 de Febrero de 2005, 04:27:02 PM
 Te he creado un pequeño ejemplo donde (creo) hago lo que quieres.

Descargar

El código que he añadido está marcado con un cometario que pone BeRSeRKeR así que con buscar esa palabra verás el código necesario.

Saludos.
Título: Dibujar Lineas
Publicado por: Loover en 20 de Febrero de 2005, 04:44:07 PM
 Yo de tí separaría el código de dibujar una línea en una función.

Con direct 3d puedes hacerlo así:

Citar// Pixel
   struct structPixel
   {
  // Posición
  float mX, mY, mZ;

  // Color
  DWORD mColor;
   };
   typedef struct structPixel PIXEL;
   #define D3DFVF_PIXEL (D3DFVF_XYZ | D3DFVF_DIFFUSE)

Citar/*
==================
Rellena una estructura PIXEL
==================
*/
inline void LOV_Render::FillPixel   (PIXEL *pPixel,
         int pX,
         int pY,
         byte pR,
         byte pG,
         byte pB)
{
   // Pixel
   pPixel->mX  = (float) pX;
   pPixel->mY  = (float) pY;
   pPixel->mZ  = (float) 0.0f;
   pPixel->mColor   = D3DCOLOR_RGBA (pR, pG, pB, 255);
}

Citarinline void LOV_Render::BlitLine   (int pX1,
         int pY1,
         int pX2,
         int pY2,
         byte pR,
         byte pG,
         byte pB)
{
   // Rellenamos las estructuras PIXEL
   FillPixel (&mPixels
  • , pX1, pY1, pR, pG, pB);
       FillPixel (&mPixels [1], pX2, pY2, pR, pG, pB);

       // Color
       mInfo.mDevice->SetTextureStageState (0, D3DTSS_COLORARG1, D3DTA_DIFFUSE);

       // Formato de pixel
       mInfo.mDevice->SetFVF (D3DFVF_PIXEL);
       
       // Dibujamos la línea
       mInfo.mDevice->SetFVF (D3DFVF_PIXEL);
       mInfo.mDevice->DrawPrimitiveUP (D3DPT_LINESTRIP, 1, &mPixels, sizeof (PIXEL));
    }
Luego ya es tán facil como hacer un:

BlitLine (mouse.x, 0, mouse.x, alto_ventana, color)
BlitLine (0, mouse.y, ancho_ventana, mouse.y, color)

Claro que si prefieres usar la D3DX, pues ya es cosa tuya. Yo prefiero usar mis propias primitivas.


PD: Berserker, el "lines.exe" se me abre y se me cierra sin ejecutarse.
Título: Dibujar Lineas
Publicado por: BeRSeRKeR en 20 de Febrero de 2005, 05:07:20 PM
 
Cita de: "Loover"PD: Berserker, el "lines.exe" se me abre y se me cierra sin ejecutarse.
Pues no sé, está basado en el segundo tutorial que viene con el SDK de DX así que más simple imposible, además no cargo ningún recurso así que es raro... :D

A ver si al interesado le pasa lo mismo. De todas formas el código está ahí.

Saludos.
Título: Dibujar Lineas
Publicado por: BeRSeRKeR en 20 de Febrero de 2005, 05:18:52 PM
 Por cierto, no sé si ese código que has puesto del método BlitLine es realmente el de tu librería, si es así, fíjate que estás especificando el formato de vértice dos veces.

Cita de: "Loover"
Citarinline void LOV_Render::BlitLine   (int pX1,
         int pY1,
         int pX2,
         int pY2,
         byte pR,
         byte pG,
         byte pB)
{
   // Rellenamos las estructuras PIXEL
   FillPixel (&mPixels
  • , pX1, pY1, pR, pG, pB);
       FillPixel (&mPixels [1], pX2, pY2, pR, pG, pB);

       // Color
       mInfo.mDevice->SetTextureStageState (0, D3DTSS_COLORARG1, D3DTA_DIFFUSE);

       // Formato de pixel
       mInfo.mDevice->SetFVF (D3DFVF_PIXEL);
       
       // Dibujamos la línea
       mInfo.mDevice->SetFVF (D3DFVF_PIXEL);
       mInfo.mDevice->DrawPrimitiveUP (D3DPT_LINESTRIP, 1, &mPixels, sizeof (PIXEL));
    }

Saludos.
Título: Dibujar Lineas
Publicado por: SkyNetBCN en 20 de Febrero de 2005, 10:54:41 PM
 Buenas!!!  :D .  Gracias por el código de ejemplo BeRSeRKeR. Joer, mira que era sencillo y me estaba complicando la vida de mala manera... ma ido genial lo que me has enviado... muchas gracias...  (ole) .
Título: Dibujar Lineas
Publicado por: SkyNetBCN en 22 de Febrero de 2005, 01:30:57 PM
  (nooo)  pero una cosa... como puedo añadir transparencia a esas líneas ? me interesa que cuando el usuario deje de mover el ratón empiecen a desaparecer las líneas. Cambio el valor del alpha del color de la líne (pensaba que se hacía así... :P )  pero no funciona...
Título: Dibujar Lineas
Publicado por: Lord Trancos 2 en 22 de Febrero de 2005, 02:38:46 PM
 Tienes que activar el "blending" antes de dibujar las lineas.
Título: Dibujar Lineas
Publicado por: SkyNetBCN en 22 de Febrero de 2005, 04:28:32 PM
 Ke va... activo "blending" pero la linea sólo tiene 2 estados... o se ve o no se ve... incluso si cambio el color de las líneas durante la ejecución del progrma, estas se me ven sólo del primer color que las había puesto... no me cambian... (nooo)  
Título: Dibujar Lineas
Publicado por: BeRSeRKeR en 22 de Febrero de 2005, 06:20:14 PM
 Activando el alpha blending y especificando la componente alpha en el color de la línea tiene que funcionar sí o sí. Seguramente no has especificado el modo de blending correcto.

Aquí tienes una ejemplo basado en el anterior que te puse.

Por cierto, al que no le vaya la aplicación puede ser porque no tenga instalada la versión de Diciembre o posterior de las DX.

Saludos.
Título: Dibujar Lineas
Publicado por: SkyNetBCN en 22 de Febrero de 2005, 09:25:11 PM
  :P ,jeje, pués supongo que era el
              m_pd3dDevice->SetRenderState(D3DRS_SRCBLENDALPHA, D3DBLEND_SRCALPHA);
porque era lo único que me faltaba comparndolo con tu código... joer... una cosa... como ya veis soy novato y necesito que me recomendeis algún libro de Direct3D que esté muy bien... Os lo agradecería...
Un Saludo!!!