[U3D] - Input da mouse

Argomenti riguardanti il D3D di GameMaker e librerie esterne.
Rispondi
Avatar utente
fra3point
Membro attivo
Messaggi: 388
Iscritto il: 24/08/2010, 15:16
Specialità: Prog. e 3D Modelling
Località: L'Aquila
Contatta:

[U3D] - Input da mouse

Messaggio da fra3point »

Salve! :cappa:

Purtroppo U3D non supporta gli eventi del mouse di GM. Quindi, per creare comunque degli input da mouse ho usato uno script che usa il controllo diretto del mouse per verificare se un tasto è "pressed", "down", oppure "released".

Soltanto che succede sempre che in caso di "pressed" (ovvero quando viene premuto un tasto e poi rilasciato) non viene aggiornato lo stato del pulsante: continua a rimanere pressed all'infinito. Questo lo so perchè se io clicco a vuoto su un punto e poi, anche a distanza di tempo, sposto solamente il cursore su un punto interattivo (che controlla se il cursore è appunto su di esso), risponde come se avessi cliccato.

Ho provato ad usare funzioni come io_clear() o io_handle() per aggiornare lo stato o cancellare il buffer di input.. Ma niente..
Vi lascio lo script, forse c'è qualche errore lì.. Ma non mi sembra!
Spoiler

Codice: Seleziona tutto

//check_mouse()

var LMB,RMB;

LMB=keyboard_check_direct(mb_left);
RMB=keyboard_check_direct(mb_right);

left_pressed=false;
left_released=false;

if LMB{
  //se il tasto sinistro non era premuto nello step precedente
  if !left_down  {
    left_down=true;
    //..allora ora è pressato
    left_pressed=true;
  }
} else {
  //se era premuto..
  if left_down  {
    left_down=false;
    //...ora è rilasciato
    left_released=true;
  }
}

right_pressed=false;
right_released=false;

if RMB{
  //se il tasto destro non era premuto nello step precedente
  if !right_down  {
    right_down=true;
    //...ora è premuto
    right_pressed=true;
  }
} else {
  //se il tasto destro era premuto nello step precedente
  if right_down
  {
    right_down=false;
    //...ora è rilasciato
    right_released=true;
  }
}
draw_text(100,100,"fra3point");

Progetti in corso:
Spoiler
Tuning Paradise --> 10%

Saw: The Game --> 60%

Tropic Races --> 40%

Avatar utente
guidox
GMI Honor
Messaggi: 5765
Iscritto il: 26/07/2009, 17:23
Specialità: programmazione
Uso: GM:Studio 1.4 Android
Località: Marche
Contatta:

Re: [U3D] - Input da mouse

Messaggio da guidox »

keyboard != mouse
Immagine

Immagine

Avatar utente
fra3point
Membro attivo
Messaggi: 388
Iscritto il: 24/08/2010, 15:16
Specialità: Prog. e 3D Modelling
Località: L'Aquila
Contatta:

Re: [U3D] - Input da mouse

Messaggio da fra3point »

guidox ha scritto:keyboard != mouse


eppure si può fare! ---> keyboard_check_direct(mb_left);
draw_text(100,100,"fra3point");

Progetti in corso:
Spoiler
Tuning Paradise --> 10%

Saw: The Game --> 60%

Tropic Races --> 40%

Avatar utente
guidox
GMI Honor
Messaggi: 5765
Iscritto il: 26/07/2009, 17:23
Specialità: programmazione
Uso: GM:Studio 1.4 Android
Località: Marche
Contatta:

Re: [U3D] - Input da mouse

Messaggio da guidox »

fra3point ha scritto:
guidox ha scritto:keyboard != mouse


eppure si può fare! ---> keyboard_check_direct(mb_left);
Uh caz è vero. :lol:
Bhè allora non so dove può essere il problema... se lo provi senza u3d va, ma con u3d non va? :?
Immagine

Immagine

Avatar utente
fra3point
Membro attivo
Messaggi: 388
Iscritto il: 24/08/2010, 15:16
Specialità: Prog. e 3D Modelling
Località: L'Aquila
Contatta:

Re: [U3D] - Input da mouse

Messaggio da fra3point »

I controlli diretti con u3d funzionano perchè, appunto, eseguono un controllo hardware.. Credo che il problema sia proprio nello script.. Aggiungendo "left_down=false" all'inizio in teoria potrei far sì che lo stato si aggiorni ad ogni chiamata dello script... :|
Mah.....
draw_text(100,100,"fra3point");

Progetti in corso:
Spoiler
Tuning Paradise --> 10%

Saw: The Game --> 60%

Tropic Races --> 40%

Jak
Admin
Messaggi: 12355
Iscritto il: 19/08/2009, 16:20
Specialità: Programmazione 3D
Uso: GM:Studio 2
Contatta:

Re: [U3D] - Input da mouse

Messaggio da Jak »

direct != pressed
Time to feel, time to believe
Dare to see what may come of our future
Lift your head, broaden your gaze
Speak your mind and your thoughts they will follow you

Avatar utente
fra3point
Membro attivo
Messaggi: 388
Iscritto il: 24/08/2010, 15:16
Specialità: Prog. e 3D Modelling
Località: L'Aquila
Contatta:

Re: [U3D] - Input da mouse

Messaggio da fra3point »

Jak ha scritto:direct != pressed
Sì ma usando "direct" posso comunque risalire ad un eventuale pressed.. è quello che fa lo script in questione!
draw_text(100,100,"fra3point");

Progetti in corso:
Spoiler
Tuning Paradise --> 10%

Saw: The Game --> 60%

Tropic Races --> 40%

Avatar utente
fra3point
Membro attivo
Messaggi: 388
Iscritto il: 24/08/2010, 15:16
Specialità: Prog. e 3D Modelling
Località: L'Aquila
Contatta:

Re: [U3D] - Input da mouse

Messaggio da fra3point »

Purtroppo no, mette a disposizione solo una funzione che equivale a mouse_check_button(...), ma in questo modo posso solo vedere se il mouse è premuto in quel momento e non se è stato "pressed" cioè premuto solo nell'ultimo step. Quindi si ricorre alle funzioni a controllo diretto (quindi sempre valide) per creare script personalizzati come nel mio caso..
draw_text(100,100,"fra3point");

Progetti in corso:
Spoiler
Tuning Paradise --> 10%

Saw: The Game --> 60%

Tropic Races --> 40%

Jak
Admin
Messaggi: 12355
Iscritto il: 19/08/2009, 16:20
Specialità: Programmazione 3D
Uso: GM:Studio 2
Contatta:

Re: [U3D] - Input da mouse

Messaggio da Jak »

Ma non ho ancora capito perchè fare tutta sta storia. I normali mouse_check_button_pressed ecc(quelli non direct) funzionano egregiamente anche con U3D. Perchè devi fare tutti sti casini usando i direct? :hum:
Time to feel, time to believe
Dare to see what may come of our future
Lift your head, broaden your gaze
Speak your mind and your thoughts they will follow you

Avatar utente
BaronVsCorsar
GMI VIP
Messaggi: 4699
Iscritto il: 14/02/2004, 12:05
Specialità: Saccenza
Uso: GameMaker 8.1
Località: Ferrara
Contatta:

Re: [U3D] - Input da mouse

Messaggio da BaronVsCorsar »

per di più il check direct da ancor maggior problemi nell'essere usato per determinare i fronti di salita e discesa...
e tranne per problematiche particolari si preferisce sempre accedere all'immagine dei tasti memorizzati a "inizio ciclo" piuttosto che ai direct (certezza che non ho variazioni di input a metà step).

Ovvio che se fai un for di 10^15 cicli e vuoi dare la possibilità di abortire serve un bel checkdirect, ma altrimenti non vedo vantaggi nel suo uso :fapensare:

mi sfugge qualche cosa?
ImmagineSchiva questo - http:\\baronvscorsar.altervista.org
by Lego: Vado in un bar e faccio "votiamo che quel tizio la in fondo venga buttato fuori", ma perché?

Avatar utente
fra3point
Membro attivo
Messaggi: 388
Iscritto il: 24/08/2010, 15:16
Specialità: Prog. e 3D Modelling
Località: L'Aquila
Contatta:

Re: [U3D] - Input da mouse

Messaggio da fra3point »

Jak ha scritto:I normali mouse_check_button_pressed ecc(quelli non direct) funzionano egregiamente anche con U3D.
Ragazzi credo che è qui che sbagliate! Tutte queste funzioni non sono accettate da U3D, o comunque non funzionano:

Codice: Seleziona tutto

mouse_check_button_pressed
mouse_check_button_released
mouse_check_button
draw_text(100,100,"fra3point");

Progetti in corso:
Spoiler
Tuning Paradise --> 10%

Saw: The Game --> 60%

Tropic Races --> 40%

Avatar utente
Tizzio
GMI Honor
Messaggi: 5836
Iscritto il: 29/06/2010, 23:43
Specialità: programmazione
Contatta:

Re: [U3D] - Input da mouse

Messaggio da Tizzio »

fra3point ha scritto:
Jak ha scritto:I normali mouse_check_button_pressed ecc(quelli non direct) funzionano egregiamente anche con U3D.
Ragazzi credo che è qui che sbagliate! Tutte queste funzioni non sono accettate da U3D, o comunque non funzionano:

Codice: Seleziona tutto

mouse_check_button_pressed
mouse_check_button_released
mouse_check_button
WTF?
nella tech demo, ci sono le impostazioni ingame proiettate su un "tavolino"
e si clicca col mouse per cambiare i valori. quindi c'è un modo

Avatar utente
fra3point
Membro attivo
Messaggi: 388
Iscritto il: 24/08/2010, 15:16
Specialità: Prog. e 3D Modelling
Località: L'Aquila
Contatta:

Re: [U3D] - Input da mouse

Messaggio da fra3point »

Codice: Seleziona tutto

 if(keyboard_check_direct(mb_left) && !mouse_pressed_previous)
Questo è quello che nella tech demo viene usato per vedere se il mouse è "pressed". La variabile mouse_pressed_previous sicuramente è stata creata apposta. Come vedete viene usata una funzione direct!
draw_text(100,100,"fra3point");

Progetti in corso:
Spoiler
Tuning Paradise --> 10%

Saw: The Game --> 60%

Tropic Races --> 40%

Avatar utente
BaronVsCorsar
GMI VIP
Messaggi: 4699
Iscritto il: 14/02/2004, 12:05
Specialità: Saccenza
Uso: GameMaker 8.1
Località: Ferrara
Contatta:

Re: [U3D] - Input da mouse

Messaggio da BaronVsCorsar »

non conosco la dll quindi le mie sono solo ipotesi... ma hai provato con non il direct?
Quello potrebbe pure essere stato banalmente una scelta di chi ha preparato la demo

non capisco perchè una dll per gestire il 3d dovrebbe in qualche modo interferire con funzioni sul mouse, quindi mi sembra così strano che siano "bloccate" :hum:
non avendo senso logico l'unica spiegazione è che ci sia una "interferenza" hw tra l'accelerazione d3d e la gestione degli I/O del mouse, ma mi pare poco realistico...

qualche virtuoso della dll che faccia delle prove? Jak?
ImmagineSchiva questo - http:\\baronvscorsar.altervista.org
by Lego: Vado in un bar e faccio "votiamo che quel tizio la in fondo venga buttato fuori", ma perché?

Jak
Admin
Messaggi: 12355
Iscritto il: 19/08/2009, 16:20
Specialità: Programmazione 3D
Uso: GM:Studio 2
Contatta:

Re: [U3D] - Input da mouse

Messaggio da Jak »

Ho appena provato ed è vero. Il click del mouse viene in qualche modo inibito :fapensare:
Eppure mi ricordavo che usavo gli eventi del mouse tempo fa :fapensare:
Sto guardando se cè qualche script che usa io_clear o simili ma mi pare strano che u3d rompa i maroni in questo modo. Cosa avevano in testa i programmatori? Segatura? :fapensare:
Time to feel, time to believe
Dare to see what may come of our future
Lift your head, broaden your gaze
Speak your mind and your thoughts they will follow you

Avatar utente
fra3point
Membro attivo
Messaggi: 388
Iscritto il: 24/08/2010, 15:16
Specialità: Prog. e 3D Modelling
Località: L'Aquila
Contatta:

Re: [U3D] - Input da mouse

Messaggio da fra3point »

Ho visto molte volte sul forum di u3d e le uniche soluzioni consigliate sono proprio quelle con le funzioni direct. Comunque ora con script appositi sono riuscito alla meno peggio a gestire il mouse. Certo è un lavoro un po' scomodo da fare ma alla fine funziona..

@jak: Anche io ho provato a manipolare in svariati modi il buffer di input del mouse, purtroppo con scarsi risultati. L'unica funzione che mette a disposizione U3D per il mouse è MouseCheckButton(MouseButton) che però non verifica la condizione di "pressed" ma solo quella di "currently down".

Questa è la spiegazione dell'autore:

Codice: Seleziona tutto

MouseCheckButton(MouseButton)
//mouse_check_button doesn't work correctly when Ultimate 3D is being used.
//For that reason you have to use this function instead.
EDIT: In effetti ho notato che questa funzione di U3D non è altro che una direct; infatti ritorna la funzione keyboard_check_direct:

Codice: Seleziona tutto

// MouseCheckButton(MouseButton)
// mouse_check_button doesn't work correctly when Ultimate 3D is being 
// used. For that reason you have to use this function instead.
return keyboard_check_direct(argument0);
draw_text(100,100,"fra3point");

Progetti in corso:
Spoiler
Tuning Paradise --> 10%

Saw: The Game --> 60%

Tropic Races --> 40%

Avatar utente
BaronVsCorsar
GMI VIP
Messaggi: 4699
Iscritto il: 14/02/2004, 12:05
Specialità: Saccenza
Uso: GameMaker 8.1
Località: Ferrara
Contatta:

Re: [U3D] - Input da mouse

Messaggio da BaronVsCorsar »

bhe, senza usare il direct ti basta nell'oggetto controller in end step

previous_mouse[mousebutton]= MouseCheckButton(MouseButton); //variabile privata da non essere usata per nessun altro scopo e da nessun altro oggetto

in begin step (pseudocodice):

Codice: Seleziona tutto

for mousebutton
{
 if (MouseCheckButton(MouseButton) && previous_mouse[mousebutton]==false)
 { global.mouse_pressed[MouseButton]= true; }
 else
 falsifica mouse_pressed
}
ed analogo per il rilascio.
INUTILE dire che in create del contorller dichiari tutte le variabili che userai.
ed ovviamente sarebbe più che opportuno avere il controller sempre con l'id più basso.
ImmagineSchiva questo - http:\\baronvscorsar.altervista.org
by Lego: Vado in un bar e faccio "votiamo che quel tizio la in fondo venga buttato fuori", ma perché?

Avatar utente
fra3point
Membro attivo
Messaggi: 388
Iscritto il: 24/08/2010, 15:16
Specialità: Prog. e 3D Modelling
Località: L'Aquila
Contatta:

Re: [U3D] - Input da mouse

Messaggio da fra3point »

E' un'alternativa ai miei script (forse anche più veloce)! Vedo di provare anche così.. Poi vedrò quale soluzione è la migliore! Grazie Baron!
draw_text(100,100,"fra3point");

Progetti in corso:
Spoiler
Tuning Paradise --> 10%

Saw: The Game --> 60%

Tropic Races --> 40%

Avatar utente
CaMpIoN
Membro super
Messaggi: 684
Iscritto il: 17/11/2009, 16:20
Specialità: Programmatore
Uso: GM:Studio 1.4 Master
Contatta:

Re: [U3D] - Input da mouse

Messaggio da CaMpIoN »

Se hai solo l'evento mouse_check_button e non il pressed, un'alternativa potrebbe essere quella di usare due variabili in più, una per il controllo del check pressed e una per il controllo del check button, ecco un'esempio:

http://www.mediafire.com/?dcftrb5475a5f0t
Giochi da me creati:
Spoiler
Immagine

Rispondi

Chi c’è in linea

Visitano il forum: Nessuno e 31 ospiti