Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 11
  1. #1

    Problema stage.addEventListener

    Salve a tutti. Sto realizzando un gioco in cui si controlla in personaggio con la tastiera. Come oggetti ho la schermata in cui potersi muovere e, come figlio, il personaggio (entrambi sono simboli a sè stanti). Se aggiungo nella classe documento la schermata come figlio di stage e poi il personaggio come figlio della schermata, nessun problema. Se invece creo una schermata introduttiva con un pulsante che mi manda alla schermata di gioco (sempre aggiungendola come figlia di stage), non funziona più. Per far capire posto qualche riga:
    Così funziona:
    codice:
    class Main {
       function Main() {
          ...
          stage.addChild(room);
          room.addChild(player);
       }
    }
    class Player { 
       function Player() {
          ...
          stage.addEventListener(KeyboardEvent.KEY_DOWN, onKeyDown)
       }
    }
    Così non funziona:
    codice:
    class Main {
       function Main() {
          ...
          stage.addChild(introRoom);
          introRoom.button.addEventListener(MouseEvent.CLICK, onClick);
       }
       function onClick() {
          stage.addChild(room);
          room.addChild(player);
          stage.removeChild(introRoom);
    }
    class Player {
       //come sopra
    }

  2. #2
    Utente di HTML.it L'avatar di and80
    Registrato dal
    Mar 2003
    Messaggi
    15,182
    Tratto dalla guida in linea di AS3:
    Nota: il comando stage.addChild() può causare problemi con un file SWF pubblicato, tra cui problemi di sicurezza e conflitti con altri file SWF caricati. In un'istanza del runtime Flash è presente un solo stage, indipendentemente dal numero di file SWF caricati nel runtime. In generale, quindi, gli oggetti non devono assolutamente essere aggiunti direttamente allo stage. Il solo oggetto che lo stage deve contenere è l'oggetto radice. Create un DisplayObjectContainer che conterrà tutti gli elementi dell'elenco di visualizzazione. Quindi, se necessario, aggiungete allo stage tale istanza DisplayObjectContainer.
    L'oggetto radice su menzionato è la MainTimeline o "root", ed è a questa che devi aggiungere gli elementi che attualmente aggiungi allo stage.
    Per raggiungere la radice puoi:

    - aggiungere gli elementi direttamente alla document class con "this" o senza indicare nulla
    - aggiungere gli elementi a root, avendo cura di indicarlo come MovieClip, quindi MovieClip(root).addChild

    Pertanto nel tuo caso dovresti avere una cosa del genere:

    Codice PHP:
    class Main {
       function 
    Main() {
          ...
          
    addChild(introRoom);
          
    introRoom.button.addEventListener(MouseEvent.CLICKonClick);
       }
       function 
    onClick() {
          
    addChild(room);
          
    room.addChild(player);
          
    removeChild(introRoom);

    oppure:

    Codice PHP:
    class Main {
       function 
    Main() {
          ...
          
    MovieClip(root).addChild(introRoom);
          
    introRoom.button.addEventListener(MouseEvent.CLICKonClick);
       }
       function 
    onClick() {
          
    MovieClip(root).addChild(room);
          
    room.addChild(player);
          
    MovieClip(root).removeChild(introRoom);


  3. #3
    scusami, ma continua a non funzionare. Ti posto il nuovo codice per aiutarti:
    codice:
    class Main { 
       function Main() { 
          ... 
          addChild(introRoom); 
          introRoom.button.addEventListener(MouseEvent.CLICK, onClick); 
       } 
       function onClick() { 
          room = new Room(MovieClip(this));
          addChild(room); 
          room.addChild(player); 
          removeChild(introRoom); 
    }
    ...
    public class Room {
       public function Room(ROOT:Object) {
          // constructor code
          _ROOT = ROOT;
          this.addEventListener(Event.ADDED_TO_STAGE, onShowed);
        }
       private function onShowed(e:Event) {
          player = new Player(PLAYER_STARTX, PLAYER_STARTY, _ROOT)
          this.addChild(player);
       }
    }
    ...
    public class Player {
       public function Player(startX:uint, startY:uint, ROOT:Object) {
          // constructor code
          this.x = startX;
          this.y = startY;
          ROOT.addEventListener(KeyboardEvent.KEY_DOWN, onKeyDown);
       }
    }

  4. #4
    Utente di HTML.it L'avatar di and80
    Registrato dal
    Mar 2003
    Messaggi
    15,182
    Al massimo per aiutare te stesso...

    Ho difficoltà a seguire questo codice che hai condiviso, non mi è chiaro dove è scritto e non mi pare che sia del tutto corretto.
    Per trovare una soluzione è necessario che spieghi meglio come stai lavorando, dove e come dichiari le classi.

  5. #5
    Nella classe Main, collegata al file .fla, c'è questo:
    codice:
     
    class Main { 
       function Main() { 
          addChild(introRoom); 
          introRoom.button.addEventListener(MouseEvent.CLICK, onClick); 
       } 
       function onClick() { 
          room = new Room(MovieClip(this));
          addChild(room); 
          room.addChild(player); 
          removeChild(introRoom); 
    }
    Nella classe Room, collegata a un simbolo chiamato Room, c'è questo (la variabile ROOT l'ho aggiunta per assecondare il tuo primo suggerimento, visto che con MovieClip(root) non funzionava):
    codice:
    public class Room {
       public function Room(ROOT:Object) {
          // constructor code
          player = new Player(PLAYER_STARTX, PLAYER_STARTY, ROOT)
          this.addChild(player);
        }   
    }
    Nella classe Player, collegata a un simbolo chiamato Player, c'è questo:
    codice:
    public class Player {
       public function Player(startX:uint, startY:uint, ROOT:Object) {
          // constructor code
          this.x = startX;
          this.y = startY;
          ROOT.addEventListener(KeyboardEvent.KEY_DOWN, onKeyDown);
       }
    }
    Spero sia chiaro ora.
    Lo scopo è che l'oggetto player rilevi la pressione dei tasti (cosa che così non succede).

  6. #6
    Utente di HTML.it L'avatar di and80
    Registrato dal
    Mar 2003
    Messaggi
    15,182
    Questo è già chiaro, ma ci sarà un punto di ingresso nel FLA in cui utilizzi questo sistema, dove dichiari la classe Main...
    Inoltre ho un dubbio puramente tecnico, ma la classe Main ti funziona senza il package?
    Cioè in AS3 una classe dovrebbe essere scritta con il package generalmente...

  7. #7
    Tutte le classi sono all'interno di un package, ho evitato di trascrivere le cose che non centrano col problema. Tutte le classi funzionano perfettamente, l'unico problema è che non eseguono quella funzione. La classe Main viene eseguita appena parte il programma. Ho verificato che l'eventListener viene attaccato all'oggetto, infatti se scrivo:
    codice:
    class Player {
       function Player() {
          ...
          MovieClip(root).addEventListener(KeyboardEvent.KEY_DOWN, onKeyPress);
          trace(MovieClip(root).hasEventListener(KeyboardEvent.KEY_DOWN));
       }
    }
    il trace() ritorna true. Però non viene eseguita la funzione onKeyPress.

  8. #8
    Utente di HTML.it L'avatar di and80
    Registrato dal
    Mar 2003
    Messaggi
    15,182
    Anche qui ci ritorna utile la guida in linea, in cui viene specificato:
    Per intercettare a livello globale gli eventi di tastiera, usate un listener sullo stage per la fase di cattura, la fase target o quella di bubbling.
    Pertanto quel determinato evento legato alla tastiera va assegnato allo stage attraverso un listener.

    Quindi riepilogando, è giusto aggiungere i clip alla MainTimeline e non allo Stage, ma per assegnare azioni legate alla tastiera è necessario associarle allo stage.

  9. #9
    Ma il problema è proprio quello!!! Anche aggiungendo l'eventListener allo stage, non funziona!!!

  10. #10
    Utente di HTML.it L'avatar di and80
    Registrato dal
    Mar 2003
    Messaggi
    15,182
    Ok, in pratica quando non c'era "introRoom" la cosa funzionava, mentre ora no...
    Chiaramente c'è qualcosa che non mi torna.
    Ti chiederei di condividere quello che hai già fatto per poter vedere se c'è modo di correggerlo o quanto meno di capire dove si blocca il codice, ma non sono sicuro di poterlo vedere a breve.

    Purtroppo non posso andare oltre, bisognerebbe tentare un po' di debug quanto meno aggiungendo qualche trace all'interno delle funzioni, per capire se comunque tali funzioni vengono almeno richiamate, se non eseguite, ecc...

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.