• User

    [Risolto] Collisione

    Sono un programmatore novello, sto cercando di creare in piccolo videogame con Flash.
    Sto cercando di far muovere un quadrato nello schermo e vorrei che quando quest?ultimo arriva contro un rettangolo (posto più in basso) si ferma sopra e non lo oltrepassa (cioè le uniche operazioni possibili devono essere movimento asse x e movimento asse y solo verso l?alto quando il quadrato impatta contro il rettangolo)
    Ho provato con il codice :
    onClipEvent (enterFrame) {
    if (this._y >= _root.Terra._y) { this._y = _root.Terra._y }}
    associate al Clip filmato Quadrato ma nulla da fare, quando lo muovo questo oltrepassa il rettengolo che per comodità ho chiamato Terra.
    Cosa sbaglio?

    Inserisco di seguito tutto il codice associato al Clip filmato Quadrato.

    onClipEvent (load) {
    //assegnamo un valore alla variabile velocita
    velocita=10;}

    //Voglio fare in modo che il quadrato non oltrepassi il rettangolo
    onClipEvent (enterFrame) {
    if (this._y >= _root.Terra._y) { this._y = _root.Terra._y }}

    //faremo eseguire questa istruzione ad ogni fotogramma (in modo continuo)
    onClipEvent (enterFrame) {
    if (Key.isDown(Key.UP)) {
    this._y = this._y - velocita;
    } else if (Key.isDown(Key.LEFT)) {
    //se è premuto il tasto sinistra, sposteremo l'aereo a sinistra, e cosi via...
    this._x = this._x - velocita;
    } else if (Key.isDown(Key.DOWN)) {
    this._y = this._y + velocita;
    } else if (Key.isDown(Key.RIGHT)) {
    this._x = this._x + velocita;
    }
    }


  • Super User

    Ciao Marco 756 e benvenuto nel forum GT 🙂

    Innanzitutto il tuo errore principale è scrivere codice sulle MovieClip, l' ho detto 1000 volte e non mi stancherò mai di dirlo. 🙂

    Dovresti scrivere il codice solo sulla timeline.

    Personlmente non do più aiuti su quel tipo di codice. Ci vuole troppo tempo per capire la logica dell' applicazione scrivendo codice sparso.

    Forse Onsitus o qualche altro utente può darti una mano.

    :ciauz:


  • User

    Grazie per avermi risposto, ora sposterò la mia attenzione sull'inserimento di codice nella timeline.
    Cmq non penso di aver chiesto niente di così difficile.
    Magari la risoluzione di questo piccolo problema mi avrebbe aiutato a comprendere meglio l'ActionScript.


  • Super User

    Buongiorno Marco e benvenuto sul forum GT.;)

    Prova cosi:

    
    onClipEvent (load) {
     velocita = 10;
    }
    onClipEvent (enterFrame) {
     if (this._y<_root.Terra._y) {
      if (Key.isDown(Key.DOWN)) {
       this._y = this._y+velocita;
      }
     }
     if (Key.isDown(Key.UP)) {
      this._y = this._y-velocita;
     }
     if (Key.isDown(Key.LEFT)) {
      this._x = this._x-velocita;
     }
     if (Key.isDown(Key.RIGHT)) {
      this._x = this._x+velocita;
     }
    }
     
    
    

    :ciauz:


  • User

    Ho provato ad associare questo codice al Clip filmato Quadrato, ma non risponde al comando down (gli altri invece funzionano). In qualsiasi parte dello schermo posiziono il Quadrato, quando poi faccio il "Prova filmato" questo non si sposta verso il basso. Eppure questo codice sembra essere quello giusto!?!


  • Super User

    Strano, l'unica cosa che posso pensare e che il _y del clip filmato quadrato e gia piu grande che _root.Terra._y, per quello non si muove.

    Controlla nel clip filmato quadrato, che la forma quadratto sia con un punto di registrazione al centro (o in alto) e non in giro daqualche altra parte con un 'silly' _y.:bho:

    Un altra prova per capire se e quello il problema aggiunge nel 'enterFrame un trace(this._y); per vedere dove si trova esatamente.


  • User

    Strano, l'unica cosa che posso pensare e che il _y del clip filmato quadrato e gia piu grande che _root.Terra._y, per quello non si muove.

    Forse è qua il problema.
    Come faccio a mettere due clipfilmato uno più piccolo dell'altro?
    Ho provato con il clipQuadrato come istanza del clipTerra e ho provato a mettere le due clip su livelli diversi, ma niente da fare il comando down non funziona.

    I punti di registrazione mi compaiono dentro alle aree degli oggetti.

    Cosa intendi per "con un 'silly' _y" e agiiungere nel 'enterFrame un trace(this._y)?
    Il this._y non c'è già nel codice che mi hai dato?


  • Super User

    Aggiunge nel enterFrame...

    
    trace(this._y);
    
    

    Quando fa il preview del filmato, uscira fuori la finestra di output con il valore del fimato quadrato._y (this._y). Cosi vede se e quello il problema.

    Davero puo fare...

    
    trace(this._y);
    trace(_root.Terra._y);
    
    

    In caso sia il Terra._y sbagliato

    Il codice l'ho provato e funziona.:bho:


  • User

    Innanzitutto GRAZIE per l'aiuto che mi stai dando.:)
    Sono un novello e molte cose ancora le devo imparare.

    Scrivendo i trace (trace(this._y); e trace(_root.Terra._y);) nell'enterframe ottengo questo messaggio di output:
    0
    undefined

    Non capisco perchè non riesca a riconoscere il simbolo clip filmato che ho chiamato terra.
    Riassumo le poche operazioni che ho fatto per capire una volta per tutte perchè nn funziona:

    1. Disegno sull'enterframe due oggetti e li trasformo in simbolo clip filmato, uno chiamato Quadrato e l'altro Terra;
    2. Aggiungo il codice che mi hai postato al simbolo clip filmato Quadrato;
    3. Aggiungo i trace all'enterframe.

    Cosa sbaglio?


  • Super User

    Ha dato un nome d'istanza al clip filmato Terra???:?

    Ti allego un esempio cmq (per flash 😎


  • User

    E' incredibile i due filmati sono identici, ma uno funziona e l'altro no.
    Ma scusa il nome Terra come glielo dai?
    Perchè ho notato che se apri la libreria nel tuo file i due simboli hanno questi nomi:
    Symbol 1
    Symbol 2
    Invece se lo seleziono nel pannello delle azioni compare Terra in basso a sinistra.

    Non ci capisco più niente............:x


  • User

    Ti mando il filmato....


  • User

    Risolto...........
    Non avevo scritto il nome Terra nelle proprietà del simbolo.
    Pensavo che una volta creato e nominato il simbolo fosse visibile a flash con il proprio nome e invece...
    Grazie per avermi aiutato
    Ciao