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éservoirpublic 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.
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
Oui, mettez le code source. – Oliver
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