3D compatibile con Head Eye mouse

Argomenti riguardanti il D3D di GameMaker e librerie esterne.
Rispondi
gius
Newbie
Messaggi: 23
Iscritto il: 22/04/2009, 19:57
Contatta:

3D compatibile con Head Eye mouse

Messaggio da gius »

Salve a tutti,
ho iniziato da poco a programmare con GM.
Ho la versione registrata GM7,
sto seguendo il "Game Maker Tutorial A First Person Shooter Written by Mark Overmars"
e mi chiedevo se è possibile muovere la camera
con il muose, ovvero la direzione del movimento è controllata dalla posizione del mouse sullo schermo, esempio: mouse sul bordo superiore = avanti; mouse sul bordo destro = ruota a destra ecc...;
questo perchè desidero creare un semplice software compatibile con gli Head Eye mouse

grazie

Gius

Avatar utente
maz85
Admin
Messaggi: 8287
Iscritto il: 07/02/2004, 15:57
Specialità: Nientologo
Località: Oblio
Contatta:

Re: 3D compatibile con Head Eye mouse

Messaggio da maz85 »

Mi stai parlando di bordi e non di mouselook quindi puoi creare una 'zona sensibile' per il mouse.
Essendo che la 'vista 3d' è la grandezza della stanza (o della vista) mettiamo un bordo di 20 pixel sotto controllo:

se mouse_x < 20 (pixel) -> rotazione a sinistra
se mouse_x > grandezzaorizzontalevista-20 -> rotazione a destra
se mouse_y< 20 -> rotazione verticale verso l'alto
se mouse_y> grandezzaverticalevista-20 -> rotazione verticale verso il basso

Così si includono anche le zone a doppio controllo (quelle di sovrapposizione tra i due controlli) in cui per esempio puntando nell'angolo sinistro-alto la telecamera si ruoterà verso sinistra e verso l'alto.

gius
Newbie
Messaggi: 23
Iscritto il: 22/04/2009, 19:57
Contatta:

Re: 3D compatibile con Head Eye mouse

Messaggio da gius »

Grazie maz85 per la tua utile risposta.
Nel tradurre il tuo concetto, noto le mie fragili basi di programmazione.
Con gli esempi .gm che si possono trovare nel
"Game Maker Tutorial A First Person Shooter Written by Mark Overmars"
deduco che bisognerà inserire il tutto in CREATE in obj_player, mi sbaglio?
poi credo che il primo script possa essere:
{

if (mouse_x < 20)
{direction += 3;} //rotazione a sinistra
}
ma francamente gli altri non riesco a desumerli,
potresti gentilmente aiutarmi a capire?

davvero grazie

Avatar utente
maz85
Admin
Messaggi: 8287
Iscritto il: 07/02/2004, 15:57
Specialità: Nientologo
Località: Oblio
Contatta:

Re: 3D compatibile con Head Eye mouse

Messaggio da maz85 »

Se li metti nel create quei controlli verranno eseguiti solo alla creazione dell'oggetto, quindi mettili su Step. Per il controllo è giusto quello che hai fatto, adesso ti mancano solo gli altri che puoi desumere da quel che ti ho scritto: grandezzaverticalevista e grandezzaorizzontalevista sono in pratica le dimensioni della stanza, se 640 è la grandezza orizzontale e il bordo scelto è 20 pixel ne dedurrà che se mouse_x è maggiore di 620 allora direzione->sinistra. ;)

gius
Newbie
Messaggi: 23
Iscritto il: 22/04/2009, 19:57
Contatta:

Re: 3D compatibile con Head Eye mouse

Messaggio da gius »

Ancora grazie maz85 per la tua risposta.

Se credo di aver capito nell'obj_player
dopo CREATE devo inserire STEP, corretto?
dopo inserisco lo script

{

if (mouse_x < 20)
{direction += 3;} //rotazione a sinistra
if (mouse_x > 620)
{direction -= 3;} //rotazione a destra
if (mouse_y > 420) // indietro
{ var maxspeed;
maxspeed = 3 else maxspeed = 1.5;
if (speed > -maxspeed) speed = max(-maxspeed,speed-0.4);
}
if (mouse_y < 20) // avanti
{ var maxspeed;
maxspeed = 3 else maxspeed = 1.5;
if (speed < maxspeed ) speed = min(maxspeed ,speed+0.4);
}

dovrebbe essere corretto?

ancora grazie

gius
Newbie
Messaggi: 23
Iscritto il: 22/04/2009, 19:57
Contatta:

Re: 3D compatibile con Head Eye mouse

Messaggio da gius »

Scusate ma era errata la precedente ipotesi,
quella corretta che funziona è la seguente:
STEP
{

if (mouse_x < 60)
{direction += 3;} //rotazione a sinistra
if (mouse_x > 580)
{direction -= 3;} //rotazione a destra
if (mouse_y > 380) // indietro
{ var maxspeed;

if keyboard_check(vk_shift) maxspeed = 3 else maxspeed = 1.5;
if (speed > -maxspeed) speed = max(-maxspeed,speed-0.4);
}
if (mouse_y < 60) // avanti
{ var maxspeed;
if keyboard_check(vk_shift) maxspeed = 3 else maxspeed = 1.5;
if (speed < maxspeed ) speed = min(maxspeed ,speed+0.4);
}
}


desideravo domandare gentilmente come posso di un oggetto
appena si avvia il gioco, a random far scegliere una posizione tra (x1,y1) (x2,y2) (x3,y3)
e scegliere, sempre a random, tra 3 sprite differenti?

ancora grazie

Avatar utente
maz85
Admin
Messaggi: 8287
Iscritto il: 07/02/2004, 15:57
Specialità: Nientologo
Località: Oblio
Contatta:

Re: 3D compatibile con Head Eye mouse

Messaggio da maz85 »

Si, i controlli effettuati sono corretti (invece di un bordo di 20 hai messo 60 ok).
Riguardo le funzioni random cerca sul forum o sul manuale.
Hai a disposizione sia le funzioni tipiche sia la funzione choose(). ;)

gius
Newbie
Messaggi: 23
Iscritto il: 22/04/2009, 19:57
Contatta:

Re: 3D compatibile con Head Eye mouse

Messaggio da gius »

Io posso aver capito bene facendo così:
obj_plant1 - CREATE -
{choose(obj_plant1.x = 200, obj_plant1.x = 100,obj_plant1.x = 300);}

ma non cambia la posizione.
Ma desidero che scelga tra (x,y) e non solo x....

Dove sbaglio?


grazie ancora

Avatar utente
maz85
Admin
Messaggi: 8287
Iscritto il: 07/02/2004, 15:57
Specialità: Nientologo
Località: Oblio
Contatta:

Re: 3D compatibile con Head Eye mouse

Messaggio da maz85 »

Beh, choose accetta come argomenti dei valori non delle porzioni di codice (in questo caso assegnazioni).

Guarda qui: http://gmitalia.altervista.org/gmi_foru ... lit=random

Esempio:

Codice: Seleziona tutto

valoretraquesti=choose(100,200,300);
oppure

Codice: Seleziona tutto

numerocasuale=round(random(4));
switch numerocasuale{
  case 0: ox=100; oy=200;... break;
  case 1: ......................break;
  ecc...
}

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

Re: 3D compatibile con Head Eye mouse

Messaggio da BaronVsCorsar »

:spat:
basta assegnazioni come parametri di funzione, vi prego... :D

risultato= choose(a,b,c,);

assegna a risultato uno dei tra parametri che tu gli indichi, scelto a caso. Mai puoi fare un assegnamento in un parametro!

Il codice che ti serve deve fare:

Codice: Seleziona tutto

plant1.x= choose(valore_a,valore_a,valore_a);
plant1.y= choose(valore1,valore2,valore3);
attento però, credo ti manchino basi per capire correttamente la maggior parte di consigli che puoi ricevere nel forum: controlla il manuale di GM basilare, come dico spesso, un paio di ore di lettura :manual: rendono più facile e divertente l'uso di GM, non farti scoraggiare e passa questa fase indispensabile!
Buon lavoro!

buon lavoro!
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
Homunculus
Admin
Messaggi: 6840
Iscritto il: 25/11/2007, 20:36
Contatta:

Re: 3D compatibile con Head Eye mouse

Messaggio da Homunculus »

Non èmolto chiaro cosa vuoi fare con quel codice, choose da uno degli elementi che gli passi a caso, ma te passi cose tipo object.x = 300 ecc... non dei valori.

Penso che quello che cerchi di fare sia una cosa simile:

object.x = choose(100,200,300);

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

Re: 3D compatibile con Head Eye mouse

Messaggio da BaronVsCorsar »

oops, mi son accorto un dettaglio nel codice proposto da maz:

Codice: Seleziona tutto

numerocasuale=round(random(4));
switch numerocasuale{
  case 0: ox=100; oy=200;... break;
  case 1: ......................break;
  ecc...
}
poichè random restituisce un numero >=0 e <di 4 ( cioè l'intervallo matematico [0;4[ ) per avere una distribuzione uniforme dei risultati è più semplice fare:
floor(random(4))

con round si avrebbe:
0 nell'intervallo [0 ; 0.5[ (vado a memoria, mi pare che x.5 sia roundato come x+1)
1 nell'intervallo [0.5; 1.5[
2 nell'intervallo [1.5; 2.5[
3 nell'intervallo [2.5; 3.5[
4 nell'intervallo [3.5; 4[

in altre parole non sarebbe una distribuzione uniforme...
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
maz85
Admin
Messaggi: 8287
Iscritto il: 07/02/2004, 15:57
Specialità: Nientologo
Località: Oblio
Contatta:

Re: 3D compatibile con Head Eye mouse

Messaggio da maz85 »

Più che giusto Baron :)

gius
Newbie
Messaggi: 23
Iscritto il: 22/04/2009, 19:57
Contatta:

Re: 3D compatibile con Head Eye mouse

Messaggio da gius »

Grazie Homunculus BaronVsCorsar maz85
credo che grazie al vostro aiuto e alla rilettura del manuale in italiano
sono arrivato ad una possibile conclusione:

CREATE - creo Set Variabile plant1 valore 0
- creo Draw Variabile plantt1 x 100 y 100
- creo script ({plant1.x= choose(200,300,100);
plant1.y= choose(500,400,50);}

il fatto che funzioni non significa che è concettualmente corretto ma credo che sia un piccolo inizio.

ora con lo stesso procedimento ho tentato di scegliere la textura dell'oggetto,
quello che mi è parso evidente è stato aggiungere choose e quindi:
var tex;

tex = sprite_get_texture (choose(tex_plant1,tex_plant2),0);
d3d_draw_wall(x-7*global.camsin,y-7*global.camcos,24,
x+7*global.camsin,y+7*global.camcos,0,tex,1,1);

ma forse perchè il comando DRAW applica in maniera perpetua...
il cambiamento tra le due texture è infinito.
Potreste, gentilmente farmi capire come correggere?

ancora grazie

Avatar utente
maz85
Admin
Messaggi: 8287
Iscritto il: 07/02/2004, 15:57
Specialità: Nientologo
Località: Oblio
Contatta:

Re: 3D compatibile con Head Eye mouse

Messaggio da maz85 »

Sposta questa parte nel create:

Codice: Seleziona tutto

var tex;
tex = sprite_get_texture (choose(tex_plant1,tex_plant2),0);

gius
Newbie
Messaggi: 23
Iscritto il: 22/04/2009, 19:57
Contatta:

Re: 3D compatibile con Head Eye mouse

Messaggio da gius »

quindi nel create dell'oggetto ho:
plant1.x= choose(200,250,100);
plant1.y= choose(150,100,200);
var tex;
tex = sprite_get_texture (choose(tex_plant1,tex_plant2),0);

nel draw resta:
d3d_draw_wall(x-7*global.camsin,y-7*global.camcos,24,
x+7*global.camsin,y+7*global.camcos,0,tex,1,1);




ma mi da questo errore
ERROR in
action number 1
of Draw Event
for object obj_plant1:

Error in code at line 4:
x+7*global.camsin,y+7*global.camcos,0,tex,1,1);

at position 50: Unknown variable tex


ho provato anche ad aggiungere nel draw
var tex;
ma il risultato non cambia,
dove sto sbagliando?
grazie

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

Re: 3D compatibile con Head Eye mouse

Messaggio da BaronVsCorsar »

L.E.G.G.I. I.L. M.A.N.U.A.L.E!

var tex;

significa che la variabile è locale al blocco di codice, vale a dire da quando lo scrivi fino alla chiusura del blocco di codice (normalmente il "}", o "end" a seconda della sintassi che usi).
Ricordati che ogni "piece of code" dovrebbe cominciare con
{
e finire con
}
e se non li metti "li aggiunge" GM.

Quindi se scrivi
var tex;
questa variabile esisterà solo nel "piece of code" dell'evento create, e da nessuna altra parte.
Togli il "var tex" e metti al suo posto un "tex= 0;" per definire la variabile,
poi utilizza il codice che stai già usando.
Così la variabile tex esiste anche nell'evento draw.

spero sia chiaro.
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
maz85
Admin
Messaggi: 8287
Iscritto il: 07/02/2004, 15:57
Specialità: Nientologo
Località: Oblio
Contatta:

Re: 3D compatibile con Head Eye mouse

Messaggio da maz85 »

Errore di distrazione mio, pardon. :spat:

gius
Newbie
Messaggi: 23
Iscritto il: 22/04/2009, 19:57
Contatta:

Re: 3D compatibile con Head Eye mouse

Messaggio da gius »

Grazie Baron,
chiara la tua spiegazione.

Rispondi

Chi c’è in linea

Visitano il forum: Nessuno e 30 ospiti