Problema collisioni con piu oggetti

Hai una curiosità o un problema con Game Maker? Domanda e ti sarà risposto!
Rispondi
Avatar utente
tola22
Membro
Messaggi: 185
Iscritto il: 11/03/2011, 0:00
Specialità: Drag and Drop
Uso: GM:Studio 1.4 Pro
Località: Svizzera
Contatta:

Problema collisioni con piu oggetti

Messaggio da tola22 »

salve ragazzi io ho un problema con il mio script dei movimenti il quale specifica che le collisioni del player ci sono contro l'oggetto "Wall_Orizzontale".
la mia domanda é: se volessi fare le collisioni anche su Wall_Verticali e altri oggetti come posso fare ad implementarlo nel codice?
ecco lo script:

Codice: Seleziona tutto

/// movimenti axis (xaxis,yaxis, magnitude,speed)

var xaxis = argument0;
var yaxis = argument1;
var threshold = argument2;
var magnitude = point_direction (0, 0, xaxis, yaxis);
var spd = argument3;
gamepad_set_axis_deadzone(0,0.2)

// muovi il personaggio se é possibile
if (magnitude >= threshold) {
    if (!place_meeting(x+xaxis*spd, y+yaxis*spd, Wall_Orizzontale)) {
        x+=xaxis*spd;
        
    } else if (!place_meeting(x+xaxis*spd, y+yaxis*spd, Wall_Orizzontale)) {
        x += xaxis*spd;
   }}

Inoltre se sapete aiutarmi a fare un codice che faccia questa funzione: voglio che un oggetto quando va in collisione con i muri, la sua variabile "blocco" continua a salire +1 in step. ma quando questo oggetto non é piu in collisione con il muro la variabile torna a zero.
sapete come fare? grazie ragazzi mitici!!
il nuovo layout del forum spacca comunque! :rockrock:

Avatar utente
Vallo92
GMI Advanced
Messaggi: 1508
Iscritto il: 15/07/2011, 20:26
Specialità: Grafico
Uso: GM:Studio 2
Contatta:

Re: Problema collisioni con piu oggetti

Messaggio da Vallo92 »

Per quanto riguarda la prima domanda puoi aggiungere un altra "opzione" all'if di controllo collisione impostando anche un check su Wall_Verticali.
Per quanto riguarda la seconda domanda:
Crea una variabile "collisione = false; blocco = 0;". Poi imposti un controllo sull'effettiva collisione con il muro: se c'è la collisione imposti "collisione = true;" altrimenti "collisione = false; blocco = 0;". Dopodiché nello Step Event imposti:

Codice: Seleziona tutto

if (collisione == true) {
   blocco += 1;
}
In questo modo dovresti ottenere quello che hai chiesto. Poi ovviamente modifichi il codice in base alle tue esigenze.


P.S.
Ovviamente puoi anche evitare di creare la variabile "collisione" e sfruttare i vari check di collisione che hai nel tuo codice. Insomma vedi un po' tu come preferisci muoverti. ;)
-Questi occhiali da sole le stanno benissimo. Vuole provarli con le lenti più scure?
- Si vede che le sto guardando le tette?
- Si
- Allora si

Avatar utente
tola22
Membro
Messaggi: 185
Iscritto il: 11/03/2011, 0:00
Specialità: Drag and Drop
Uso: GM:Studio 1.4 Pro
Località: Svizzera
Contatta:

Re: Problema collisioni con piu oggetti

Messaggio da tola22 »

:spat: :fapensare: :hum: per la prima domanda: come lo dovrei inserire la seconda stringa?
per la seconda domanda: quello che mi hai scritto come codice lo so, quello che non so é come fare il check di collisione o meglio come fare il check quando non é in collisione (visto che il check di collisione ce gia nel drag & drop).

Avatar utente
Vallo92
GMI Advanced
Messaggi: 1508
Iscritto il: 15/07/2011, 20:26
Specialità: Grafico
Uso: GM:Studio 2
Contatta:

Re: Problema collisioni con piu oggetti

Messaggio da Vallo92 »

Dai un occhiata al funzionamento di || (and) e ! (questuassimo lo hai usato anche nel tuo script).


P.S.
Non ho capito questa tua parte di script.... Sbaglio ho fai due controlli identici?

Codice: Seleziona tutto

if (!place_meeting(x+xaxis*spd, y+yaxis*spd, Wall_Orizzontale)) {
        x+=xaxis*spd;
        
    } else if (!place_meeting(x+xaxis*spd, y+yaxis*spd, Wall_Orizzontale)) {
        x += xaxis*spd;
   }
-Questi occhiali da sole le stanno benissimo. Vuole provarli con le lenti più scure?
- Si vede che le sto guardando le tette?
- Si
- Allora si

Avatar utente
tola22
Membro
Messaggi: 185
Iscritto il: 11/03/2011, 0:00
Specialità: Drag and Drop
Uso: GM:Studio 1.4 Pro
Località: Svizzera
Contatta:

Re: Problema collisioni con piu oggetti

Messaggio da tola22 »

si é vero fa due controlli identici... lo script lo preso da un tutorial onestamente... comunque ho provato a cercare tutorial delle OR, AND e quelli li.. io penso mi serva la OR per il problema delle collisioni... ho provato a mettere || un po' in tutte le salse ma il risultato é sempre che le collisioni sparivano anche sul oggetto Wall_Orizzontale, in poche parole ogni volta che tocco non funziona piu.
il fatto di essere doppio lo script presumo sia perche la seconda doveva forse essere per i movimenti verticali non ricordo.. probabilmente lo convertito uguale perche a me non serve il movimento verticale.. si é vero avrei potuto eliminarlo direttamente...
comunque non ci riesco :spat:

mentre per laltro problema quello delle collisioni, io le collisioni le ho sempre fatte con collision event.. dunque non so come fare il check della collisione via script perche appunto a me serve il controllo anche quando non é in collisione, quindi collision event non funziona... é corretto?

aihmé che frana che sono :spat:

Avatar utente
gameplay_extreme
GMI VIP
Messaggi: 3824
Iscritto il: 13/11/2010, 16:23
Uso: GM:Studio 2
Contatta:

Re: Problema collisioni con piu oggetti

Messaggio da gameplay_extreme »

non sono sicurissimo di seguirti, vediamo se capito il problema...

una cosa da notare:
se il codice non è sbagliato... la parte tra graffe viene eseguita in caso NON ci sia collisione

se ho capito bene...tu vuoi che il codice venga eseguito in caso di mancata collisione sia con gli oggetti verticali e contemporaneamente con gli oggetti orizzontali

indizio per risolvere :
vuoi usare or ? può andar bene...
vuoi usare and ? può andar bene...

TUTTO DIPENDE DA COME UTILIZZI IL (o I) "NOT"...

le collisioni le hai sempre fatte con il collision event?

guarda è semplice, citando il code che hai postato tu stesso:

Codice: Seleziona tutto

!place_meeting(...)
 {
  // codice
 }
a causa del not il codice verrà eseguito in caso di MANCATA COLLISIONE (ci sono anche altri sistemi ma adesso non vorrei farti confusione...)

alla prossima!!
Immagine
clicca sul logo qui sopra per info e download riguardo ai miei software o per sapere come si crea un videogioco!

iscriviti qui gratuitamente a GMI !
Spoiler
- Una curiosità: come mai quell' ordine ?
- Perché formava una scaletta molto carina da vedere.


"ah ah...grazie alla annotazione scientifica ti ho fregato!"
(come disse la calcolatrice al display)

Avatar utente
tola22
Membro
Messaggi: 185
Iscritto il: 11/03/2011, 0:00
Specialità: Drag and Drop
Uso: GM:Studio 1.4 Pro
Località: Svizzera
Contatta:

Re: Problema collisioni con piu oggetti

Messaggio da tola22 »

allora per il problema di collisioni del player con i muri (prima domanda) ho provato a fare questo ma credo di aver capito male come funzioni il sistema OR... ho provato a cercare un tutorial ma non ho trovato quasi nulla.

Codice: Seleziona tutto

// muovi il personaggio se é possibile

if (magnitude >= threshold) {
    if (!place_meeting(x+xaxis*spd, y+yaxis*spd, Wall_Orizzontale || Wall)){
        x+=xaxis*spd;
        
    } else if (!place_meeting(x+xaxis*spd, y+yaxis*spd, Wall_Orizzontale || Wall)){
        x += xaxis*spd;
   }}

per la seconda domanda riguardante il check della collisione, ho provato mentre ero a lavoro a scrivere questo codice:

Codice: Seleziona tutto

if !place_meeting (x,y,Wall)
				{
				Collisione_Muro = 1
				}
				else
				{
				Collisione_Muro = 0
				}
peró non ho nessuna idea se funzioni oppure no perche non ho ancora avuto modo di testarlo.
essendo la variabile Collisione_Muro (che andro a creare) una variabile interna del oggetto, é cosi che la richiamo nello script o devo scriverla diversamente? :hum: :hum: :hum: :paura:

Avatar utente
gameplay_extreme
GMI VIP
Messaggi: 3824
Iscritto il: 13/11/2010, 16:23
Uso: GM:Studio 2
Contatta:

Re: Problema collisioni con piu oggetti

Messaggio da gameplay_extreme »

Codice: Seleziona tutto

Wall_Orizzontale || Wall
guarda, hai capito male, l' or vuole in ingresso VALORI BOLEANI e restituisce valori booleani e tutto questo segunedo regole di logica ben precise (niente di incredibile ma bisogna capire come funziona la faccenda...)

invece tu hai messo 2 object_index (ovvero valori che non hanno niente a che vedere con i calcoli boolani) come input e l'output viene dato come terzo argomento alla funzione place_meeting (che vuole "ricevere" un id di oggetto o di istanza è non un valore booleano)

Ok, dopo questo discorso teorico passiamo alla pratica:
l'espressione

Codice: Seleziona tutto

wall_orizzontale || wall
restitituira sempre 1 (ovvero "or" tra numeri positivi maggiori di 1 e sempre 1, stessa cosa se mettevi "and")...quindi tu stai dicendo alla funzione place_meeting di controllare se NON c'è collisione con l'oggetto avente id 1 (che, se non sbaglio e se nelle ultime versioni non hanno cambiato nulla, è la prima istanza che hai collocato nella room)...quasi mi viene da dire: un codice degno di un GENIO! xD
(scerzi a parte, il code è da rivedere, evidentemente...)

ciao!
Immagine
clicca sul logo qui sopra per info e download riguardo ai miei software o per sapere come si crea un videogioco!

iscriviti qui gratuitamente a GMI !
Spoiler
- Una curiosità: come mai quell' ordine ?
- Perché formava una scaletta molto carina da vedere.


"ah ah...grazie alla annotazione scientifica ti ho fregato!"
(come disse la calcolatrice al display)

Avatar utente
tola22
Membro
Messaggi: 185
Iscritto il: 11/03/2011, 0:00
Specialità: Drag and Drop
Uso: GM:Studio 1.4 Pro
Località: Svizzera
Contatta:

Re: Problema collisioni con piu oggetti

Messaggio da tola22 »

ma non ce un tutorial che spiega ste cose booleane? xD cavolacci!
cioe non pensavo fosse cosi complicato adattare il codice per avere le collisioni sia su un oggetto che su un'altro/altri. :shock:

per l'altro codice che ho postato cosa mi sai dire? ora lo provo ma so gia che qualcosa non andrà :asd:

Avatar utente
Vallo92
GMI Advanced
Messaggi: 1508
Iscritto il: 15/07/2011, 20:26
Specialità: Grafico
Uso: GM:Studio 2
Contatta:

Re: Problema collisioni con piu oggetti

Messaggio da Vallo92 »

Il fatto è che non è complicato... Basta che ti leggi il funzionamento e l'utilizzo di || (or).

Per il tuo secondo codice non ti rimane che testare. Quello che hai scritto tu è: Se NON c'è collisione tra le coordinate x, y dell'obj in questione e l'obj muro allora "Collisione_Muro = 1" altrimenti "Collisione_Muro = 0".

Se può tornarti utile qui trovi il manuale di GM 8.1 completamente tradotto in italiano: http://gmitalia.altervista.org/manuale_GM81/
-Questi occhiali da sole le stanno benissimo. Vuole provarli con le lenti più scure?
- Si vede che le sto guardando le tette?
- Si
- Allora si

Avatar utente
tola22
Membro
Messaggi: 185
Iscritto il: 11/03/2011, 0:00
Specialità: Drag and Drop
Uso: GM:Studio 1.4 Pro
Località: Svizzera
Contatta:

Re: Problema collisioni con piu oggetti

Messaggio da tola22 »

anche ieri avevo letto questo tutorial http://gmitalia.altervista.org/manuale_ ... sions.html
ma ad essere sincero non ho capito praticamente nulla cioe hanno sparato dentro in un codice di tutto.
dunque sono andato a vedere questo che era parte del codice:

Codice: Seleziona tutto

(x==2 || x==4)
ed ho provato ad applicarlo ma senza successo. onestamente non so proprio come modificare il mio script e questo tutorial non mi illumina affatto.
sarà anche facile ma per ora non vedo con chiarezza il concetto. :spat:

Avatar utente
tola22
Membro
Messaggi: 185
Iscritto il: 11/03/2011, 0:00
Specialità: Drag and Drop
Uso: GM:Studio 1.4 Pro
Località: Svizzera
Contatta:

Re: Problema collisioni con piu oggetti

Messaggio da tola22 »

ho provato anche cosi ma niente:

Codice: Seleziona tutto

if (magnitude >= threshold) {
    if (!place_meeting(x+xaxis*spd, y+yaxis*spd, Wall)|| !place_meeting(x+xaxis*spd,y+xaxis*spd,Wall_Orizzontale)){
        x+=xaxis*spd;
che noia mi sto scervellandoo :confuso: :furioso:

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

Re: Problema collisioni con piu oggetti

Messaggio da Tizzio »

Le espressioni booleane si basano sulla verità o falsità

Codice: Seleziona tutto

if ( place_free(x, y) == true || place_free(x + 20, y) == true)
    //fai qualcosa
}
Per non confonderti all'inizio prendi come regola il fatto che puoi mettere in and/or/not solo le comparazioni ==, <, <=, >, >=

Avatar utente
gameplay_extreme
GMI VIP
Messaggi: 3824
Iscritto il: 13/11/2010, 16:23
Uso: GM:Studio 2
Contatta:

Re: Problema collisioni con piu oggetti

Messaggio da gameplay_extreme »

tola22 ha scritto:ho provato anche cosi ma niente:

Codice: Seleziona tutto

if (magnitude >= threshold) {
    if (!place_meeting(x+xaxis*spd, y+yaxis*spd, Wall)|| !place_meeting(x+xaxis*spd,y+xaxis*spd,Wall_Orizzontale)){
        x+=xaxis*spd;
che noia mi sto scervellandoo :confuso: :furioso:
Ok, adesso va decisamente meglio...

ricapitoliamo...se non ho capito male, tu vuoi che se CONTEMPORANEAMENTE (nota che la particella "and" può indicare contemporaneità, anche nei linguaggi umani...) NON ci sia collisione sia con spd_wall e con Wall_orizzontale venga eseguito il codice delimitato da graffe...quindi non ci vuole "or" ma un bel...(completa tu la frase xD)
oppure se propio vuoi metterci or rivedi il modo in cui sono implementati i not...

(quindi in pratica confermo quello che avevo detto qualche post fa: vanno bene sia and che or, dipende da come sono messi i -o il- not...)
Immagine
clicca sul logo qui sopra per info e download riguardo ai miei software o per sapere come si crea un videogioco!

iscriviti qui gratuitamente a GMI !
Spoiler
- Una curiosità: come mai quell' ordine ?
- Perché formava una scaletta molto carina da vedere.


"ah ah...grazie alla annotazione scientifica ti ho fregato!"
(come disse la calcolatrice al display)

Avatar utente
tola22
Membro
Messaggi: 185
Iscritto il: 11/03/2011, 0:00
Specialità: Drag and Drop
Uso: GM:Studio 1.4 Pro
Località: Svizzera
Contatta:

Re: Problema collisioni con piu oggetti

Messaggio da tola22 »

ho provato a mettere && ma come risultato ho ottenuto che il player si muove unicamente a sinistra... :confuso: :asd:

ricapitoliamo: questo script fa muovere il mio player sinistra e destra. nello script é indicato che se non é a contatto con un determinato muro ovviamente puo compiere l'azione di movimento.
quello che serve a me, é di poter dare la collisione anche su altri oggetti ovvero: se colpisco un muro verticale ovviamente non lo devo attraversare ma mi devo fermare. ma anche se colpisco un muro orizzontale o un qualsiasi altro oggetto che io decida di aver bisogno come oggetto solido con cui collidere.
non so se mi sono spiegato bene :(

perche cosa succede in questo momento: il mio player compie le azioni destra e sinistra. ho programmato delle piattaforme a molla che se ci passi sopra ti fanno saltare (tipo sonic). ora il mio problema é che le collisioni erano sui muri verticali ai lati dello schermo per non uscire dai bordi. ma adesso che ho dato l'opzione di poter saltare, giustamente entro in contatto con altri tipi di solidi quali piattaforme orizzontali. cosa succede, la collisione verticale con quest'ultimi funziona perché e in uno script a parte relativa ai salti e gravita... mentre la collisione orizzontale con essi non ce dunque succede che il mio player si incastra nella piattaforma anche a mezzo busto e si possa muovere a destra e sinistra.. e non é quello che voglio..
spero si capisca cio che cerco di dire :hum:
grazie ragazzi mi scuso per l'incompetenza :?

Avatar utente
gameplay_extreme
GMI VIP
Messaggi: 3824
Iscritto il: 13/11/2010, 16:23
Uso: GM:Studio 2
Contatta:

Re: Problema collisioni con piu oggetti

Messaggio da gameplay_extreme »

tola22 ha scritto:ho provato a mettere && ma come risultato ho ottenuto che il player si muove unicamente a sinistra... :confuso: :asd:
boh...non vedo il nesso...

Codice: Seleziona tutto

if (magnitude >= threshold) {
    if (!place_meeting(x+xaxis*spd, y+yaxis*spd, Wall)){
        x+=xaxis*spd;
se questo code qui sopra funziona sia a destra che a sinistra...non hai detto niente in proposito...quindi immagino che il problema di "sola sinistra" originariamente non esisteva (immagino che destra voglia dire xasis positivo e xasis negativo voglia dire sinistra, nota che il secondo if non fa nessun controllo su tale variabile...)...

Codice: Seleziona tutto

if (magnitude >= threshold) {
    if (!place_meeting(x+xaxis*spd, y+yaxis*spd, Wall)|| !place_meeting(x+xaxis*spd,y+xaxis*spd,Wall_Orizzontale)){
        x+=xaxis*spd;
questo che hai scritto tu non va bene: il codice tra graffe verrà eseguito quando una delle 2 condizioni è vera..cioè in pratica vuol dire ESEGUI IL CODICE QUANDO NON C'E' COLLISIONE CON ALMENO UNO DEI 2 TIPI DI OGGETTI
io ti avevo, in pratica, detto di sostituire l' "or" con un "and"...

se è quello che hai fatto: l' if che hai modificato non fa (come non faceva neanche prima) controlli di nessun tipo sulla variabile xasis (o su qualsivoglia variabile collegata alla direzione di spostamento): quindi ripeto, non vedo come questa modifica possa dare un difetto di spostamento simile...boh....
(poi chiaro..."non si vive di sola teoria xD"....il progetto l'hai tu...tocca a te fare il testing/debug)

ciao!
Immagine
clicca sul logo qui sopra per info e download riguardo ai miei software o per sapere come si crea un videogioco!

iscriviti qui gratuitamente a GMI !
Spoiler
- Una curiosità: come mai quell' ordine ?
- Perché formava una scaletta molto carina da vedere.


"ah ah...grazie alla annotazione scientifica ti ho fregato!"
(come disse la calcolatrice al display)

Avatar utente
gameplay_extreme
GMI VIP
Messaggi: 3824
Iscritto il: 13/11/2010, 16:23
Uso: GM:Studio 2
Contatta:

Re: Problema collisioni con piu oggetti

Messaggio da gameplay_extreme »

gameplay_extreme ha scritto:
tola22 ha scritto:ho provato a mettere && ma come risultato ho ottenuto che il player si muove unicamente a sinistra... :confuso: :asd:
boh...non vedo il nesso...

Codice: Seleziona tutto

if (magnitude >= threshold) {
    if (!place_meeting(x+xaxis*spd, y+yaxis*spd, Wall)){
        x+=xaxis*spd;
se questo code qui sopra funziona sia a destra che a sinistra...non hai detto niente in proposito...quindi immagino che il problema di "sola sinistra" originariamente non esisteva (immagino che destra voglia dire xasis positivo e xasis negativo voglia dire sinistra, nota che il secondo if non fa nessun controllo su tale variabile...)...

Codice: Seleziona tutto

if (magnitude >= threshold) {
    if (!place_meeting(x+xaxis*spd, y+yaxis*spd, Wall)|| !place_meeting(x+xaxis*spd,y+xaxis*spd,Wall_Orizzontale)){
        x+=xaxis*spd;
questo che hai scritto tu non va bene: il codice tra graffe verrà eseguito quando almeno una delle 2 condizioni è vera..cioè in pratica vuol dire ESEGUI IL CODICE QUANDO NON C'E' COLLISIONE CON ALMENO UNO DEI 2 TIPI DI OGGETTI
io ti avevo, in pratica, detto di sostituire l' "or" con un "and"...

se è quello che hai fatto: l' if che hai modificato non fa (come non faceva neanche prima) controlli di nessun tipo sulla variabile xasis (o su qualsivoglia variabile collegata alla direzione di spostamento): quindi ripeto, non vedo come questa modifica possa dare un difetto di spostamento simile...boh....
(poi chiaro..."non si vive di sola teoria xD"....il progetto l'hai tu...tocca a te fare il testing/debug)

ciao!
Immagine
clicca sul logo qui sopra per info e download riguardo ai miei software o per sapere come si crea un videogioco!

iscriviti qui gratuitamente a GMI !
Spoiler
- Una curiosità: come mai quell' ordine ?
- Perché formava una scaletta molto carina da vedere.


"ah ah...grazie alla annotazione scientifica ti ho fregato!"
(come disse la calcolatrice al display)

Rispondi

Chi c’è in linea

Visitano il forum: Nessuno e 46 ospiti