Orario: 22-05-2013, 15:11 Benvenuto ospite! (Log inRegistrati)


Rispondi 
XNA in una windows form...e problemi con le cordinate del mouse
Autore Messaggio
MarkSkyzoid
Senior Member

Messaggi: 614
Registrato: Feb 2010
Offline Offline
#1 XNA in una windows form...e problemi con le cordinate del mouse
0
Ciao ragazzi,
sto creando un editor di livelli che permette di spostare gli sprites liberamente(quindi free tiles)...
ho passato il rendering di xna in una picture box all'interno di una windows form...
ho inoltre creato delle classi per gli sprite e una classe che gestisce le entità(sprite e proprietà) che l'editor permette di posizionare, ruotare ecc...
Adesso devo fare in modo che passando il mouse su un'entità questa possa essere selezionata...per fare questo ho creato un metodo intersect sia nella classe sprite(per gestire l'intersect a livello di texture) e sia nella classe entity(per far cambiare colore allo sprite ed eseguire altre operazioni)...
i due metodi sono questi:
Codice nella classe sprite:
Codice:
public bool Intersect(Vector2 mouseHit)
        {
            Vector2 min = Position - Size/2;
            Vector2 max = Position + Size/2;
          
            bool result = false;
            
            if (mouseHit.X >= min.X && mouseHit.X <= max.X && mouseHit.Y >= min.Y && mouseHit.Y <= max.Y)
            {
                result = true;
            }
            
            Console.WriteLine("X:" + mouseHit.X);
            Console.WriteLine("Y:" + mouseHit.Y);

            return result;
        }

Codice nella classe Entity:
Codice:
public void MouseIntersect()
        {
            MouseState curMouseState = Mouse.GetState();

            Vector2 mouseHit = new Vector2(curMouseState.X, curMouseState.Y);

            if (Sprite.Intersect(mouseHit))
            {
                Sprite.Sprite.Tint = Color.Red;
            }
            else
            {
                Sprite.Sprite.Tint = Color.White;
            }
        }

Il problema è che le coordinate del mouse sono sballate...
l'intersect avviene in posizioni errate e se la finestra viene spostata le cordinate di intersezione cambiano...
Detto questo suppongo che il tutto sia legato alla posizione della finestra nello schermo...il problema è che non riesco a trovare una formula di traslazione dei valori adeguata...
se avete bisogno vi posto anche qualche screen!
Chiedo ai Maestri dell'arte dell'XNA di intervenire XD
a presto!

www.itsmarco.com

Marco Vallario
(Questo messaggio è stato modificato l'ultima volta il: 29-06-2010 16:46 da MarkSkyzoid.)
29-06-2010 16:45
Visita il sito web di questo utente Trova tutti i messaggi di questo utente Cita questo messaggio nella tua risposta
viper
Coder

Messaggi: 48
Registrato: Apr 2010
Offline Offline
#2 RE: XNA in una windows form...e problemi con le cordinate del mouse
0
Ricordi che ebbi qualche problemino simile al tuo quando realizzai la gestione del picking per il nostro editor interno. Tutt'ora credo che la soluzione adottata non sia del tutto "ottimale" (sai com'è...i tempi che stringono etc..).
Potrebbe essere interessante un confronto sull'argomento che hai sollevato..dammi soltanto il tempo di rinfrescarmi la memoria riguardando un'attimino le porzioni di codice interessato..e ne riparliamo Occhiolino

Francesco Guastella
29-06-2010 17:27
Visita il sito web di questo utente Trova tutti i messaggi di questo utente Cita questo messaggio nella tua risposta
MarkSkyzoid
Senior Member

Messaggi: 614
Registrato: Feb 2010
Offline Offline
#3 RE: XNA in una windows form...e problemi con le cordinate del mouse
0
(29-06-2010 17:27)viper ha scritto:  Ricordi che ebbi qualche problemino simile al tuo quando realizzai la gestione del picking per il nostro editor interno. Tutt'ora credo che la soluzione adottata non sia del tutto "ottimale" (sai com'è...i tempi che stringono etc..).
Potrebbe essere interessante un confronto sull'argomento che hai sollevato..dammi soltanto il tempo di rinfrescarmi la memoria riguardando un'attimino le porzioni di codice interessato..e ne riparliamo Occhiolino
allora attendo una risposta Smile

www.itsmarco.com

Marco Vallario
29-06-2010 17:28
Visita il sito web di questo utente Trova tutti i messaggi di questo utente Cita questo messaggio nella tua risposta
XEVIAN
Posting Freak

Messaggi: 957
Registrato: Jan 2010
Offline Offline
#4 RE: XNA in una windows form...e problemi con le cordinate del mouse
0
Alò! In realtà è molto semplice (è come hai detto tu). Mouse.GetState() ritorna la posizione del cursore del mouse all'interno dell'intero desktop di windows (del monitor corrente, se hai più monitor).
Quindi a quel valore devi sottrarre la posizione della form all'interno del desktop (Form.Location.X) e poi anche la posizione del controllo che usi per xna all'interno della form (PictureBox.Location.X o quello che è).
Ecco, così va. Probabilmente avrai qualche problema con la Y dato che non sai quanto è alta la barra della fnestra. Beh, fai qualche prova e vedi Asd

Se invece usi un controllo creato appositamente e non una picturebox (come documentato nel sample "WinFormsGraphicsDeviceSample"), puoi fare l'override della MouseMove e prenderti direttamente le coordinate giuste del mouse all'interno del controllo.

XeviaN - Christian Meneghini
STUDIOEVIL.com
Help Syder Arcade getting on Steam Greenlight Smile
FB TW tw YT iDB
01-07-2010 21:55
Visita il sito web di questo utente Trova tutti i messaggi di questo utente Cita questo messaggio nella tua risposta
viper
Coder

Messaggi: 48
Registrato: Apr 2010
Offline Offline
#5 RE: XNA in una windows form...e problemi con le cordinate del mouse
0
Eccomi qua..perdonate il ritardo..purtroppo in questi giorni non ho avuto granché la possibilità di stare al pc.
Il problema di cui soffriva il mio picking era uno "strano" offset tra posizione del cursore e oggetto nella scena...che aumentava man mano che mi allontanavo sempre più dall'origine degli assi.
Con la scusa di questo thread, ho riguardato il codice, e ho notato un errore assurdo che non so da dove saltasse fuori...in pratica calcolavo due volte ( O_o ) la posizione dell'oggetto da trascinare, e la seconda volta creando un Vector2 a partire dalle coordinate di MouseEventArgs..bah

Ad ogni modo..ho provato a far come consigliavi tu Xevian, e da me la cosa funonzia abbastanza bene Occhiolino

Francesco Guastella
01-07-2010 23:43
Visita il sito web di questo utente Trova tutti i messaggi di questo utente Cita questo messaggio nella tua risposta
MarkSkyzoid
Senior Member

Messaggi: 614
Registrato: Feb 2010
Offline Offline
#6 RE: XNA in una windows form...e problemi con le cordinate del mouse
0
benissimo ragazzi! Grazie mille! provo a vi faccio sapere...magari torna utile a qualcun altro Smile
bene pare che io abbia trovato una soluzione...
il vettore che passo è questo:
Codice:
Vector2 mouseHit = new Vector2(System.Windows.Forms.Cursor.Position.X - form.Location.X - drawSurfaceX + Sprite.Position.X/2, System.Windows.Forms.Cursor.Position.Y - form.Location.Y - drawSurfaceY);
Non chiedetemi perchè io abbia aggiunto la posizione dello sprite diviso 2 alla X...
inoltre drawSurfaceX e drawSurfaceY rappresentano le coordinate della picture box
EDIT: Ho fatto altre prove spostando le entità...e ci sono ancora errori...riuscirò ad uscirne?

www.itsmarco.com

Marco Vallario
(Questo messaggio è stato modificato l'ultima volta il: 02-07-2010 1:30 da MarkSkyzoid.)
02-07-2010 0:39
Visita il sito web di questo utente Trova tutti i messaggi di questo utente Cita questo messaggio nella tua risposta
XEVIAN
Posting Freak

Messaggi: 957
Registrato: Jan 2010
Offline Offline
#7 RE: XNA in una windows form...e problemi con le cordinate del mouse
0
Huh Fermofumo

Beh, dunque, la posizione del mouse corretta è quella (senza sprite/2), però se vuoi Pikkare gli sprite al centro, quando fai il test della posizione del mouse verso ogni sprite, devi aggiungere Sprite.Width/2 e Sprite.Height/2.

Scusa ma fai così: fatti una label a parte sul Form. Sull'evento OnMouseMove della tua picture, scrivi dentro alla label le coordinate che ti escono dalla MouseHit. Così quando muovi il mouse vedi in realtime le coordinate e capisci se sono giuste. Se ti ritorna (0,0) nell'angolo sx superiore e ti ritorna la larghezza e l'altezza corrette della picture nell'angolo inferiore dx, la funzione è corretta.

Poi sistemi il pick.
Poi se vuoi fare un pick ultra figo (per pixel, con l'alpha) potresti fare un'altra cosa che di solito si fa.
Renderizzi gli sprite su un altro rendertarget. Ogni sprite lo devi disegnare MONOCOLORE (con la spritebatch fai presto) ed ogni sprite deve essere di un colore diverso. Ti tieni una mappa (una lista, un array, quello che ti pare) in cui ad ogni colore associ uno sprite. Quando fai il pick, in realtà lo fai su quel rendertarget (che deve avere però le stesse dimensioni della picturebox). Guardi di che colore è il pixel che hai cliccato e ti ricavi lo sprite.
E' un pò articolata, ma è il modo più "comodo" per fare un picker al pixel Occhiolino

XeviaN - Christian Meneghini
STUDIOEVIL.com
Help Syder Arcade getting on Steam Greenlight Smile
FB TW tw YT iDB
(Questo messaggio è stato modificato l'ultima volta il: 02-07-2010 9:04 da XEVIAN.)
02-07-2010 8:58
Visita il sito web di questo utente Trova tutti i messaggi di questo utente Cita questo messaggio nella tua risposta
MarkSkyzoid
Senior Member

Messaggi: 614
Registrato: Feb 2010
Offline Offline
#8 RE: XNA in una windows form...e problemi con le cordinate del mouse
0
Il problema è l'organizzazione del codice...
il Vector2 mouseHit sta all'interno della classe entity quindi non ho accesso diretto agli eventi del form...e alla label...il MouseMove non l'ho proprio utilizzato!
Comunque faccio altre prove...

www.itsmarco.com

Marco Vallario
02-07-2010 10:00
Visita il sito web di questo utente Trova tutti i messaggi di questo utente Cita questo messaggio nella tua risposta
miniBill
Posting Freak

Messaggi: 1,700
Registrato: Nov 2008
Offline Offline
#9 RE: XNA in una windows form...e problemi con le cordinate del mouse
0
(02-07-2010 10:00)MarkSkyzoid ha scritto:  Il problema è l'organizzazione del codice...
il Vector2 mouseHit sta all'interno della classe entity quindi non ho accesso diretto agli eventi del form...e alla label...il MouseMove non l'ho proprio utilizzato!
Comunque faccio altre prove...

Pattern!
Usa mvc: tu hai la view che è il tuo rendertarget, il model che sono le entity e crei un controller che abbia conoscenza di entrambi. in questo modo il model non è legato alla view, ma il controller è il solo a conoscere tutto

Nōkírå Zizi
02-07-2010 13:28
Visita il sito web di questo utente Trova tutti i messaggi di questo utente Cita questo messaggio nella tua risposta
MarkSkyzoid
Senior Member

Messaggi: 614
Registrato: Feb 2010
Offline Offline
#10 RE: XNA in una windows form...e problemi con le cordinate del mouse
0
devo studiarli questi pattern sìsì Smile appena posso do un'occhiata

www.itsmarco.com

Marco Vallario
02-07-2010 14:15
Visita il sito web di questo utente Trova tutti i messaggi di questo utente Cita questo messaggio nella tua risposta
gabry90
Junior Member

Messaggi: 29
Registrato: May 2012
Offline Offline
#11 RE: XNA in una windows form...e problemi con le cordinate del mouse
0
ma scusa. se vuoi la proprietà intersect perchè non usi quella dei rettangoli?
guarda. e semplice. ottieni il rettangolo del mouse, il rettangolo delle tue entity e con una proprietà intersect fa gia tutto da solom senza star a prendere coordinate del mouse ect.
es:

if (mouseRectangle.Intersects(entityRectangle)) { fai la selezione }

tutto qua Smile

p.S ovviamente questo metodo prende l'intersezione del rettangolo, se tu hai un'immagine non rettangolare come sprite devi fare un controllo dopo l'intersezione normale un ulteriore controllo per pixel ma questi sono solo dettagli Smile
15-05-2012 11:21
Trova tutti i messaggi di questo utente Cita questo messaggio nella tua risposta
MarkSkyzoid
Senior Member

Messaggi: 614
Registrato: Feb 2010
Offline Offline
#12 RE: XNA in una windows form...e problemi con le cordinate del mouse
0
ma scusa, hai visto la data dell'ultimo messaggio?

www.itsmarco.com

Marco Vallario
15-05-2012 13:32
Visita il sito web di questo utente Trova tutti i messaggi di questo utente Cita questo messaggio nella tua risposta
Rispondi 


Vai al forum: