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
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
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.
¿ No sería incluso más facil colocar una imagen con el handle en medio justo en la posición del ratón ?
Dudo que haya muchas cosas mas faciles que poner un par de LineTo() en una ventanita.... -_-
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.
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í : ).
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
¿ Está todo ese codigo en el bucle principal ?
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.
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) .
Te he creado un pequeño ejemplo donde (creo) hago lo que quieres.
DescargarEl 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.
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.
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.
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.
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) .
(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...
Tienes que activar el "blending" antes de dibujar las lineas.
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)
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.
: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!!!