Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Dibujar Lineas

Iniciado por SkyNetBCN, 19 de Febrero de 2005, 03:35:14 PM

« anterior - próximo »

SkyNetBCN

 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

vicho

 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

_Grey

 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.

Sacrifai

 ¿ No sería incluso más facil colocar una imagen con el handle en medio justo en la posición del ratón ?

_Grey

 Dudo que haya muchas cosas mas faciles que poner un par de LineTo() en una ventanita.... -_-  

BeRSeRKeR

 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.
¡Si te buscan en nombre de la ley, huye en nombre de la libertad!!

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í : ).

SkyNetBCN

 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  

Sacrifai

 ¿ Está todo ese codigo en el bucle principal ?

MA]Mestre

 
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.

Sacrifai

 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)  .

BeRSeRKeR

 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.
¡Si te buscan en nombre de la ley, huye en nombre de la libertad!!

Loover

 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.
IndieLib Libreria 2.5d utilizando aceleración por hardware para la programación de juegos 2d.
Indie Rover The monkeys are reading!

BeRSeRKeR

 
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.
¡Si te buscan en nombre de la ley, huye en nombre de la libertad!!

BeRSeRKeR

 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.
¡Si te buscan en nombre de la ley, huye en nombre de la libertad!!






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.