Visualizzazione dei risultati da 1 a 3 su 3
  1. #1
    Utente di HTML.it
    Registrato dal
    Feb 2007
    Messaggi
    13

    Problemi passaggio referenze in addEventListener

    Buona sera a tutti,
    sto muovendo i miei primi passi con as3 e mi trovo ad un punto morto.
    Sto realizzando un giochino stile space invaders, in pratica una navicella che spara missili contro i nemici. Tutti i mc sono nella libreria e sono istanziati nello stage.
    Premendo il tasto spazio inserisco nello stage un mc chiamato missile e vorrei che una volta nello stage il "missile" si spostasse sull'asse y fino alla fuoriuscita dallo stage.
    Purtroppo sull'addEventListener continua a dirmi che passo una referenza sbagliata e non ne vengo fuori, vi posto qui lo script:


    package engine{
    import flash.display.*;
    import flash.events.*;
    import flash.text.*;
    import fl.transitions.*;
    import flash.net.*;
    import flash.text.*;

    public class Game extends MovieClip {

    //------------------------------------------------------------------------
    // constructor


    // stage limit init
    var leftLimit:Number=0;
    var rightLimit:Number=261;
    var upLimit:Number=0;
    var downLimit:Number=361;



    // ship init
    var leftKeyDown:Boolean = false;
    var upKeyDown:Boolean = false;
    var rightKeyDown:Boolean = false;
    var downKeyDown:Boolean = false;
    var spaceKeyDown:Boolean = false;
    var mainSpeed:Number = 15;



    // missile init
    var missileSpeed:Number = 15;
    var missileIncr = 1;
    var missileActive:Boolean = false;


    // game init
    public function gameStart():void{
    ship();
    bg();
    }


    //------------------------------------------------------------------------
    // ship
    public function ship ():void{
    ship_mc.addEventListener(Event.ENTER_FRAME, moveShip);
    stage.addEventListener(KeyboardEvent.KEY_DOWN, checkKeysDown);
    stage.addEventListener(KeyboardEvent.KEY_UP, checkKeysUp);
    }



    // ship move
    public function moveShip(event:Event):void{
    if(leftKeyDown)
    (ship_mc.x<=leftLimit)? ship_mc.x=leftLimit : ship_mc.x -= mainSpeed;

    if(rightKeyDown)
    (ship_mc.x>=rightLimit)? ship_mc.x=rightLimit : ship_mc.x += mainSpeed;

    if(upKeyDown)
    (ship_mc.y<=upLimit)? ship_mc.y=upLimit : ship_mc.y -= mainSpeed;

    if(downKeyDown)
    (ship_mc.y>=downLimit)? ship_mc.y=downLimit : ship_mc.y += mainSpeed;

    if (spaceKeyDown){
    if (missileActive==false){
    missileActive=true;
    var missile:missile_mc = new missile_mc();
    addChild(missile);
    missile.x=ship_mc.x+14;
    missile.y=ship_mc.y-13;
    missileIncr++;
    missile.name='missile_'+missileIncr;
    //missile.y-=1;

    missile.addEventListener(Event.ENTER_FRAME, missileMove);
    }
    }
    }




    // key down ship
    private function checkKeysDown(event:KeyboardEvent):void{
    if(event.keyCode == 37 || event.keyCode == 65){
    leftKeyDown = true;
    }
    if(event.keyCode == 38 || event.keyCode == 87){
    upKeyDown = true;
    }
    if(event.keyCode == 39 || event.keyCode == 68){
    rightKeyDown = true;
    }
    if(event.keyCode == 40 || event.keyCode == 83){
    downKeyDown = true;
    }
    if(event.keyCode == 32){
    spaceKeyDown = true;
    }
    }




    // key up ship
    private function checkKeysUp(event:KeyboardEvent):void{
    if(event.keyCode == 37 || event.keyCode == 65){
    leftKeyDown = false;
    }
    if(event.keyCode == 38 || event.keyCode == 87){
    upKeyDown = false;
    }
    if(event.keyCode == 39 || event.keyCode == 68){
    rightKeyDown = false;
    }
    if(event.keyCode == 40 || event.keyCode == 83){
    downKeyDown = false;
    }
    if(event.keyCode == 32){
    spaceKeyDown = false;
    }
    }





    //------------------------------------------------------------------------
    // missile



    // missile move <--- questa è la parte che non funziona

    public function missileMove(event:Event):void{

    //missile=2;
    //missile.y -= 50;
    }

    }
    }

  2. #2
    Utente di HTML.it L'avatar di and80
    Registrato dal
    Mar 2003
    Messaggi
    15,182
    Il problema è che crei "missile" dentro ad una funzione asincrona e solo dentro quella funzione il clip è definito, mentre fuori dalla funzione non esiste un valore istanziato in quella maniera.
    Per ovviare al problema, dentro alla funzione puoi usare quel parametro che passi alla funzione stessa (event) che contiene una proprietà target che dentro a quella funzione puoi usare liberamente e che si valorizzerà automaticamente con il "missile" che richiama la funzione stessa quando gli dai l'addEventListener.
    Perdona la spiegazione un po' contorta, ma il concetto dovrebbe essere chiaro:

    Codice PHP:
    public function missileMove(event:Event):void{
        
    //missile.y -= 50;
        
    event.target.-= 50;


  3. #3
    Utente di HTML.it
    Registrato dal
    Feb 2007
    Messaggi
    13
    grazie mille!!!!! era quello che non riuscivo a capire, finalmente posso passare oltre grazie ancora

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.