2010-05-26 20 views
-1

Ceci est le problème le plus étrange que j'ai rencontré dans Flash jusqu'à présent. Je n'ai aucune idée de ce qui le cause. Je peux fournir un fichier .swf si quelqu'un veut vraiment le voir, mais je vais le décrire du mieux que je peux.Flash AS3 Mysterious Clignotant MovieClip

Je crée des balles pour un objet tank à tirer. Le réservoir est un enfant de la classe de document. La façon dont je suis en train de créer la balle est:

var bullet:Bullet = new Bullet();
(parent as MovieClip).addChild(bullet);

La balle se simplement se déplace dans une direction à l'aide du code comme this.x += 5;

Le problème est les balles retracera pour leur création et de destruction au bon Cependant, la balle n'est parfois visible qu'à mi-chemin de l'écran, parfois pas du tout, et parfois pour toute la traversée. Étrangement enlever la minuterie que j'ai sur la création de balle semble résoudre cela.

La minuterie est mise en œuvre en tant que telle:

if(shot_timer == 0) {
shoot(); // This contains the aforementioned bullet creation method
shot_timer = 10;

Mon gestionnaire de cadre pour l'objet réservoir contrôle la minuterie et décrémente chaque image si elle est supérieure à zéro.

Quelqu'un peut-il suggérer pourquoi cela pourrait se produire?

EDIT: Comme demandé, le code complet:

Bullet.as

package

{

import flash.display.MovieClip; import flash.events.Event;

Bullet public class extends MovieClip {

public var facing:int; 
private var speed:int; 

public function Bullet():void { 
    trace("created"); 
    speed = 10; 
    addEventListener(Event.ADDED_TO_STAGE,addedHandler); 
} 

private function addedHandler(e:Event):void { 
    addEventListener(Event.ENTER_FRAME,enterFrameHandler); 
    removeEventListener(Event.ADDED_TO_STAGE,addedHandler); 
} 

private function enterFrameHandler(e:Event):void { 
    //0 - up, 1 - left, 2 - down, 3 - right 
    if(this.x > 720 || this.x < 0 || this.y < 0 || this.y > 480) { 
     removeEventListener(Event.ENTER_FRAME,enterFrameHandler); 
     trace("destroyed"); 
     (parent as MovieClip).removeChild(this); 
     return; 
    } 

    switch(facing) { 
     case 0: this.y -= speed; break; 
     case 1: this.x -= speed; break; 
     case 2: this.y += speed; break; 
     case 3: this.x += speed; break; 
    } 
} 

}

}

Tank.as:

package

{

import flash.display.MovieClip; import flash.events.KeyboardEvent; import flash.events.Event; import flash.ui.Keyboard;

réservoir

public class extends MovieClip {

private var right:Boolean = false; 
private var left:Boolean = false; 
private var up:Boolean = false; 
private var down:Boolean = false; 
private var facing:int = 0; //0 - up, 1 - left, 2 - down, 3 - right 
private var horAllowed:Boolean = true; 
private var vertAllowed:Boolean = true; 
private const GRID_SIZE:int = 100; 
private var shooting:Boolean = false; 
private var shot_timer:int = 0; 

private var speed:int = 2; 

public function Tank():void { 
    addEventListener(Event.ADDED_TO_STAGE,stageAddHandler); 
    addEventListener(Event.ENTER_FRAME, enterFrameHandler); 
} 

private function stageAddHandler(e:Event):void { 
    stage.addEventListener(KeyboardEvent.KEY_DOWN,checkKeys); 
    stage.addEventListener(KeyboardEvent.KEY_UP,keyUps); 
    removeEventListener(Event.ADDED_TO_STAGE,stageAddHandler); 
} 

public function checkKeys(event:KeyboardEvent):void { 
    if(event.keyCode == 32) { 
     //trace("Spacebar is down"); 
     shooting = true; 
    } 
    if(event.keyCode == 39) { 
     //trace("Right key is down"); 
     right = true; 
    } 
    if(event.keyCode == 38) { 
     //trace("Up key is down"); // lol 
     up = true; 
    } 
    if(event.keyCode == 37) { 
     //trace("Left key is down"); 
     left = true; 
    } 
    if(event.keyCode == 40) { 
     //trace("Down key is down"); 
     down = true; 
    } 
} 

public function keyUps(event:KeyboardEvent):void { 
    if(event.keyCode == 32) { 
     event.keyCode = 0; 
     shooting = false; 
     //trace("Spacebar is not down"); 
    } 
    if(event.keyCode == 39) { 
     event.keyCode = 0; 
     right = false; 
     //trace("Right key is not down"); 
    } 
    if(event.keyCode == 38) { 
     event.keyCode = 0; 
     up = false; 
     //trace("Up key is not down"); 
    } 
    if(event.keyCode == 37) { 
     event.keyCode = 0; 
     left = false; 
     //trace("Left key is not down"); 
    } 
    if(event.keyCode == 40) { 
     event.keyCode = 0; 
     down = false; 
     //trace("Down key is not down") // O.o 
    } 
} 

public function checkDirectionPermissions(): void { 
    if(this.y % GRID_SIZE < 5 || GRID_SIZE - this.y % GRID_SIZE < 5) { 
     horAllowed = true; 
    } else { 
     horAllowed = false; 
    } 
    if(this.x % GRID_SIZE < 5 || GRID_SIZE - this.x % GRID_SIZE < 5) { 
     vertAllowed = true; 
    } else { 
     vertAllowed = false; 
    } 

    if(!horAllowed && !vertAllowed) { 
     realign(); 
    } 
} 

public function realign():void { 
    if(!horAllowed) { 
     if(this.x % GRID_SIZE < GRID_SIZE/2) { 
      this.x -= this.x % GRID_SIZE; 
     } else { 
      this.x += (GRID_SIZE - this.x % GRID_SIZE); 
     } 
    } 
    if(!vertAllowed) { 
     if(this.y % GRID_SIZE < GRID_SIZE/2) { 
      this.y -= this.y % GRID_SIZE; 
     } else { 
      this.y += (GRID_SIZE - this.y % GRID_SIZE); 
     } 
    } 
} 

public function enterFrameHandler(Event):void { 
    //trace(shot_timer); 
    if(shot_timer > 0) { 
     shot_timer--; 
    } 
    movement(); 
    firing(); 
} 

public function firing():void { 
    if(shooting) { 
     if(shot_timer == 0) { 
      shoot(); 
      shot_timer = 10; 
     } 
    } 
} 

public function shoot():void { 
    var bullet = new Bullet(); 
    bullet.facing = facing; 
    //0 - up, 1 - left, 2 - down, 3 - right 
    switch(facing) { 
     case 0: bullet.x = this.x; bullet.y = this.y - this.height/2; break; 
     case 1: bullet.x = this.x - this.width/2; bullet.y = this.y; break; 
     case 2: bullet.x = this.x; bullet.y = this.y + this.height/2; break; 
     case 3: bullet.x = this.x + this.width/2; bullet.y = this.y; break; 
    } 
    (parent as MovieClip).addChild(bullet); 
} 

public function movement():void { 
    //0 - up, 1 - left, 2 - down, 3 - right 

    checkDirectionPermissions(); 

    if(horAllowed) { 
     if(right) { 
      orient(3); 
      realign(); 
      this.x += speed; 
     } 
     if(left) { 
      orient(1); 
      realign(); 
      this.x -= speed; 
     } 
    } 
    if(vertAllowed) { 
     if(up) { 
      orient(0); 
      realign(); 
      this.y -= speed; 
     } 
     if(down) { 
      orient(2); 
      realign(); 
      this.y += speed; 
     } 
    } 
} 

public function orient(dest:int):void { 
    //trace("facing: " + facing); 
    //trace("dest: " + dest); 
    var angle = facing - dest; 
    this.rotation += (90 * angle); 
    facing = dest; 
} 

}

}

L'application complète est ici si quelqu'un veut tenter de reproduire l'erreur.Il utilise l'électroserveur pour certaines parties, il est donc nécessaire de les commenter.

TankAttack.rar

+0

Je pense que vous aurez besoin de poster le code complet. Il n'y a rien de mystérieux à trébucher pour des trucs comme ça, donc je pense que c'est plus susceptible d'être un problème de kick-yourself. – fenomas

+0

Oui, mettez le code source. – Oliver

+0

Le lien vous amène à une page avec le message suivant: "Le lien de fichier que vous avez demandé n'est pas valide, veuillez contacter l'éditeur de liens ou essayer de faire une recherche". – Taurayi

Répondre

0

sont ces lignes correctes?

public function enterFrameHandler(Event):void { //Instead of e:Event 

,

var bullet = new Bullet(); // Instead of var bullet:Bullet 

Et

var angle = facing - dest; // Instead of var angle:int 

Je veux juste vous assurer que je suis en train de lire ce droit.

+0

Je le crois. enterFrameHandler n'a pas besoin d'un événement réel pour fonctionner, et forcer des types sur des variables tout en bonne pratique, est inutile. Quelqu'un d'autre peut me confirmer à ce sujet? – Ben

+0

Très bien, je l'ai gardé intacte. A donné une course et a pu obtenir la création et la destruction de la balle avec la minuterie. J'ai essayé plusieurs prises de vue (qui sont limitées par la minuterie), et cela a fonctionné aussi bien. Le seul endroit où je pouvais le voir disparaître, c'est les limites. Désolé, je ne pouvais pas recréer votre problème :( – phwd

+0

ok merci d'essayer :) peut-être c'est juste ma machine. Téléchargé source complète si quelqu'un désire l'exécuter. – Ben

0

Je pense que la réponse à cette question est très simple, je l'ai fait plusieurs fois (CS4). Vérifiez votre timelime ... il y a habituellement un cadre vide supplémentaire non désiré. Comment cela se passe est encore un peu un mystère pour moi, mais c'est généralement le coupable ... de frapper une clé par inadvertance.

0

Ajoutez la méthode stop(); à la balle parfois il scintille lorsque le MovieClip répète