Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 13
  1. #1
    Utente di HTML.it L'avatar di Razorblade
    Registrato dal
    Feb 2002
    Messaggi
    1,308

    Errore di compilazione Actionscript 3.0

    Ciao,
    questo è l'errore che viene fuori sia in flax che flash durante la compilazione di un file .as

    A file found in a source-path can not have more than one externally visible definition.

    Che vuol dire?
    Questo è il codice che ho cercato di compilare

    Codice PHP:

     
      
      
    // VirtualZoo class
      
    package
      
    {
        
    import flash.display.Sprite;
        
    import zoo.*;
        public class 
    VirtualZoo extends Sprite
        
    {
          private var 
    pet;
          
          public function 
    VirtualZoo() 
          {
            
    this.pet = new VirtualPet("Stan");
            
            
    pet.eat(new Apple());  // Feed Stan an apple
            
    pet.eat(new Sushi());  // Feed Stan some sushi
            // Assign the pet's old name to the local variable oldName
            //var oldName = pet.getName();
            // Give the pet a new name
            //pet.setName("Marcos");
          
    }
        }
      }
      
      
      
    // VirtualPet class
      
    package zoo 
      
    {
        
    import flash.utils.setInterval;
        
    import flash.utils.clearInterval;
        
        public class 
    VirtualPet 
        
    {
          
    internal var petName;
          private var 
    currentCalories 1000;
          private var 
    creationTime;
          private static var 
    maxNameLength 20;
          private static var 
    maxCalories 2000;
          
    // Le calorie che consuma durante la digestione
          
    private static var caloriesPerSecond 100;
          
    // Id del set interval per la digestione
          
    private var digestIntervalID;
          
          public function 
    VirtualPet(name
          {
            
    this.creationTime = new Date();
            
    this.petName name;
            
    digestIntervalID setInterval(digest1000);
          }
          
          
          
          private function 
    digest () 
          {
            
    // If digesting more calories would leave the pet's currentCalories at
            // 0 or less...
            
    if (currentCalories VirtualPet.caloriesPerSecond <= 0
            {
              
    // ...stop the interval from calling digest()
              
    clearInterval(digestIntervalID);
              
    // Then give the pet an empty stomach
              
    currentCalories 0;
              
    // And report the pet's death
              
    trace(getName() + " has died.");
            }
            else 
            {
              
    currentCalories -= VirtualPet.caloriesPerSecond;
              
    trace(getName() + " digested some food. It now has " currentCalories " calories remaining.");
            }
          }
          
          public function 
    setName (newName
          {
            if (
    newName.length VirtualPet.maxNameLength
            {
              
    newName newName.substr(0VirtualPet.maxNameLength);
            } 
            else if (
    newName == ""
            {
              return;
            }
            
    petName newName;
          }
          
          public function 
    getName() 
          {
            return 
    petName;
          }
          
          
    // setter method AKA mutator method, from AS3.0 modifier method
          
    public function eat(foodItem
          {
            
    // If this pet is dead...
            
    if (currentCalories == 0
            {
              
    // ...quit this method without modifying currentCalories
              
    trace(getName() + " is dead. You can't feed it.");
              return;
            }
            
            if (
    foodItem is Apple
            {
              if (
    foodItem.hasWorm())
              {
                
    trace("The " foodItem.getName() + " had a worm. " getName()
                      + 
    " didn't eat it.");
                return;
              }
            }
            
            var 
    newCurrentCalories currentCalories foodItem.getCalories();
            if (
    newCurrentCalories VirtualPet.maxCalories
            {
              
    currentCalories VirtualPet.maxCalories;
            } 
            else 
            {
              
    currentCalories newCurrentCalories;
            }
            
            
    trace(getName() + " ate some " foodItem.getName() + ". It now has " currentCalories " calories remaining.");
          }
          
          
    // getter method AKA accesser method, from AS3.0 retriever method
          
    public function getHunger() 
          {
            return 
    currentCalories VirtualPet.maxCalories;
          }
          
          public function 
    getAge() 
          {
            var 
    currentTime = new Date();
            var 
    age currentTime.time this.creationTime.time;
            return 
    age;
          }
        }
      }
      
      
    // Food class
      
    package zoo 
      
    {
        public class 
    Food 
        
    {
          private var 
    calories;
          private var 
    name;
          
          public function 
    Food (initialCalories
          {
            
    setCalories(initialCalories);
          }
          
          public function 
    getCalories ()
          {
            return 
    calories;
          }
            
          public function 
    setCalories (newCalories)
          {
            
    calories newCalories;
          }
            
          public function 
    getName ()
          {
            return 
    name;
          }
            
          public function 
    setName (newName)
          {
            
    name newName;
          }
        }
      }
      
      
    // Apple class
      
    package zoo 
      
    {
        public class 
    Apple extends Food 
        
    {
          
    // Set the default number of calories for an Apple object to 100
          
    private static var DEFAULT_CALORIES 100;
          private var 
    wormInApple;
          
          public function 
    Apple (initialCalories 0
          {
            
    // If no calorie value or a negative calorie value was specified
            // for this particular object...
            
    if (initialCalories <= 0
            {
              
    // ...use the default value
              
    initialCalories Apple.DEFAULT_CALORIES;
            }
            
            
    super(initialCalories);
            
            
    wormInApple Math.random() >= .5;
            
            
    // Set the food name for all Apple objects
            
    setName("Apple");
          }
          
          public function 
    hasWorm ()
          {
            return 
    wormInApple;
          }
        }
      }
      
      
    // Sushi class
      
    package zoo 
      
    {
        public class 
    Sushi extends Food 
        
    {
          private static var 
    DEFAULT_CALORIES 500;
          
          public function 
    Sushi (initialCalories 0
          {
            if (
    initialCalories <= 0
            {
              
    initialCalories Sushi.DEFAULT_CALORIES;
            }
            
            
    super(initialCalories);
            
            
    setName("Sushi");
          }
        }
      } 
    Grazie

  2. #2
    Utente di HTML.it L'avatar di and80
    Registrato dal
    Mar 2003
    Messaggi
    15,182
    vuol dire che non puoi gestire un file di classe in quel modo
    se non sbaglio la dicitura package in un file .as può apparire una sola volta inoltre nella tua classe definisci due path diversi, uno che dovrebbe essere "libero" nella stessa cartella del fla che la dovrebbe adoperare, l'altro invece fa riferimento ad una cartella zoo in cui dovrebbe trovarsi il file .as

  3. #3
    Utente di HTML.it L'avatar di Razorblade
    Registrato dal
    Feb 2002
    Messaggi
    1,308
    Ciao,
    innanzitutto grazie tantissimo per la risposta.
    Per quanto riguarda il consiglio sul 'package' che deve comparire una sola volta mi sembra strano, sto seguendo un libro della adobe e il codice lo scrive inserendo più volte questa dicitura.

    Per quanto riguarda la tua seconda osservazione potresti spiegarti meglio?
    Sono nuovo con actionscript, e forse quella che mi stai dando è la soluzione corretta.

    - Compilando il mio file con flash 9, con che nome dev'essere salvato il file .as ( c'è qualche restrizione? ) ?.

    - Il .fla, va bene salvarlo nella stessa directory?

    - La directory deve avere qualche nome particolare?

    -Quando devo assegnare il file .as al .fla, nel campo di input per assegnare la classe, cosa devo scrivere?

    -Altri consigli utili?

    Grazie

  4. #4
    Utente di HTML.it L'avatar di and80
    Registrato dal
    Mar 2003
    Messaggi
    15,182
    ho provato la tua classe e l'errore di compilazione che mi da è un po' diverso dal tuo:

    5006: An ActionScript file can not have more than one externally visible definition: zoo.VirtualPet, VirtualZoo

    significa che in uno stesso file AS non è possibile avere più definizioni di classe e si riallaccia a quello che ti dicevo all'inizio... principalmente per un motivo, che il file .as deve avere come nome quello della classe che viene definita al suo interno per essere poi correttamente trovata dal compilatore
    esistono poi definizioni particolari, come ad esempio l'utilizzo di una classe internal che viene però definita fuori dal package

    ok l'esempio del libro, ma bisogna vedere come questo esempio viene strutturato e in quale contesto e se poi funziona realmente (dovrebbe ma non si sa mai) ...

    comunque di solito la regola che si applica è un file per classe

    - Compilando il mio file con flash 9, con che nome dev'essere salvato il file .as ( c'è qualche restrizione? ) ?.
    il file deve avere il nome della classe definita nello stesso, ecco perchè nel caso postato c'è l'incongruenza dei package multipli

    - Il .fla, va bene salvarlo nella stessa directory?
    in generale sì, ma flash consente anche di inserire dei path su cui cercare le classi, perciò se ti crei un tuo package e poi ne inserisci nelle opzioni di flash la cartella che lo contiene, puoi poi richiamare la classe semplicemente usando l'import in AS


    - La directory deve avere qualche nome particolare?
    la directory che contiene la classe deve avere il nome del package che si dichiara nella classe, ad esempio nel tuo caso il package è "zoo" perciò il nome della cartella deve essere "zoo"

    -Quando devo assegnare il file .as al .fla, nel campo di input per assegnare la classe, cosa devo scrivere?
    quella è la Document class e ci devi inserire il nome della classe contenuta nel file .as
    ad esempio per una classe tipo

    package {
    public class MyClassExample {
    public function MyClassExample(){
    }
    }
    }

    devi inserire solo MyClassExample

    considera che tutto il discorso è molto generalizzato in questo post, ti consiglio vivamente, per approfondire l'uso delle classi in Flash, di consultare la guida in linea interna al programma (F1), che trovi anche sul web in italiano e in particolare a questo indirizzo:

    http://livedocs.adobe.com/flash/9.0_.../00000060.html

  5. #5
    Utente di HTML.it L'avatar di and80
    Registrato dal
    Mar 2003
    Messaggi
    15,182
    aggiungo un post, giusto per farti vedere quel che dicevo sulle classi di tipo internal

    questa funziona correttamente

    Codice PHP:
    // VirtualZoo class
    package {
        
    import flash.display.Sprite;
        
    import zoo.*;
        public class 
    VirtualZoo extends Sprite {
            private var 
    pet;

            public function 
    VirtualZoo() {
                
    this.pet=new VirtualPet("Stan");

                
    pet.eat(new Apple  );// Feed Stan an apple
                
    pet.eat(new Sushi  );// Feed Stan some sushi
                // Assign the pet's old name to the local variable oldName
                //var oldName = pet.getName();
                // Give the pet a new name
                //pet.setName("Marcos");
            
    }
        }

    }
    // VirtualPet class
    import flash.utils.setInterval;
    import flash.utils.clearInterval;

    internal class VirtualPet {
        
    internal var petName;
        private var 
    currentCalories=1000;
        private var 
    creationTime;
        private static  var 
    maxNameLength=20;
        private static  var 
    maxCalories=2000;
        
    // Le calorie che consuma durante la digestione
        
    private static  var caloriesPerSecond=100;
        
    // Id del set interval per la digestione
        
    private var digestIntervalID;

        public function 
    VirtualPet(name) {
            
    this.creationTime=new Date  ;
            
    this.petName=name;
            
    digestIntervalID=setInterval(digest,1000);
        }
        private function 
    digest() {
            
    // If digesting more calories would leave the pet's currentCalories at
            // 0 or less...
            
    if (currentCalories VirtualPet.caloriesPerSecond <= 0) {
                
    // ...stop the interval from calling digest()
                
    clearInterval(digestIntervalID);
                
    // Then give the pet an empty stomach
                
    currentCalories=0;
                
    // And report the pet's death
                
    trace(getName() + " has died.");
            } else {
                
    currentCalories-= VirtualPet.caloriesPerSecond;
                
    trace(getName() + " digested some food. It now has " currentCalories " calories remaining.");
            }
        }
        public function 
    setName(newName) {
            if (
    newName.length VirtualPet.maxNameLength) {
                
    newName=newName.substr(0,VirtualPet.maxNameLength);
            } else if (
    newName == "") {
                return;
            }
            
    petName=newName;
        }
        public function 
    getName() {
            return 
    petName;
        }
        
    // setter method AKA mutator method, from AS3.0 modifier method
        
    public function eat(foodItem) {
            
    // If this pet is dead...
            
    if (currentCalories == 0) {
                
    // ...quit this method without modifying currentCalories
                
    trace(getName() + " is dead. You can't feed it.");
                return;
            }
            if (
    foodItem is Apple) {
                if (
    foodItem.hasWorm()) {
                    
    trace("The " foodItem.getName() + " had a worm. " getName() + " didn't eat it.");
                    return;
                }
            }
            var 
    newCurrentCalories=currentCalories foodItem.getCalories();
            if (
    newCurrentCalories VirtualPet.maxCalories) {
                
    currentCalories=VirtualPet.maxCalories;
            } else {
                
    currentCalories=newCurrentCalories;
            }
            
    trace(getName() + " ate some " foodItem.getName() + ". It now has " currentCalories " calories remaining.");
        }
        
    // getter method AKA accesser method, from AS3.0 retriever method
        
    public function getHunger() {
            return 
    currentCalories VirtualPet.maxCalories;
        }
        public function 
    getAge() {
            var 
    currentTime=new Date;
            var 
    age=currentTime.time this.creationTime.time;
            return 
    age;
        }
    }

    // Food class

    internal class Food {
        private var 
    calories;
        private var 
    name;

        public function 
    Food(initialCalories) {
            
    setCalories(initialCalories);
        }
        public function 
    getCalories() {
            return 
    calories;
        }
        public function 
    setCalories(newCalories) {
            
    calories=newCalories;
        }
        public function 
    getName() {
            return 
    name;
        }
        public function 
    setName(newName) {
            
    name=newName;
        }
    }

    // Apple class

    internal class Apple extends Food {
        
    // Set the default number of calories for an Apple object to 100
        
    private static  var DEFAULT_CALORIES=100;
        private var 
    wormInApple;

        public function 
    Apple(initialCalories=0) {
            
    // If no calorie value or a negative calorie value was specified
            // for this particular object...
            
    if (initialCalories <= 0) {
                
    // ...use the default value
                
    initialCalories=Apple.DEFAULT_CALORIES;
            }
            
    super(initialCalories);

            
    wormInApple=Math.random() >= .5;

            
    // Set the food name for all Apple objects
            
    setName("Apple");
        }
        public function 
    hasWorm() {
            return 
    wormInApple;
        }
    }

    // Sushi class
    internal class Sushi extends Food {
        private static  var 
    DEFAULT_CALORIES=500;

        public function 
    Sushi(initialCalories=0) {
            if (
    initialCalories <= 0) {
                
    initialCalories=Sushi.DEFAULT_CALORIES;
            }
            
    super(initialCalories);

            
    setName("Sushi");
        }


  6. #6
    Utente di HTML.it L'avatar di Razorblade
    Registrato dal
    Feb 2002
    Messaggi
    1,308
    Grazie per la tua estrema disponibilità, non ho ancora testato il funzionamento perchè ho un dubbio. Tu hai affermato che:

    Codice PHP:
    comunque di solito la regola che si applica è un file per classe 
    Quindi, tutto il codice che hai ripostato andrebbe salvato in file diversi, una classe per file?
    Se no, quale nome dovrà alla fine avere il file .as?

    E se una classe la definiamo come internal ma è esterna al package, qual è il senso?
    Se non sbaglio, internal vuol dire che nel programma quella classe può essere richiamata da altre classi all'interno dello stesso package, ma se la classe di per se non appartiene a nessun package?

    Scusa le domande forse stupide...

    Ciao

  7. #7
    Utente di HTML.it L'avatar di and80
    Registrato dal
    Mar 2003
    Messaggi
    15,182
    la classe richiamata in quel modo all'interno del file as avrà valenza per la classe che è contenuta nel package e che darà il nome al file

    la definizione di internal è corretta ma questo è un caso possibile quando si ha necessità di gestire una classe da avere a portata di mano solo per quella stesso file in cui viene definita tale classe

    per quanto riguarda la regola "un file per classe", mi pare una buona norma per avere completamente sotto controllo i file che compongono l'applicazione e in generale ci aiuta a determinare più velocemente gli errori possibili in fase di debug... esistono comunque delle situazioni in cui la regola può essere aggirata, ma spetta al programmatore capire se sia più o meno giusto usare ad esempio l'internal come nel caso postato o separare le classi per un eventuale diverso utilizzo in altri progetti o applicazioni

  8. #8
    Utente di HTML.it L'avatar di Razorblade
    Registrato dal
    Feb 2002
    Messaggi
    1,308
    Ciao and80,
    innanzitutto grazie per le risposte, avrei ancora una semplice domanda in merito a questo argomento.
    Come si fa a fare in modo che tutte le classi siano all'interno dello stesso package 'zoo', usando flash come compilatore?
    Tieni presente che il mio filesystem è adesso cosi' composto:

    Codice PHP:
    virtualzoo
                
    |
                
    src
                   
    |
                   
    zoo
                      

                      
    VirtualZoo.as 
    il file .fla è salvato all'interno di src ( VirtualZoo.fla )
    Ciao

  9. #9
    Utente di HTML.it L'avatar di and80
    Registrato dal
    Mar 2003
    Messaggi
    15,182
    basta che le metti all'interno della stessa cartella zoo e che specifichi in ogni classe che il package su cui andare a cercare è zoo

    Codice PHP:
    package zoo {
        public class 
    SomeClass {
            public function 
    SomeClass(){
                
    // azioni
            
    }
        }


  10. #10
    Utente di HTML.it L'avatar di Razorblade
    Registrato dal
    Feb 2002
    Messaggi
    1,308
    Però cosi' facendo ritorneremmo al punto di partenza,
    ovvero si visualizzerà questo errore:

    5006: Un file di ActionScript non può avere più di una definizione visibile esternamente: zoo.VirtualPet, zoo.Apple


    Scusami, ma DEVO capire
    Il codice che sto cercando di compilare adesso è quello che avevo postato inizialmente ( tutte le classi all'interno dello stesso package ), lo script come l'hai modificato tu funziona ( previa rimozione della linea 'import zoo.*; ' ), ma io vorrei cosa causa l'errore di compilazione.
    Grazie

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.