Raggio d'azione visuale nemica

Hai una curiosità o un problema con Game Maker? Domanda e ti sarà risposto!
Rispondi
ric_x
Newbie
Messaggi: 7
Iscritto il: 27/01/2008, 15:38
Uso: GameMaker 8
Contatta:

Raggio d'azione visuale nemica

Messaggio da ric_x »

Salve a tutti,
dopo un sacco di tempo eccomi a qua a chiedervi qualche consiglio :cappa:
Sto realizzando un piccolo gioco 2d(in visuale dall'alto) e programmando la visuale del nemico,il suo raggio d'azione,ho sfruttato il teorema di pitagora(per i muri)in modo tale che la lunghezza della collision_line cambi in base alla distanza con il muro con cui collide...e sembra che funzioni,ma mentre si sposta ad ogni 2/3 step sorpassa il muro :spat:
riuscite a darmi un consiglio su come risolvere? :fapensare:

in step event ho messo:

Codice: Seleziona tutto

{
if collision_line(x,y,XX,YY,obj2,1,0){ 
        get_id=collision_line(x,y,XX,YY,obj2,1,0)// dammi l'id del obj con cui collidi
        collido=1//collisione di tipo 1
        A=x-get_id.x//differenza tra x e x di obj2
        B=YY-y//differenza tra y e YY(punto Y finale della linea di collisione)
        C=(A*A)+(B*B)//A^2+B^2
        D=sqrt(C)//quadrato di C
        lun=D// lunghezza è uguale al quadrato di C
        ny=get_id.y//solo per disegnare linea
        nx=get_id.x//solo per disegnare linea 
        sx=lengthdir_x(lun,a)//posizione da punto 0 di x distante 'lun' con direction 'a'
        sy=lengthdir_y(lun,a)//posizione da punto 0 di y distante 'lun' con direction 'a'
        XX=x+sx //posizione finale Xlinea
        YY=y+sy //posizione finale Ylinea
}else{if collido!=2  {collido=0}}

if collision_line(x,y,XX,YY,obj,1,0){
        get_id=collision_line(x,y,XX,YY,obj,1,0)// dammi l'id del obj con cui collidi
        collido=2//collisione di tipo 2
        A=XX-x         //differenza tra x e XX(punto X finale della linea di collisione)
        B=y-get_id.y     //differenza tra y e y di obj
        C=(A*A)+(B*B)         //A^2+B^2
        D=sqrt(C)//quadrato di C
        lun=D // lunghezza è uguale al quadrato di C
        sx=lengthdir_x(lun,a)//posizione da punto 0 di x distante 'lun' con direction 'a'
        sy=lengthdir_y(lun,a)//posizione da punto 0 di y distante 'lun' con direction 'a'
        XX=x+sx //posizione finale XX
        YY=y+sy//posizione finale YY
}   else   {if collido!=1  {collido=0}}


if collido=0 {lun=300 
sx=lengthdir_x(lun,a)
sy=lengthdir_y(lun,a)
XX=x+sx 
YY=y+sy}
}
Scusate il disordine :asd:

Avatar utente
doom13
Moderatore
Messaggi: 2093
Iscritto il: 31/08/2012, 15:40
Specialità: Programmazione
Uso: GM:Studio 2
Contatta:

Re: Raggio d'azione visuale nemica

Messaggio da doom13 »

Collision_line restituisce l'id più piccolo tra gli oggetti con cui collide se non sbaglio, potrebbe essere che in alcuni casi get_id non contenga l'id dell'oggetto più vicino, fai un test al volo.

Ma perché vuoi calcolare la distanza con il muro? Te lo chiedo perché forse c'è una soluzione più semplice a quello che hai scritto.
Immagine
Spoiler
Maze [sospeso]
Isom (titolo provvisorio) (Windows & Android) [sospeso]
Keep Calm & Jump (Android) [In corso]
The Graywall (Windows) [Completo]
DTB (Windows & Android) [Completo]
The Last Spell (Windows) [Completo]
Dukenstein: Return to the house (Windows) [Completo]
DMSystem (Windows) [Completo]
"Things get hard sometimes guys... But remember, dicks get hard too, but they don't stay hard forever. Don't give up!"

ric_x
Newbie
Messaggi: 7
Iscritto il: 27/01/2008, 15:38
Uso: GameMaker 8
Contatta:

Re: Raggio d'azione visuale nemica

Messaggio da ric_x »

In pratica il nemico ha questa linea di collisione per controllare se il personaggio è vicino a lui e quindi attaccarlo,questa linea l'ho fatta oscillante,però avendo un raggio d'azione molto grande di 300 px quando il personaggio si trova dietro un muro il nemico non deve vederlo,anche se è a pochissima distanza da lui e quindi quando incontra un muro la linea diminuisce.
Fortunatamente anche avendo più istanze nemiche sembra non appesantisca per nulla..
Comunque get_id riesce ad avere quasi sempre l'id di collisione però sembra che quando la linea va in senso orario vada tutto bene,arriva al lim più alto,riscende,ma quando arriva al lim più basso e cambia direzione ho notato che 'collido' varia tra
=0 e =2,cos'è cambiato da prima? D:

Avatar utente
doom13
Moderatore
Messaggi: 2093
Iscritto il: 31/08/2012, 15:40
Specialità: Programmazione
Uso: GM:Studio 2
Contatta:

Re: Raggio d'azione visuale nemica

Messaggio da doom13 »

Non puoi usare direttamente collision_line per capire se in mezzo c'è un muro?

Edit:
collision_line che va ovviamente dalla posizione del nemico a quella del pg. Poi con un point_distance verifichi che la distanza non sia maggiore di tot.
Immagine
Spoiler
Maze [sospeso]
Isom (titolo provvisorio) (Windows & Android) [sospeso]
Keep Calm & Jump (Android) [In corso]
The Graywall (Windows) [Completo]
DTB (Windows & Android) [Completo]
The Last Spell (Windows) [Completo]
Dukenstein: Return to the house (Windows) [Completo]
DMSystem (Windows) [Completo]
"Things get hard sometimes guys... But remember, dicks get hard too, but they don't stay hard forever. Don't give up!"

ric_x
Newbie
Messaggi: 7
Iscritto il: 27/01/2008, 15:38
Uso: GameMaker 8
Contatta:

Re: Raggio d'azione visuale nemica

Messaggio da ric_x »

Ma infatti è quello che fa...se collision_line di cui la massima distanza è 300 collide con il pg allora lo attacca ed insegue...ma se collision_line collide prima con un muro allora la sua distanza sarà uguale alla distanza tra lui e il muro

Avatar utente
Xxshark888xX
Membro d'elite
Messaggi: 1497
Iscritto il: 30/05/2012, 19:17
Specialità: Un poco di tutto
Uso: GM:Studio 1.4 Pro
Località: Earth
Contatta:

Re: Raggio d'azione visuale nemica

Messaggio da Xxshark888xX »

[OFF TOPIC]
Scusa l'off topic, ma sei registrato dal 2008 e hai solamente 6 messaggi? :asd: :fapensare:
Contatti
Steam
Facebook

Gif
Spoiler
Immagine
Immagine
Immagine
Immagine

Avatar utente
doom13
Moderatore
Messaggi: 2093
Iscritto il: 31/08/2012, 15:40
Specialità: Programmazione
Uso: GM:Studio 2
Contatta:

Re: Raggio d'azione visuale nemica

Messaggio da doom13 »

ric_x ha scritto:Ma infatti è quello che fa...se collision_line di cui la massima distanza è 300 collide con il pg allora lo attacca ed insegue...ma se collision_line collide prima con un muro allora la sua distanza sarà uguale alla distanza tra lui e il muro
Secondo me la fai più complicata di quello che è. Dovrebbe essere una cosa del genere:

Codice: Seleziona tutto

se point_distance(x,  y, pg.x, pg.y) <= 300
{
  coll = collision_line(x, y, pg.x, pg.y,  obj_muro) 
  se coll è uguale a noone
    La linea di tiro è libera (esegui il codice che vuoi) 
  else
    C'è un muro in mezzo
}
Immagine
Spoiler
Maze [sospeso]
Isom (titolo provvisorio) (Windows & Android) [sospeso]
Keep Calm & Jump (Android) [In corso]
The Graywall (Windows) [Completo]
DTB (Windows & Android) [Completo]
The Last Spell (Windows) [Completo]
Dukenstein: Return to the house (Windows) [Completo]
DMSystem (Windows) [Completo]
"Things get hard sometimes guys... But remember, dicks get hard too, but they don't stay hard forever. Don't give up!"

ric_x
Newbie
Messaggi: 7
Iscritto il: 27/01/2008, 15:38
Uso: GameMaker 8
Contatta:

Re: Raggio d'azione visuale nemica

Messaggio da ric_x »

ok perfetto! :rockrock:
Come al solito esistono sempre soluzioni più facili delle mie XD prima di conoscere lengthdir usavo seno e coseno :furiosomedio:

Xxshark888xX ha scritto:[OFF TOPIC]
Scusa l'off topic, ma sei registrato dal 2008 e hai solamente 6 messaggi? :asd: :fapensare:
Sono un tipo introverso :asd: ahah
In verità ho due profili,questo non lo usavo da molto,avevo perso la password,ora mi ricordo questa ma l'altra no :spat: però bazzico spesso sul forum da offline,solitamente cerco un topic già in questione... :cappa:

Rispondi

Chi c’è in linea

Visitano il forum: Nessuno e 140 ospiti